diff --git a/.cdtproject b/.cdtproject new file mode 100644 index 00000000..69405851 --- /dev/null +++ b/.cdtproject @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="UTF-8"?> +<?eclipse-cdt version="2.0"?> + +<cdtproject id="org.eclipse.cdt.make.core.make"> +<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/> +<data> +<item id="scannerConfiguration"> +<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="true" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="true"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"> +<buildOutputProvider> +<openAction enabled="false" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="makefileGenerator"> +<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/> +<parser enabled="false"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="false" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="false"/> +</scannerInfoProvider> +</profile> +<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile"> +<buildOutputProvider> +<openAction enabled="false" filePath=""/> +<parser enabled="true"/> +</buildOutputProvider> +<scannerInfoProvider id="specsFile"> +<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/> +<parser enabled="false"/> +</scannerInfoProvider> +</profile> +</item> +<item id="org.eclipse.cdt.core.pathentry"> +<pathentry kind="src" path=""/> +<pathentry kind="out" path=""/> +<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/> +</item> +<item id="org.eclipse.cdt.make.core.buildtargets"> +<buildTargets> +<target name="Build toolchain" path="" targetID="org.eclipse.cdt.make.MakeTargetBuilder"> +<buildCommand>make</buildCommand> +<buildArguments/> +<buildTarget>all</buildTarget> +<stopOnError>true</stopOnError> +<useDefaultCommand>true</useDefaultCommand> +</target> +</buildTargets> +</item> +</data> +</cdtproject> diff --git a/.project b/.project new file mode 100644 index 00000000..521ece31 --- /dev/null +++ b/.project @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>crosstool-ng</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name> + <triggers>full,incremental,</triggers> + <arguments> + <dictionary> + <key>LaunchConfigHandle</key> + <value><project>/.externalToolBuilders/org.eclipse.cdt.make.core.makeBuilder.launch</value> + </dictionary> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name> + <triggers>full,incremental,</triggers> + <arguments> + <dictionary> + <key>LaunchConfigHandle</key> + <value><project>/.externalToolBuilders/org.eclipse.cdt.make.core.ScannerConfigBuilder.launch</value> + </dictionary> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.cdt.core.cnature</nature> + <nature>org.eclipse.cdt.make.core.makeNature</nature> + <nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature> + </natures> +</projectDescription> diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 00000000..d9cabed8 --- /dev/null +++ b/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,3 @@ +#Sat Feb 17 16:17:18 CET 2007 +eclipse.preferences.version=1 +indexerId=org.eclipse.cdt.core.fastIndexer diff --git a/COPYING b/COPYING new file mode 100644 index 00000000..8c36fbea --- /dev/null +++ b/COPYING @@ -0,0 +1,21 @@ +Unless otherwise stated in individaul files, this work is licensed to you under +the following terms. + +- Files in docs/ are available under the Creative Commons Attribution, Share + Alike (by-sa), v2.5, to be found there: + licenses/by-sa/deed.en (human-readable summary) + licenses/by-sa/legalcode (legal code, the full license) + +- Files found in patches/uClibc/*/ are available under the GNU Lesser General + Public License (LGPL), v2.1, to be found here: + licenses/lgpl.txt + +- Files found in patches/glibc/*/ are available under the GNU Lesser General + Public License (LGPL), v2.1, to be found there: + licenses/lgpl.txt + +- Other files not covered by the above licenses, and not covered by an + individual license specified in the file itself, or an accompanying file, + are available under the GNU General Public License (GPL), v2, to be found + here: + licenses/gpl.txt diff --git a/CREDITS b/CREDITS new file mode 100644 index 00000000..b571936e --- /dev/null +++ b/CREDITS @@ -0,0 +1,9 @@ +I would like to thank these fine people for making crosstool-NG possible: + + Dan KEGEL, the original author of crosstool: http://www.kegel.com/ + Dan was very helpfull and willing to help when I build my first toolchains. + I owe him one. Thank you Dan! + Some crosstool-NG scripts have code snippets coming almost as-is from the + original work by Dan. + +More to come as they help. diff --git a/LICENSES b/LICENSES new file mode 120000 index 00000000..d24842f3 --- /dev/null +++ b/LICENSES @@ -0,0 +1 @@ +COPYING \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..bab78281 --- /dev/null +++ b/Makefile @@ -0,0 +1,46 @@ +# Makefile for crosstool-NG. +# Copyright 2006 Yann E. MORIN <yann.morin.1998@anciens.enib.fr> + +# The project version +export PROJECTVERSION=0.0.1 + +# This should eventually be computed if compiling out-of-tree is implemented +export CT_TOP_DIR=$(shell pwd) + +.PHONY: all +all: build + +HOST_CC = gcc -funsigned-char + +help:: + @echo 'Available make targets (*: default target):' + @echo + +include $(CT_TOP_DIR)/kconfig/Makefile +#include $(CT_TOP_DIR)/samples/Makefile + +help:: + @echo 'Build targets:' + @echo '* build - Build the toolchain' + @echo ' clean - Remove generated files' + @echo ' distclean - Remove generated files and configuration' + +include $(CT_TOP_DIR)/tools/Makefile + +.config: config/*.in + @make menuconfig + @# Because exiting menuconfig without saving is not an error to menuconfig + @test -f .config + +# Actual build +build: .config + @$(CT_TOP_DIR)/scripts/crosstool.sh + +.PHONY: clean +clean:: + @rm -f .crosstool.config + +.PHONY: distclean +distclean:: clean + @rm -f .config* ..config.tmp + diff --git a/README b/README new file mode 100644 index 00000000..2d1f1546 --- /dev/null +++ b/README @@ -0,0 +1,9 @@ +This is the README for crosstool-NG + +To get you started, hust enter: + make help + +You can find a (terse and WIP) documentation in docs/. + +You can also point your browser to + http://ymorin.is-a-geek.org/dokuwiki/doku.php?id=projects:crosstool diff --git a/config/binutils.in b/config/binutils.in new file mode 100644 index 00000000..e91b64e8 --- /dev/null +++ b/config/binutils.in @@ -0,0 +1,133 @@ +# binutils options + +menu "binutils" + +config BINUTILS_VERSION + string + +choice + bool + prompt "binutils version" + +config BINUTILS_V_2_11_2 + bool + prompt "2.11.2" + +config BINUTILS_V_2_13_90 + bool + prompt "2.13.90" + +config BINUTILS_V_2_14 + bool + prompt "2.14" + +config BINUTILS_V_2_14_90 + bool + prompt "2.14.90" + +config BINUTILS_V_2_14_92 + bool + prompt "2.14.92" + +config BINUTILS_V_2_15 + bool + prompt "2.15" + +config BINUTILS_V_2_15_90 + bool + prompt "2.15.90" + +config BINUTILS_V_2_15_91 + bool + prompt "2.15.91" + +config BINUTILS_V_2_16 + bool + prompt "2.16" + +config BINUTILS_V_2_16_1 + bool + prompt "2.16.1" + +config BINUTILS_V_2_17 + bool + prompt "2.17" + +config BINUTILS_V_2_17_50_0_1 + bool + prompt "2.17.50.0.1" + +config BINUTILS_V_2_17_50_0_2 + bool + prompt "2.17.50.0.2" + +config BINUTILS_V_2_17_50_0_3 + bool + prompt "2.17.50.0.3" + +config BINUTILS_V_2_17_50_0_4 + bool + prompt "2.17.50.0.4" + +config BINUTILS_V_2_17_50_0_5 + bool + prompt "2.17.50.0.5" + +config BINUTILS_V_2_17_50_0_6 + bool + prompt "2.17.50.0.6" + +config BINUTILS_V_2_17_50_0_7 + bool + prompt "2.17.50.0.7" + +config BINUTILS_V_2_17_50_0_8 + bool + prompt "2.17.50.0.8" + +config BINUTILS_V_2_17_50_0_9 + bool + prompt "2.17.50.0.9" + +config BINUTILS_V_2_17_50_0_10 + bool + prompt "2.17.50.0.10" + +# CT_INSERT_VERSION_ABOVE +# Don't remove qbove line! +endchoice + +config BINUTILS_VERSION + string + default "2.11.2" if BINUTILS_V_2_11_2 + default "2.13.90" if BINUTILS_V_2_13_90 + default "2.14" if BINUTILS_V_2_14 + default "2.14.90" if BINUTILS_V_2_14_90 + default "2.14.92" if BINUTILS_V_2_14_92 + default "2.15" if BINUTILS_V_2_15 + default "2.15.90" if BINUTILS_V_2_15_90 + default "2.15.91" if BINUTILS_V_2_15_91 + default "2.16" if BINUTILS_V_2_16 + default "2.16.1" if BINUTILS_V_2_16_1 + default "2.17" if BINUTILS_V_2_17 + default "2.17.50.0.1" if BINUTILS_V_2_17_50_0_1 + default "2.17.50.0.2" if BINUTILS_V_2_17_50_0_2 + default "2.17.50.0.3" if BINUTILS_V_2_17_50_0_3 + default "2.17.50.0.4" if BINUTILS_V_2_17_50_0_4 + default "2.17.50.0.5" if BINUTILS_V_2_17_50_0_5 + default "2.17.50.0.6" if BINUTILS_V_2_17_50_0_6 + default "2.17.50.0.7" if BINUTILS_V_2_17_50_0_7 + default "2.17.50.0.8" if BINUTILS_V_2_17_50_0_8 + default "2.17.50.0.9" if BINUTILS_V_2_17_50_0_9 + default "2.17.50.0.10" if BINUTILS_V_2_17_50_0_10 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove qbove line! + +config BINUTILS_EXTRA_CONFIG + string + prompt "binutils extra config" + default "" + help + Extra flags passed onto ./configure when configuring + +endmenu diff --git a/config/cc.in b/config/cc.in new file mode 100644 index 00000000..18eb559f --- /dev/null +++ b/config/cc.in @@ -0,0 +1,185 @@ +# Compiler options + +menu "C compiler" + +comment "Core C Compiler (used to build the C library)" + +config CC_USE_CORE + bool + prompt "Use a different core C compiler" + default n + help + Use a different compiler to build the C library than the one + in the final toolchain. + + You can change the compiler used, or only the version used. + + You most probably don't need that. + +config CC_CORE_GCC + bool + default y if ! CC_USE_CORE && CC_GCC + default n if CC_USE_CORE || ! CC_GCC + +config CC_CORE_TCC + bool + default y if ! CC_USE_CORE && CC_TCC + default n if CC_USE_CORE || ! CC_TCC + +choice + bool + prompt "Core C compiler:" + depends on CC_USE_CORE + +config CC_CORE_GCC + bool + prompt "gcc" + +#config CC_CORE_TCC +# bool +# prompt "tcc (EXPERIMENTAL)" + +endchoice + +config CC_CORE_VERSION + string + +config CC_CORE + string + default "gcc" if CC_CORE_GCC + default "tcc" if CC_CORE_TCC + +if CC_CORE_GCC && CC_USE_CORE +source config/cc_core_gcc.in +endif + +if CC_CORE_TCC && CC_USE_CORE +source config/cc_core_tcc.in +endif + +comment "Final C compiler" + +choice + bool + prompt "Final C compiler" + default CC_GCC + +config CC_GCC + bool + prompt "gcc" + select CC_SUPPORT_CXX + select CC_SUPPORT_FORTRAN + select CC_SUPPORT_JAVA + select CC_SUPPORT_ADA + select CC_SUPPORT_OBJC + select CC_SUPPORT_OBJCXX + +#config CC_TCC +# bool +# prompt "tcc (EXPERIMENTAL)" +# select CC_LANG_C + +endchoice + +config CC_VERSION + string + +config CC + string + default "gcc" if CC_GCC + default "tcc" if CC_TCC + +if CC_GCC +source config/cc_gcc.in +endif + +if CC_GCC +source config/cc_tcc.in +endif + +config CC_SUPPORT_CXX + bool + +config CC_SUPPORT_FORTRAN + bool + +config CC_SUPPORT_JAVA + bool + +config CC_SUPPORT_ADA + bool + +config CC_SUPPORT_OBJC + bool + +config CC_SUPPORT_OBJCXX + bool + +comment "Additionnal supported languages:" + +config CC_LANG_CXX + bool + prompt "C++" + default n + depends on CC_SUPPORT_CXX + help + Only select this if you know that your specific combination of + compiler and its version does support this language. + +config CC_LANG_FORTRAN + bool + prompt "Fortran" + default n + depends on CC_SUPPORT_FORTRAN + help + Only select this if you know that your specific combination of + compiler and its version does support this language. + +config CC_LANG_JAVA + bool + prompt "Java" + default n + depends on CC_SUPPORT_JAVA + help + Only select this if you know that your specific combination of + compiler and its version does support this language. + +config CC_LANG_ADA + bool + prompt "ADA" + default n + depends on CC_SUPPORT_ADA + help + Only select this if you know that your specific combination of + compiler and its version does support this language. + +config CC_LANG_OBJC + bool + prompt "Objective-C" + default n + depends on CC_SUPPORT_OBJC + help + Only select this if you know that your specific combination of + compiler and its version does support this language. + +config CC_LANG_OBJCXX + bool + prompt "Objective-C++" + default n + depends on CC_SUPPORT_OBJCXX + help + Only select this if you know that your specific combination of + compiler and its version does support this language. + +config CC_LANG_OTHERS + string + prompt "Other languages" + default "" + help + Enter here a comma-separated list of languages that you know your compiler + supports, besides those listed above. + + Eg. gcc-4.1+ has a toy programming language, treelang. As it is not usefull + in real life, it is not available in the selection above. + +endmenu diff --git a/config/cc_core_gcc.in b/config/cc_core_gcc.in new file mode 100644 index 00000000..f9222196 --- /dev/null +++ b/config/cc_core_gcc.in @@ -0,0 +1,137 @@ +# Compiler options + +choice + bool + prompt "Core gcc version" + +config CC_CORE_V_2_95_3 + bool + prompt "2.95.3" + +config CC_CORE_V_3_2_3 + bool + prompt "3.2.3" + +config CC_CORE_V_3_3 + bool + prompt "3.3" + +config CC_CORE_V_3_3_1 + bool + prompt "3.3.1" + +config CC_CORE_V_3_3_2 + bool + prompt "3.3.2" + +config CC_CORE_V_3_3_3 + bool + prompt "3.3.3" + +config CC_CORE_V_3_3_4 + bool + prompt "3.3.4" + +config CC_CORE_V_3_3_5 + bool + prompt "3.3.5" + +config CC_CORE_V_3_3_6 + bool + prompt "3.3.6" + +config CC_CORE_V_3_4_0 + bool + prompt "3.4.0" + +config CC_CORE_V_3_4_1 + bool + prompt "3.4.1" + +config CC_CORE_V_3_4_2 + bool + prompt "3.4.2" + +config CC_CORE_V_3_4_3 + bool + prompt "3.4.3" + +config CC_CORE_V_3_4_4 + bool + prompt "3.4.4" + +config CC_CORE_V_3_4_5 + bool + prompt "3.4.5" + +config CC_CORE_V_3_4_6 + bool + prompt "3.4.6" + +config CC_CORE_V_4_0_0 + bool + prompt "4.0.0" + +config CC_CORE_V_4_0_1 + bool + prompt "4.0.1" + +config CC_CORE_V_4_0_2 + bool + prompt "4.0.2" + +config CC_CORE_V_4_0_3 + bool + prompt "4.0.3" + +config CC_CORE_V_4_0_4 + bool + prompt "4.0.4" + +config CC_CORE_V_4_1_0 + bool + prompt "4.1.0" + +config CC_CORE_V_4_1_1 + bool + prompt "4.1.1" + +# CT_INSERT_VERSION_ABOVE +# Don't remove above line! +endchoice + +config CC_CORE_VERSION + string + default "2.95.3" if CC_CORE_V_2_95_3 + default "3.2.3" if CC_CORE_V_3_2_3 + default "3.3" if CC_CORE_V_3_3 + default "3.3.1" if CC_CORE_V_3_3_1 + default "3.3.2" if CC_CORE_V_3_3_2 + default "3.3.3" if CC_CORE_V_3_3_3 + default "3.3.4" if CC_CORE_V_3_3_4 + default "3.3.5" if CC_CORE_V_3_3_5 + default "3.3.6" if CC_CORE_V_3_3_6 + default "3.4.0" if CC_CORE_V_3_4_0 + default "3.4.1" if CC_CORE_V_3_4_1 + default "3.4.2" if CC_CORE_V_3_4_2 + default "3.4.3" if CC_CORE_V_3_4_3 + default "3.4.4" if CC_CORE_V_3_4_4 + default "3.4.5" if CC_CORE_V_3_4_5 + default "3.4.6" if CC_CORE_V_3_4_6 + default "4.0.0" if CC_CORE_V_4_0_0 + default "4.0.1" if CC_CORE_V_4_0_1 + default "4.0.2" if CC_CORE_V_4_0_2 + default "4.0.3" if CC_CORE_V_4_0_3 + default "4.0.4" if CC_CORE_V_4_0_4 + default "4.1.0" if CC_CORE_V_4_1_0 + default "4.1.1" if CC_CORE_V_4_1_1 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove above line! + +config CC_CORE_EXTRA_CONFIG + string + prompt "Core gcc extra config" + default "" + depends on CC_USE_CORE && CC_CORE_GCC || ! CC_USE_CORE && CC_GCC + help + Extra flags to pass onto ./configure when configuring the core gcc. diff --git a/config/cc_core_tcc.in b/config/cc_core_tcc.in new file mode 100644 index 00000000..e69de29b diff --git a/config/cc_gcc.in b/config/cc_gcc.in new file mode 100644 index 00000000..3e64b7f6 --- /dev/null +++ b/config/cc_gcc.in @@ -0,0 +1,131 @@ +# Compiler options + +choice + bool + prompt "Final gcc version" + +config CC_V_2_95_3 + bool + prompt "2.95.3" + +config CC_V_3_2_3 + bool + prompt "3.2.3" + +config CC_V_3_3 + bool + prompt "3.3" + +config CC_V_3_3_1 + bool + prompt "3.3.1" + +config CC_V_3_3_2 + bool + prompt "3.3.2" + +config CC_V_3_3_3 + bool + prompt "3.3.3" + +config CC_V_3_3_4 + bool + prompt "3.3.4" + +config CC_V_3_3_5 + bool + prompt "3.3.5" + +config CC_V_3_3_6 + bool + prompt "3.3.6" + +config CC_V_3_4_0 + bool + prompt "3.4.0" + +config CC_V_3_4_1 + bool + prompt "3.4.1" + +config CC_V_3_4_2 + bool + prompt "3.4.2" + +config CC_V_3_4_3 + bool + prompt "3.4.3" + +config CC_V_3_4_4 + bool + prompt "3.4.4" + +config CC_V_3_4_5 + bool + prompt "3.4.5" + +config CC_V_4_0_0 + bool + prompt "4.0.0" + +config CC_V_4_0_1 + bool + prompt "4.0.1" + +config CC_V_4_0_2 + bool + prompt "4.0.2" + +config CC_V_4_0_3 + bool + prompt "4.0.3" + +config CC_V_4_0_4 + bool + prompt "4.0.4" + +config CC_V_4_1_0 + bool + prompt "4.1.0" + +config CC_V_4_1_1 + bool + prompt "4.1.1" + +# CT_INSERT_VERSION_ABOVE +# Don't remove above line! +endchoice + +config CC_VERSION + string + default "2.95.3" if CC_V_2_95_3 + default "3.2.3" if CC_V_3_2_3 + default "3.3" if CC_V_3_3 + default "3.3.1" if CC_V_3_3_1 + default "3.3.2" if CC_V_3_3_2 + default "3.3.3" if CC_V_3_3_3 + default "3.3.4" if CC_V_3_3_4 + default "3.3.5" if CC_V_3_3_5 + default "3.3.6" if CC_V_3_3_6 + default "3.4.0" if CC_V_3_4_0 + default "3.4.1" if CC_V_3_4_1 + default "3.4.2" if CC_V_3_4_2 + default "3.4.3" if CC_V_3_4_3 + default "3.4.4" if CC_V_3_4_4 + default "3.4.5" if CC_V_3_4_5 + default "4.0.0" if CC_V_4_0_0 + default "4.0.1" if CC_V_4_0_1 + default "4.0.2" if CC_V_4_0_2 + default "4.0.3" if CC_V_4_0_3 + default "4.0.4" if CC_V_4_0_4 + default "4.1.0" if CC_V_4_1_0 + default "4.1.1" if CC_V_4_1_1 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove above line! + +config CC_EXTRA_CONFIG + string + prompt "Final gcc extra config" + default "" + help + Extra flags to pass onto ./configure when configuring gcc. diff --git a/config/cc_tcc.in b/config/cc_tcc.in new file mode 100644 index 00000000..e69de29b diff --git a/config/config.in b/config/config.in new file mode 100644 index 00000000..76bc8ca8 --- /dev/null +++ b/config/config.in @@ -0,0 +1,6 @@ +source config/global.in +source config/target.in +source config/kernel.in +source config/binutils.in +source config/cc.in +source config/libc.in diff --git a/config/global.in b/config/global.in new file mode 100644 index 00000000..e61b1329 --- /dev/null +++ b/config/global.in @@ -0,0 +1,256 @@ +# Overall toolchain configuration: paths, jobs, etc... + +menu "Paths and misc options" + +config PARALLEL_JOBS + int + prompt "Number of parallel jobs" + default 1 + help + Number of jobs make will be allowed to run concurently. + Set this higher than the number of processors you have, but not too high. + A good rule of thumb is twice the number of processors you have. + + Enter 1 (or 0) to have only one job at a time. + +config LOAD + int + prompt "Maximum allowed load" + default 0 + help + Specifies that no new jobs should be started if there are others jobs + running and the load average is at least this value. + + Makes sense on SMP machines only. + + Enter 0 to have no limit on the load average. + + Note: only the integer part of the load is allowed here (you can't enter + 0.75 for example). + +config NICE + int + prompt "Nice level" + default 0 + range 0 19 + help + Renices the build process up. + +config USE_PIPES + bool + prompt "Use -pipe" + default y + help + Use gcc's option -pipe to use pipes rather than temp files when building + the toolchain. + +comment "Paths" + +config TARBALLS_DIR + string + prompt "Tarballs directory" + default "`pwd`/tarballs" + help + This is the directory into which tarballs are going to be stored once + they are downloaded (or otherwise retrieved). + +config SRC_DIR + string + prompt "Extract directory" + default "`pwd`/${CT_TARGET}/src" + help + This is the directory into which tarballs will be extracted. + + If you will build multiple toolchains, you should arrange to have one + SRC_DIR for each toolchain, as different targets may require different + patches to be applied. + +config BUILD_DIR + string + prompt "Build directory" + default "`pwd`/${CT_TARGET}/gcc-${CT_CC_VERSION}-${CT_LIBC}-${CT_LIBC_VERSION}" + help + This is the directory into which builds will occur. + + Once again, arrange for one build directory for each toolchain you build, + to avoid collision. + +config PREFIX_DIR + string + prompt "Prefix directory" + default "${HOME}/${CT_TARGET}" + help + This is the path the toolchain will run from. + +config INSTALL_DIR + string +# prompt "Install directory" + default "${CT_PREFIX_DIR}" +# help +# This is the path the target will be installed into. +# +# Normally, you would set this to ${CT_PREFIX_DIR}, but if for some reasons +# you can't write there, you can install somewhere else and have a third +# person do the install for you. +# The reason you might also want to install elsewhere is if you are going +# to package your shinny new toolchain for distribution. + +config CUSTOM_PATCH + bool + prompt "Use custom patch directory" + default n + help + If you have custom patches that you want to be applied, say 'Y' here and + enter the path directory below. + + Note that you must ensure that the patch directory is arranged the same + way the official directory is. + +config CUSTOM_PATCH_ONLY + bool + prompt "Only use custom patches" + default n + depends on CUSTOM_PATCH + help + Don't apply patches coming with CT-NG, only those patches available in + the directory below. + + If you say 'N' here, then the patches provided with CT-NG will be applied + first, and then your patches. + +config CUSTOM_PATCH_DIR + string + prompt "Custom patch directory" + default "" + depends on CUSTOM_PATCH + help + Enter the custom patch directory here. + +comment "Downloading and extracting" + +config NO_DOWNLOAD + bool + prompt "Avoid downloads" + default n + help + Avoid downloading anything. Bail out if a tarball is missing. + +config ONLY_DOWNLOAD + bool + prompt "Only download tarballs" + default n + depends on ! NO_DOWNLOAD + help + Only download the tarballs. Exit once it done. + + Usefull to pre-retrieve the tarballs before going off-line. + +config FORCE_DOWNLOAD + bool + prompt "Force downloads" + default n + depends on ! NO_DOWNLOAD + help + Force downloading tarballs, even if one already exists. + Usefull if you suspect a tarball to be damaged. + +config FORCE_EXTRACT + bool + prompt "Force extractions" + depends on ! ONLY_DOWNLOAD + default n + help + Force extraction of already exctracted tarballs. + + Usefull if you suspect a previous extract did not complete (eg. broken + tarball), or you added a new set of patches for this component. + +comment "Logging" + +choice + bool + prompt "Maximum log level to see:" + default LOG_INFO + +config LOG_ERROR + bool + prompt "ERROR" + help + The build will be silent. + Only if there is an error will you see a mesage. + +config LOG_WARN + bool + prompt "WARN" + help + The same as above, plus warnings. + +config LOG_INFO + bool + prompt "INFO" + help + The same as above, plus informational messages (main steps). + +config LOG_EXTRA + bool + prompt "EXTRA" + help + The same as above, plus extra messages (sub-steps). + +config LOG_DEBUG + bool + prompt "DEBUG" + help + The same as above, plus lots of debug information, of which each + component's build messages (very noisy!). + +endchoice + +config LOG_LEVEL_MAX + string + default "ERROR" if LOG_ERROR + default "WARN" if LOG_WARN + default "INFO" if LOG_INFO + default "EXTRA" if LOG_EXTRA + default "DEBUG" if LOG_DEBUG + +config LOG_PROGRESS_BAR + bool + prompt "Progress bar" + default n + depends on ! LOG_DEBUG + help + This option will print a "rotating bar" (/-\|) below the last log line + to show work is not stalled. + + Available when not in DEBUG log level. + +config LOG_USE_COLORS + bool + prompt "Use colors for logging to console" + default n + help + Use colors to highlight important messages. + ERROR: bright red + WARN : bright yellow + INFO : bright green + EXTRA: dim green + DEBUG: dim white + +config LOG_TO_FILE + bool + prompt "Log to a file" + default y + help + Save *full* logs to a file. Even log levels you didn't specify above + will be available in this file. + +config LOG_FILE + string + prompt "Log file" + default "${CT_PREFIX_DIR}/${CT_TARGET}.log" + depends on LOG_TO_FILE + help + File name into which to put logs. + +endmenu diff --git a/config/kernel.in b/config/kernel.in new file mode 100644 index 00000000..414ab26d --- /dev/null +++ b/config/kernel.in @@ -0,0 +1,36 @@ +# Kernel options + +menu "Kernel" + +choice + bool + prompt "\"Kernel\" to use:" + default KERNEL_LINUX + +config KERNEL_LINUX + bool + prompt "linux" + help + Build a toolchain targeting systems running Linux as a kernel. + +config KERNEL_CYGWIN + bool + prompt "cygwin" + depends on ARCH_x86 || ARCH_x86_64 + help + Build a toolchain targeting systems running Windows/cygwin as a kernel. + +endchoice + +config KERNEL_VERSION + string + +if KERNEL_LINUX +source config/kernel_linux.in +endif + +if KERNEL_CYGWIN +source config/kernel_cygwin.in +endif + +endmenu diff --git a/config/kernel_cygwin.in b/config/kernel_cygwin.in new file mode 100644 index 00000000..1edac593 --- /dev/null +++ b/config/kernel_cygwin.in @@ -0,0 +1,5 @@ +# Cygwin 'kernel' options + +config KERNEL + string + default "cygwin" diff --git a/config/kernel_linux.in b/config/kernel_linux.in new file mode 100644 index 00000000..aa07cadc --- /dev/null +++ b/config/kernel_linux.in @@ -0,0 +1,102 @@ +# Linux kernel options + +choice + bool + prompt "Get kernel headers from:" + +config KERNEL_LINUX_HEADERS_INSTALL + bool + prompt "kernel's 'headers_install'" + help + This will make use of the new headers_install rule in recent kernels. + This is most probably what you want to use. + +config KERNEL_LINUX_HEADERS_SANITISED + bool + prompt "Mazur's sanitized headers (OBSOLETE)" + help + M. Mazur used to maintain a tree of sanitised headers, but it is now + obsoleted by the headers_install rule (above), and has not seen eny + update since 2.6.12 + +config KERNEL_LINUX_HEADERS_COPY + bool + prompt "pure kernel headers (NOT RECOMMENDED)" + help + This will simply copy the kernel headers to the toolchain. + + You do NOT want this. It's badly broken because it leaks kernel internals + to userspace. + +endchoice + +config KERNEL + string + default "linux" if KERNEL_LINUX_HEADERS_INSTALL || KERNEL_LINUX_HEADERS_COPY + default "linux-libc-headers" if KERNEL_LINUX_HEADERS_SANITISED + +config KERNEL_VERSION_SEE_EXTRAVERSION + bool + prompt "See extra versions" + default n + depends on ! KERNEL_LINUX_HEADERS_SANITISED + help + See extra versions (kernel with 4 numbers, eg 2.6.19.1). + + If you say 'no', you'll only see sub-level, 3-digit versions. + If you say 'yes', you'll see far more versions! + + It is recommended that you say 'no', unless you _*know*_ + that an extra version fixes a headers bug. + +if KERNEL_LINUX_HEADERS_INSTALL +source config/kernel_linux_headers_install.in +endif + +if KERNEL_LINUX_HEADERS_COPY +source config/kernel_linux_headers_copy.in +endif + +if KERNEL_LINUX_HEADERS_SANITISED +source config/kernel_linux_headers_sanitised.in +endif + +choice + bool + prompt "Kernel verbosity:" + default KERNEL_LINUX_VERBOSITY_0 + +config KERNEL_LINUX_VERBOSITY_0 + bool + prompt "Simplified" + help + Print simplified command lines. + +config KERNEL_LINUX_VERBOSITY_1 + bool + prompt "Full commands" + help + Print full command lines. + +config KERNEL_LINUX_VERBOSITY_2 + bool + prompt "Exec reasons" + help + Print the reasons why a make target is rebuild. + +endchoice + +config KERNEL_LINUX_VERBOSE_LEVEL + int + default 0 if KERNEL_LINUX_VERBOSITY_0 + default 1 if KERNEL_LINUX_VERBOSITY_1 + default 2 if KERNEL_LINUX_VERBOSITY_2 + +config KERNEL_LINUX_CONFIG_FILE + string + prompt "Configuration file" + default "" + help + Path to the kernel configuration file. + + You _must_ provide one (for now). diff --git a/config/kernel_linux_headers_copy.in b/config/kernel_linux_headers_copy.in new file mode 100644 index 00000000..f18bed5b --- /dev/null +++ b/config/kernel_linux_headers_copy.in @@ -0,0 +1,682 @@ +choice + bool + prompt "Linux kernel version" + +config KERNEL_COPY_V_2_6_0 + bool + prompt "2.6.0" + +config KERNEL_COPY_V_2_6_1 + bool + prompt "2.6.1" + +config KERNEL_COPY_V_2_6_2 + bool + prompt "2.6.2" + +config KERNEL_COPY_V_2_6_3 + bool + prompt "2.6.3" + +config KERNEL_COPY_V_2_6_4 + bool + prompt "2.6.4" + +config KERNEL_COPY_V_2_6_5 + bool + prompt "2.6.5" + +config KERNEL_COPY_V_2_6_6 + bool + prompt "2.6.6" + +config KERNEL_COPY_V_2_6_7 + bool + prompt "2.6.7" + +config KERNEL_COPY_V_2_6_8 + bool + prompt "2.6.8" + +config KERNEL_COPY_V_2_6_8_1 + bool + prompt "2.6.8.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_9 + bool + prompt "2.6.9" + +config KERNEL_COPY_V_2_6_10 + bool + prompt "2.6.10" + +config KERNEL_COPY_V_2_6_11 + bool + prompt "2.6.11" + +config KERNEL_COPY_V_2_6_11_1 + bool + prompt "2.6.11.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_10 + bool + prompt "2.6.11.10" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_11 + bool + prompt "2.6.11.11" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_12 + bool + prompt "2.6.11.12" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_2 + bool + prompt "2.6.11.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_3 + bool + prompt "2.6.11.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_4 + bool + prompt "2.6.11.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_5 + bool + prompt "2.6.11.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_6 + bool + prompt "2.6.11.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_7 + bool + prompt "2.6.11.7" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_8 + bool + prompt "2.6.11.8" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_11_9 + bool + prompt "2.6.11.9" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_12 + bool + prompt "2.6.12" + +config KERNEL_COPY_V_2_6_12_1 + bool + prompt "2.6.12.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_12_2 + bool + prompt "2.6.12.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_12_3 + bool + prompt "2.6.12.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_12_4 + bool + prompt "2.6.12.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_12_5 + bool + prompt "2.6.12.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_12_6 + bool + prompt "2.6.12.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_13 + bool + prompt "2.6.13" + +config KERNEL_COPY_V_2_6_13_1 + bool + prompt "2.6.13.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_13_2 + bool + prompt "2.6.13.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_13_3 + bool + prompt "2.6.13.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_13_4 + bool + prompt "2.6.13.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_13_5 + bool + prompt "2.6.13.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_14 + bool + prompt "2.6.14" + +config KERNEL_COPY_V_2_6_14_1 + bool + prompt "2.6.14.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_14_2 + bool + prompt "2.6.14.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_14_3 + bool + prompt "2.6.14.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_14_4 + bool + prompt "2.6.14.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_14_5 + bool + prompt "2.6.14.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_14_6 + bool + prompt "2.6.14.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_14_7 + bool + prompt "2.6.14.7" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_15 + bool + prompt "2.6.15" + +config KERNEL_COPY_V_2_6_15_1 + bool + prompt "2.6.15.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_15_2 + bool + prompt "2.6.15.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_15_3 + bool + prompt "2.6.15.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_15_4 + bool + prompt "2.6.15.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_15_5 + bool + prompt "2.6.15.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_15_6 + bool + prompt "2.6.15.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_15_7 + bool + prompt "2.6.15.7" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16 + bool + prompt "2.6.16" + +config KERNEL_COPY_V_2_6_16_1 + bool + prompt "2.6.16.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_10 + bool + prompt "2.6.16.10" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_11 + bool + prompt "2.6.16.11" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_12 + bool + prompt "2.6.16.12" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_13 + bool + prompt "2.6.16.13" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_14 + bool + prompt "2.6.16.14" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_15 + bool + prompt "2.6.16.15" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_16 + bool + prompt "2.6.16.16" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_17 + bool + prompt "2.6.16.17" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_18 + bool + prompt "2.6.16.18" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_19 + bool + prompt "2.6.16.19" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_2 + bool + prompt "2.6.16.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_20 + bool + prompt "2.6.16.20" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_21 + bool + prompt "2.6.16.21" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_22 + bool + prompt "2.6.16.22" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_23 + bool + prompt "2.6.16.23" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_24 + bool + prompt "2.6.16.24" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_25 + bool + prompt "2.6.16.25" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_26 + bool + prompt "2.6.16.26" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_27 + bool + prompt "2.6.16.27" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_28 + bool + prompt "2.6.16.28" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_29 + bool + prompt "2.6.16.29" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_3 + bool + prompt "2.6.16.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_30 + bool + prompt "2.6.16.30" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_31 + bool + prompt "2.6.16.31" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_32 + bool + prompt "2.6.16.32" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_33 + bool + prompt "2.6.16.33" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_34 + bool + prompt "2.6.16.34" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_35 + bool + prompt "2.6.16.35" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_36 + bool + prompt "2.6.16.36" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_4 + bool + prompt "2.6.16.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_5 + bool + prompt "2.6.16.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_6 + bool + prompt "2.6.16.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_7 + bool + prompt "2.6.16.7" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_8 + bool + prompt "2.6.16.8" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_16_9 + bool + prompt "2.6.16.9" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17 + bool + prompt "2.6.17" + +config KERNEL_COPY_V_2_6_17_1 + bool + prompt "2.6.17.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_10 + bool + prompt "2.6.17.10" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_11 + bool + prompt "2.6.17.11" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_12 + bool + prompt "2.6.17.12" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_13 + bool + prompt "2.6.17.13" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_14 + bool + prompt "2.6.17.14" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_2 + bool + prompt "2.6.17.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_3 + bool + prompt "2.6.17.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_4 + bool + prompt "2.6.17.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_5 + bool + prompt "2.6.17.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_6 + bool + prompt "2.6.17.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_7 + bool + prompt "2.6.17.7" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_8 + bool + prompt "2.6.17.8" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_17_9 + bool + prompt "2.6.17.9" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_18 + bool + prompt "2.6.18" + +config KERNEL_COPY_V_2_6_18_1 + bool + prompt "2.6.18.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_18_2 + bool + prompt "2.6.18.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_18_3 + bool + prompt "2.6.18.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_18_4 + bool + prompt "2.6.18.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_18_5 + bool + prompt "2.6.18.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_18_6 + bool + prompt "2.6.18.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_COPY_V_2_6_19 + bool + prompt "2.6.19" + +config KERNEL_COPY_V_2_6_19_1 + bool + prompt "2.6.19.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +# CT_INSERT_VERSION_ABOVE +# Don't remove above line! +endchoice + +config KERNEL_VERSION + string + default "2.6.0" if KERNEL_COPY_V_2_6_0 + default "2.6.1" if KERNEL_COPY_V_2_6_1 + default "2.6.2" if KERNEL_COPY_V_2_6_2 + default "2.6.3" if KERNEL_COPY_V_2_6_3 + default "2.6.4" if KERNEL_COPY_V_2_6_4 + default "2.6.5" if KERNEL_COPY_V_2_6_5 + default "2.6.6" if KERNEL_COPY_V_2_6_6 + default "2.6.7" if KERNEL_COPY_V_2_6_7 + default "2.6.8" if KERNEL_COPY_V_2_6_8 + default "2.6.8.1" if KERNEL_COPY_V_2_6_8_1 + default "2.6.9" if KERNEL_COPY_V_2_6_9 + default "2.6.10" if KERNEL_COPY_V_2_6_10 + default "2.6.11" if KERNEL_COPY_V_2_6_11 + default "2.6.11.1" if KERNEL_COPY_V_2_6_11_1 + default "2.6.11.10" if KERNEL_COPY_V_2_6_11_10 + default "2.6.11.11" if KERNEL_COPY_V_2_6_11_11 + default "2.6.11.12" if KERNEL_COPY_V_2_6_11_12 + default "2.6.11.2" if KERNEL_COPY_V_2_6_11_2 + default "2.6.11.3" if KERNEL_COPY_V_2_6_11_3 + default "2.6.11.4" if KERNEL_COPY_V_2_6_11_4 + default "2.6.11.5" if KERNEL_COPY_V_2_6_11_5 + default "2.6.11.6" if KERNEL_COPY_V_2_6_11_6 + default "2.6.11.7" if KERNEL_COPY_V_2_6_11_7 + default "2.6.11.8" if KERNEL_COPY_V_2_6_11_8 + default "2.6.11.9" if KERNEL_COPY_V_2_6_11_9 + default "2.6.12" if KERNEL_COPY_V_2_6_12 + default "2.6.12.1" if KERNEL_COPY_V_2_6_12_1 + default "2.6.12.2" if KERNEL_COPY_V_2_6_12_2 + default "2.6.12.3" if KERNEL_COPY_V_2_6_12_3 + default "2.6.12.4" if KERNEL_COPY_V_2_6_12_4 + default "2.6.12.5" if KERNEL_COPY_V_2_6_12_5 + default "2.6.12.6" if KERNEL_COPY_V_2_6_12_6 + default "2.6.13" if KERNEL_COPY_V_2_6_13 + default "2.6.13.1" if KERNEL_COPY_V_2_6_13_1 + default "2.6.13.2" if KERNEL_COPY_V_2_6_13_2 + default "2.6.13.3" if KERNEL_COPY_V_2_6_13_3 + default "2.6.13.4" if KERNEL_COPY_V_2_6_13_4 + default "2.6.13.5" if KERNEL_COPY_V_2_6_13_5 + default "2.6.14" if KERNEL_COPY_V_2_6_14 + default "2.6.14.1" if KERNEL_COPY_V_2_6_14_1 + default "2.6.14.2" if KERNEL_COPY_V_2_6_14_2 + default "2.6.14.3" if KERNEL_COPY_V_2_6_14_3 + default "2.6.14.4" if KERNEL_COPY_V_2_6_14_4 + default "2.6.14.5" if KERNEL_COPY_V_2_6_14_5 + default "2.6.14.6" if KERNEL_COPY_V_2_6_14_6 + default "2.6.14.7" if KERNEL_COPY_V_2_6_14_7 + default "2.6.15" if KERNEL_COPY_V_2_6_15 + default "2.6.15.1" if KERNEL_COPY_V_2_6_15_1 + default "2.6.15.2" if KERNEL_COPY_V_2_6_15_2 + default "2.6.15.3" if KERNEL_COPY_V_2_6_15_3 + default "2.6.15.4" if KERNEL_COPY_V_2_6_15_4 + default "2.6.15.5" if KERNEL_COPY_V_2_6_15_5 + default "2.6.15.6" if KERNEL_COPY_V_2_6_15_6 + default "2.6.15.7" if KERNEL_COPY_V_2_6_15_7 + default "2.6.16" if KERNEL_COPY_V_2_6_16 + default "2.6.16.1" if KERNEL_COPY_V_2_6_16_1 + default "2.6.16.10" if KERNEL_COPY_V_2_6_16_10 + default "2.6.16.11" if KERNEL_COPY_V_2_6_16_11 + default "2.6.16.12" if KERNEL_COPY_V_2_6_16_12 + default "2.6.16.13" if KERNEL_COPY_V_2_6_16_13 + default "2.6.16.14" if KERNEL_COPY_V_2_6_16_14 + default "2.6.16.15" if KERNEL_COPY_V_2_6_16_15 + default "2.6.16.16" if KERNEL_COPY_V_2_6_16_16 + default "2.6.16.17" if KERNEL_COPY_V_2_6_16_17 + default "2.6.16.18" if KERNEL_COPY_V_2_6_16_18 + default "2.6.16.19" if KERNEL_COPY_V_2_6_16_19 + default "2.6.16.2" if KERNEL_COPY_V_2_6_16_2 + default "2.6.16.20" if KERNEL_COPY_V_2_6_16_20 + default "2.6.16.21" if KERNEL_COPY_V_2_6_16_21 + default "2.6.16.22" if KERNEL_COPY_V_2_6_16_22 + default "2.6.16.23" if KERNEL_COPY_V_2_6_16_23 + default "2.6.16.24" if KERNEL_COPY_V_2_6_16_24 + default "2.6.16.25" if KERNEL_COPY_V_2_6_16_25 + default "2.6.16.26" if KERNEL_COPY_V_2_6_16_26 + default "2.6.16.27" if KERNEL_COPY_V_2_6_16_27 + default "2.6.16.28" if KERNEL_COPY_V_2_6_16_28 + default "2.6.16.29" if KERNEL_COPY_V_2_6_16_29 + default "2.6.16.3" if KERNEL_COPY_V_2_6_16_3 + default "2.6.16.30" if KERNEL_COPY_V_2_6_16_30 + default "2.6.16.31" if KERNEL_COPY_V_2_6_16_31 + default "2.6.16.32" if KERNEL_COPY_V_2_6_16_32 + default "2.6.16.33" if KERNEL_COPY_V_2_6_16_33 + default "2.6.16.34" if KERNEL_COPY_V_2_6_16_34 + default "2.6.16.35" if KERNEL_COPY_V_2_6_16_35 + default "2.6.16.36" if KERNEL_COPY_V_2_6_16_36 + default "2.6.16.4" if KERNEL_COPY_V_2_6_16_4 + default "2.6.16.5" if KERNEL_COPY_V_2_6_16_5 + default "2.6.16.6" if KERNEL_COPY_V_2_6_16_6 + default "2.6.16.7" if KERNEL_COPY_V_2_6_16_7 + default "2.6.16.8" if KERNEL_COPY_V_2_6_16_8 + default "2.6.16.9" if KERNEL_COPY_V_2_6_16_9 + default "2.6.17" if KERNEL_COPY_V_2_6_17 + default "2.6.17.1" if KERNEL_COPY_V_2_6_17_1 + default "2.6.17.10" if KERNEL_COPY_V_2_6_17_10 + default "2.6.17.11" if KERNEL_COPY_V_2_6_17_11 + default "2.6.17.12" if KERNEL_COPY_V_2_6_17_12 + default "2.6.17.13" if KERNEL_COPY_V_2_6_17_13 + default "2.6.17.14" if KERNEL_COPY_V_2_6_17_14 + default "2.6.17.2" if KERNEL_COPY_V_2_6_17_2 + default "2.6.17.3" if KERNEL_COPY_V_2_6_17_3 + default "2.6.17.4" if KERNEL_COPY_V_2_6_17_4 + default "2.6.17.5" if KERNEL_COPY_V_2_6_17_5 + default "2.6.17.6" if KERNEL_COPY_V_2_6_17_6 + default "2.6.17.7" if KERNEL_COPY_V_2_6_17_7 + default "2.6.17.8" if KERNEL_COPY_V_2_6_17_8 + default "2.6.17.9" if KERNEL_COPY_V_2_6_17_9 + default "2.6.18" if KERNEL_COPY_V_2_6_18 + default "2.6.18.1" if KERNEL_COPY_V_2_6_18_1 + default "2.6.18.2" if KERNEL_COPY_V_2_6_18_2 + default "2.6.18.3" if KERNEL_COPY_V_2_6_18_3 + default "2.6.18.4" if KERNEL_COPY_V_2_6_18_4 + default "2.6.18.5" if KERNEL_COPY_V_2_6_18_5 + default "2.6.18.6" if KERNEL_COPY_V_2_6_18_6 + default "2.6.19" if KERNEL_COPY_V_2_6_19 + default "2.6.19.1" if KERNEL_COPY_V_2_6_19_1 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove above line! diff --git a/config/kernel_linux_headers_install.in b/config/kernel_linux_headers_install.in new file mode 100644 index 00000000..f89957bf --- /dev/null +++ b/config/kernel_linux_headers_install.in @@ -0,0 +1,75 @@ +choice + bool + prompt "Linux kernel version" + +config KERNEL_INSTALL_V_2_6_18 + bool + prompt "2.6.18" + +config KERNEL_INSTALL_V_2_6_18_1 + bool + prompt "2.6.18.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_18_2 + bool + prompt "2.6.18.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_18_3 + bool + prompt "2.6.18.3" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_18_4 + bool + prompt "2.6.18.4" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_18_5 + bool + prompt "2.6.18.5" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_18_6 + bool + prompt "2.6.18.6" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_19 + bool + prompt "2.6.19" + +config KERNEL_INSTALL_V_2_6_19_1 + bool + prompt "2.6.19.1" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_19_2 + bool + prompt "2.6.19.2" + depends on KERNEL_VERSION_SEE_EXTRAVERSION + +config KERNEL_INSTALL_V_2_6_20 + bool + prompt "2.6.20" + +# CT_INSERT_VERSION_ABOVE +# Don't remove above line! +endchoice + +config KERNEL_VERSION + string + default "2.6.18" if KERNEL_INSTALL_V_2_6_18 + default "2.6.18.1" if KERNEL_INSTALL_V_2_6_18_1 + default "2.6.18.2" if KERNEL_INSTALL_V_2_6_18_2 + default "2.6.18.3" if KERNEL_INSTALL_V_2_6_18_3 + default "2.6.18.4" if KERNEL_INSTALL_V_2_6_18_4 + default "2.6.18.5" if KERNEL_INSTALL_V_2_6_18_5 + default "2.6.18.6" if KERNEL_INSTALL_V_2_6_18_6 + default "2.6.19" if KERNEL_INSTALL_V_2_6_19 + default "2.6.19.1" if KERNEL_INSTALL_V_2_6_19_1 + default "2.6.19.2" if KERNEL_INSTALL_V_2_6_19_2 + default "2.6.20" if KERNEL_INSTALL_V_2_6_20 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove above line! diff --git a/config/kernel_linux_headers_sanitised.in b/config/kernel_linux_headers_sanitised.in new file mode 100644 index 00000000..820df6ed --- /dev/null +++ b/config/kernel_linux_headers_sanitised.in @@ -0,0 +1,62 @@ +choice + bool + prompt "Linux headers version" + +config KERNEL_SANITISED_V_2_6_7_0 + bool + prompt "2.6.7.0" + +config KERNEL_SANITISED_V_2_6_8_0 + bool + prompt "2.6.8.0" + +config KERNEL_SANITISED_V_2_6_8_1 + bool + prompt "2.6.8.1" + +config KERNEL_SANITISED_V_2_6_9_0 + bool + prompt "2.6.9.0" + +config KERNEL_SANITISED_V_2_6_9_1 + bool + prompt "2.6.9.1" + +config KERNEL_SANITISED_V_2_6_10_0 + bool + prompt "2.6.10.0" + +config KERNEL_SANITISED_V_2_6_11_0 + bool + prompt "2.6.11.0" + +config KERNEL_SANITISED_V_2_6_11_1 + bool + prompt "2.6.11.1" + +config KERNEL_SANITISED_V_2_6_11_2 + bool + prompt "2.6.11.2" + +config KERNEL_SANITISED_V_2_6_12_0 + bool + prompt "2.6.12.0" + +# CT_INSERT_VERSION_ABOVE +# Don't remove above line! +endchoice + +config KERNEL_VERSION + string + default "2.6.7.0" if KERNEL_SANITISED_V_2_6_7_0 + default "2.6.8.0" if KERNEL_SANITISED_V_2_6_8_0 + default "2.6.8.1" if KERNEL_SANITISED_V_2_6_8_1 + default "2.6.9.0" if KERNEL_SANITISED_V_2_6_9_0 + default "2.6.9.1" if KERNEL_SANITISED_V_2_6_9_1 + default "2.6.10.0" if KERNEL_SANITISED_V_2_6_10_0 + default "2.6.11.0" if KERNEL_SANITISED_V_2_6_11_0 + default "2.6.11.1" if KERNEL_SANITISED_V_2_6_11_1 + default "2.6.11.2" if KERNEL_SANITISED_V_2_6_11_2 + default "2.6.12.0" if KERNEL_SANITISED_V_2_6_12_0 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove above line! diff --git a/config/libc.in b/config/libc.in new file mode 100644 index 00000000..ba6a1bee --- /dev/null +++ b/config/libc.in @@ -0,0 +1,36 @@ +# C library options + +menu "C-library" + +choice + bool + prompt "C-library to use:" + default LIBC_GLIBC + +config LIBC_GLIBC + bool + prompt "glibc" + +config LIBC_UCLIBC + bool + prompt "uClibc" + +endchoice + +config LIBC_VERSION + string + +config LIBC + string + default "glibc" if LIBC_GLIBC + default "uClibc" if LIBC_UCLIBC + +if LIBC_GLIBC +source config/libc_glibc.in +endif + +if LIBC_UCLIBC +source config/libc_uClibc.in +endif + +endmenu diff --git a/config/libc_glibc.in b/config/libc_glibc.in new file mode 100644 index 00000000..867e0a0c --- /dev/null +++ b/config/libc_glibc.in @@ -0,0 +1,199 @@ +# glibc options + +choice + bool + prompt "glibc version" + +config LIBC_V_1_09_1 + bool + prompt "1.09.1" + +config LIBC_V_2_0_1 + bool + prompt "2.0.1" + +config LIBC_V_2_0_6 + bool + prompt "2.0.6" + +config LIBC_V_2_1_1 + bool + prompt "2.1.1" + +config LIBC_V_2_1_2 + bool + prompt "2.1.2" + +config LIBC_V_2_1_3 + bool + prompt "2.1.3" + +config LIBC_V_2_2 + bool + prompt "2.2" + +config LIBC_V_2_2_1 + bool + prompt "2.2.1" + +config LIBC_V_2_2_2 + bool + prompt "2.2.2" + +config LIBC_V_2_2_3 + bool + prompt "2.2.3" + +config LIBC_V_2_2_4 + bool + prompt "2.2.4" + +config LIBC_V_2_2_5 + bool + prompt "2.2.5" + +config LIBC_V_2_3 + bool + prompt "2.3" + +config LIBC_V_2_3_1 + bool + prompt "2.3.1" + +config LIBC_V_2_3_2 + bool + prompt "2.3.2" + +config LIBC_V_2_3_3 + bool + prompt "2.3.3" + +config LIBC_V_2_3_4 + bool + prompt "2.3.4" + +config LIBC_V_2_3_5 + bool + prompt "2.3.5" + +config LIBC_V_2_3_6 + bool + prompt "2.3.6" + +config LIBC_V_2_4 + bool + prompt "2.4" + +config LIBC_V_2_5 + bool + prompt "2.5" + +# CT_INSERT_VERSION_ABOVE +# Don't remove qbove line! +endchoice + +config LIBC_VERSION + string + default "1.09.1" if LIBC_V_1_09_1 + default "2.0.1" if LIBC_V_2_0_1 + default "2.0.6" if LIBC_V_2_0_6 + default "2.1.1" if LIBC_V_2_1_1 + default "2.1.2" if LIBC_V_2_1_2 + default "2.1.3" if LIBC_V_2_1_3 + default "2.2" if LIBC_V_2_2 + default "2.2.1" if LIBC_V_2_2_1 + default "2.2.2" if LIBC_V_2_2_2 + default "2.2.3" if LIBC_V_2_2_3 + default "2.2.4" if LIBC_V_2_2_4 + default "2.2.5" if LIBC_V_2_2_5 + default "2.3" if LIBC_V_2_3 + default "2.3.1" if LIBC_V_2_3_1 + default "2.3.2" if LIBC_V_2_3_2 + default "2.3.3" if LIBC_V_2_3_3 + default "2.3.4" if LIBC_V_2_3_4 + default "2.3.5" if LIBC_V_2_3_5 + default "2.3.6" if LIBC_V_2_3_6 + default "2.4" if LIBC_V_2_4 + default "2.5" if LIBC_V_2_5 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove above line! + +choice + bool + prompt "Threading implentation to use:" + default LIBC_GLIBC_THREADS_LINUXTHREADS + +config LIBC_GLIBC_THREADS_NPTL + bool + prompt "nptl (not implemented)" + +config LIBC_GLIBC_THREADS_LINUXTHREADS + bool + prompt "linuxthreads" + +config LIBC_GLIBC_THREADS_NONE + bool + prompt "none" + +endchoice + +config LIBC_GLIBC_EXTRA_CONFIG + string + prompt "glibc extra config" + default "" + help + Extra flags to pass onto ./configure when configuring glibc. + + Eg.: --enable-static-nss + +config LIBC_GLIBC_EXTRA_CFLAGS + string + prompt "glibc extra target CFLAGS" + default "" + help + Extra target CFLAGS to use when building glibc. + +config LIBC_EXTRA_CC_ARGS + string + prompt "gcc extra flags" + default "" + help + Extra flags to pass gcc when building glibc. + + Seldom used, except for sparc64 which seems to need the flag -64 + to be passed onto gcc. + +# Please note: This is not used for now (no sh support). +config LIBC_GLIBC_CONFIGPARMS + string + prompt "Extra config params (READ HELP)" + default "" if ARCH != "sh3" && ARCH != "sh4" + default "no-z-defs=yes" if ARCH = "sh3" || ARCH = "sh4" + help + Some architectures need to set options in the file configparms. + This is the case for sh3/4, which really need to set configparms as of + gcc-3.4/glibc-2.3.2. + + Unless you are building a toolchain for sh3/4, you should leave that empty. + + Note: this is awkward, doesn't work well if you need more than one + line in configparms + +config LIBC_ADDONS + bool + prompt "Pass extra addons list" + default n + help + If you say Y here, you'll be able to give the list of addons you want to + include in your C library. + +config LIBC_ADDONS_LIST + string + prompt "Extra addons" + default "" + help + Extra addons to include in glibc. + + Eg.: crypt (for very old glibces) + ports (for the ports addon, with other architectures) + linuxthreads (for the linuxthreads implementation of threads) diff --git a/config/libc_uClibc.in b/config/libc_uClibc.in new file mode 100644 index 00000000..f6939125 --- /dev/null +++ b/config/libc_uClibc.in @@ -0,0 +1,92 @@ +# uClibc options + +choice + bool + prompt "uClibc version" + +config LIBC_V_snapshot + bool + prompt "latest snapshot" + +config LIBC_V_specific_date + bool + prompt "<specific date>" + +config LIBC_V_0_9_26 + bool + prompt "0.9.26" + +config LIBC_V_0_9_27 + bool + prompt "0.9.27" + +config LIBC_V_0_9_28 + bool + prompt "0.9.28" + +config LIBC_V_0_9_28_1 + bool + prompt "0.9.28.1" + +config LIBC_V_0_9_28_2 + bool + prompt "0.9.28.2" + +# CT_INSERT_VERSION_ABOVE +# Don't remove above line! +endchoice + +config LIBC_VERSION + string + prompt "Enter date (YYYYMMDD)" if LIBC_V_specific_date + default "snapshot" if LIBC_V_snapshot + default "0.9.26" if LIBC_V_0_9_26 + default "0.9.27" if LIBC_V_0_9_27 + default "0.9.28" if LIBC_V_0_9_28 + default "0.9.28.1" if LIBC_V_0_9_28_1 + default "0.9.28.2" if LIBC_V_0_9_28_2 +# CT_INSERT_VERSION_STRING_ABOVE +# Don't remove qbove line! + +choice + bool + prompt "Debug level" + default LIBC_UCLIBC_DEBUG_LEVEL_0 + +config LIBC_UCLIBC_DEBUG_LEVEL_0 + bool + prompt "none" + +config LIBC_UCLIBC_DEBUG_LEVEL_1 + bool + prompt "minimal" + +config LIBC_UCLIBC_DEBUG_LEVEL_2 + bool + prompt "all" + +endchoice + +config LIBC_UCLIBC_DEBUG_LEVEL + int + default 0 if LIBC_UCLIBC_DEBUG_LEVEL_0 + default 1 if LIBC_UCLIBC_DEBUG_LEVEL_1 + default 2 if LIBC_UCLIBC_DEBUG_LEVEL_2 + +config LIBC_UCLIBC_CONFIG_FILE + string + prompt "Configuration file" + default "" + help + Path to the configuration file. + + You _must_ provide one (for now). + +config LIBC_UCLIBC_LOCALES + bool + prompt "Add support for locales" + default n + help + Say y if you want uClibc to support localisation. + + Note that seems to be broken on recent uClibc releases. diff --git a/config/target.in b/config/target.in new file mode 100644 index 00000000..42a7a3a4 --- /dev/null +++ b/config/target.in @@ -0,0 +1,300 @@ +# Target definition: architecture, optimisations, etc... + +menu "Target options" + +comment "General target options" + +choice + bool + prompt "Target architecture:" + default ARCH_x86 + +config ARCH_ARM + bool + prompt "arm" + +config ARCH_MIPS + bool + prompt "mips" + +config ARCH_x86 + bool + prompt "x86" + +config ARCH_x86_64 + bool + prompt "x86_64" + +endchoice + +choice + bool + prompt "Endianness:" + +config ARCH_BE + bool + prompt "Big endian" + +config ARCH_LE + bool + prompt "Little endian" + +endchoice + +comment "Target optimisations" + +config ARCH_CPU + string + prompt "Emit assembly for CPU" + default "" + help + This specifies the name of the target ARM processor. GCC uses this name + to determine what kind of instructions it can emit when generating + assembly code. + + Pick a value from the gcc manual for your choosen gcc version and your + target CPU. + + Leave blank if you don't know, or if your target architecture does not + offer this option. + +config ARCH_TUNE + string + prompt "Tune for CPU" + default "" + help + This option is very similar to the ARCH_CPU option (above), except + that instead of specifying the actual target processor type, and hence + restricting which instructions can be used, it specifies that GCC should + tune the performance of the code as if the target were of the type + specified in this option, but still choosing the instructions that it + will generate based on the cpu specified by the ARCH_CPU option + (above), or a (command-line) -mcpu= option. + + Pick a value from the gcc manual for your choosen gcc version and your + target CPU. + + Leave blank if you don't know, or if your target architecture does not + offer this option. + +config ARCH_ARCH + string + prompt "Achitecture level" + default "" + help + GCC uses this name to determine what kind of instructions it can emit + when generating assembly code. This option can be used in conjunction + with or instead of the ARCH_CPU option (above), or a (command-line) + -mcpu= option. + + Pick a value from the gcc manual for your choosen gcc version and your + target CPU. + + Leave blank if you don't know, or if your target architecture does not + offer this option. + +config ARCH_FPU + string + prompt "Use FPU" + default "" + help + On some targets (eg. ARM), you can specify the kind of FPU to emit + code for. + + See below wether to actually emit FP opcodes, or to emulate them. + + Pick a value from the gcc manual for your choosen gcc version and your + target CPU. + + Leave blank if you don't know, or if your target architecture does not + offer this option. + +choice + bool + prompt "Floating point:" + +config ARCH_FLOAT_HW + bool + prompt "hardware (FPU)" + help + Emit hardware floating point opcodes. + + If you've got a processor with a FPU, then you want that. + If your hardware has no FPU, you still can use HW floating point, but + need to compile support for FPU emulation in your kernel. Needless to + say that emulating the FPU is /slooowwwww/... + + One situation you'd want HW floating point without a FPU is if you get + binary blobs from different vendors that are compiling this way and + can't (don't wan't to) change. + +config ARCH_FLOAT_SW + bool + prompt "software" + help + Do not emit any hardware floating point opcode. + + If your processor has no FPU, then you most probably want this, as it + is faster than emulating the FPU in the kernel. + +endchoice + +config ARCH_FLOAT_SW_LIBFLOAT + bool + prompt "Use libfloat" + default n + depends on ARCH_FLOAT_SW + help + For those targets upporting it, you can use libfloat for the software + floating point emulation. + + Note that some versions of gcc have support code that supersedes libfloat, + while others don't. Known version of gcc that don't have support code are + versions prior to 3.0, and version above 4.0. + + You should check gcc before deciding to use libfloat. + +config TARGET_CFLAGS + string + prompt "Default target CFLAGS" + default "" + help + Used to add specific options when compiling libraries of the toolchain, + that will run on the target (eg. libc.so). + + Note that the options above for CPU, tune, arch and FPU will be + automaticaly used. You don't need to specify them here. + + Leave blank if you don't know better. + +comment "Toolchain options" + +config USE_SYSROOT + bool + prompt "Use sysroot'ed toolchain" + default y + help + Use the 'shinny new' sysroot feature of gcc: libraries split between + prefix/target/sys-root/lib and prefix/target/sys-root/usr/lib + + You definitely want to say 'Y' here. Yes you do. I know you do. Say 'Y'. + +config SHARED_LIBS + bool + prompt "Build shared libraries" + default y + help + Say 'y' here, unless you don't want shared libraries. + + You might not want shared librries if you're building for a target that + don't support it (maybe some nommu targets, for example, or bare metal). + +config TARGET_MULTILIB + bool +# prompt "Enable 'multilib' support (EXPERIMENTAL)" + default n + help + Enable the so-called 'multilib' support. + + With the same toolchain, and on some architectures, you will be able to + build big and little endian binaries, soft- and hard-float, etc... + + See the gcc configure manual at http://gcc.gnu.org/install/configure.html + to see what multilib your target supports. + + It's preferable for now to build two (or more) toolchains, one for each + configuration you need to support (eg. one for thumb and one for ARM, + etc...). You can use the vendor string to diferentiate those toolchains. + +config TARGET_VENDOR + string + prompt "Vendor string" + default "unknown" + help + Vendor part of the machine triplet. + + A triplet is of the form arch-vendor-kernel-system. + You can set the second part, vendor, to whatever you see fit. + Use a single word, or use underscores "_" to separate words. + + Keep the default (unkown) if you don't know better. + +config TARGET_ALIAS + string + prompt "Target alias" + default "" + help + Normaly, you'd call your toolchain component (especially gcc) by + prefixing the target triplet followed by a dash and the component name + (eg. armeb-unknown-linux-uclibc-gcc). + + You can enter a shortcut here. This string will be used to create + symbolic links to the toolchain tools (eg. if you enter "foo-bar" here, + then gcc for your toolchain will also be available as "foo-bar-gcc" along + with the original name). + + You shouldn't need to enter anything here, unless you plan to manually + call the tools (autotools-based ./configure will use the standard name). + +config ARCH + string + default "arm" if ARCH_ARM + default "mips" if ARCH_MIPS + default "x86" if ARCH_x86 + default "x86_64" if ARCH_x86_64 + +config BUILD + string + prompt "Build system triplet" + default "" + help + Canonical name of the machine building the toolchain. + You should leave empty, unless you really now what you're doing. + +config CC_NATIVE + string + prompt "Native gcc" + default "gcc" + help + The native C compiler. + + You can set this to an alternative compiler if you have more than one + installed (eg. gcc is gcc-4.1.1 and you want to use gcc-3.4.6). + + You can leave this empty as well, in which case gcc will be used. + +config CANADIAN + bool + prompt "Canadian build (EXPERIMENTAL)" + default n + help + A canadian build allows to build a compiler on a first machine + (build system), that will run on second machine (host system), + targetting a third machine (target system). + + An example where you'd want a candian cross-compiler is to create + a native compiler for your target. In this case host and target + are the same. + +config HOST + string + prompt "Host system triplet" + default "" + depends on CANADIAN + help + Canonical name of the machine serving as host. + +config HOST_CC + string + prompt "Host system compiler" + default "${CT_HOST}-" + depends on CANADIAN + help + C compiler targeting the host system. + If HOST_CC ends with a dash (-), then it is considered to be the + prefix to gcc (eg. x86-pc-linuc-gnu-). + If it is empty, it is formed by appending '-gcc' to HOST. + Else it is considered to be the complete name of the compiler, with + full path, or without path (provided that it can be found in PATH). + +endmenu diff --git a/docs/overview.txt b/docs/overview.txt new file mode 100644 index 00000000..8027180f --- /dev/null +++ b/docs/overview.txt @@ -0,0 +1,108 @@ +File.........: overview.txt +Content......: Overview of how ct-ng works. +Copyrigth....: (C) 2006 Yann E. MORIN <yann.morin.1998@anciens.enib.fr> +License......: see COPYING in the root of this package +________________ + / +Introduction / +_____________/ + +crosstool-NG aims at building toolchains. Toolchains are an essential component +in a software development project. It will compile, assemble and link the code +that is being developped. Some pieces of the toolchain will eventually end up +in the resulting binary/ies: static libraries are but an example. + +So, a toolchain is a very sensitive piece of software, as any bug in one of the +components, or a poorly configured component, can lead to execution problems, +ranging from poor performance, to applications ending unexpectedly, to +mis-behaving software (which more than often is hard to detect), to hardware +damage, or even to human risks (which is more than regretable). + +Toolchains are made of different piece of software, each being quite complex +and requiring specially crafted options to build and work seamlessly. This +is usually not that easy, even in the not-so-trivial case of native toolchains. +The work reaches a higher degree of complexity when it comes to cross- +compilation, where it can becomes quite a nightmare... + +Some cross-toolchain exits on the internet, and can be used for general +development, but they have a number of limitations: + - they can be general purpose, in that they are configured for the majority: + no optimisation for your specific target, + - they can be prepared for a specific target and thus are not easy to use, + nor optimised for, or even supporting your target, + - they often are using ageing components (compiler, C library, etc...) not + supporting special features of your shiny new processor; +On the other side, these toolchain offer some advantages: + - they are ready to use and quite easy to install and setup, + - they are proven if used by a wide community. + +But once you want to get all the juice out of your specific hardware, you will +want to build your own toolchain. This is where crosstool-ng comes into play. + +There are also a number of tools that builds toolchains for specific needs, +which is not really scalable. Examples are: + - buildroot (buildroot.uclibc.org) whose main puprpose is to build root file + systems, hence the name. But once you have your toolchain with buildroot, + part of it is installed in the root-to-be, so if you want to build a whole + new root, you either have to save the existing one as a template and + restore it later, or restart again from scratch. This is not convenient, + - ptxdist (www.pengutronix.de/software/ptxdist), whose purpose is very + similar to buildroot, + - other projects (openembeded.org for example), which is again used to + build root file systems. + +crosstool-NG is really targetted at building toolchains, and only toolchains. +It is then up to you to use it the way you want. + +___________ + / +History / +________/ + +crosstool was first 'conceived' by Dan Kegel, which offered it to the community, +as a set of scripts, a repository of patches, and some pre-configured, general +purpose setup files to be used to configure crosstool. This is available at +www.kegel.com/crosstool, and the subversion repository is hosted on google at +http://code.google.com/p/crosstool/. + +At the time of writing, crosstool only supports building with one C library, +namely glibc, and one C compiler, gcc; it is cripled with historical support +for legacy components, and is some kind of a mess to upgrade. + +I once managed to add support for uClibc-based toolchains, but it did not make +into mainline, mostly because I don't have time to port the patch forward to +the new versions, due in part to the big effort it was taking. + +So I decided to clean up crosstool in the state it was, re-order the things +in place, and add appropriate support for what I needed, that is uClibc +support. + +The only option left to me was rewrite crosstool from scratch. I decided to go +this way, and name the new implementation ct-ng, standing for crosstool Next +Generation, as many other comunity projects do, and as a wink at the TV series +"Star Trek: The Next Generation". ;-) + +_____________ + / +Operation / +__________/ + +ct-ng is configured by a configurator presenting a menu-stuctured set of +options. These options let you specify the way you want your toolchain built, +where you want it installed, what architecture and specific processor it +will support, the version of the components you want to use, etc... The +value for those options are then stored in a configuration file. + +You then simply run make. It will use this configuration file to retrieve, +extract and patch the components, build, install and test your newly built +toolchain. + +You are then free to add the toolchain /bin directory in your PATH to use +it at will. + +_____________ + / +Internals / +__________/ + +<To be completed> diff --git a/kconfig/Makefile b/kconfig/Makefile new file mode 100644 index 00000000..74635488 --- /dev/null +++ b/kconfig/Makefile @@ -0,0 +1,71 @@ +# =========================================================================== +# crosstool-ng configuration targets +# These targets are used from top-level makefile + +KCONFIG_TOP = config/config.in +obj = ./kconfig +PHONY += clean help oldconfig menuconfig config silentoldconfig \ + randconfig allyesconfig allnoconfig allmodconfig defconfig + +menuconfig: $(obj)/mconf + @$< $(KCONFIG_TOP) + +config: $(obj)/conf + @$< $(KCONFIG_TOP) + +oldconfig: $(obj)/conf + @$< -s $(KCONFIG_TOP) + +randconfig: $(obj)/conf + @$< -r $(KCONFIG_TOP) + +allyesconfig: $(obj)/conf + @$< -y $(KCONFIG_TOP) + +allnoconfig: $(obj)/conf + @$< -n $(KCONFIG_TOP) + +defconfig: $(obj)/conf + @$< -d $(KCONFIG_TOP) + +# Build a list of all available samples +SAMPLES = $(patsubst $(CT_TOP_DIR)/samples/%,%,$(filter-out %Makefile,$(wildcard $(CT_TOP_DIR)/samples/*))) +SAMPLES_CONFIG = $(patsubst %,%_config,$(SAMPLES)) +.PHONY: $(SAMPLES_CONFIG) +$(SAMPLES_CONFIG): + @cp "$(CT_TOP_DIR)/samples/$(patsubst %_config,%,$@)/crosstool.config" "$(CT_TOP_DIR)/.config" + @$(MAKE) oldconfig + +# Help text used by make help +help:: + @echo 'General purpose configuration targets:' + @echo ' config - Update current config utilising a line-oriented program' + @echo ' menuconfig - Update current config utilising a menu based program' + @echo ' oldconfig - Update current config utilising a provided .config as base' + @echo ' randconfig - New config with random answer to all options' + @echo ' defconfig - New config with default answer to all options' + @echo ' allyesconfig - New config where all options are accepted with yes' + @echo ' allnoconfig - New config where all options are answered with no' + @echo + @echo 'Preconfigured configuration targets:' + @for s in $(SAMPLES_CONFIG); do \ + echo " $${s}"; \ + done + @echo '' + +# Cheesy build + +SHIPPED = kconfig/zconf.tab.c kconfig/lex.zconf.c kconfig/zconf.hash.c + +%.c: %.c_shipped + @ln -s $(notdir $<) $@ + +kconfig/mconf: $(SHIPPED) kconfig/mconf.c + @$(HOST_CC) -o $@ kconfig/{mconf.c,zconf.tab.c,lxdialog/*.c} \ + -lcurses "-DCURSES_LOC=<ncurses.h>" + +kconfig/conf: $(SHIPPED) kconfig/conf.c + @$(HOST_CC) -o $@ kconfig/{conf.c,zconf.tab.c} + +clean:: + @rm -f $(wildcard kconfig/*zconf*.c) kconfig/{conf,mconf} diff --git a/kconfig/conf.c b/kconfig/conf.c new file mode 100644 index 00000000..1b5b5d51 --- /dev/null +++ b/kconfig/conf.c @@ -0,0 +1,623 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <ctype.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <time.h> +#include <sys/stat.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" + +static void conf(struct menu *menu); +static void check_conf(struct menu *menu); + +enum { + ask_all, + ask_new, + ask_silent, + set_default, + set_yes, + set_mod, + set_no, + set_random +} input_mode = ask_all; +char *defconfig_file; + +static int indent = 1; +static int valid_stdin = 1; +static int conf_cnt; +static char line[128]; +static struct menu *rootEntry; + +static char nohelp_text[] = N_("Sorry, no help available for this option yet.\n"); + +static void strip(char *str) +{ + char *p = str; + int l; + + while ((isspace(*p))) + p++; + l = strlen(p); + if (p != str) + memmove(str, p, l + 1); + if (!l) + return; + p = str + l - 1; + while ((isspace(*p))) + *p-- = 0; +} + +static void check_stdin(void) +{ + if (!valid_stdin && input_mode == ask_silent) { + printf(_("aborted!\n\n")); + printf(_("Console input/output is redirected. ")); + printf(_("Run 'make oldconfig' to update configuration.\n\n")); + exit(1); + } +} + +static void conf_askvalue(struct symbol *sym, const char *def) +{ + enum symbol_type type = sym_get_type(sym); + tristate val; + + if (!sym_has_value(sym)) + printf("(NEW) "); + + line[0] = '\n'; + line[1] = 0; + + if (!sym_is_changable(sym)) { + printf("%s\n", def); + line[0] = '\n'; + line[1] = 0; + return; + } + + switch (input_mode) { + case set_no: + case set_mod: + case set_yes: + case set_random: + if (sym_has_value(sym)) { + printf("%s\n", def); + return; + } + break; + case ask_new: + case ask_silent: + if (sym_has_value(sym)) { + printf("%s\n", def); + return; + } + check_stdin(); + case ask_all: + fflush(stdout); + fgets(line, 128, stdin); + return; + case set_default: + printf("%s\n", def); + return; + default: + break; + } + + switch (type) { + case S_INT: + case S_HEX: + case S_STRING: + printf("%s\n", def); + return; + default: + ; + } + switch (input_mode) { + case set_yes: + if (sym_tristate_within_range(sym, yes)) { + line[0] = 'y'; + line[1] = '\n'; + line[2] = 0; + break; + } + case set_mod: + if (type == S_TRISTATE) { + if (sym_tristate_within_range(sym, mod)) { + line[0] = 'm'; + line[1] = '\n'; + line[2] = 0; + break; + } + } else { + if (sym_tristate_within_range(sym, yes)) { + line[0] = 'y'; + line[1] = '\n'; + line[2] = 0; + break; + } + } + case set_no: + if (sym_tristate_within_range(sym, no)) { + line[0] = 'n'; + line[1] = '\n'; + line[2] = 0; + break; + } + case set_random: + do { + val = (tristate)(random() % 3); + } while (!sym_tristate_within_range(sym, val)); + switch (val) { + case no: line[0] = 'n'; break; + case mod: line[0] = 'm'; break; + case yes: line[0] = 'y'; break; + } + line[1] = '\n'; + line[2] = 0; + break; + default: + break; + } + printf("%s", line); +} + +int conf_string(struct menu *menu) +{ + struct symbol *sym = menu->sym; + const char *def, *help; + + while (1) { + printf("%*s%s ", indent - 1, "", menu->prompt->text); + printf("(%s) ", sym->name); + def = sym_get_string_value(sym); + if (sym_get_string_value(sym)) + printf("[%s] ", def); + conf_askvalue(sym, def); + switch (line[0]) { + case '\n': + break; + case '?': + /* print help */ + if (line[1] == '\n') { + help = nohelp_text; + if (menu->sym->help) + help = menu->sym->help; + printf("\n%s\n", menu->sym->help); + def = NULL; + break; + } + default: + line[strlen(line)-1] = 0; + def = line; + } + if (def && sym_set_string_value(sym, def)) + return 0; + } +} + +static int conf_sym(struct menu *menu) +{ + struct symbol *sym = menu->sym; + int type; + tristate oldval, newval; + const char *help; + + while (1) { + printf("%*s%s ", indent - 1, "", menu->prompt->text); + if (sym->name) + printf("(%s) ", sym->name); + type = sym_get_type(sym); + putchar('['); + oldval = sym_get_tristate_value(sym); + switch (oldval) { + case no: + putchar('N'); + break; + case mod: + putchar('M'); + break; + case yes: + putchar('Y'); + break; + } + if (oldval != no && sym_tristate_within_range(sym, no)) + printf("/n"); + if (oldval != mod && sym_tristate_within_range(sym, mod)) + printf("/m"); + if (oldval != yes && sym_tristate_within_range(sym, yes)) + printf("/y"); + if (sym->help) + printf("/?"); + printf("] "); + conf_askvalue(sym, sym_get_string_value(sym)); + strip(line); + + switch (line[0]) { + case 'n': + case 'N': + newval = no; + if (!line[1] || !strcmp(&line[1], "o")) + break; + continue; + case 'm': + case 'M': + newval = mod; + if (!line[1]) + break; + continue; + case 'y': + case 'Y': + newval = yes; + if (!line[1] || !strcmp(&line[1], "es")) + break; + continue; + case 0: + newval = oldval; + break; + case '?': + goto help; + default: + continue; + } + if (sym_set_tristate_value(sym, newval)) + return 0; +help: + help = nohelp_text; + if (sym->help) + help = sym->help; + printf("\n%s\n", help); + } +} + +static int conf_choice(struct menu *menu) +{ + struct symbol *sym, *def_sym; + struct menu *child; + int type; + bool is_new; + + sym = menu->sym; + type = sym_get_type(sym); + is_new = !sym_has_value(sym); + if (sym_is_changable(sym)) { + conf_sym(menu); + sym_calc_value(sym); + switch (sym_get_tristate_value(sym)) { + case no: + return 1; + case mod: + return 0; + case yes: + break; + } + } else { + switch (sym_get_tristate_value(sym)) { + case no: + return 1; + case mod: + printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); + return 0; + case yes: + break; + } + } + + while (1) { + int cnt, def; + + printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu)); + def_sym = sym_get_choice_value(sym); + cnt = def = 0; + line[0] = 0; + for (child = menu->list; child; child = child->next) { + if (!menu_is_visible(child)) + continue; + if (!child->sym) { + printf("%*c %s\n", indent, '*', menu_get_prompt(child)); + continue; + } + cnt++; + if (child->sym == def_sym) { + def = cnt; + printf("%*c", indent, '>'); + } else + printf("%*c", indent, ' '); + printf(" %d. %s", cnt, menu_get_prompt(child)); + if (child->sym->name) + printf(" (%s)", child->sym->name); + if (!sym_has_value(child->sym)) + printf(" (NEW)"); + printf("\n"); + } + printf("%*schoice", indent - 1, ""); + if (cnt == 1) { + printf("[1]: 1\n"); + goto conf_childs; + } + printf("[1-%d", cnt); + if (sym->help) + printf("?"); + printf("]: "); + switch (input_mode) { + case ask_new: + case ask_silent: + if (!is_new) { + cnt = def; + printf("%d\n", cnt); + break; + } + check_stdin(); + case ask_all: + fflush(stdout); + fgets(line, 128, stdin); + strip(line); + if (line[0] == '?') { + printf("\n%s\n", menu->sym->help ? + menu->sym->help : nohelp_text); + continue; + } + if (!line[0]) + cnt = def; + else if (isdigit(line[0])) + cnt = atoi(line); + else + continue; + break; + case set_random: + def = (random() % cnt) + 1; + case set_default: + case set_yes: + case set_mod: + case set_no: + cnt = def; + printf("%d\n", cnt); + break; + } + + conf_childs: + for (child = menu->list; child; child = child->next) { + if (!child->sym || !menu_is_visible(child)) + continue; + if (!--cnt) + break; + } + if (!child) + continue; + if (line[strlen(line) - 1] == '?') { + printf("\n%s\n", child->sym->help ? + child->sym->help : nohelp_text); + continue; + } + sym_set_choice_value(sym, child->sym); + if (child->list) { + indent += 2; + conf(child->list); + indent -= 2; + } + return 1; + } +} + +static void conf(struct menu *menu) +{ + struct symbol *sym; + struct property *prop; + struct menu *child; + + if (!menu_is_visible(menu)) + return; + + sym = menu->sym; + prop = menu->prompt; + if (prop) { + const char *prompt; + + switch (prop->type) { + case P_MENU: + if (input_mode == ask_silent && rootEntry != menu) { + check_conf(menu); + return; + } + case P_COMMENT: + prompt = menu_get_prompt(menu); + if (prompt) + printf("%*c\n%*c %s\n%*c\n", + indent, '*', + indent, '*', prompt, + indent, '*'); + default: + ; + } + } + + if (!sym) + goto conf_childs; + + if (sym_is_choice(sym)) { + conf_choice(menu); + if (sym->curr.tri != mod) + return; + goto conf_childs; + } + + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + conf_string(menu); + break; + default: + conf_sym(menu); + break; + } + +conf_childs: + if (sym) + indent += 2; + for (child = menu->list; child; child = child->next) + conf(child); + if (sym) + indent -= 2; +} + +static void check_conf(struct menu *menu) +{ + struct symbol *sym; + struct menu *child; + + if (!menu_is_visible(menu)) + return; + + sym = menu->sym; + if (sym && !sym_has_value(sym)) { + if (sym_is_changable(sym) || + (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) { + if (!conf_cnt++) + printf(_("*\n* Restart config...\n*\n")); + rootEntry = menu_get_parent_menu(menu); + conf(rootEntry); + } + } + + for (child = menu->list; child; child = child->next) + check_conf(child); +} + +int main(int ac, char **av) +{ + int i = 1; + const char *name; + struct stat tmpstat; + + if (ac > i && av[i][0] == '-') { + switch (av[i++][1]) { + case 'o': + input_mode = ask_new; + break; + case 's': + input_mode = ask_silent; + valid_stdin = isatty(0) && isatty(1) && isatty(2); + break; + case 'd': + input_mode = set_default; + break; + case 'D': + input_mode = set_default; + defconfig_file = av[i++]; + if (!defconfig_file) { + printf(_("%s: No default config file specified\n"), + av[0]); + exit(1); + } + break; + case 'n': + input_mode = set_no; + break; + case 'm': + input_mode = set_mod; + break; + case 'y': + input_mode = set_yes; + break; + case 'r': + input_mode = set_random; + srandom(time(NULL)); + break; + case 'h': + case '?': + fprintf(stderr, "See README for usage info\n"); + exit(0); + } + } + name = av[i]; + if (!name) { + printf(_("%s: Kconfig file missing\n"), av[0]); + exit(1); + } + conf_parse(name); + //zconfdump(stdout); + switch (input_mode) { + case set_default: + if (!defconfig_file) + defconfig_file = conf_get_default_confname(); + if (conf_read(defconfig_file)) { + printf("***\n" + "*** Can't find default configuration \"%s\"!\n" + "***\n", defconfig_file); + exit(1); + } + break; + case ask_silent: + if (stat(".config", &tmpstat)) { + printf(_("***\n" + "*** You have not yet configured your "PROJECT_NAME"!\n" + "***\n" + "*** Please run some configurator (e.g. \"make oldconfig\" or\n" + "*** \"make menuconfig\" or \"make xconfig\").\n" + "***\n")); + exit(1); + } + case ask_all: + case ask_new: + conf_read(NULL); + break; + case set_no: + case set_mod: + case set_yes: + case set_random: + name = getenv("KCONFIG_ALLCONFIG"); + if (name && !stat(name, &tmpstat)) { + conf_read_simple(name, S_DEF_USER); + break; + } + switch (input_mode) { + case set_no: name = "allno.config"; break; + case set_mod: name = "allmod.config"; break; + case set_yes: name = "allyes.config"; break; + case set_random: name = "allrandom.config"; break; + default: break; + } + if (!stat(name, &tmpstat)) + conf_read_simple(name, S_DEF_USER); + else if (!stat("all.config", &tmpstat)) + conf_read_simple("all.config", S_DEF_USER); + break; + default: + break; + } + + if (input_mode != ask_silent) { + rootEntry = &rootmenu; + conf(&rootmenu); + if (input_mode == ask_all) { + input_mode = ask_silent; + valid_stdin = 1; + } + } else if (sym_change_count) { + name = getenv("KCONFIG_NOSILENTUPDATE"); + if (name && *name) { + fprintf(stderr, _("\n*** "PROJECT_NAME" configuration requires explicit update.\n\n")); + return 1; + } + } else + goto skip_check; + + do { + conf_cnt = 0; + check_conf(&rootmenu); + } while (conf_cnt); + + if (!conf_write(NULL)) { +skip_check: + return 0; + } + fprintf(stderr, _("\n*** Error writing "PROJECT_NAME" configuration.\n\n")); + return 1; +} diff --git a/kconfig/confdata.c b/kconfig/confdata.c new file mode 100644 index 00000000..8d79f442 --- /dev/null +++ b/kconfig/confdata.c @@ -0,0 +1,800 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <sys/stat.h> +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <time.h> +#include <unistd.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" + +static void conf_warning(const char *fmt, ...) + __attribute__ ((format (printf, 1, 2))); + +static const char *conf_filename; +static int conf_lineno, conf_warnings, conf_unsaved; + +#ifndef conf_defname +const char conf_defname[] = "arch/$ARCH/defconfig"; +#endif + +static void conf_warning(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d:warning: ", conf_filename, conf_lineno); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); + conf_warnings++; +} + +const char *conf_get_configname(void) +{ + char *name = getenv("KCONFIG_CONFIG"); + + return name ? name : ".config"; +} + +static char *conf_expand_value(const char *in) +{ + struct symbol *sym; + const char *src; + static char res_value[SYMBOL_MAXLENGTH]; + char *dst, name[SYMBOL_MAXLENGTH]; + + res_value[0] = 0; + dst = name; + while ((src = strchr(in, '$'))) { + strncat(res_value, in, src - in); + src++; + dst = name; + while (isalnum(*src) || *src == '_') + *dst++ = *src++; + *dst = 0; + sym = sym_lookup(name, 0); + sym_calc_value(sym); + strcat(res_value, sym_get_string_value(sym)); + in = src; + } + strcat(res_value, in); + + return res_value; +} + +char *conf_get_default_confname(void) +{ + struct stat buf; + static char fullname[PATH_MAX+1]; + char *env, *name; + + name = conf_expand_value(conf_defname); + env = getenv(SRCTREE); + if (env) { + sprintf(fullname, "%s/%s", env, name); + if (!stat(fullname, &buf)) + return fullname; + } + return name; +} + +int conf_read_simple(const char *name, int def) +{ + FILE *in = NULL; + char line[1024]; + char *p, *p2; + struct symbol *sym; + int i, def_flags; + + if (name) { + in = zconf_fopen(name); + } else { + struct property *prop; + + name = conf_get_configname(); + in = zconf_fopen(name); + if (in) + goto load; + sym_change_count++; + if (!sym_defconfig_list) + return 1; + + for_all_defaults(sym_defconfig_list, prop) { + if (expr_calc_value(prop->visible.expr) == no || + prop->expr->type != E_SYMBOL) + continue; + name = conf_expand_value(prop->expr->left.sym->name); + in = zconf_fopen(name); + if (in) { + printf(_("#\n" + "# using defaults found in %s\n" + "#\n"), name); + goto load; + } + } + } + if (!in) + return 1; + +load: + conf_filename = name; + conf_lineno = 0; + conf_warnings = 0; + conf_unsaved = 0; + + def_flags = SYMBOL_DEF << def; + for_all_symbols(i, sym) { + sym->flags |= SYMBOL_CHANGED; + sym->flags &= ~(def_flags|SYMBOL_VALID); + if (sym_is_choice(sym)) + sym->flags |= def_flags; + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + if (sym->def[def].val) + free(sym->def[def].val); + default: + sym->def[def].val = NULL; + sym->def[def].tri = no; + } + } + + while (fgets(line, sizeof(line), in)) { + conf_lineno++; + sym = NULL; + switch (line[0]) { + case '#': + if (memcmp(line + 2, "CT_", 3)) + continue; + p = strchr(line + 5, ' '); + if (!p) + continue; + *p++ = 0; + if (strncmp(p, "is not set", 10)) + continue; + if (def == S_DEF_USER) { + sym = sym_find(line + 5); + if (!sym) { + conf_warning("trying to assign nonexistent symbol %s", line + 5); + break; + } + } else { + sym = sym_lookup(line + 5, 0); + if (sym->type == S_UNKNOWN) + sym->type = S_BOOLEAN; + } + if (sym->flags & def_flags) { + conf_warning("trying to reassign symbol %s", sym->name); + break; + } + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + sym->def[def].tri = no; + sym->flags |= def_flags; + break; + default: + ; + } + break; + case 'C': + if (memcmp(line, "CT_", 3)) { + conf_warning("unexpected data"); + continue; + } + p = strchr(line + 3, '='); + if (!p) + continue; + *p++ = 0; + p2 = strchr(p, '\n'); + if (p2) { + *p2-- = 0; + if (*p2 == '\r') + *p2 = 0; + } + if (def == S_DEF_USER) { + sym = sym_find(line + 3); + if (!sym) { + conf_warning("trying to assign nonexistent symbol %s", line + 3); + break; + } + } else { + sym = sym_lookup(line + 3, 0); + if (sym->type == S_UNKNOWN) + sym->type = S_OTHER; + } + if (sym->flags & def_flags) { + conf_warning("trying to reassign symbol %s", sym->name); + break; + } + switch (sym->type) { + case S_TRISTATE: + if (p[0] == 'm') { + sym->def[def].tri = mod; + sym->flags |= def_flags; + break; + } + case S_BOOLEAN: + if (p[0] == 'y') { + sym->def[def].tri = yes; + sym->flags |= def_flags; + break; + } + if (p[0] == 'n') { + sym->def[def].tri = no; + sym->flags |= def_flags; + break; + } + conf_warning("symbol value '%s' invalid for %s", p, sym->name); + break; + case S_OTHER: + if (*p != '"') { + for (p2 = p; *p2 && !isspace(*p2); p2++) + ; + sym->type = S_STRING; + goto done; + } + case S_STRING: + if (*p++ != '"') + break; + for (p2 = p; (p2 = strpbrk(p2, "\"\\")); p2++) { + if (*p2 == '"') { + *p2 = 0; + break; + } + memmove(p2, p2 + 1, strlen(p2)); + } + if (!p2) { + conf_warning("invalid string found"); + continue; + } + case S_INT: + case S_HEX: + done: + if (sym_string_valid(sym, p)) { + sym->def[def].val = strdup(p); + sym->flags |= def_flags; + } else { + conf_warning("symbol value '%s' invalid for %s", p, sym->name); + continue; + } + break; + default: + ; + } + break; + case '\r': + case '\n': + break; + default: + conf_warning("unexpected data"); + continue; + } + if (sym && sym_is_choice_value(sym)) { + struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); + switch (sym->def[def].tri) { + case no: + break; + case mod: + if (cs->def[def].tri == yes) { + conf_warning("%s creates inconsistent choice state", sym->name); + cs->flags &= ~def_flags; + } + break; + case yes: + if (cs->def[def].tri != no) { + conf_warning("%s creates inconsistent choice state", sym->name); + cs->flags &= ~def_flags; + } else + cs->def[def].val = sym; + break; + } + cs->def[def].tri = E_OR(cs->def[def].tri, sym->def[def].tri); + } + } + fclose(in); + + if (modules_sym) + sym_calc_value(modules_sym); + return 0; +} + +int conf_read(const char *name) +{ + struct symbol *sym; + struct property *prop; + struct expr *e; + int i, flags; + + sym_change_count = 0; + + if (conf_read_simple(name, S_DEF_USER)) + return 1; + + for_all_symbols(i, sym) { + sym_calc_value(sym); + if (sym_is_choice(sym) || (sym->flags & SYMBOL_AUTO)) + goto sym_ok; + if (sym_has_value(sym) && (sym->flags & SYMBOL_WRITE)) { + /* check that calculated value agrees with saved value */ + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym)) + break; + if (!sym_is_choice(sym)) + goto sym_ok; + default: + if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val)) + goto sym_ok; + break; + } + } else if (!sym_has_value(sym) && !(sym->flags & SYMBOL_WRITE)) + /* no previous value and not saved */ + goto sym_ok; + conf_unsaved++; + /* maybe print value in verbose mode... */ + sym_ok: + if (sym_has_value(sym) && !sym_is_choice_value(sym)) { + if (sym->visible == no) + sym->flags &= ~SYMBOL_DEF_USER; + switch (sym->type) { + case S_STRING: + case S_INT: + case S_HEX: + if (!sym_string_within_range(sym, sym->def[S_DEF_USER].val)) + sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER); + default: + break; + } + } + if (!sym_is_choice(sym)) + continue; + prop = sym_get_choice_prop(sym); + flags = sym->flags; + for (e = prop->expr; e; e = e->left.expr) + if (e->right.sym->visible != no) + flags &= e->right.sym->flags; + sym->flags &= flags | ~SYMBOL_DEF_USER; + } + + sym_change_count += conf_warnings || conf_unsaved; + + return 0; +} + +struct menu *next_menu(struct menu *menu) +{ + if (menu->list) return menu->list; + do { + if (menu->next) { + menu = menu->next; + break; + } + } while ((menu = menu->parent)); + + return menu; +} + +#define SYMBOL_FORCEWRITE (1<<31) + +int conf_write(const char *name) +{ + FILE *out; + struct symbol *sym; + struct menu *menu; + const char *basename; + char dirname[128], tmpname[128], newname[128]; + int type, l, writetype; + const char *str; + time_t now; + int use_timestamp = 1; + char *env; + + dirname[0] = 0; + if (name && name[0]) { + struct stat st; + char *slash; + + if (!stat(name, &st) && S_ISDIR(st.st_mode)) { + strcpy(dirname, name); + strcat(dirname, "/"); + basename = conf_get_configname(); + } else if ((slash = strrchr(name, '/'))) { + int size = slash - name + 1; + memcpy(dirname, name, size); + dirname[size] = 0; + if (slash[1]) + basename = slash + 1; + else + basename = conf_get_configname(); + } else + basename = name; + } else + basename = conf_get_configname(); + + sprintf(newname, "%s%s", dirname, basename); + env = getenv("KCONFIG_OVERWRITECONFIG"); + if (!env || !*env) { + sprintf(tmpname, "%s.tmpconfig.%d", dirname, (int)getpid()); + out = fopen(tmpname, "w"); + } else { + *tmpname = 0; + out = fopen(newname, "w"); + } + if (!out) + return 1; + + sym = sym_lookup("PROJECTVERSION", 0); + sym_calc_value(sym); + time(&now); + env = getenv("KCONFIG_NOTIMESTAMP"); + if (env && *env) + use_timestamp = 0; + + fprintf(out, _("#\n" + "# Automatically generated make config: don't edit\n" + "# "PROJECT_NAME" version: %s\n" + "%s%s" + "#\n"), + sym_get_string_value(sym), + use_timestamp ? "# " : "", + use_timestamp ? ctime(&now) : ""); + + if (!sym_change_count) + sym_clear_all_valid(); + + // Write out all symbols (even in closed sub-menus). + if (1) { + for (menu = rootmenu.list; menu; menu = next_menu(menu)) + if (menu->sym) menu->sym->flags |= SYMBOL_FORCEWRITE; + writetype = SYMBOL_FORCEWRITE; + + // Don't write out symbols in closed menus. + + } else writetype = SYMBOL_WRITE; + + + menu = rootmenu.list; + while (menu) { + sym = menu->sym; + if (!sym) { + if (!menu_is_visible(menu)) + goto next; + str = menu_get_prompt(menu); + fprintf(out, "\n" + "#\n" + "# %s\n" + "#\n", str); + } else if (!(sym->flags & SYMBOL_CHOICE)) { + sym_calc_value(sym); + if (!(sym->flags & writetype)) + goto next; + sym->flags &= ~writetype; + type = sym->type; + if (type == S_TRISTATE) { + sym_calc_value(modules_sym); + if (modules_sym->curr.tri == no) + type = S_BOOLEAN; + } + switch (type) { + case S_BOOLEAN: + case S_TRISTATE: + switch (sym_get_tristate_value(sym)) { + case no: + fprintf(out, "# CT_%s is not set\n", sym->name); + break; + case mod: + fprintf(out, "CT_%s=m\n", sym->name); + break; + case yes: + fprintf(out, "CT_%s=y\n", sym->name); + break; + } + break; + case S_STRING: + str = sym_get_string_value(sym); + fprintf(out, "CT_%s=\"", sym->name); + while (1) { + l = strcspn(str, "\"\\"); + if (l) { + fwrite(str, l, 1, out); + str += l; + } + if (!*str) + break; + fprintf(out, "\\%c", *str++); + } + fputs("\"\n", out); + break; + case S_HEX: + str = sym_get_string_value(sym); + if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { + fprintf(out, "CT_%s=%s\n", sym->name, *str ? str : "0"); + break; + } + case S_INT: + str = sym_get_string_value(sym); + fprintf(out, "CT_%s=%s\n", sym->name, *str ? str : "0"); + break; + } + } + + next: + if (writetype == SYMBOL_WRITE) { + if (menu->list) { + menu = menu->list; + continue; + } + if (menu->next) + menu = menu->next; + else while ((menu = menu->parent)) { + if (menu->next) { + menu = menu->next; + break; + } + } + } else + menu = next_menu(menu); + } + fclose(out); + + if (*tmpname) { + strcat(dirname, basename); + strcat(dirname, ".old"); + rename(newname, dirname); + if (rename(tmpname, newname)) + return 1; + } + + printf(_("#\n" + "# configuration written to %s\n" + "#\n"), newname); + + sym_change_count = 0; + + return 0; +} + +int conf_split_config(void) +{ + char *name, path[128]; + char *s, *d, c; + struct symbol *sym; + struct stat sb; + int res, i, fd; + + name = getenv("KCONFIG_AUTOCONFIG"); + if (!name) + name = "include/config/auto.conf"; + conf_read_simple(name, S_DEF_AUTO); + + if (chdir("include/config")) + return 1; + + res = 0; + for_all_symbols(i, sym) { + sym_calc_value(sym); + if ((sym->flags & SYMBOL_AUTO) || !sym->name) + continue; + if (sym->flags & SYMBOL_WRITE) { + if (sym->flags & SYMBOL_DEF_AUTO) { + /* + * symbol has old and new value, + * so compare them... + */ + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym_get_tristate_value(sym) == + sym->def[S_DEF_AUTO].tri) + continue; + break; + case S_STRING: + case S_HEX: + case S_INT: + if (!strcmp(sym_get_string_value(sym), + sym->def[S_DEF_AUTO].val)) + continue; + break; + default: + break; + } + } else { + /* + * If there is no old value, only 'no' (unset) + * is allowed as new value. + */ + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym_get_tristate_value(sym) == no) + continue; + break; + default: + break; + } + } + } else if (!(sym->flags & SYMBOL_DEF_AUTO)) + /* There is neither an old nor a new value. */ + continue; + /* else + * There is an old value, but no new value ('no' (unset) + * isn't saved in auto.conf, so the old value is always + * different from 'no'). + */ + + /* Replace all '_' and append ".h" */ + s = sym->name; + d = path; + while ((c = *s++)) { + c = tolower(c); + *d++ = (c == '_') ? '/' : c; + } + strcpy(d, ".h"); + + /* Assume directory path already exists. */ + fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd == -1) { + if (errno != ENOENT) { + res = 1; + break; + } + /* + * Create directory components, + * unless they exist already. + */ + d = path; + while ((d = strchr(d, '/'))) { + *d = 0; + if (stat(path, &sb) && mkdir(path, 0755)) { + res = 1; + goto out; + } + *d++ = '/'; + } + /* Try it again. */ + fd = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0644); + if (fd == -1) { + res = 1; + break; + } + } + close(fd); + } +out: + if (chdir("../..")) + return 1; + + return res; +} + +int conf_write_autoconf(void) +{ + struct symbol *sym; + const char *str; + char *name; + FILE *out, *out_h; + time_t now; + int i, l; + + sym_clear_all_valid(); + + file_write_dep("include/config/auto.conf.cmd"); + + if (conf_split_config()) + return 1; + + out = fopen(".tmpconfig", "w"); + if (!out) + return 1; + + out_h = fopen(".tmpconfig.h", "w"); + if (!out_h) { + fclose(out); + return 1; + } + + sym = sym_lookup("PROJECTVERSION", 0); + sym_calc_value(sym); + time(&now); + fprintf(out, "#\n" + "# Automatically generated make config: don't edit\n" + "# "PROJECT_NAME" version: %s\n" + "# %s" + "#\n", + sym_get_string_value(sym), ctime(&now)); + fprintf(out_h, "/*\n" + " * Automatically generated C config: don't edit\n" + " * "PROJECT_NAME" version: %s\n" + " * %s" + " */\n" + "#define AUTOCONF_INCLUDED\n", + sym_get_string_value(sym), ctime(&now)); + + for_all_symbols(i, sym) { + sym_calc_value(sym); + if (!(sym->flags & SYMBOL_WRITE) || !sym->name) + continue; + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + switch (sym_get_tristate_value(sym)) { + case no: + break; + case mod: + fprintf(out, "CT_%s=m\n", sym->name); + fprintf(out_h, "#define CT_%s_MODULE 1\n", sym->name); + break; + case yes: + fprintf(out, "CT_%s=y\n", sym->name); + fprintf(out_h, "#define CT_%s 1\n", sym->name); + break; + } + break; + case S_STRING: + str = sym_get_string_value(sym); + fprintf(out, "CT_%s=\"", sym->name); + fprintf(out_h, "#define CT_%s \"", sym->name); + while (1) { + l = strcspn(str, "\"\\"); + if (l) { + fwrite(str, l, 1, out); + fwrite(str, l, 1, out_h); + str += l; + } + if (!*str) + break; + fprintf(out, "\\%c", *str); + fprintf(out_h, "\\%c", *str); + str++; + } + fputs("\"\n", out); + fputs("\"\n", out_h); + break; + case S_HEX: + str = sym_get_string_value(sym); + if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) { + fprintf(out, "CT_%s=%s\n", sym->name, str); + fprintf(out_h, "#define CT_%s 0x%s\n", sym->name, str); + break; + } + case S_INT: + str = sym_get_string_value(sym); + fprintf(out, "CT_%s=%s\n", sym->name, str); + fprintf(out_h, "#define CT_%s %s\n", sym->name, str); + break; + default: + break; + } + } + fclose(out); + fclose(out_h); + + name = getenv("KCONFIG_AUTOHEADER"); + if (!name) + name = "include/linux/autoconf.h"; + if (rename(".tmpconfig.h", name)) + return 1; + name = getenv("KCONFIG_AUTOCONFIG"); + if (!name) + name = "include/config/auto.conf"; + /* + * This must be the last step, kbuild has a dependency on auto.conf + * and this marks the successful completion of the previous steps. + */ + if (rename(".tmpconfig", name)) + return 1; + + return 0; +} diff --git a/kconfig/expr.c b/kconfig/expr.c new file mode 100644 index 00000000..6f98dbfe --- /dev/null +++ b/kconfig/expr.c @@ -0,0 +1,1100 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" + +#define DEBUG_EXPR 0 + +struct expr *expr_alloc_symbol(struct symbol *sym) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = E_SYMBOL; + e->left.sym = sym; + return e; +} + +struct expr *expr_alloc_one(enum expr_type type, struct expr *ce) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = type; + e->left.expr = ce; + return e; +} + +struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = type; + e->left.expr = e1; + e->right.expr = e2; + return e; +} + +struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2) +{ + struct expr *e = malloc(sizeof(*e)); + memset(e, 0, sizeof(*e)); + e->type = type; + e->left.sym = s1; + e->right.sym = s2; + return e; +} + +struct expr *expr_alloc_and(struct expr *e1, struct expr *e2) +{ + if (!e1) + return e2; + return e2 ? expr_alloc_two(E_AND, e1, e2) : e1; +} + +struct expr *expr_alloc_or(struct expr *e1, struct expr *e2) +{ + if (!e1) + return e2; + return e2 ? expr_alloc_two(E_OR, e1, e2) : e1; +} + +struct expr *expr_copy(struct expr *org) +{ + struct expr *e; + + if (!org) + return NULL; + + e = malloc(sizeof(*org)); + memcpy(e, org, sizeof(*org)); + switch (org->type) { + case E_SYMBOL: + e->left = org->left; + break; + case E_NOT: + e->left.expr = expr_copy(org->left.expr); + break; + case E_EQUAL: + case E_UNEQUAL: + e->left.sym = org->left.sym; + e->right.sym = org->right.sym; + break; + case E_AND: + case E_OR: + case E_CHOICE: + e->left.expr = expr_copy(org->left.expr); + e->right.expr = expr_copy(org->right.expr); + break; + default: + printf("can't copy type %d\n", e->type); + free(e); + e = NULL; + break; + } + + return e; +} + +void expr_free(struct expr *e) +{ + if (!e) + return; + + switch (e->type) { + case E_SYMBOL: + break; + case E_NOT: + expr_free(e->left.expr); + return; + case E_EQUAL: + case E_UNEQUAL: + break; + case E_OR: + case E_AND: + expr_free(e->left.expr); + expr_free(e->right.expr); + break; + default: + printf("how to free type %d?\n", e->type); + break; + } + free(e); +} + +static int trans_count; + +#define e1 (*ep1) +#define e2 (*ep2) + +static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct expr **ep2) +{ + if (e1->type == type) { + __expr_eliminate_eq(type, &e1->left.expr, &e2); + __expr_eliminate_eq(type, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + __expr_eliminate_eq(type, &e1, &e2->left.expr); + __expr_eliminate_eq(type, &e1, &e2->right.expr); + return; + } + if (e1->type == E_SYMBOL && e2->type == E_SYMBOL && + e1->left.sym == e2->left.sym && + (e1->left.sym == &symbol_yes || e1->left.sym == &symbol_no)) + return; + if (!expr_eq(e1, e2)) + return; + trans_count++; + expr_free(e1); expr_free(e2); + switch (type) { + case E_OR: + e1 = expr_alloc_symbol(&symbol_no); + e2 = expr_alloc_symbol(&symbol_no); + break; + case E_AND: + e1 = expr_alloc_symbol(&symbol_yes); + e2 = expr_alloc_symbol(&symbol_yes); + break; + default: + ; + } +} + +void expr_eliminate_eq(struct expr **ep1, struct expr **ep2) +{ + if (!e1 || !e2) + return; + switch (e1->type) { + case E_OR: + case E_AND: + __expr_eliminate_eq(e1->type, ep1, ep2); + default: + ; + } + if (e1->type != e2->type) switch (e2->type) { + case E_OR: + case E_AND: + __expr_eliminate_eq(e2->type, ep1, ep2); + default: + ; + } + e1 = expr_eliminate_yn(e1); + e2 = expr_eliminate_yn(e2); +} + +#undef e1 +#undef e2 + +int expr_eq(struct expr *e1, struct expr *e2) +{ + int res, old_count; + + if (e1->type != e2->type) + return 0; + switch (e1->type) { + case E_EQUAL: + case E_UNEQUAL: + return e1->left.sym == e2->left.sym && e1->right.sym == e2->right.sym; + case E_SYMBOL: + return e1->left.sym == e2->left.sym; + case E_NOT: + return expr_eq(e1->left.expr, e2->left.expr); + case E_AND: + case E_OR: + e1 = expr_copy(e1); + e2 = expr_copy(e2); + old_count = trans_count; + expr_eliminate_eq(&e1, &e2); + res = (e1->type == E_SYMBOL && e2->type == E_SYMBOL && + e1->left.sym == e2->left.sym); + expr_free(e1); + expr_free(e2); + trans_count = old_count; + return res; + case E_CHOICE: + case E_RANGE: + case E_NONE: + /* panic */; + } + + if (DEBUG_EXPR) { + expr_fprint(e1, stdout); + printf(" = "); + expr_fprint(e2, stdout); + printf(" ?\n"); + } + + return 0; +} + +struct expr *expr_eliminate_yn(struct expr *e) +{ + struct expr *tmp; + + if (e) switch (e->type) { + case E_AND: + e->left.expr = expr_eliminate_yn(e->left.expr); + e->right.expr = expr_eliminate_yn(e->right.expr); + if (e->left.expr->type == E_SYMBOL) { + if (e->left.expr->left.sym == &symbol_no) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + e->right.expr = NULL; + return e; + } else if (e->left.expr->left.sym == &symbol_yes) { + free(e->left.expr); + tmp = e->right.expr; + *e = *(e->right.expr); + free(tmp); + return e; + } + } + if (e->right.expr->type == E_SYMBOL) { + if (e->right.expr->left.sym == &symbol_no) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + e->right.expr = NULL; + return e; + } else if (e->right.expr->left.sym == &symbol_yes) { + free(e->right.expr); + tmp = e->left.expr; + *e = *(e->left.expr); + free(tmp); + return e; + } + } + break; + case E_OR: + e->left.expr = expr_eliminate_yn(e->left.expr); + e->right.expr = expr_eliminate_yn(e->right.expr); + if (e->left.expr->type == E_SYMBOL) { + if (e->left.expr->left.sym == &symbol_no) { + free(e->left.expr); + tmp = e->right.expr; + *e = *(e->right.expr); + free(tmp); + return e; + } else if (e->left.expr->left.sym == &symbol_yes) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + e->right.expr = NULL; + return e; + } + } + if (e->right.expr->type == E_SYMBOL) { + if (e->right.expr->left.sym == &symbol_no) { + free(e->right.expr); + tmp = e->left.expr; + *e = *(e->left.expr); + free(tmp); + return e; + } else if (e->right.expr->left.sym == &symbol_yes) { + expr_free(e->left.expr); + expr_free(e->right.expr); + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + e->right.expr = NULL; + return e; + } + } + break; + default: + ; + } + return e; +} + +/* + * bool FOO!=n => FOO + */ +struct expr *expr_trans_bool(struct expr *e) +{ + if (!e) + return NULL; + switch (e->type) { + case E_AND: + case E_OR: + case E_NOT: + e->left.expr = expr_trans_bool(e->left.expr); + e->right.expr = expr_trans_bool(e->right.expr); + break; + case E_UNEQUAL: + // FOO!=n -> FOO + if (e->left.sym->type == S_TRISTATE) { + if (e->right.sym == &symbol_no) { + e->type = E_SYMBOL; + e->right.sym = NULL; + } + } + break; + default: + ; + } + return e; +} + +/* + * e1 || e2 -> ? + */ +struct expr *expr_join_or(struct expr *e1, struct expr *e2) +{ + struct expr *tmp; + struct symbol *sym1, *sym2; + + if (expr_eq(e1, e2)) + return expr_copy(e1); + if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) + return NULL; + if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) + return NULL; + if (e1->type == E_NOT) { + tmp = e1->left.expr; + if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) + return NULL; + sym1 = tmp->left.sym; + } else + sym1 = e1->left.sym; + if (e2->type == E_NOT) { + if (e2->left.expr->type != E_SYMBOL) + return NULL; + sym2 = e2->left.expr->left.sym; + } else + sym2 = e2->left.sym; + if (sym1 != sym2) + return NULL; + if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) + return NULL; + if (sym1->type == S_TRISTATE) { + if (e1->type == E_EQUAL && e2->type == E_EQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || + (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) { + // (a='y') || (a='m') -> (a!='n') + return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_no); + } + if (e1->type == E_EQUAL && e2->type == E_EQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) { + // (a='y') || (a='n') -> (a!='m') + return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_mod); + } + if (e1->type == E_EQUAL && e2->type == E_EQUAL && + ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) { + // (a='m') || (a='n') -> (a!='y') + return expr_alloc_comp(E_UNEQUAL, sym1, &symbol_yes); + } + } + if (sym1->type == S_BOOLEAN && sym1 == sym2) { + if ((e1->type == E_NOT && e1->left.expr->type == E_SYMBOL && e2->type == E_SYMBOL) || + (e2->type == E_NOT && e2->left.expr->type == E_SYMBOL && e1->type == E_SYMBOL)) + return expr_alloc_symbol(&symbol_yes); + } + + if (DEBUG_EXPR) { + printf("optimize ("); + expr_fprint(e1, stdout); + printf(") || ("); + expr_fprint(e2, stdout); + printf(")?\n"); + } + return NULL; +} + +struct expr *expr_join_and(struct expr *e1, struct expr *e2) +{ + struct expr *tmp; + struct symbol *sym1, *sym2; + + if (expr_eq(e1, e2)) + return expr_copy(e1); + if (e1->type != E_EQUAL && e1->type != E_UNEQUAL && e1->type != E_SYMBOL && e1->type != E_NOT) + return NULL; + if (e2->type != E_EQUAL && e2->type != E_UNEQUAL && e2->type != E_SYMBOL && e2->type != E_NOT) + return NULL; + if (e1->type == E_NOT) { + tmp = e1->left.expr; + if (tmp->type != E_EQUAL && tmp->type != E_UNEQUAL && tmp->type != E_SYMBOL) + return NULL; + sym1 = tmp->left.sym; + } else + sym1 = e1->left.sym; + if (e2->type == E_NOT) { + if (e2->left.expr->type != E_SYMBOL) + return NULL; + sym2 = e2->left.expr->left.sym; + } else + sym2 = e2->left.sym; + if (sym1 != sym2) + return NULL; + if (sym1->type != S_BOOLEAN && sym1->type != S_TRISTATE) + return NULL; + + if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_yes) || + (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_yes)) + // (a) && (a='y') -> (a='y') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); + + if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_no) || + (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_no)) + // (a) && (a!='n') -> (a) + return expr_alloc_symbol(sym1); + + if ((e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_mod) || + (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_mod)) + // (a) && (a!='m') -> (a='y') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); + + if (sym1->type == S_TRISTATE) { + if (e1->type == E_EQUAL && e2->type == E_UNEQUAL) { + // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' + sym2 = e1->right.sym; + if ((e2->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) + return sym2 != e2->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) + : expr_alloc_symbol(&symbol_no); + } + if (e1->type == E_UNEQUAL && e2->type == E_EQUAL) { + // (a='b') && (a!='c') -> 'b'='c' ? 'n' : a='b' + sym2 = e2->right.sym; + if ((e1->right.sym->flags & SYMBOL_CONST) && (sym2->flags & SYMBOL_CONST)) + return sym2 != e1->right.sym ? expr_alloc_comp(E_EQUAL, sym1, sym2) + : expr_alloc_symbol(&symbol_no); + } + if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_yes))) + // (a!='y') && (a!='n') -> (a='m') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_mod); + + if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && + ((e1->right.sym == &symbol_yes && e2->right.sym == &symbol_mod) || + (e1->right.sym == &symbol_mod && e2->right.sym == &symbol_yes))) + // (a!='y') && (a!='m') -> (a='n') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_no); + + if (e1->type == E_UNEQUAL && e2->type == E_UNEQUAL && + ((e1->right.sym == &symbol_mod && e2->right.sym == &symbol_no) || + (e1->right.sym == &symbol_no && e2->right.sym == &symbol_mod))) + // (a!='m') && (a!='n') -> (a='m') + return expr_alloc_comp(E_EQUAL, sym1, &symbol_yes); + + if ((e1->type == E_SYMBOL && e2->type == E_EQUAL && e2->right.sym == &symbol_mod) || + (e2->type == E_SYMBOL && e1->type == E_EQUAL && e1->right.sym == &symbol_mod) || + (e1->type == E_SYMBOL && e2->type == E_UNEQUAL && e2->right.sym == &symbol_yes) || + (e2->type == E_SYMBOL && e1->type == E_UNEQUAL && e1->right.sym == &symbol_yes)) + return NULL; + } + + if (DEBUG_EXPR) { + printf("optimize ("); + expr_fprint(e1, stdout); + printf(") && ("); + expr_fprint(e2, stdout); + printf(")?\n"); + } + return NULL; +} + +static void expr_eliminate_dups1(enum expr_type type, struct expr **ep1, struct expr **ep2) +{ +#define e1 (*ep1) +#define e2 (*ep2) + struct expr *tmp; + + if (e1->type == type) { + expr_eliminate_dups1(type, &e1->left.expr, &e2); + expr_eliminate_dups1(type, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + expr_eliminate_dups1(type, &e1, &e2->left.expr); + expr_eliminate_dups1(type, &e1, &e2->right.expr); + return; + } + if (e1 == e2) + return; + + switch (e1->type) { + case E_OR: case E_AND: + expr_eliminate_dups1(e1->type, &e1, &e1); + default: + ; + } + + switch (type) { + case E_OR: + tmp = expr_join_or(e1, e2); + if (tmp) { + expr_free(e1); expr_free(e2); + e1 = expr_alloc_symbol(&symbol_no); + e2 = tmp; + trans_count++; + } + break; + case E_AND: + tmp = expr_join_and(e1, e2); + if (tmp) { + expr_free(e1); expr_free(e2); + e1 = expr_alloc_symbol(&symbol_yes); + e2 = tmp; + trans_count++; + } + break; + default: + ; + } +#undef e1 +#undef e2 +} + +static void expr_eliminate_dups2(enum expr_type type, struct expr **ep1, struct expr **ep2) +{ +#define e1 (*ep1) +#define e2 (*ep2) + struct expr *tmp, *tmp1, *tmp2; + + if (e1->type == type) { + expr_eliminate_dups2(type, &e1->left.expr, &e2); + expr_eliminate_dups2(type, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + expr_eliminate_dups2(type, &e1, &e2->left.expr); + expr_eliminate_dups2(type, &e1, &e2->right.expr); + } + if (e1 == e2) + return; + + switch (e1->type) { + case E_OR: + expr_eliminate_dups2(e1->type, &e1, &e1); + // (FOO || BAR) && (!FOO && !BAR) -> n + tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1))); + tmp2 = expr_copy(e2); + tmp = expr_extract_eq_and(&tmp1, &tmp2); + if (expr_is_yes(tmp1)) { + expr_free(e1); + e1 = expr_alloc_symbol(&symbol_no); + trans_count++; + } + expr_free(tmp2); + expr_free(tmp1); + expr_free(tmp); + break; + case E_AND: + expr_eliminate_dups2(e1->type, &e1, &e1); + // (FOO && BAR) || (!FOO || !BAR) -> y + tmp1 = expr_transform(expr_alloc_one(E_NOT, expr_copy(e1))); + tmp2 = expr_copy(e2); + tmp = expr_extract_eq_or(&tmp1, &tmp2); + if (expr_is_no(tmp1)) { + expr_free(e1); + e1 = expr_alloc_symbol(&symbol_yes); + trans_count++; + } + expr_free(tmp2); + expr_free(tmp1); + expr_free(tmp); + break; + default: + ; + } +#undef e1 +#undef e2 +} + +struct expr *expr_eliminate_dups(struct expr *e) +{ + int oldcount; + if (!e) + return e; + + oldcount = trans_count; + while (1) { + trans_count = 0; + switch (e->type) { + case E_OR: case E_AND: + expr_eliminate_dups1(e->type, &e, &e); + expr_eliminate_dups2(e->type, &e, &e); + default: + ; + } + if (!trans_count) + break; + e = expr_eliminate_yn(e); + } + trans_count = oldcount; + return e; +} + +struct expr *expr_transform(struct expr *e) +{ + struct expr *tmp; + + if (!e) + return NULL; + switch (e->type) { + case E_EQUAL: + case E_UNEQUAL: + case E_SYMBOL: + case E_CHOICE: + break; + default: + e->left.expr = expr_transform(e->left.expr); + e->right.expr = expr_transform(e->right.expr); + } + + switch (e->type) { + case E_EQUAL: + if (e->left.sym->type != S_BOOLEAN) + break; + if (e->right.sym == &symbol_no) { + e->type = E_NOT; + e->left.expr = expr_alloc_symbol(e->left.sym); + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_mod) { + printf("boolean symbol %s tested for 'm'? test forced to 'n'\n", e->left.sym->name); + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_yes) { + e->type = E_SYMBOL; + e->right.sym = NULL; + break; + } + break; + case E_UNEQUAL: + if (e->left.sym->type != S_BOOLEAN) + break; + if (e->right.sym == &symbol_no) { + e->type = E_SYMBOL; + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_mod) { + printf("boolean symbol %s tested for 'm'? test forced to 'y'\n", e->left.sym->name); + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + e->right.sym = NULL; + break; + } + if (e->right.sym == &symbol_yes) { + e->type = E_NOT; + e->left.expr = expr_alloc_symbol(e->left.sym); + e->right.sym = NULL; + break; + } + break; + case E_NOT: + switch (e->left.expr->type) { + case E_NOT: + // !!a -> a + tmp = e->left.expr->left.expr; + free(e->left.expr); + free(e); + e = tmp; + e = expr_transform(e); + break; + case E_EQUAL: + case E_UNEQUAL: + // !a='x' -> a!='x' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = e->type == E_EQUAL ? E_UNEQUAL : E_EQUAL; + break; + case E_OR: + // !(a || b) -> !a && !b + tmp = e->left.expr; + e->type = E_AND; + e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); + tmp->type = E_NOT; + tmp->right.expr = NULL; + e = expr_transform(e); + break; + case E_AND: + // !(a && b) -> !a || !b + tmp = e->left.expr; + e->type = E_OR; + e->right.expr = expr_alloc_one(E_NOT, tmp->right.expr); + tmp->type = E_NOT; + tmp->right.expr = NULL; + e = expr_transform(e); + break; + case E_SYMBOL: + if (e->left.expr->left.sym == &symbol_yes) { + // !'y' -> 'n' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = E_SYMBOL; + e->left.sym = &symbol_no; + break; + } + if (e->left.expr->left.sym == &symbol_mod) { + // !'m' -> 'm' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = E_SYMBOL; + e->left.sym = &symbol_mod; + break; + } + if (e->left.expr->left.sym == &symbol_no) { + // !'n' -> 'y' + tmp = e->left.expr; + free(e); + e = tmp; + e->type = E_SYMBOL; + e->left.sym = &symbol_yes; + break; + } + break; + default: + ; + } + break; + default: + ; + } + return e; +} + +int expr_contains_symbol(struct expr *dep, struct symbol *sym) +{ + if (!dep) + return 0; + + switch (dep->type) { + case E_AND: + case E_OR: + return expr_contains_symbol(dep->left.expr, sym) || + expr_contains_symbol(dep->right.expr, sym); + case E_SYMBOL: + return dep->left.sym == sym; + case E_EQUAL: + case E_UNEQUAL: + return dep->left.sym == sym || + dep->right.sym == sym; + case E_NOT: + return expr_contains_symbol(dep->left.expr, sym); + default: + ; + } + return 0; +} + +bool expr_depends_symbol(struct expr *dep, struct symbol *sym) +{ + if (!dep) + return false; + + switch (dep->type) { + case E_AND: + return expr_depends_symbol(dep->left.expr, sym) || + expr_depends_symbol(dep->right.expr, sym); + case E_SYMBOL: + return dep->left.sym == sym; + case E_EQUAL: + if (dep->left.sym == sym) { + if (dep->right.sym == &symbol_yes || dep->right.sym == &symbol_mod) + return true; + } + break; + case E_UNEQUAL: + if (dep->left.sym == sym) { + if (dep->right.sym == &symbol_no) + return true; + } + break; + default: + ; + } + return false; +} + +struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2) +{ + struct expr *tmp = NULL; + expr_extract_eq(E_AND, &tmp, ep1, ep2); + if (tmp) { + *ep1 = expr_eliminate_yn(*ep1); + *ep2 = expr_eliminate_yn(*ep2); + } + return tmp; +} + +struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2) +{ + struct expr *tmp = NULL; + expr_extract_eq(E_OR, &tmp, ep1, ep2); + if (tmp) { + *ep1 = expr_eliminate_yn(*ep1); + *ep2 = expr_eliminate_yn(*ep2); + } + return tmp; +} + +void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2) +{ +#define e1 (*ep1) +#define e2 (*ep2) + if (e1->type == type) { + expr_extract_eq(type, ep, &e1->left.expr, &e2); + expr_extract_eq(type, ep, &e1->right.expr, &e2); + return; + } + if (e2->type == type) { + expr_extract_eq(type, ep, ep1, &e2->left.expr); + expr_extract_eq(type, ep, ep1, &e2->right.expr); + return; + } + if (expr_eq(e1, e2)) { + *ep = *ep ? expr_alloc_two(type, *ep, e1) : e1; + expr_free(e2); + if (type == E_AND) { + e1 = expr_alloc_symbol(&symbol_yes); + e2 = expr_alloc_symbol(&symbol_yes); + } else if (type == E_OR) { + e1 = expr_alloc_symbol(&symbol_no); + e2 = expr_alloc_symbol(&symbol_no); + } + } +#undef e1 +#undef e2 +} + +struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym) +{ + struct expr *e1, *e2; + + if (!e) { + e = expr_alloc_symbol(sym); + if (type == E_UNEQUAL) + e = expr_alloc_one(E_NOT, e); + return e; + } + switch (e->type) { + case E_AND: + e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); + e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); + if (sym == &symbol_yes) + e = expr_alloc_two(E_AND, e1, e2); + if (sym == &symbol_no) + e = expr_alloc_two(E_OR, e1, e2); + if (type == E_UNEQUAL) + e = expr_alloc_one(E_NOT, e); + return e; + case E_OR: + e1 = expr_trans_compare(e->left.expr, E_EQUAL, sym); + e2 = expr_trans_compare(e->right.expr, E_EQUAL, sym); + if (sym == &symbol_yes) + e = expr_alloc_two(E_OR, e1, e2); + if (sym == &symbol_no) + e = expr_alloc_two(E_AND, e1, e2); + if (type == E_UNEQUAL) + e = expr_alloc_one(E_NOT, e); + return e; + case E_NOT: + return expr_trans_compare(e->left.expr, type == E_EQUAL ? E_UNEQUAL : E_EQUAL, sym); + case E_UNEQUAL: + case E_EQUAL: + if (type == E_EQUAL) { + if (sym == &symbol_yes) + return expr_copy(e); + if (sym == &symbol_mod) + return expr_alloc_symbol(&symbol_no); + if (sym == &symbol_no) + return expr_alloc_one(E_NOT, expr_copy(e)); + } else { + if (sym == &symbol_yes) + return expr_alloc_one(E_NOT, expr_copy(e)); + if (sym == &symbol_mod) + return expr_alloc_symbol(&symbol_yes); + if (sym == &symbol_no) + return expr_copy(e); + } + break; + case E_SYMBOL: + return expr_alloc_comp(type, e->left.sym, sym); + case E_CHOICE: + case E_RANGE: + case E_NONE: + /* panic */; + } + return NULL; +} + +tristate expr_calc_value(struct expr *e) +{ + tristate val1, val2; + const char *str1, *str2; + + if (!e) + return yes; + + switch (e->type) { + case E_SYMBOL: + sym_calc_value(e->left.sym); + return e->left.sym->curr.tri; + case E_AND: + val1 = expr_calc_value(e->left.expr); + val2 = expr_calc_value(e->right.expr); + return E_AND(val1, val2); + case E_OR: + val1 = expr_calc_value(e->left.expr); + val2 = expr_calc_value(e->right.expr); + return E_OR(val1, val2); + case E_NOT: + val1 = expr_calc_value(e->left.expr); + return E_NOT(val1); + case E_EQUAL: + sym_calc_value(e->left.sym); + sym_calc_value(e->right.sym); + str1 = sym_get_string_value(e->left.sym); + str2 = sym_get_string_value(e->right.sym); + return !strcmp(str1, str2) ? yes : no; + case E_UNEQUAL: + sym_calc_value(e->left.sym); + sym_calc_value(e->right.sym); + str1 = sym_get_string_value(e->left.sym); + str2 = sym_get_string_value(e->right.sym); + return !strcmp(str1, str2) ? no : yes; + default: + printf("expr_calc_value: %d?\n", e->type); + return no; + } +} + +int expr_compare_type(enum expr_type t1, enum expr_type t2) +{ +#if 0 + return 1; +#else + if (t1 == t2) + return 0; + switch (t1) { + case E_EQUAL: + case E_UNEQUAL: + if (t2 == E_NOT) + return 1; + case E_NOT: + if (t2 == E_AND) + return 1; + case E_AND: + if (t2 == E_OR) + return 1; + case E_OR: + if (t2 == E_CHOICE) + return 1; + case E_CHOICE: + if (t2 == 0) + return 1; + default: + return -1; + } + printf("[%dgt%d?]", t1, t2); + return 0; +#endif +} + +void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken) +{ + if (!e) { + fn(data, NULL, "y"); + return; + } + + if (expr_compare_type(prevtoken, e->type) > 0) + fn(data, NULL, "("); + switch (e->type) { + case E_SYMBOL: + if (e->left.sym->name) + fn(data, e->left.sym, e->left.sym->name); + else + fn(data, NULL, "<choice>"); + break; + case E_NOT: + fn(data, NULL, "!"); + expr_print(e->left.expr, fn, data, E_NOT); + break; + case E_EQUAL: + fn(data, e->left.sym, e->left.sym->name); + fn(data, NULL, "="); + fn(data, e->right.sym, e->right.sym->name); + break; + case E_UNEQUAL: + fn(data, e->left.sym, e->left.sym->name); + fn(data, NULL, "!="); + fn(data, e->right.sym, e->right.sym->name); + break; + case E_OR: + expr_print(e->left.expr, fn, data, E_OR); + fn(data, NULL, " || "); + expr_print(e->right.expr, fn, data, E_OR); + break; + case E_AND: + expr_print(e->left.expr, fn, data, E_AND); + fn(data, NULL, " && "); + expr_print(e->right.expr, fn, data, E_AND); + break; + case E_CHOICE: + fn(data, e->right.sym, e->right.sym->name); + if (e->left.expr) { + fn(data, NULL, " ^ "); + expr_print(e->left.expr, fn, data, E_CHOICE); + } + break; + case E_RANGE: + fn(data, NULL, "["); + fn(data, e->left.sym, e->left.sym->name); + fn(data, NULL, " "); + fn(data, e->right.sym, e->right.sym->name); + fn(data, NULL, "]"); + break; + default: + { + char buf[32]; + sprintf(buf, "<unknown type %d>", e->type); + fn(data, NULL, buf); + break; + } + } + if (expr_compare_type(prevtoken, e->type) > 0) + fn(data, NULL, ")"); +} + +static void expr_print_file_helper(void *data, struct symbol *sym, const char *str) +{ + fwrite(str, strlen(str), 1, data); +} + +void expr_fprint(struct expr *e, FILE *out) +{ + expr_print(e, expr_print_file_helper, out, E_NONE); +} + +static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str) +{ + str_append((struct gstr*)data, str); +} + +void expr_gstr_print(struct expr *e, struct gstr *gs) +{ + expr_print(e, expr_print_gstr_helper, gs, E_NONE); +} diff --git a/kconfig/expr.h b/kconfig/expr.h new file mode 100644 index 00000000..6084525f --- /dev/null +++ b/kconfig/expr.h @@ -0,0 +1,202 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#ifndef EXPR_H +#define EXPR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdio.h> +#ifndef __cplusplus +#include <stdbool.h> +#endif + +struct file { + struct file *next; + struct file *parent; + char *name; + int lineno; + int flags; +}; + +#define FILE_BUSY 0x0001 +#define FILE_SCANNED 0x0002 +#define FILE_PRINTED 0x0004 + +typedef enum tristate { + no, mod, yes +} tristate; + +enum expr_type { + E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE +}; + +union expr_data { + struct expr *expr; + struct symbol *sym; +}; + +struct expr { + enum expr_type type; + union expr_data left, right; +}; + +#define E_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2)) +#define E_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2)) +#define E_NOT(dep) (2-(dep)) + +struct expr_value { + struct expr *expr; + tristate tri; +}; + +struct symbol_value { + void *val; + tristate tri; +}; + +enum symbol_type { + S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER +}; + +enum { + S_DEF_USER, /* main user value */ + S_DEF_AUTO, +}; + +struct symbol { + struct symbol *next; + char *name; + char *help; + enum symbol_type type; + struct symbol_value curr; + struct symbol_value def[4]; + tristate visible; + int flags; + struct property *prop; + struct expr *dep, *dep2; + struct expr_value rev_dep; +}; + +#define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER) + +#define SYMBOL_CONST 0x0001 +#define SYMBOL_CHECK 0x0008 +#define SYMBOL_CHOICE 0x0010 +#define SYMBOL_CHOICEVAL 0x0020 +#define SYMBOL_PRINTED 0x0040 +#define SYMBOL_VALID 0x0080 +#define SYMBOL_OPTIONAL 0x0100 +#define SYMBOL_WRITE 0x0200 +#define SYMBOL_CHANGED 0x0400 +#define SYMBOL_AUTO 0x1000 +#define SYMBOL_CHECKED 0x2000 +#define SYMBOL_WARNED 0x8000 +#define SYMBOL_DEF 0x10000 +#define SYMBOL_DEF_USER 0x10000 +#define SYMBOL_DEF_AUTO 0x20000 +#define SYMBOL_DEF3 0x40000 +#define SYMBOL_DEF4 0x80000 + +#define SYMBOL_MAXLENGTH 256 +#define SYMBOL_HASHSIZE 257 +#define SYMBOL_HASHMASK 0xff + +enum prop_type { + P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE +}; + +struct property { + struct property *next; + struct symbol *sym; + enum prop_type type; + const char *text; + struct expr_value visible; + struct expr *expr; + struct menu *menu; + struct file *file; + int lineno; +}; + +#define for_all_properties(sym, st, tok) \ + for (st = sym->prop; st; st = st->next) \ + if (st->type == (tok)) +#define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT) +#define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE) +#define for_all_prompts(sym, st) \ + for (st = sym->prop; st; st = st->next) \ + if (st->text) + +struct menu { + struct menu *next; + struct menu *parent; + struct menu *list; + struct symbol *sym; + struct property *prompt; + struct expr *dep; + unsigned int flags; + //char *help; + struct file *file; + int lineno; + void *data; +}; + +#define MENU_CHANGED 0x0001 +#define MENU_ROOT 0x0002 + +#ifndef SWIG + +extern struct file *file_list; +extern struct file *current_file; +struct file *lookup_file(const char *name); + +extern struct symbol symbol_yes, symbol_no, symbol_mod; +extern struct symbol *modules_sym; +extern struct symbol *sym_defconfig_list; +extern int cdebug; +struct expr *expr_alloc_symbol(struct symbol *sym); +struct expr *expr_alloc_one(enum expr_type type, struct expr *ce); +struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2); +struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2); +struct expr *expr_alloc_and(struct expr *e1, struct expr *e2); +struct expr *expr_alloc_or(struct expr *e1, struct expr *e2); +struct expr *expr_copy(struct expr *org); +void expr_free(struct expr *e); +int expr_eq(struct expr *e1, struct expr *e2); +void expr_eliminate_eq(struct expr **ep1, struct expr **ep2); +tristate expr_calc_value(struct expr *e); +struct expr *expr_eliminate_yn(struct expr *e); +struct expr *expr_trans_bool(struct expr *e); +struct expr *expr_eliminate_dups(struct expr *e); +struct expr *expr_transform(struct expr *e); +int expr_contains_symbol(struct expr *dep, struct symbol *sym); +bool expr_depends_symbol(struct expr *dep, struct symbol *sym); +struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2); +struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2); +void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2); +struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym); + +void expr_fprint(struct expr *e, FILE *out); +struct gstr; /* forward */ +void expr_gstr_print(struct expr *e, struct gstr *gs); + +static inline int expr_is_yes(struct expr *e) +{ + return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes); +} + +static inline int expr_is_no(struct expr *e) +{ + return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no); +} +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* EXPR_H */ diff --git a/kconfig/lex.zconf.c_shipped b/kconfig/lex.zconf.c_shipped new file mode 100644 index 00000000..800f8c71 --- /dev/null +++ b/kconfig/lex.zconf.c_shipped @@ -0,0 +1,2350 @@ + +#line 3 "scripts/kconfig/lex.zconf.c" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 33 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <stdlib.h> + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */ + +#if __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include <inttypes.h> +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; +#endif /* ! C99 */ + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE zconfrestart(zconfin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +extern int zconfleng; + +extern FILE *zconfin, *zconfout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + #define YY_LESS_LINENO(n) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up zconftext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up zconftext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef unsigned int yy_size_t; +#endif + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via zconfrestart()), so that the user can continue scanning by + * just pointing zconfin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when zconftext is formed. */ +static char yy_hold_char; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int zconfleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow zconfwrap()'s to do buffer switches + * instead of setting up a fresh zconfin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void zconfrestart (FILE *input_file ); +void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE zconf_create_buffer (FILE *file,int size ); +void zconf_delete_buffer (YY_BUFFER_STATE b ); +void zconf_flush_buffer (YY_BUFFER_STATE b ); +void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer ); +void zconfpop_buffer_state (void ); + +static void zconfensure_buffer_stack (void ); +static void zconf_load_buffer_state (void ); +static void zconf_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER zconf_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE zconf_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE zconf_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE zconf_scan_bytes (yyconst char *bytes,int len ); + +void *zconfalloc (yy_size_t ); +void *zconfrealloc (void *,yy_size_t ); +void zconffree (void * ); + +#define yy_new_buffer zconf_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + zconfensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + zconf_create_buffer(zconfin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + zconfensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + zconf_create_buffer(zconfin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +#define zconfwrap() 1 +#define YY_SKIP_YYWRAP + +typedef unsigned char YY_CHAR; + +FILE *zconfin = (FILE *) 0, *zconfout = (FILE *) 0; + +typedef int yy_state_type; + +extern int zconflineno; + +int zconflineno = 1; + +extern char *zconftext; +#define yytext_ptr zconftext +static yyconst flex_int16_t yy_nxt[][17] = + { + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0 + }, + + { + 11, 12, 13, 14, 12, 12, 15, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12 + }, + + { + 11, 12, 13, 14, 12, 12, 15, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12 + }, + + { + 11, 16, 16, 17, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 18, 16, 16, 16 + }, + + { + 11, 16, 16, 17, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 18, 16, 16, 16 + + }, + + { + 11, 19, 20, 21, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19 + }, + + { + 11, 19, 20, 21, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19 + }, + + { + 11, 22, 22, 23, 22, 24, 22, 22, 24, 22, + 22, 22, 22, 22, 22, 25, 22 + }, + + { + 11, 22, 22, 23, 22, 24, 22, 22, 24, 22, + 22, 22, 22, 22, 22, 25, 22 + }, + + { + 11, 26, 26, 27, 28, 29, 30, 31, 29, 32, + 33, 34, 35, 35, 36, 37, 38 + + }, + + { + 11, 26, 26, 27, 28, 29, 30, 31, 29, 32, + 33, 34, 35, 35, 36, 37, 38 + }, + + { + -11, -11, -11, -11, -11, -11, -11, -11, -11, -11, + -11, -11, -11, -11, -11, -11, -11 + }, + + { + 11, -12, -12, -12, -12, -12, -12, -12, -12, -12, + -12, -12, -12, -12, -12, -12, -12 + }, + + { + 11, -13, 39, 40, -13, -13, 41, -13, -13, -13, + -13, -13, -13, -13, -13, -13, -13 + }, + + { + 11, -14, -14, -14, -14, -14, -14, -14, -14, -14, + -14, -14, -14, -14, -14, -14, -14 + + }, + + { + 11, 42, 42, 43, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42 + }, + + { + 11, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, -16, -16, -16, -16 + }, + + { + 11, -17, -17, -17, -17, -17, -17, -17, -17, -17, + -17, -17, -17, -17, -17, -17, -17 + }, + + { + 11, -18, -18, -18, -18, -18, -18, -18, -18, -18, + -18, -18, -18, 44, -18, -18, -18 + }, + + { + 11, 45, 45, -19, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45 + + }, + + { + 11, -20, 46, 47, -20, -20, -20, -20, -20, -20, + -20, -20, -20, -20, -20, -20, -20 + }, + + { + 11, 48, -21, -21, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48 + }, + + { + 11, 49, 49, 50, 49, -22, 49, 49, -22, 49, + 49, 49, 49, 49, 49, -22, 49 + }, + + { + 11, -23, -23, -23, -23, -23, -23, -23, -23, -23, + -23, -23, -23, -23, -23, -23, -23 + }, + + { + 11, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, -24, -24, -24, -24 + + }, + + { + 11, 51, 51, 52, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51 + }, + + { + 11, -26, -26, -26, -26, -26, -26, -26, -26, -26, + -26, -26, -26, -26, -26, -26, -26 + }, + + { + 11, -27, -27, -27, -27, -27, -27, -27, -27, -27, + -27, -27, -27, -27, -27, -27, -27 + }, + + { + 11, -28, -28, -28, -28, -28, -28, -28, -28, -28, + -28, -28, -28, -28, 53, -28, -28 + }, + + { + 11, -29, -29, -29, -29, -29, -29, -29, -29, -29, + -29, -29, -29, -29, -29, -29, -29 + + }, + + { + 11, 54, 54, -30, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54 + }, + + { + 11, -31, -31, -31, -31, -31, -31, 55, -31, -31, + -31, -31, -31, -31, -31, -31, -31 + }, + + { + 11, -32, -32, -32, -32, -32, -32, -32, -32, -32, + -32, -32, -32, -32, -32, -32, -32 + }, + + { + 11, -33, -33, -33, -33, -33, -33, -33, -33, -33, + -33, -33, -33, -33, -33, -33, -33 + }, + + { + 11, -34, -34, -34, -34, -34, -34, -34, -34, -34, + -34, 56, 57, 57, -34, -34, -34 + + }, + + { + 11, -35, -35, -35, -35, -35, -35, -35, -35, -35, + -35, 57, 57, 57, -35, -35, -35 + }, + + { + 11, -36, -36, -36, -36, -36, -36, -36, -36, -36, + -36, -36, -36, -36, -36, -36, -36 + }, + + { + 11, -37, -37, 58, -37, -37, -37, -37, -37, -37, + -37, -37, -37, -37, -37, -37, -37 + }, + + { + 11, -38, -38, -38, -38, -38, -38, -38, -38, -38, + -38, -38, -38, -38, -38, -38, 59 + }, + + { + 11, -39, 39, 40, -39, -39, 41, -39, -39, -39, + -39, -39, -39, -39, -39, -39, -39 + + }, + + { + 11, -40, -40, -40, -40, -40, -40, -40, -40, -40, + -40, -40, -40, -40, -40, -40, -40 + }, + + { + 11, 42, 42, 43, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42 + }, + + { + 11, 42, 42, 43, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42 + }, + + { + 11, -43, -43, -43, -43, -43, -43, -43, -43, -43, + -43, -43, -43, -43, -43, -43, -43 + }, + + { + 11, -44, -44, -44, -44, -44, -44, -44, -44, -44, + -44, -44, -44, 44, -44, -44, -44 + + }, + + { + 11, 45, 45, -45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45 + }, + + { + 11, -46, 46, 47, -46, -46, -46, -46, -46, -46, + -46, -46, -46, -46, -46, -46, -46 + }, + + { + 11, 48, -47, -47, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48 + }, + + { + 11, -48, -48, -48, -48, -48, -48, -48, -48, -48, + -48, -48, -48, -48, -48, -48, -48 + }, + + { + 11, 49, 49, 50, 49, -49, 49, 49, -49, 49, + 49, 49, 49, 49, 49, -49, 49 + + }, + + { + 11, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50 + }, + + { + 11, -51, -51, 52, -51, -51, -51, -51, -51, -51, + -51, -51, -51, -51, -51, -51, -51 + }, + + { + 11, -52, -52, -52, -52, -52, -52, -52, -52, -52, + -52, -52, -52, -52, -52, -52, -52 + }, + + { + 11, -53, -53, -53, -53, -53, -53, -53, -53, -53, + -53, -53, -53, -53, -53, -53, -53 + }, + + { + 11, 54, 54, -54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54 + + }, + + { + 11, -55, -55, -55, -55, -55, -55, -55, -55, -55, + -55, -55, -55, -55, -55, -55, -55 + }, + + { + 11, -56, -56, -56, -56, -56, -56, -56, -56, -56, + -56, 60, 57, 57, -56, -56, -56 + }, + + { + 11, -57, -57, -57, -57, -57, -57, -57, -57, -57, + -57, 57, 57, 57, -57, -57, -57 + }, + + { + 11, -58, -58, -58, -58, -58, -58, -58, -58, -58, + -58, -58, -58, -58, -58, -58, -58 + }, + + { + 11, -59, -59, -59, -59, -59, -59, -59, -59, -59, + -59, -59, -59, -59, -59, -59, -59 + + }, + + { + 11, -60, -60, -60, -60, -60, -60, -60, -60, -60, + -60, 57, 57, 57, -60, -60, -60 + }, + + } ; + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up zconftext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + zconfleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 33 +#define YY_END_OF_BUFFER 34 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[61] = + { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 34, 5, 4, 2, 3, 7, 8, 6, 32, 29, + 31, 24, 28, 27, 26, 22, 17, 13, 16, 20, + 22, 11, 12, 19, 19, 14, 22, 22, 4, 2, + 3, 3, 1, 6, 32, 29, 31, 30, 24, 23, + 26, 25, 15, 20, 9, 19, 19, 21, 10, 18 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 4, 5, 6, 1, 1, 7, 8, 9, + 10, 1, 1, 1, 11, 12, 12, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, + 14, 1, 1, 1, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 1, 15, 1, 1, 13, 1, 13, 13, 13, 13, + + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 1, 16, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +extern int zconf_flex_debug; +int zconf_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *zconftext; + +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <limits.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" + +#define START_STRSIZE 16 + +static struct { + struct file *file; + int lineno; +} current_pos; + +static char *text; +static int text_size, text_asize; + +struct buffer { + struct buffer *parent; + YY_BUFFER_STATE state; +}; + +struct buffer *current_buf; + +static int last_ts, first_ts; + +static void zconf_endhelp(void); +static void zconf_endfile(void); + +void new_string(void) +{ + text = malloc(START_STRSIZE); + text_asize = START_STRSIZE; + text_size = 0; + *text = 0; +} + +void append_string(const char *str, int size) +{ + int new_size = text_size + size + 1; + if (new_size > text_asize) { + new_size += START_STRSIZE - 1; + new_size &= -START_STRSIZE; + text = realloc(text, new_size); + text_asize = new_size; + } + memcpy(text + text_size, str, size); + text_size += size; + text[text_size] = 0; +} + +void alloc_string(const char *str, int size) +{ + text = malloc(size + 1); + memcpy(text, str, size); + text[size] = 0; +} + +#define INITIAL 0 +#define COMMAND 1 +#define HELP 2 +#define STRING 3 +#define PARAM 4 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include <unistd.h> +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals (void ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int zconfwrap (void ); +#else +extern int zconfwrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( zconftext, zconfleng, 1, zconfout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + errno=0; \ + while ( (result = read( fileno(zconfin), (char *) buf, max_size )) < 0 ) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(zconfin); \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int zconflex (void); + +#define YY_DECL int zconflex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after zconftext and zconfleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + + int str = 0; + int ts, i; + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! zconfin ) + zconfin = stdin; + + if ( ! zconfout ) + zconfout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + zconfensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + zconf_create_buffer(zconfin,YY_BUF_SIZE ); + } + + zconf_load_buffer_state( ); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of zconftext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); +yy_match: + while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)] ]) > 0 ) + ++yy_cp; + + yy_current_state = -yy_current_state; + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + + YY_DO_BEFORE_ACTION; + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ +case 1: +/* rule 1 can match eol */ +case 2: +/* rule 2 can match eol */ +YY_RULE_SETUP +{ + current_file->lineno++; + return T_EOL; +} + YY_BREAK +case 3: +YY_RULE_SETUP + + YY_BREAK +case 4: +YY_RULE_SETUP +{ + BEGIN(COMMAND); +} + YY_BREAK +case 5: +YY_RULE_SETUP +{ + unput(zconftext[0]); + BEGIN(COMMAND); +} + YY_BREAK + +case 6: +YY_RULE_SETUP +{ + struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng); + BEGIN(PARAM); + current_pos.file = current_file; + current_pos.lineno = current_file->lineno; + if (id && id->flags & TF_COMMAND) { + zconflval.id = id; + return id->token; + } + alloc_string(zconftext, zconfleng); + zconflval.string = text; + return T_WORD; + } + YY_BREAK +case 7: +YY_RULE_SETUP + + YY_BREAK +case 8: +/* rule 8 can match eol */ +YY_RULE_SETUP +{ + BEGIN(INITIAL); + current_file->lineno++; + return T_EOL; + } + YY_BREAK + +case 9: +YY_RULE_SETUP +return T_AND; + YY_BREAK +case 10: +YY_RULE_SETUP +return T_OR; + YY_BREAK +case 11: +YY_RULE_SETUP +return T_OPEN_PAREN; + YY_BREAK +case 12: +YY_RULE_SETUP +return T_CLOSE_PAREN; + YY_BREAK +case 13: +YY_RULE_SETUP +return T_NOT; + YY_BREAK +case 14: +YY_RULE_SETUP +return T_EQUAL; + YY_BREAK +case 15: +YY_RULE_SETUP +return T_UNEQUAL; + YY_BREAK +case 16: +YY_RULE_SETUP +{ + str = zconftext[0]; + new_string(); + BEGIN(STRING); + } + YY_BREAK +case 17: +/* rule 17 can match eol */ +YY_RULE_SETUP +BEGIN(INITIAL); current_file->lineno++; return T_EOL; + YY_BREAK +case 18: +YY_RULE_SETUP +/* ignore */ + YY_BREAK +case 19: +YY_RULE_SETUP +{ + struct kconf_id *id = kconf_id_lookup(zconftext, zconfleng); + if (id && id->flags & TF_PARAM) { + zconflval.id = id; + return id->token; + } + alloc_string(zconftext, zconfleng); + zconflval.string = text; + return T_WORD; + } + YY_BREAK +case 20: +YY_RULE_SETUP +/* comment */ + YY_BREAK +case 21: +/* rule 21 can match eol */ +YY_RULE_SETUP +current_file->lineno++; + YY_BREAK +case 22: +YY_RULE_SETUP + + YY_BREAK +case YY_STATE_EOF(PARAM): +{ + BEGIN(INITIAL); + } + YY_BREAK + +case 23: +/* rule 23 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up zconftext again */ +YY_RULE_SETUP +{ + append_string(zconftext, zconfleng); + zconflval.string = text; + return T_WORD_QUOTE; + } + YY_BREAK +case 24: +YY_RULE_SETUP +{ + append_string(zconftext, zconfleng); + } + YY_BREAK +case 25: +/* rule 25 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up zconftext again */ +YY_RULE_SETUP +{ + append_string(zconftext + 1, zconfleng - 1); + zconflval.string = text; + return T_WORD_QUOTE; + } + YY_BREAK +case 26: +YY_RULE_SETUP +{ + append_string(zconftext + 1, zconfleng - 1); + } + YY_BREAK +case 27: +YY_RULE_SETUP +{ + if (str == zconftext[0]) { + BEGIN(PARAM); + zconflval.string = text; + return T_WORD_QUOTE; + } else + append_string(zconftext, 1); + } + YY_BREAK +case 28: +/* rule 28 can match eol */ +YY_RULE_SETUP +{ + printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno()); + current_file->lineno++; + BEGIN(INITIAL); + return T_EOL; + } + YY_BREAK +case YY_STATE_EOF(STRING): +{ + BEGIN(INITIAL); + } + YY_BREAK + +case 29: +YY_RULE_SETUP +{ + ts = 0; + for (i = 0; i < zconfleng; i++) { + if (zconftext[i] == '\t') + ts = (ts & ~7) + 8; + else + ts++; + } + last_ts = ts; + if (first_ts) { + if (ts < first_ts) { + zconf_endhelp(); + return T_HELPTEXT; + } + ts -= first_ts; + while (ts > 8) { + append_string(" ", 8); + ts -= 8; + } + append_string(" ", ts); + } + } + YY_BREAK +case 30: +/* rule 30 can match eol */ +*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */ +(yy_c_buf_p) = yy_cp -= 1; +YY_DO_BEFORE_ACTION; /* set up zconftext again */ +YY_RULE_SETUP +{ + current_file->lineno++; + zconf_endhelp(); + return T_HELPTEXT; + } + YY_BREAK +case 31: +/* rule 31 can match eol */ +YY_RULE_SETUP +{ + current_file->lineno++; + append_string("\n", 1); + } + YY_BREAK +case 32: +YY_RULE_SETUP +{ + append_string(zconftext, zconfleng); + if (!first_ts) + first_ts = last_ts; + } + YY_BREAK +case YY_STATE_EOF(HELP): +{ + zconf_endhelp(); + return T_HELPTEXT; + } + YY_BREAK + +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(COMMAND): +{ + if (current_file) { + zconf_endfile(); + return T_EOL; + } + fclose(zconfin); + yyterminate(); +} + YY_BREAK +case 33: +YY_RULE_SETUP +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed zconfin at a new source and called + * zconflex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = zconfin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( zconfwrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * zconftext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of zconflex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + zconfrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + zconfrestart(zconfin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + + yy_current_state = yy_nxt[yy_current_state][1]; + yy_is_jam = (yy_current_state <= 0); + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up zconftext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + zconfrestart(zconfin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( zconfwrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve zconftext */ + (yy_hold_char) = *++(yy_c_buf_p); + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void zconfrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + zconfensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + zconf_create_buffer(zconfin,YY_BUF_SIZE ); + } + + zconf_init_buffer(YY_CURRENT_BUFFER,input_file ); + zconf_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * zconfpop_buffer_state(); + * zconfpush_buffer_state(new_buffer); + */ + zconfensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + zconf_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (zconfwrap()) processing, but the only time this flag + * is looked at is after zconfwrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void zconf_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + zconfin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE zconf_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) zconfalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + zconf_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with zconf_create_buffer() + * + */ + void zconf_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + zconffree((void *) b->yy_ch_buf ); + + zconffree((void *) b ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a zconfrestart() or at EOF. + */ + static void zconf_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + zconf_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then zconf_init_buffer was _probably_ + * called from zconfrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void zconf_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + zconf_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + zconfensure_buffer_stack(); + + /* This block is copied from zconf_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from zconf_switch_to_buffer. */ + zconf_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void zconfpop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + zconf_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + zconf_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void zconfensure_buffer_stack (void) +{ + int num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)zconfrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE zconf_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + zconf_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to zconflex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * zconf_scan_bytes() instead. + */ +YY_BUFFER_STATE zconf_scan_string (yyconst char * yystr ) +{ + + return zconf_scan_bytes(yystr,strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will + * scan from a @e copy of @a bytes. + * @param bytes the byte buffer to scan + * @param len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE zconf_scan_bytes (yyconst char * yybytes, int _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) zconfalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = zconf_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in zconf_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up zconftext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + zconftext[zconfleng] = (yy_hold_char); \ + (yy_c_buf_p) = zconftext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + zconfleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int zconfget_lineno (void) +{ + + return zconflineno; +} + +/** Get the input stream. + * + */ +FILE *zconfget_in (void) +{ + return zconfin; +} + +/** Get the output stream. + * + */ +FILE *zconfget_out (void) +{ + return zconfout; +} + +/** Get the length of the current token. + * + */ +int zconfget_leng (void) +{ + return zconfleng; +} + +/** Get the current token. + * + */ + +char *zconfget_text (void) +{ + return zconftext; +} + +/** Set the current line number. + * @param line_number + * + */ +void zconfset_lineno (int line_number ) +{ + + zconflineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see zconf_switch_to_buffer + */ +void zconfset_in (FILE * in_str ) +{ + zconfin = in_str ; +} + +void zconfset_out (FILE * out_str ) +{ + zconfout = out_str ; +} + +int zconfget_debug (void) +{ + return zconf_flex_debug; +} + +void zconfset_debug (int bdebug ) +{ + zconf_flex_debug = bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from zconflex_destroy(), so don't allocate here. + */ + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + zconfin = stdin; + zconfout = stdout; +#else + zconfin = (FILE *) 0; + zconfout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * zconflex_init() + */ + return 0; +} + +/* zconflex_destroy is for both reentrant and non-reentrant scanners. */ +int zconflex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + zconf_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + zconfpop_buffer_state(); + } + + /* Destroy the stack itself. */ + zconffree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * zconflex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *zconfalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *zconfrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void zconffree (void * ptr ) +{ + free( (char *) ptr ); /* see zconfrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +void zconf_starthelp(void) +{ + new_string(); + last_ts = first_ts = 0; + BEGIN(HELP); +} + +static void zconf_endhelp(void) +{ + zconflval.string = text; + BEGIN(INITIAL); +} + +/* + * Try to open specified file with following names: + * ./name + * $(srctree)/name + * The latter is used when srctree is separate from objtree + * when compiling the kernel. + * Return NULL if file is not found. + */ +FILE *zconf_fopen(const char *name) +{ + char *env, fullname[PATH_MAX+1]; + FILE *f; + + f = fopen(name, "r"); + if (!f && name[0] != '/') { + env = getenv(SRCTREE); + if (env) { + sprintf(fullname, "%s/%s", env, name); + f = fopen(fullname, "r"); + } + } + return f; +} + +void zconf_initscan(const char *name) +{ + zconfin = zconf_fopen(name); + if (!zconfin) { + printf("can't find file %s\n", name); + exit(1); + } + + current_buf = malloc(sizeof(*current_buf)); + memset(current_buf, 0, sizeof(*current_buf)); + + current_file = file_lookup(name); + current_file->lineno = 1; + current_file->flags = FILE_BUSY; +} + +void zconf_nextfile(const char *name) +{ + struct file *file = file_lookup(name); + struct buffer *buf = malloc(sizeof(*buf)); + memset(buf, 0, sizeof(*buf)); + + current_buf->state = YY_CURRENT_BUFFER; + zconfin = zconf_fopen(name); + if (!zconfin) { + printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name); + exit(1); + } + zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE)); + buf->parent = current_buf; + current_buf = buf; + + if (file->flags & FILE_BUSY) { + printf("recursive scan (%s)?\n", name); + exit(1); + } + if (file->flags & FILE_SCANNED) { + printf("file %s already scanned?\n", name); + exit(1); + } + file->flags |= FILE_BUSY; + file->lineno = 1; + file->parent = current_file; + current_file = file; +} + +static void zconf_endfile(void) +{ + struct buffer *parent; + + current_file->flags |= FILE_SCANNED; + current_file->flags &= ~FILE_BUSY; + current_file = current_file->parent; + + parent = current_buf->parent; + if (parent) { + fclose(zconfin); + zconf_delete_buffer(YY_CURRENT_BUFFER); + zconf_switch_to_buffer(parent->state); + } + free(current_buf); + current_buf = parent; +} + +int zconf_lineno(void) +{ + return current_pos.lineno; +} + +char *zconf_curname(void) +{ + return current_pos.file ? current_pos.file->name : "<none>"; +} + diff --git a/kconfig/lkc.h b/kconfig/lkc.h new file mode 100644 index 00000000..cf326792 --- /dev/null +++ b/kconfig/lkc.h @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#ifndef LKC_H +#define LKC_H + +#define PROJECT_NAME "crosstool-NG" + +// Make some warnings go away +#define YYENABLE_NLS 0 +#define YYLTYPE_IS_TRIVIAL 0 + +#include "expr.h" + +#ifndef KBUILD_NO_NLS +# include <libintl.h> +#else +# define gettext(Msgid) ((const char *) (Msgid)) +# define textdomain(Domainname) ((const char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef LKC_DIRECT_LINK +#define P(name,type,arg) extern type name arg +#else +#include "lkc_defs.h" +#define P(name,type,arg) extern type (*name ## _p) arg +#endif +#include "lkc_proto.h" +#undef P + +#define SRCTREE "srctree" + +#define PACKAGE "crosstool-NG" +#define LOCALEDIR "/usr/share/locale" + +#define _(text) gettext(text) +#define N_(text) (text) + + +#define TF_COMMAND 0x0001 +#define TF_PARAM 0x0002 +#define TF_OPTION 0x0004 + +#define T_OPT_MODULES 1 +#define T_OPT_DEFCONFIG_LIST 2 + +struct kconf_id { + int name; + int token; + unsigned int flags; + enum symbol_type stype; +}; + +int zconfparse(void); +void zconfdump(FILE *out); + +extern int zconfdebug; +void zconf_starthelp(void); +FILE *zconf_fopen(const char *name); +void zconf_initscan(const char *name); +void zconf_nextfile(const char *name); +int zconf_lineno(void); +char *zconf_curname(void); + +/* confdata.c */ +char *conf_get_default_confname(void); + +/* kconfig_load.c */ +void kconfig_load(void); + +/* menu.c */ +void menu_init(void); +struct menu *menu_add_menu(void); +void menu_end_menu(void); +void menu_add_entry(struct symbol *sym); +void menu_end_entry(void); +void menu_add_dep(struct expr *dep); +struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep); +struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep); +void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep); +void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep); +void menu_add_option(int token, char *arg); +void menu_finalize(struct menu *parent); +void menu_set_type(int type); + +/* util.c */ +struct file *file_lookup(const char *name); +int file_write_dep(const char *name); + +struct gstr { + size_t len; + char *s; +}; +struct gstr str_new(void); +struct gstr str_assign(const char *s); +void str_free(struct gstr *gs); +void str_append(struct gstr *gs, const char *s); +void str_printf(struct gstr *gs, const char *fmt, ...); +const char *str_get(struct gstr *gs); + +/* symbol.c */ +void sym_init(void); +void sym_clear_all_valid(void); +void sym_set_all_changed(void); +void sym_set_changed(struct symbol *sym); +struct symbol *sym_check_deps(struct symbol *sym); +struct property *prop_alloc(enum prop_type type, struct symbol *sym); +struct symbol *prop_get_symbol(struct property *prop); + +static inline tristate sym_get_tristate_value(struct symbol *sym) +{ + return sym->curr.tri; +} + + +static inline struct symbol *sym_get_choice_value(struct symbol *sym) +{ + return (struct symbol *)sym->curr.val; +} + +static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval) +{ + return sym_set_tristate_value(chval, yes); +} + +static inline bool sym_is_choice(struct symbol *sym) +{ + return sym->flags & SYMBOL_CHOICE ? true : false; +} + +static inline bool sym_is_choice_value(struct symbol *sym) +{ + return sym->flags & SYMBOL_CHOICEVAL ? true : false; +} + +static inline bool sym_is_optional(struct symbol *sym) +{ + return sym->flags & SYMBOL_OPTIONAL ? true : false; +} + +static inline bool sym_has_value(struct symbol *sym) +{ + return sym->flags & SYMBOL_DEF_USER ? true : false; +} + +#ifdef __cplusplus +} +#endif + +#endif /* LKC_H */ diff --git a/kconfig/lkc_proto.h b/kconfig/lkc_proto.h new file mode 100644 index 00000000..a263746c --- /dev/null +++ b/kconfig/lkc_proto.h @@ -0,0 +1,42 @@ + +/* confdata.c */ +P(conf_parse,void,(const char *name)); +P(conf_read,int,(const char *name)); +P(conf_read_simple,int,(const char *name, int)); +P(conf_write,int,(const char *name)); +P(conf_write_autoconf,int,(void)); + +/* menu.c */ +P(rootmenu,struct menu,); + +P(menu_is_visible,bool,(struct menu *menu)); +P(menu_get_prompt,const char *,(struct menu *menu)); +P(menu_get_root_menu,struct menu *,(struct menu *menu)); +P(menu_get_parent_menu,struct menu *,(struct menu *menu)); + +/* symbol.c */ +P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]); +P(sym_change_count,int,); + +P(sym_lookup,struct symbol *,(const char *name, int isconst)); +P(sym_find,struct symbol *,(const char *name)); +P(sym_re_search,struct symbol **,(const char *pattern)); +P(sym_type_name,const char *,(enum symbol_type type)); +P(sym_calc_value,void,(struct symbol *sym)); +P(sym_get_type,enum symbol_type,(struct symbol *sym)); +P(sym_tristate_within_range,bool,(struct symbol *sym,tristate tri)); +P(sym_set_tristate_value,bool,(struct symbol *sym,tristate tri)); +P(sym_toggle_tristate_value,tristate,(struct symbol *sym)); +P(sym_string_valid,bool,(struct symbol *sym, const char *newval)); +P(sym_string_within_range,bool,(struct symbol *sym, const char *str)); +P(sym_set_string_value,bool,(struct symbol *sym, const char *newval)); +P(sym_is_changable,bool,(struct symbol *sym)); +P(sym_get_choice_prop,struct property *,(struct symbol *sym)); +P(sym_get_default_prop,struct property *,(struct symbol *sym)); +P(sym_get_string_value,const char *,(struct symbol *sym)); + +P(prop_get_type_name,const char *,(enum prop_type type)); + +/* expr.c */ +P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2)); +P(expr_print,void,(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken)); diff --git a/kconfig/lxdialog/BIG.FAT.WARNING b/kconfig/lxdialog/BIG.FAT.WARNING new file mode 100644 index 00000000..a8999d82 --- /dev/null +++ b/kconfig/lxdialog/BIG.FAT.WARNING @@ -0,0 +1,4 @@ +This is NOT the official version of dialog. This version has been +significantly modified from the original. It is for use by the Linux +kernel configuration script. Please do not bother Savio Lam with +questions about this program. diff --git a/kconfig/lxdialog/check-lxdialog.sh b/kconfig/lxdialog/check-lxdialog.sh new file mode 100644 index 00000000..120d624e --- /dev/null +++ b/kconfig/lxdialog/check-lxdialog.sh @@ -0,0 +1,84 @@ +#!/bin/sh +# Check ncurses compatibility + +# What library to link +ldflags() +{ + $cc -print-file-name=libncursesw.so | grep -q / + if [ $? -eq 0 ]; then + echo '-lncursesw' + exit + fi + $cc -print-file-name=libncurses.so | grep -q / + if [ $? -eq 0 ]; then + echo '-lncurses' + exit + fi + $cc -print-file-name=libcurses.so | grep -q / + if [ $? -eq 0 ]; then + echo '-lcurses' + exit + fi + exit 1 +} + +# Where is ncurses.h? +ccflags() +{ + if [ -f /usr/include/ncurses/ncurses.h ]; then + echo '-I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"' + elif [ -f /usr/include/ncurses/curses.h ]; then + echo '-I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"' + elif [ -f /usr/include/ncurses.h ]; then + echo '-DCURSES_LOC="<ncurses.h>"' + else + echo '-DCURSES_LOC="<curses.h>"' + fi +} + +# Temp file, try to clean up after us +tmp=.lxdialog.tmp +trap "rm -f $tmp" 0 1 2 3 15 + +# Check if we can link to ncurses +check() { + echo "main() {}" | $cc -xc - -o $tmp 2> /dev/null + if [ $? != 0 ]; then + echo " *** Unable to find the ncurses libraries." 1>&2 + echo " *** make menuconfig require the ncurses libraries" 1>&2 + echo " *** " 1>&2 + echo " *** Install ncurses (ncurses-devel) and try again" 1>&2 + echo " *** " 1>&2 + exit 1 + fi +} + +usage() { + printf "Usage: $0 [-check compiler options|-header|-library]\n" +} + +if [ $# == 0 ]; then + usage + exit 1 +fi + +cc="" +case "$1" in + "-check") + shift + cc="$@" + check + ;; + "-ccflags") + ccflags + ;; + "-ldflags") + shift + cc="$@" + ldflags + ;; + "*") + usage + exit 1 + ;; +esac diff --git a/kconfig/lxdialog/checklist.c b/kconfig/lxdialog/checklist.c new file mode 100644 index 00000000..cf697080 --- /dev/null +++ b/kconfig/lxdialog/checklist.c @@ -0,0 +1,325 @@ +/* + * checklist.c -- implements the checklist box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension + * Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +static int list_width, check_x, item_x; + +/* + * Print list item + */ +static void print_item(WINDOW * win, int choice, int selected) +{ + int i; + + /* Clear 'residue' of last item */ + wattrset(win, dlg.menubox.atr); + wmove(win, choice, 0); + for (i = 0; i < list_width; i++) + waddch(win, ' '); + + wmove(win, choice, check_x); + wattrset(win, selected ? dlg.check_selected.atr + : dlg.check.atr); + wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' '); + + wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr); + mvwaddch(win, choice, item_x, item_str()[0]); + wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr); + waddstr(win, (char *)item_str() + 1); + if (selected) { + wmove(win, choice, check_x + 1); + wrefresh(win); + } +} + +/* + * Print the scroll indicators. + */ +static void print_arrows(WINDOW * win, int choice, int item_no, int scroll, + int y, int x, int height) +{ + wmove(win, y, x); + + if (scroll > 0) { + wattrset(win, dlg.uarrow.atr); + waddch(win, ACS_UARROW); + waddstr(win, "(-)"); + } else { + wattrset(win, dlg.menubox.atr); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + } + + y = y + height + 1; + wmove(win, y, x); + + if ((height < item_no) && (scroll + choice < item_no - 1)) { + wattrset(win, dlg.darrow.atr); + waddch(win, ACS_DARROW); + waddstr(win, "(+)"); + } else { + wattrset(win, dlg.menubox_border.atr); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + } +} + +/* + * Display the termination buttons + */ +static void print_buttons(WINDOW * dialog, int height, int width, int selected) +{ + int x = width / 2 - 11; + int y = height - 2; + + print_button(dialog, "Select", y, x, selected == 0); + print_button(dialog, " Help ", y, x + 14, selected == 1); + + wmove(dialog, y, x + 1 + 14 * selected); + wrefresh(dialog); +} + +/* + * Display a dialog box with a list of options that can be turned on or off + * in the style of radiolist (only one option turned on at a time). + */ +int dialog_checklist(const char *title, const char *prompt, int height, + int width, int list_height) +{ + int i, x, y, box_x, box_y; + int key = 0, button = 0, choice = 0, scroll = 0, max_choice; + WINDOW *dialog, *list; + + /* which item to highlight */ + item_foreach() { + if (item_is_tag('X')) + choice = item_n(); + if (item_is_selected()) { + choice = item_n(); + break; + } + } + +do_resize: + if (getmaxy(stdscr) < (height + 6)) + return -ERRDISPLAYTOOSMALL; + if (getmaxx(stdscr) < (width + 6)) + return -ERRDISPLAYTOOSMALL; + + max_choice = MIN(list_height, item_count()); + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow(stdscr, y, x, height, width); + + dialog = newwin(height, width, y, x); + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, + dlg.dialog.atr, dlg.border.atr); + wattrset(dialog, dlg.border.atr); + mvwaddch(dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dlg.dialog.atr); + waddch(dialog, ACS_RTEE); + + print_title(dialog, title, width); + + wattrset(dialog, dlg.dialog.atr); + print_autowrap(dialog, prompt, width - 2, 1, 3); + + list_width = width - 6; + box_y = height - list_height - 5; + box_x = (width - list_width) / 2 - 1; + + /* create new window for the list */ + list = subwin(dialog, list_height, list_width, y + box_y + 1, + x + box_x + 1); + + keypad(list, TRUE); + + /* draw a box around the list items */ + draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2, + dlg.menubox_border.atr, dlg.menubox.atr); + + /* Find length of longest item in order to center checklist */ + check_x = 0; + item_foreach() + check_x = MAX(check_x, strlen(item_str()) + 4); + + check_x = (list_width - check_x) / 2; + item_x = check_x + 4; + + if (choice >= list_height) { + scroll = choice - list_height + 1; + choice -= scroll; + } + + /* Print the list */ + for (i = 0; i < max_choice; i++) { + item_set(scroll + i); + print_item(list, i, i == choice); + } + + print_arrows(dialog, choice, item_count(), scroll, + box_y, box_x + check_x + 5, list_height); + + print_buttons(dialog, height, width, 0); + + wnoutrefresh(dialog); + wnoutrefresh(list); + doupdate(); + + while (key != KEY_ESC) { + key = wgetch(dialog); + + for (i = 0; i < max_choice; i++) { + item_set(i + scroll); + if (toupper(key) == toupper(item_str()[0])) + break; + } + + if (i < max_choice || key == KEY_UP || key == KEY_DOWN || + key == '+' || key == '-') { + if (key == KEY_UP || key == '-') { + if (!choice) { + if (!scroll) + continue; + /* Scroll list down */ + if (list_height > 1) { + /* De-highlight current first item */ + item_set(scroll); + print_item(list, 0, FALSE); + scrollok(list, TRUE); + wscrl(list, -1); + scrollok(list, FALSE); + } + scroll--; + item_set(scroll); + print_item(list, 0, TRUE); + print_arrows(dialog, choice, item_count(), + scroll, box_y, box_x + check_x + 5, list_height); + + wnoutrefresh(dialog); + wrefresh(list); + + continue; /* wait for another key press */ + } else + i = choice - 1; + } else if (key == KEY_DOWN || key == '+') { + if (choice == max_choice - 1) { + if (scroll + choice >= item_count() - 1) + continue; + /* Scroll list up */ + if (list_height > 1) { + /* De-highlight current last item before scrolling up */ + item_set(scroll + max_choice - 1); + print_item(list, + max_choice - 1, + FALSE); + scrollok(list, TRUE); + wscrl(list, 1); + scrollok(list, FALSE); + } + scroll++; + item_set(scroll + max_choice - 1); + print_item(list, max_choice - 1, TRUE); + + print_arrows(dialog, choice, item_count(), + scroll, box_y, box_x + check_x + 5, list_height); + + wnoutrefresh(dialog); + wrefresh(list); + + continue; /* wait for another key press */ + } else + i = choice + 1; + } + if (i != choice) { + /* De-highlight current item */ + item_set(scroll + choice); + print_item(list, choice, FALSE); + /* Highlight new item */ + choice = i; + item_set(scroll + choice); + print_item(list, choice, TRUE); + wnoutrefresh(dialog); + wrefresh(list); + } + continue; /* wait for another key press */ + } + switch (key) { + case 'H': + case 'h': + case '?': + button = 1; + /* fall-through */ + case 'S': + case 's': + case ' ': + case '\n': + item_foreach() + item_set_selected(0); + item_set(scroll + choice); + item_set_selected(1); + delwin(list); + delwin(dialog); + return button; + case TAB: + case KEY_LEFT: + case KEY_RIGHT: + button = ((key == KEY_LEFT ? --button : ++button) < 0) + ? 1 : (button > 1 ? 0 : button); + + print_buttons(dialog, height, width, button); + wrefresh(dialog); + break; + case 'X': + case 'x': + key = KEY_ESC; + break; + case KEY_ESC: + key = on_key_esc(dialog); + break; + case KEY_RESIZE: + delwin(list); + delwin(dialog); + on_key_resize(); + goto do_resize; + } + + /* Now, update everything... */ + doupdate(); + } + delwin(list); + delwin(dialog); + return key; /* ESC pressed */ +} diff --git a/kconfig/lxdialog/dialog.h b/kconfig/lxdialog/dialog.h new file mode 100644 index 00000000..fd695e10 --- /dev/null +++ b/kconfig/lxdialog/dialog.h @@ -0,0 +1,224 @@ +/* + * dialog.h -- common declarations for all dialog modules + * + * AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include <sys/types.h> +#include <fcntl.h> +#include <unistd.h> +#include <ctype.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> + +#ifdef __sun__ +#define CURS_MACROS +#endif +#include CURSES_LOC + +/* + * Colors in ncurses 1.9.9e do not work properly since foreground and + * background colors are OR'd rather than separately masked. This version + * of dialog was hacked to work with ncurses 1.9.9e, making it incompatible + * with standard curses. The simplest fix (to make this work with standard + * curses) uses the wbkgdset() function, not used in the original hack. + * Turn it off if we're building with 1.9.9e, since it just confuses things. + */ +#if defined(NCURSES_VERSION) && defined(_NEED_WRAP) && !defined(GCC_PRINTFLIKE) +#define OLD_NCURSES 1 +#undef wbkgdset +#define wbkgdset(w,p) /*nothing */ +#else +#define OLD_NCURSES 0 +#endif + +#define TR(params) _tracef params + +#define KEY_ESC 27 +#define TAB 9 +#define MAX_LEN 2048 +#define BUF_SIZE (10*1024) +#define MIN(x,y) (x < y ? x : y) +#define MAX(x,y) (x > y ? x : y) + +#ifndef ACS_ULCORNER +#define ACS_ULCORNER '+' +#endif +#ifndef ACS_LLCORNER +#define ACS_LLCORNER '+' +#endif +#ifndef ACS_URCORNER +#define ACS_URCORNER '+' +#endif +#ifndef ACS_LRCORNER +#define ACS_LRCORNER '+' +#endif +#ifndef ACS_HLINE +#define ACS_HLINE '-' +#endif +#ifndef ACS_VLINE +#define ACS_VLINE '|' +#endif +#ifndef ACS_LTEE +#define ACS_LTEE '+' +#endif +#ifndef ACS_RTEE +#define ACS_RTEE '+' +#endif +#ifndef ACS_UARROW +#define ACS_UARROW '^' +#endif +#ifndef ACS_DARROW +#define ACS_DARROW 'v' +#endif + +/* error return codes */ +#define ERRDISPLAYTOOSMALL (KEY_MAX + 1) + +/* + * Color definitions + */ +struct dialog_color { + chtype atr; /* Color attribute */ + int fg; /* foreground */ + int bg; /* background */ + int hl; /* highlight this item */ +}; + +struct dialog_info { + const char *backtitle; + struct dialog_color screen; + struct dialog_color shadow; + struct dialog_color dialog; + struct dialog_color title; + struct dialog_color border; + struct dialog_color button_active; + struct dialog_color button_inactive; + struct dialog_color button_key_active; + struct dialog_color button_key_inactive; + struct dialog_color button_label_active; + struct dialog_color button_label_inactive; + struct dialog_color inputbox; + struct dialog_color inputbox_border; + struct dialog_color searchbox; + struct dialog_color searchbox_title; + struct dialog_color searchbox_border; + struct dialog_color position_indicator; + struct dialog_color menubox; + struct dialog_color menubox_border; + struct dialog_color item; + struct dialog_color item_selected; + struct dialog_color tag; + struct dialog_color tag_selected; + struct dialog_color tag_key; + struct dialog_color tag_key_selected; + struct dialog_color check; + struct dialog_color check_selected; + struct dialog_color uarrow; + struct dialog_color darrow; +}; + +/* + * Global variables + */ +extern struct dialog_info dlg; +extern char dialog_input_result[]; + +/* + * Function prototypes + */ + +/* item list as used by checklist and menubox */ +void item_reset(void); +void item_make(const char *fmt, ...); +void item_add_str(const char *fmt, ...); +void item_set_tag(char tag); +void item_set_data(void *p); +void item_set_selected(int val); +int item_activate_selected(void); +void *item_data(void); +char item_tag(void); + +/* item list manipulation for lxdialog use */ +#define MAXITEMSTR 200 +struct dialog_item { + char str[MAXITEMSTR]; /* promtp displayed */ + char tag; + void *data; /* pointer to menu item - used by menubox+checklist */ + int selected; /* Set to 1 by dialog_*() function if selected. */ +}; + +/* list of lialog_items */ +struct dialog_list { + struct dialog_item node; + struct dialog_list *next; +}; + +extern struct dialog_list *item_cur; +extern struct dialog_list item_nil; +extern struct dialog_list *item_head; + +int item_count(void); +void item_set(int n); +int item_n(void); +const char *item_str(void); +int item_is_selected(void); +int item_is_tag(char tag); +#define item_foreach() \ + for (item_cur = item_head ? item_head: item_cur; \ + item_cur && (item_cur != &item_nil); item_cur = item_cur->next) + +/* generic key handlers */ +int on_key_esc(WINDOW *win); +int on_key_resize(void); + +void init_dialog(const char *backtitle); +void reset_dialog(void); +void end_dialog(void); +void attr_clear(WINDOW * win, int height, int width, chtype attr); +void dialog_clear(void); +void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x); +void print_button(WINDOW * win, const char *label, int y, int x, int selected); +void print_title(WINDOW *dialog, const char *title, int width); +void draw_box(WINDOW * win, int y, int x, int height, int width, chtype box, + chtype border); +void draw_shadow(WINDOW * win, int y, int x, int height, int width); + +int first_alpha(const char *string, const char *exempt); +int dialog_yesno(const char *title, const char *prompt, int height, int width); +int dialog_msgbox(const char *title, const char *prompt, int height, + int width, int pause); +int dialog_textbox(const char *title, const char *file, int height, int width); +int dialog_menu(const char *title, const char *prompt, + const void *selected, int *s_scroll); +int dialog_checklist(const char *title, const char *prompt, int height, + int width, int list_height); +extern char dialog_input_result[]; +int dialog_inputbox(const char *title, const char *prompt, int height, + int width, const char *init); + +/* + * This is the base for fictitious keys, which activate + * the buttons. + * + * Mouse-generated keys are the following: + * -- the first 32 are used as numbers, in addition to '0'-'9' + * -- the lowercase are used to signal mouse-enter events (M_EVENT + 'o') + * -- uppercase chars are used to invoke the button (M_EVENT + 'O') + */ +#define M_EVENT (KEY_MAX+1) diff --git a/kconfig/lxdialog/inputbox.c b/kconfig/lxdialog/inputbox.c new file mode 100644 index 00000000..05e72066 --- /dev/null +++ b/kconfig/lxdialog/inputbox.c @@ -0,0 +1,238 @@ +/* + * inputbox.c -- implements the input box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +char dialog_input_result[MAX_LEN + 1]; + +/* + * Print the termination buttons + */ +static void print_buttons(WINDOW * dialog, int height, int width, int selected) +{ + int x = width / 2 - 11; + int y = height - 2; + + print_button(dialog, " Ok ", y, x, selected == 0); + print_button(dialog, " Help ", y, x + 14, selected == 1); + + wmove(dialog, y, x + 1 + 14 * selected); + wrefresh(dialog); +} + +/* + * Display a dialog box for inputing a string + */ +int dialog_inputbox(const char *title, const char *prompt, int height, int width, + const char *init) +{ + int i, x, y, box_y, box_x, box_width; + int input_x = 0, scroll = 0, key = 0, button = -1; + char *instr = dialog_input_result; + WINDOW *dialog; + + if (!init) + instr[0] = '\0'; + else + strcpy(instr, init); + +do_resize: + if (getmaxy(stdscr) <= (height - 2)) + return -ERRDISPLAYTOOSMALL; + if (getmaxx(stdscr) <= (width - 2)) + return -ERRDISPLAYTOOSMALL; + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow(stdscr, y, x, height, width); + + dialog = newwin(height, width, y, x); + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, + dlg.dialog.atr, dlg.border.atr); + wattrset(dialog, dlg.border.atr); + mvwaddch(dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dlg.dialog.atr); + waddch(dialog, ACS_RTEE); + + print_title(dialog, title, width); + + wattrset(dialog, dlg.dialog.atr); + print_autowrap(dialog, prompt, width - 2, 1, 3); + + /* Draw the input field box */ + box_width = width - 6; + getyx(dialog, y, x); + box_y = y + 2; + box_x = (width - box_width) / 2; + draw_box(dialog, y + 1, box_x - 1, 3, box_width + 2, + dlg.border.atr, dlg.dialog.atr); + + print_buttons(dialog, height, width, 0); + + /* Set up the initial value */ + wmove(dialog, box_y, box_x); + wattrset(dialog, dlg.inputbox.atr); + + input_x = strlen(instr); + + if (input_x >= box_width) { + scroll = input_x - box_width + 1; + input_x = box_width - 1; + for (i = 0; i < box_width - 1; i++) + waddch(dialog, instr[scroll + i]); + } else { + waddstr(dialog, instr); + } + + wmove(dialog, box_y, box_x + input_x); + + wrefresh(dialog); + + while (key != KEY_ESC) { + key = wgetch(dialog); + + if (button == -1) { /* Input box selected */ + switch (key) { + case TAB: + case KEY_UP: + case KEY_DOWN: + break; + case KEY_LEFT: + continue; + case KEY_RIGHT: + continue; + case KEY_BACKSPACE: + case 127: + if (input_x || scroll) { + wattrset(dialog, dlg.inputbox.atr); + if (!input_x) { + scroll = scroll < box_width - 1 ? 0 : scroll - (box_width - 1); + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width; i++) + waddch(dialog, + instr[scroll + input_x + i] ? + instr[scroll + input_x + i] : ' '); + input_x = strlen(instr) - scroll; + } else + input_x--; + instr[scroll + input_x] = '\0'; + mvwaddch(dialog, box_y, input_x + box_x, ' '); + wmove(dialog, box_y, input_x + box_x); + wrefresh(dialog); + } + continue; + default: + if (key < 0x100 && isprint(key)) { + if (scroll + input_x < MAX_LEN) { + wattrset(dialog, dlg.inputbox.atr); + instr[scroll + input_x] = key; + instr[scroll + input_x + 1] = '\0'; + if (input_x == box_width - 1) { + scroll++; + wmove(dialog, box_y, box_x); + for (i = 0; i < box_width - 1; i++) + waddch(dialog, instr [scroll + i]); + } else { + wmove(dialog, box_y, input_x++ + box_x); + waddch(dialog, key); + } + wrefresh(dialog); + } else + flash(); /* Alarm user about overflow */ + continue; + } + } + } + switch (key) { + case 'O': + case 'o': + delwin(dialog); + return 0; + case 'H': + case 'h': + delwin(dialog); + return 1; + case KEY_UP: + case KEY_LEFT: + switch (button) { + case -1: + button = 1; /* Indicates "Cancel" button is selected */ + print_buttons(dialog, height, width, 1); + break; + case 0: + button = -1; /* Indicates input box is selected */ + print_buttons(dialog, height, width, 0); + wmove(dialog, box_y, box_x + input_x); + wrefresh(dialog); + break; + case 1: + button = 0; /* Indicates "OK" button is selected */ + print_buttons(dialog, height, width, 0); + break; + } + break; + case TAB: + case KEY_DOWN: + case KEY_RIGHT: + switch (button) { + case -1: + button = 0; /* Indicates "OK" button is selected */ + print_buttons(dialog, height, width, 0); + break; + case 0: + button = 1; /* Indicates "Cancel" button is selected */ + print_buttons(dialog, height, width, 1); + break; + case 1: + button = -1; /* Indicates input box is selected */ + print_buttons(dialog, height, width, 0); + wmove(dialog, box_y, box_x + input_x); + wrefresh(dialog); + break; + } + break; + case ' ': + case '\n': + delwin(dialog); + return (button == -1 ? 0 : button); + case 'X': + case 'x': + key = KEY_ESC; + break; + case KEY_ESC: + key = on_key_esc(dialog); + break; + case KEY_RESIZE: + delwin(dialog); + on_key_resize(); + goto do_resize; + } + } + + delwin(dialog); + return KEY_ESC; /* ESC pressed */ +} diff --git a/kconfig/lxdialog/menubox.c b/kconfig/lxdialog/menubox.c new file mode 100644 index 00000000..0d83159d --- /dev/null +++ b/kconfig/lxdialog/menubox.c @@ -0,0 +1,434 @@ +/* + * menubox.c -- implements the menu box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcapw@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/* + * Changes by Clifford Wolf (god@clifford.at) + * + * [ 1998-06-13 ] + * + * *) A bugfix for the Page-Down problem + * + * *) Formerly when I used Page Down and Page Up, the cursor would be set + * to the first position in the menu box. Now lxdialog is a bit + * smarter and works more like other menu systems (just have a look at + * it). + * + * *) Formerly if I selected something my scrolling would be broken because + * lxdialog is re-invoked by the Menuconfig shell script, can't + * remember the last scrolling position, and just sets it so that the + * cursor is at the bottom of the box. Now it writes the temporary file + * lxdialog.scrltmp which contains this information. The file is + * deleted by lxdialog if the user leaves a submenu or enters a new + * one, but it would be nice if Menuconfig could make another "rm -f" + * just to be sure. Just try it out - you will recognise a difference! + * + * [ 1998-06-14 ] + * + * *) Now lxdialog is crash-safe against broken "lxdialog.scrltmp" files + * and menus change their size on the fly. + * + * *) If for some reason the last scrolling position is not saved by + * lxdialog, it sets the scrolling so that the selected item is in the + * middle of the menu box, not at the bottom. + * + * 02 January 1999, Michael Elizabeth Chastain (mec@shout.net) + * Reset 'scroll' to 0 if the value from lxdialog.scrltmp is bogus. + * This fixes a bug in Menuconfig where using ' ' to descend into menus + * would leave mis-synchronized lxdialog.scrltmp files lying around, + * fscanf would read in 'scroll', and eventually that value would get used. + */ + +#include "dialog.h" + +static int menu_width, item_x; + +/* + * Print menu item + */ +static void do_print_item(WINDOW * win, const char *item, int line_y, + int selected, int hotkey) +{ + int j; + char *menu_item = malloc(menu_width + 1); + + strncpy(menu_item, item, menu_width - item_x); + menu_item[menu_width - item_x] = '\0'; + j = first_alpha(menu_item, "YyNnMmHh"); + + /* Clear 'residue' of last item */ + wattrset(win, dlg.menubox.atr); + wmove(win, line_y, 0); +#if OLD_NCURSES + { + int i; + for (i = 0; i < menu_width; i++) + waddch(win, ' '); + } +#else + wclrtoeol(win); +#endif + wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr); + mvwaddstr(win, line_y, item_x, menu_item); + if (hotkey) { + wattrset(win, selected ? dlg.tag_key_selected.atr + : dlg.tag_key.atr); + mvwaddch(win, line_y, item_x + j, menu_item[j]); + } + if (selected) { + wmove(win, line_y, item_x + 1); + } + free(menu_item); + wrefresh(win); +} + +#define print_item(index, choice, selected) \ +do { \ + item_set(index); \ + do_print_item(menu, item_str(), choice, selected, !item_is_tag(':')); \ +} while (0) + +/* + * Print the scroll indicators. + */ +static void print_arrows(WINDOW * win, int item_no, int scroll, int y, int x, + int height) +{ + int cur_y, cur_x; + + getyx(win, cur_y, cur_x); + + wmove(win, y, x); + + if (scroll > 0) { + wattrset(win, dlg.uarrow.atr); + waddch(win, ACS_UARROW); + waddstr(win, "(-)"); + } else { + wattrset(win, dlg.menubox.atr); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + } + + y = y + height + 1; + wmove(win, y, x); + wrefresh(win); + + if ((height < item_no) && (scroll + height < item_no)) { + wattrset(win, dlg.darrow.atr); + waddch(win, ACS_DARROW); + waddstr(win, "(+)"); + } else { + wattrset(win, dlg.menubox_border.atr); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + waddch(win, ACS_HLINE); + } + + wmove(win, cur_y, cur_x); + wrefresh(win); +} + +/* + * Display the termination buttons. + */ +static void print_buttons(WINDOW * win, int height, int width, int selected) +{ + int x = width / 2 - 16; + int y = height - 2; + + print_button(win, "Select", y, x, selected == 0); + print_button(win, " Exit ", y, x + 12, selected == 1); + print_button(win, " Help ", y, x + 24, selected == 2); + + wmove(win, y, x + 1 + 12 * selected); + wrefresh(win); +} + +/* scroll up n lines (n may be negative) */ +static void do_scroll(WINDOW *win, int *scroll, int n) +{ + /* Scroll menu up */ + scrollok(win, TRUE); + wscrl(win, n); + scrollok(win, FALSE); + *scroll = *scroll + n; + wrefresh(win); +} + +/* + * Display a menu for choosing among a number of options + */ +int dialog_menu(const char *title, const char *prompt, + const void *selected, int *s_scroll) +{ + int i, j, x, y, box_x, box_y; + int height, width, menu_height; + int key = 0, button = 0, scroll = 0, choice = 0; + int first_item = 0, max_choice; + WINDOW *dialog, *menu; + +do_resize: + height = getmaxy(stdscr); + width = getmaxx(stdscr); + if (height < 15 || width < 65) + return -ERRDISPLAYTOOSMALL; + + height -= 4; + width -= 5; + menu_height = height - 10; + + max_choice = MIN(menu_height, item_count()); + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow(stdscr, y, x, height, width); + + dialog = newwin(height, width, y, x); + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, + dlg.dialog.atr, dlg.border.atr); + wattrset(dialog, dlg.border.atr); + mvwaddch(dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dlg.dialog.atr); + wbkgdset(dialog, dlg.dialog.atr & A_COLOR); + waddch(dialog, ACS_RTEE); + + print_title(dialog, title, width); + + wattrset(dialog, dlg.dialog.atr); + print_autowrap(dialog, prompt, width - 2, 1, 3); + + menu_width = width - 6; + box_y = height - menu_height - 5; + box_x = (width - menu_width) / 2 - 1; + + /* create new window for the menu */ + menu = subwin(dialog, menu_height, menu_width, + y + box_y + 1, x + box_x + 1); + keypad(menu, TRUE); + + /* draw a box around the menu items */ + draw_box(dialog, box_y, box_x, menu_height + 2, menu_width + 2, + dlg.menubox_border.atr, dlg.menubox.atr); + + if (menu_width >= 80) + item_x = (menu_width - 70) / 2; + else + item_x = 4; + + /* Set choice to default item */ + item_foreach() + if (selected && (selected == item_data())) + choice = item_n(); + /* get the saved scroll info */ + scroll = *s_scroll; + if ((scroll <= choice) && (scroll + max_choice > choice) && + (scroll >= 0) && (scroll + max_choice <= item_count())) { + first_item = scroll; + choice = choice - scroll; + } else { + scroll = 0; + } + if ((choice >= max_choice)) { + if (choice >= item_count() - max_choice / 2) + scroll = first_item = item_count() - max_choice; + else + scroll = first_item = choice - max_choice / 2; + choice = choice - scroll; + } + + /* Print the menu */ + for (i = 0; i < max_choice; i++) { + print_item(first_item + i, i, i == choice); + } + + wnoutrefresh(menu); + + print_arrows(dialog, item_count(), scroll, + box_y, box_x + item_x + 1, menu_height); + + print_buttons(dialog, height, width, 0); + wmove(menu, choice, item_x + 1); + wrefresh(menu); + + while (key != KEY_ESC) { + key = wgetch(menu); + + if (key < 256 && isalpha(key)) + key = tolower(key); + + if (strchr("ynmh", key)) + i = max_choice; + else { + for (i = choice + 1; i < max_choice; i++) { + item_set(scroll + i); + j = first_alpha(item_str(), "YyNnMmHh"); + if (key == tolower(item_str()[j])) + break; + } + if (i == max_choice) + for (i = 0; i < max_choice; i++) { + item_set(scroll + i); + j = first_alpha(item_str(), "YyNnMmHh"); + if (key == tolower(item_str()[j])) + break; + } + } + + if (i < max_choice || + key == KEY_UP || key == KEY_DOWN || + key == '-' || key == '+' || + key == KEY_PPAGE || key == KEY_NPAGE) { + /* Remove highligt of current item */ + print_item(scroll + choice, choice, FALSE); + + if (key == KEY_UP || key == '-') { + if (choice < 2 && scroll) { + /* Scroll menu down */ + do_scroll(menu, &scroll, -1); + + print_item(scroll, 0, FALSE); + } else + choice = MAX(choice - 1, 0); + + } else if (key == KEY_DOWN || key == '+') { + print_item(scroll+choice, choice, FALSE); + + if ((choice > max_choice - 3) && + (scroll + max_choice < item_count())) { + /* Scroll menu up */ + do_scroll(menu, &scroll, 1); + + print_item(scroll+max_choice - 1, + max_choice - 1, FALSE); + } else + choice = MIN(choice + 1, max_choice - 1); + + } else if (key == KEY_PPAGE) { + scrollok(menu, TRUE); + for (i = 0; (i < max_choice); i++) { + if (scroll > 0) { + do_scroll(menu, &scroll, -1); + print_item(scroll, 0, FALSE); + } else { + if (choice > 0) + choice--; + } + } + + } else if (key == KEY_NPAGE) { + for (i = 0; (i < max_choice); i++) { + if (scroll + max_choice < item_count()) { + do_scroll(menu, &scroll, 1); + print_item(scroll+max_choice-1, + max_choice - 1, FALSE); + } else { + if (choice + 1 < max_choice) + choice++; + } + } + } else + choice = i; + + print_item(scroll + choice, choice, TRUE); + + print_arrows(dialog, item_count(), scroll, + box_y, box_x + item_x + 1, menu_height); + + wnoutrefresh(dialog); + wrefresh(menu); + + continue; /* wait for another key press */ + } + + switch (key) { + case KEY_LEFT: + case TAB: + case KEY_RIGHT: + button = ((key == KEY_LEFT ? --button : ++button) < 0) + ? 2 : (button > 2 ? 0 : button); + + print_buttons(dialog, height, width, button); + wrefresh(menu); + break; + case ' ': + case 's': + case 'y': + case 'n': + case 'm': + case '/': + /* save scroll info */ + *s_scroll = scroll; + delwin(menu); + delwin(dialog); + item_set(scroll + choice); + item_set_selected(1); + switch (key) { + case 's': + return 3; + case 'y': + return 3; + case 'n': + return 4; + case 'm': + return 5; + case ' ': + return 6; + case '/': + return 7; + } + return 0; + case 'h': + case '?': + button = 2; + case '\n': + *s_scroll = scroll; + delwin(menu); + delwin(dialog); + item_set(scroll + choice); + item_set_selected(1); + return button; + case 'e': + case 'x': + key = KEY_ESC; + break; + case KEY_ESC: + key = on_key_esc(menu); + break; + case KEY_RESIZE: + on_key_resize(); + delwin(menu); + delwin(dialog); + goto do_resize; + } + } + delwin(menu); + delwin(dialog); + return key; /* ESC pressed */ +} diff --git a/kconfig/lxdialog/textbox.c b/kconfig/lxdialog/textbox.c new file mode 100644 index 00000000..fabfc1ad --- /dev/null +++ b/kconfig/lxdialog/textbox.c @@ -0,0 +1,391 @@ +/* + * textbox.c -- implements the text box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +static void back_lines(int n); +static void print_page(WINDOW * win, int height, int width); +static void print_line(WINDOW * win, int row, int width); +static char *get_line(void); +static void print_position(WINDOW * win); + +static int hscroll; +static int begin_reached, end_reached, page_length; +static const char *buf; +static const char *page; + +/* + * refresh window content + */ +static void refresh_text_box(WINDOW *dialog, WINDOW *box, int boxh, int boxw, + int cur_y, int cur_x) +{ + print_page(box, boxh, boxw); + print_position(dialog); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); +} + + +/* + * Display text from a file in a dialog box. + */ +int dialog_textbox(const char *title, const char *tbuf, + int initial_height, int initial_width) +{ + int i, x, y, cur_x, cur_y, key = 0; + int height, width, boxh, boxw; + int passed_end; + WINDOW *dialog, *box; + + begin_reached = 1; + end_reached = 0; + page_length = 0; + hscroll = 0; + buf = tbuf; + page = buf; /* page is pointer to start of page to be displayed */ + +do_resize: + getmaxyx(stdscr, height, width); + if (height < 8 || width < 8) + return -ERRDISPLAYTOOSMALL; + if (initial_height != 0) + height = initial_height; + else + if (height > 4) + height -= 4; + else + height = 0; + if (initial_width != 0) + width = initial_width; + else + if (width > 5) + width -= 5; + else + width = 0; + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow(stdscr, y, x, height, width); + + dialog = newwin(height, width, y, x); + keypad(dialog, TRUE); + + /* Create window for box region, used for scrolling text */ + boxh = height - 4; + boxw = width - 2; + box = subwin(dialog, boxh, boxw, y + 1, x + 1); + wattrset(box, dlg.dialog.atr); + wbkgdset(box, dlg.dialog.atr & A_COLOR); + + keypad(box, TRUE); + + /* register the new window, along with its borders */ + draw_box(dialog, 0, 0, height, width, + dlg.dialog.atr, dlg.border.atr); + + wattrset(dialog, dlg.border.atr); + mvwaddch(dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dlg.dialog.atr); + wbkgdset(dialog, dlg.dialog.atr & A_COLOR); + waddch(dialog, ACS_RTEE); + + print_title(dialog, title, width); + + print_button(dialog, " Exit ", height - 2, width / 2 - 4, TRUE); + wnoutrefresh(dialog); + getyx(dialog, cur_y, cur_x); /* Save cursor position */ + + /* Print first page of text */ + attr_clear(box, boxh, boxw, dlg.dialog.atr); + refresh_text_box(dialog, box, boxh, boxw, cur_y, cur_x); + + while ((key != KEY_ESC) && (key != '\n')) { + key = wgetch(dialog); + switch (key) { + case 'E': /* Exit */ + case 'e': + case 'X': + case 'x': + delwin(box); + delwin(dialog); + return 0; + case 'g': /* First page */ + case KEY_HOME: + if (!begin_reached) { + begin_reached = 1; + page = buf; + refresh_text_box(dialog, box, boxh, boxw, + cur_y, cur_x); + } + break; + case 'G': /* Last page */ + case KEY_END: + + end_reached = 1; + /* point to last char in buf */ + page = buf + strlen(buf); + back_lines(boxh); + refresh_text_box(dialog, box, boxh, boxw, + cur_y, cur_x); + break; + case 'K': /* Previous line */ + case 'k': + case KEY_UP: + if (!begin_reached) { + back_lines(page_length + 1); + + /* We don't call print_page() here but use + * scrolling to ensure faster screen update. + * However, 'end_reached' and 'page_length' + * should still be updated, and 'page' should + * point to start of next page. This is done + * by calling get_line() in the following + * 'for' loop. */ + scrollok(box, TRUE); + wscrl(box, -1); /* Scroll box region down one line */ + scrollok(box, FALSE); + page_length = 0; + passed_end = 0; + for (i = 0; i < boxh; i++) { + if (!i) { + /* print first line of page */ + print_line(box, 0, boxw); + wnoutrefresh(box); + } else + /* Called to update 'end_reached' and 'page' */ + get_line(); + if (!passed_end) + page_length++; + if (end_reached && !passed_end) + passed_end = 1; + } + + print_position(dialog); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); + } + break; + case 'B': /* Previous page */ + case 'b': + case KEY_PPAGE: + if (begin_reached) + break; + back_lines(page_length + boxh); + refresh_text_box(dialog, box, boxh, boxw, + cur_y, cur_x); + break; + case 'J': /* Next line */ + case 'j': + case KEY_DOWN: + if (!end_reached) { + begin_reached = 0; + scrollok(box, TRUE); + scroll(box); /* Scroll box region up one line */ + scrollok(box, FALSE); + print_line(box, boxh - 1, boxw); + wnoutrefresh(box); + print_position(dialog); + wmove(dialog, cur_y, cur_x); /* Restore cursor position */ + wrefresh(dialog); + } + break; + case KEY_NPAGE: /* Next page */ + case ' ': + if (end_reached) + break; + + begin_reached = 0; + refresh_text_box(dialog, box, boxh, boxw, + cur_y, cur_x); + break; + case '0': /* Beginning of line */ + case 'H': /* Scroll left */ + case 'h': + case KEY_LEFT: + if (hscroll <= 0) + break; + + if (key == '0') + hscroll = 0; + else + hscroll--; + /* Reprint current page to scroll horizontally */ + back_lines(page_length); + refresh_text_box(dialog, box, boxh, boxw, + cur_y, cur_x); + break; + case 'L': /* Scroll right */ + case 'l': + case KEY_RIGHT: + if (hscroll >= MAX_LEN) + break; + hscroll++; + /* Reprint current page to scroll horizontally */ + back_lines(page_length); + refresh_text_box(dialog, box, boxh, boxw, + cur_y, cur_x); + break; + case KEY_ESC: + key = on_key_esc(dialog); + break; + case KEY_RESIZE: + back_lines(height); + delwin(box); + delwin(dialog); + on_key_resize(); + goto do_resize; + } + } + delwin(box); + delwin(dialog); + return key; /* ESC pressed */ +} + +/* + * Go back 'n' lines in text. Called by dialog_textbox(). + * 'page' will be updated to point to the desired line in 'buf'. + */ +static void back_lines(int n) +{ + int i; + + begin_reached = 0; + /* Go back 'n' lines */ + for (i = 0; i < n; i++) { + if (*page == '\0') { + if (end_reached) { + end_reached = 0; + continue; + } + } + if (page == buf) { + begin_reached = 1; + return; + } + page--; + do { + if (page == buf) { + begin_reached = 1; + return; + } + page--; + } while (*page != '\n'); + page++; + } +} + +/* + * Print a new page of text. Called by dialog_textbox(). + */ +static void print_page(WINDOW * win, int height, int width) +{ + int i, passed_end = 0; + + page_length = 0; + for (i = 0; i < height; i++) { + print_line(win, i, width); + if (!passed_end) + page_length++; + if (end_reached && !passed_end) + passed_end = 1; + } + wnoutrefresh(win); +} + +/* + * Print a new line of text. Called by dialog_textbox() and print_page(). + */ +static void print_line(WINDOW * win, int row, int width) +{ + int y, x; + char *line; + + line = get_line(); + line += MIN(strlen(line), hscroll); /* Scroll horizontally */ + wmove(win, row, 0); /* move cursor to correct line */ + waddch(win, ' '); + waddnstr(win, line, MIN(strlen(line), width - 2)); + + getyx(win, y, x); + /* Clear 'residue' of previous line */ +#if OLD_NCURSES + { + int i; + for (i = 0; i < width - x; i++) + waddch(win, ' '); + } +#else + wclrtoeol(win); +#endif +} + +/* + * Return current line of text. Called by dialog_textbox() and print_line(). + * 'page' should point to start of current line before calling, and will be + * updated to point to start of next line. + */ +static char *get_line(void) +{ + int i = 0; + static char line[MAX_LEN + 1]; + + end_reached = 0; + while (*page != '\n') { + if (*page == '\0') { + if (!end_reached) { + end_reached = 1; + break; + } + } else if (i < MAX_LEN) + line[i++] = *(page++); + else { + /* Truncate lines longer than MAX_LEN characters */ + if (i == MAX_LEN) + line[i++] = '\0'; + page++; + } + } + if (i <= MAX_LEN) + line[i] = '\0'; + if (!end_reached) + page++; /* move pass '\n' */ + + return line; +} + +/* + * Print current position + */ +static void print_position(WINDOW * win) +{ + int percent; + + wattrset(win, dlg.position_indicator.atr); + wbkgdset(win, dlg.position_indicator.atr & A_COLOR); + percent = (page - buf) * 100 / strlen(buf); + wmove(win, getmaxy(win) - 3, getmaxx(win) - 9); + wprintw(win, "(%3d%%)", percent); +} diff --git a/kconfig/lxdialog/util.c b/kconfig/lxdialog/util.c new file mode 100644 index 00000000..ebc781b4 --- /dev/null +++ b/kconfig/lxdialog/util.c @@ -0,0 +1,642 @@ +/* + * util.c + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +struct dialog_info dlg; + +static void set_mono_theme(void) +{ + dlg.screen.atr = A_NORMAL; + dlg.shadow.atr = A_NORMAL; + dlg.dialog.atr = A_NORMAL; + dlg.title.atr = A_BOLD; + dlg.border.atr = A_NORMAL; + dlg.button_active.atr = A_REVERSE; + dlg.button_inactive.atr = A_DIM; + dlg.button_key_active.atr = A_REVERSE; + dlg.button_key_inactive.atr = A_BOLD; + dlg.button_label_active.atr = A_REVERSE; + dlg.button_label_inactive.atr = A_NORMAL; + dlg.inputbox.atr = A_NORMAL; + dlg.inputbox_border.atr = A_NORMAL; + dlg.searchbox.atr = A_NORMAL; + dlg.searchbox_title.atr = A_BOLD; + dlg.searchbox_border.atr = A_NORMAL; + dlg.position_indicator.atr = A_BOLD; + dlg.menubox.atr = A_NORMAL; + dlg.menubox_border.atr = A_NORMAL; + dlg.item.atr = A_NORMAL; + dlg.item_selected.atr = A_REVERSE; + dlg.tag.atr = A_BOLD; + dlg.tag_selected.atr = A_REVERSE; + dlg.tag_key.atr = A_BOLD; + dlg.tag_key_selected.atr = A_REVERSE; + dlg.check.atr = A_BOLD; + dlg.check_selected.atr = A_REVERSE; + dlg.uarrow.atr = A_BOLD; + dlg.darrow.atr = A_BOLD; +} + +#define DLG_COLOR(dialog, f, b, h) \ +do { \ + dlg.dialog.fg = (f); \ + dlg.dialog.bg = (b); \ + dlg.dialog.hl = (h); \ +} while (0) + +static void set_classic_theme(void) +{ + DLG_COLOR(screen, COLOR_CYAN, COLOR_BLUE, true); + DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, true); + DLG_COLOR(dialog, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(title, COLOR_YELLOW, COLOR_WHITE, true); + DLG_COLOR(border, COLOR_WHITE, COLOR_WHITE, true); + DLG_COLOR(button_active, COLOR_WHITE, COLOR_BLUE, true); + DLG_COLOR(button_inactive, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(button_key_active, COLOR_WHITE, COLOR_BLUE, true); + DLG_COLOR(button_key_inactive, COLOR_RED, COLOR_WHITE, false); + DLG_COLOR(button_label_active, COLOR_YELLOW, COLOR_BLUE, true); + DLG_COLOR(button_label_inactive, COLOR_BLACK, COLOR_WHITE, true); + DLG_COLOR(inputbox, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(inputbox_border, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(searchbox, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(searchbox_title, COLOR_YELLOW, COLOR_WHITE, true); + DLG_COLOR(searchbox_border, COLOR_WHITE, COLOR_WHITE, true); + DLG_COLOR(position_indicator, COLOR_YELLOW, COLOR_WHITE, true); + DLG_COLOR(menubox, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(menubox_border, COLOR_WHITE, COLOR_WHITE, true); + DLG_COLOR(item, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(item_selected, COLOR_WHITE, COLOR_BLUE, true); + DLG_COLOR(tag, COLOR_YELLOW, COLOR_WHITE, true); + DLG_COLOR(tag_selected, COLOR_YELLOW, COLOR_BLUE, true); + DLG_COLOR(tag_key, COLOR_YELLOW, COLOR_WHITE, true); + DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_BLUE, true); + DLG_COLOR(check, COLOR_BLACK, COLOR_WHITE, false); + DLG_COLOR(check_selected, COLOR_WHITE, COLOR_BLUE, true); + DLG_COLOR(uarrow, COLOR_GREEN, COLOR_WHITE, true); + DLG_COLOR(darrow, COLOR_GREEN, COLOR_WHITE, true); +} + +static void set_blackbg_theme(void) +{ + DLG_COLOR(screen, COLOR_RED, COLOR_BLACK, true); + DLG_COLOR(shadow, COLOR_BLACK, COLOR_BLACK, false); + DLG_COLOR(dialog, COLOR_WHITE, COLOR_BLACK, false); + DLG_COLOR(title, COLOR_RED, COLOR_BLACK, false); + DLG_COLOR(border, COLOR_BLACK, COLOR_BLACK, true); + + DLG_COLOR(button_active, COLOR_YELLOW, COLOR_RED, false); + DLG_COLOR(button_inactive, COLOR_YELLOW, COLOR_BLACK, false); + DLG_COLOR(button_key_active, COLOR_YELLOW, COLOR_RED, true); + DLG_COLOR(button_key_inactive, COLOR_RED, COLOR_BLACK, false); + DLG_COLOR(button_label_active, COLOR_WHITE, COLOR_RED, false); + DLG_COLOR(button_label_inactive, COLOR_BLACK, COLOR_BLACK, true); + + DLG_COLOR(inputbox, COLOR_YELLOW, COLOR_BLACK, false); + DLG_COLOR(inputbox_border, COLOR_YELLOW, COLOR_BLACK, false); + + DLG_COLOR(searchbox, COLOR_YELLOW, COLOR_BLACK, false); + DLG_COLOR(searchbox_title, COLOR_YELLOW, COLOR_BLACK, true); + DLG_COLOR(searchbox_border, COLOR_BLACK, COLOR_BLACK, true); + + DLG_COLOR(position_indicator, COLOR_RED, COLOR_BLACK, false); + + DLG_COLOR(menubox, COLOR_YELLOW, COLOR_BLACK, false); + DLG_COLOR(menubox_border, COLOR_BLACK, COLOR_BLACK, true); + + DLG_COLOR(item, COLOR_WHITE, COLOR_BLACK, false); + DLG_COLOR(item_selected, COLOR_WHITE, COLOR_RED, false); + + DLG_COLOR(tag, COLOR_RED, COLOR_BLACK, false); + DLG_COLOR(tag_selected, COLOR_YELLOW, COLOR_RED, true); + DLG_COLOR(tag_key, COLOR_RED, COLOR_BLACK, false); + DLG_COLOR(tag_key_selected, COLOR_YELLOW, COLOR_RED, true); + + DLG_COLOR(check, COLOR_YELLOW, COLOR_BLACK, false); + DLG_COLOR(check_selected, COLOR_YELLOW, COLOR_RED, true); + + DLG_COLOR(uarrow, COLOR_RED, COLOR_BLACK, false); + DLG_COLOR(darrow, COLOR_RED, COLOR_BLACK, false); +} + +static void set_bluetitle_theme(void) +{ + set_classic_theme(); + DLG_COLOR(title, COLOR_BLUE, COLOR_WHITE, true); + DLG_COLOR(button_key_active, COLOR_YELLOW, COLOR_BLUE, true); + DLG_COLOR(button_label_active, COLOR_WHITE, COLOR_BLUE, true); + DLG_COLOR(searchbox_title, COLOR_BLUE, COLOR_WHITE, true); + DLG_COLOR(position_indicator, COLOR_BLUE, COLOR_WHITE, true); + DLG_COLOR(tag, COLOR_BLUE, COLOR_WHITE, true); + DLG_COLOR(tag_key, COLOR_BLUE, COLOR_WHITE, true); + +} + +/* + * Select color theme + */ +static int set_theme(const char *theme) +{ + int use_color = 1; + if (!theme) + set_bluetitle_theme(); + else if (strcmp(theme, "classic") == 0) + set_classic_theme(); + else if (strcmp(theme, "bluetitle") == 0) + set_bluetitle_theme(); + else if (strcmp(theme, "blackbg") == 0) + set_blackbg_theme(); + else if (strcmp(theme, "mono") == 0) + use_color = 0; + + return use_color; +} + +static void init_one_color(struct dialog_color *color) +{ + static int pair = 0; + + pair++; + init_pair(pair, color->fg, color->bg); + if (color->hl) + color->atr = A_BOLD | COLOR_PAIR(pair); + else + color->atr = COLOR_PAIR(pair); +} + +static void init_dialog_colors(void) +{ + init_one_color(&dlg.screen); + init_one_color(&dlg.shadow); + init_one_color(&dlg.dialog); + init_one_color(&dlg.title); + init_one_color(&dlg.border); + init_one_color(&dlg.button_active); + init_one_color(&dlg.button_inactive); + init_one_color(&dlg.button_key_active); + init_one_color(&dlg.button_key_inactive); + init_one_color(&dlg.button_label_active); + init_one_color(&dlg.button_label_inactive); + init_one_color(&dlg.inputbox); + init_one_color(&dlg.inputbox_border); + init_one_color(&dlg.searchbox); + init_one_color(&dlg.searchbox_title); + init_one_color(&dlg.searchbox_border); + init_one_color(&dlg.position_indicator); + init_one_color(&dlg.menubox); + init_one_color(&dlg.menubox_border); + init_one_color(&dlg.item); + init_one_color(&dlg.item_selected); + init_one_color(&dlg.tag); + init_one_color(&dlg.tag_selected); + init_one_color(&dlg.tag_key); + init_one_color(&dlg.tag_key_selected); + init_one_color(&dlg.check); + init_one_color(&dlg.check_selected); + init_one_color(&dlg.uarrow); + init_one_color(&dlg.darrow); +} + +/* + * Setup for color display + */ +static void color_setup(const char *theme) +{ + if (set_theme(theme)) { + if (has_colors()) { /* Terminal supports color? */ + start_color(); + init_dialog_colors(); + } + } + else + { + set_mono_theme(); + } +} + +/* + * Set window to attribute 'attr' + */ +void attr_clear(WINDOW * win, int height, int width, chtype attr) +{ + int i, j; + + wattrset(win, attr); + for (i = 0; i < height; i++) { + wmove(win, i, 0); + for (j = 0; j < width; j++) + waddch(win, ' '); + } + touchwin(win); +} + +void dialog_clear(void) +{ + attr_clear(stdscr, LINES, COLS, dlg.screen.atr); + /* Display background title if it exists ... - SLH */ + if (dlg.backtitle != NULL) { + int i; + + wattrset(stdscr, dlg.screen.atr); + mvwaddstr(stdscr, 0, 1, (char *)dlg.backtitle); + wmove(stdscr, 1, 1); + for (i = 1; i < COLS - 1; i++) + waddch(stdscr, ACS_HLINE); + } + wnoutrefresh(stdscr); +} + +/* + * Do some initialization for dialog + */ +void init_dialog(const char *backtitle) +{ + dlg.backtitle = backtitle; + color_setup(getenv("MENUCONFIG_COLOR")); +} + +void reset_dialog(void) +{ + initscr(); /* Init curses */ + keypad(stdscr, TRUE); + cbreak(); + noecho(); + dialog_clear(); +} + +/* + * End using dialog functions. + */ +void end_dialog(void) +{ + endwin(); +} + +/* Print the title of the dialog. Center the title and truncate + * tile if wider than dialog (- 2 chars). + **/ +void print_title(WINDOW *dialog, const char *title, int width) +{ + if (title) { + int tlen = MIN(width - 2, strlen(title)); + wattrset(dialog, dlg.title.atr); + mvwaddch(dialog, 0, (width - tlen) / 2 - 1, ' '); + mvwaddnstr(dialog, 0, (width - tlen)/2, title, tlen); + waddch(dialog, ' '); + } +} + +/* + * Print a string of text in a window, automatically wrap around to the + * next line if the string is too long to fit on one line. Newline + * characters '\n' are replaced by spaces. We start on a new line + * if there is no room for at least 4 nonblanks following a double-space. + */ +void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x) +{ + int newl, cur_x, cur_y; + int i, prompt_len, room, wlen; + char tempstr[MAX_LEN + 1], *word, *sp, *sp2; + + strcpy(tempstr, prompt); + + prompt_len = strlen(tempstr); + + /* + * Remove newlines + */ + for (i = 0; i < prompt_len; i++) { + if (tempstr[i] == '\n') + tempstr[i] = ' '; + } + + if (prompt_len <= width - x * 2) { /* If prompt is short */ + wmove(win, y, (width - prompt_len) / 2); + waddstr(win, tempstr); + } else { + cur_x = x; + cur_y = y; + newl = 1; + word = tempstr; + while (word && *word) { + sp = index(word, ' '); + if (sp) + *sp++ = 0; + + /* Wrap to next line if either the word does not fit, + or it is the first word of a new sentence, and it is + short, and the next word does not fit. */ + room = width - cur_x; + wlen = strlen(word); + if (wlen > room || + (newl && wlen < 4 && sp + && wlen + 1 + strlen(sp) > room + && (!(sp2 = index(sp, ' ')) + || wlen + 1 + (sp2 - sp) > room))) { + cur_y++; + cur_x = x; + } + wmove(win, cur_y, cur_x); + waddstr(win, word); + getyx(win, cur_y, cur_x); + cur_x++; + if (sp && *sp == ' ') { + cur_x++; /* double space */ + while (*++sp == ' ') ; + newl = 1; + } else + newl = 0; + word = sp; + } + } +} + +/* + * Print a button + */ +void print_button(WINDOW * win, const char *label, int y, int x, int selected) +{ + int i, temp; + + wmove(win, y, x); + wattrset(win, selected ? dlg.button_active.atr + : dlg.button_inactive.atr); + waddstr(win, "<"); + temp = strspn(label, " "); + label += temp; + wattrset(win, selected ? dlg.button_label_active.atr + : dlg.button_label_inactive.atr); + for (i = 0; i < temp; i++) + waddch(win, ' '); + wattrset(win, selected ? dlg.button_key_active.atr + : dlg.button_key_inactive.atr); + waddch(win, label[0]); + wattrset(win, selected ? dlg.button_label_active.atr + : dlg.button_label_inactive.atr); + waddstr(win, (char *)label + 1); + wattrset(win, selected ? dlg.button_active.atr + : dlg.button_inactive.atr); + waddstr(win, ">"); + wmove(win, y, x + temp + 1); +} + +/* + * Draw a rectangular box with line drawing characters + */ +void +draw_box(WINDOW * win, int y, int x, int height, int width, + chtype box, chtype border) +{ + int i, j; + + wattrset(win, 0); + for (i = 0; i < height; i++) { + wmove(win, y + i, x); + for (j = 0; j < width; j++) + if (!i && !j) + waddch(win, border | ACS_ULCORNER); + else if (i == height - 1 && !j) + waddch(win, border | ACS_LLCORNER); + else if (!i && j == width - 1) + waddch(win, box | ACS_URCORNER); + else if (i == height - 1 && j == width - 1) + waddch(win, box | ACS_LRCORNER); + else if (!i) + waddch(win, border | ACS_HLINE); + else if (i == height - 1) + waddch(win, box | ACS_HLINE); + else if (!j) + waddch(win, border | ACS_VLINE); + else if (j == width - 1) + waddch(win, box | ACS_VLINE); + else + waddch(win, box | ' '); + } +} + +/* + * Draw shadows along the right and bottom edge to give a more 3D look + * to the boxes + */ +void draw_shadow(WINDOW * win, int y, int x, int height, int width) +{ + int i; + + if (has_colors()) { /* Whether terminal supports color? */ + wattrset(win, dlg.shadow.atr); + wmove(win, y + height, x + 2); + for (i = 0; i < width; i++) + waddch(win, winch(win) & A_CHARTEXT); + for (i = y + 1; i < y + height + 1; i++) { + wmove(win, i, x + width); + waddch(win, winch(win) & A_CHARTEXT); + waddch(win, winch(win) & A_CHARTEXT); + } + wnoutrefresh(win); + } +} + +/* + * Return the position of the first alphabetic character in a string. + */ +int first_alpha(const char *string, const char *exempt) +{ + int i, in_paren = 0, c; + + for (i = 0; i < strlen(string); i++) { + c = tolower(string[i]); + + if (strchr("<[(", c)) + ++in_paren; + if (strchr(">])", c) && in_paren > 0) + --in_paren; + + if ((!in_paren) && isalpha(c) && strchr(exempt, c) == 0) + return i; + } + + return 0; +} + +/* + * ncurses uses ESC to detect escaped char sequences. This resutl in + * a small timeout before ESC is actually delivered to the application. + * lxdialog suggest <ESC> <ESC> which is correctly translated to two + * times esc. But then we need to ignore the second esc to avoid stepping + * out one menu too much. Filter away all escaped key sequences since + * keypad(FALSE) turn off ncurses support for escape sequences - and thats + * needed to make notimeout() do as expected. + */ +int on_key_esc(WINDOW *win) +{ + int key; + int key2; + int key3; + + nodelay(win, TRUE); + keypad(win, FALSE); + key = wgetch(win); + key2 = wgetch(win); + do { + key3 = wgetch(win); + } while (key3 != ERR); + nodelay(win, FALSE); + keypad(win, TRUE); + if (key == KEY_ESC && key2 == ERR) + return KEY_ESC; + else if (key != ERR && key != KEY_ESC && key2 == ERR) + ungetch(key); + + return -1; +} + +/* redraw screen in new size */ +int on_key_resize(void) +{ + dialog_clear(); + return KEY_RESIZE; +} + +struct dialog_list *item_cur; +struct dialog_list item_nil; +struct dialog_list *item_head; + +void item_reset(void) +{ + struct dialog_list *p, *next; + + for (p = item_head; p; p = next) { + next = p->next; + free(p); + } + item_head = NULL; + item_cur = &item_nil; +} + +void item_make(const char *fmt, ...) +{ + va_list ap; + struct dialog_list *p = malloc(sizeof(*p)); + + if (item_head) + item_cur->next = p; + else + item_head = p; + item_cur = p; + memset(p, 0, sizeof(*p)); + + va_start(ap, fmt); + vsnprintf(item_cur->node.str, sizeof(item_cur->node.str), fmt, ap); + va_end(ap); +} + +void item_add_str(const char *fmt, ...) +{ + va_list ap; + size_t avail; + + avail = sizeof(item_cur->node.str) - strlen(item_cur->node.str); + + va_start(ap, fmt); + vsnprintf(item_cur->node.str + strlen(item_cur->node.str), + avail, fmt, ap); + item_cur->node.str[sizeof(item_cur->node.str) - 1] = '\0'; + va_end(ap); +} + +void item_set_tag(char tag) +{ + item_cur->node.tag = tag; +} +void item_set_data(void *ptr) +{ + item_cur->node.data = ptr; +} + +void item_set_selected(int val) +{ + item_cur->node.selected = val; +} + +int item_activate_selected(void) +{ + item_foreach() + if (item_is_selected()) + return 1; + return 0; +} + +void *item_data(void) +{ + return item_cur->node.data; +} + +char item_tag(void) +{ + return item_cur->node.tag; +} + +int item_count(void) +{ + int n = 0; + struct dialog_list *p; + + for (p = item_head; p; p = p->next) + n++; + return n; +} + +void item_set(int n) +{ + int i = 0; + item_foreach() + if (i++ == n) + return; +} + +int item_n(void) +{ + int n = 0; + struct dialog_list *p; + + for (p = item_head; p; p = p->next) { + if (p == item_cur) + return n; + n++; + } + return 0; +} + +const char *item_str(void) +{ + return item_cur->node.str; +} + +int item_is_selected(void) +{ + return (item_cur->node.selected != 0); +} + +int item_is_tag(char tag) +{ + return (item_cur->node.tag == tag); +} diff --git a/kconfig/lxdialog/yesno.c b/kconfig/lxdialog/yesno.c new file mode 100644 index 00000000..ee0a04e3 --- /dev/null +++ b/kconfig/lxdialog/yesno.c @@ -0,0 +1,114 @@ +/* + * yesno.c -- implements the yes/no box + * + * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) + * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "dialog.h" + +/* + * Display termination buttons + */ +static void print_buttons(WINDOW * dialog, int height, int width, int selected) +{ + int x = width / 2 - 10; + int y = height - 2; + + print_button(dialog, " Yes ", y, x, selected == 0); + print_button(dialog, " No ", y, x + 13, selected == 1); + + wmove(dialog, y, x + 1 + 13 * selected); + wrefresh(dialog); +} + +/* + * Display a dialog box with two buttons - Yes and No + */ +int dialog_yesno(const char *title, const char *prompt, int height, int width) +{ + int i, x, y, key = 0, button = 0; + WINDOW *dialog; + +do_resize: + if (getmaxy(stdscr) < (height + 4)) + return -ERRDISPLAYTOOSMALL; + if (getmaxx(stdscr) < (width + 4)) + return -ERRDISPLAYTOOSMALL; + + /* center dialog box on screen */ + x = (COLS - width) / 2; + y = (LINES - height) / 2; + + draw_shadow(stdscr, y, x, height, width); + + dialog = newwin(height, width, y, x); + keypad(dialog, TRUE); + + draw_box(dialog, 0, 0, height, width, + dlg.dialog.atr, dlg.border.atr); + wattrset(dialog, dlg.border.atr); + mvwaddch(dialog, height - 3, 0, ACS_LTEE); + for (i = 0; i < width - 2; i++) + waddch(dialog, ACS_HLINE); + wattrset(dialog, dlg.dialog.atr); + waddch(dialog, ACS_RTEE); + + print_title(dialog, title, width); + + wattrset(dialog, dlg.dialog.atr); + print_autowrap(dialog, prompt, width - 2, 1, 3); + + print_buttons(dialog, height, width, 0); + + while (key != KEY_ESC) { + key = wgetch(dialog); + switch (key) { + case 'Y': + case 'y': + delwin(dialog); + return 0; + case 'N': + case 'n': + delwin(dialog); + return 1; + + case TAB: + case KEY_LEFT: + case KEY_RIGHT: + button = ((key == KEY_LEFT ? --button : ++button) < 0) ? 1 : (button > 1 ? 0 : button); + + print_buttons(dialog, height, width, button); + wrefresh(dialog); + break; + case ' ': + case '\n': + delwin(dialog); + return button; + case KEY_ESC: + key = on_key_esc(dialog); + break; + case KEY_RESIZE: + delwin(dialog); + on_key_resize(); + goto do_resize; + } + } + + delwin(dialog); + return key; /* ESC pressed */ +} diff --git a/kconfig/mconf.c b/kconfig/mconf.c new file mode 100644 index 00000000..8f268bec --- /dev/null +++ b/kconfig/mconf.c @@ -0,0 +1,919 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + * + * Introduced single menu mode (show all sub-menus in one large tree). + * 2002-11-06 Petr Baudis <pasky@ucw.cz> + * + * i18n, 2005, Arnaldo Carvalho de Melo <acme@conectiva.com.br> + */ + +#include <sys/ioctl.h> +#include <sys/wait.h> +#include <ctype.h> +#include <errno.h> +#include <fcntl.h> +#include <limits.h> +#include <signal.h> +#include <stdarg.h> +#include <stdlib.h> +#include <string.h> +#include <termios.h> +#include <unistd.h> +#include <locale.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" +#include "lxdialog/dialog.h" + +static char menu_backtitle[128]; +static const char mconf_readme[] = N_( +"Overview\n" +"--------\n" +"Some kernel features may be built directly into the kernel.\n" +"Some may be made into loadable runtime modules. Some features\n" +"may be completely removed altogether. There are also certain\n" +"kernel parameters which are not really features, but must be\n" +"entered in as decimal or hexadecimal numbers or possibly text.\n" +"\n" +"Menu items beginning with [*], <M> or [ ] represent features\n" +"configured to be built in, modularized or removed respectively.\n" +"Pointed brackets <> represent module capable features.\n" +"\n" +"To change any of these features, highlight it with the cursor\n" +"keys and press <Y> to build it in, <M> to make it a module or\n" +"<N> to removed it. You may also press the <Space Bar> to cycle\n" +"through the available options (ie. Y->N->M->Y).\n" +"\n" +"Some additional keyboard hints:\n" +"\n" +"Menus\n" +"----------\n" +"o Use the Up/Down arrow keys (cursor keys) to highlight the item\n" +" you wish to change or submenu wish to select and press <Enter>.\n" +" Submenus are designated by \"--->\".\n" +"\n" +" Shortcut: Press the option's highlighted letter (hotkey).\n" +" Pressing a hotkey more than once will sequence\n" +" through all visible items which use that hotkey.\n" +"\n" +" You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n" +" unseen options into view.\n" +"\n" +"o To exit a menu use the cursor keys to highlight the <Exit> button\n" +" and press <ENTER>.\n" +"\n" +" Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey\n" +" using those letters. You may press a single <ESC>, but\n" +" there is a delayed response which you may find annoying.\n" +"\n" +" Also, the <TAB> and cursor keys will cycle between <Select>,\n" +" <Exit> and <Help>\n" +"\n" +"o To get help with an item, use the cursor keys to highlight <Help>\n" +" and Press <ENTER>.\n" +"\n" +" Shortcut: Press <H> or <?>.\n" +"\n" +"\n" +"Radiolists (Choice lists)\n" +"-----------\n" +"o Use the cursor keys to select the option you wish to set and press\n" +" <S> or the <SPACE BAR>.\n" +"\n" +" Shortcut: Press the first letter of the option you wish to set then\n" +" press <S> or <SPACE BAR>.\n" +"\n" +"o To see available help for the item, use the cursor keys to highlight\n" +" <Help> and Press <ENTER>.\n" +"\n" +" Shortcut: Press <H> or <?>.\n" +"\n" +" Also, the <TAB> and cursor keys will cycle between <Select> and\n" +" <Help>\n" +"\n" +"\n" +"Data Entry\n" +"-----------\n" +"o Enter the requested information and press <ENTER>\n" +" If you are entering hexadecimal values, it is not necessary to\n" +" add the '0x' prefix to the entry.\n" +"\n" +"o For help, use the <TAB> or cursor keys to highlight the help option\n" +" and press <ENTER>. You can try <TAB><H> as well.\n" +"\n" +"\n" +"Text Box (Help Window)\n" +"--------\n" +"o Use the cursor keys to scroll up/down/left/right. The VI editor\n" +" keys h,j,k,l function here as do <SPACE BAR> and <B> for those\n" +" who are familiar with less and lynx.\n" +"\n" +"o Press <E>, <X>, <Enter> or <Esc><Esc> to exit.\n" +"\n" +"\n" +"Alternate Configuration Files\n" +"-----------------------------\n" +"Menuconfig supports the use of alternate configuration files for\n" +"those who, for various reasons, find it necessary to switch\n" +"between different kernel configurations.\n" +"\n" +"At the end of the main menu you will find two options. One is\n" +"for saving the current configuration to a file of your choosing.\n" +"The other option is for loading a previously saved alternate\n" +"configuration.\n" +"\n" +"Even if you don't use alternate configuration files, but you\n" +"find during a Menuconfig session that you have completely messed\n" +"up your settings, you may use the \"Load Alternate...\" option to\n" +"restore your previously saved settings from \".config\" without\n" +"restarting Menuconfig.\n" +"\n" +"Other information\n" +"-----------------\n" +"If you use Menuconfig in an XTERM window make sure you have your\n" +"$TERM variable set to point to a xterm definition which supports color.\n" +"Otherwise, Menuconfig will look rather bad. Menuconfig will not\n" +"display correctly in a RXVT window because rxvt displays only one\n" +"intensity of color, bright.\n" +"\n" +"Menuconfig will display larger menus on screens or xterms which are\n" +"set to display more than the standard 25 row by 80 column geometry.\n" +"In order for this to work, the \"stty size\" command must be able to\n" +"display the screen's current row and column geometry. I STRONGLY\n" +"RECOMMEND that you make sure you do NOT have the shell variables\n" +"LINES and COLUMNS exported into your environment. Some distributions\n" +"export those variables via /etc/profile. Some ncurses programs can\n" +"become confused when those variables (LINES & COLUMNS) don't reflect\n" +"the true screen size.\n" +"\n" +"Optional personality available\n" +"------------------------------\n" +"If you prefer to have all of the kernel options listed in a single\n" +"menu, rather than the default multimenu hierarchy, run the menuconfig\n" +"with MENUCONFIG_MODE environment variable set to single_menu. Example:\n" +"\n" +"make MENUCONFIG_MODE=single_menu menuconfig\n" +"\n" +"<Enter> will then unroll the appropriate category, or enfold it if it\n" +"is already unrolled.\n" +"\n" +"Note that this mode can eventually be a little more CPU expensive\n" +"(especially with a larger number of unrolled categories) than the\n" +"default mode.\n" +"\n" +"Different color themes available\n" +"--------------------------------\n" +"It is possible to select different color themes using the variable\n" +"MENUCONFIG_COLOR. To select a theme use:\n" +"\n" +"make MENUCONFIG_COLOR=<theme> menuconfig\n" +"\n" +"Available themes are\n" +" mono => selects colors suitable for monochrome displays\n" +" blackbg => selects a color scheme with black background\n" +" classic => theme with blue background. The classic look\n" +" bluetitle => a LCD friendly version of classic. (default)\n" +"\n"), +menu_instructions[] = N_( + "Arrow keys navigate the menu. " + "<Enter> selects submenus --->. " + "Highlighted letters are hotkeys. " + "Pressing <Y> includes, <N> excludes, <M> modularizes features. " + "Press <Esc><Esc> to exit, <?> for Help, </> for Search. " + "Legend: [*] built-in [ ] excluded <M> module < > module capable"), +radiolist_instructions[] = N_( + "Use the arrow keys to navigate this window or " + "press the hotkey of the item you wish to select " + "followed by the <SPACE BAR>. " + "Press <?> for additional information about this option."), +inputbox_instructions_int[] = N_( + "Please enter a decimal value. " + "Fractions will not be accepted. " + "Use the <TAB> key to move from the input field to the buttons below it."), +inputbox_instructions_hex[] = N_( + "Please enter a hexadecimal value. " + "Use the <TAB> key to move from the input field to the buttons below it."), +inputbox_instructions_string[] = N_( + "Please enter a string value. " + "Use the <TAB> key to move from the input field to the buttons below it."), +setmod_text[] = N_( + "This feature depends on another which has been configured as a module.\n" + "As a result, this feature will be built as a module."), +nohelp_text[] = N_( + "There is no help available for this kernel option.\n"), +load_config_text[] = N_( + "Enter the name of the configuration file you wish to load. " + "Accept the name shown to restore the configuration you " + "last retrieved. Leave blank to abort."), +load_config_help[] = N_( + "\n" + "For various reasons, one may wish to keep several different kernel\n" + "configurations available on a single machine.\n" + "\n" + "If you have saved a previous configuration in a file other than the\n" + "kernel's default, entering the name of the file here will allow you\n" + "to modify that configuration.\n" + "\n" + "If you are uncertain, then you have probably never used alternate\n" + "configuration files. You should therefor leave this blank to abort.\n"), +save_config_text[] = N_( + "Enter a filename to which this configuration should be saved " + "as an alternate. Leave blank to abort."), +save_config_help[] = N_( + "\n" + "For various reasons, one may wish to keep different kernel\n" + "configurations available on a single machine.\n" + "\n" + "Entering a file name here will allow you to later retrieve, modify\n" + "and use the current configuration as an alternate to whatever\n" + "configuration options you have selected at that time.\n" + "\n" + "If you are uncertain what all this means then you should probably\n" + "leave this blank.\n"), +search_help[] = N_( + "\n" + "Search for CT_ symbols and display their relations.\n" + "Regular expressions are allowed.\n" + "Example: search for \"^FOO\"\n" + "Result:\n" + "-----------------------------------------------------------------\n" + "Symbol: FOO [=m]\n" + "Prompt: Foo bus is used to drive the bar HW\n" + "Defined at drivers/pci/Kconfig:47\n" + "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n" + "Location:\n" + " -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n" + " -> PCI support (PCI [=y])\n" + " -> PCI access mode (<choice> [=y])\n" + "Selects: LIBCRC32\n" + "Selected by: BAR\n" + "-----------------------------------------------------------------\n" + "o The line 'Prompt:' shows the text used in the menu structure for\n" + " this CT_ symbol\n" + "o The 'Defined at' line tell at what file / line number the symbol\n" + " is defined\n" + "o The 'Depends on:' line tell what symbols needs to be defined for\n" + " this symbol to be visible in the menu (selectable)\n" + "o The 'Location:' lines tell where in the menu structure this symbol\n" + " is located\n" + " A location followed by a [=y] indicate that this is a selectable\n" + " menu item - and current value is displayed inside brackets.\n" + "o The 'Selects:' line tell what symbol will be automatically\n" + " selected if this symbol is selected (y or m)\n" + "o The 'Selected by' line tell what symbol has selected this symbol\n" + "\n" + "Only relevant lines are shown.\n" + "\n\n" + "Search examples:\n" + "Examples: USB => find all CT_ symbols containing USB\n" + " ^USB => find all CT_ symbols starting with USB\n" + " USB$ => find all CT_ symbols ending with USB\n" + "\n"); + +static char filename[PATH_MAX+1] = ".config"; +static int indent; +static struct termios ios_org; +static int rows = 0, cols = 0; +static struct menu *current_menu; +static int child_count; +static int single_menu_mode; + +static void conf(struct menu *menu); +static void conf_choice(struct menu *menu); +static void conf_string(struct menu *menu); +static void conf_load(void); +static void conf_save(void); +static void show_textbox(const char *title, const char *text, int r, int c); +static void show_helptext(const char *title, const char *text); +static void show_help(struct menu *menu); + +static void init_wsize(void) +{ + struct winsize ws; + char *env; + + if (!ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)) { + rows = ws.ws_row; + cols = ws.ws_col; + } + + if (!rows) { + env = getenv("LINES"); + if (env) + rows = atoi(env); + if (!rows) + rows = 24; + } + if (!cols) { + env = getenv("COLUMNS"); + if (env) + cols = atoi(env); + if (!cols) + cols = 80; + } + + if (rows < 19 || cols < 80) { + fprintf(stderr, N_("Your display is too small to run Menuconfig!\n")); + fprintf(stderr, N_("It must be at least 19 lines by 80 columns.\n")); + exit(1); + } + + rows -= 4; + cols -= 5; +} + +static void get_prompt_str(struct gstr *r, struct property *prop) +{ + int i, j; + struct menu *submenu[8], *menu; + + str_printf(r, "Prompt: %s\n", prop->text); + str_printf(r, " Defined at %s:%d\n", prop->menu->file->name, + prop->menu->lineno); + if (!expr_is_yes(prop->visible.expr)) { + str_append(r, " Depends on: "); + expr_gstr_print(prop->visible.expr, r); + str_append(r, "\n"); + } + menu = prop->menu->parent; + for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) + submenu[i++] = menu; + if (i > 0) { + str_printf(r, " Location:\n"); + for (j = 4; --i >= 0; j += 2) { + menu = submenu[i]; + str_printf(r, "%*c-> %s", j, ' ', menu_get_prompt(menu)); + if (menu->sym) { + str_printf(r, " (%s [=%s])", menu->sym->name ? + menu->sym->name : "<choice>", + sym_get_string_value(menu->sym)); + } + str_append(r, "\n"); + } + } +} + +static void get_symbol_str(struct gstr *r, struct symbol *sym) +{ + bool hit; + struct property *prop; + + str_printf(r, "Symbol: %s [=%s]\n", sym->name, + sym_get_string_value(sym)); + for_all_prompts(sym, prop) + get_prompt_str(r, prop); + hit = false; + for_all_properties(sym, prop, P_SELECT) { + if (!hit) { + str_append(r, " Selects: "); + hit = true; + } else + str_printf(r, " && "); + expr_gstr_print(prop->expr, r); + } + if (hit) + str_append(r, "\n"); + if (sym->rev_dep.expr) { + str_append(r, " Selected by: "); + expr_gstr_print(sym->rev_dep.expr, r); + str_append(r, "\n"); + } + str_append(r, "\n\n"); +} + +static struct gstr get_relations_str(struct symbol **sym_arr) +{ + struct symbol *sym; + struct gstr res = str_new(); + int i; + + for (i = 0; sym_arr && (sym = sym_arr[i]); i++) + get_symbol_str(&res, sym); + if (!i) + str_append(&res, "No matches found.\n"); + return res; +} + +static void search_conf(void) +{ + struct symbol **sym_arr; + struct gstr res; + int dres; +again: + dialog_clear(); + dres = dialog_inputbox(_("Search Configuration Parameter"), + _("Enter CT_ (sub)string to search for (omit CT_)"), + 10, 75, ""); + switch (dres) { + case 0: + break; + case 1: + show_helptext(_("Search Configuration"), search_help); + goto again; + default: + return; + } + + sym_arr = sym_re_search(dialog_input_result); + res = get_relations_str(sym_arr); + free(sym_arr); + show_textbox(_("Search Results"), str_get(&res), 0, 0); + str_free(&res); +} + +static void build_conf(struct menu *menu) +{ + struct symbol *sym; + struct property *prop; + struct menu *child; + int type, tmp, doint = 2; + tristate val; + char ch; + + if (!menu_is_visible(menu)) + return; + + sym = menu->sym; + prop = menu->prompt; + if (!sym) { + if (prop && menu != current_menu) { + const char *prompt = menu_get_prompt(menu); + switch (prop->type) { + case P_MENU: + child_count++; + if (single_menu_mode) { + item_make("%s%*c%s", + menu->data ? "-->" : "++>", + indent + 1, ' ', prompt); + } else + item_make(" %*c%s --->", indent + 1, ' ', prompt); + + item_set_tag('m'); + item_set_data(menu); + if (single_menu_mode && menu->data) + goto conf_childs; + return; + default: + if (prompt) { + child_count++; + item_make("---%*c%s", indent + 1, ' ', prompt); + item_set_tag(':'); + item_set_data(menu); + } + } + } else + doint = 0; + goto conf_childs; + } + + type = sym_get_type(sym); + if (sym_is_choice(sym)) { + struct symbol *def_sym = sym_get_choice_value(sym); + struct menu *def_menu = NULL; + + child_count++; + for (child = menu->list; child; child = child->next) { + if (menu_is_visible(child) && child->sym == def_sym) + def_menu = child; + } + + val = sym_get_tristate_value(sym); + if (sym_is_changable(sym)) { + switch (type) { + case S_BOOLEAN: + item_make("[%c]", val == no ? ' ' : '*'); + break; + case S_TRISTATE: + switch (val) { + case yes: ch = '*'; break; + case mod: ch = 'M'; break; + default: ch = ' '; break; + } + item_make("<%c>", ch); + break; + } + item_set_tag('t'); + item_set_data(menu); + } else { + item_make(" "); + item_set_tag(def_menu ? 't' : ':'); + item_set_data(menu); + } + + item_add_str("%*c%s", indent + 1, ' ', menu_get_prompt(menu)); + if (val == yes) { + if (def_menu) { + item_add_str(" (%s)", menu_get_prompt(def_menu)); + item_add_str(" --->"); + if (def_menu->list) { + indent += 2; + build_conf(def_menu); + indent -= 2; + } + } + return; + } + } else { + if (menu == current_menu) { + item_make("---%*c%s", indent + 1, ' ', menu_get_prompt(menu)); + item_set_tag(':'); + item_set_data(menu); + goto conf_childs; + } + child_count++; + val = sym_get_tristate_value(sym); + if (sym_is_choice_value(sym) && val == yes) { + item_make(" "); + item_set_tag(':'); + item_set_data(menu); + } else { + switch (type) { + case S_BOOLEAN: + if (sym_is_changable(sym)) + item_make("[%c]", val == no ? ' ' : '*'); + else + item_make("---"); + item_set_tag('t'); + item_set_data(menu); + break; + case S_TRISTATE: + switch (val) { + case yes: ch = '*'; break; + case mod: ch = 'M'; break; + default: ch = ' '; break; + } + if (sym_is_changable(sym)) + item_make("<%c>", ch); + else + item_make("---"); + item_set_tag('t'); + item_set_data(menu); + break; + default: + tmp = 2 + strlen(sym_get_string_value(sym)); /* () = 2 */ + item_make("(%s)", sym_get_string_value(sym)); + tmp = indent - tmp + 4; + if (tmp < 0) + tmp = 0; + item_add_str("%*c%s%s", tmp, ' ', menu_get_prompt(menu), + (sym_has_value(sym) || !sym_is_changable(sym)) ? + "" : " (NEW)"); + item_set_tag('s'); + item_set_data(menu); + goto conf_childs; + } + } + item_add_str("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu), + (sym_has_value(sym) || !sym_is_changable(sym)) ? + "" : " (NEW)"); + if (menu->prompt->type == P_MENU) { + item_add_str(" --->"); + return; + } + } + +conf_childs: + indent += doint; + for (child = menu->list; child; child = child->next) + build_conf(child); + indent -= doint; +} + +static void conf(struct menu *menu) +{ + struct menu *submenu; + const char *prompt = menu_get_prompt(menu); + struct symbol *sym; + struct menu *active_menu = NULL; + int res; + int s_scroll = 0; + + while (1) { + item_reset(); + current_menu = menu; + build_conf(menu); + if (!child_count) + break; + if (menu == &rootmenu) { + item_make("--- "); + item_set_tag(':'); + item_make(_(" Load an Alternate Configuration File")); + item_set_tag('L'); + item_make(_(" Save an Alternate Configuration File")); + item_set_tag('S'); + } + dialog_clear(); + res = dialog_menu(prompt ? prompt : _("Main Menu"), + _(menu_instructions), + active_menu, &s_scroll); + if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL) + break; + if (!item_activate_selected()) + continue; + if (!item_tag()) + continue; + + submenu = item_data(); + active_menu = item_data(); + if (submenu) + sym = submenu->sym; + else + sym = NULL; + + switch (res) { + case 0: + switch (item_tag()) { + case 'm': + if (single_menu_mode) + submenu->data = (void *) (long) !submenu->data; + else + conf(submenu); + break; + case 't': + if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes) + conf_choice(submenu); + else if (submenu->prompt->type == P_MENU) + conf(submenu); + break; + case 's': + conf_string(submenu); + break; + case 'L': + conf_load(); + break; + case 'S': + conf_save(); + break; + } + break; + case 2: + if (sym) + show_help(submenu); + else + show_helptext("README", _(mconf_readme)); + break; + case 3: + if (item_is_tag('t')) { + if (sym_set_tristate_value(sym, yes)) + break; + if (sym_set_tristate_value(sym, mod)) + show_textbox(NULL, setmod_text, 6, 74); + } + break; + case 4: + if (item_is_tag('t')) + sym_set_tristate_value(sym, no); + break; + case 5: + if (item_is_tag('t')) + sym_set_tristate_value(sym, mod); + break; + case 6: + if (item_is_tag('t')) + sym_toggle_tristate_value(sym); + else if (item_is_tag('m')) + conf(submenu); + break; + case 7: + search_conf(); + break; + } + } +} + +static void show_textbox(const char *title, const char *text, int r, int c) +{ + dialog_clear(); + dialog_textbox(title, text, r, c); +} + +static void show_helptext(const char *title, const char *text) +{ + show_textbox(title, text, 0, 0); +} + +static void show_help(struct menu *menu) +{ + struct gstr help = str_new(); + struct symbol *sym = menu->sym; + + if (sym->help) + { + if (sym->name) { + str_printf(&help, "CT_%s:\n\n", sym->name); + str_append(&help, _(sym->help)); + str_append(&help, "\n"); + } + } else { + str_append(&help, nohelp_text); + } + get_symbol_str(&help, sym); + show_helptext(menu_get_prompt(menu), str_get(&help)); + str_free(&help); +} + +static void conf_choice(struct menu *menu) +{ + const char *prompt = menu_get_prompt(menu); + struct menu *child; + struct symbol *active; + + active = sym_get_choice_value(menu->sym); + while (1) { + int res; + int selected; + item_reset(); + + current_menu = menu; + for (child = menu->list; child; child = child->next) { + if (!menu_is_visible(child)) + continue; + item_make("%s", menu_get_prompt(child)); + item_set_data(child); + if (child->sym == active) + item_set_selected(1); + if (child->sym == sym_get_choice_value(menu->sym)) + item_set_tag('X'); + } + dialog_clear(); + res = dialog_checklist(prompt ? prompt : _("Main Menu"), + _(radiolist_instructions), + 15, 70, 6); + selected = item_activate_selected(); + switch (res) { + case 0: + if (selected) { + child = item_data(); + sym_set_tristate_value(child->sym, yes); + } + return; + case 1: + if (selected) { + child = item_data(); + show_help(child); + active = child->sym; + } else + show_help(menu); + break; + case KEY_ESC: + return; + case -ERRDISPLAYTOOSMALL: + return; + } + } +} + +static void conf_string(struct menu *menu) +{ + const char *prompt = menu_get_prompt(menu); + + while (1) { + int res; + char *heading; + + switch (sym_get_type(menu->sym)) { + case S_INT: + heading = _(inputbox_instructions_int); + break; + case S_HEX: + heading = _(inputbox_instructions_hex); + break; + case S_STRING: + heading = _(inputbox_instructions_string); + break; + default: + heading = "Internal mconf error!"; + } + dialog_clear(); + res = dialog_inputbox(prompt ? prompt : _("Main Menu"), + heading, 10, 75, + sym_get_string_value(menu->sym)); + switch (res) { + case 0: + if (sym_set_string_value(menu->sym, dialog_input_result)) + return; + show_textbox(NULL, _("You have made an invalid entry."), 5, 43); + break; + case 1: + show_help(menu); + break; + case KEY_ESC: + return; + } + } +} + +static void conf_load(void) +{ + + while (1) { + int res; + dialog_clear(); + res = dialog_inputbox(NULL, load_config_text, + 11, 55, filename); + switch(res) { + case 0: + if (!dialog_input_result[0]) + return; + if (!conf_read(dialog_input_result)) + return; + show_textbox(NULL, _("File does not exist!"), 5, 38); + break; + case 1: + show_helptext(_("Load Alternate Configuration"), load_config_help); + break; + case KEY_ESC: + return; + } + } +} + +static void conf_save(void) +{ + while (1) { + int res; + dialog_clear(); + res = dialog_inputbox(NULL, save_config_text, + 11, 55, filename); + switch(res) { + case 0: + if (!dialog_input_result[0]) + return; + if (!conf_write(dialog_input_result)) + return; + show_textbox(NULL, _("Can't create file! Probably a nonexistent directory."), 5, 60); + break; + case 1: + show_helptext(_("Save Alternate Configuration"), save_config_help); + break; + case KEY_ESC: + return; + } + } +} + +static void conf_cleanup(void) +{ + tcsetattr(1, TCSAFLUSH, &ios_org); +} + +int main(int ac, char **av) +{ + struct symbol *sym; + char *mode; + int res; + + setlocale(LC_ALL, ""); + bindtextdomain(PACKAGE, LOCALEDIR); + textdomain(PACKAGE); + + conf_parse(av[1] ? av[1] : ""); + conf_read(NULL); + + sym = sym_lookup("PROJECTVERSION", 0); + sym_calc_value(sym); + sprintf(menu_backtitle, _(PROJECT_NAME" v%s Configuration"), + sym_get_string_value(sym)); + + mode = getenv("MENUCONFIG_MODE"); + if (mode) { + if (!strcasecmp(mode, "single_menu")) + single_menu_mode = 1; + } + + tcgetattr(1, &ios_org); + atexit(conf_cleanup); + init_wsize(); + reset_dialog(); + init_dialog(menu_backtitle); + do { + conf(&rootmenu); + dialog_clear(); + res = dialog_yesno(NULL, + _("Do you wish to save your " + "new "PROJECT_NAME" configuration?\n" + "<ESC><ESC> to continue."), + 6, 60); + } while (res == KEY_ESC); + end_dialog(); + if (res == 0) { + if (conf_write(NULL)) { + fprintf(stderr, _("\n\n" + "Error writing "PROJECT_NAME" configuration.\n" + "Your configuration changes were NOT saved." + "\n\n")); + return 1; + } + printf(_("\n\n" + "*** End of "PROJECT_NAME" configuration.\n" + "*** Execute 'make' to build, or try 'make help'." + "\n\n")); + } else { + fprintf(stderr, _("\n\n" + "Your configuration changes were NOT saved." + "\n\n")); + } + + return 0; +} diff --git a/kconfig/menu.c b/kconfig/menu.c new file mode 100644 index 00000000..c86c27f2 --- /dev/null +++ b/kconfig/menu.c @@ -0,0 +1,419 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <stdlib.h> +#include <string.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" + +struct menu rootmenu; +static struct menu **last_entry_ptr; + +struct file *file_list; +struct file *current_file; + +static void menu_warn(struct menu *menu, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d:warning: ", menu->file->name, menu->lineno); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} + +static void prop_warn(struct property *prop, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + fprintf(stderr, "%s:%d:warning: ", prop->file->name, prop->lineno); + vfprintf(stderr, fmt, ap); + fprintf(stderr, "\n"); + va_end(ap); +} + +void menu_init(void) +{ + current_entry = current_menu = &rootmenu; + last_entry_ptr = &rootmenu.list; +} + +void menu_add_entry(struct symbol *sym) +{ + struct menu *menu; + + menu = malloc(sizeof(*menu)); + memset(menu, 0, sizeof(*menu)); + menu->sym = sym; + menu->parent = current_menu; + menu->file = current_file; + menu->lineno = zconf_lineno(); + + *last_entry_ptr = menu; + last_entry_ptr = &menu->next; + current_entry = menu; +} + +void menu_end_entry(void) +{ +} + +struct menu *menu_add_menu(void) +{ + menu_end_entry(); + last_entry_ptr = ¤t_entry->list; + return current_menu = current_entry; +} + +void menu_end_menu(void) +{ + last_entry_ptr = ¤t_menu->next; + current_menu = current_menu->parent; +} + +struct expr *menu_check_dep(struct expr *e) +{ + if (!e) + return e; + + switch (e->type) { + case E_NOT: + e->left.expr = menu_check_dep(e->left.expr); + break; + case E_OR: + case E_AND: + e->left.expr = menu_check_dep(e->left.expr); + e->right.expr = menu_check_dep(e->right.expr); + break; + case E_SYMBOL: + /* change 'm' into 'm' && MODULES */ + if (e->left.sym == &symbol_mod) + return expr_alloc_and(e, expr_alloc_symbol(modules_sym)); + break; + default: + break; + } + return e; +} + +void menu_add_dep(struct expr *dep) +{ + current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep)); +} + +void menu_set_type(int type) +{ + struct symbol *sym = current_entry->sym; + + if (sym->type == type) + return; + if (sym->type == S_UNKNOWN) { + sym->type = type; + return; + } + menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'", + sym->name ? sym->name : "<choice>", + sym_type_name(sym->type), sym_type_name(type)); +} + +struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep) +{ + struct property *prop = prop_alloc(type, current_entry->sym); + + prop->menu = current_entry; + prop->expr = expr; + prop->visible.expr = menu_check_dep(dep); + + if (prompt) { + if (isspace(*prompt)) { + prop_warn(prop, "leading whitespace ignored"); + while (isspace(*prompt)) + prompt++; + } + if (current_entry->prompt) + prop_warn(prop, "prompt redefined"); + current_entry->prompt = prop; + } + prop->text = prompt; + + return prop; +} + +struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep) +{ + return menu_add_prop(type, prompt, NULL, dep); +} + +void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep) +{ + menu_add_prop(type, NULL, expr, dep); +} + +void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep) +{ + menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep); +} + +void menu_add_option(int token, char *arg) +{ + struct property *prop; + + switch (token) { + case T_OPT_MODULES: + prop = prop_alloc(P_DEFAULT, modules_sym); + prop->expr = expr_alloc_symbol(current_entry->sym); + break; + case T_OPT_DEFCONFIG_LIST: + if (!sym_defconfig_list) + sym_defconfig_list = current_entry->sym; + else if (sym_defconfig_list != current_entry->sym) + zconf_error("trying to redefine defconfig symbol"); + break; + } +} + +static int menu_range_valid_sym(struct symbol *sym, struct symbol *sym2) +{ + return sym2->type == S_INT || sym2->type == S_HEX || + (sym2->type == S_UNKNOWN && sym_string_valid(sym, sym2->name)); +} + +void sym_check_prop(struct symbol *sym) +{ + struct property *prop; + struct symbol *sym2; + for (prop = sym->prop; prop; prop = prop->next) { + switch (prop->type) { + case P_DEFAULT: + if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) && + prop->expr->type != E_SYMBOL) + prop_warn(prop, + "default for config symbol '%'" + " must be a single symbol", sym->name); + break; + case P_SELECT: + sym2 = prop_get_symbol(prop); + if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE) + prop_warn(prop, + "config symbol '%s' uses select, but is " + "not boolean or tristate", sym->name); + else if (sym2->type == S_UNKNOWN) + prop_warn(prop, + "'select' used by config symbol '%s' " + "refer to undefined symbol '%s'", + sym->name, sym2->name); + else if (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE) + prop_warn(prop, + "'%s' has wrong type. 'select' only " + "accept arguments of boolean and " + "tristate type", sym2->name); + break; + case P_RANGE: + if (sym->type != S_INT && sym->type != S_HEX) + prop_warn(prop, "range is only allowed " + "for int or hex symbols"); + if (!menu_range_valid_sym(sym, prop->expr->left.sym) || + !menu_range_valid_sym(sym, prop->expr->right.sym)) + prop_warn(prop, "range is invalid"); + break; + default: + ; + } + } +} + +void menu_finalize(struct menu *parent) +{ + struct menu *menu, *last_menu; + struct symbol *sym; + struct property *prop; + struct expr *parentdep, *basedep, *dep, *dep2, **ep; + + sym = parent->sym; + if (parent->list) { + if (sym && sym_is_choice(sym)) { + /* find the first choice value and find out choice type */ + for (menu = parent->list; menu; menu = menu->next) { + if (menu->sym) { + current_entry = parent; + menu_set_type(menu->sym->type); + current_entry = menu; + menu_set_type(sym->type); + break; + } + } + parentdep = expr_alloc_symbol(sym); + } else if (parent->prompt) + parentdep = parent->prompt->visible.expr; + else + parentdep = parent->dep; + + for (menu = parent->list; menu; menu = menu->next) { + basedep = expr_transform(menu->dep); + basedep = expr_alloc_and(expr_copy(parentdep), basedep); + basedep = expr_eliminate_dups(basedep); + menu->dep = basedep; + if (menu->sym) + prop = menu->sym->prop; + else + prop = menu->prompt; + for (; prop; prop = prop->next) { + if (prop->menu != menu) + continue; + dep = expr_transform(prop->visible.expr); + dep = expr_alloc_and(expr_copy(basedep), dep); + dep = expr_eliminate_dups(dep); + if (menu->sym && menu->sym->type != S_TRISTATE) + dep = expr_trans_bool(dep); + prop->visible.expr = dep; + if (prop->type == P_SELECT) { + struct symbol *es = prop_get_symbol(prop); + es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr, + expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep))); + } + } + } + for (menu = parent->list; menu; menu = menu->next) + menu_finalize(menu); + } else if (sym) { + basedep = parent->prompt ? parent->prompt->visible.expr : NULL; + basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no); + basedep = expr_eliminate_dups(expr_transform(basedep)); + last_menu = NULL; + for (menu = parent->next; menu; menu = menu->next) { + dep = menu->prompt ? menu->prompt->visible.expr : menu->dep; + if (!expr_contains_symbol(dep, sym)) + break; + if (expr_depends_symbol(dep, sym)) + goto next; + dep = expr_trans_compare(dep, E_UNEQUAL, &symbol_no); + dep = expr_eliminate_dups(expr_transform(dep)); + dep2 = expr_copy(basedep); + expr_eliminate_eq(&dep, &dep2); + expr_free(dep); + if (!expr_is_yes(dep2)) { + expr_free(dep2); + break; + } + expr_free(dep2); + next: + menu_finalize(menu); + menu->parent = parent; + last_menu = menu; + } + if (last_menu) { + parent->list = parent->next; + parent->next = last_menu->next; + last_menu->next = NULL; + } + } + for (menu = parent->list; menu; menu = menu->next) { + if (sym && sym_is_choice(sym) && menu->sym) { + menu->sym->flags |= SYMBOL_CHOICEVAL; + if (!menu->prompt) + menu_warn(menu, "choice value must have a prompt"); + for (prop = menu->sym->prop; prop; prop = prop->next) { + if (prop->type == P_PROMPT && prop->menu != menu) { + prop_warn(prop, "choice values " + "currently only support a " + "single prompt"); + } + if (prop->type == P_DEFAULT) + prop_warn(prop, "defaults for choice " + "values not supported"); + } + current_entry = menu; + menu_set_type(sym->type); + menu_add_symbol(P_CHOICE, sym, NULL); + prop = sym_get_choice_prop(sym); + for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr) + ; + *ep = expr_alloc_one(E_CHOICE, NULL); + (*ep)->right.sym = menu->sym; + } + if (menu->list && (!menu->prompt || !menu->prompt->text)) { + for (last_menu = menu->list; ; last_menu = last_menu->next) { + last_menu->parent = parent; + if (!last_menu->next) + break; + } + last_menu->next = menu->next; + menu->next = menu->list; + menu->list = NULL; + } + } + + if (sym && !(sym->flags & SYMBOL_WARNED)) { + if (sym->type == S_UNKNOWN) + menu_warn(parent, "config symbol defined without type"); + + if (sym_is_choice(sym) && !parent->prompt) + menu_warn(parent, "choice must have a prompt"); + + /* Check properties connected to this symbol */ + sym_check_prop(sym); + sym->flags |= SYMBOL_WARNED; + } + + if (sym && !sym_is_optional(sym) && parent->prompt) { + sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr, + expr_alloc_and(parent->prompt->visible.expr, + expr_alloc_symbol(&symbol_mod))); + } +} + +bool menu_is_visible(struct menu *menu) +{ + struct menu *child; + struct symbol *sym; + tristate visible; + + if (!menu->prompt) + return false; + sym = menu->sym; + if (sym) { + sym_calc_value(sym); + visible = menu->prompt->visible.tri; + } else + visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr); + + if (visible != no) + return true; + if (!sym || sym_get_tristate_value(menu->sym) == no) + return false; + + for (child = menu->list; child; child = child->next) + if (menu_is_visible(child)) + return true; + return false; +} + +const char *menu_get_prompt(struct menu *menu) +{ + if (menu->prompt) + return _(menu->prompt->text); + else if (menu->sym) + return _(menu->sym->name); + return NULL; +} + +struct menu *menu_get_root_menu(struct menu *menu) +{ + return &rootmenu; +} + +struct menu *menu_get_parent_menu(struct menu *menu) +{ + enum prop_type type; + + for (; menu != &rootmenu; menu = menu->parent) { + type = menu->prompt ? menu->prompt->type : 0; + if (type == P_MENU) + break; + } + return menu; +} + diff --git a/kconfig/symbol.c b/kconfig/symbol.c new file mode 100644 index 00000000..34f42fb2 --- /dev/null +++ b/kconfig/symbol.c @@ -0,0 +1,882 @@ +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <ctype.h> +#include <stdlib.h> +#include <string.h> +#include <regex.h> +#include <sys/utsname.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" + +struct symbol symbol_yes = { + .name = "y", + .curr = { "y", yes }, + .flags = SYMBOL_CONST|SYMBOL_VALID, +}, symbol_mod = { + .name = "m", + .curr = { "m", mod }, + .flags = SYMBOL_CONST|SYMBOL_VALID, +}, symbol_no = { + .name = "n", + .curr = { "n", no }, + .flags = SYMBOL_CONST|SYMBOL_VALID, +}, symbol_empty = { + .name = "", + .curr = { "", no }, + .flags = SYMBOL_VALID, +}; + +int sym_change_count; +struct symbol *sym_defconfig_list; +struct symbol *modules_sym; +tristate modules_val; + +void sym_add_default(struct symbol *sym, const char *def) +{ + struct property *prop = prop_alloc(P_DEFAULT, sym); + + prop->expr = expr_alloc_symbol(sym_lookup(def, 1)); +} + +void sym_init(void) +{ + struct symbol *sym; + struct utsname uts; + char *p; + static bool inited = false; + + if (inited) + return; + inited = true; + + uname(&uts); + + sym = sym_lookup("ARCH", 0); + sym->type = S_STRING; + sym->flags |= SYMBOL_AUTO; + p = getenv("ARCH"); + if (p) + sym_add_default(sym, p); + + sym = sym_lookup("PROJECTVERSION", 0); + sym->type = S_STRING; + sym->flags |= SYMBOL_AUTO; + p = getenv("PROJECTVERSION"); + if (p) + sym_add_default(sym, p); + + sym = sym_lookup("UNAME_RELEASE", 0); + sym->type = S_STRING; + sym->flags |= SYMBOL_AUTO; + sym_add_default(sym, uts.release); +} + +enum symbol_type sym_get_type(struct symbol *sym) +{ + enum symbol_type type = sym->type; + + if (type == S_TRISTATE) { + if (sym_is_choice_value(sym) && sym->visible == yes) + type = S_BOOLEAN; + else if (modules_val == no) + type = S_BOOLEAN; + } + return type; +} + +const char *sym_type_name(enum symbol_type type) +{ + switch (type) { + case S_BOOLEAN: + return "boolean"; + case S_TRISTATE: + return "tristate"; + case S_INT: + return "integer"; + case S_HEX: + return "hex"; + case S_STRING: + return "string"; + case S_UNKNOWN: + return "unknown"; + case S_OTHER: + break; + } + return "???"; +} + +struct property *sym_get_choice_prop(struct symbol *sym) +{ + struct property *prop; + + for_all_choices(sym, prop) + return prop; + return NULL; +} + +struct property *sym_get_default_prop(struct symbol *sym) +{ + struct property *prop; + + for_all_defaults(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri != no) + return prop; + } + return NULL; +} + +struct property *sym_get_range_prop(struct symbol *sym) +{ + struct property *prop; + + for_all_properties(sym, prop, P_RANGE) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri != no) + return prop; + } + return NULL; +} + +static int sym_get_range_val(struct symbol *sym, int base) +{ + sym_calc_value(sym); + switch (sym->type) { + case S_INT: + base = 10; + break; + case S_HEX: + base = 16; + break; + default: + break; + } + return strtol(sym->curr.val, NULL, base); +} + +static void sym_validate_range(struct symbol *sym) +{ + struct property *prop; + int base, val, val2; + char str[64]; + + switch (sym->type) { + case S_INT: + base = 10; + break; + case S_HEX: + base = 16; + break; + default: + return; + } + prop = sym_get_range_prop(sym); + if (!prop) + return; + val = strtol(sym->curr.val, NULL, base); + val2 = sym_get_range_val(prop->expr->left.sym, base); + if (val >= val2) { + val2 = sym_get_range_val(prop->expr->right.sym, base); + if (val <= val2) + return; + } + if (sym->type == S_INT) + sprintf(str, "%d", val2); + else + sprintf(str, "0x%x", val2); + sym->curr.val = strdup(str); +} + +static void sym_calc_visibility(struct symbol *sym) +{ + struct property *prop; + tristate tri; + + /* any prompt visible? */ + tri = no; + for_all_prompts(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + tri = E_OR(tri, prop->visible.tri); + } + if (tri == mod && (sym->type != S_TRISTATE || modules_val == no)) + tri = yes; + if (sym->visible != tri) { + sym->visible = tri; + sym_set_changed(sym); + } + if (sym_is_choice_value(sym)) + return; + tri = no; + if (sym->rev_dep.expr) + tri = expr_calc_value(sym->rev_dep.expr); + if (tri == mod && sym_get_type(sym) == S_BOOLEAN) + tri = yes; + if (sym->rev_dep.tri != tri) { + sym->rev_dep.tri = tri; + sym_set_changed(sym); + } +} + +static struct symbol *sym_calc_choice(struct symbol *sym) +{ + struct symbol *def_sym; + struct property *prop; + struct expr *e; + + /* is the user choice visible? */ + def_sym = sym->def[S_DEF_USER].val; + if (def_sym) { + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + return def_sym; + } + + /* any of the defaults visible? */ + for_all_defaults(sym, prop) { + prop->visible.tri = expr_calc_value(prop->visible.expr); + if (prop->visible.tri == no) + continue; + def_sym = prop_get_symbol(prop); + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + return def_sym; + } + + /* just get the first visible value */ + prop = sym_get_choice_prop(sym); + for (e = prop->expr; e; e = e->left.expr) { + def_sym = e->right.sym; + sym_calc_visibility(def_sym); + if (def_sym->visible != no) + return def_sym; + } + + /* no choice? reset tristate value */ + sym->curr.tri = no; + return NULL; +} + +void sym_calc_value(struct symbol *sym) +{ + struct symbol_value newval, oldval; + struct property *prop; + struct expr *e; + + if (!sym) + return; + + if (sym->flags & SYMBOL_VALID) + return; + sym->flags |= SYMBOL_VALID; + + oldval = sym->curr; + + switch (sym->type) { + case S_INT: + case S_HEX: + case S_STRING: + newval = symbol_empty.curr; + break; + case S_BOOLEAN: + case S_TRISTATE: + newval = symbol_no.curr; + break; + default: + sym->curr.val = sym->name; + sym->curr.tri = no; + return; + } + if (!sym_is_choice_value(sym)) + sym->flags &= ~SYMBOL_WRITE; + + sym_calc_visibility(sym); + + /* set default if recursively called */ + sym->curr = newval; + + switch (sym_get_type(sym)) { + case S_BOOLEAN: + case S_TRISTATE: + if (sym_is_choice_value(sym) && sym->visible == yes) { + prop = sym_get_choice_prop(sym); + newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no; + } else if (E_OR(sym->visible, sym->rev_dep.tri) != no) { + sym->flags |= SYMBOL_WRITE; + if (sym_has_value(sym)) + newval.tri = sym->def[S_DEF_USER].tri; + else if (!sym_is_choice(sym)) { + prop = sym_get_default_prop(sym); + if (prop) + newval.tri = expr_calc_value(prop->expr); + } + newval.tri = E_OR(E_AND(newval.tri, sym->visible), sym->rev_dep.tri); + } else if (!sym_is_choice(sym)) { + prop = sym_get_default_prop(sym); + if (prop) { + sym->flags |= SYMBOL_WRITE; + newval.tri = expr_calc_value(prop->expr); + } + } + if (newval.tri == mod && sym_get_type(sym) == S_BOOLEAN) + newval.tri = yes; + break; + case S_STRING: + case S_HEX: + case S_INT: + if (sym->visible != no) { + sym->flags |= SYMBOL_WRITE; + if (sym_has_value(sym)) { + newval.val = sym->def[S_DEF_USER].val; + break; + } + } + prop = sym_get_default_prop(sym); + if (prop) { + struct symbol *ds = prop_get_symbol(prop); + if (ds) { + sym->flags |= SYMBOL_WRITE; + sym_calc_value(ds); + newval.val = ds->curr.val; + } + } + break; + default: + ; + } + + sym->curr = newval; + if (sym_is_choice(sym) && newval.tri == yes) + sym->curr.val = sym_calc_choice(sym); + sym_validate_range(sym); + + if (memcmp(&oldval, &sym->curr, sizeof(oldval))) { + sym_set_changed(sym); + if (modules_sym == sym) { + sym_set_all_changed(); + modules_val = modules_sym->curr.tri; + } + } + + if (sym_is_choice(sym)) { + int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE); + prop = sym_get_choice_prop(sym); + for (e = prop->expr; e; e = e->left.expr) { + e->right.sym->flags |= flags; + if (flags & SYMBOL_CHANGED) + sym_set_changed(e->right.sym); + } + } +} + +void sym_clear_all_valid(void) +{ + struct symbol *sym; + int i; + + for_all_symbols(i, sym) + sym->flags &= ~SYMBOL_VALID; + sym_change_count++; + if (modules_sym) + sym_calc_value(modules_sym); +} + +void sym_set_changed(struct symbol *sym) +{ + struct property *prop; + + sym->flags |= SYMBOL_CHANGED; + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->menu) + prop->menu->flags |= MENU_CHANGED; + } +} + +void sym_set_all_changed(void) +{ + struct symbol *sym; + int i; + + for_all_symbols(i, sym) + sym_set_changed(sym); +} + +bool sym_tristate_within_range(struct symbol *sym, tristate val) +{ + int type = sym_get_type(sym); + + if (sym->visible == no) + return false; + + if (type != S_BOOLEAN && type != S_TRISTATE) + return false; + + if (type == S_BOOLEAN && val == mod) + return false; + if (sym->visible <= sym->rev_dep.tri) + return false; + if (sym_is_choice_value(sym) && sym->visible == yes) + return val == yes; + return val >= sym->rev_dep.tri && val <= sym->visible; +} + +bool sym_set_tristate_value(struct symbol *sym, tristate val) +{ + tristate oldval = sym_get_tristate_value(sym); + + if (oldval != val && !sym_tristate_within_range(sym, val)) + return false; + + if (!(sym->flags & SYMBOL_DEF_USER)) { + sym->flags |= SYMBOL_DEF_USER; + sym_set_changed(sym); + } + /* + * setting a choice value also resets the new flag of the choice + * symbol and all other choice values. + */ + if (sym_is_choice_value(sym) && val == yes) { + struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym)); + struct property *prop; + struct expr *e; + + cs->def[S_DEF_USER].val = sym; + cs->flags |= SYMBOL_DEF_USER; + prop = sym_get_choice_prop(cs); + for (e = prop->expr; e; e = e->left.expr) { + if (e->right.sym->visible != no) + e->right.sym->flags |= SYMBOL_DEF_USER; + } + } + + sym->def[S_DEF_USER].tri = val; + if (oldval != val) + sym_clear_all_valid(); + + return true; +} + +tristate sym_toggle_tristate_value(struct symbol *sym) +{ + tristate oldval, newval; + + oldval = newval = sym_get_tristate_value(sym); + do { + switch (newval) { + case no: + newval = mod; + break; + case mod: + newval = yes; + break; + case yes: + newval = no; + break; + } + if (sym_set_tristate_value(sym, newval)) + break; + } while (oldval != newval); + return newval; +} + +bool sym_string_valid(struct symbol *sym, const char *str) +{ + signed char ch; + + switch (sym->type) { + case S_STRING: + return true; + case S_INT: + ch = *str++; + if (ch == '-') + ch = *str++; + if (!isdigit(ch)) + return false; + if (ch == '0' && *str != 0) + return false; + while ((ch = *str++)) { + if (!isdigit(ch)) + return false; + } + return true; + case S_HEX: + if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) + str += 2; + ch = *str++; + do { + if (!isxdigit(ch)) + return false; + } while ((ch = *str++)); + return true; + case S_BOOLEAN: + case S_TRISTATE: + switch (str[0]) { + case 'y': case 'Y': + case 'm': case 'M': + case 'n': case 'N': + return true; + } + return false; + default: + return false; + } +} + +bool sym_string_within_range(struct symbol *sym, const char *str) +{ + struct property *prop; + int val; + + switch (sym->type) { + case S_STRING: + return sym_string_valid(sym, str); + case S_INT: + if (!sym_string_valid(sym, str)) + return false; + prop = sym_get_range_prop(sym); + if (!prop) + return true; + val = strtol(str, NULL, 10); + return val >= sym_get_range_val(prop->expr->left.sym, 10) && + val <= sym_get_range_val(prop->expr->right.sym, 10); + case S_HEX: + if (!sym_string_valid(sym, str)) + return false; + prop = sym_get_range_prop(sym); + if (!prop) + return true; + val = strtol(str, NULL, 16); + return val >= sym_get_range_val(prop->expr->left.sym, 16) && + val <= sym_get_range_val(prop->expr->right.sym, 16); + case S_BOOLEAN: + case S_TRISTATE: + switch (str[0]) { + case 'y': case 'Y': + return sym_tristate_within_range(sym, yes); + case 'm': case 'M': + return sym_tristate_within_range(sym, mod); + case 'n': case 'N': + return sym_tristate_within_range(sym, no); + } + return false; + default: + return false; + } +} + +bool sym_set_string_value(struct symbol *sym, const char *newval) +{ + const char *oldval; + char *val; + int size; + + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + switch (newval[0]) { + case 'y': case 'Y': + return sym_set_tristate_value(sym, yes); + case 'm': case 'M': + return sym_set_tristate_value(sym, mod); + case 'n': case 'N': + return sym_set_tristate_value(sym, no); + } + return false; + default: + ; + } + + if (!sym_string_within_range(sym, newval)) + return false; + + if (!(sym->flags & SYMBOL_DEF_USER)) { + sym->flags |= SYMBOL_DEF_USER; + sym_set_changed(sym); + } + + oldval = sym->def[S_DEF_USER].val; + size = strlen(newval) + 1; + if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) { + size += 2; + sym->def[S_DEF_USER].val = val = malloc(size); + *val++ = '0'; + *val++ = 'x'; + } else if (!oldval || strcmp(oldval, newval)) + sym->def[S_DEF_USER].val = val = malloc(size); + else + return true; + + strcpy(val, newval); + free((void *)oldval); + sym_clear_all_valid(); + + return true; +} + +const char *sym_get_string_value(struct symbol *sym) +{ + tristate val; + + switch (sym->type) { + case S_BOOLEAN: + case S_TRISTATE: + val = sym_get_tristate_value(sym); + switch (val) { + case no: + return "n"; + case mod: + return "m"; + case yes: + return "y"; + } + break; + default: + ; + } + return (const char *)sym->curr.val; +} + +bool sym_is_changable(struct symbol *sym) +{ + return sym->visible > sym->rev_dep.tri; +} + +struct symbol *sym_lookup(const char *name, int isconst) +{ + struct symbol *symbol; + const char *ptr; + char *new_name; + int hash = 0; + + if (name) { + if (name[0] && !name[1]) { + switch (name[0]) { + case 'y': return &symbol_yes; + case 'm': return &symbol_mod; + case 'n': return &symbol_no; + } + } + for (ptr = name; *ptr; ptr++) + hash += *ptr; + hash &= 0xff; + + for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { + if (!strcmp(symbol->name, name)) { + if ((isconst && symbol->flags & SYMBOL_CONST) || + (!isconst && !(symbol->flags & SYMBOL_CONST))) + return symbol; + } + } + new_name = strdup(name); + } else { + new_name = NULL; + hash = 256; + } + + symbol = malloc(sizeof(*symbol)); + memset(symbol, 0, sizeof(*symbol)); + symbol->name = new_name; + symbol->type = S_UNKNOWN; + if (isconst) + symbol->flags |= SYMBOL_CONST; + + symbol->next = symbol_hash[hash]; + symbol_hash[hash] = symbol; + + return symbol; +} + +struct symbol *sym_find(const char *name) +{ + struct symbol *symbol = NULL; + const char *ptr; + int hash = 0; + + if (!name) + return NULL; + + if (name[0] && !name[1]) { + switch (name[0]) { + case 'y': return &symbol_yes; + case 'm': return &symbol_mod; + case 'n': return &symbol_no; + } + } + for (ptr = name; *ptr; ptr++) + hash += *ptr; + hash &= 0xff; + + for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) { + if (!strcmp(symbol->name, name) && + !(symbol->flags & SYMBOL_CONST)) + break; + } + + return symbol; +} + +struct symbol **sym_re_search(const char *pattern) +{ + struct symbol *sym, **sym_arr = NULL; + int i, cnt, size; + regex_t re; + + cnt = size = 0; + /* Skip if empty */ + if (strlen(pattern) == 0) + return NULL; + if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB|REG_ICASE)) + return NULL; + + for_all_symbols(i, sym) { + if (sym->flags & SYMBOL_CONST || !sym->name) + continue; + if (regexec(&re, sym->name, 0, NULL, 0)) + continue; + if (cnt + 1 >= size) { + void *tmp = sym_arr; + size += 16; + sym_arr = realloc(sym_arr, size * sizeof(struct symbol *)); + if (!sym_arr) { + free(tmp); + return NULL; + } + } + sym_arr[cnt++] = sym; + } + if (sym_arr) + sym_arr[cnt] = NULL; + regfree(&re); + + return sym_arr; +} + + +struct symbol *sym_check_deps(struct symbol *sym); + +static struct symbol *sym_check_expr_deps(struct expr *e) +{ + struct symbol *sym; + + if (!e) + return NULL; + switch (e->type) { + case E_OR: + case E_AND: + sym = sym_check_expr_deps(e->left.expr); + if (sym) + return sym; + return sym_check_expr_deps(e->right.expr); + case E_NOT: + return sym_check_expr_deps(e->left.expr); + case E_EQUAL: + case E_UNEQUAL: + sym = sym_check_deps(e->left.sym); + if (sym) + return sym; + return sym_check_deps(e->right.sym); + case E_SYMBOL: + return sym_check_deps(e->left.sym); + default: + break; + } + printf("Oops! How to check %d?\n", e->type); + return NULL; +} + +struct symbol *sym_check_deps(struct symbol *sym) +{ + struct symbol *sym2; + struct property *prop; + + if (sym->flags & SYMBOL_CHECK) { + printf("Warning! Found recursive dependency: %s", sym->name); + return sym; + } + if (sym->flags & SYMBOL_CHECKED) + return NULL; + + sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED); + sym2 = sym_check_expr_deps(sym->rev_dep.expr); + if (sym2) + goto out; + + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->type == P_CHOICE || prop->type == P_SELECT) + continue; + sym2 = sym_check_expr_deps(prop->visible.expr); + if (sym2) + goto out; + if (prop->type != P_DEFAULT || sym_is_choice(sym)) + continue; + sym2 = sym_check_expr_deps(prop->expr); + if (sym2) + goto out; + } +out: + if (sym2) { + printf(" %s", sym->name); + if (sym2 == sym) { + printf("\n"); + sym2 = NULL; + } + } + sym->flags &= ~SYMBOL_CHECK; + return sym2; +} + +struct property *prop_alloc(enum prop_type type, struct symbol *sym) +{ + struct property *prop; + struct property **propp; + + prop = malloc(sizeof(*prop)); + memset(prop, 0, sizeof(*prop)); + prop->type = type; + prop->sym = sym; + prop->file = current_file; + prop->lineno = zconf_lineno(); + + /* append property to the prop list of symbol */ + if (sym) { + for (propp = &sym->prop; *propp; propp = &(*propp)->next) + ; + *propp = prop; + } + + return prop; +} + +struct symbol *prop_get_symbol(struct property *prop) +{ + if (prop->expr && (prop->expr->type == E_SYMBOL || + prop->expr->type == E_CHOICE)) + return prop->expr->left.sym; + return NULL; +} + +const char *prop_get_type_name(enum prop_type type) +{ + switch (type) { + case P_PROMPT: + return "prompt"; + case P_COMMENT: + return "comment"; + case P_MENU: + return "menu"; + case P_DEFAULT: + return "default"; + case P_CHOICE: + return "choice"; + case P_SELECT: + return "select"; + case P_RANGE: + return "range"; + case P_UNKNOWN: + break; + } + return "unknown"; +} diff --git a/kconfig/util.c b/kconfig/util.c new file mode 100644 index 00000000..e3f28b9d --- /dev/null +++ b/kconfig/util.c @@ -0,0 +1,111 @@ +/* + * Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org> + * Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org> + * + * Released under the terms of the GNU GPL v2.0. + */ + +#include <string.h> +#include "lkc.h" + +/* file already present in list? If not add it */ +struct file *file_lookup(const char *name) +{ + struct file *file; + + for (file = file_list; file; file = file->next) { + if (!strcmp(name, file->name)) + return file; + } + + file = malloc(sizeof(*file)); + memset(file, 0, sizeof(*file)); + file->name = strdup(name); + file->next = file_list; + file_list = file; + return file; +} + +/* write a dependency file as used by kbuild to track dependencies */ +int file_write_dep(const char *name) +{ + struct file *file; + FILE *out; + + if (!name) + name = ".kconfig.d"; + out = fopen("..config.tmp", "w"); + if (!out) + return 1; + fprintf(out, "deps_config := \\\n"); + for (file = file_list; file; file = file->next) { + if (file->next) + fprintf(out, "\t%s \\\n", file->name); + else + fprintf(out, "\t%s\n", file->name); + } + fprintf(out, "\ninclude/config/auto.conf: \\\n" + "\t$(deps_config)\n\n" + "$(deps_config): ;\n"); + fclose(out); + rename("..config.tmp", name); + return 0; +} + + +/* Allocate initial growable sting */ +struct gstr str_new(void) +{ + struct gstr gs; + gs.s = malloc(sizeof(char) * 64); + gs.len = 16; + strcpy(gs.s, "\0"); + return gs; +} + +/* Allocate and assign growable string */ +struct gstr str_assign(const char *s) +{ + struct gstr gs; + gs.s = strdup(s); + gs.len = strlen(s) + 1; + return gs; +} + +/* Free storage for growable string */ +void str_free(struct gstr *gs) +{ + if (gs->s) + free(gs->s); + gs->s = NULL; + gs->len = 0; +} + +/* Append to growable string */ +void str_append(struct gstr *gs, const char *s) +{ + size_t l = strlen(gs->s) + strlen(s) + 1; + if (l > gs->len) { + gs->s = realloc(gs->s, l); + gs->len = l; + } + strcat(gs->s, s); +} + +/* Append printf formatted string to growable string */ +void str_printf(struct gstr *gs, const char *fmt, ...) +{ + va_list ap; + char s[10000]; /* big enough... */ + va_start(ap, fmt); + vsnprintf(s, sizeof(s), fmt, ap); + str_append(gs, s); + va_end(ap); +} + +/* Retrieve value of growable string */ +const char *str_get(struct gstr *gs) +{ + return gs->s; +} + diff --git a/kconfig/zconf.hash.c_shipped b/kconfig/zconf.hash.c_shipped new file mode 100644 index 00000000..47c8b5ba --- /dev/null +++ b/kconfig/zconf.hash.c_shipped @@ -0,0 +1,242 @@ +/* ANSI-C code produced by gperf version 3.0.1 */ +/* Command-line: gperf */ +/* Computed positions: -k'1,3' */ + +#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ + && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ + && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ + && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ + && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ + && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ + && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ + && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ + && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ + && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ + && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ + && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ + && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ + && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ + && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ + && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ + && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ + && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ + && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ + && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ + && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ + && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ + && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126)) +/* The character set is not based on ISO-646. */ +#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>." +#endif + +struct kconf_id; +/* maximum key range = 45, duplicates = 0 */ + +#ifdef __GNUC__ +__inline +#else +#ifdef __cplusplus +inline +#endif +#endif +static unsigned int +kconf_id_hash (register const char *str, register unsigned int len) +{ + static unsigned char asso_values[] = + { + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 25, 30, 15, + 0, 15, 0, 47, 5, 15, 47, 47, 30, 20, + 5, 0, 25, 15, 0, 0, 10, 35, 47, 47, + 5, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 47, 47 + }; + register int hval = len; + + switch (hval) + { + default: + hval += asso_values[(unsigned char)str[2]]; + /*FALLTHROUGH*/ + case 2: + case 1: + hval += asso_values[(unsigned char)str[0]]; + break; + } + return hval; +} + +struct kconf_id_strings_t + { + char kconf_id_strings_str2[sizeof("on")]; + char kconf_id_strings_str6[sizeof("string")]; + char kconf_id_strings_str7[sizeof("default")]; + char kconf_id_strings_str8[sizeof("def_bool")]; + char kconf_id_strings_str10[sizeof("range")]; + char kconf_id_strings_str11[sizeof("def_boolean")]; + char kconf_id_strings_str12[sizeof("def_tristate")]; + char kconf_id_strings_str13[sizeof("hex")]; + char kconf_id_strings_str14[sizeof("defconfig_list")]; + char kconf_id_strings_str16[sizeof("option")]; + char kconf_id_strings_str17[sizeof("if")]; + char kconf_id_strings_str18[sizeof("optional")]; + char kconf_id_strings_str20[sizeof("endif")]; + char kconf_id_strings_str21[sizeof("choice")]; + char kconf_id_strings_str22[sizeof("endmenu")]; + char kconf_id_strings_str23[sizeof("requires")]; + char kconf_id_strings_str24[sizeof("endchoice")]; + char kconf_id_strings_str26[sizeof("config")]; + char kconf_id_strings_str27[sizeof("modules")]; + char kconf_id_strings_str28[sizeof("int")]; + char kconf_id_strings_str29[sizeof("menu")]; + char kconf_id_strings_str31[sizeof("prompt")]; + char kconf_id_strings_str32[sizeof("depends")]; + char kconf_id_strings_str33[sizeof("tristate")]; + char kconf_id_strings_str34[sizeof("bool")]; + char kconf_id_strings_str35[sizeof("menuconfig")]; + char kconf_id_strings_str36[sizeof("select")]; + char kconf_id_strings_str37[sizeof("boolean")]; + char kconf_id_strings_str39[sizeof("help")]; + char kconf_id_strings_str41[sizeof("source")]; + char kconf_id_strings_str42[sizeof("comment")]; + char kconf_id_strings_str43[sizeof("mainmenu")]; + char kconf_id_strings_str46[sizeof("enable")]; + }; +static struct kconf_id_strings_t kconf_id_strings_contents = + { + "on", + "string", + "default", + "def_bool", + "range", + "def_boolean", + "def_tristate", + "hex", + "defconfig_list", + "option", + "if", + "optional", + "endif", + "choice", + "endmenu", + "requires", + "endchoice", + "config", + "modules", + "int", + "menu", + "prompt", + "depends", + "tristate", + "bool", + "menuconfig", + "select", + "boolean", + "help", + "source", + "comment", + "mainmenu", + "enable" + }; +#define kconf_id_strings ((const char *) &kconf_id_strings_contents) +#ifdef __GNUC__ +__inline +#endif +struct kconf_id * +kconf_id_lookup (register const char *str, register unsigned int len) +{ + enum + { + TOTAL_KEYWORDS = 33, + MIN_WORD_LENGTH = 2, + MAX_WORD_LENGTH = 14, + MIN_HASH_VALUE = 2, + MAX_HASH_VALUE = 46 + }; + + static struct kconf_id wordlist[] = + { + {-1}, {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2, T_ON, TF_PARAM}, + {-1}, {-1}, {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6, T_TYPE, TF_COMMAND, S_STRING}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7, T_DEFAULT, TF_COMMAND, S_UNKNOWN}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8, T_DEFAULT, TF_COMMAND, S_BOOLEAN}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10, T_RANGE, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11, T_DEFAULT, TF_COMMAND, S_BOOLEAN}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12, T_DEFAULT, TF_COMMAND, S_TRISTATE}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13, T_TYPE, TF_COMMAND, S_HEX}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14, T_OPT_DEFCONFIG_LIST,TF_OPTION}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16, T_OPTION, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17, T_IF, TF_COMMAND|TF_PARAM}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18, T_OPTIONAL, TF_COMMAND}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str20, T_ENDIF, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21, T_CHOICE, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22, T_ENDMENU, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23, T_REQUIRES, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str24, T_ENDCHOICE, TF_COMMAND}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26, T_CONFIG, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27, T_OPT_MODULES, TF_OPTION}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28, T_TYPE, TF_COMMAND, S_INT}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29, T_MENU, TF_COMMAND}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31, T_PROMPT, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32, T_DEPENDS, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33, T_TYPE, TF_COMMAND, S_TRISTATE}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str34, T_TYPE, TF_COMMAND, S_BOOLEAN}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35, T_MENUCONFIG, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str36, T_SELECT, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37, T_TYPE, TF_COMMAND, S_BOOLEAN}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str39, T_HELP, TF_COMMAND}, + {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41, T_SOURCE, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42, T_COMMENT, TF_COMMAND}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str43, T_MAINMENU, TF_COMMAND}, + {-1}, {-1}, + {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str46, T_SELECT, TF_COMMAND} + }; + + if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH) + { + register int key = kconf_id_hash (str, len); + + if (key <= MAX_HASH_VALUE && key >= 0) + { + register int o = wordlist[key].name; + if (o >= 0) + { + register const char *s = o + kconf_id_strings; + + if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0') + return &wordlist[key]; + } + } + } + return 0; +} + diff --git a/kconfig/zconf.tab.c_shipped b/kconfig/zconf.tab.c_shipped new file mode 100644 index 00000000..34ccabdd --- /dev/null +++ b/kconfig/zconf.tab.c_shipped @@ -0,0 +1,2345 @@ +/* A Bison parser, made by GNU Bison 2.1. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.1" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* Substitute the variable and function names. */ +#define yyparse zconfparse +#define yylex zconflex +#define yyerror zconferror +#define yylval zconflval +#define yychar zconfchar +#define yydebug zconfdebug +#define yynerrs zconfnerrs + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + T_MAINMENU = 258, + T_MENU = 259, + T_ENDMENU = 260, + T_SOURCE = 261, + T_CHOICE = 262, + T_ENDCHOICE = 263, + T_COMMENT = 264, + T_CONFIG = 265, + T_MENUCONFIG = 266, + T_HELP = 267, + T_HELPTEXT = 268, + T_IF = 269, + T_ENDIF = 270, + T_DEPENDS = 271, + T_REQUIRES = 272, + T_OPTIONAL = 273, + T_PROMPT = 274, + T_TYPE = 275, + T_DEFAULT = 276, + T_SELECT = 277, + T_RANGE = 278, + T_OPTION = 279, + T_ON = 280, + T_WORD = 281, + T_WORD_QUOTE = 282, + T_UNEQUAL = 283, + T_CLOSE_PAREN = 284, + T_OPEN_PAREN = 285, + T_EOL = 286, + T_OR = 287, + T_AND = 288, + T_EQUAL = 289, + T_NOT = 290 + }; +#endif +/* Tokens. */ +#define T_MAINMENU 258 +#define T_MENU 259 +#define T_ENDMENU 260 +#define T_SOURCE 261 +#define T_CHOICE 262 +#define T_ENDCHOICE 263 +#define T_COMMENT 264 +#define T_CONFIG 265 +#define T_MENUCONFIG 266 +#define T_HELP 267 +#define T_HELPTEXT 268 +#define T_IF 269 +#define T_ENDIF 270 +#define T_DEPENDS 271 +#define T_REQUIRES 272 +#define T_OPTIONAL 273 +#define T_PROMPT 274 +#define T_TYPE 275 +#define T_DEFAULT 276 +#define T_SELECT 277 +#define T_RANGE 278 +#define T_OPTION 279 +#define T_ON 280 +#define T_WORD 281 +#define T_WORD_QUOTE 282 +#define T_UNEQUAL 283 +#define T_CLOSE_PAREN 284 +#define T_OPEN_PAREN 285 +#define T_EOL 286 +#define T_OR 287 +#define T_AND 288 +#define T_EQUAL 289 +#define T_NOT 290 + + + + +/* Copy the first part of user declarations. */ + + +/* + * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> + * Released under the terms of the GNU GPL v2.0. + */ + +#include <ctype.h> +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> + +#define LKC_DIRECT_LINK +#include "lkc.h" + +#include "zconf.hash.c" + +#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) + +#define PRINTD 0x0001 +#define DEBUG_PARSE 0x0002 + +int cdebug = PRINTD; + +extern int zconflex(void); +static void zconfprint(const char *err, ...); +static void zconf_error(const char *err, ...); +static void zconferror(const char *err); +static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken); + +struct symbol *symbol_hash[257]; + +static struct menu *current_menu, *current_entry; + +#define YYDEBUG 0 +#if YYDEBUG +#define YYERROR_VERBOSE +#endif + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) + +typedef union YYSTYPE { + char *string; + struct file *file; + struct symbol *symbol; + struct expr *expr; + struct menu *menu; + struct kconf_id *id; +} YYSTYPE; +/* Line 196 of yacc.c. */ + +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 219 of yacc.c. */ + + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus)) +# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include <libintl.h> /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# else +# define YYSTACK_ALLOC alloca +# if defined (__STDC__) || defined (__cplusplus) +# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +# define YYINCLUDED_STDLIB_H +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1) +# endif +# ifdef __cplusplus +extern "C" { +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \ + && (defined (__STDC__) || defined (__cplusplus))) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \ + && (defined (__STDC__) || defined (__cplusplus))) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifdef __cplusplus +} +# endif +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short int yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined (__GNUC__) && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short int yysigned_char; +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 3 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 275 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 36 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 45 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 110 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 183 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 290 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short int yyprhs[] = +{ + 0, 0, 3, 5, 6, 9, 12, 15, 20, 23, + 28, 33, 37, 39, 41, 43, 45, 47, 49, 51, + 53, 55, 57, 59, 61, 63, 67, 70, 74, 77, + 81, 84, 85, 88, 91, 94, 97, 100, 103, 107, + 112, 117, 122, 128, 132, 133, 137, 138, 141, 144, + 147, 149, 153, 154, 157, 160, 163, 166, 169, 174, + 178, 181, 186, 187, 190, 194, 196, 200, 201, 204, + 207, 210, 214, 217, 219, 223, 224, 227, 230, 233, + 237, 241, 244, 247, 250, 251, 254, 257, 260, 265, + 269, 273, 274, 277, 279, 281, 284, 287, 290, 292, + 295, 296, 299, 301, 305, 309, 313, 316, 320, 324, + 326 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yysigned_char yyrhs[] = +{ + 37, 0, -1, 38, -1, -1, 38, 40, -1, 38, + 54, -1, 38, 65, -1, 38, 3, 75, 77, -1, + 38, 76, -1, 38, 26, 1, 31, -1, 38, 39, + 1, 31, -1, 38, 1, 31, -1, 16, -1, 19, + -1, 20, -1, 22, -1, 18, -1, 23, -1, 21, + -1, 31, -1, 60, -1, 69, -1, 43, -1, 45, + -1, 67, -1, 26, 1, 31, -1, 1, 31, -1, + 10, 26, 31, -1, 42, 46, -1, 11, 26, 31, + -1, 44, 46, -1, -1, 46, 47, -1, 46, 48, + -1, 46, 73, -1, 46, 71, -1, 46, 41, -1, + 46, 31, -1, 20, 74, 31, -1, 19, 75, 78, + 31, -1, 21, 79, 78, 31, -1, 22, 26, 78, + 31, -1, 23, 80, 80, 78, 31, -1, 24, 49, + 31, -1, -1, 49, 26, 50, -1, -1, 34, 75, + -1, 7, 31, -1, 51, 55, -1, 76, -1, 52, + 57, 53, -1, -1, 55, 56, -1, 55, 73, -1, + 55, 71, -1, 55, 31, -1, 55, 41, -1, 19, + 75, 78, 31, -1, 20, 74, 31, -1, 18, 31, + -1, 21, 26, 78, 31, -1, -1, 57, 40, -1, + 14, 79, 77, -1, 76, -1, 58, 61, 59, -1, + -1, 61, 40, -1, 61, 65, -1, 61, 54, -1, + 4, 75, 31, -1, 62, 72, -1, 76, -1, 63, + 66, 64, -1, -1, 66, 40, -1, 66, 65, -1, + 66, 54, -1, 6, 75, 31, -1, 9, 75, 31, + -1, 68, 72, -1, 12, 31, -1, 70, 13, -1, + -1, 72, 73, -1, 72, 31, -1, 72, 41, -1, + 16, 25, 79, 31, -1, 16, 79, 31, -1, 17, + 79, 31, -1, -1, 75, 78, -1, 26, -1, 27, + -1, 5, 31, -1, 8, 31, -1, 15, 31, -1, + 31, -1, 77, 31, -1, -1, 14, 79, -1, 80, + -1, 80, 34, 80, -1, 80, 28, 80, -1, 30, + 79, 29, -1, 35, 79, -1, 79, 32, 79, -1, + 79, 33, 79, -1, 26, -1, 27, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short int yyrline[] = +{ + 0, 105, 105, 107, 109, 110, 111, 112, 113, 114, + 115, 119, 123, 123, 123, 123, 123, 123, 123, 127, + 128, 129, 130, 131, 132, 136, 137, 143, 151, 157, + 165, 175, 177, 178, 179, 180, 181, 182, 185, 193, + 199, 209, 215, 221, 224, 226, 237, 238, 243, 252, + 257, 265, 268, 270, 271, 272, 273, 274, 277, 283, + 294, 300, 310, 312, 317, 325, 333, 336, 338, 339, + 340, 345, 352, 357, 365, 368, 370, 371, 372, 375, + 383, 390, 397, 403, 410, 412, 413, 414, 417, 422, + 427, 435, 437, 442, 443, 446, 447, 448, 452, 453, + 456, 457, 460, 461, 462, 463, 464, 465, 466, 469, + 470 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU", + "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG", + "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS", + "T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_TYPE", "T_DEFAULT", + "T_SELECT", "T_RANGE", "T_OPTION", "T_ON", "T_WORD", "T_WORD_QUOTE", + "T_UNEQUAL", "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_EOL", "T_OR", "T_AND", + "T_EQUAL", "T_NOT", "$accept", "input", "stmt_list", "option_name", + "common_stmt", "option_error", "config_entry_start", "config_stmt", + "menuconfig_entry_start", "menuconfig_stmt", "config_option_list", + "config_option", "symbol_option", "symbol_option_list", + "symbol_option_arg", "choice", "choice_entry", "choice_end", + "choice_stmt", "choice_option_list", "choice_option", "choice_block", + "if_entry", "if_end", "if_stmt", "if_block", "menu", "menu_entry", + "menu_end", "menu_stmt", "menu_block", "source_stmt", "comment", + "comment_stmt", "help_start", "help", "depends_list", "depends", + "prompt_stmt_opt", "prompt", "end", "nl", "if_expr", "expr", "symbol", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short int yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 36, 37, 38, 38, 38, 38, 38, 38, 38, + 38, 38, 39, 39, 39, 39, 39, 39, 39, 40, + 40, 40, 40, 40, 40, 41, 41, 42, 43, 44, + 45, 46, 46, 46, 46, 46, 46, 46, 47, 47, + 47, 47, 47, 48, 49, 49, 50, 50, 51, 52, + 53, 54, 55, 55, 55, 55, 55, 55, 56, 56, + 56, 56, 57, 57, 58, 59, 60, 61, 61, 61, + 61, 62, 63, 64, 65, 66, 66, 66, 66, 67, + 68, 69, 70, 71, 72, 72, 72, 72, 73, 73, + 73, 74, 74, 75, 75, 76, 76, 76, 77, 77, + 78, 78, 79, 79, 79, 79, 79, 79, 79, 80, + 80 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 1, 0, 2, 2, 2, 4, 2, 4, + 4, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 2, 3, 2, 3, + 2, 0, 2, 2, 2, 2, 2, 2, 3, 4, + 4, 4, 5, 3, 0, 3, 0, 2, 2, 2, + 1, 3, 0, 2, 2, 2, 2, 2, 4, 3, + 2, 4, 0, 2, 3, 1, 3, 0, 2, 2, + 2, 3, 2, 1, 3, 0, 2, 2, 2, 3, + 3, 2, 2, 2, 0, 2, 2, 2, 4, 3, + 3, 0, 2, 1, 1, 2, 2, 2, 1, 2, + 0, 2, 1, 3, 3, 3, 2, 3, 3, 1, + 1 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 12, 16, 13, 14, + 18, 15, 17, 0, 19, 0, 4, 31, 22, 31, + 23, 52, 62, 5, 67, 20, 84, 75, 6, 24, + 84, 21, 8, 11, 93, 94, 0, 0, 95, 0, + 48, 96, 0, 0, 0, 109, 110, 0, 0, 0, + 102, 97, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 98, 7, 71, 79, 80, 27, 29, 0, + 106, 0, 0, 64, 0, 0, 9, 10, 0, 0, + 0, 0, 0, 91, 0, 0, 0, 44, 0, 37, + 36, 32, 33, 0, 35, 34, 0, 0, 91, 0, + 56, 57, 53, 55, 54, 63, 51, 50, 68, 70, + 66, 69, 65, 86, 87, 85, 76, 78, 74, 77, + 73, 99, 105, 107, 108, 104, 103, 26, 82, 0, + 0, 0, 100, 0, 100, 100, 100, 0, 0, 0, + 83, 60, 100, 0, 100, 0, 89, 90, 0, 0, + 38, 92, 0, 0, 100, 46, 43, 25, 0, 59, + 0, 88, 101, 39, 40, 41, 0, 0, 45, 58, + 61, 42, 47 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const short int yydefgoto[] = +{ + -1, 1, 2, 25, 26, 100, 27, 28, 29, 30, + 64, 101, 102, 148, 178, 31, 32, 116, 33, 66, + 112, 67, 34, 120, 35, 68, 36, 37, 128, 38, + 70, 39, 40, 41, 103, 104, 69, 105, 143, 144, + 42, 73, 159, 59, 60 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -135 +static const short int yypact[] = +{ + -135, 2, 170, -135, -14, 56, 56, -8, 56, 24, + 67, 56, 7, 14, 62, 97, -135, -135, -135, -135, + -135, -135, -135, 156, -135, 166, -135, -135, -135, -135, + -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, + -135, -135, -135, -135, -135, -135, 138, 151, -135, 152, + -135, -135, 163, 167, 176, -135, -135, 62, 62, 185, + -19, -135, 188, 190, 42, 103, 194, 85, 70, 222, + 70, 132, -135, 191, -135, -135, -135, -135, -135, 127, + -135, 62, 62, 191, 104, 104, -135, -135, 193, 203, + 9, 62, 56, 56, 62, 161, 104, -135, 196, -135, + -135, -135, -135, 233, -135, -135, 204, 56, 56, 221, + -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, + -135, -135, -135, -135, -135, -135, -135, -135, -135, -135, + -135, -135, -135, 219, -135, -135, -135, -135, -135, 62, + 209, 212, 240, 224, 240, -1, 240, 104, 41, 225, + -135, -135, 240, 226, 240, 218, -135, -135, 62, 227, + -135, -135, 228, 229, 240, 230, -135, -135, 231, -135, + 232, -135, 112, -135, -135, -135, 234, 56, -135, -135, + -135, -135, -135 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const short int yypgoto[] = +{ + -135, -135, -135, -135, 94, -45, -135, -135, -135, -135, + 237, -135, -135, -135, -135, -135, -135, -135, -54, -135, + -135, -135, -135, -135, -135, -135, -135, -135, -135, 1, + -135, -135, -135, -135, -135, 195, 235, -44, 159, -5, + 98, 210, -134, -53, -77 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -82 +static const short int yytable[] = +{ + 46, 47, 3, 49, 79, 80, 52, 135, 136, 84, + 161, 162, 163, 158, 119, 85, 127, 43, 168, 147, + 170, 111, 114, 48, 124, 125, 124, 125, 133, 134, + 176, 81, 82, 53, 139, 55, 56, 140, 141, 57, + 54, 145, -28, 88, 58, -28, -28, -28, -28, -28, + -28, -28, -28, -28, 89, 50, -28, -28, 90, 91, + -28, 92, 93, 94, 95, 96, 97, 165, 98, 121, + 164, 129, 166, 99, 6, 7, 8, 9, 10, 11, + 12, 13, 44, 45, 14, 15, 155, 142, 55, 56, + 7, 8, 57, 10, 11, 12, 13, 58, 51, 14, + 15, 24, 152, -30, 88, 172, -30, -30, -30, -30, + -30, -30, -30, -30, -30, 89, 24, -30, -30, 90, + 91, -30, 92, 93, 94, 95, 96, 97, 61, 98, + 55, 56, -81, 88, 99, -81, -81, -81, -81, -81, + -81, -81, -81, -81, 81, 82, -81, -81, 90, 91, + -81, -81, -81, -81, -81, -81, 132, 62, 98, 81, + 82, 115, 118, 123, 126, 117, 122, 63, 130, 72, + -2, 4, 182, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 74, 75, 14, 15, 16, 146, 17, 18, + 19, 20, 21, 22, 76, 88, 23, 149, 77, -49, + -49, 24, -49, -49, -49, -49, 89, 78, -49, -49, + 90, 91, 106, 107, 108, 109, 72, 81, 82, 86, + 98, 87, 131, 88, 137, 110, -72, -72, -72, -72, + -72, -72, -72, -72, 138, 151, -72, -72, 90, 91, + 156, 81, 82, 157, 81, 82, 150, 154, 98, 171, + 81, 82, 82, 123, 158, 160, 167, 169, 173, 174, + 175, 113, 179, 180, 177, 181, 65, 153, 0, 83, + 0, 0, 0, 0, 0, 71 +}; + +static const short int yycheck[] = +{ + 5, 6, 0, 8, 57, 58, 11, 84, 85, 28, + 144, 145, 146, 14, 68, 34, 70, 31, 152, 96, + 154, 66, 66, 31, 69, 69, 71, 71, 81, 82, + 164, 32, 33, 26, 25, 26, 27, 90, 91, 30, + 26, 94, 0, 1, 35, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 31, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 26, 26, 68, + 147, 70, 31, 31, 4, 5, 6, 7, 8, 9, + 10, 11, 26, 27, 14, 15, 139, 92, 26, 27, + 5, 6, 30, 8, 9, 10, 11, 35, 31, 14, + 15, 31, 107, 0, 1, 158, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 31, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 31, 26, + 26, 27, 0, 1, 31, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 32, 33, 14, 15, 16, 17, + 18, 19, 20, 21, 22, 23, 29, 1, 26, 32, + 33, 67, 68, 31, 70, 67, 68, 1, 70, 31, + 0, 1, 177, 3, 4, 5, 6, 7, 8, 9, + 10, 11, 31, 31, 14, 15, 16, 26, 18, 19, + 20, 21, 22, 23, 31, 1, 26, 1, 31, 5, + 6, 31, 8, 9, 10, 11, 12, 31, 14, 15, + 16, 17, 18, 19, 20, 21, 31, 32, 33, 31, + 26, 31, 31, 1, 31, 31, 4, 5, 6, 7, + 8, 9, 10, 11, 31, 31, 14, 15, 16, 17, + 31, 32, 33, 31, 32, 33, 13, 26, 26, 31, + 32, 33, 33, 31, 14, 31, 31, 31, 31, 31, + 31, 66, 31, 31, 34, 31, 29, 108, -1, 59, + -1, -1, -1, -1, -1, 40 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 37, 38, 0, 1, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 14, 15, 16, 18, 19, 20, + 21, 22, 23, 26, 31, 39, 40, 42, 43, 44, + 45, 51, 52, 54, 58, 60, 62, 63, 65, 67, + 68, 69, 76, 31, 26, 27, 75, 75, 31, 75, + 31, 31, 75, 26, 26, 26, 27, 30, 35, 79, + 80, 31, 1, 1, 46, 46, 55, 57, 61, 72, + 66, 72, 31, 77, 31, 31, 31, 31, 31, 79, + 79, 32, 33, 77, 28, 34, 31, 31, 1, 12, + 16, 17, 19, 20, 21, 22, 23, 24, 26, 31, + 41, 47, 48, 70, 71, 73, 18, 19, 20, 21, + 31, 41, 56, 71, 73, 40, 53, 76, 40, 54, + 59, 65, 76, 31, 41, 73, 40, 54, 64, 65, + 76, 31, 29, 79, 79, 80, 80, 31, 31, 25, + 79, 79, 75, 74, 75, 79, 26, 80, 49, 1, + 13, 31, 75, 74, 26, 79, 31, 31, 14, 78, + 31, 78, 78, 78, 80, 26, 31, 31, 78, 31, + 78, 31, 79, 31, 31, 31, 78, 34, 50, 31, + 31, 31, 75 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (0) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (N) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (0) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (YYLEX_PARAM) +#else +# define YYLEX yylex () +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Type, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short int *bottom, short int *top) +#else +static void +yy_stack_print (bottom, top) + short int *bottom; + short int *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; +#endif +{ + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ", + yyrule - 1, yylno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]); +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + size_t yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +#endif /* YYERROR_VERBOSE */ + + + +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else +static void +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); +} + +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yymsg, yytype, yyvaluep) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + case 52: /* "choice_entry" */ + + { + fprintf(stderr, "%s:%d: missing end statement for this entry\n", + (yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno); + if (current_menu == (yyvaluep->menu)) + menu_end_menu(); +}; + + break; + case 58: /* "if_entry" */ + + { + fprintf(stderr, "%s:%d: missing end statement for this entry\n", + (yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno); + if (current_menu == (yyvaluep->menu)) + menu_end_menu(); +}; + + break; + case 63: /* "menu_entry" */ + + { + fprintf(stderr, "%s:%d: missing end statement for this entry\n", + (yyvaluep->menu)->file->name, (yyvaluep->menu)->lineno); + if (current_menu == (yyvaluep->menu)) + menu_end_menu(); +}; + + break; + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The look-ahead symbol. */ +int yychar; + +/* The semantic value of the look-ahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) +#else +int +yyparse () + ; +#endif +#endif +{ + + int yystate; + int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Look-ahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short int yyssa[YYINITDEPTH]; + short int *yyss = yyssa; + short int *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp; + + + +#define YYPOPSTACK (yyvsp--, yyssp--) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short int *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + short int *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a look-ahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to look-ahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a look-ahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; + + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 8: + + { zconf_error("unexpected end statement"); ;} + break; + + case 9: + + { zconf_error("unknown statement \"%s\"", (yyvsp[-2].string)); ;} + break; + + case 10: + + { + zconf_error("unexpected option \"%s\"", kconf_id_strings + (yyvsp[-2].id)->name); +;} + break; + + case 11: + + { zconf_error("invalid statement"); ;} + break; + + case 25: + + { zconf_error("unknown option \"%s\"", (yyvsp[-2].string)); ;} + break; + + case 26: + + { zconf_error("invalid option"); ;} + break; + + case 27: + + { + struct symbol *sym = sym_lookup((yyvsp[-1].string), 0); + sym->flags |= SYMBOL_OPTIONAL; + menu_add_entry(sym); + printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string)); +;} + break; + + case 28: + + { + menu_end_entry(); + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 29: + + { + struct symbol *sym = sym_lookup((yyvsp[-1].string), 0); + sym->flags |= SYMBOL_OPTIONAL; + menu_add_entry(sym); + printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string)); +;} + break; + + case 30: + + { + if (current_entry->prompt) + current_entry->prompt->type = P_MENU; + else + zconfprint("warning: menuconfig statement without prompt"); + menu_end_entry(); + printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 38: + + { + menu_set_type((yyvsp[-2].id)->stype); + printd(DEBUG_PARSE, "%s:%d:type(%u)\n", + zconf_curname(), zconf_lineno(), + (yyvsp[-2].id)->stype); +;} + break; + + case 39: + + { + menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 40: + + { + menu_add_expr(P_DEFAULT, (yyvsp[-2].expr), (yyvsp[-1].expr)); + if ((yyvsp[-3].id)->stype != S_UNKNOWN) + menu_set_type((yyvsp[-3].id)->stype); + printd(DEBUG_PARSE, "%s:%d:default(%u)\n", + zconf_curname(), zconf_lineno(), + (yyvsp[-3].id)->stype); +;} + break; + + case 41: + + { + menu_add_symbol(P_SELECT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 42: + + { + menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,(yyvsp[-3].symbol), (yyvsp[-2].symbol)), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 45: + + { + struct kconf_id *id = kconf_id_lookup((yyvsp[-1].string), strlen((yyvsp[-1].string))); + if (id && id->flags & TF_OPTION) + menu_add_option(id->token, (yyvsp[0].string)); + else + zconfprint("warning: ignoring unknown option %s", (yyvsp[-1].string)); + free((yyvsp[-1].string)); +;} + break; + + case 46: + + { (yyval.string) = NULL; ;} + break; + + case 47: + + { (yyval.string) = (yyvsp[0].string); ;} + break; + + case 48: + + { + struct symbol *sym = sym_lookup(NULL, 0); + sym->flags |= SYMBOL_CHOICE; + menu_add_entry(sym); + menu_add_expr(P_CHOICE, NULL, NULL); + printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 49: + + { + (yyval.menu) = menu_add_menu(); +;} + break; + + case 50: + + { + if (zconf_endtoken((yyvsp[0].id), T_CHOICE, T_ENDCHOICE)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno()); + } +;} + break; + + case 58: + + { + menu_add_prompt(P_PROMPT, (yyvsp[-2].string), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 59: + + { + if ((yyvsp[-2].id)->stype == S_BOOLEAN || (yyvsp[-2].id)->stype == S_TRISTATE) { + menu_set_type((yyvsp[-2].id)->stype); + printd(DEBUG_PARSE, "%s:%d:type(%u)\n", + zconf_curname(), zconf_lineno(), + (yyvsp[-2].id)->stype); + } else + YYERROR; +;} + break; + + case 60: + + { + current_entry->sym->flags |= SYMBOL_OPTIONAL; + printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 61: + + { + if ((yyvsp[-3].id)->stype == S_UNKNOWN) { + menu_add_symbol(P_DEFAULT, sym_lookup((yyvsp[-2].string), 0), (yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:default\n", + zconf_curname(), zconf_lineno()); + } else + YYERROR; +;} + break; + + case 64: + + { + printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); + menu_add_entry(NULL); + menu_add_dep((yyvsp[-1].expr)); + (yyval.menu) = menu_add_menu(); +;} + break; + + case 65: + + { + if (zconf_endtoken((yyvsp[0].id), T_IF, T_ENDIF)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno()); + } +;} + break; + + case 71: + + { + menu_add_entry(NULL); + menu_add_prompt(P_MENU, (yyvsp[-1].string), NULL); + printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 72: + + { + (yyval.menu) = menu_add_menu(); +;} + break; + + case 73: + + { + if (zconf_endtoken((yyvsp[0].id), T_MENU, T_ENDMENU)) { + menu_end_menu(); + printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno()); + } +;} + break; + + case 79: + + { + printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), (yyvsp[-1].string)); + zconf_nextfile((yyvsp[-1].string)); +;} + break; + + case 80: + + { + menu_add_entry(NULL); + menu_add_prompt(P_COMMENT, (yyvsp[-1].string), NULL); + printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 81: + + { + menu_end_entry(); +;} + break; + + case 82: + + { + printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno()); + zconf_starthelp(); +;} + break; + + case 83: + + { + current_entry->sym->help = (yyvsp[0].string); +;} + break; + + case 88: + + { + menu_add_dep((yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 89: + + { + menu_add_dep((yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 90: + + { + menu_add_dep((yyvsp[-1].expr)); + printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno()); +;} + break; + + case 92: + + { + menu_add_prompt(P_PROMPT, (yyvsp[-1].string), (yyvsp[0].expr)); +;} + break; + + case 95: + + { (yyval.id) = (yyvsp[-1].id); ;} + break; + + case 96: + + { (yyval.id) = (yyvsp[-1].id); ;} + break; + + case 97: + + { (yyval.id) = (yyvsp[-1].id); ;} + break; + + case 100: + + { (yyval.expr) = NULL; ;} + break; + + case 101: + + { (yyval.expr) = (yyvsp[0].expr); ;} + break; + + case 102: + + { (yyval.expr) = expr_alloc_symbol((yyvsp[0].symbol)); ;} + break; + + case 103: + + { (yyval.expr) = expr_alloc_comp(E_EQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); ;} + break; + + case 104: + + { (yyval.expr) = expr_alloc_comp(E_UNEQUAL, (yyvsp[-2].symbol), (yyvsp[0].symbol)); ;} + break; + + case 105: + + { (yyval.expr) = (yyvsp[-1].expr); ;} + break; + + case 106: + + { (yyval.expr) = expr_alloc_one(E_NOT, (yyvsp[0].expr)); ;} + break; + + case 107: + + { (yyval.expr) = expr_alloc_two(E_OR, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} + break; + + case 108: + + { (yyval.expr) = expr_alloc_two(E_AND, (yyvsp[-2].expr), (yyvsp[0].expr)); ;} + break; + + case 109: + + { (yyval.symbol) = sym_lookup((yyvsp[0].string), 0); free((yyvsp[0].string)); ;} + break; + + case 110: + + { (yyval.symbol) = sym_lookup((yyvsp[0].string), 1); free((yyvsp[0].string)); ;} + break; + + + default: break; + } + +/* Line 1126 of yacc.c. */ + + + yyvsp -= yylen; + yyssp -= yylen; + + + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + char *yymsg = 0; +# define YYERROR_VERBOSE_ARGS_MAXIMUM 5 + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +#if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +#endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= yysize1 < yysize; + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= yysize1 < yysize; + yysize = yysize1; + + if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM) + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yymsg; + int yyi = 0; + while ((*yyp = *yyf)) + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + yyerror (yymsg); + YYSTACK_FREE (yymsg); + } + else + { + yyerror (YY_("syntax error")); + goto yyexhaustedlab; + } + } + else +#endif /* YYERROR_VERBOSE */ + yyerror (YY_("syntax error")); + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse look-ahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", yytoken, &yylval); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse look-ahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (0) + goto yyerrorlab; + +yyvsp -= yylen; + yyssp -= yylen; + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", yystos[yystate], yyvsp); + YYPOPSTACK; + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + *++yyvsp = yylval; + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEOF && yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp); + YYPOPSTACK; + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + return yyresult; +} + + + + + +void conf_parse(const char *name) +{ + struct symbol *sym; + int i; + + zconf_initscan(name); + + sym_init(); + menu_init(); + modules_sym = sym_lookup(NULL, 0); + modules_sym->type = S_BOOLEAN; + modules_sym->flags |= SYMBOL_AUTO; + rootmenu.prompt = menu_add_prompt(P_MENU, PROJECT_NAME" Configuration", NULL); + +#if YYDEBUG + if (getenv("ZCONF_DEBUG")) + zconfdebug = 1; +#endif + zconfparse(); + if (zconfnerrs) + exit(1); + if (!modules_sym->prop) { + struct property *prop; + + prop = prop_alloc(P_DEFAULT, modules_sym); + prop->expr = expr_alloc_symbol(sym_lookup("MODULES", 0)); + } + menu_finalize(&rootmenu); + for_all_symbols(i, sym) { + sym_check_deps(sym); + } + + sym_change_count = 1; +} + +const char *zconf_tokenname(int token) +{ + switch (token) { + case T_MENU: return "menu"; + case T_ENDMENU: return "endmenu"; + case T_CHOICE: return "choice"; + case T_ENDCHOICE: return "endchoice"; + case T_IF: return "if"; + case T_ENDIF: return "endif"; + case T_DEPENDS: return "depends"; + } + return "<token>"; +} + +static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken) +{ + if (id->token != endtoken) { + zconf_error("unexpected '%s' within %s block", + kconf_id_strings + id->name, zconf_tokenname(starttoken)); + zconfnerrs++; + return false; + } + if (current_menu->file != current_file) { + zconf_error("'%s' in different file than '%s'", + kconf_id_strings + id->name, zconf_tokenname(starttoken)); + fprintf(stderr, "%s:%d: location of the '%s'\n", + current_menu->file->name, current_menu->lineno, + zconf_tokenname(starttoken)); + zconfnerrs++; + return false; + } + return true; +} + +static void zconfprint(const char *err, ...) +{ + va_list ap; + + fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno()); + va_start(ap, err); + vfprintf(stderr, err, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + +static void zconf_error(const char *err, ...) +{ + va_list ap; + + zconfnerrs++; + fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno()); + va_start(ap, err); + vfprintf(stderr, err, ap); + va_end(ap); + fprintf(stderr, "\n"); +} + +static void zconferror(const char *err) +{ +#if YYDEBUG + fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err); +#endif +} + +void print_quoted_string(FILE *out, const char *str) +{ + const char *p; + int len; + + putc('"', out); + while ((p = strchr(str, '"'))) { + len = p - str; + if (len) + fprintf(out, "%.*s", len, str); + fputs("\\\"", out); + str = p + 1; + } + fputs(str, out); + putc('"', out); +} + +void print_symbol(FILE *out, struct menu *menu) +{ + struct symbol *sym = menu->sym; + struct property *prop; + + if (sym_is_choice(sym)) + fprintf(out, "choice\n"); + else + fprintf(out, "config %s\n", sym->name); + switch (sym->type) { + case S_BOOLEAN: + fputs(" boolean\n", out); + break; + case S_TRISTATE: + fputs(" tristate\n", out); + break; + case S_STRING: + fputs(" string\n", out); + break; + case S_INT: + fputs(" integer\n", out); + break; + case S_HEX: + fputs(" hex\n", out); + break; + default: + fputs(" ???\n", out); + break; + } + for (prop = sym->prop; prop; prop = prop->next) { + if (prop->menu != menu) + continue; + switch (prop->type) { + case P_PROMPT: + fputs(" prompt ", out); + print_quoted_string(out, prop->text); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_DEFAULT: + fputs( " default ", out); + expr_fprint(prop->expr, out); + if (!expr_is_yes(prop->visible.expr)) { + fputs(" if ", out); + expr_fprint(prop->visible.expr, out); + } + fputc('\n', out); + break; + case P_CHOICE: + fputs(" #choice value\n", out); + break; + default: + fprintf(out, " unknown prop %d!\n", prop->type); + break; + } + } + if (sym->help) { + int len = strlen(sym->help); + while (sym->help[--len] == '\n') + sym->help[len] = 0; + fprintf(out, " help\n%s\n", sym->help); + } + fputc('\n', out); +} + +void zconfdump(FILE *out) +{ + struct property *prop; + struct symbol *sym; + struct menu *menu; + + menu = rootmenu.list; + while (menu) { + if ((sym = menu->sym)) + print_symbol(out, menu); + else if ((prop = menu->prompt)) { + switch (prop->type) { + case P_COMMENT: + fputs("\ncomment ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + case P_MENU: + fputs("\nmenu ", out); + print_quoted_string(out, prop->text); + fputs("\n", out); + break; + default: + ; + } + if (!expr_is_yes(prop->visible.expr)) { + fputs(" depends ", out); + expr_fprint(prop->visible.expr, out); + fputc('\n', out); + } + fputs("\n", out); + } + + if (menu->list) + menu = menu->list; + else if (menu->next) + menu = menu->next; + else while ((menu = menu->parent)) { + if (menu->prompt && menu->prompt->type == P_MENU) + fputs("\nendmenu\n", out); + if (menu->next) { + menu = menu->next; + break; + } + } + } +} + +#include "lex.zconf.c" +#include "util.c" +#include "confdata.c" +#include "expr.c" +#include "symbol.c" +#include "menu.c" + + diff --git a/licenses/by-sa/deed.en b/licenses/by-sa/deed.en new file mode 100644 index 00000000..6f1fae79 --- /dev/null +++ b/licenses/by-sa/deed.en @@ -0,0 +1,306 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Creative Commons Deed</title> + + + +<meta http-equiv="content-type" content="text/html;charset=utf-8"> +<link rel="stylesheet" type="text/css" href="deed_files/deeds.css"> +<link rel="alternate" type="application/rdf+xml" href="http://creativecommons.org/licenses/by-sa/2.5/rdf"> + +<script language="javascript"> +function setCookie(name, value, expires, path, domain, secure) { + document.cookie= name + "=" + escape(value) + + ((expires) ? "; expires=" + expires.toGMTString() : "") + + ((path) ? "; path=" + path : "") + + ((domain) ? "; domain=" + domain : "") + + ((secure) ? "; secure" : ""); +} +var expiry = new Date(); +expiry.setTime(expiry.getTime()+(5*365*24*60*60*1000)); +setCookie('lang','en', expiry, '/'); +</script></head><body> + +<!-- + +<rdf:RDF xmlns="http://web.resource.org/cc/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><License rdf:about="http://creativecommons.org/licenses/by-sa/2.5/"><permits rdf:resource="http://web.resource.org/cc/Reproduction"/><permits rdf:resource="http://web.resource.org/cc/Distribution"/><requires rdf:resource="http://web.resource.org/cc/Notice"/><requires rdf:resource="http://web.resource.org/cc/Attribution"/><permits rdf:resource="http://web.resource.org/cc/DerivativeWorks"/><requires + rdf:resource="http://web.resource.org/cc/ShareAlike"/></License></rdf:RDF> + + +--> + +<p align="center"><a href="http://creativecommons.org/">Creative Commons</a></p> + + + +<div style="width: 620px; margin-left: auto; margin-right: auto;"><div style="text-align: center;"> +This page is available in the following languages: +<br> + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.bg" title="български" hreflang="bg" rel="alternate" lang="bg">български</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.ca" title="Català" hreflang="ca" rel="alternate" lang="ca">Català</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.da" title="Dansk" hreflang="da" rel="alternate" lang="da">Dansk</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.de" title="Deutsch" hreflang="de" rel="alternate" lang="de">Deutsch</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.en" title="English" hreflang="en" rel="alternate" lang="en">English</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.en_CA" title="English (CA)" hreflang="en_CA" rel="alternate" lang="en_CA">English (CA)</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.en_GB" title="English (GB)" hreflang="en_GB" rel="alternate" lang="en_GB">English (GB)</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.es" title="Castellano" hreflang="es" rel="alternate" lang="es">Castellano</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.es_AR" title="Spanish (AR)" hreflang="es_AR" rel="alternate" lang="es_AR">Castellano (AR)</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.es_CL" title="Spanish (CL)" hreflang="es_CL" rel="alternate" lang="es_CL">Español (CL)</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.es_MX" title="Spanish (MX)" hreflang="es_MX" rel="alternate" lang="es_MX">Castellano (MX)</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.eu" title="Euskara" hreflang="eu" rel="alternate" lang="eu">Euskara</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.fi" title="Suomeksi" hreflang="fi" rel="alternate" lang="fi">Suomeksi</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.fr" title="français" hreflang="fr" rel="alternate" lang="fr">français</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.fr_CA" title="French (CA)" hreflang="fr_CA" rel="alternate" lang="fr_CA">français (CA)</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.gl" title="Galego" hreflang="gl" rel="alternate" lang="gl">Galego</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.he" title="עברית" hreflang="he" rel="alternate" lang="he">עברית</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.hr" title="hrvatski" hreflang="hr" rel="alternate" lang="hr">hrvatski</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.hu" title="Magyar" hreflang="hu" rel="alternate" lang="hu">Magyar</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.it" title="Italiano" hreflang="it" rel="alternate" lang="it">Italiano</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.ja" title="日本語" hreflang="ja" rel="alternate" lang="ja">日本語</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.ko" title="한국어" hreflang="ko" rel="alternate" lang="ko">한국어</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.ms" title="Melayu" hreflang="ms" rel="alternate" lang="ms">Melayu</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.nl" title="Nederlands" hreflang="nl" rel="alternate" lang="nl">Nederlands</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.pl" title="polski" hreflang="pl" rel="alternate" lang="pl">polski</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.pt" title="Português" hreflang="pt" rel="alternate" lang="pt">Português</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.pt_PT" hreflang="pt_PT" rel="alternate" lang="pt_PT">Português (PT)</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.se" title="svenska" hreflang="se" rel="alternate" lang="se">svenska</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.sl" title="slovenski jezik" hreflang="sl" rel="alternate" lang="sl">slovenski jezik</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.zh" title="简体中文" hreflang="zh" rel="alternate" lang="zh">简体中文</a> + + + + +<a href="http://creativecommons.org/licenses/by-sa/2.5/deed.zh_TW" title="Chinese (Taiwan)" hreflang="zh_TW" rel="alternate" lang="zh_TW">華語 (台灣)</a> + + +</div></div> + + + + +<div id="deed"> + + <div align="center"> + + <img src="deed_files/logo_deed.gif" alt="Creative Commons Deed" border="0" height="79" vspace="14" width="280"> + + <p><b>Attribution-ShareAlike 2.5 </b></p> + + + + <div class="text"> + + + + <p><strong>You are free:</strong></p> + + <ul> + + <li>to copy, distribute, display, and perform the work</li> + + <li>to make derivative works</li> + + <li>to make commercial use of the work</li> + + </ul> + + + + <p><strong>Under the following conditions:</strong></p> + + <div align="center"><table class="draft" border="0" cellpadding="4" cellspacing="0" width="500"> + + <tbody> + + <tr> + <td> + <img src="deed_files/deed.gif" alt="by" align="left" border="0" hspace="4"> + </td> + <td align="left"> + <div class="tiny"><strong>Attribution</strong>. + You must attribute the work in the manner specified by the author or licensor.</div> + </td> + </tr> + <tr> + <td> + <img src="deed_files/deed_002.gif" alt="sa" align="left" border="0" hspace="4"> + </td> + <td align="left"> + <div class="tiny"><strong>Share Alike</strong>. +If you alter, transform, or build upon this work, you may distribute +the resulting work only under a license identical to this one.</div> + </td> + </tr> + + </tbody></table></div> + + + + <ul> + + <li>For any reuse or distribution, you must make clear to others the license terms of this work.</li> + + <li>Any of these conditions can be waived if you get permission from the copyright holder.</li> + + </ul> + + + +<p style="margin-top: 40px;" align="center"><strong>Your fair use and other rights are in no way affected by the above.</strong></p> + + + + + + <p align="center"> + + + This is a human-readable summary of the <a href="http://creativecommons.org/licenses/by-sa/2.5/legalcode" class="fulltext">Legal Code (the full license)</a>. + + </p> + + + + + + <div align="center"> + +<a href="http://creativecommons.org/licenses/disclaimer-popup?lang=en" onclick="window.open('/licenses/disclaimer-popup?lang=en', 'characteristic_help', 'width=375,height=300,scrollbars=yes,resizable=yes,toolbar=no,directories=no,location=yes,menubar=no,status=yes'); return false;">Disclaimer</a> +<a href="http://creativecommons.org/licenses/disclaimer-popup?lang=en" onclick="window.open('/licenses/disclaimer-popup?lang=en', 'characteristic_help', 'width=375,height=300,scrollbars=yes,resizable=yes,toolbar=no,directories=no,location=yes,menubar=no,status=yes'); return false;"><img src="deed_files/popup.gif" alt="disclaimer" border="0" height="13" width="15"></a></div> + + <p> </p> + + </div> + + </div> + +</div> + +<p> + +<a href="http://creativecommons.org/about/licenses">Learn how to distribute your work using this license</a> + +</p> + + + + +</body></html> \ No newline at end of file diff --git a/licenses/by-sa/deed_files/deed.gif b/licenses/by-sa/deed_files/deed.gif new file mode 100644 index 00000000..ef811af2 Binary files /dev/null and b/licenses/by-sa/deed_files/deed.gif differ diff --git a/licenses/by-sa/deed_files/deed_002.gif b/licenses/by-sa/deed_files/deed_002.gif new file mode 100644 index 00000000..2160a802 Binary files /dev/null and b/licenses/by-sa/deed_files/deed_002.gif differ diff --git a/licenses/by-sa/deed_files/deeds.css b/licenses/by-sa/deed_files/deeds.css new file mode 100644 index 00000000..7c50dbcd --- /dev/null +++ b/licenses/by-sa/deed_files/deeds.css @@ -0,0 +1,54 @@ +body { + margin: 0px; + padding: 0px; + font-family: verdana, arial, helvetica, sans-serif; + color: black; + background-color: white; + text-align: center; + font-size:11px; + /* part 1 of 2 centering hack */ + } + +#deed { + width: 620px; + padding: 15px; + margin-top: 20px; + margin-bottom: 20px; + margin-right: auto; + margin-left: auto; + /* opera does not like 'margin:20px auto' */ + background: #ffc; + border: 3px groove #333; + text-align:left; + /* part 2 of 2 centering hack */ + width: 620px; /* ie5win fudge begins */ + voice-family: "\"}\""; + voice-family:inherit; + width: 584px; + } + +html>body #content { + width: 584px; /* ie5win fudge ends */ + } + +.fineprint { + border:1px solid black; + padding:8px; + background:#ffffff; + text-align:justify; +} + +.text, li { + font-family:verdana, sans-serif; + font-size:11px; + margin-left:20px; + margin-right:20px; + line-height:140%; + text-align:left; +} + +.tiny { + font-family:verdana, sans-serif; + font-size:11px; + margin-bottom:10px; +} \ No newline at end of file diff --git a/licenses/by-sa/deed_files/logo_deed.gif b/licenses/by-sa/deed_files/logo_deed.gif new file mode 100644 index 00000000..6024290f Binary files /dev/null and b/licenses/by-sa/deed_files/logo_deed.gif differ diff --git a/licenses/by-sa/deed_files/popup.gif b/licenses/by-sa/deed_files/popup.gif new file mode 100644 index 00000000..31dfb98f Binary files /dev/null and b/licenses/by-sa/deed_files/popup.gif differ diff --git a/licenses/by-sa/legalcode b/licenses/by-sa/legalcode new file mode 100644 index 00000000..6cf807ef --- /dev/null +++ b/licenses/by-sa/legalcode @@ -0,0 +1,378 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> +<html><head><title>Creative Commons Legal Code</title> + + + +<link rel="stylesheet" type="text/css" href="legalcode_files/deeds.css"> +<style type="text/css"> + +li { +margin-bottom:12px; +} + +</style></head><body> + +<p align="center"><a href="http://creativecommons.org/">Creative Commons</a></p> + + + +<div id="deed"> +<div align="center"><img src="legalcode_files/logo_code.gif" alt="Creative Commons Legal Code" border="0" height="79" vspace="14" width="280"></div> + + +<p align="center"><b>Attribution-ShareAlike 2.5</b></p> + + +<div class="text"> + + +<div class="fineprint" style="background: transparent none repeat scroll 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> +CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL +SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN +ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON +AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE +INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM +ITS USE.</div> + + + + +<p><em>License</em> </p> + +<p>THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS +CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS +PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK +OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS +PROHIBITED. </p> + +<p>BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND +AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU +THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH +TERMS AND CONDITIONS. </p> + + +<p><strong>1. Definitions</strong> </p> + +<ol type="a"> +<li> +<strong>"Collective Work"</strong> means a work, such as a periodical +issue, anthology or encyclopedia, in which the Work in its entirety in +unmodified form, along with a number of other contributions, +constituting separate and independent works in themselves, are +assembled into a collective whole. A work that constitutes a Collective +Work will not be considered a Derivative Work (as defined below) for +the purposes of this License. +</li> + +<li> +<strong>"Derivative Work"</strong> means a work based upon the Work or +upon the Work and other pre-existing works, such as a translation, +musical arrangement, dramatization, fictionalization, motion picture +version, sound recording, art reproduction, abridgment, condensation, +or any other form in which the Work may be recast, transformed, or +adapted, except that a work that constitutes a Collective Work will not +be considered a Derivative Work for the purpose of this License. For +the avoidance of doubt, where the Work is a musical composition or +sound recording, the synchronization of the Work in timed-relation with +a moving image ("synching") will be considered a Derivative Work for +the purpose of this License. +</li> + +<li> +<strong>"Licensor"</strong> means the individual or entity that offers the Work under the terms of this License. +</li> + +<li> +<strong>"Original Author"</strong> means the individual or entity who created the Work. +</li> + +<li> +<strong>"Work"</strong> means the copyrightable work of authorship offered under the terms of this License. +</li> + +<li> +<strong>"You"</strong> means an individual or entity exercising rights +under this License who has not previously violated the terms of this +License with respect to the Work, or who has received express +permission from the Licensor to exercise rights under this License +despite a previous violation. +</li> + +<li><strong>"License Elements"</strong> means the following high-level +license attributes as selected by Licensor and indicated in the title +of this License: Attribution, ShareAlike.</li></ol> + +<p><strong>2. Fair Use Rights.</strong> Nothing in this license is +intended to reduce, limit, or restrict any rights arising from fair +use, first sale or other limitations on the exclusive rights of the +copyright owner under copyright law or other applicable laws. </p> + + +<p><strong>3. License Grant.</strong> Subject to the terms and +conditions of this License, Licensor hereby grants You a worldwide, +royalty-free, non-exclusive, perpetual (for the duration of the +applicable copyright) license to exercise the rights in the Work as +stated below: </p> + + +<ol type="a"> +<li> +to reproduce the Work, to incorporate the Work into one or more +Collective Works, and to reproduce the Work as incorporated in the +Collective Works; +</li> + +<li> +to create and reproduce Derivative Works; +</li> + +<li>to distribute copies or phonorecords of, display publicly, perform +publicly, and perform publicly by means of a digital audio transmission +the Work including as incorporated in Collective Works; +</li> + +<li>to distribute copies or phonorecords of, display publicly, perform +publicly, and perform publicly by means of a digital audio transmission +Derivative Works. +</li> + +<li><p>For the avoidance of doubt, where the work is a musical composition:</p> + +<ol type="i"> +<li><strong>Performance Royalties Under Blanket Licenses</strong>. +Licensor waives the exclusive right to collect, whether individually or +via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties +for the public performance or public digital performance (e.g. webcast) +of the Work.</li> + +<li><strong>Mechanical Rights and Statutory Royalties</strong>. +Licensor waives the exclusive right to collect, whether individually or +via a music rights society or designated agent (e.g. Harry Fox Agency), +royalties for any phonorecord You create from the Work ("cover +version") and distribute, subject to the compulsory license created by +17 USC Section 115 of the US Copyright Act (or the equivalent in other +jurisdictions). +</li> +</ol> +</li> + +<li><strong>Webcasting Rights and Statutory Royalties</strong>. For the +avoidance of doubt, where the Work is a sound recording, Licensor +waives the exclusive right to collect, whether individually or via a +performance-rights society (e.g. SoundExchange), royalties for the +public digital performance (e.g. webcast) of the Work, subject to the +compulsory license created by 17 USC Section 114 of the US Copyright +Act (or the equivalent in other jurisdictions).</li> +</ol> + + +<p>The above rights may be exercised in all media and formats whether +now known or hereafter devised. The above rights include the right to +make such modifications as are technically necessary to exercise the +rights in other media and formats. All rights not expressly granted by +Licensor are hereby reserved.</p> + +<p><strong>4. Restrictions.</strong>The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: </p> + + +<ol type="a"> +<li> +You may distribute, publicly display, publicly perform, or publicly +digitally perform the Work only under the terms of this License, and +You must include a copy of, or the Uniform Resource Identifier for, +this License with every copy or phonorecord of the Work You distribute, +publicly display, publicly perform, or publicly digitally perform. You +may not offer or impose any terms on the Work that alter or restrict +the terms of this License or the recipients' exercise of the rights +granted hereunder. You may not sublicense the Work. You must keep +intact all notices that refer to this License and to the disclaimer of +warranties. You may not distribute, publicly display, publicly perform, +or publicly digitally perform the Work with any technological measures +that control access or use of the Work in a manner inconsistent with +the terms of this License Agreement. The above applies to the Work as +incorporated in a Collective Work, but this does not require the +Collective Work apart from the Work itself to be made subject to the +terms of this License. If You create a Collective Work, upon notice +from any Licensor You must, to the extent practicable, remove from the +Collective Work any credit as required by clause 4(c), as requested. If +You create a Derivative Work, upon notice from any Licensor You must, +to the extent practicable, remove from the Derivative Work any credit +as required by clause 4(c), as requested. +</li> + +<li>You may distribute, publicly display, publicly perform, or publicly +digitally perform a Derivative Work only under the terms of this +License, a later version of this License with the same License Elements +as this License, or a Creative Commons iCommons license that contains +the same License Elements as this License (e.g. Attribution-ShareAlike +2.5 Japan). You must include a copy of, or the Uniform Resource +Identifier for, this License or other license specified in the previous +sentence with every copy or phonorecord of each Derivative Work You +distribute, publicly display, publicly perform, or publicly digitally +perform. You may not offer or impose any terms on the Derivative Works +that alter or restrict the terms of this License or the recipients' +exercise of the rights granted hereunder, and You must keep intact all +notices that refer to this License and to the disclaimer of warranties. +You may not distribute, publicly display, publicly perform, or publicly +digitally perform the Derivative Work with any technological measures +that control access or use of the Work in a manner inconsistent with +the terms of this License Agreement. The above applies to the +Derivative Work as incorporated in a Collective Work, but this does not +require the Collective Work apart from the Derivative Work itself to be +made subject to the terms of this License. +</li> + +<li>If you distribute, publicly display, publicly perform, or publicly +digitally perform the Work or any Derivative Works or Collective Works, +You must keep intact all copyright notices for the Work and provide, +reasonable to the medium or means You are utilizing: (i) the name of +the Original Author (or pseudonym, if applicable) if supplied, and/or +(ii) if the Original Author and/or Licensor designate another party or +parties (e.g. a sponsor institute, publishing entity, journal) for +attribution in Licensor's copyright notice, terms of service or by +other reasonable means, the name of such party or parties; the title of +the Work if supplied; to the extent reasonably practicable, the Uniform +Resource Identifier, if any, that Licensor specifies to be associated +with the Work, unless such URI does not refer to the copyright notice +or licensing information for the Work; and in the case of a Derivative +Work, a credit identifying the use of the Work in the Derivative Work +(e.g., "French translation of the Work by Original Author," or +"Screenplay based on original Work by Original Author"). Such credit +may be implemented in any reasonable manner; provided, however, that in +the case of a Derivative Work or Collective Work, at a minimum such +credit will appear where any other comparable authorship credit appears +and in a manner at least as prominent as such other comparable +authorship credit. +</li> + + + + +</ol> + + + + + +<p><strong>5. Representations, Warranties and Disclaimer</strong></p> + +<p>UNLESS OTHERWISE AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE MATERIALS, EXPRESS, IMPLIED, STATUTORY OR +OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, +MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR +THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF +ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO +NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY +NOT APPLY TO YOU.</p> + + +<p><strong>6. Limitation on Liability.</strong> EXCEPT TO THE EXTENT +REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU +ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, +PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF +THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. </p> + +<p><strong>7. Termination</strong> </p> + +<ol type="a"> + +<li> +This License and the rights granted hereunder will terminate +automatically upon any breach by You of the terms of this License. +Individuals or entities who have received Derivative Works or +Collective Works from You under this License, however, will not have +their licenses terminated provided such individuals or entities remain +in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 +will survive any termination of this License. +</li> + +<li>Subject to the above terms and conditions, the license granted here +is perpetual (for the duration of the applicable copyright in the +Work). Notwithstanding the above, Licensor reserves the right to +release the Work under different license terms or to stop distributing +the Work at any time; provided, however that any such election will not +serve to withdraw this License (or any other license that has been, or +is required to be, granted under the terms of this License), and this +License will continue in full force and effect unless terminated as +stated above. +</li> +</ol> + +<p><strong>8. Miscellaneous</strong> </p> + +<ol type="a"> + +<li>Each time You distribute or publicly digitally perform the Work or +a Collective Work, the Licensor offers to the recipient a license to +the Work on the same terms and conditions as the license granted to You +under this License. +</li> + +<li>Each time You distribute or publicly digitally perform a Derivative +Work, Licensor offers to the recipient a license to the original Work +on the same terms and conditions as the license granted to You under +this License. +</li> + +<li>If any provision of this License is invalid or unenforceable under +applicable law, it shall not affect the validity or enforceability of +the remainder of the terms of this License, and without further action +by the parties to this agreement, such provision shall be reformed to +the minimum extent necessary to make such provision valid and +enforceable. +</li> + +<li>No term or provision of this License shall be deemed waived and no +breach consented to unless such waiver or consent shall be in writing +and signed by the party to be charged with such waiver or consent. +</li> + +<li>This License constitutes the entire agreement between the parties +with respect to the Work licensed here. There are no understandings, +agreements or representations with respect to the Work not specified +here. Licensor shall not be bound by any additional provisions that may +appear in any communication from You. This License may not be modified +without the mutual written agreement of the Licensor and You. +</li> +</ol> + + +<!-- BREAKOUT FOR CC NOTICE. NOT A PART OF THE LICENSE --> +<div class="fineprint"> + + +<p>Creative Commons is not a party to this License, and makes no +warranty whatsoever in connection with the Work. Creative Commons will +not be liable to You or any party on any legal theory for any damages +whatsoever, including without limitation any general, special, +incidental or consequential damages arising in connection to this +license. Notwithstanding the foregoing two (2) sentences, if Creative +Commons has expressly identified itself as the Licensor hereunder, it +shall have all rights and obligations of Licensor. </p> + + +<p>Except for the limited purpose of indicating to the public that the +Work is licensed under the CCPL, neither party will use the trademark +"Creative Commons" or any related trademark or logo of Creative Commons +without the prior written consent of Creative Commons. Any permitted +use will be in compliance with Creative Commons' then-current trademark +usage guidelines, as may be published on its website or otherwise made +available upon request from time to time.</p> + + +<p>Creative Commons may be contacted at <a href="http://creativecommons.org/">http://creativecommons.org/</a>.</p> + + +</div> +<!-- END CC NOTICE --> + + +</div> + + +<div style="margin-bottom: 10px;" align="right"><a href="http://creativecommons.org/licenses/by-sa/2.5/" class="fulltext">� Back to Commons Deed</a></div> + +</div> +</body></html> \ No newline at end of file diff --git a/licenses/by-sa/legalcode_files/deeds.css b/licenses/by-sa/legalcode_files/deeds.css new file mode 100644 index 00000000..7c50dbcd --- /dev/null +++ b/licenses/by-sa/legalcode_files/deeds.css @@ -0,0 +1,54 @@ +body { + margin: 0px; + padding: 0px; + font-family: verdana, arial, helvetica, sans-serif; + color: black; + background-color: white; + text-align: center; + font-size:11px; + /* part 1 of 2 centering hack */ + } + +#deed { + width: 620px; + padding: 15px; + margin-top: 20px; + margin-bottom: 20px; + margin-right: auto; + margin-left: auto; + /* opera does not like 'margin:20px auto' */ + background: #ffc; + border: 3px groove #333; + text-align:left; + /* part 2 of 2 centering hack */ + width: 620px; /* ie5win fudge begins */ + voice-family: "\"}\""; + voice-family:inherit; + width: 584px; + } + +html>body #content { + width: 584px; /* ie5win fudge ends */ + } + +.fineprint { + border:1px solid black; + padding:8px; + background:#ffffff; + text-align:justify; +} + +.text, li { + font-family:verdana, sans-serif; + font-size:11px; + margin-left:20px; + margin-right:20px; + line-height:140%; + text-align:left; +} + +.tiny { + font-family:verdana, sans-serif; + font-size:11px; + margin-bottom:10px; +} \ No newline at end of file diff --git a/licenses/by-sa/legalcode_files/logo_code.gif b/licenses/by-sa/legalcode_files/logo_code.gif new file mode 100644 index 00000000..7de342c7 Binary files /dev/null and b/licenses/by-sa/legalcode_files/logo_code.gif differ diff --git a/licenses/gpl.txt b/licenses/gpl.txt new file mode 100644 index 00000000..d511905c --- /dev/null +++ b/licenses/gpl.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, 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 or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +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 give any other recipients of the Program a copy of this License +along with the Program. + +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 Program or any portion +of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +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 Program, 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 Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) 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; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, 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 executable. However, as a +special exception, the source code 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. + +If distribution of executable or 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 counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program 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. + + 5. 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 Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program 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 to +this License. + + 7. 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 Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program 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 Program. + +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. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program 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. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 Program +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 Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, 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 + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), 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 Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. 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 program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/licenses/lgpl.txt b/licenses/lgpl.txt new file mode 100644 index 00000000..5ab7695a --- /dev/null +++ b/licenses/lgpl.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 packages--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 a brief 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 --git a/patches/binutils/2.11.2/gcc-pr3106.patch b/patches/binutils/2.11.2/gcc-pr3106.patch new file mode 100644 index 00000000..c3a02646 --- /dev/null +++ b/patches/binutils/2.11.2/gcc-pr3106.patch @@ -0,0 +1,28 @@ +See http://gcc.gnu.org/PR3106 +Backported from gcc-3.0.x + +Fixes error + .../binutils-2.11.2/libiberty/strerror.c:468: error: conflicting types for `sys_nerr' + /usr/include/stdio.h:258: error: previous declaration of `sys_nerr' + make[1]: *** [strerror.o] Error 1 + make: *** [all-libiberty] Error 2 +on Mac OS X. + +--- binutils-2.11.2/libiberty/strerror.c.old 2004-03-24 16:23:19.000000000 -0800 ++++ binutils-2.11.2/libiberty/strerror.c 2004-03-24 16:23:48.000000000 -0800 +@@ -13,6 +13,7 @@ + incompatible with our later declaration, perhaps by using const + attributes. So we hide the declaration in errno.h (if any) using a + macro. */ ++#define sys_nerr sys_nerr__ + #define sys_errlist sys_errlist__ + #endif + +@@ -20,6 +21,7 @@ + #include <errno.h> + + #ifdef HAVE_SYS_ERRLIST ++#undef sys_nerr + #undef sys_errlist + #endif + diff --git a/patches/binutils/2.13.90.0.2/README b/patches/binutils/2.13.90.0.2/README new file mode 100644 index 00000000..521e6699 --- /dev/null +++ b/patches/binutils/2.13.90.0.2/README @@ -0,0 +1,6 @@ +The files rh62*.patch are from the Red Hat 6.2 file +binutils-2.13.90.0.2-2.src.rpm + +I am trusting here that Red Hat's patches are appropriate for all CPU +types. If I'm wrong, just remove the offending patch... +- Dan Kegel diff --git a/patches/binutils/2.13.90.0.2/rh62-binutils-2.11.93.0.2-sparc-nonpic.patch b/patches/binutils/2.13.90.0.2/rh62-binutils-2.11.93.0.2-sparc-nonpic.patch new file mode 100644 index 00000000..f8719a5c --- /dev/null +++ b/patches/binutils/2.13.90.0.2/rh62-binutils-2.11.93.0.2-sparc-nonpic.patch @@ -0,0 +1,96 @@ +2002-04-20 Jakub Jelinek <jakub@redhat.com> + + * elf32-sparc.c (elf32_sparc_relocate_section): Find real output + section with SEC_MERGE. + * elf64-sparc.c (sparc64_elf_relocate_section): Likewise. + +--- binutils/bfd/elf32-sparc.c.jj Sat Apr 20 22:11:57 2002 ++++ binutils/bfd/elf32-sparc.c Sat Apr 20 23:06:33 2002 +@@ -1144,7 +1144,7 @@ elf32_sparc_relocate_section (output_bfd + struct elf_link_hash_entry *h; + Elf_Internal_Sym *sym; + asection *sec; +- bfd_vma relocation, off; ++ bfd_vma relocation, off, orig_addend = 0; + bfd_reloc_status_type r; + boolean is_plt = false; + boolean unresolved_reloc; +@@ -1192,6 +1192,7 @@ elf32_sparc_relocate_section (output_bfd + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; ++ orig_addend = rel->r_addend; + relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); + } + else +@@ -1527,6 +1528,25 @@ elf32_sparc_relocate_section (output_bfd + asection *osec; + + osec = sec->output_section; ++ /* FIXME: As soon as making sections zero size ++ is possible, this if can go away. */ ++ if (bfd_is_abs_section (osec) ++ && h == NULL ++ && (sec->flags & SEC_MERGE) ++ && ELF_ST_TYPE (sym->st_info) == STT_SECTION ++ && (elf_section_data (sec)->sec_info_type ++ == ELF_INFO_TYPE_MERGE)) ++ { ++ asection *msec; ++ ++ msec = sec; ++ _bfd_merged_section_offset (output_bfd, &msec, ++ elf_section_data (sec)->sec_info, ++ sym->st_value + orig_addend, ++ (bfd_vma) 0); ++ osec = msec->output_section; ++ } ++ + indx = elf_section_data (osec)->dynindx; + + /* FIXME: we really should be able to link non-pic +--- binutils/bfd/elf64-sparc.c.jj Sat Apr 20 22:11:57 2002 ++++ binutils/bfd/elf64-sparc.c Sat Apr 20 23:12:18 2002 +@@ -1939,7 +1939,7 @@ sparc64_elf_relocate_section (output_bfd + struct elf_link_hash_entry *h; + Elf_Internal_Sym *sym; + asection *sec; +- bfd_vma relocation, off; ++ bfd_vma relocation, off, orig_addend = 0; + bfd_reloc_status_type r; + boolean is_plt = false; + boolean unresolved_reloc; +@@ -1982,6 +1982,7 @@ sparc64_elf_relocate_section (output_bfd + { + sym = local_syms + r_symndx; + sec = local_sections[r_symndx]; ++ orig_addend = rel->r_addend; + relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel); + } + else +@@ -2211,6 +2212,25 @@ sparc64_elf_relocate_section (output_bfd + asection *osec; + + osec = sec->output_section; ++ /* FIXME: As soon as making sections zero size ++ is possible, this if can go away. */ ++ if (bfd_is_abs_section (osec) ++ && h == NULL ++ && (sec->flags & SEC_MERGE) ++ && ELF_ST_TYPE (sym->st_info) == STT_SECTION ++ && (elf_section_data (sec)->sec_info_type ++ == ELF_INFO_TYPE_MERGE)) ++ { ++ asection *msec; ++ ++ msec = sec; ++ _bfd_merged_section_offset (output_bfd, &msec, ++ elf_section_data (sec)->sec_info, ++ sym->st_value + orig_addend, ++ (bfd_vma) 0); ++ osec = msec->output_section; ++ } ++ + indx = elf_section_data (osec)->dynindx; + + /* FIXME: we really should be able to link non-pic diff --git a/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-glibc21.patch b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-glibc21.patch new file mode 100644 index 00000000..a35b8f8f --- /dev/null +++ b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-glibc21.patch @@ -0,0 +1,58 @@ +--- binutils/ld/emulparams/elf_i386_glibc21.sh.jj Sat Aug 3 17:04:41 2002 ++++ binutils/ld/emulparams/elf_i386_glibc21.sh Sat Aug 3 17:04:41 2002 +@@ -0,0 +1,11 @@ ++SCRIPT_NAME=elf ++OUTPUT_FORMAT="elf32-i386" ++TEXT_START_ADDR=0x08048000 ++MAXPAGESIZE=0x1000 ++NONPAGED_TEXT_START_ADDR=0x08048000 ++ARCH=i386 ++MACHINE= ++NOP=0x9090 ++TEMPLATE_NAME=elf32 ++GENERATE_SHLIB_SCRIPT=yes ++LIB_PATH=/usr/i386-glibc21-linux/lib:/usr/local/lib +--- binutils/ld/configure.tgt.jj Thu Aug 1 20:49:32 2002 ++++ binutils/ld/configure.tgt Sat Aug 3 17:06:18 2002 +@@ -143,7 +143,8 @@ i[3456]86-*-linux*aout*) targ_emul=i386l + ;; + i[3456]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; + i[3456]86-*-linux-gnu*) targ_emul=elf_i386 +- targ_extra_emuls=i386linux ++ targ_extra_emuls="i386linux elf_i386_glibc21" ++ targ_extra_libpath=elf_i386_glibc21 + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi +--- binutils/ld/Makefile.am.jj Thu Aug 1 20:49:32 2002 ++++ binutils/ld/Makefile.am Sat Aug 3 17:04:41 2002 +@@ -181,6 +181,7 @@ ALL_EMULATIONS = \ + eelf_i386.o \ + eelf_i386_be.o \ + eelf_i386_chaos.o \ ++ eelf_i386_glibc21.o \ + eelf_i386_fbsd.o \ + eelf_i386_ldso.o \ + eelf_s390.o \ +@@ -718,6 +719,9 @@ eelf_i386_be.c: $(srcdir)/emulparams/elf + eelf_i386_chaos.c: $(srcdir)/emulparams/elf_i386_chaos.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_chaos.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf_i386_chaos "$(tdir_elf_i386_chaos)" ++eelf_i386_glibc21.c: $(srcdir)/emulparams/elf_i386_glibc21.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf_i386_glibc21 "$(tdir_elf_i386_glibc21)" + eelf_i386_fbsd.c: $(srcdir)/emulparams/elf_i386_fbsd.sh \ + $(srcdir)/emulparams/elf_i386.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} +--- binutils/ld/Makefile.in.jj Thu Aug 1 20:49:32 2002 ++++ binutils/ld/Makefile.in Sat Aug 3 17:07:34 2002 +@@ -1197,6 +1197,9 @@ eelf_i386_be.c: $(srcdir)/emulparams/elf + eelf_i386_chaos.c: $(srcdir)/emulparams/elf_i386_chaos.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_chaos.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf_i386_chaos "$(tdir_elf_i386_chaos)" ++eelf_i386_glibc21.c: $(srcdir)/emulparams/elf_i386_glibc21.sh \ ++ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ++ ${GENSCRIPTS} elf_i386_glibc21 "$(tdir_elf_i386_glibc21)" + eelf_i386_fbsd.c: $(srcdir)/emulparams/elf_i386_fbsd.sh \ + $(srcdir)/emulparams/elf_i386.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} diff --git a/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-gotpc.patch b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-gotpc.patch new file mode 100644 index 00000000..030dfa96 --- /dev/null +++ b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-gotpc.patch @@ -0,0 +1,372 @@ +2002-08-03 Jakub Jelinek <jakub@redhat.com> + + * config/tc-i386.c (output_insn): Save frag_now and frag_now_fix () + at start of insn, pass it to output_disp and output_imm. + (output_disp): Added arguments. If _GLOBAL_OFFSET_TABLE_ is seen + in displacement for R_386_32 reloc, use R_386_GOTPC and compute + properly addend. + (output_imm): Added arguments. Compute properly addend for + R_386_GOTPC. + (md_apply_fix3): Remove R_386_GOTPC handling. + * testsuite/gas/i386/gotpc.s: New. + * testsuite/gas/i386/gotpc.d: New. + * testsuite/gas/i386/i386.exp: Add gotpc test. + +--- binutils/gas/config/tc-i386.c.jj 2002-07-18 11:35:39.000000000 +0200 ++++ binutils/gas/config/tc-i386.c 2002-08-02 21:13:18.000000000 +0200 +@@ -104,8 +104,10 @@ static void output_insn PARAMS ((void)); + static void output_branch PARAMS ((void)); + static void output_jump PARAMS ((void)); + static void output_interseg_jump PARAMS ((void)); +-static void output_imm PARAMS ((void)); +-static void output_disp PARAMS ((void)); ++static void output_imm PARAMS ((fragS *insn_start_frag, ++ offsetT insn_start_off)); ++static void output_disp PARAMS ((fragS *insn_start_frag, ++ offsetT insn_start_off)); + #ifndef I386COFF + static void s_bss PARAMS ((int)); + #endif +@@ -3101,14 +3103,21 @@ output_interseg_jump () + md_number_to_chars (p + size, (valueT) i.op[0].imms->X_add_number, 2); + } + ++ + static void + output_insn () + { ++ fragS *insn_start_frag; ++ offsetT insn_start_off; ++ + /* Tie dwarf2 debug info to the address at the start of the insn. + We can't do this after the insn has been output as the current + frag may have been closed off. eg. by frag_var. */ + dwarf2_emit_insn (0); + ++ insn_start_frag = frag_now; ++ insn_start_off = frag_now_fix (); ++ + /* Output jumps. */ + if (i.tm.opcode_modifier & Jump) + output_branch (); +@@ -3179,10 +3188,10 @@ output_insn () + } + + if (i.disp_operands) +- output_disp (); ++ output_disp (insn_start_frag, insn_start_off); + + if (i.imm_operands) +- output_imm (); ++ output_imm (insn_start_frag, insn_start_off); + } + + #ifdef DEBUG386 +@@ -3194,7 +3203,9 @@ output_insn () + } + + static void +-output_disp () ++output_disp (insn_start_frag, insn_start_off) ++ fragS *insn_start_frag; ++ offsetT insn_start_off; + { + char *p; + unsigned int n; +@@ -3224,6 +3235,7 @@ output_disp () + } + else + { ++ RELOC_ENUM reloc_type; + int size = 4; + int sign = 0; + int pcrel = (i.flags[n] & Operand_PCrel) != 0; +@@ -3266,16 +3278,50 @@ output_disp () + } + + p = frag_more (size); ++ reloc_type = reloc (size, pcrel, sign, i.reloc[n]); ++#ifdef BFD_ASSEMBLER ++ if (reloc_type == BFD_RELOC_32 ++ && GOT_symbol ++ && GOT_symbol == i.op[n].disps->X_add_symbol ++ && (i.op[n].disps->X_op == O_symbol ++ || (i.op[n].disps->X_op == O_add ++ && ((symbol_get_value_expression ++ (i.op[n].disps->X_op_symbol)->X_op) ++ == O_subtract)))) ++ { ++ offsetT add; ++ ++ if (insn_start_frag == frag_now) ++ add = (p - frag_now->fr_literal) - insn_start_off; ++ else ++ { ++ fragS *fr; ++ ++ add = insn_start_frag->fr_fix - insn_start_off; ++ for (fr = insn_start_frag->fr_next; ++ fr && fr != frag_now; fr = fr->fr_next) ++ add += fr->fr_fix; ++ add += p - frag_now->fr_literal; ++ } ++ ++ /* We don't support dynamic linking on x86-64 yet. */ ++ if (flag_code == CODE_64BIT) ++ abort (); ++ reloc_type = BFD_RELOC_386_GOTPC; ++ i.op[n].disps->X_add_number += add; ++ } ++#endif + fix_new_exp (frag_now, p - frag_now->fr_literal, size, +- i.op[n].disps, pcrel, +- reloc (size, pcrel, sign, i.reloc[n])); ++ i.op[n].disps, pcrel, reloc_type); + } + } + } + } + + static void +-output_imm () ++output_imm (insn_start_frag, insn_start_off) ++ fragS *insn_start_frag; ++ offsetT insn_start_off; + { + char *p; + unsigned int n; +@@ -3328,6 +3374,48 @@ output_imm () + p = frag_more (size); + reloc_type = reloc (size, 0, sign, i.reloc[n]); + #ifdef BFD_ASSEMBLER ++ /* This is tough to explain. We end up with this one if we ++ * have operands that look like ++ * "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal here is to ++ * obtain the absolute address of the GOT, and it is strongly ++ * preferable from a performance point of view to avoid using ++ * a runtime relocation for this. The actual sequence of ++ * instructions often look something like: ++ * ++ * call .L66 ++ * .L66: ++ * popl %ebx ++ * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx ++ * ++ * The call and pop essentially return the absolute address ++ * of the label .L66 and store it in %ebx. The linker itself ++ * will ultimately change the first operand of the addl so ++ * that %ebx points to the GOT, but to keep things simple, the ++ * .o file must have this operand set so that it generates not ++ * the absolute address of .L66, but the absolute address of ++ * itself. This allows the linker itself simply treat a GOTPC ++ * relocation as asking for a pcrel offset to the GOT to be ++ * added in, and the addend of the relocation is stored in the ++ * operand field for the instruction itself. ++ * ++ * Our job here is to fix the operand so that it would add ++ * the correct offset so that %ebx would point to itself. The ++ * thing that is tricky is that .-.L66 will point to the ++ * beginning of the instruction, so we need to further modify ++ * the operand so that it will point to itself. There are ++ * other cases where you have something like: ++ * ++ * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66] ++ * ++ * and here no correction would be required. Internally in ++ * the assembler we treat operands of this form as not being ++ * pcrel since the '.' is explicitly mentioned, and I wonder ++ * whether it would simplify matters to do it this way. Who ++ * knows. In earlier versions of the PIC patches, the ++ * pcrel_adjust field was used to store the correction, but ++ * since the expression is not pcrel, I felt it would be ++ * confusing to do it this way. */ ++ + if (reloc_type == BFD_RELOC_32 + && GOT_symbol + && GOT_symbol == i.op[n].imms->X_add_symbol +@@ -3337,11 +3425,26 @@ output_imm () + (i.op[n].imms->X_op_symbol)->X_op) + == O_subtract)))) + { ++ offsetT add; ++ ++ if (insn_start_frag == frag_now) ++ add = (p - frag_now->fr_literal) - insn_start_off; ++ else ++ { ++ fragS *fr; ++ ++ add = insn_start_frag->fr_fix - insn_start_off; ++ for (fr = insn_start_frag->fr_next; ++ fr && fr != frag_now; fr = fr->fr_next) ++ add += fr->fr_fix; ++ add += p - frag_now->fr_literal; ++ } ++ + /* We don't support dynamic linking on x86-64 yet. */ + if (flag_code == CODE_64BIT) + abort (); + reloc_type = BFD_RELOC_386_GOTPC; +- i.op[n].imms->X_add_number += 3; ++ i.op[n].imms->X_add_number += add; + } + #endif + fix_new_exp (frag_now, p - frag_now->fr_literal, size, +@@ -4542,48 +4645,6 @@ md_apply_fix3 (fixP, valP, seg) + runtime we merely add the offset to the actual PLT entry. */ + value = -4; + break; +- case BFD_RELOC_386_GOTPC: +- +-/* This is tough to explain. We end up with this one if we have +- * operands that look like "_GLOBAL_OFFSET_TABLE_+[.-.L284]". The goal +- * here is to obtain the absolute address of the GOT, and it is strongly +- * preferable from a performance point of view to avoid using a runtime +- * relocation for this. The actual sequence of instructions often look +- * something like: +- * +- * call .L66 +- * .L66: +- * popl %ebx +- * addl $_GLOBAL_OFFSET_TABLE_+[.-.L66],%ebx +- * +- * The call and pop essentially return the absolute address of +- * the label .L66 and store it in %ebx. The linker itself will +- * ultimately change the first operand of the addl so that %ebx points to +- * the GOT, but to keep things simple, the .o file must have this operand +- * set so that it generates not the absolute address of .L66, but the +- * absolute address of itself. This allows the linker itself simply +- * treat a GOTPC relocation as asking for a pcrel offset to the GOT to be +- * added in, and the addend of the relocation is stored in the operand +- * field for the instruction itself. +- * +- * Our job here is to fix the operand so that it would add the correct +- * offset so that %ebx would point to itself. The thing that is tricky is +- * that .-.L66 will point to the beginning of the instruction, so we need +- * to further modify the operand so that it will point to itself. +- * There are other cases where you have something like: +- * +- * .long $_GLOBAL_OFFSET_TABLE_+[.-.L66] +- * +- * and here no correction would be required. Internally in the assembler +- * we treat operands of this form as not being pcrel since the '.' is +- * explicitly mentioned, and I wonder whether it would simplify matters +- * to do it this way. Who knows. In earlier versions of the PIC patches, +- * the pcrel_adjust field was used to store the correction, but since the +- * expression is not pcrel, I felt it would be confusing to do it this +- * way. */ +- +- value -= 1; +- break; + case BFD_RELOC_386_GOT32: + case BFD_RELOC_386_TLS_GD: + case BFD_RELOC_386_TLS_LDM: +--- binutils/gas/testsuite/gas/i386/gotpc.s.jj 2002-08-02 21:17:57.000000000 +0200 ++++ binutils/gas/testsuite/gas/i386/gotpc.s 2002-08-03 22:55:47.000000000 +0200 +@@ -0,0 +1,40 @@ ++ .text ++test: ++ addl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax ++ addl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx ++ addl $_GLOBAL_OFFSET_TABLE_, %eax ++ addl $_GLOBAL_OFFSET_TABLE_, %ebx ++ leal _GLOBAL_OFFSET_TABLE+[.-test](%eax), %ebx ++ leal _GLOBAL_OFFSET_TABLE+[.-test](%ebx), %eax ++ leal _GLOBAL_OFFSET_TABLE+[.-test](%eax), %eax ++ leal _GLOBAL_OFFSET_TABLE+[.-test](%ebx), %ebx ++ subl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax ++ subl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx ++ subl $_GLOBAL_OFFSET_TABLE_, %eax ++ subl $_GLOBAL_OFFSET_TABLE_, %ebx ++ orl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax ++ orl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx ++ orl $_GLOBAL_OFFSET_TABLE_, %eax ++ orl $_GLOBAL_OFFSET_TABLE_, %ebx ++ movl $_GLOBAL_OFFSET_TABLE_+[.-test], %eax ++ movl $_GLOBAL_OFFSET_TABLE_+[.-test], %ebx ++ movl $_GLOBAL_OFFSET_TABLE_, %eax ++ movl $_GLOBAL_OFFSET_TABLE_, %ebx ++ movl $_GLOBAL_OFFSET_TABLE_+[.-test], foo ++ movl $_GLOBAL_OFFSET_TABLE_+[.-test], %gs:foo ++ gs; movl $_GLOBAL_OFFSET_TABLE_+[.-test], foo ++ movl $_GLOBAL_OFFSET_TABLE_+[.-test], _GLOBAL_OFFSET_TABLE_ ++ movl _GLOBAL_OFFSET_TABLE_+[.-test], %eax ++ movl _GLOBAL_OFFSET_TABLE_+[.-test], %ebx ++ movl %eax, _GLOBAL_OFFSET_TABLE_+[.-test] ++ movl %ebx, _GLOBAL_OFFSET_TABLE_+[.-test] ++ movl %eax, %gs:_GLOBAL_OFFSET_TABLE_+[.-test] ++ movl %ebx, %gs:_GLOBAL_OFFSET_TABLE_+[.-test] ++ gs; movl %eax, _GLOBAL_OFFSET_TABLE_+[.-test] ++ gs; movl %ebx, _GLOBAL_OFFSET_TABLE_+[.-test] ++ leal _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %eax ++ leal _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %ebx ++ movl _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %eax ++ movl _GLOBAL_OFFSET_TABLE_@GOTOFF(%ebx), %ebx ++ .long _GLOBAL_OFFSET_TABLE_+[.-test] ++ .long _GLOBAL_OFFSET_TABLE_@GOTOFF +--- binutils/gas/testsuite/gas/i386/gotpc.d.jj 2002-08-02 21:18:43.000000000 +0200 ++++ binutils/gas/testsuite/gas/i386/gotpc.d 2002-08-03 23:05:43.000000000 +0200 +@@ -0,0 +1,52 @@ ++#objdump: -drw ++#name: i386 gotpc ++ ++.*: +file format .* ++ ++Disassembly of section .text: ++ ++0+000 <test>: ++ 0: 05 01 00 00 00 [ ]*add \$0x1,%eax 1: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 5: 81 c3 07 00 00 00 [ ]*add \$0x7,%ebx 7: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ b: 05 01 00 00 00 [ ]*add \$0x1,%eax c: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 10: 81 c3 02 00 00 00 [ ]*add \$0x2,%ebx 12: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 16: 8d 98 16 00 00 00 [ ]*lea 0x16\(%eax\),%ebx 18: (R_386_)?(dir)?32 _GLOBAL_OFFSET_TABLE ++ 1c: 8d 83 1c 00 00 00 [ ]*lea 0x1c\(%ebx\),%eax 1e: (R_386_)?(dir)?32 _GLOBAL_OFFSET_TABLE ++ 22: 8d 80 22 00 00 00 [ ]*lea 0x22\(%eax\),%eax 24: (R_386_)?(dir)?32 _GLOBAL_OFFSET_TABLE ++ 28: 8d 9b 28 00 00 00 [ ]*lea 0x28\(%ebx\),%ebx 2a: (R_386_)?(dir)?32 _GLOBAL_OFFSET_TABLE ++ 2e: 2d 2f 00 00 00 [ ]*sub \$0x2f,%eax 2f: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 33: 81 eb 35 00 00 00 [ ]*sub \$0x35,%ebx 35: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 39: 2d 01 00 00 00 [ ]*sub \$0x1,%eax 3a: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 3e: 81 eb 02 00 00 00 [ ]*sub \$0x2,%ebx 40: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 44: 0d 45 00 00 00 [ ]*or \$0x45,%eax 45: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 49: 81 cb 4b 00 00 00 [ ]*or \$0x4b,%ebx 4b: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 4f: 0d 01 00 00 00 [ ]*or \$0x1,%eax 50: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 54: 81 cb 02 00 00 00 [ ]*or \$0x2,%ebx 56: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 5a: b8 5b 00 00 00 [ ]*mov \$0x5b,%eax 5b: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 5f: bb 60 00 00 00 [ ]*mov \$0x60,%ebx 60: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 64: b8 01 00 00 00 [ ]*mov \$0x1,%eax 65: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 69: bb 01 00 00 00 [ ]*mov \$0x1,%ebx 6a: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 6e: c7 05 00 00 00 00 74 00 00 00 [ ]*movl \$0x74,0x0 70: (R_386_)?(dir)?32 foo ++[ ]*74: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 78: 65 c7 05 00 00 00 00 7f 00 00 00 [ ]*movl \$0x7f,%gs:0x0 7b: (R_386_)?(dir)?32 foo ++[ ]*7f: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 83: 65 c7 05 00 00 00 00 8a 00 00 00 [ ]*movl \$0x8a,%gs:0x0 86: (R_386_)?(dir)?32 foo ++[ ]*8a: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 8e: c7 05 02 00 00 00 94 00 00 00 [ ]*movl \$0x94,0x2 90: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++[ ]*94: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 98: a1 99 00 00 00 [ ]*mov 0x99,%eax 99: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ 9d: 8b 1d 9f 00 00 00 [ ]*mov 0x9f,%ebx 9f: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ a3: a3 a4 00 00 00 [ ]*mov %eax,0xa4 a4: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ a8: 89 1d aa 00 00 00 [ ]*mov %ebx,0xaa aa: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ ae: 65 a3 b0 00 00 00 [ ]*mov %eax,%gs:0xb0 b0: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ b4: 65 89 1d b7 00 00 00 [ ]*mov %ebx,%gs:0xb7 b7: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ bb: 65 a3 bd 00 00 00 [ ]*mov %eax,%gs:0xbd bd: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ c1: 65 89 1d c4 00 00 00 [ ]*mov %ebx,%gs:0xc4 c4: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ c8: 8d 83 00 00 00 00 [ ]*lea 0x0\(%ebx\),%eax ca: (R_386_)?GOTOFF _GLOBAL_OFFSET_TABLE_ ++ ce: 8d 9b 00 00 00 00 [ ]*lea 0x0\(%ebx\),%ebx d0: (R_386_)?GOTOFF _GLOBAL_OFFSET_TABLE_ ++ d4: 8b 83 00 00 00 00 [ ]*mov 0x0\(%ebx\),%eax d6: (R_386_)?GOTOFF _GLOBAL_OFFSET_TABLE_ ++ da: 8b 9b 00 00 00 00 [ ]*mov 0x0\(%ebx\),%ebx dc: (R_386_)?GOTOFF _GLOBAL_OFFSET_TABLE_ ++ e0: e0 00 [ ]*loopne e2 <test\+0xe2> e0: (R_386_)?GOTPC _GLOBAL_OFFSET_TABLE_ ++ e2: 00 00 [ ]*add %al,\(%eax\) ++ e4: 00 00 [ ]*add %al,\(%eax\) e4: (R_386_)?GOTOFF _GLOBAL_OFFSET_TABLE_ ++ ... +--- binutils/gas/testsuite/gas/i386/i386.exp.jj 2002-07-18 11:35:39.000000000 +0200 ++++ binutils/gas/testsuite/gas/i386/i386.exp 2002-08-02 21:57:46.000000000 +0200 +@@ -53,6 +53,7 @@ if [expr ([istarget "i*86-*-*"] || [ist + run_dump_test "jump" + run_dump_test "ssemmx2" + run_dump_test "sse2" ++ run_dump_test "gotpc" + + # PIC is only supported on ELF targets. + if { ([istarget "*-*-elf*"] || [istarget "*-*-linux*"] ) + diff --git a/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-tpoff32.patch b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-tpoff32.patch new file mode 100644 index 00000000..511a11e5 --- /dev/null +++ b/patches/binutils/2.13.90.0.2/rh62-binutils-2.13.90.0.2-tpoff32.patch @@ -0,0 +1,27 @@ +2002-08-07 Jakub Jelinek <jakub@redhat.com> + + * elf32-i386.c (elf_i386_relocate_section): Fill in proper addend + for R_386_TLS_TPOFF32 relocs against symndx 0. + +--- binutils/bfd/elf32-i386.c.jj 2002-07-30 16:14:55.000000000 +0200 ++++ binutils/bfd/elf32-i386.c 2002-08-07 23:41:48.000000000 +0200 +@@ -2561,13 +2567,17 @@ elf_i386_relocate_section (output_bfd, i + outrel.r_offset = (htab->sgot->output_section->vma + + htab->sgot->output_offset + off); + +- bfd_put_32 (output_bfd, 0, +- htab->sgot->contents + off); + indx = h && h->dynindx != -1 ? h->dynindx : 0; + if (r_type == R_386_TLS_GD) + dr_type = R_386_TLS_DTPMOD32; + else + dr_type = R_386_TLS_TPOFF32; ++ if (dr_type == R_386_TLS_TPOFF32 && indx == 0) ++ bfd_put_32 (output_bfd, relocation - dtpoff_base (info), ++ htab->sgot->contents + off); ++ else ++ bfd_put_32 (output_bfd, 0, ++ htab->sgot->contents + off); + outrel.r_info = ELF32_R_INFO (indx, dr_type); + loc = (Elf32_External_Rel *) htab->srelgot->contents; + loc += htab->srelgot->reloc_count++; diff --git a/patches/binutils/2.14.90.0.5/binutils-cross-demangler.patch b/patches/binutils/2.14.90.0.5/binutils-cross-demangler.patch new file mode 100644 index 00000000..ec701ce6 --- /dev/null +++ b/patches/binutils/2.14.90.0.5/binutils-cross-demangler.patch @@ -0,0 +1,11 @@ +--- orig/Makefile.in 2004-05-12 18:22:30.000000000 -0700 ++++ binutils-2.14.90.0.5/Makefile.in 2004-05-12 18:26:19.000000000 -0700 +@@ -24384,6 +24384,8 @@ + # Demangler depends on libiberty. + configure-demangler: maybe-configure-libiberty + all-demangler: maybe-all-libiberty ++configure-build-demangler: maybe-configure-build-libiberty ++all-build-demangler: maybe-all-build-libiberty + + # The new demangler, which is included in libiberty, is written in C++. + # A working C++ compiler is required. For the target demangler, it may diff --git a/patches/binutils/2.14.90.0.5/binutils-sh-relocs.patch b/patches/binutils/2.14.90.0.5/binutils-sh-relocs.patch new file mode 100644 index 00000000..ca0f2ac2 --- /dev/null +++ b/patches/binutils/2.14.90.0.5/binutils-sh-relocs.patch @@ -0,0 +1,38 @@ +Message-Id: <200307311239.h6VCdNe27056@r-rr.iij4u.or.jp> +To: dank@kegel.com +Cc: kkojima@rr.iij4u.or.jp +Subject: Re: Writing PIC version of __udivsi3_i4? (was: Re: "make tests" fails + with "libc.so: text relocations used" in glibc-2.3.2 for sh4) +In-Reply-To: Your message of "Wed, 30 Jul 2003 21:55:54 -0700" + <3F28A15A.5010400@kegel.com> +References: <3F28A15A.5010400@kegel.com> +Date: Thu, 31 Jul 2003 21:47:38 +0900 +From: kaz Kojima <kkojima@rr.iij4u.or.jp> + +Dan Kegel <dank@kegel.com> wrote: +>> I'll give binutils-2.14.90.0.5 a shot, then. +> +> No joy - same problem. Guess I'll take this up on binutils and/or libc-alpha. + +Please try the patch below, though it's a diff against the current +binutils CVS. + +Regards, + kaz +-- +diff -u3p ORIG/src/bfd/elf32-sh.c LOCAL/src/bfd/elf32-sh.c +--- src/bfd/elf32-sh.c.old Fri Jul 25 14:46:58 2003 ++++ src/bfd/elf32-sh.c Thu Jul 31 21:09:38 2003 +@@ -6497,8 +6497,10 @@ sh_elf_check_relocs (bfd *abfd, struct b + sreloc, 2)) + return FALSE; + } ++#if 0 + if (sec->flags & SEC_READONLY) + info->flags |= DF_TEXTREL; ++#endif + elf_section_data (sec)->sreloc = sreloc; + } + + + diff --git a/patches/binutils/2.14.90.0.7/binutils-cross-demangler.patch b/patches/binutils/2.14.90.0.7/binutils-cross-demangler.patch new file mode 100644 index 00000000..ec701ce6 --- /dev/null +++ b/patches/binutils/2.14.90.0.7/binutils-cross-demangler.patch @@ -0,0 +1,11 @@ +--- orig/Makefile.in 2004-05-12 18:22:30.000000000 -0700 ++++ binutils-2.14.90.0.5/Makefile.in 2004-05-12 18:26:19.000000000 -0700 +@@ -24384,6 +24384,8 @@ + # Demangler depends on libiberty. + configure-demangler: maybe-configure-libiberty + all-demangler: maybe-all-libiberty ++configure-build-demangler: maybe-configure-build-libiberty ++all-build-demangler: maybe-all-build-libiberty + + # The new demangler, which is included in libiberty, is written in C++. + # A working C++ compiler is required. For the target demangler, it may diff --git a/patches/binutils/2.14.92/binutils-skip-comments.patch b/patches/binutils/2.14.92/binutils-skip-comments.patch new file mode 100644 index 00000000..804a17e0 --- /dev/null +++ b/patches/binutils/2.14.92/binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab <schwab at suse dot de> +To: Nathan Sidwell <nathan at codesourcery dot com> +Cc: Ian Lance Taylor <ian at wasabisystems dot com>, binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell <nathan@codesourcery.com> writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab <schwab@suse.de> + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/patches/binutils/2.14.92/gccpr15247-fix.patch b/patches/binutils/2.14.92/gccpr15247-fix.patch new file mode 100644 index 00000000..967bf7f9 --- /dev/null +++ b/patches/binutils/2.14.92/gccpr15247-fix.patch @@ -0,0 +1,192 @@ +See +http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15247 + +Fixes spurious error +/tmp/ccvNi4ou.s: Assembler messages: +/tmp/ccvNi4ou.s:2310: Error: Illegal operands: There are only 32 single precision f registers; [0-31] +make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/math/dosincos.o] Error 1 + +when compiling glibc's dosincos.c with gcc-3.4.0 + +=================================================================== +RCS file: /cvs/src/src/opcodes/sparc-opc.c,v +retrieving revision 1.9 +retrieving revision 1.10 +diff -u -r1.9 -r1.10 +--- src/opcodes/sparc-opc.c 2004/01/18 23:46:32 1.9 ++++ src/opcodes/sparc-opc.c 2004/04/20 10:23:51 1.10 +@@ -1273,110 +1273,72 @@ + #define FM_DF 2 /* v9 */ + #define FM_QF 3 /* v9 */ + +-#define fmovicc(opcode, fpsize, cond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z,f,g", flags, v9 } +- +-#define fmovfcc(opcode, fpsize, fcond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags, v9 } ++#define fmoviccx(opcode, fpsize, args, cond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z," args, flags, v9 } ++ ++#define fmovfccx(opcode, fpsize, args, fcond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags, v9 } + + /* FIXME: use fmovicc/fmovfcc? */ /* v9 */ +-#define fmovcc(opcode, fpsize, cond, fcond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags | F_FLOAT, v9 } +- +-/* v9 */ fmovcc ("fmovda", FM_DF, CONDA, FCONDA, 0), +-/* v9 */ fmovcc ("fmovqa", FM_QF, CONDA, FCONDA, 0), +-/* v9 */ fmovcc ("fmovsa", FM_SF, CONDA, FCONDA, 0), +-/* v9 */ fmovicc ("fmovdcc", FM_DF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovqcc", FM_QF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovscc", FM_SF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovdcs", FM_DF, CONDCS, 0), +-/* v9 */ fmovicc ("fmovqcs", FM_QF, CONDCS, 0), +-/* v9 */ fmovicc ("fmovscs", FM_SF, CONDCS, 0), +-/* v9 */ fmovcc ("fmovde", FM_DF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovqe", FM_QF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovse", FM_SF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovdg", FM_DF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovqg", FM_QF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovsg", FM_SF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovdge", FM_DF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovcc ("fmovqge", FM_QF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovcc ("fmovsge", FM_SF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovicc ("fmovdgeu", FM_DF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovqgeu", FM_QF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovsgeu", FM_SF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovdgu", FM_DF, CONDGU, 0), +-/* v9 */ fmovicc ("fmovqgu", FM_QF, CONDGU, 0), +-/* v9 */ fmovicc ("fmovsgu", FM_SF, CONDGU, 0), +-/* v9 */ fmovcc ("fmovdl", FM_DF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovql", FM_QF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovsl", FM_SF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovdle", FM_DF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovcc ("fmovqle", FM_QF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovcc ("fmovsle", FM_SF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovicc ("fmovdleu", FM_DF, CONDLEU, 0), +-/* v9 */ fmovicc ("fmovqleu", FM_QF, CONDLEU, 0), +-/* v9 */ fmovicc ("fmovsleu", FM_SF, CONDLEU, 0), +-/* v9 */ fmovfcc ("fmovdlg", FM_DF, FCONDLG, 0), +-/* v9 */ fmovfcc ("fmovqlg", FM_QF, FCONDLG, 0), +-/* v9 */ fmovfcc ("fmovslg", FM_SF, FCONDLG, 0), +-/* v9 */ fmovicc ("fmovdlu", FM_DF, CONDLU, F_ALIAS), +-/* v9 */ fmovicc ("fmovqlu", FM_QF, CONDLU, F_ALIAS), +-/* v9 */ fmovicc ("fmovslu", FM_SF, CONDLU, F_ALIAS), +-/* v9 */ fmovcc ("fmovdn", FM_DF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovqn", FM_QF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovsn", FM_SF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovdne", FM_DF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovcc ("fmovqne", FM_QF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovcc ("fmovsne", FM_SF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovicc ("fmovdneg", FM_DF, CONDNEG, 0), +-/* v9 */ fmovicc ("fmovqneg", FM_QF, CONDNEG, 0), +-/* v9 */ fmovicc ("fmovsneg", FM_SF, CONDNEG, 0), +-/* v9 */ fmovcc ("fmovdnz", FM_DF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovqnz", FM_QF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovsnz", FM_SF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovfcc ("fmovdo", FM_DF, FCONDO, 0), +-/* v9 */ fmovfcc ("fmovqo", FM_QF, FCONDO, 0), +-/* v9 */ fmovfcc ("fmovso", FM_SF, FCONDO, 0), +-/* v9 */ fmovicc ("fmovdpos", FM_DF, CONDPOS, 0), +-/* v9 */ fmovicc ("fmovqpos", FM_QF, CONDPOS, 0), +-/* v9 */ fmovicc ("fmovspos", FM_SF, CONDPOS, 0), +-/* v9 */ fmovfcc ("fmovdu", FM_DF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovqu", FM_QF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovsu", FM_SF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovdue", FM_DF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovque", FM_QF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovsue", FM_SF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovdug", FM_DF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovqug", FM_QF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovsug", FM_SF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovduge", FM_DF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovquge", FM_QF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovsuge", FM_SF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovdul", FM_DF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovqul", FM_QF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovsul", FM_SF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovdule", FM_DF, FCONDULE, 0), +-/* v9 */ fmovfcc ("fmovqule", FM_QF, FCONDULE, 0), +-/* v9 */ fmovfcc ("fmovsule", FM_SF, FCONDULE, 0), +-/* v9 */ fmovicc ("fmovdvc", FM_DF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovqvc", FM_QF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovsvc", FM_SF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovdvs", FM_DF, CONDVS, 0), +-/* v9 */ fmovicc ("fmovqvs", FM_QF, CONDVS, 0), +-/* v9 */ fmovicc ("fmovsvs", FM_SF, CONDVS, 0), +-/* v9 */ fmovcc ("fmovdz", FM_DF, CONDZ, FCONDZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovqz", FM_QF, CONDZ, FCONDZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovsz", FM_SF, CONDZ, FCONDZ, F_ALIAS), +- ++#define fmovccx(opcode, fpsize, args, cond, fcond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags | F_FLOAT, v9 } ++ ++#define fmovicc(suffix, cond, flags) /* v9 */ \ ++fmoviccx("fmovd" suffix, FM_DF, "B,H", cond, flags), \ ++fmoviccx("fmovq" suffix, FM_QF, "R,J", cond, flags), \ ++fmoviccx("fmovs" suffix, FM_SF, "f,g", cond, flags) ++ ++#define fmovfcc(suffix, fcond, flags) /* v9 */ \ ++fmovfccx("fmovd" suffix, FM_DF, "B,H", fcond, flags), \ ++fmovfccx("fmovq" suffix, FM_QF, "R,J", fcond, flags), \ ++fmovfccx("fmovs" suffix, FM_SF, "f,g", fcond, flags) ++ ++#define fmovcc(suffix, cond, fcond, flags) /* v9 */ \ ++fmovccx("fmovd" suffix, FM_DF, "B,H", cond, fcond, flags), \ ++fmovccx("fmovq" suffix, FM_QF, "R,J", cond, fcond, flags), \ ++fmovccx("fmovs" suffix, FM_SF, "f,g", cond, fcond, flags) ++ ++/* v9 */ fmovcc ("a", CONDA, FCONDA, 0), ++/* v9 */ fmovicc ("cc", CONDCC, 0), ++/* v9 */ fmovicc ("cs", CONDCS, 0), ++/* v9 */ fmovcc ("e", CONDE, FCONDE, 0), ++/* v9 */ fmovcc ("g", CONDG, FCONDG, 0), ++/* v9 */ fmovcc ("ge", CONDGE, FCONDGE, 0), ++/* v9 */ fmovicc ("geu", CONDGEU, F_ALIAS), ++/* v9 */ fmovicc ("gu", CONDGU, 0), ++/* v9 */ fmovcc ("l", CONDL, FCONDL, 0), ++/* v9 */ fmovcc ("le", CONDLE, FCONDLE, 0), ++/* v9 */ fmovicc ("leu", CONDLEU, 0), ++/* v9 */ fmovfcc ("lg", FCONDLG, 0), ++/* v9 */ fmovicc ("lu", CONDLU, F_ALIAS), ++/* v9 */ fmovcc ("n", CONDN, FCONDN, 0), ++/* v9 */ fmovcc ("ne", CONDNE, FCONDNE, 0), ++/* v9 */ fmovicc ("neg", CONDNEG, 0), ++/* v9 */ fmovcc ("nz", CONDNZ, FCONDNZ, F_ALIAS), ++/* v9 */ fmovfcc ("o", FCONDO, 0), ++/* v9 */ fmovicc ("pos", CONDPOS, 0), ++/* v9 */ fmovfcc ("u", FCONDU, 0), ++/* v9 */ fmovfcc ("ue", FCONDUE, 0), ++/* v9 */ fmovfcc ("ug", FCONDUG, 0), ++/* v9 */ fmovfcc ("uge", FCONDUGE, 0), ++/* v9 */ fmovfcc ("ul", FCONDUL, 0), ++/* v9 */ fmovfcc ("ule", FCONDULE, 0), ++/* v9 */ fmovicc ("vc", CONDVC, 0), ++/* v9 */ fmovicc ("vs", CONDVS, 0), ++/* v9 */ fmovcc ("z", CONDZ, FCONDZ, F_ALIAS), ++ ++#undef fmoviccx /* v9 */ ++#undef fmovfccx /* v9 */ ++#undef fmovccx /* v9 */ + #undef fmovicc /* v9 */ + #undef fmovfcc /* v9 */ + #undef fmovcc /* v9 */ diff --git a/patches/binutils/2.14/binutils-sh-relocs.patch b/patches/binutils/2.14/binutils-sh-relocs.patch new file mode 100644 index 00000000..ca0f2ac2 --- /dev/null +++ b/patches/binutils/2.14/binutils-sh-relocs.patch @@ -0,0 +1,38 @@ +Message-Id: <200307311239.h6VCdNe27056@r-rr.iij4u.or.jp> +To: dank@kegel.com +Cc: kkojima@rr.iij4u.or.jp +Subject: Re: Writing PIC version of __udivsi3_i4? (was: Re: "make tests" fails + with "libc.so: text relocations used" in glibc-2.3.2 for sh4) +In-Reply-To: Your message of "Wed, 30 Jul 2003 21:55:54 -0700" + <3F28A15A.5010400@kegel.com> +References: <3F28A15A.5010400@kegel.com> +Date: Thu, 31 Jul 2003 21:47:38 +0900 +From: kaz Kojima <kkojima@rr.iij4u.or.jp> + +Dan Kegel <dank@kegel.com> wrote: +>> I'll give binutils-2.14.90.0.5 a shot, then. +> +> No joy - same problem. Guess I'll take this up on binutils and/or libc-alpha. + +Please try the patch below, though it's a diff against the current +binutils CVS. + +Regards, + kaz +-- +diff -u3p ORIG/src/bfd/elf32-sh.c LOCAL/src/bfd/elf32-sh.c +--- src/bfd/elf32-sh.c.old Fri Jul 25 14:46:58 2003 ++++ src/bfd/elf32-sh.c Thu Jul 31 21:09:38 2003 +@@ -6497,8 +6497,10 @@ sh_elf_check_relocs (bfd *abfd, struct b + sreloc, 2)) + return FALSE; + } ++#if 0 + if (sec->flags & SEC_READONLY) + info->flags |= DF_TEXTREL; ++#endif + elf_section_data (sec)->sreloc = sreloc; + } + + + diff --git a/patches/binutils/2.15.90.0.3/binutils-20040817-linkonce.patch b/patches/binutils/2.15.90.0.3/binutils-20040817-linkonce.patch new file mode 100644 index 00000000..97fa6eed --- /dev/null +++ b/patches/binutils/2.15.90.0.3/binutils-20040817-linkonce.patch @@ -0,0 +1,118 @@ +From http://sources.redhat.com/ml/binutils/2004-08/msg00190.html + +Date: Tue, 17 Aug 2004 12:04:29 +0200 +From: Jakub Jelinek <jakub at redhat dot com> +To: binutils at sources dot redhat dot com +Subject: [PATCH] Fix `defined in discarded section' errors when building ia64 gcc +Message-ID: <20040817100429.GL30497@sunsite.ms.mff.cuni.cz> +Reply-To: Jakub Jelinek <jakub at redhat dot com> +References: <20040817090201.GK30497@sunsite.ms.mff.cuni.cz> +In-Reply-To: <20040817090201 dot GK30497 at sunsite dot ms dot mff dot cuni dot cz> + +On Tue, Aug 17, 2004 at 11:02:01AM +0200, Jakub Jelinek wrote: +> Current gcc 3.4.x (at least gcc-3_4-rhl-branch) doesn't build with CVS +> binutils (nor 2.15.91.0.2). +> The problem is that libstdc++.so linking fails with: +> `.gnu.linkonce.t._ZNSdD2Ev' referenced in section `.gnu.linkonce.ia64unw._ZNSdD2Ev' of .libs/sstream-inst.o: defined in discarded section `.gnu.linkonce.t._ZNSdD2Ev' of .libs/sstream-inst.o +> The problem is that both io-inst.s and sstream-inst.s have +> .gnu.linkonce.t._ZNSdD2Ev definition, but because io-inst.cc +> also instantiates some templates sstream-inst.cc doesn't instantiate, +> the inliner can do a better job in io-inst.cc. +> The result is that _ZNSdD2Ev in io-inst.cc is a leaf routine, while +> it is not in sstream-inst.cc (in assembly, +> _ZNSdD2Ev in io-inst.s starts with .prologue and no .save directives, +> while _ZNSdD2Ev] in sstream-inst.s has .prologue 12, 35 and some +> .save directives. +> IA-64 ABI allows leaf routines to have no unwind section at all, +> which means .gnu.linkonce.ia64unw._ZNSdD2Ev is not created in +> io-inst.o at all and as .gnu.linkonce.t._ZNSdD2Ev comes first +> and wins, .gnu.linkonce.ia64unw._ZNSdD2Ev in sstream.o suddenly +> references a discarded section. +> +> Not sure what should be done here, but certainly the compiler +> isn't at fault here, it is a binutils problem. +> One fix could be to create empty .gnu.linkonce.ia64unw.* section +> in assembler, another special case ia64 unwind sections in the linker. + +Here is a patch for the first possibility. +It certainly makes libstdc++.so to link and even the unwind info looks +good on brief skimming. + +2004-08-17 Jakub Jelinek <jakub@redhat.com> + + * config/tc-ia64.c (start_unwind_section): Add linkonce_empty + argument, don't do anything if current section is not + .gnu.linkonce.t.* and linkonce_empty is set. + (generate_unwind_image, dot_endp): Adjust callers, call + start_unwind_section (*, 1) if nothing will be put into the + section. + +--- binutils/gas/config/tc-ia64.c.jj 2004-07-30 11:42:24.000000000 +0200 ++++ binutils/gas/config/tc-ia64.c 2004-08-17 13:45:04.288173205 +0200 +@@ -1,5 +1,6 @@ + /* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture. +- Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 ++ Free Software Foundation, Inc. + Contributed by David Mosberger-Tang <davidm@hpl.hp.com> + + This file is part of GAS, the GNU Assembler. +@@ -3297,7 +3298,7 @@ static char *special_linkonce_name[] = + }; + + static void +-start_unwind_section (const segT text_seg, int sec_index) ++start_unwind_section (const segT text_seg, int sec_index, int linkonce_empty) + { + /* + Use a slightly ugly scheme to derive the unwind section names from +@@ -3359,6 +3360,8 @@ start_unwind_section (const segT text_se + prefix = special_linkonce_name [sec_index - SPECIAL_SECTION_UNWIND]; + suffix += sizeof (".gnu.linkonce.t.") - 1; + } ++ else if (linkonce_empty) ++ return; + + prefix_len = strlen (prefix); + suffix_len = strlen (suffix); +@@ -3444,7 +3447,7 @@ generate_unwind_image (const segT text_s + expressionS exp; + bfd_reloc_code_real_type reloc; + +- start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO); ++ start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 0); + + /* Make sure the section has 4 byte alignment for ILP32 and + 8 byte alignment for LP64. */ +@@ -3485,6 +3488,8 @@ generate_unwind_image (const segT text_s + unwind.personality_routine = 0; + } + } ++ else ++ start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 1); + + free_saved_prologue_counts (); + unwind.list = unwind.tail = unwind.current_entry = NULL; +@@ -4164,7 +4169,7 @@ dot_endp (dummy) + subseg_set (md.last_text_seg, 0); + unwind.proc_end = expr_build_dot (); + +- start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND); ++ start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 0); + + /* Make sure that section has 4 byte alignment for ILP32 and + 8 byte alignment for LP64. */ +@@ -4204,6 +4209,9 @@ dot_endp (dummy) + bytes_per_address); + + } ++ else ++ start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 1); ++ + subseg_set (saved_seg, saved_subseg); + + /* Parse names of main and alternate entry points and set symbol sizes. */ + + + Jakub + diff --git a/patches/binutils/2.15.90.0.3/binutils-20040820-duplicates.patch b/patches/binutils/2.15.90.0.3/binutils-20040820-duplicates.patch new file mode 100644 index 00000000..03f64533 --- /dev/null +++ b/patches/binutils/2.15.90.0.3/binutils-20040820-duplicates.patch @@ -0,0 +1,74 @@ +See http://sources.redhat.com/ml/binutils/2004-08/msg00256.html + +Date: Fri, 20 Aug 2004 21:13:43 -0400 +From: Daniel Jacobowitz <drow at false dot org> +To: binutils at sources dot redhat dot com +Subject: Re: Handle SEC_LINK_DUPLICATES_SAME_CONTENTS for arm-linux +Message-ID: <20040821011342.GA30319@nevyn.them.org> +Mail-Followup-To: binutils at sources dot redhat dot com +References: <20040818145518.GA9774@nevyn.them.org> <20040819055040.GA11820@lucon.org> <20040819080034.GE21716@bubble.modra.org> <20040820173240.GA17678@nevyn.them.org> <20040821003737.GB16016@bubble.modra.org> +In-Reply-To: <20040821003737 dot GB16016 at bubble dot modra dot org> + +On Sat, Aug 21, 2004 at 10:07:38AM +0930, Alan Modra wrote: +> On Fri, Aug 20, 2004 at 01:32:40PM -0400, Daniel Jacobowitz wrote: +> > Thanks. How's this? +> +> As you might have guessed from my rather slack review of your previous +> patch, I trust you enough to give the OK without proper review. But +> since you asked... :) + +Checked in as so. + +-- +Daniel Jacobowitz + +2004-08-20 Daniel Jacobowitz <dan@debian.org> + + * elflink.c (_bfd_elf_section_already_linked): Handle + SEC_LINK_DUPLICATES_SAME_CONTENTS. + +Index: elflink.c +=================================================================== +RCS file: /big/fsf/rsync/src-cvs/src/bfd/elflink.c,v +retrieving revision 1.97 +diff -u -p -r1.97 elflink.c +--- binutils/bfd/elflink.c 18 Aug 2004 02:45:42 -0000 1.97 ++++ binutils/bfd/elflink.c 21 Aug 2004 00:59:08 -0000 +@@ -9366,6 +9366,36 @@ _bfd_elf_section_already_linked (bfd *ab + (_("%B: duplicate section `%A' has different size\n"), + abfd, sec); + break; ++ ++ case SEC_LINK_DUPLICATES_SAME_CONTENTS: ++ if (sec->size != l->sec->size) ++ (*_bfd_error_handler) ++ (_("%B: duplicate section `%A' has different size\n"), ++ abfd, sec); ++ else if (sec->size != 0) ++ { ++ bfd_byte *sec_contents, *l_sec_contents; ++ ++ if (!bfd_malloc_and_get_section (abfd, sec, &sec_contents)) ++ (*_bfd_error_handler) ++ (_("%B: warning: could not read contents of section `%A'\n"), ++ abfd, sec); ++ else if (!bfd_malloc_and_get_section (l->sec->owner, l->sec, ++ &l_sec_contents)) ++ (*_bfd_error_handler) ++ (_("%B: warning: could not read contents of section `%A'\n"), ++ l->sec->owner, l->sec); ++ else if (memcmp (sec_contents, l_sec_contents, sec->size) != 0) ++ (*_bfd_error_handler) ++ (_("%B: warning: duplicate section `%A' has different contents\n"), ++ abfd, sec); ++ ++ if (sec_contents) ++ free (sec_contents); ++ if (l_sec_contents) ++ free (l_sec_contents); ++ } ++ break; + } + + /* Set the output_section field so that lang_add_section + diff --git a/patches/binutils/2.15.90.0.3/binutils-skip-comments.patch b/patches/binutils/2.15.90.0.3/binutils-skip-comments.patch new file mode 100644 index 00000000..804a17e0 --- /dev/null +++ b/patches/binutils/2.15.90.0.3/binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab <schwab at suse dot de> +To: Nathan Sidwell <nathan at codesourcery dot com> +Cc: Ian Lance Taylor <ian at wasabisystems dot com>, binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell <nathan@codesourcery.com> writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab <schwab@suse.de> + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/patches/binutils/2.15.90.0.3/gccpr15247-fix.patch b/patches/binutils/2.15.90.0.3/gccpr15247-fix.patch new file mode 100644 index 00000000..967bf7f9 --- /dev/null +++ b/patches/binutils/2.15.90.0.3/gccpr15247-fix.patch @@ -0,0 +1,192 @@ +See +http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15247 + +Fixes spurious error +/tmp/ccvNi4ou.s: Assembler messages: +/tmp/ccvNi4ou.s:2310: Error: Illegal operands: There are only 32 single precision f registers; [0-31] +make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/math/dosincos.o] Error 1 + +when compiling glibc's dosincos.c with gcc-3.4.0 + +=================================================================== +RCS file: /cvs/src/src/opcodes/sparc-opc.c,v +retrieving revision 1.9 +retrieving revision 1.10 +diff -u -r1.9 -r1.10 +--- src/opcodes/sparc-opc.c 2004/01/18 23:46:32 1.9 ++++ src/opcodes/sparc-opc.c 2004/04/20 10:23:51 1.10 +@@ -1273,110 +1273,72 @@ + #define FM_DF 2 /* v9 */ + #define FM_QF 3 /* v9 */ + +-#define fmovicc(opcode, fpsize, cond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z,f,g", flags, v9 } +- +-#define fmovfcc(opcode, fpsize, fcond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags, v9 } ++#define fmoviccx(opcode, fpsize, args, cond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z," args, flags, v9 } ++ ++#define fmovfccx(opcode, fpsize, args, fcond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags, v9 } + + /* FIXME: use fmovicc/fmovfcc? */ /* v9 */ +-#define fmovcc(opcode, fpsize, cond, fcond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags | F_FLOAT, v9 } +- +-/* v9 */ fmovcc ("fmovda", FM_DF, CONDA, FCONDA, 0), +-/* v9 */ fmovcc ("fmovqa", FM_QF, CONDA, FCONDA, 0), +-/* v9 */ fmovcc ("fmovsa", FM_SF, CONDA, FCONDA, 0), +-/* v9 */ fmovicc ("fmovdcc", FM_DF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovqcc", FM_QF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovscc", FM_SF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovdcs", FM_DF, CONDCS, 0), +-/* v9 */ fmovicc ("fmovqcs", FM_QF, CONDCS, 0), +-/* v9 */ fmovicc ("fmovscs", FM_SF, CONDCS, 0), +-/* v9 */ fmovcc ("fmovde", FM_DF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovqe", FM_QF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovse", FM_SF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovdg", FM_DF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovqg", FM_QF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovsg", FM_SF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovdge", FM_DF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovcc ("fmovqge", FM_QF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovcc ("fmovsge", FM_SF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovicc ("fmovdgeu", FM_DF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovqgeu", FM_QF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovsgeu", FM_SF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovdgu", FM_DF, CONDGU, 0), +-/* v9 */ fmovicc ("fmovqgu", FM_QF, CONDGU, 0), +-/* v9 */ fmovicc ("fmovsgu", FM_SF, CONDGU, 0), +-/* v9 */ fmovcc ("fmovdl", FM_DF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovql", FM_QF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovsl", FM_SF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovdle", FM_DF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovcc ("fmovqle", FM_QF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovcc ("fmovsle", FM_SF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovicc ("fmovdleu", FM_DF, CONDLEU, 0), +-/* v9 */ fmovicc ("fmovqleu", FM_QF, CONDLEU, 0), +-/* v9 */ fmovicc ("fmovsleu", FM_SF, CONDLEU, 0), +-/* v9 */ fmovfcc ("fmovdlg", FM_DF, FCONDLG, 0), +-/* v9 */ fmovfcc ("fmovqlg", FM_QF, FCONDLG, 0), +-/* v9 */ fmovfcc ("fmovslg", FM_SF, FCONDLG, 0), +-/* v9 */ fmovicc ("fmovdlu", FM_DF, CONDLU, F_ALIAS), +-/* v9 */ fmovicc ("fmovqlu", FM_QF, CONDLU, F_ALIAS), +-/* v9 */ fmovicc ("fmovslu", FM_SF, CONDLU, F_ALIAS), +-/* v9 */ fmovcc ("fmovdn", FM_DF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovqn", FM_QF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovsn", FM_SF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovdne", FM_DF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovcc ("fmovqne", FM_QF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovcc ("fmovsne", FM_SF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovicc ("fmovdneg", FM_DF, CONDNEG, 0), +-/* v9 */ fmovicc ("fmovqneg", FM_QF, CONDNEG, 0), +-/* v9 */ fmovicc ("fmovsneg", FM_SF, CONDNEG, 0), +-/* v9 */ fmovcc ("fmovdnz", FM_DF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovqnz", FM_QF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovsnz", FM_SF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovfcc ("fmovdo", FM_DF, FCONDO, 0), +-/* v9 */ fmovfcc ("fmovqo", FM_QF, FCONDO, 0), +-/* v9 */ fmovfcc ("fmovso", FM_SF, FCONDO, 0), +-/* v9 */ fmovicc ("fmovdpos", FM_DF, CONDPOS, 0), +-/* v9 */ fmovicc ("fmovqpos", FM_QF, CONDPOS, 0), +-/* v9 */ fmovicc ("fmovspos", FM_SF, CONDPOS, 0), +-/* v9 */ fmovfcc ("fmovdu", FM_DF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovqu", FM_QF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovsu", FM_SF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovdue", FM_DF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovque", FM_QF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovsue", FM_SF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovdug", FM_DF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovqug", FM_QF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovsug", FM_SF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovduge", FM_DF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovquge", FM_QF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovsuge", FM_SF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovdul", FM_DF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovqul", FM_QF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovsul", FM_SF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovdule", FM_DF, FCONDULE, 0), +-/* v9 */ fmovfcc ("fmovqule", FM_QF, FCONDULE, 0), +-/* v9 */ fmovfcc ("fmovsule", FM_SF, FCONDULE, 0), +-/* v9 */ fmovicc ("fmovdvc", FM_DF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovqvc", FM_QF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovsvc", FM_SF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovdvs", FM_DF, CONDVS, 0), +-/* v9 */ fmovicc ("fmovqvs", FM_QF, CONDVS, 0), +-/* v9 */ fmovicc ("fmovsvs", FM_SF, CONDVS, 0), +-/* v9 */ fmovcc ("fmovdz", FM_DF, CONDZ, FCONDZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovqz", FM_QF, CONDZ, FCONDZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovsz", FM_SF, CONDZ, FCONDZ, F_ALIAS), +- ++#define fmovccx(opcode, fpsize, args, cond, fcond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags | F_FLOAT, v9 } ++ ++#define fmovicc(suffix, cond, flags) /* v9 */ \ ++fmoviccx("fmovd" suffix, FM_DF, "B,H", cond, flags), \ ++fmoviccx("fmovq" suffix, FM_QF, "R,J", cond, flags), \ ++fmoviccx("fmovs" suffix, FM_SF, "f,g", cond, flags) ++ ++#define fmovfcc(suffix, fcond, flags) /* v9 */ \ ++fmovfccx("fmovd" suffix, FM_DF, "B,H", fcond, flags), \ ++fmovfccx("fmovq" suffix, FM_QF, "R,J", fcond, flags), \ ++fmovfccx("fmovs" suffix, FM_SF, "f,g", fcond, flags) ++ ++#define fmovcc(suffix, cond, fcond, flags) /* v9 */ \ ++fmovccx("fmovd" suffix, FM_DF, "B,H", cond, fcond, flags), \ ++fmovccx("fmovq" suffix, FM_QF, "R,J", cond, fcond, flags), \ ++fmovccx("fmovs" suffix, FM_SF, "f,g", cond, fcond, flags) ++ ++/* v9 */ fmovcc ("a", CONDA, FCONDA, 0), ++/* v9 */ fmovicc ("cc", CONDCC, 0), ++/* v9 */ fmovicc ("cs", CONDCS, 0), ++/* v9 */ fmovcc ("e", CONDE, FCONDE, 0), ++/* v9 */ fmovcc ("g", CONDG, FCONDG, 0), ++/* v9 */ fmovcc ("ge", CONDGE, FCONDGE, 0), ++/* v9 */ fmovicc ("geu", CONDGEU, F_ALIAS), ++/* v9 */ fmovicc ("gu", CONDGU, 0), ++/* v9 */ fmovcc ("l", CONDL, FCONDL, 0), ++/* v9 */ fmovcc ("le", CONDLE, FCONDLE, 0), ++/* v9 */ fmovicc ("leu", CONDLEU, 0), ++/* v9 */ fmovfcc ("lg", FCONDLG, 0), ++/* v9 */ fmovicc ("lu", CONDLU, F_ALIAS), ++/* v9 */ fmovcc ("n", CONDN, FCONDN, 0), ++/* v9 */ fmovcc ("ne", CONDNE, FCONDNE, 0), ++/* v9 */ fmovicc ("neg", CONDNEG, 0), ++/* v9 */ fmovcc ("nz", CONDNZ, FCONDNZ, F_ALIAS), ++/* v9 */ fmovfcc ("o", FCONDO, 0), ++/* v9 */ fmovicc ("pos", CONDPOS, 0), ++/* v9 */ fmovfcc ("u", FCONDU, 0), ++/* v9 */ fmovfcc ("ue", FCONDUE, 0), ++/* v9 */ fmovfcc ("ug", FCONDUG, 0), ++/* v9 */ fmovfcc ("uge", FCONDUGE, 0), ++/* v9 */ fmovfcc ("ul", FCONDUL, 0), ++/* v9 */ fmovfcc ("ule", FCONDULE, 0), ++/* v9 */ fmovicc ("vc", CONDVC, 0), ++/* v9 */ fmovicc ("vs", CONDVS, 0), ++/* v9 */ fmovcc ("z", CONDZ, FCONDZ, F_ALIAS), ++ ++#undef fmoviccx /* v9 */ ++#undef fmovfccx /* v9 */ ++#undef fmovccx /* v9 */ + #undef fmovicc /* v9 */ + #undef fmovfcc /* v9 */ + #undef fmovcc /* v9 */ diff --git a/patches/binutils/2.15.91.0.2/binutils-20040817-linkonce.patch b/patches/binutils/2.15.91.0.2/binutils-20040817-linkonce.patch new file mode 100644 index 00000000..97fa6eed --- /dev/null +++ b/patches/binutils/2.15.91.0.2/binutils-20040817-linkonce.patch @@ -0,0 +1,118 @@ +From http://sources.redhat.com/ml/binutils/2004-08/msg00190.html + +Date: Tue, 17 Aug 2004 12:04:29 +0200 +From: Jakub Jelinek <jakub at redhat dot com> +To: binutils at sources dot redhat dot com +Subject: [PATCH] Fix `defined in discarded section' errors when building ia64 gcc +Message-ID: <20040817100429.GL30497@sunsite.ms.mff.cuni.cz> +Reply-To: Jakub Jelinek <jakub at redhat dot com> +References: <20040817090201.GK30497@sunsite.ms.mff.cuni.cz> +In-Reply-To: <20040817090201 dot GK30497 at sunsite dot ms dot mff dot cuni dot cz> + +On Tue, Aug 17, 2004 at 11:02:01AM +0200, Jakub Jelinek wrote: +> Current gcc 3.4.x (at least gcc-3_4-rhl-branch) doesn't build with CVS +> binutils (nor 2.15.91.0.2). +> The problem is that libstdc++.so linking fails with: +> `.gnu.linkonce.t._ZNSdD2Ev' referenced in section `.gnu.linkonce.ia64unw._ZNSdD2Ev' of .libs/sstream-inst.o: defined in discarded section `.gnu.linkonce.t._ZNSdD2Ev' of .libs/sstream-inst.o +> The problem is that both io-inst.s and sstream-inst.s have +> .gnu.linkonce.t._ZNSdD2Ev definition, but because io-inst.cc +> also instantiates some templates sstream-inst.cc doesn't instantiate, +> the inliner can do a better job in io-inst.cc. +> The result is that _ZNSdD2Ev in io-inst.cc is a leaf routine, while +> it is not in sstream-inst.cc (in assembly, +> _ZNSdD2Ev in io-inst.s starts with .prologue and no .save directives, +> while _ZNSdD2Ev] in sstream-inst.s has .prologue 12, 35 and some +> .save directives. +> IA-64 ABI allows leaf routines to have no unwind section at all, +> which means .gnu.linkonce.ia64unw._ZNSdD2Ev is not created in +> io-inst.o at all and as .gnu.linkonce.t._ZNSdD2Ev comes first +> and wins, .gnu.linkonce.ia64unw._ZNSdD2Ev in sstream.o suddenly +> references a discarded section. +> +> Not sure what should be done here, but certainly the compiler +> isn't at fault here, it is a binutils problem. +> One fix could be to create empty .gnu.linkonce.ia64unw.* section +> in assembler, another special case ia64 unwind sections in the linker. + +Here is a patch for the first possibility. +It certainly makes libstdc++.so to link and even the unwind info looks +good on brief skimming. + +2004-08-17 Jakub Jelinek <jakub@redhat.com> + + * config/tc-ia64.c (start_unwind_section): Add linkonce_empty + argument, don't do anything if current section is not + .gnu.linkonce.t.* and linkonce_empty is set. + (generate_unwind_image, dot_endp): Adjust callers, call + start_unwind_section (*, 1) if nothing will be put into the + section. + +--- binutils/gas/config/tc-ia64.c.jj 2004-07-30 11:42:24.000000000 +0200 ++++ binutils/gas/config/tc-ia64.c 2004-08-17 13:45:04.288173205 +0200 +@@ -1,5 +1,6 @@ + /* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture. +- Copyright 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 ++ Free Software Foundation, Inc. + Contributed by David Mosberger-Tang <davidm@hpl.hp.com> + + This file is part of GAS, the GNU Assembler. +@@ -3297,7 +3298,7 @@ static char *special_linkonce_name[] = + }; + + static void +-start_unwind_section (const segT text_seg, int sec_index) ++start_unwind_section (const segT text_seg, int sec_index, int linkonce_empty) + { + /* + Use a slightly ugly scheme to derive the unwind section names from +@@ -3359,6 +3360,8 @@ start_unwind_section (const segT text_se + prefix = special_linkonce_name [sec_index - SPECIAL_SECTION_UNWIND]; + suffix += sizeof (".gnu.linkonce.t.") - 1; + } ++ else if (linkonce_empty) ++ return; + + prefix_len = strlen (prefix); + suffix_len = strlen (suffix); +@@ -3444,7 +3447,7 @@ generate_unwind_image (const segT text_s + expressionS exp; + bfd_reloc_code_real_type reloc; + +- start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO); ++ start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 0); + + /* Make sure the section has 4 byte alignment for ILP32 and + 8 byte alignment for LP64. */ +@@ -3485,6 +3488,8 @@ generate_unwind_image (const segT text_s + unwind.personality_routine = 0; + } + } ++ else ++ start_unwind_section (text_seg, SPECIAL_SECTION_UNWIND_INFO, 1); + + free_saved_prologue_counts (); + unwind.list = unwind.tail = unwind.current_entry = NULL; +@@ -4164,7 +4169,7 @@ dot_endp (dummy) + subseg_set (md.last_text_seg, 0); + unwind.proc_end = expr_build_dot (); + +- start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND); ++ start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 0); + + /* Make sure that section has 4 byte alignment for ILP32 and + 8 byte alignment for LP64. */ +@@ -4204,6 +4209,9 @@ dot_endp (dummy) + bytes_per_address); + + } ++ else ++ start_unwind_section (saved_seg, SPECIAL_SECTION_UNWIND, 1); ++ + subseg_set (saved_seg, saved_subseg); + + /* Parse names of main and alternate entry points and set symbol sizes. */ + + + Jakub + diff --git a/patches/binutils/2.15.91.0.2/binutils-dup-sections.patch b/patches/binutils/2.15.91.0.2/binutils-dup-sections.patch new file mode 100644 index 00000000..4e4934d8 --- /dev/null +++ b/patches/binutils/2.15.91.0.2/binutils-dup-sections.patch @@ -0,0 +1,68 @@ +See http://sources.redhat.com/ml/binutils/2004-08/msg00256.html + +Date: Fri, 20 Aug 2004 21:13:43 -0400 +From: Daniel Jacobowitz <drow at false dot org> +To: binutils at sources dot redhat dot com +Subject: Re: Handle SEC_LINK_DUPLICATES_SAME_CONTENTS for arm-linux +Message-ID: <20040821011342.GA30319@nevyn.them.org> +Mail-Followup-To: binutils at sources dot redhat dot com +References: <20040818145518.GA9774@nevyn.them.org> <20040819055040.GA11820@lucon.org> <20040819080034.GE21716@bubble.modra.org> <20040820173240.GA17678@nevyn.them.org> <20040821003737.GB16016@bubble.modra.org> +In-Reply-To: <20040821003737 dot GB16016 at bubble dot modra dot org> + +On Sat, Aug 21, 2004 at 10:07:38AM +0930, Alan Modra wrote: +> On Fri, Aug 20, 2004 at 01:32:40PM -0400, Daniel Jacobowitz wrote: +> > Thanks. How's this? +> +> As you might have guessed from my rather slack review of your previous +> patch, I trust you enough to give the OK without proper review. But +> since you asked... :) + +Checked in as so. + +-- +Daniel Jacobowitz + +[ rediffed against binutils-2.15.91.0.2, with some elbow grease ] + +2004-08-20 Daniel Jacobowitz <dan@debian.org> + + * elflink.c (_bfd_elf_section_already_linked): Handle + SEC_LINK_DUPLICATES_SAME_CONTENTS. +--- binutils-2.15.91.0.2/bfd/elflink.c.old 2004-07-27 21:36:08.000000000 -0700 ++++ binutils-2.15.91.0.2/bfd/elflink.c 2004-08-26 06:38:07.000000000 -0700 +@@ -9359,6 +9359,35 @@ + (_("%s: %s: warning: duplicate section `%s' has different size\n"), + bfd_archive_filename (abfd), name); + break; ++ case SEC_LINK_DUPLICATES_SAME_CONTENTS: ++ if (sec->size != l->sec->size) ++ (*_bfd_error_handler) ++ (_("%B: duplicate section `%A' has different size\n"), ++ bfd_archive_filename (abfd), sec); ++ else if (sec->size != 0) ++ { ++ bfd_byte *sec_contents, *l_sec_contents; ++ ++ if (!bfd_malloc_and_get_section (abfd, sec, &sec_contents)) ++ (*_bfd_error_handler) ++ (_("%B: warning: could not read contents of section `%A'\n"), ++ bfd_archive_filename (abfd), sec); ++ else if (!bfd_malloc_and_get_section (l->sec->owner, l->sec, ++ &l_sec_contents)) ++ (*_bfd_error_handler) ++ (_("%B: warning: could not read contents of section `%A'\n"), ++ bfd_archive_filename(l->sec->owner), l->sec); ++ else if (memcmp (sec_contents, l_sec_contents, sec->size) != 0) ++ (*_bfd_error_handler) ++ (_("%B: warning: duplicate section `%A' has different contents\n"), ++ bfd_archive_filename (abfd), sec); ++ ++ if (sec_contents) ++ free (sec_contents); ++ if (l_sec_contents) ++ free (l_sec_contents); ++ } ++ break; + } + + /* Set the output_section field so that lang_add_section diff --git a/patches/binutils/2.15.91.0.2/binutils-skip-comments.patch b/patches/binutils/2.15.91.0.2/binutils-skip-comments.patch new file mode 100644 index 00000000..804a17e0 --- /dev/null +++ b/patches/binutils/2.15.91.0.2/binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab <schwab at suse dot de> +To: Nathan Sidwell <nathan at codesourcery dot com> +Cc: Ian Lance Taylor <ian at wasabisystems dot com>, binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell <nathan@codesourcery.com> writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab <schwab@suse.de> + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/patches/binutils/2.15/002-uclibc.patch b/patches/binutils/2.15/002-uclibc.patch new file mode 100644 index 00000000..c64e74f5 --- /dev/null +++ b/patches/binutils/2.15/002-uclibc.patch @@ -0,0 +1,144 @@ +diff -uNr binutils-2.15-pristine/bfd/configure binutils-2.15/bfd/configure +--- binutils-2.15-pristine/bfd/configure 2004-05-17 12:35:57.000000000 -0700 ++++ binutils-2.15/bfd/configure 2004-07-19 16:36:19.000000000 -0700 +@@ -1009,7 +1009,7 @@ + bfd_version_string="\"${VERSION}\"" + if test x${is_release} = x; then + bfd_version_date=`sed -n -e 's/.*DATE //p' < ${srcdir}/version.h` +- bfd_version_string="\"${VERSION} ${bfd_version_date}\"" ++ bfd_version_string="\"${VERSION} ${bfd_version_date} uClibc\"" + fi + + +diff -uNr binutils-2.15-pristine/bfd/elf32-arm.h binutils-2.15/bfd/elf32-arm.h +--- binutils-2.15-pristine/bfd/elf32-arm.h 2004-05-17 12:35:58.000000000 -0700 ++++ binutils-2.15/bfd/elf32-arm.h 2004-07-19 16:37:06.000000000 -0700 +@@ -124,7 +124,7 @@ + + /* The name of the dynamic interpreter. This is put in the .interp + section. */ +-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + #ifdef FOUR_WORD_PLT + +diff -uNr binutils-2.15-pristine/bfd/elf32-cris.c binutils-2.15/bfd/elf32-cris.c +--- binutils-2.15-pristine/bfd/elf32-cris.c 2004-05-17 12:35:58.000000000 -0700 ++++ binutils-2.15/bfd/elf32-cris.c 2004-07-19 16:49:59.000000000 -0700 +@@ -536,7 +536,7 @@ + /* The name of the dynamic interpreter. This is put in the .interp + section. */ + +-#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + /* The size in bytes of an entry in the procedure linkage table. */ + +diff -uNr binutils-2.15-pristine/bfd/elf32-frv.c binutils-2.15/bfd/elf32-frv.c +--- binutils-2.15-pristine/bfd/elf32-frv.c 2004-05-17 12:35:58.000000000 -0700 ++++ binutils-2.15/bfd/elf32-frv.c 2004-07-19 16:49:59.000000000 -0700 +@@ -2913,7 +2913,7 @@ + /* The name of the dynamic interpreter. This is put in the .interp + section. */ + +-#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + #define DEFAULT_STACK_SIZE 0x20000 + +diff -uNr binutils-2.15-pristine/bfd/elf32-hppa.c binutils-2.15/bfd/elf32-hppa.c +--- binutils-2.15-pristine/bfd/elf32-hppa.c 2004-05-17 12:35:58.000000000 -0700 ++++ binutils-2.15/bfd/elf32-hppa.c 2004-07-19 16:49:59.000000000 -0700 +@@ -115,7 +115,7 @@ + + #define PLT_ENTRY_SIZE 8 + #define GOT_ENTRY_SIZE 4 +-#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + static const bfd_byte plt_stub[] = + { +diff -uNr binutils-2.15-pristine/bfd/elf32-ppc.c binutils-2.15/bfd/elf32-ppc.c +--- binutils-2.15-pristine/bfd/elf32-ppc.c 2004-05-17 12:35:59.000000000 -0700 ++++ binutils-2.15/bfd/elf32-ppc.c 2004-07-19 16:49:59.000000000 -0700 +@@ -49,7 +49,7 @@ + + /* The name of the dynamic interpreter. This is put in the .interp + section. */ +-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + /* The size in bytes of an entry in the procedure linkage table. */ + #define PLT_ENTRY_SIZE 12 +diff -uNr binutils-2.15-pristine/bfd/elf32-s390.c binutils-2.15/bfd/elf32-s390.c +--- binutils-2.15-pristine/bfd/elf32-s390.c 2004-05-17 12:35:59.000000000 -0700 ++++ binutils-2.15/bfd/elf32-s390.c 2004-07-19 16:49:59.000000000 -0700 +@@ -452,7 +452,7 @@ + /* The name of the dynamic interpreter. This is put in the .interp + section. */ + +-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid + copying dynamic variables from a shared lib into an app's dynbss +diff -uNr binutils-2.15-pristine/bfd/elf32-sparc.c binutils-2.15/bfd/elf32-sparc.c +--- binutils-2.15-pristine/bfd/elf32-sparc.c 2004-05-17 12:36:00.000000000 -0700 ++++ binutils-2.15/bfd/elf32-sparc.c 2004-07-19 16:49:59.000000000 -0700 +@@ -536,7 +536,7 @@ + /* The name of the dynamic interpreter. This is put in the .interp + section. */ + +-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + /* The nop opcode we use. */ + +diff -uNr binutils-2.15-pristine/bfd/elf64-ppc.c binutils-2.15/bfd/elf64-ppc.c +--- binutils-2.15-pristine/bfd/elf64-ppc.c 2004-05-17 12:36:01.000000000 -0700 ++++ binutils-2.15/bfd/elf64-ppc.c 2004-07-19 16:49:59.000000000 -0700 +@@ -99,7 +99,7 @@ + + /* The name of the dynamic interpreter. This is put in the .interp + section. */ +-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + /* The size in bytes of an entry in the procedure linkage table. */ + #define PLT_ENTRY_SIZE 24 +diff -uNr binutils-2.15-pristine/bfd/elf64-s390.c binutils-2.15/bfd/elf64-s390.c +--- binutils-2.15-pristine/bfd/elf64-s390.c 2004-05-17 12:36:01.000000000 -0700 ++++ binutils-2.15/bfd/elf64-s390.c 2004-07-19 16:49:59.000000000 -0700 +@@ -473,7 +473,7 @@ + /* The name of the dynamic interpreter. This is put in the .interp + section. */ + +-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid + copying dynamic variables from a shared lib into an app's dynbss +diff -uNr binutils-2.15-pristine/bfd/elf-m10300.c binutils-2.15/bfd/elf-m10300.c +--- binutils-2.15-pristine/bfd/elf-m10300.c 2004-05-17 12:35:57.000000000 -0700 ++++ binutils-2.15/bfd/elf-m10300.c 2004-07-19 16:49:59.000000000 -0700 +@@ -4026,7 +4026,7 @@ + /* The name of the dynamic interpreter. This is put in the .interp + section. */ + +-#define ELF_DYNAMIC_INTERPRETER "/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + /* Create dynamic sections when linking against a dynamic object. */ + +diff -uNr binutils-2.15-pristine/bfd/elfxx-ia64.c binutils-2.15/bfd/elfxx-ia64.c +--- binutils-2.15-pristine/bfd/elfxx-ia64.c 2004-05-17 12:36:02.000000000 -0700 ++++ binutils-2.15/bfd/elfxx-ia64.c 2004-07-19 16:49:59.000000000 -0700 +@@ -643,7 +643,7 @@ + 0x60, 0x00, 0x80, 0x00 /* br.few b6;; */ + }; + +-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1" ++#define ELF_DYNAMIC_INTERPRETER "/lib/ld-uClibc.so.0" + + static const bfd_byte oor_brl[16] = + { diff --git a/patches/binutils/2.15/100-uclibc-conf.patch b/patches/binutils/2.15/100-uclibc-conf.patch new file mode 100644 index 00000000..1c7fa4a4 --- /dev/null +++ b/patches/binutils/2.15/100-uclibc-conf.patch @@ -0,0 +1,692 @@ +diff -urN binutils-2.15-dist/bfd/config.bfd binutils-2.15/bfd/config.bfd +--- binutils-2.15-dist/bfd/config.bfd 2004-05-17 14:35:56.000000000 -0500 ++++ binutils-2.15/bfd/config.bfd 2004-08-04 12:01:44.000000000 -0500 +@@ -126,7 +126,7 @@ + targ_defvec=ecoffalpha_little_vec + targ_selvecs=bfd_elf64_alpha_vec + ;; +- alpha*-*-linux-gnu* | alpha*-*-elf*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc* | alpha*-*-elf*) + targ_defvec=bfd_elf64_alpha_vec + targ_selvecs=ecoffalpha_little_vec + ;; +@@ -136,7 +136,7 @@ + alpha*-*-*) + targ_defvec=ecoffalpha_little_vec + ;; +- ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) ++ ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-gnu* | ia64*-*-linux-uclibc* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu) + targ_defvec=bfd_elf64_ia64_little_vec + targ_selvecs="bfd_elf64_ia64_big_vec bfd_efi_app_ia64_vec" + ;; +@@ -213,7 +213,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- armeb-*-elf | arm*b-*-linux-gnu*) ++ armeb-*-elf | arm*b-*-linux-gnu* | arm*b-*-linux-uclibc*) + targ_defvec=bfd_elf32_bigarm_vec + targ_selvecs=bfd_elf32_littlearm_vec + ;; +@@ -221,7 +221,7 @@ + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec + ;; +- arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-conix* | \ ++ arm-*-elf | arm-*-freebsd* | arm*-*-linux-gnu* | arm*-*-linux-uclibc* | arm*-*-conix* | \ + arm*-*-uclinux* | arm-*-kfreebsd*-gnu | arm-*-vxworks) + targ_defvec=bfd_elf32_littlearm_vec + targ_selvecs=bfd_elf32_bigarm_vec +@@ -360,7 +360,7 @@ + ;; + + #ifdef BFD64 +- hppa*64*-*-linux-gnu*) ++ hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) + targ_defvec=bfd_elf64_hppa_linux_vec + targ_selvecs=bfd_elf64_hppa_vec + ;; +@@ -371,7 +371,7 @@ + ;; + #endif + +- hppa*-*-linux-gnu* | hppa*-*-netbsd*) ++ hppa*-*-linux-gnu* | hppa*-*-linux-uclibc* | hppa*-*-netbsd*) + targ_defvec=bfd_elf32_hppa_linux_vec + targ_selvecs=bfd_elf32_hppa_vec + ;; +@@ -494,7 +494,7 @@ + targ_selvecs=bfd_elf32_i386_vec + targ_underscore=yes + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + targ_defvec=bfd_elf32_i386_vec + targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec" + targ64_selvecs=bfd_elf64_x86_64_vec +@@ -508,7 +508,7 @@ + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386netbsd_vec i386coff_vec bfd_efi_app_ia32_vec" + ;; +- x86_64-*-linux-gnu*) ++ x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) + targ_defvec=bfd_elf64_x86_64_vec + targ_selvecs="bfd_elf32_i386_vec i386linux_vec bfd_efi_app_ia32_vec" + ;; +@@ -683,7 +683,7 @@ + targ_selvecs=bfd_elf32_m68k_vec + targ_underscore=yes + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + targ_defvec=bfd_elf32_m68k_vec + targ_selvecs=m68klinux_vec + ;; +@@ -955,7 +955,8 @@ + ;; + #endif + powerpc-*-*bsd* | powerpc-*-elf* | powerpc-*-sysv4* | powerpc-*-eabi* | \ +- powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-rtems* | \ ++ powerpc-*-solaris2* | powerpc-*-linux-gnu* | powerpc-*-linux-uclibc* | \ ++ powerpc-*-rtems* | \ + powerpc-*-chorus* | powerpc-*-vxworks* | powerpc-*-windiss*) + targ_defvec=bfd_elf32_powerpc_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpcle_vec ppcboot_vec" +@@ -987,8 +988,8 @@ + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + ;; + powerpcle-*-elf* | powerpcle-*-sysv4* | powerpcle-*-eabi* | \ +- powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-vxworks* |\ +- powerpcle-*-rtems*) ++ powerpcle-*-solaris2* | powerpcle-*-linux-gnu* | powerpcle-*-linux-uclibc* |\ ++ powerpcle-*-vxworks* | powerpcle-*-rtems*) + targ_defvec=bfd_elf32_powerpcle_vec + targ_selvecs="rs6000coff_vec bfd_elf32_powerpc_vec ppcboot_vec" + targ64_selvecs="bfd_elf64_powerpc_vec bfd_elf64_powerpcle_vec" +@@ -1149,7 +1150,7 @@ + targ_selvecs="bfd_elf32_sparc_vec sunos_big_vec" + targ_underscore=yes + ;; +- sparc-*-linux-gnu*) ++ sparc-*-linux-gnu* | sparc-*-linux-uclibc*) + targ_defvec=bfd_elf32_sparc_vec + targ_selvecs="sparclinux_vec bfd_elf64_sparc_vec sunos_big_vec" + ;; +@@ -1196,7 +1197,7 @@ + targ_defvec=sunos_big_vec + targ_underscore=yes + ;; +- sparc64-*-linux-gnu*) ++ sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) + targ_defvec=bfd_elf64_sparc_vec + targ_selvecs="bfd_elf32_sparc_vec sparclinux_vec sunos_big_vec" + ;; +@@ -1265,7 +1266,7 @@ + targ_underscore=yes + ;; + +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + targ_defvec=bfd_elf32_vax_vec + ;; + +diff -urN binutils-2.15-dist/bfd/configure binutils-2.15/bfd/configure +--- binutils-2.15-dist/bfd/configure 2004-05-17 14:35:57.000000000 -0500 ++++ binutils-2.15/bfd/configure 2004-08-04 12:01:44.000000000 -0500 +@@ -1699,6 +1699,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5278,7 +5283,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -5338,7 +5343,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386mach3.h"' + ;; +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' + ;; +@@ -5376,7 +5381,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -5477,7 +5482,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15-dist/bfd/configure.in binutils-2.15/bfd/configure.in +--- binutils-2.15-dist/bfd/configure.in 2004-05-17 14:35:57.000000000 -0500 ++++ binutils-2.15/bfd/configure.in 2004-08-04 12:01:44.000000000 -0500 +@@ -178,7 +178,7 @@ + alpha*-*-freebsd* | alpha*-*-kfreebsd*-gnu) + COREFILE='' + ;; +- alpha*-*-linux-gnu*) ++ alpha*-*-linux-gnu* | alpha*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/alphalinux.h"' + ;; +@@ -259,7 +259,7 @@ + TRAD_HEADER='"hosts/i386mach3.h"' + ;; + changequote(,)dnl +- i[3-7]86-*-linux-gnu*) ++ i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) + changequote([,])dnl + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/i386linux.h"' +@@ -300,7 +300,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/hp300bsd.h"' + ;; +- m68*-*-linux-gnu*) ++ m68*-*-linux-gnu* | m68*-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/m68klinux.h"' + ;; +@@ -385,7 +385,7 @@ + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxult2.h"' + ;; +- vax-*-linux-gnu*) ++ vax-*-linux-gnu* | vax-*-linux-uclibc*) + COREFILE=trad-core.lo + TRAD_HEADER='"hosts/vaxlinux.h"' + ;; +diff -urN binutils-2.15-dist/binutils/configure binutils-2.15/binutils/configure +--- binutils-2.15-dist/binutils/configure 2004-01-02 11:08:04.000000000 -0600 ++++ binutils-2.15/binutils/configure 2004-08-04 12:01:44.000000000 -0500 +@@ -1585,6 +1585,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15-dist/configure binutils-2.15/configure +--- binutils-2.15-dist/configure 2004-05-17 14:36:20.000000000 -0500 ++++ binutils-2.15/configure 2004-08-04 12:01:44.000000000 -0500 +@@ -1288,6 +1288,18 @@ + i[3456789]86-*-freebsd* | i[3456789]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[3456789]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[3456789]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15-dist/configure.in binutils-2.15/configure.in +--- binutils-2.15-dist/configure.in 2004-05-17 14:40:54.000000000 -0500 ++++ binutils-2.15/configure.in 2004-08-04 12:01:44.000000000 -0500 +@@ -521,6 +521,18 @@ + i[[3456789]]86-*-freebsd* | i[[3456789]]86-*-kfreebsd*-gnu) + noconfigdirs="$noconfigdirs target-newlib target-libgloss" + ;; ++ i[[3456789]]86-*-linux-uclibc*) ++ # This section makes it possible to build newlib natively on linux. ++ # If we are using a cross compiler then don't configure newlib. ++ if test x${is_cross_compiler} != xno ; then ++ noconfigdirs="$noconfigdirs target-newlib" ++ fi ++ noconfigdirs="$noconfigdirs target-libgloss" ++ # If we are not using a cross compiler, do configure newlib. ++ # Note however, that newlib will only be configured in this situation ++ # if the --with-newlib option has been given, because otherwise ++ # 'target-newlib' will appear in skipdirs. ++ ;; + i[[3456789]]86-*-linux*) + # The GCC port for glibc1 has no MD_FALLBACK_FRAME_STATE_FOR, so let's + # not build java stuff by default. +diff -urN binutils-2.15-dist/gas/configure binutils-2.15/gas/configure +--- binutils-2.15-dist/gas/configure 2004-05-17 14:36:07.000000000 -0500 ++++ binutils-2.15/gas/configure 2004-08-04 12:07:50.000000000 -0500 +@@ -3400,6 +3400,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -4224,6 +4229,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -4240,6 +4246,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -4253,6 +4260,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -4310,7 +4318,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + i386-*-sysv[45]*) fmt=elf ;; + i386-*-solaris*) fmt=elf ;; +@@ -4370,6 +4380,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -4397,6 +4408,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -4459,6 +4471,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -4486,7 +4499,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -4519,6 +4534,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15-dist/gas/configure.in binutils-2.15/gas/configure.in +--- binutils-2.15-dist/gas/configure.in 2004-05-17 14:36:07.000000000 -0500 ++++ binutils-2.15/gas/configure.in 2004-08-04 12:07:21.000000000 -0500 +@@ -194,6 +194,7 @@ + alpha*-*-osf*) fmt=ecoff ;; + alpha*-*-linuxecoff*) fmt=ecoff ;; + alpha*-*-linux-gnu*) fmt=elf em=linux ;; ++ alpha*-*-linux-uclibc*) fmt=elf em=linux ;; + alpha*-*-netbsd*) fmt=elf em=nbsd ;; + alpha*-*-openbsd*) fmt=elf em=obsd ;; + +@@ -210,6 +211,7 @@ + arm*-*-conix*) fmt=elf ;; + arm-*-linux*aout*) fmt=aout em=linux ;; + arm*-*-linux-gnu*) fmt=elf em=linux ;; ++ arm*-*-linux-uclibc*) fmt=elf em=linux ;; + arm*-*-uclinux*) fmt=elf em=linux ;; + arm-*-netbsdelf*) fmt=elf em=nbsd ;; + arm-*-*n*bsd*) fmt=aout em=nbsd ;; +@@ -223,6 +225,7 @@ + avr-*-*) fmt=elf ;; + + cris-*-linux-gnu*) fmt=multi bfd_gas=yes em=linux ;; ++ cris-*-linux-uclibc*) fmt=multi bfd_gas=yes em=linux ;; + cris-*-*) fmt=multi bfd_gas=yes ;; + + d10v-*-*) fmt=elf ;; +@@ -280,7 +283,9 @@ + i386-*-linux*oldld) fmt=aout em=linux ;; + i386-*-linux*coff*) fmt=coff em=linux ;; + i386-*-linux-gnu*) fmt=elf em=linux ;; ++ i386-*-linux-uclibc*) fmt=elf em=linux ;; + x86_64-*-linux-gnu*) fmt=elf em=linux ;; ++ x86_64-*-linux-uclibc*) fmt=elf em=linux ;; + i386-*-lynxos*) fmt=coff em=lynx ;; + changequote(,)dnl + i386-*-sysv[45]*) fmt=elf ;; +@@ -333,6 +338,7 @@ + ia64-*-elf*) fmt=elf ;; + ia64-*-aix*) fmt=elf em=ia64aix ;; + ia64-*-linux-gnu*) fmt=elf em=linux ;; ++ ia64-*-linux-uclibc*) fmt=elf em=linux ;; + ia64-*-hpux*) fmt=elf em=hpux ;; + ia64-*-netbsd*) fmt=elf em=nbsd ;; + +@@ -360,6 +366,7 @@ + m68k-*-hpux*) fmt=hp300 em=hp300 ;; + m68k-*-linux*aout*) fmt=aout em=linux ;; + m68k-*-linux-gnu*) fmt=elf em=linux ;; ++ m68k-*-linux-uclibc*) fmt=elf em=linux ;; + m68k-*-uclinux*) fmt=elf ;; + m68k-*-gnu*) fmt=elf ;; + m68k-*-lynxos*) fmt=coff em=lynx ;; +@@ -419,6 +426,7 @@ + ppc-*-beos*) fmt=coff ;; + ppc-*-*n*bsd* | ppc-*-elf*) fmt=elf ;; + ppc-*-eabi* | ppc-*-sysv4*) fmt=elf ;; ++ ppc-*-linux-uclibc* | \ + ppc-*-linux-gnu*) fmt=elf em=linux + case "$endian" in + big) ;; +@@ -439,7 +447,9 @@ + ppc-*-kaos*) fmt=elf ;; + + s390x-*-linux-gnu*) fmt=elf em=linux ;; ++ s390x-*-linux-uclibc*) fmt=elf em=linux ;; + s390-*-linux-gnu*) fmt=elf em=linux ;; ++ s390-*-linux-uclibc*) fmt=elf em=linux ;; + + sh*-*-linux*) fmt=elf em=linux + case ${cpu} in +@@ -472,6 +482,7 @@ + sparc-*-coff) fmt=coff ;; + sparc-*-linux*aout*) fmt=aout em=linux ;; + sparc-*-linux-gnu*) fmt=elf em=linux ;; ++ sparc-*-linux-uclibc*) fmt=elf em=linux ;; + sparc-*-lynxos*) fmt=coff em=lynx ;; + sparc-fujitsu-none) fmt=aout ;; + sparc-*-elf) fmt=elf ;; +diff -urN binutils-2.15-dist/gprof/configure binutils-2.15/gprof/configure +--- binutils-2.15-dist/gprof/configure 2003-08-26 12:19:19.000000000 -0500 ++++ binutils-2.15/gprof/configure 2004-08-04 12:01:45.000000000 -0500 +@@ -1581,6 +1581,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15-dist/ld/configure binutils-2.15/ld/configure +--- binutils-2.15-dist/ld/configure 2003-04-24 07:36:07.000000000 -0500 ++++ binutils-2.15/ld/configure 2004-08-04 12:01:45.000000000 -0500 +@@ -1589,6 +1589,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +diff -urN binutils-2.15-dist/ld/configure.tgt binutils-2.15/ld/configure.tgt +--- binutils-2.15-dist/ld/configure.tgt 2004-05-17 14:36:15.000000000 -0500 ++++ binutils-2.15/ld/configure.tgt 2004-08-04 12:01:45.000000000 -0500 +@@ -30,6 +30,7 @@ + targ_extra_emuls="criself crislinux" + targ_extra_libpath=$targ_extra_emuls ;; + cris-*-linux-gnu*) targ_emul=crislinux ;; ++cris-*-linux-uclibc*) targ_emul=crislinux ;; + cris-*-*) targ_emul=criself + targ_extra_emuls="crisaout crislinux" + targ_extra_libpath=$targ_extra_emuls ;; +@@ -59,14 +60,16 @@ + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/aout//'` + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc64-*-linux-gnu*) targ_emul=elf64_sparc ++sparc64-*-linux-gnu* | sparc64-*-linux-uclibc*) \ ++ targ_emul=elf64_sparc + targ_extra_emuls="elf32_sparc sparclinux sun4" + targ_extra_libpath=elf32_sparc + tdir_elf32_sparc=`echo ${targ_alias} | sed -e 's/64//'` + tdir_sparclinux=${tdir_elf32_sparc}aout + tdir_sun4=sparc-sun-sunos4 + ;; +-sparc*-*-linux-gnu*) targ_emul=elf32_sparc ++sparc*-*-linux-gnu* | sparc*-*-linux-uclibc*) \ ++ targ_emul=elf32_sparc + targ_extra_emuls="sparclinux elf64_sparc sun4" + targ_extra_libpath=elf64_sparc + tdir_sparclinux=${targ_alias}aout +@@ -118,7 +121,9 @@ + m32r*le-*-elf*) targ_emul=m32rlelf ;; + m32r*-*-elf*) targ_emul=m32relf ;; + m32r*le-*-linux-gnu*) targ_emul=m32rlelf_linux ;; ++m32r*le-*-linux-uclibc*) targ_emul=m32rlelf_linux ;; + m32r*-*-linux-gnu*) targ_emul=m32relf_linux ;; ++m32r*-*-linux-uclibc*) targ_emul=m32relf_linux ;; + m68hc11-*-*|m6811-*-*) targ_emul=m68hc11elf + targ_extra_emuls="m68hc11elfb m68hc12elf m68hc12elfb" ;; + m68hc12-*-*|m6812-*-*) targ_emul=m68hc12elf +@@ -128,7 +133,7 @@ + m68*-ericsson-ose) targ_emul=sun3 ;; + m68*-apple-aux*) targ_emul=m68kaux ;; + *-tandem-none) targ_emul=st2000 ;; +-i370-*-elf* | i370-*-linux-gnu*) targ_emul=elf32i370 ;; ++i370-*-elf* | i370-*-linux-gnu* | i370-*-linux-uclibc*) targ_emul=elf32i370 ;; + i[3-7]86-*-nto-qnx*) targ_emul=i386nto ;; + i[3-7]86-*-vsta) targ_emul=vsta ;; + i[3-7]86-go32-rtems*) targ_emul=i386go32 ;; +@@ -152,14 +157,16 @@ + tdir_elf_i386=`echo ${targ_alias} | sed -e 's/aout//'` + ;; + i[3-7]86-*-linux*oldld) targ_emul=i386linux; targ_extra_emuls=elf_i386 ;; +-i[3-7]86-*-linux-gnu*) targ_emul=elf_i386 ++i[3-7]86-*-linux-gnu* | i[3-7]86-*-linux-uclibc*) \ ++ targ_emul=elf_i386 + targ_extra_emuls=i386linux + if test x${want64} = xtrue; then + targ_extra_emuls="$targ_extra_emuls elf_x86_64" + fi + tdir_i386linux=${targ_alias}aout + ;; +-x86_64-*-linux-gnu*) targ_emul=elf_x86_64 ++x86_64-*-linux-gnu* | x86_64-*-linux-uclibc*) \ ++ targ_emul=elf_x86_64 + targ_extra_emuls="elf_i386 i386linux" + targ_extra_libpath=elf_i386 + tdir_i386linux=`echo ${targ_alias}aout | sed -e 's/x86_64/i386/'` +@@ -259,10 +266,13 @@ + arm9e-*-elf) targ_emul=armelf ;; + arm-*-oabi) targ_emul=armelf_oabi ;; + arm*b-*-linux-gnu*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; ++arm*b-*-linux-uclibc*) targ_emul=armelfb_linux; targ_extra_emuls=armelfb ;; + arm*-*-linux-gnu*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++arm*-*-linux-uclibc*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + arm*-*-conix*) targ_emul=armelf ;; +-thumb-*-linux-gnu* | thumb-*-uclinux*) targ_emul=armelf_linux; targ_extra_emuls=armelf ;; ++thumb-*-linux-gnu* | thumb-*-linux-uclibc* | thumb-*-uclinux*) \ ++ targ_emul=armelf_linux; targ_extra_emuls=armelf ;; + strongarm-*-coff) targ_emul=armcoff ;; + strongarm-*-elf) targ_emul=armelf ;; + strongarm-*-kaos*) targ_emul=armelf ;; +@@ -364,7 +374,8 @@ + targ_extra_emuls=m68kelf + tdir_m68kelf=`echo ${targ_alias} | sed -e 's/aout//'` + ;; +-m68k-*-linux-gnu*) targ_emul=m68kelf ++m68k-*-linux-gnu* | m68k-*-linux-uclibc*) \ ++ targ_emul=m68kelf + targ_extra_emuls=m68klinux + tdir_m68klinux=`echo ${targ_alias} | sed -e 's/linux/linuxaout/'` + ;; +@@ -381,9 +392,9 @@ + m68*-*-psos*) targ_emul=m68kpsos ;; + m68*-*-rtemscoff*) targ_emul=m68kcoff ;; + m68*-*-rtems*) targ_emul=m68kelf ;; +-hppa*64*-*-linux-gnu*) targ_emul=hppa64linux ;; ++hppa*64*-*-linux-gnu* | hppa*64*-*-linux-uclibc*) targ_emul=hppa64linux ;; + hppa*64*-*) targ_emul=elf64hppa ;; +-hppa*-*-linux-gnu*) targ_emul=hppalinux ;; ++hppa*-*-linux-gnu* | hppa*-*-linux-uclibc*) targ_emul=hppalinux ;; + hppa*-*-*elf*) targ_emul=hppaelf ;; + hppa*-*-lites*) targ_emul=hppaelf ;; + hppa*-*-netbsd*) targ_emul=hppanbsd ;; +@@ -396,6 +407,7 @@ + targ_emul=vaxnbsd + targ_extra_emuls=elf32vax ;; + vax-*-linux-gnu*) targ_emul=elf32vax ;; ++vax-*-linux-uclibc*) targ_emul=elf32vax ;; + mips*-*-pe) targ_emul=mipspe ; + targ_extra_ofiles="deffilep.o pe-dll.o" ;; + mips*-dec-ultrix*) targ_emul=mipslit ;; +@@ -429,16 +441,16 @@ + mips*-*-vxworks*) targ_emul=elf32ebmip + targ_extra_emuls="elf32elmip" ;; + mips*-*-windiss) targ_emul=elf32mipswindiss ;; +-mips64*el-*-linux-gnu*) targ_emul=elf32ltsmipn32 ++mips64*el-*-linux-gnu* | mips64*el-*-linux-uclibc*) targ_emul=elf32ltsmipn32 + targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip" + ;; +-mips64*-*-linux-gnu*) targ_emul=elf32btsmipn32 ++mips64*-*-linux-gnu* | mips64*-*-linux-uclibc*) targ_emul=elf32btsmipn32 + targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip" + ;; +-mips*el-*-linux-gnu*) targ_emul=elf32ltsmip ++mips*el-*-linux-gnu* | mips*el-*-linux-uclibc*) targ_emul=elf32ltsmip + targ_extra_emuls="elf32btsmip elf32ltsmipn32 elf64ltsmip elf32btsmipn32 elf64btsmip" + ;; +-mips*-*-linux-gnu*) targ_emul=elf32btsmip ++mips*-*-linux-gnu* | mips*-*-linux-uclibc*) targ_emul=elf32btsmip + targ_extra_emuls="elf32ltsmip elf32btsmipn32 elf64btsmip elf32ltsmipn32 elf64ltsmip" + ;; + mips*-*-lnews*) targ_emul=mipslnews ;; +@@ -461,6 +473,10 @@ + alpha*-*-linux-gnu*) targ_emul=elf64alpha targ_extra_emuls=alpha + tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` + ;; ++alpha*-*-linux-uclibc*) targ_emul=elf64alpha targ_extra_emuls=alpha ++ # The following needs to be checked... ++ tdir_alpha=`echo ${targ_alias} | sed -e 's/linux/linuxecoff/'` ++ ;; + alpha*-*-osf*) targ_emul=alpha ;; + alpha*-*-gnu*) targ_emul=elf64alpha ;; + alpha*-*-netware*) targ_emul=alpha ;; +diff -urN binutils-2.15-dist/libtool.m4 binutils-2.15/libtool.m4 +--- binutils-2.15-dist/libtool.m4 2003-04-10 22:58:39.000000000 -0500 ++++ binutils-2.15/libtool.m4 2004-08-04 12:01:45.000000000 -0500 +@@ -645,6 +645,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +diff -urN binutils-2.15-dist/ltconfig binutils-2.15/ltconfig +--- binutils-2.15-dist/ltconfig 2003-10-03 23:54:47.000000000 -0500 ++++ binutils-2.15/ltconfig 2004-08-04 12:01:45.000000000 -0500 +@@ -603,6 +603,7 @@ + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in + linux-gnu*) ;; ++linux-uclibc*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac + +@@ -1259,6 +1260,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +diff -urN binutils-2.15-dist/opcodes/configure binutils-2.15/opcodes/configure +--- binutils-2.15-dist/opcodes/configure 2003-08-05 04:39:31.000000000 -0500 ++++ binutils-2.15/opcodes/configure 2004-08-04 12:01:45.000000000 -0500 +@@ -1700,6 +1700,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/patches/binutils/2.15/210-cflags.patch b/patches/binutils/2.15/210-cflags.patch new file mode 100644 index 00000000..dc67d3c4 --- /dev/null +++ b/patches/binutils/2.15/210-cflags.patch @@ -0,0 +1,32 @@ +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.am binutils-2.14.90.0.6.new/bfd/doc/Makefile.am +--- binutils-2.14.90.0.6/bfd/doc/Makefile.am 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.am 2004-03-01 16:05:16.000000000 -0600 +@@ -55,10 +55,10 @@ + MKDOC = chew$(EXEEXT_FOR_BUILD) + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + +diff -urN binutils-2.14.90.0.6/bfd/doc/Makefile.in binutils-2.14.90.0.6.new/bfd/doc/Makefile.in +--- binutils-2.14.90.0.6/bfd/doc/Makefile.in 2003-07-23 10:08:09.000000000 -0500 ++++ binutils-2.14.90.0.6.new/bfd/doc/Makefile.in 2004-03-01 16:05:03.000000000 -0600 +@@ -469,10 +469,10 @@ + + + $(MKDOC): chew.o +- $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS) $(LOADLIBES) $(LDFLAGS) ++ $(CC_FOR_BUILD) -o $(MKDOC) chew.o $(CFLAGS_FOR_BUILD) $(LOADLIBES) $(LDFLAGS) + + chew.o: chew.c +- $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS) $(srcdir)/chew.c ++ $(CC_FOR_BUILD) -c -I.. -I$(srcdir)/.. -I$(srcdir)/../../include -I$(srcdir)/../../intl -I../../intl $(H_CFLAGS) $(CFLAGS_FOR_BUILD) $(srcdir)/chew.c + + protos: libbfd.h libcoff.h bfd.h + diff --git a/patches/binutils/2.15/400-mips-ELF_MAXPAGESIZE-4K.patch b/patches/binutils/2.15/400-mips-ELF_MAXPAGESIZE-4K.patch new file mode 100644 index 00000000..e07a7e8c --- /dev/null +++ b/patches/binutils/2.15/400-mips-ELF_MAXPAGESIZE-4K.patch @@ -0,0 +1,26 @@ +--- binutils/bfd/elf32-mips.c~ ++++ binutils/bfd/elf32-mips.c +@@ -1611,7 +1611,9 @@ + + /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses + page sizes of up to that limit, so we need to respect it. */ +-#define ELF_MAXPAGESIZE 0x10000 ++/*#define ELF_MAXPAGESIZE 0x10000*/ ++/* Use 4K to shrink the elf header. NOT for general use! */ ++#define ELF_MAXPAGESIZE 0x1000 + #define elf32_bed elf32_tradbed + + /* Include the target file again for this target. */ +--- binutils/bfd/elfn32-mips.c~ ++++ binutils/bfd/elfn32-mips.c +@@ -1976,7 +1976,9 @@ + + /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses + page sizes of up to that limit, so we need to respect it. */ +-#define ELF_MAXPAGESIZE 0x10000 ++/*#define ELF_MAXPAGESIZE 0x10000*/ ++/* Use 4K to shrink the elf header. NOT for general use! */ ++#define ELF_MAXPAGESIZE 0x1000 + #define elf32_bed elf32_tradbed + + /* Include the target file again for this target. */ diff --git a/patches/binutils/2.15/600-arm-textrel.patch b/patches/binutils/2.15/600-arm-textrel.patch new file mode 100644 index 00000000..73d5b9df --- /dev/null +++ b/patches/binutils/2.15/600-arm-textrel.patch @@ -0,0 +1,63 @@ +http://sources.redhat.com/ml/binutils/2004-06/msg00010.html +--- binutils-2.15.90.0.3-old/bfd/elf32-arm.h 2004-04-12 14:56:33.000000000 -0500 ++++ binutils-2.15.90.0.3/bfd/elf32-arm.h 2004-09-03 06:56:40.000000000 -0500 +@@ -87,6 +87,8 @@ + #endif + static bfd_boolean allocate_dynrelocs + PARAMS ((struct elf_link_hash_entry *h, PTR inf)); ++static bfd_boolean elf32_arm_readonly_dynrelocs ++ PARAMS ((struct elf_link_hash_entry *, PTR)); + static bfd_boolean create_got_section + PARAMS ((bfd * dynobj, struct bfd_link_info * info)); + static bfd_boolean elf32_arm_create_dynamic_sections +@@ -3531,6 +3533,37 @@ + return TRUE; + } + ++/* Find any dynamic relocs that apply to read-only sections. */ ++ ++static bfd_boolean ++elf32_arm_readonly_dynrelocs (h, inf) ++ struct elf_link_hash_entry *h; ++ PTR inf; ++{ ++ struct elf32_arm_link_hash_entry *eh; ++ struct elf32_arm_relocs_copied *p; ++ ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ ++ eh = (struct elf32_arm_link_hash_entry *) h; ++ for (p = eh->relocs_copied; p != NULL; p = p->next) ++ { ++ asection *s = p->section; ++ ++ if (s != NULL && (s->flags & SEC_READONLY) != 0) ++ { ++ struct bfd_link_info *info = (struct bfd_link_info *) inf; ++ ++ info->flags |= DF_TEXTREL; ++ ++ /* Not an error, just cut short the traversal. */ ++ return FALSE; ++ } ++ } ++ return TRUE; ++} ++ + /* Set the sizes of the dynamic sections. */ + + static bfd_boolean +@@ -3740,6 +3773,12 @@ + return FALSE; + } + ++ /* If any dynamic relocs apply to a read-only section, ++ then we need a DT_TEXTREL entry. */ ++ if ((info->flags & DF_TEXTREL) == 0) ++ elf_link_hash_traverse (&htab->root, elf32_arm_readonly_dynrelocs, ++ (PTR) info); ++ + if ((info->flags & DF_TEXTREL) != 0) + { + if (!add_dynamic_entry (DT_TEXTREL, 0)) diff --git a/patches/binutils/2.15/bfd-hash-tweak.patch b/patches/binutils/2.15/bfd-hash-tweak.patch new file mode 100644 index 00000000..6b8fc412 --- /dev/null +++ b/patches/binutils/2.15/bfd-hash-tweak.patch @@ -0,0 +1,24 @@ +Signed-off-by: dank@kegel.com + +Raising the size of the hash table is a noticable win when linking +at least one large app. + +There was a patch, +http://sources.redhat.com/ml/binutils/2004-06/msg00165.html +to do this dynamically. No idea why that didn't make it in. +So this tiny change to raise the default size is just +a stopgap for now. + + +--- binutils-2.15/bfd/hash.c.old 2003-12-01 01:33:01.000000000 -0500 ++++ binutils-2.15/bfd/hash.c 2006-03-01 16:26:26.701991000 -0500 +@@ -295,7 +295,7 @@ + */ + + /* The default number of entries to use when creating a hash table. */ +-#define DEFAULT_SIZE (4051) ++#define DEFAULT_SIZE (32749) + + /* Create a new hash table, given a number of entries. */ + + diff --git a/patches/binutils/2.15/binutils-2.15-allow-gcc-4.0.patch b/patches/binutils/2.15/binutils-2.15-allow-gcc-4.0.patch new file mode 100644 index 00000000..26e5a121 --- /dev/null +++ b/patches/binutils/2.15/binutils-2.15-allow-gcc-4.0.patch @@ -0,0 +1,75 @@ +Fix found here: http://www.freelists.org/archives/openbeos/11-2005/msg00090.html + +Fixes: +In file included from ./targ-cpu.h:1, + from /home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/binutils-2.15/gas/config/obj-elf.h:42, + from ./obj-format.h:1, + from /home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/binutils-2.15/gas/config/te-linux.h:4, + from ./targ-env.h:1, + from /home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/binutils-2.15/gas/as.h:626, + from /home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/binutils-2.15/gas/app.c:30: +/home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/binutils-2.15/gas/config/tc-i386.h:451: error: array type has incomplete element type +make[3]: *** [app.o] Error 1 +make[3]: Leaving directory `/home/dank/crosstool-new/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/build-binutils/gas' + +when building binutils-2.15 with gcc-4.0 + + +diff -ur binutils-2.15.old/gas/as.h binutils-2.15/gas/as.h +--- binutils-2.15.old/gas/as.h 2003-11-22 18:14:21.000000000 -0800 ++++ binutils-2.15/gas/as.h 2006-02-14 22:05:35.000000000 -0800 +@@ -605,7 +605,26 @@ + struct expressionS; + struct fix; + typedef struct symbol symbolS; +-struct relax_type; ++ ++/* JF moved this here from as.h under the theory that nobody except MACHINE.c ++ and write.c care about it anyway. */ ++/* [zooey]: the above no longer holds with gcc4, as it keeps bugging about ++ incomplete element types in arrays, if relax_type isn't defined ++ here. So I moved the definition back from tc.h to here. */ ++struct relax_type ++{ ++ /* Forward reach. Signed number. > 0. */ ++ long rlx_forward; ++ /* Backward reach. Signed number. < 0. */ ++ long rlx_backward; ++ ++ /* Bytes length of this address. */ ++ unsigned char rlx_length; ++ ++ /* Next longer relax-state. 0 means there is no 'next' relax-state. */ ++ relax_substateT rlx_more; ++}; ++ + typedef struct frag fragS; + + #ifdef BFD_ASSEMBLER +diff -ur binutils-2.15.old/gas/tc.h binutils-2.15/gas/tc.h +--- binutils-2.15.old/gas/tc.h 2003-12-03 15:39:38.000000000 -0800 ++++ binutils-2.15/gas/tc.h 2006-02-14 22:03:35.000000000 -0800 +@@ -24,23 +24,6 @@ + + extern const pseudo_typeS md_pseudo_table[]; + +-/* JF moved this here from as.h under the theory that nobody except MACHINE.c +- and write.c care about it anyway. */ +- +-struct relax_type +-{ +- /* Forward reach. Signed number. > 0. */ +- long rlx_forward; +- /* Backward reach. Signed number. < 0. */ +- long rlx_backward; +- +- /* Bytes length of this address. */ +- unsigned char rlx_length; +- +- /* Next longer relax-state. 0 means there is no 'next' relax-state. */ +- relax_substateT rlx_more; +-}; +- + typedef struct relax_type relax_typeS; + + extern const int md_reloc_size; /* Size of a relocation record */ diff --git a/patches/binutils/2.15/binutils-2.15-psignal.patch b/patches/binutils/2.15/binutils-2.15-psignal.patch new file mode 100644 index 00000000..98fa600e --- /dev/null +++ b/patches/binutils/2.15/binutils-2.15-psignal.patch @@ -0,0 +1,40 @@ +Make psignal prototype in libiberty match that in glibc. + +Fixes: + +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c: In function `psignal': +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:563: argument `signo' doesn't match prototype +/usr/include/signal.h:131: prototype declaration +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:563: argument `message' doesn't match prototype +/usr/include/signal.h:131: prototype declaration +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:568: warning: comparison between signed and unsigned +mprotect... make[1]: *** [strsignal.o] Error 1 +make[1]: Leaving directory `/export/hda3/dkegel/queue/jobdir.produser_cpsm17/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.1.3/build-binutils/libiberty' +make: *** [all-libiberty] Error 2 + +when building on red hat 7.1 +though it's a bit of a mystery why libiberty's psignal is being compiled at +all, since red hat 7.1's glibc supports psignal (hence the error message) + +--- binutils-2.15/libiberty/strsignal.c.old 2005-04-18 13:57:40.000000000 -0700 ++++ binutils-2.15/libiberty/strsignal.c 2005-04-18 13:59:09.000000000 -0700 +@@ -544,7 +544,7 @@ + + /* + +-@deftypefn Supplemental void psignal (unsigned @var{signo}, char *@var{message}) ++@deftypefn Supplemental void psignal (int @var{signo}, const char *@var{message}) + + Print @var{message} to the standard error, followed by a colon, + followed by the description of the signal specified by @var{signo}, +@@ -557,9 +557,7 @@ + #ifndef HAVE_PSIGNAL + + void +-psignal (signo, message) +- unsigned signo; +- char *message; ++psignal (int signo, const char *message) + { + if (signal_names == NULL) + { diff --git a/patches/binutils/2.15/binutils-2.15-solaris-qsort.patch b/patches/binutils/2.15/binutils-2.15-solaris-qsort.patch new file mode 100644 index 00000000..5fe36231 --- /dev/null +++ b/patches/binutils/2.15/binutils-2.15-solaris-qsort.patch @@ -0,0 +1,22 @@ +See http://sources.redhat.com/ml/binutils/2004-06/msg00114.html + +--- src/bfd/elflink.c.org 2004-07-05 09:11:42.920597000 -0400 ++++ src/bfd/elflink.c 2004-07-05 09:12:59.240847000 -0400 +@@ -2700,7 +2700,7 @@ + return vdiff > 0 ? 1 : -1; + else + { +- long sdiff = h1->root.u.def.section - h2->root.u.def.section; ++ long sdiff = h1->root.u.def.section->id - h2->root.u.def.section->id; + if (sdiff != 0) + return sdiff > 0 ? 1 : -1; + } +@@ -3954,7 +3954,7 @@ + i = idx + 1; + else + { +- long sdiff = slook - h->root.u.def.section; ++ long sdiff = slook->id - h->root.u.def.section->id; + if (sdiff < 0) + j = idx; + else if (sdiff > 0) diff --git a/patches/binutils/2.15/binutils-2.15-vmx.patch b/patches/binutils/2.15/binutils-2.15-vmx.patch new file mode 100644 index 00000000..5ae9efeb --- /dev/null +++ b/patches/binutils/2.15/binutils-2.15-vmx.patch @@ -0,0 +1,45 @@ +Grabbed with +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/src/opcodes/ppc-opc.c.diff?r1=1.70&r2=1.71&cvsroot=src' +See +http://mail.gnu.org/archive/html/bug-binutils/2004-05/msg00071.html +and +http://sources.redhat.com/ml/binutils-cvs/2004-05/msg00111.html + +This fixes problems like +{standard input}: Assembler messages: +{standard input}:1: Error: Unrecognized opcode: `dssall' +which show up in binutils-2.15 when building the Linux kernel, +or possibly failed compilations when building setjmp/longjmp in glibc. + +An alternative fix would be to pass -many to the assembler. +A patch to do that for glibc is at +wget 'http://sources.redhat.com/cgi-bin/get-raw-msg?listname=libc-alpha&date=2004-05&msgid=40B36E8C.9030609%40us.ibm.com' +Yet another, better, fix would be for gcc to generate assembly +that told the assembler which processor type to use. +Presumably the Linux kernel sources would need a fix, too. +Probably better to just fix binutils to accept sources that it used to. + + +=================================================================== +RCS file: /cvs/src/src/opcodes/ppc-opc.c,v +retrieving revision 1.70 +retrieving revision 1.71 +diff -u -r1.70 -r1.71 +--- src/opcodes/ppc-opc.c 2004/05/05 13:43:36 1.70 ++++ src/opcodes/ppc-opc.c 2004/05/19 05:11:48 1.71 +@@ -1004,8 +1004,13 @@ + + /* If only one bit of the FXM field is set, we can use the new form + of the instruction, which is faster. Unlike the Power4 branch hint +- encoding, this is not backward compatible. */ +- else if ((dialect & PPC_OPCODE_POWER4) != 0 && (value & -value) == value) ++ encoding, this is not backward compatible. Do not generate the ++ new form unless -mpower4 has been given, or -many and the two ++ operand form of mfcr was used. */ ++ else if ((value & -value) == value ++ && ((dialect & PPC_OPCODE_POWER4) != 0 ++ || ((dialect & PPC_OPCODE_ANY) != 0 ++ && (insn & (0x3ff << 1)) == 19 << 1))) + insn |= 1 << 20; + + /* Any other value on mfcr is an error. */ diff --git a/patches/binutils/2.15/binutils-arm-undef-imm.patch b/patches/binutils/2.15/binutils-arm-undef-imm.patch new file mode 100644 index 00000000..6bf403ca --- /dev/null +++ b/patches/binutils/2.15/binutils-arm-undef-imm.patch @@ -0,0 +1,51 @@ +From http://sources.redhat.com/cgi-bin/cvsweb.cgi/src/gas/config/tc-arm.c.diff?r1=1.168&r2=1.169&cvsroot=src +See also http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2004-July/023128.html, +"[CRITICAL PATCH] 2.6: fix silent build error]" + +Revision 1.169, Fri Jul 2 11:12:29 2004 UTC (19 hours, 4 minutes ago) by nickc +Branch: MAIN +CVS Tags: binutils_latest_snapshot, HEAD +Changes since 1.168: +14 -1 lines + +(md_apply_fix3:BFD_RELOC_ARM_IMMEDIATE): Do not allow values which have come +from undefined symbols. +Always consider this fixup to have been processed as a reloc cannot be +generated for it. + + +=================================================================== +RCS file: /cvs/src/src/gas/config/tc-arm.c,v +retrieving revision 1.168 +retrieving revision 1.169 +diff -u -r1.168 -r1.169 +--- src/gas/config/tc-arm.c 2004/04/30 10:51:12 1.168 ++++ src/gas/config/tc-arm.c 2004/07/02 11:12:29 1.169 +@@ -12186,6 +12186,20 @@ + switch (fixP->fx_r_type) + { + case BFD_RELOC_ARM_IMMEDIATE: ++ /* We claim that this fixup has been processed here, ++ even if in fact we generate an error because we do ++ not have a reloc for it, so tc_gen_reloc will reject it. */ ++ fixP->fx_done = 1; ++ ++ if (fixP->fx_addsy ++ && ! S_IS_DEFINED (fixP->fx_addsy)) ++ { ++ as_bad_where (fixP->fx_file, fixP->fx_line, ++ _("undefined symbol %s used as an immediate value"), ++ S_GET_NAME (fixP->fx_addsy)); ++ break; ++ } ++ + newimm = validate_immediate (value); + temp = md_chars_to_number (buf, INSN_SIZE); + +@@ -12202,7 +12216,6 @@ + + newimm |= (temp & 0xfffff000); + md_number_to_chars (buf, (valueT) newimm, INSN_SIZE); +- fixP->fx_done = 1; + break; + + case BFD_RELOC_ARM_ADRL_IMMEDIATE: diff --git a/patches/binutils/2.15/binutils-skip-comments.patch b/patches/binutils/2.15/binutils-skip-comments.patch new file mode 100644 index 00000000..804a17e0 --- /dev/null +++ b/patches/binutils/2.15/binutils-skip-comments.patch @@ -0,0 +1,101 @@ +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab <schwab at suse dot de> +To: Nathan Sidwell <nathan at codesourcery dot com> +Cc: Ian Lance Taylor <ian at wasabisystems dot com>, binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell <nathan@codesourcery.com> writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab <schwab@suse.de> + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -1,6 +1,6 @@ + /* read.c - read a source file - + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +- 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of GAS, the GNU Assembler. + +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/patches/binutils/2.15/cross-gprof.patch b/patches/binutils/2.15/cross-gprof.patch new file mode 100644 index 00000000..ea6c18fd --- /dev/null +++ b/patches/binutils/2.15/cross-gprof.patch @@ -0,0 +1,22 @@ +--- binutils-2.15/configure.old 2004-07-21 21:36:47.000000000 -0700 ++++ binutils-2.15/configure 2004-07-21 21:37:08.000000000 -0700 +@@ -999,7 +999,7 @@ + + # Some tools are only suitable for building in a "native" situation. + # Remove these if host!=target. +-native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff gprof target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" ++native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" + + # Similarly, some are only suitable for cross toolchains. + # Remove these if host=target. +--- binutils-2.15/configure.in.old 2004-07-21 21:37:19.000000000 -0700 ++++ binutils-2.15/configure.in 2004-07-21 21:37:34.000000000 -0700 +@@ -236,7 +236,7 @@ + + # Some tools are only suitable for building in a "native" situation. + # Remove these if host!=target. +-native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff gprof target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" ++native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" + + # Similarly, some are only suitable for cross toolchains. + # Remove these if host=target. diff --git a/patches/binutils/2.15/gccpr15247-fix.patch b/patches/binutils/2.15/gccpr15247-fix.patch new file mode 100644 index 00000000..967bf7f9 --- /dev/null +++ b/patches/binutils/2.15/gccpr15247-fix.patch @@ -0,0 +1,192 @@ +See +http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15247 + +Fixes spurious error +/tmp/ccvNi4ou.s: Assembler messages: +/tmp/ccvNi4ou.s:2310: Error: Illegal operands: There are only 32 single precision f registers; [0-31] +make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/math/dosincos.o] Error 1 + +when compiling glibc's dosincos.c with gcc-3.4.0 + +=================================================================== +RCS file: /cvs/src/src/opcodes/sparc-opc.c,v +retrieving revision 1.9 +retrieving revision 1.10 +diff -u -r1.9 -r1.10 +--- src/opcodes/sparc-opc.c 2004/01/18 23:46:32 1.9 ++++ src/opcodes/sparc-opc.c 2004/04/20 10:23:51 1.10 +@@ -1273,110 +1273,72 @@ + #define FM_DF 2 /* v9 */ + #define FM_QF 3 /* v9 */ + +-#define fmovicc(opcode, fpsize, cond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z,f,g", flags, v9 } +- +-#define fmovfcc(opcode, fpsize, fcond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags, v9 } ++#define fmoviccx(opcode, fpsize, args, cond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z," args, flags, v9 } ++ ++#define fmovfccx(opcode, fpsize, args, fcond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags, v9 } + + /* FIXME: use fmovicc/fmovfcc? */ /* v9 */ +-#define fmovcc(opcode, fpsize, cond, fcond, flags) /* v9 */ \ +-{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8,f,g", flags | F_FLOAT, v9 }, \ +-{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9,f,g", flags | F_FLOAT, v9 } +- +-/* v9 */ fmovcc ("fmovda", FM_DF, CONDA, FCONDA, 0), +-/* v9 */ fmovcc ("fmovqa", FM_QF, CONDA, FCONDA, 0), +-/* v9 */ fmovcc ("fmovsa", FM_SF, CONDA, FCONDA, 0), +-/* v9 */ fmovicc ("fmovdcc", FM_DF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovqcc", FM_QF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovscc", FM_SF, CONDCC, 0), +-/* v9 */ fmovicc ("fmovdcs", FM_DF, CONDCS, 0), +-/* v9 */ fmovicc ("fmovqcs", FM_QF, CONDCS, 0), +-/* v9 */ fmovicc ("fmovscs", FM_SF, CONDCS, 0), +-/* v9 */ fmovcc ("fmovde", FM_DF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovqe", FM_QF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovse", FM_SF, CONDE, FCONDE, 0), +-/* v9 */ fmovcc ("fmovdg", FM_DF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovqg", FM_QF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovsg", FM_SF, CONDG, FCONDG, 0), +-/* v9 */ fmovcc ("fmovdge", FM_DF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovcc ("fmovqge", FM_QF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovcc ("fmovsge", FM_SF, CONDGE, FCONDGE, 0), +-/* v9 */ fmovicc ("fmovdgeu", FM_DF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovqgeu", FM_QF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovsgeu", FM_SF, CONDGEU, F_ALIAS), +-/* v9 */ fmovicc ("fmovdgu", FM_DF, CONDGU, 0), +-/* v9 */ fmovicc ("fmovqgu", FM_QF, CONDGU, 0), +-/* v9 */ fmovicc ("fmovsgu", FM_SF, CONDGU, 0), +-/* v9 */ fmovcc ("fmovdl", FM_DF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovql", FM_QF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovsl", FM_SF, CONDL, FCONDL, 0), +-/* v9 */ fmovcc ("fmovdle", FM_DF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovcc ("fmovqle", FM_QF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovcc ("fmovsle", FM_SF, CONDLE, FCONDLE, 0), +-/* v9 */ fmovicc ("fmovdleu", FM_DF, CONDLEU, 0), +-/* v9 */ fmovicc ("fmovqleu", FM_QF, CONDLEU, 0), +-/* v9 */ fmovicc ("fmovsleu", FM_SF, CONDLEU, 0), +-/* v9 */ fmovfcc ("fmovdlg", FM_DF, FCONDLG, 0), +-/* v9 */ fmovfcc ("fmovqlg", FM_QF, FCONDLG, 0), +-/* v9 */ fmovfcc ("fmovslg", FM_SF, FCONDLG, 0), +-/* v9 */ fmovicc ("fmovdlu", FM_DF, CONDLU, F_ALIAS), +-/* v9 */ fmovicc ("fmovqlu", FM_QF, CONDLU, F_ALIAS), +-/* v9 */ fmovicc ("fmovslu", FM_SF, CONDLU, F_ALIAS), +-/* v9 */ fmovcc ("fmovdn", FM_DF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovqn", FM_QF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovsn", FM_SF, CONDN, FCONDN, 0), +-/* v9 */ fmovcc ("fmovdne", FM_DF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovcc ("fmovqne", FM_QF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovcc ("fmovsne", FM_SF, CONDNE, FCONDNE, 0), +-/* v9 */ fmovicc ("fmovdneg", FM_DF, CONDNEG, 0), +-/* v9 */ fmovicc ("fmovqneg", FM_QF, CONDNEG, 0), +-/* v9 */ fmovicc ("fmovsneg", FM_SF, CONDNEG, 0), +-/* v9 */ fmovcc ("fmovdnz", FM_DF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovqnz", FM_QF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovsnz", FM_SF, CONDNZ, FCONDNZ, F_ALIAS), +-/* v9 */ fmovfcc ("fmovdo", FM_DF, FCONDO, 0), +-/* v9 */ fmovfcc ("fmovqo", FM_QF, FCONDO, 0), +-/* v9 */ fmovfcc ("fmovso", FM_SF, FCONDO, 0), +-/* v9 */ fmovicc ("fmovdpos", FM_DF, CONDPOS, 0), +-/* v9 */ fmovicc ("fmovqpos", FM_QF, CONDPOS, 0), +-/* v9 */ fmovicc ("fmovspos", FM_SF, CONDPOS, 0), +-/* v9 */ fmovfcc ("fmovdu", FM_DF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovqu", FM_QF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovsu", FM_SF, FCONDU, 0), +-/* v9 */ fmovfcc ("fmovdue", FM_DF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovque", FM_QF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovsue", FM_SF, FCONDUE, 0), +-/* v9 */ fmovfcc ("fmovdug", FM_DF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovqug", FM_QF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovsug", FM_SF, FCONDUG, 0), +-/* v9 */ fmovfcc ("fmovduge", FM_DF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovquge", FM_QF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovsuge", FM_SF, FCONDUGE, 0), +-/* v9 */ fmovfcc ("fmovdul", FM_DF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovqul", FM_QF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovsul", FM_SF, FCONDUL, 0), +-/* v9 */ fmovfcc ("fmovdule", FM_DF, FCONDULE, 0), +-/* v9 */ fmovfcc ("fmovqule", FM_QF, FCONDULE, 0), +-/* v9 */ fmovfcc ("fmovsule", FM_SF, FCONDULE, 0), +-/* v9 */ fmovicc ("fmovdvc", FM_DF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovqvc", FM_QF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovsvc", FM_SF, CONDVC, 0), +-/* v9 */ fmovicc ("fmovdvs", FM_DF, CONDVS, 0), +-/* v9 */ fmovicc ("fmovqvs", FM_QF, CONDVS, 0), +-/* v9 */ fmovicc ("fmovsvs", FM_SF, CONDVS, 0), +-/* v9 */ fmovcc ("fmovdz", FM_DF, CONDZ, FCONDZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovqz", FM_QF, CONDZ, FCONDZ, F_ALIAS), +-/* v9 */ fmovcc ("fmovsz", FM_SF, CONDZ, FCONDZ, F_ALIAS), +- ++#define fmovccx(opcode, fpsize, args, cond, fcond, flags) /* v9 */ \ ++{ opcode, F3F(2, 0x35, 0x100+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x100+fpsize))|MCOND(~cond,~0), "z," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x000+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x000+fpsize))|MCOND(~fcond,~0), "6," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x180+fpsize)|MCOND(cond,0), F3F(~2, ~0x35, ~(0x180+fpsize))|MCOND(~cond,~0), "Z," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x040+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x040+fpsize))|MCOND(~fcond,~0), "7," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x080+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x080+fpsize))|MCOND(~fcond,~0), "8," args, flags | F_FLOAT, v9 }, \ ++{ opcode, F3F(2, 0x35, 0x0c0+fpsize)|MCOND(fcond,0), F3F(~2, ~0x35, ~(0x0c0+fpsize))|MCOND(~fcond,~0), "9," args, flags | F_FLOAT, v9 } ++ ++#define fmovicc(suffix, cond, flags) /* v9 */ \ ++fmoviccx("fmovd" suffix, FM_DF, "B,H", cond, flags), \ ++fmoviccx("fmovq" suffix, FM_QF, "R,J", cond, flags), \ ++fmoviccx("fmovs" suffix, FM_SF, "f,g", cond, flags) ++ ++#define fmovfcc(suffix, fcond, flags) /* v9 */ \ ++fmovfccx("fmovd" suffix, FM_DF, "B,H", fcond, flags), \ ++fmovfccx("fmovq" suffix, FM_QF, "R,J", fcond, flags), \ ++fmovfccx("fmovs" suffix, FM_SF, "f,g", fcond, flags) ++ ++#define fmovcc(suffix, cond, fcond, flags) /* v9 */ \ ++fmovccx("fmovd" suffix, FM_DF, "B,H", cond, fcond, flags), \ ++fmovccx("fmovq" suffix, FM_QF, "R,J", cond, fcond, flags), \ ++fmovccx("fmovs" suffix, FM_SF, "f,g", cond, fcond, flags) ++ ++/* v9 */ fmovcc ("a", CONDA, FCONDA, 0), ++/* v9 */ fmovicc ("cc", CONDCC, 0), ++/* v9 */ fmovicc ("cs", CONDCS, 0), ++/* v9 */ fmovcc ("e", CONDE, FCONDE, 0), ++/* v9 */ fmovcc ("g", CONDG, FCONDG, 0), ++/* v9 */ fmovcc ("ge", CONDGE, FCONDGE, 0), ++/* v9 */ fmovicc ("geu", CONDGEU, F_ALIAS), ++/* v9 */ fmovicc ("gu", CONDGU, 0), ++/* v9 */ fmovcc ("l", CONDL, FCONDL, 0), ++/* v9 */ fmovcc ("le", CONDLE, FCONDLE, 0), ++/* v9 */ fmovicc ("leu", CONDLEU, 0), ++/* v9 */ fmovfcc ("lg", FCONDLG, 0), ++/* v9 */ fmovicc ("lu", CONDLU, F_ALIAS), ++/* v9 */ fmovcc ("n", CONDN, FCONDN, 0), ++/* v9 */ fmovcc ("ne", CONDNE, FCONDNE, 0), ++/* v9 */ fmovicc ("neg", CONDNEG, 0), ++/* v9 */ fmovcc ("nz", CONDNZ, FCONDNZ, F_ALIAS), ++/* v9 */ fmovfcc ("o", FCONDO, 0), ++/* v9 */ fmovicc ("pos", CONDPOS, 0), ++/* v9 */ fmovfcc ("u", FCONDU, 0), ++/* v9 */ fmovfcc ("ue", FCONDUE, 0), ++/* v9 */ fmovfcc ("ug", FCONDUG, 0), ++/* v9 */ fmovfcc ("uge", FCONDUGE, 0), ++/* v9 */ fmovfcc ("ul", FCONDUL, 0), ++/* v9 */ fmovfcc ("ule", FCONDULE, 0), ++/* v9 */ fmovicc ("vc", CONDVC, 0), ++/* v9 */ fmovicc ("vs", CONDVS, 0), ++/* v9 */ fmovcc ("z", CONDZ, FCONDZ, F_ALIAS), ++ ++#undef fmoviccx /* v9 */ ++#undef fmovfccx /* v9 */ ++#undef fmovccx /* v9 */ + #undef fmovicc /* v9 */ + #undef fmovfcc /* v9 */ + #undef fmovcc /* v9 */ diff --git a/patches/binutils/2.15/ld-2.15-callahan.patch b/patches/binutils/2.15/ld-2.15-callahan.patch new file mode 100644 index 00000000..bb4a69c8 --- /dev/null +++ b/patches/binutils/2.15/ld-2.15-callahan.patch @@ -0,0 +1,677 @@ +Signed-off-by: dank@kegel.com +Fixes ld speed issue. +See http://weblogs.mozillazine.org/roc/archives/2005/02/optimizing_gnu.html +See thread "Re: optimizations for 3x speedup in ld", +http://sources.redhat.com/ml/binutils/2005-03/msg00847.html + +Wildcard section matching enhancement, backported from the binutils CVS tree. +Here's the CVS log comment from the original change to ldlang.c: + +revision 1.177 +date: 2005/04/06 15:33:02; author: jakub; state: Exp; lines: +438 -51 +2005-04-06 Jakub Jelinek <jakub@redhat.com> + + * ldlang.c: Formatting. + (walk_wild_consider_section): Remember return value from wildcardp. + (is_simple_wild): Use strcspn instead of 2 strpbrk calls and strlen. + (wild_spec_can_overlap): Use strcspn instead of strpbrk and strlen. + +2005-04-06 Robert O'Callahan <rocallahan@novell.com> + + * ld.h (lean_section_userdata_type): Remove. + (fat_section_userdata_type): Remove file field. + (SECTION_USERDATA_SIZE): Remove. + * ldlang.c (init_os): Eliminate initialization of unused + lean_section_userdata_type. + + * ldlang.h (callback_t, walk_wild_section_handler_t): New + typedefs. + (struct lang_wild_statement_struct): Add walk_wild_section_handler + and handler_data fields. + * ldlang.c (callback_t): Removed. + (walk_wild_consider_section, walk_wild_section_general, + section_iterator_callback, find_section, is_simple_wild, + match_simple_wild, walk_wild_section_specs1_wild0, + walk_wild_section_specs1_wild1, walk_wild_section_specs2_wild1, + walk_wild_section_specs3_wild2, walk_wild_section_specs4_wild2, + wild_spec_can_overlap, analyze_walk_wild_section_handler): New + functions. + (lang_add_wild): Call analyze_walk_wild_section_handler. + (walk_wild_section): Renamed to walk_wild_section_general and + created a wrapper function. + (section_iterator_callback_data): New typedef. + +Note that bfd_get_section_by_name_if didn't exist in 2.15, so it was backported +as well. + +--- binutils-2.15/bfd/bfd-in2.h.old 2004-05-17 15:35:56.000000000 -0400 ++++ binutils-2.15/bfd/bfd-in2.h 2006-02-09 11:54:45.989940000 -0500 +@@ -1425,6 +1425,10 @@ + + asection *bfd_get_section_by_name (bfd *abfd, const char *name); + ++asection *bfd_get_section_by_name_if (bfd *abfd, const char *name, ++ bfd_boolean (*operation) (bfd *, asection *, void *), ++ void *user_storage); ++ + char *bfd_get_unique_section_name + (bfd *abfd, const char *templat, int *count); + +--- binutils-2.15/bfd/section.c.old 2003-12-01 01:33:01.000000000 -0500 ++++ binutils-2.15/bfd/section.c 2006-01-23 14:16:54.768993000 -0500 +@@ -801,6 +801,57 @@ + + /* + FUNCTION ++ bfd_get_section_by_name_if ++ ++SYNOPSIS ++ asection *bfd_get_section_by_name_if ++ (bfd *abfd, ++ const char *name, ++ bfd_boolean (*func) (bfd *abfd, asection *sect, void *obj), ++ void *obj); ++ ++DESCRIPTION ++ Call the provided function @var{func} for each section ++ attached to the BFD @var{abfd} whose name matches @var{name}, ++ passing @var{obj} as an argument. The function will be called ++ as if by ++ ++| func (abfd, the_section, obj); ++ ++ It returns the first section for which @var{func} returns true, ++ otherwise <<NULL>>. ++ ++*/ ++ ++asection * ++bfd_get_section_by_name_if (bfd *abfd, const char *name, ++ bfd_boolean (*operation) (bfd *, ++ asection *, ++ void *), ++ void *user_storage) ++{ ++ struct section_hash_entry *sh; ++ unsigned long hash; ++ ++ sh = section_hash_lookup (&abfd->section_htab, name, FALSE, FALSE); ++ if (sh == NULL) ++ return NULL; ++ ++ hash = sh->root.hash; ++ do ++ { ++ if ((*operation) (abfd, &sh->section, user_storage)) ++ return &sh->section; ++ sh = (struct section_hash_entry *) sh->root.next; ++ } ++ while (sh != NULL && sh->root.hash == hash ++ && strcmp (sh->root.string, name) == 0); ++ ++ return NULL; ++} ++ ++/* ++FUNCTION + bfd_get_unique_section_name + + SYNOPSIS +--- binutils-2.15/ld/ldlang.c.old 2004-05-17 15:36:16.000000000 -0400 ++++ binutils-2.15/ld/ldlang.c 2006-01-23 13:40:12.745499000 -0500 +@@ -81,9 +81,6 @@ + static void lang_record_phdrs (void); + static void lang_do_version_exports_section (void); + +-typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *, +- asection *, lang_input_statement_type *, void *); +- + /* Exported variables. */ + lang_output_section_statement_type *abs_output_section; + lang_statement_list_type lang_output_section_statement; +@@ -138,21 +135,71 @@ + + /* Generic traversal routines for finding matching sections. */ + ++/* Try processing a section against a wildcard. This just calls ++ the callback unless the filename exclusion list is present ++ and excludes the file. It's hardly ever present so this ++ function is very fast. */ ++ ++static void ++walk_wild_consider_section (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ asection *s, ++ struct wildcard_list *sec, ++ callback_t callback, ++ void *data) ++{ ++ bfd_boolean skip = FALSE; ++ struct name_list *list_tmp; ++ ++ /* Don't process sections from files which were ++ excluded. */ ++ for (list_tmp = sec->spec.exclude_name_list; ++ list_tmp; ++ list_tmp = list_tmp->next) ++ { ++ bfd_boolean is_wildcard = wildcardp (list_tmp->name); ++ if (is_wildcard) ++ skip = fnmatch (list_tmp->name, file->filename, 0) == 0; ++ else ++ skip = strcmp (list_tmp->name, file->filename) == 0; ++ ++ /* If this file is part of an archive, and the archive is ++ excluded, exclude this file. */ ++ if (! skip && file->the_bfd != NULL ++ && file->the_bfd->my_archive != NULL ++ && file->the_bfd->my_archive->filename != NULL) ++ { ++ if (is_wildcard) ++ skip = fnmatch (list_tmp->name, ++ file->the_bfd->my_archive->filename, ++ 0) == 0; ++ else ++ skip = strcmp (list_tmp->name, ++ file->the_bfd->my_archive->filename) == 0; ++ } ++ ++ if (skip) ++ break; ++ } ++ ++ if (!skip) ++ (*callback) (ptr, sec, s, file, data); ++} ++ ++/* Lowest common denominator routine that can handle everything correctly, ++ but slowly. */ ++ + static void +-walk_wild_section (lang_wild_statement_type *ptr, +- lang_input_statement_type *file, +- callback_t callback, +- void *data) ++walk_wild_section_general (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) + { + asection *s; +- +- if (file->just_syms_flag) +- return; ++ struct wildcard_list *sec; + + for (s = file->the_bfd->sections; s != NULL; s = s->next) + { +- struct wildcard_list *sec; +- + sec = ptr->section_list; + if (sec == NULL) + (*callback) (ptr, sec, s, file, data); +@@ -160,39 +207,8 @@ + while (sec != NULL) + { + bfd_boolean skip = FALSE; +- struct name_list *list_tmp; +- +- /* Don't process sections from files which were +- excluded. */ +- for (list_tmp = sec->spec.exclude_name_list; +- list_tmp; +- list_tmp = list_tmp->next) +- { +- if (wildcardp (list_tmp->name)) +- skip = fnmatch (list_tmp->name, file->filename, 0) == 0; +- else +- skip = strcmp (list_tmp->name, file->filename) == 0; +- +- /* If this file is part of an archive, and the archive is +- excluded, exclude this file. */ +- if (! skip && file->the_bfd != NULL +- && file->the_bfd->my_archive != NULL +- && file->the_bfd->my_archive->filename != NULL) +- { +- if (wildcardp (list_tmp->name)) +- skip = fnmatch (list_tmp->name, +- file->the_bfd->my_archive->filename, +- 0) == 0; +- else +- skip = strcmp (list_tmp->name, +- file->the_bfd->my_archive->filename) == 0; +- } +- +- if (skip) +- break; +- } + +- if (!skip && sec->spec.name != NULL) ++ if (sec->spec.name != NULL) + { + const char *sname = bfd_get_section_name (file->the_bfd, s); + +@@ -203,13 +219,381 @@ + } + + if (!skip) +- (*callback) (ptr, sec, s, file, data); ++ walk_wild_consider_section (ptr, file, s, sec, callback, data); + + sec = sec->next; + } + } + } + ++/* Routines to find a single section given its name. If there's more ++ than one section with that name, we report that. */ ++ ++typedef struct ++{ ++ asection *found_section; ++ bfd_boolean multiple_sections_found; ++} section_iterator_callback_data; ++ ++static bfd_boolean ++section_iterator_callback (bfd *bfd ATTRIBUTE_UNUSED, asection *s, void *data) ++{ ++ section_iterator_callback_data *d = data; ++ ++ if (d->found_section != NULL) ++ { ++ d->multiple_sections_found = TRUE; ++ return TRUE; ++ } ++ ++ d->found_section = s; ++ return FALSE; ++} ++ ++static asection * ++find_section (lang_input_statement_type *file, ++ struct wildcard_list *sec, ++ bfd_boolean *multiple_sections_found) ++{ ++ section_iterator_callback_data cb_data = { NULL, FALSE }; ++ ++ bfd_get_section_by_name_if (file->the_bfd, sec->spec.name, ++ section_iterator_callback, &cb_data); ++ *multiple_sections_found = cb_data.multiple_sections_found; ++ return cb_data.found_section; ++} ++ ++/* Code for handling simple wildcards without going through fnmatch, ++ which can be expensive because of charset translations etc. */ ++ ++/* A simple wild is a literal string followed by a single '*', ++ where the literal part is at least 4 characters long. */ ++ ++static bfd_boolean ++is_simple_wild (const char *name) ++{ ++ size_t len = strcspn (name, "*?["); ++ return len >= 4 && name[len] == '*' && name[len + 1] == '\0'; ++} ++ ++static bfd_boolean ++match_simple_wild (const char *pattern, const char *name) ++{ ++ /* The first four characters of the pattern are guaranteed valid ++ non-wildcard characters. So we can go faster. */ ++ if (pattern[0] != name[0] || pattern[1] != name[1] ++ || pattern[2] != name[2] || pattern[3] != name[3]) ++ return FALSE; ++ ++ pattern += 4; ++ name += 4; ++ while (*pattern != '*') ++ if (*name++ != *pattern++) ++ return FALSE; ++ ++ return TRUE; ++} ++ ++/* Specialized, optimized routines for handling different kinds of ++ wildcards */ ++ ++static void ++walk_wild_section_specs1_wild0 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ /* We can just do a hash lookup for the section with the right name. ++ But if that lookup discovers more than one section with the name ++ (should be rare), we fall back to the general algorithm because ++ we would otherwise have to sort the sections to make sure they ++ get processed in the bfd's order. */ ++ bfd_boolean multiple_sections_found; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found); ++ ++ if (multiple_sections_found) ++ walk_wild_section_general (ptr, file, callback, data); ++ else if (s0) ++ walk_wild_consider_section (ptr, file, s0, sec0, callback, data); ++} ++ ++static void ++walk_wild_section_specs1_wild1 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *wildsec0 = ptr->handler_data[0]; ++ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec0->spec.name, sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec0, callback, data); ++ } ++} ++ ++static void ++walk_wild_section_specs2_wild1 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ struct wildcard_list *wildsec1 = ptr->handler_data[1]; ++ bfd_boolean multiple_sections_found; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found); ++ ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ /* Note that if the section was not found, s0 is NULL and ++ we'll simply never succeed the s == s0 test below. */ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ /* Recall that in this code path, a section cannot satisfy more ++ than one spec, so if s == s0 then it cannot match ++ wildspec1. */ ++ if (s == s0) ++ walk_wild_consider_section (ptr, file, s, sec0, callback, data); ++ else ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec1->spec.name, sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec1, callback, ++ data); ++ } ++ } ++} ++ ++static void ++walk_wild_section_specs3_wild2 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ struct wildcard_list *wildsec1 = ptr->handler_data[1]; ++ struct wildcard_list *wildsec2 = ptr->handler_data[2]; ++ bfd_boolean multiple_sections_found; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found); ++ ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ if (s == s0) ++ walk_wild_consider_section (ptr, file, s, sec0, callback, data); ++ else ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec1->spec.name, sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec1, callback, data); ++ else ++ { ++ skip = !match_simple_wild (wildsec2->spec.name, sname); ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec2, callback, ++ data); ++ } ++ } ++ } ++} ++ ++static void ++walk_wild_section_specs4_wild2 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ struct wildcard_list *sec1 = ptr->handler_data[1]; ++ struct wildcard_list *wildsec2 = ptr->handler_data[2]; ++ struct wildcard_list *wildsec3 = ptr->handler_data[3]; ++ bfd_boolean multiple_sections_found; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found), *s1; ++ ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ s1 = find_section (file, sec1, &multiple_sections_found); ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ if (s == s0) ++ walk_wild_consider_section (ptr, file, s, sec0, callback, data); ++ else ++ if (s == s1) ++ walk_wild_consider_section (ptr, file, s, sec1, callback, data); ++ else ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec2->spec.name, ++ sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec2, callback, ++ data); ++ else ++ { ++ skip = !match_simple_wild (wildsec3->spec.name, sname); ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec3, ++ callback, data); ++ } ++ } ++ } ++} ++ ++static void ++walk_wild_section (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ if (file->just_syms_flag) ++ return; ++ ++ (*ptr->walk_wild_section_handler) (ptr, file, callback, data); ++} ++ ++/* Returns TRUE when name1 is a wildcard spec that might match ++ something name2 can match. We're conservative: we return FALSE ++ only if the prefixes of name1 and name2 are different up to the ++ first wildcard character. */ ++ ++static bfd_boolean ++wild_spec_can_overlap (const char *name1, const char *name2) ++{ ++ size_t prefix1_len = strcspn (name1, "?*["); ++ size_t prefix2_len = strcspn (name2, "?*["); ++ size_t min_prefix_len; ++ ++ /* Note that if there is no wildcard character, then we treat the ++ terminating 0 as part of the prefix. Thus ".text" won't match ++ ".text." or ".text.*", for example. */ ++ if (name1[prefix1_len] == '\0') ++ prefix1_len++; ++ if (name2[prefix2_len] == '\0') ++ prefix2_len++; ++ ++ min_prefix_len = prefix1_len < prefix2_len ? prefix1_len : prefix2_len; ++ ++ return memcmp (name1, name2, min_prefix_len) == 0; ++} ++ ++/* Select specialized code to handle various kinds of wildcard ++ statements. */ ++ ++static void ++analyze_walk_wild_section_handler (lang_wild_statement_type *ptr) ++{ ++ int sec_count = 0; ++ int wild_name_count = 0; ++ struct wildcard_list *sec; ++ int signature; ++ int data_counter; ++ ++ ptr->walk_wild_section_handler = walk_wild_section_general; ++ ++ /* Count how many wildcard_specs there are, and how many of those ++ actually use wildcards in the name. Also, bail out if any of the ++ wildcard names are NULL. (Can this actually happen? ++ walk_wild_section used to test for it.) And bail out if any ++ of the wildcards are more complex than a simple string ++ ending in a single '*'. */ ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ { ++ ++sec_count; ++ if (sec->spec.name == NULL) ++ return; ++ if (wildcardp (sec->spec.name)) ++ { ++ ++wild_name_count; ++ if (!is_simple_wild (sec->spec.name)) ++ return; ++ } ++ } ++ ++ /* The zero-spec case would be easy to optimize but it doesn't ++ happen in practice. Likewise, more than 4 specs doesn't ++ happen in practice. */ ++ if (sec_count == 0 || sec_count > 4) ++ return; ++ ++ /* Check that no two specs can match the same section. */ ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ { ++ struct wildcard_list *sec2; ++ for (sec2 = sec->next; sec2 != NULL; sec2 = sec2->next) ++ { ++ if (wild_spec_can_overlap (sec->spec.name, sec2->spec.name)) ++ return; ++ } ++ } ++ ++ signature = (sec_count << 8) + wild_name_count; ++ switch (signature) ++ { ++ case 0x0100: ++ ptr->walk_wild_section_handler = walk_wild_section_specs1_wild0; ++ break; ++ case 0x0101: ++ ptr->walk_wild_section_handler = walk_wild_section_specs1_wild1; ++ break; ++ case 0x0201: ++ ptr->walk_wild_section_handler = walk_wild_section_specs2_wild1; ++ break; ++ case 0x0302: ++ ptr->walk_wild_section_handler = walk_wild_section_specs3_wild2; ++ break; ++ case 0x0402: ++ ptr->walk_wild_section_handler = walk_wild_section_specs4_wild2; ++ break; ++ default: ++ return; ++ } ++ ++ /* Now fill the data array with pointers to the specs, first the ++ specs with non-wildcard names, then the specs with wildcard ++ names. It's OK to process the specs in different order from the ++ given order, because we've already determined that no section ++ will match more than one spec. */ ++ data_counter = 0; ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ if (!wildcardp (sec->spec.name)) ++ ptr->handler_data[data_counter++] = sec; ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ if (wildcardp (sec->spec.name)) ++ ptr->handler_data[data_counter++] = sec; ++} ++ + /* Handle a wild statement for a single file F. */ + + static void +@@ -4353,6 +4737,7 @@ + new->section_list = section_list; + new->keep_sections = keep_sections; + lang_list_init (&new->children); ++ analyze_walk_wild_section_handler (new); + } + + void +--- binutils-2.15/ld/ldlang.h.old 2004-05-17 15:36:16.000000000 -0400 ++++ binutils-2.15/ld/ldlang.h 2006-01-23 13:32:33.653292000 -0500 +@@ -295,7 +295,17 @@ + union lang_statement_union *file; + } lang_afile_asection_pair_statement_type; + +-typedef struct lang_wild_statement_struct ++typedef struct lang_wild_statement_struct lang_wild_statement_type; ++ ++typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *, ++ asection *, lang_input_statement_type *, void *); ++ ++typedef void (*walk_wild_section_handler_t) (lang_wild_statement_type *, ++ lang_input_statement_type *, ++ callback_t callback, ++ void *data); ++ ++struct lang_wild_statement_struct + { + lang_statement_header_type header; + const char *filename; +@@ -303,7 +313,10 @@ + struct wildcard_list *section_list; + bfd_boolean keep_sections; + lang_statement_list_type children; +-} lang_wild_statement_type; ++ ++ walk_wild_section_handler_t walk_wild_section_handler; ++ struct wildcard_list *handler_data[4]; ++}; + + typedef struct lang_address_statement_struct + { diff --git a/patches/binutils/2.15/ld-2.15-stabs-tweak.patch b/patches/binutils/2.15/ld-2.15-stabs-tweak.patch new file mode 100644 index 00000000..bd6ae7a1 --- /dev/null +++ b/patches/binutils/2.15/ld-2.15-stabs-tweak.patch @@ -0,0 +1,33 @@ +Signed-off-by: dank@kegel.com + +See http://sourceware.org/ml/binutils/2005-12/msg00270.html +http://sourceware.org/ml/binutils-cvs/2005-12/msg00139.html + +STABS hash table size change, backported from the binutils CVS tree. Here's +the CVS log comment for the original change: + +revision 1.25 +date: 2005/12/29 10:29:23; author: nickc; state: Exp; lines: +2 -3 +(_bfd_link_section_stabs): Use bfd_hash_table_init rather than +bfd_hash_table_init_n(...,251) so that the size of the hash table can be +controlled by the user. + +Note that tunable hash table size changes were added after 2.15. The effect +of this change is to make bfd use its default hash table size for the stabs +hash as well. + + +--- binutils-2.15/bfd/stabs.c.old 2004-05-17 15:36:04.000000000 -0400 ++++ binutils-2.15/bfd/stabs.c 2006-02-09 15:21:56.567014000 -0500 +@@ -241,9 +241,8 @@ + goto error_return; + /* Make sure the first byte is zero. */ + (void) _bfd_stringtab_add (sinfo->strings, "", TRUE, TRUE); +- if (! bfd_hash_table_init_n (&sinfo->includes.root, +- stab_link_includes_newfunc, +- 251)) ++ if (! bfd_hash_table_init (&sinfo->includes.root, ++ stab_link_includes_newfunc)) + goto error_return; + sinfo->stabstr = bfd_make_section_anyway (abfd, ".stabstr"); + sinfo->stabstr->flags |= SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING; diff --git a/patches/binutils/2.15/s390-invalid-insn-format.patch b/patches/binutils/2.15/s390-invalid-insn-format.patch new file mode 100644 index 00000000..32962015 --- /dev/null +++ b/patches/binutils/2.15/s390-invalid-insn-format.patch @@ -0,0 +1,42 @@ +Message-ID: <000801c48f60$cec16630$9103a8c0@ULOC5012> +From: "Michael Geiger" <mcgege@gmx.de> +To: <dank@kegel.com> +Subject: Patch for cross compiling s/390 kernel on linux host +Date: Tue, 31 Aug 2004 15:45:41 +0200 + +Dear Dan, + +I had big problems compiling a kernel for s/390 on my linux host - I tried +different chains from crosstool-0.28-rc34 and finally succeded with +gcc-3.3.4-glibc-2.3.2 after applying another patch to binutils-2.15 +(attached). +All compilations of the different kernel versions I tried stopped with +"Invalid .insn format" somewhere. I checked the recent cvs version of +binutils and applied the latest diff to gas/config/tc-s390.c and that solved +it. + +Greetings + +Michael Geiger + + +diff -u -r1.39 -r1.40 +--- src/gas/config/tc-s390.c 2004/05/06 11:01:48 1.39 ++++ src/gas/config/tc-s390.c 2004/06/15 12:38:08 1.40 +@@ -1596,13 +1596,13 @@ + if (exp.X_op == O_constant) + { + if ( ( opformat->oplen == 6 +- && exp.X_add_number >= 0 ++ && (addressT) exp.X_add_number >= 0 + && (addressT) exp.X_add_number < (1ULL << 48)) + || ( opformat->oplen == 4 +- && exp.X_add_number >= 0 ++ && (addressT) exp.X_add_number >= 0 + && (addressT) exp.X_add_number < (1ULL << 32)) + || ( opformat->oplen == 2 +- && exp.X_add_number >= 0 ++ && (addressT) exp.X_add_number >= 0 + && (addressT) exp.X_add_number < (1ULL << 16))) + md_number_to_chars (insn, exp.X_add_number, opformat->oplen); + else diff --git a/patches/binutils/2.16.1/bfd-hash-tweak.patch b/patches/binutils/2.16.1/bfd-hash-tweak.patch new file mode 100644 index 00000000..c6de93a9 --- /dev/null +++ b/patches/binutils/2.16.1/bfd-hash-tweak.patch @@ -0,0 +1,23 @@ +Signed-off-by: dank@kegel.com + +Raising the size of the hash table is a noticable win when linking +at least one large app. + +There was a patch, +http://sources.redhat.com/ml/binutils/2004-06/msg00165.html +to do this dynamically. No idea why that didn't make it in. +So this tiny change to raise the default size is just +a stopgap for now. + + +--- binutils-2.16.1/bfd/hash.c.old 2006-03-02 23:01:39.000000000 -0800 ++++ binutils-2.16.1/bfd/hash.c 2006-03-02 23:01:58.000000000 -0800 +@@ -300,7 +300,7 @@ + */ + + /* The default number of entries to use when creating a hash table. */ +-#define DEFAULT_SIZE 4051 ++#define DEFAULT_SIZE 32749 + static size_t bfd_default_hash_table_size = DEFAULT_SIZE; + + /* Create a new hash table, given a number of entries. */ diff --git a/patches/binutils/2.16.1/binutils-2.15-psignal.patch b/patches/binutils/2.16.1/binutils-2.15-psignal.patch new file mode 100644 index 00000000..98fa600e --- /dev/null +++ b/patches/binutils/2.16.1/binutils-2.15-psignal.patch @@ -0,0 +1,40 @@ +Make psignal prototype in libiberty match that in glibc. + +Fixes: + +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c: In function `psignal': +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:563: argument `signo' doesn't match prototype +/usr/include/signal.h:131: prototype declaration +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:563: argument `message' doesn't match prototype +/usr/include/signal.h:131: prototype declaration +gcc-2.95.3-glibc-2.1.3/binutils-2.15/libiberty/strsignal.c:568: warning: comparison between signed and unsigned +mprotect... make[1]: *** [strsignal.o] Error 1 +make[1]: Leaving directory `/export/hda3/dkegel/queue/jobdir.produser_cpsm17/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.1.3/build-binutils/libiberty' +make: *** [all-libiberty] Error 2 + +when building on red hat 7.1 +though it's a bit of a mystery why libiberty's psignal is being compiled at +all, since red hat 7.1's glibc supports psignal (hence the error message) + +--- binutils-2.15/libiberty/strsignal.c.old 2005-04-18 13:57:40.000000000 -0700 ++++ binutils-2.15/libiberty/strsignal.c 2005-04-18 13:59:09.000000000 -0700 +@@ -544,7 +544,7 @@ + + /* + +-@deftypefn Supplemental void psignal (unsigned @var{signo}, char *@var{message}) ++@deftypefn Supplemental void psignal (int @var{signo}, const char *@var{message}) + + Print @var{message} to the standard error, followed by a colon, + followed by the description of the signal specified by @var{signo}, +@@ -557,9 +557,7 @@ + #ifndef HAVE_PSIGNAL + + void +-psignal (signo, message) +- unsigned signo; +- char *message; ++psignal (int signo, const char *message) + { + if (signal_names == NULL) + { diff --git a/patches/binutils/2.16.1/binutils-skip-comments.patch b/patches/binutils/2.16.1/binutils-skip-comments.patch new file mode 100644 index 00000000..0ca9a471 --- /dev/null +++ b/patches/binutils/2.16.1/binutils-skip-comments.patch @@ -0,0 +1,95 @@ +[removed first hunk so it would apply to 2.16.1 - copyright date already updated - dank] + +Retrieved from http://sources.redhat.com/ml/binutils/2004-04/msg00646.html +Fixes +localealias.s:544: Error: junk at end of line, first unrecognized character is `,' +when building glibc-2.3.2 with gcc-3.4.0 and binutils-2.15.90.0.3 + +Paths adjusted to match crosstool's patcher. + +Message-Id: m3n052qw2g.fsf@whitebox.m5r.de +From: Andreas Schwab <schwab at suse dot de> +To: Nathan Sidwell <nathan at codesourcery dot com> +Cc: Ian Lance Taylor <ian at wasabisystems dot com>, binutils at sources dot redhat dot com +Date: Fri, 23 Apr 2004 22:27:19 +0200 +Subject: Re: demand_empty_rest_of_line and ignore_rest_of_line + +Nathan Sidwell <nathan@codesourcery.com> writes: + +> Index: read.c +> =================================================================== +> RCS file: /cvs/src/src/gas/read.c,v +> retrieving revision 1.76 +> diff -c -3 -p -r1.76 read.c +> *** read.c 12 Mar 2004 17:48:12 -0000 1.76 +> --- read.c 18 Mar 2004 09:56:05 -0000 +> *************** read_a_source_file (char *name) +> *** 1053,1059 **** +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! ignore_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook +> --- 1053,1059 ---- +> #endif +> input_line_pointer--; +> /* Report unknown char as ignored. */ +> ! demand_empty_rest_of_line (); +> } +> +> #ifdef md_after_pass_hook + +This means that the unknown character is no longer ignored, despite the +comment. As a side effect a line starting with a line comment character +not followed by APP in NO_APP mode now triggers an error instead of just a +warning, breaking builds of glibc on m68k-linux. Earlier in +read_a_source_file where #APP is handled there is another comment that +claims that unknown comments are ignored, when in fact they aren't (only +the initial line comment character is skipped). + +Note that the presence of #APP will mess up the line counters, but +that appears to be difficult to fix. + +Andreas. + +2004-04-23 Andreas Schwab <schwab@suse.de> + + * read.c (read_a_source_file): Ignore unknown text after line + comment character. Fix misleading comment. + +--- binutils/gas/read.c.~1.78.~ 2004-04-23 08:58:23.000000000 +0200 ++++ binutils/gas/read.c 2004-04-23 21:49:01.000000000 +0200 +@@ -950,10 +950,14 @@ read_a_source_file (char *name) + unsigned int new_length; + char *tmp_buf = 0; + +- bump_line_counters (); + s = input_line_pointer; + if (strncmp (s, "APP\n", 4)) +- continue; /* We ignore it */ ++ { ++ /* We ignore it */ ++ ignore_rest_of_line (); ++ continue; ++ } ++ bump_line_counters (); + s += 4; + + sb_new (&sbuf); +@@ -1052,7 +1056,7 @@ read_a_source_file (char *name) + continue; + #endif + input_line_pointer--; +- /* Report unknown char as ignored. */ ++ /* Report unknown char as error. */ + demand_empty_rest_of_line (); + } + + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, MaxfeldstraÃe 5, 90409 NÃrnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." diff --git a/patches/binutils/2.16.1/callahan.patch b/patches/binutils/2.16.1/callahan.patch new file mode 100644 index 00000000..a39050f9 --- /dev/null +++ b/patches/binutils/2.16.1/callahan.patch @@ -0,0 +1,693 @@ +Signed-off-by: dank@kegel.com +Fixes ld speed issue. +See http://weblogs.mozillazine.org/roc/archives/2005/02/optimizing_gnu.html +See thread "Re: optimizations for 3x speedup in ld", +http://sources.redhat.com/ml/binutils/2005-03/msg00847.html + +Wildcard section matching enhancement, backported from the binutils CVS tree. +Here's the CVS log comment from the original change to ldlang.c: + +revision 1.177 +date: 2005/04/06 15:33:02; author: jakub; state: Exp; lines: +438 -51 +2005-04-06 Jakub Jelinek <jakub@redhat.com> + + * ldlang.c: Formatting. + (walk_wild_consider_section): Remember return value from wildcardp. + (is_simple_wild): Use strcspn instead of 2 strpbrk calls and strlen. + (wild_spec_can_overlap): Use strcspn instead of strpbrk and strlen. + +2005-04-06 Robert O'Callahan <rocallahan@novell.com> + + * ld.h (lean_section_userdata_type): Remove. + (fat_section_userdata_type): Remove file field. + (SECTION_USERDATA_SIZE): Remove. + * ldlang.c (init_os): Eliminate initialization of unused + lean_section_userdata_type. + + * ldlang.h (callback_t, walk_wild_section_handler_t): New + typedefs. + (struct lang_wild_statement_struct): Add walk_wild_section_handler + and handler_data fields. + * ldlang.c (callback_t): Removed. + (walk_wild_consider_section, walk_wild_section_general, + section_iterator_callback, find_section, is_simple_wild, + match_simple_wild, walk_wild_section_specs1_wild0, + walk_wild_section_specs1_wild1, walk_wild_section_specs2_wild1, + walk_wild_section_specs3_wild2, walk_wild_section_specs4_wild2, + wild_spec_can_overlap, analyze_walk_wild_section_handler): New + functions. + (lang_add_wild): Call analyze_walk_wild_section_handler. + (walk_wild_section): Renamed to walk_wild_section_general and + created a wrapper function. + (section_iterator_callback_data): New typedef. + + +Index: src/ld/ld.h +=================================================================== +RCS file: /cvs/src/src/ld/ld.h,v +retrieving revision 1.26 +retrieving revision 1.27 +diff -u -r1.26 -r1.27 +--- binutils/ld/ld.h.old 16 Mar 2005 21:52:42 -0000 1.26 ++++ binutils/ld/ld.h 6 Apr 2005 15:33:02 -0000 1.27 +@@ -1,6 +1,6 @@ + /* ld.h -- general linker header file + Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +- 2001, 2002, 2003, 2004 ++ 2001, 2002, 2003, 2004, 2005 + Free Software Foundation, Inc. + + This file is part of GLD, the Gnu Linker. +@@ -89,28 +89,15 @@ + struct map_symbol_def *next; + }; + +-/* Extra information we hold on sections */ +-typedef struct lean_user_section_struct { +- /* For output sections: pointer to the section where this data will go. */ +- struct lang_input_statement_struct *file; +-} lean_section_userdata_type; +- + /* The initial part of fat_user_section_struct has to be idential with + lean_user_section_struct. */ + typedef struct fat_user_section_struct { +- /* For output sections: pointer to the section where this data will go. */ +- struct lang_input_statement_struct *file; + /* For input sections, when writing a map file: head / tail of a linked + list of hash table entries for symbols defined in this section. */ + struct map_symbol_def *map_symbol_def_head; + struct map_symbol_def **map_symbol_def_tail; + } fat_section_userdata_type; + +-#define SECTION_USERDATA_SIZE \ +- (command_line.reduce_memory_overheads \ +- ? sizeof (lean_section_userdata_type) \ +- : sizeof (fat_section_userdata_type)) +- + #define get_userdata(x) ((x)->userdata) + + #define BYTE_SIZE (1) +Index: src/ld/ldlang.c +=================================================================== +RCS file: /cvs/src/src/ld/ldlang.c,v +retrieving revision 1.176 +retrieving revision 1.177 +diff -u -r1.176 -r1.177 +--- binutils/ld/ldlang.c.old 18 Mar 2005 13:56:26 -0000 1.176 ++++ binutils/ld/ldlang.c 6 Apr 2005 15:33:02 -0000 1.177 +@@ -84,9 +84,6 @@ + static void lang_record_phdrs (void); + static void lang_do_version_exports_section (void); + +-typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *, +- asection *, lang_input_statement_type *, void *); +- + /* Exported variables. */ + lang_output_section_statement_type *abs_output_section; + lang_statement_list_type lang_output_section_statement; +@@ -155,21 +152,71 @@ + + /* Generic traversal routines for finding matching sections. */ + ++/* Try processing a section against a wildcard. This just calls ++ the callback unless the filename exclusion list is present ++ and excludes the file. It's hardly ever present so this ++ function is very fast. */ ++ ++static void ++walk_wild_consider_section (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ asection *s, ++ struct wildcard_list *sec, ++ callback_t callback, ++ void *data) ++{ ++ bfd_boolean skip = FALSE; ++ struct name_list *list_tmp; ++ ++ /* Don't process sections from files which were ++ excluded. */ ++ for (list_tmp = sec->spec.exclude_name_list; ++ list_tmp; ++ list_tmp = list_tmp->next) ++ { ++ bfd_boolean is_wildcard = wildcardp (list_tmp->name); ++ if (is_wildcard) ++ skip = fnmatch (list_tmp->name, file->filename, 0) == 0; ++ else ++ skip = strcmp (list_tmp->name, file->filename) == 0; ++ ++ /* If this file is part of an archive, and the archive is ++ excluded, exclude this file. */ ++ if (! skip && file->the_bfd != NULL ++ && file->the_bfd->my_archive != NULL ++ && file->the_bfd->my_archive->filename != NULL) ++ { ++ if (is_wildcard) ++ skip = fnmatch (list_tmp->name, ++ file->the_bfd->my_archive->filename, ++ 0) == 0; ++ else ++ skip = strcmp (list_tmp->name, ++ file->the_bfd->my_archive->filename) == 0; ++ } ++ ++ if (skip) ++ break; ++ } ++ ++ if (!skip) ++ (*callback) (ptr, sec, s, file, data); ++} ++ ++/* Lowest common denominator routine that can handle everything correctly, ++ but slowly. */ ++ + static void +-walk_wild_section (lang_wild_statement_type *ptr, +- lang_input_statement_type *file, +- callback_t callback, +- void *data) ++walk_wild_section_general (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) + { + asection *s; +- +- if (file->just_syms_flag) +- return; ++ struct wildcard_list *sec; + + for (s = file->the_bfd->sections; s != NULL; s = s->next) + { +- struct wildcard_list *sec; +- + sec = ptr->section_list; + if (sec == NULL) + (*callback) (ptr, sec, s, file, data); +@@ -177,39 +224,8 @@ + while (sec != NULL) + { + bfd_boolean skip = FALSE; +- struct name_list *list_tmp; + +- /* Don't process sections from files which were +- excluded. */ +- for (list_tmp = sec->spec.exclude_name_list; +- list_tmp; +- list_tmp = list_tmp->next) +- { +- if (wildcardp (list_tmp->name)) +- skip = fnmatch (list_tmp->name, file->filename, 0) == 0; +- else +- skip = strcmp (list_tmp->name, file->filename) == 0; +- +- /* If this file is part of an archive, and the archive is +- excluded, exclude this file. */ +- if (! skip && file->the_bfd != NULL +- && file->the_bfd->my_archive != NULL +- && file->the_bfd->my_archive->filename != NULL) +- { +- if (wildcardp (list_tmp->name)) +- skip = fnmatch (list_tmp->name, +- file->the_bfd->my_archive->filename, +- 0) == 0; +- else +- skip = strcmp (list_tmp->name, +- file->the_bfd->my_archive->filename) == 0; +- } +- +- if (skip) +- break; +- } +- +- if (!skip && sec->spec.name != NULL) ++ if (sec->spec.name != NULL) + { + const char *sname = bfd_get_section_name (file->the_bfd, s); + +@@ -220,13 +236,381 @@ + } + + if (!skip) +- (*callback) (ptr, sec, s, file, data); ++ walk_wild_consider_section (ptr, file, s, sec, callback, data); + + sec = sec->next; + } + } + } + ++/* Routines to find a single section given its name. If there's more ++ than one section with that name, we report that. */ ++ ++typedef struct ++{ ++ asection *found_section; ++ bfd_boolean multiple_sections_found; ++} section_iterator_callback_data; ++ ++static bfd_boolean ++section_iterator_callback (bfd *bfd ATTRIBUTE_UNUSED, asection *s, void *data) ++{ ++ section_iterator_callback_data *d = data; ++ ++ if (d->found_section != NULL) ++ { ++ d->multiple_sections_found = TRUE; ++ return TRUE; ++ } ++ ++ d->found_section = s; ++ return FALSE; ++} ++ ++static asection * ++find_section (lang_input_statement_type *file, ++ struct wildcard_list *sec, ++ bfd_boolean *multiple_sections_found) ++{ ++ section_iterator_callback_data cb_data = { NULL, FALSE }; ++ ++ bfd_get_section_by_name_if (file->the_bfd, sec->spec.name, ++ section_iterator_callback, &cb_data); ++ *multiple_sections_found = cb_data.multiple_sections_found; ++ return cb_data.found_section; ++} ++ ++/* Code for handling simple wildcards without going through fnmatch, ++ which can be expensive because of charset translations etc. */ ++ ++/* A simple wild is a literal string followed by a single '*', ++ where the literal part is at least 4 characters long. */ ++ ++static bfd_boolean ++is_simple_wild (const char *name) ++{ ++ size_t len = strcspn (name, "*?["); ++ return len >= 4 && name[len] == '*' && name[len + 1] == '\0'; ++} ++ ++static bfd_boolean ++match_simple_wild (const char *pattern, const char *name) ++{ ++ /* The first four characters of the pattern are guaranteed valid ++ non-wildcard characters. So we can go faster. */ ++ if (pattern[0] != name[0] || pattern[1] != name[1] ++ || pattern[2] != name[2] || pattern[3] != name[3]) ++ return FALSE; ++ ++ pattern += 4; ++ name += 4; ++ while (*pattern != '*') ++ if (*name++ != *pattern++) ++ return FALSE; ++ ++ return TRUE; ++} ++ ++/* Specialized, optimized routines for handling different kinds of ++ wildcards */ ++ ++static void ++walk_wild_section_specs1_wild0 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ /* We can just do a hash lookup for the section with the right name. ++ But if that lookup discovers more than one section with the name ++ (should be rare), we fall back to the general algorithm because ++ we would otherwise have to sort the sections to make sure they ++ get processed in the bfd's order. */ ++ bfd_boolean multiple_sections_found; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found); ++ ++ if (multiple_sections_found) ++ walk_wild_section_general (ptr, file, callback, data); ++ else if (s0) ++ walk_wild_consider_section (ptr, file, s0, sec0, callback, data); ++} ++ ++static void ++walk_wild_section_specs1_wild1 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *wildsec0 = ptr->handler_data[0]; ++ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec0->spec.name, sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec0, callback, data); ++ } ++} ++ ++static void ++walk_wild_section_specs2_wild1 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ struct wildcard_list *wildsec1 = ptr->handler_data[1]; ++ bfd_boolean multiple_sections_found; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found); ++ ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ /* Note that if the section was not found, s0 is NULL and ++ we'll simply never succeed the s == s0 test below. */ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ /* Recall that in this code path, a section cannot satisfy more ++ than one spec, so if s == s0 then it cannot match ++ wildspec1. */ ++ if (s == s0) ++ walk_wild_consider_section (ptr, file, s, sec0, callback, data); ++ else ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec1->spec.name, sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec1, callback, ++ data); ++ } ++ } ++} ++ ++static void ++walk_wild_section_specs3_wild2 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ struct wildcard_list *wildsec1 = ptr->handler_data[1]; ++ struct wildcard_list *wildsec2 = ptr->handler_data[2]; ++ bfd_boolean multiple_sections_found; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found); ++ ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ if (s == s0) ++ walk_wild_consider_section (ptr, file, s, sec0, callback, data); ++ else ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec1->spec.name, sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec1, callback, data); ++ else ++ { ++ skip = !match_simple_wild (wildsec2->spec.name, sname); ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec2, callback, ++ data); ++ } ++ } ++ } ++} ++ ++static void ++walk_wild_section_specs4_wild2 (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ asection *s; ++ struct wildcard_list *sec0 = ptr->handler_data[0]; ++ struct wildcard_list *sec1 = ptr->handler_data[1]; ++ struct wildcard_list *wildsec2 = ptr->handler_data[2]; ++ struct wildcard_list *wildsec3 = ptr->handler_data[3]; ++ bfd_boolean multiple_sections_found; ++ asection *s0 = find_section (file, sec0, &multiple_sections_found), *s1; ++ ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ s1 = find_section (file, sec1, &multiple_sections_found); ++ if (multiple_sections_found) ++ { ++ walk_wild_section_general (ptr, file, callback, data); ++ return; ++ } ++ ++ for (s = file->the_bfd->sections; s != NULL; s = s->next) ++ { ++ if (s == s0) ++ walk_wild_consider_section (ptr, file, s, sec0, callback, data); ++ else ++ if (s == s1) ++ walk_wild_consider_section (ptr, file, s, sec1, callback, data); ++ else ++ { ++ const char *sname = bfd_get_section_name (file->the_bfd, s); ++ bfd_boolean skip = !match_simple_wild (wildsec2->spec.name, ++ sname); ++ ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec2, callback, ++ data); ++ else ++ { ++ skip = !match_simple_wild (wildsec3->spec.name, sname); ++ if (!skip) ++ walk_wild_consider_section (ptr, file, s, wildsec3, ++ callback, data); ++ } ++ } ++ } ++} ++ ++static void ++walk_wild_section (lang_wild_statement_type *ptr, ++ lang_input_statement_type *file, ++ callback_t callback, ++ void *data) ++{ ++ if (file->just_syms_flag) ++ return; ++ ++ (*ptr->walk_wild_section_handler) (ptr, file, callback, data); ++} ++ ++/* Returns TRUE when name1 is a wildcard spec that might match ++ something name2 can match. We're conservative: we return FALSE ++ only if the prefixes of name1 and name2 are different up to the ++ first wildcard character. */ ++ ++static bfd_boolean ++wild_spec_can_overlap (const char *name1, const char *name2) ++{ ++ size_t prefix1_len = strcspn (name1, "?*["); ++ size_t prefix2_len = strcspn (name2, "?*["); ++ size_t min_prefix_len; ++ ++ /* Note that if there is no wildcard character, then we treat the ++ terminating 0 as part of the prefix. Thus ".text" won't match ++ ".text." or ".text.*", for example. */ ++ if (name1[prefix1_len] == '\0') ++ prefix1_len++; ++ if (name2[prefix2_len] == '\0') ++ prefix2_len++; ++ ++ min_prefix_len = prefix1_len < prefix2_len ? prefix1_len : prefix2_len; ++ ++ return memcmp (name1, name2, min_prefix_len) == 0; ++} ++ ++/* Select specialized code to handle various kinds of wildcard ++ statements. */ ++ ++static void ++analyze_walk_wild_section_handler (lang_wild_statement_type *ptr) ++{ ++ int sec_count = 0; ++ int wild_name_count = 0; ++ struct wildcard_list *sec; ++ int signature; ++ int data_counter; ++ ++ ptr->walk_wild_section_handler = walk_wild_section_general; ++ ++ /* Count how many wildcard_specs there are, and how many of those ++ actually use wildcards in the name. Also, bail out if any of the ++ wildcard names are NULL. (Can this actually happen? ++ walk_wild_section used to test for it.) And bail out if any ++ of the wildcards are more complex than a simple string ++ ending in a single '*'. */ ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ { ++ ++sec_count; ++ if (sec->spec.name == NULL) ++ return; ++ if (wildcardp (sec->spec.name)) ++ { ++ ++wild_name_count; ++ if (!is_simple_wild (sec->spec.name)) ++ return; ++ } ++ } ++ ++ /* The zero-spec case would be easy to optimize but it doesn't ++ happen in practice. Likewise, more than 4 specs doesn't ++ happen in practice. */ ++ if (sec_count == 0 || sec_count > 4) ++ return; ++ ++ /* Check that no two specs can match the same section. */ ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ { ++ struct wildcard_list *sec2; ++ for (sec2 = sec->next; sec2 != NULL; sec2 = sec2->next) ++ { ++ if (wild_spec_can_overlap (sec->spec.name, sec2->spec.name)) ++ return; ++ } ++ } ++ ++ signature = (sec_count << 8) + wild_name_count; ++ switch (signature) ++ { ++ case 0x0100: ++ ptr->walk_wild_section_handler = walk_wild_section_specs1_wild0; ++ break; ++ case 0x0101: ++ ptr->walk_wild_section_handler = walk_wild_section_specs1_wild1; ++ break; ++ case 0x0201: ++ ptr->walk_wild_section_handler = walk_wild_section_specs2_wild1; ++ break; ++ case 0x0302: ++ ptr->walk_wild_section_handler = walk_wild_section_specs3_wild2; ++ break; ++ case 0x0402: ++ ptr->walk_wild_section_handler = walk_wild_section_specs4_wild2; ++ break; ++ default: ++ return; ++ } ++ ++ /* Now fill the data array with pointers to the specs, first the ++ specs with non-wildcard names, then the specs with wildcard ++ names. It's OK to process the specs in different order from the ++ given order, because we've already determined that no section ++ will match more than one spec. */ ++ data_counter = 0; ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ if (!wildcardp (sec->spec.name)) ++ ptr->handler_data[data_counter++] = sec; ++ for (sec = ptr->section_list; sec != NULL; sec = sec->next) ++ if (wildcardp (sec->spec.name)) ++ ptr->handler_data[data_counter++] = sec; ++} ++ + /* Handle a wild statement for a single file F. */ + + static void +@@ -1175,17 +1559,12 @@ + static void + init_os (lang_output_section_statement_type *s) + { +- lean_section_userdata_type *new; +- + if (s->bfd_section != NULL) + return; + + if (strcmp (s->name, DISCARD_SECTION_NAME) == 0) + einfo (_("%P%F: Illegal use of `%s' section\n"), DISCARD_SECTION_NAME); + +- new = stat_alloc (SECTION_USERDATA_SIZE); +- memset (new, 0, SECTION_USERDATA_SIZE); +- + s->bfd_section = bfd_get_section_by_name (output_bfd, s->name); + if (s->bfd_section == NULL) + s->bfd_section = bfd_make_section (output_bfd, s->name); +@@ -1199,7 +1578,14 @@ + /* We initialize an output sections output offset to minus its own + vma to allow us to output a section through itself. */ + s->bfd_section->output_offset = 0; +- get_userdata (s->bfd_section) = new; ++ if (!command_line.reduce_memory_overheads) ++ { ++ fat_section_userdata_type *new ++ = stat_alloc (sizeof (fat_section_userdata_type)); ++ memset (new, 0, sizeof (fat_section_userdata_type)); ++ get_userdata (s->bfd_section) = new; ++ } ++ + + /* If there is a base address, make sure that any sections it might + mention are initialized. */ +@@ -4939,6 +5325,7 @@ + new->section_list = section_list; + new->keep_sections = keep_sections; + lang_list_init (&new->children); ++ analyze_walk_wild_section_handler (new); + } + + void +Index: src/ld/ldlang.h +=================================================================== +RCS file: /cvs/src/src/ld/ldlang.h,v +retrieving revision 1.44 +retrieving revision 1.45 +diff -u -r1.44 -r1.45 +--- binutils/ld/ldlang.h.old 3 Mar 2005 11:51:58 -0000 1.44 ++++ binutils/ld/ldlang.h 6 Apr 2005 15:33:03 -0000 1.45 +@@ -298,7 +298,17 @@ + union lang_statement_union *file; + } lang_afile_asection_pair_statement_type; + +-typedef struct lang_wild_statement_struct ++typedef struct lang_wild_statement_struct lang_wild_statement_type; ++ ++typedef void (*callback_t) (lang_wild_statement_type *, struct wildcard_list *, ++ asection *, lang_input_statement_type *, void *); ++ ++typedef void (*walk_wild_section_handler_t) (lang_wild_statement_type *, ++ lang_input_statement_type *, ++ callback_t callback, ++ void *data); ++ ++struct lang_wild_statement_struct + { + lang_statement_header_type header; + const char *filename; +@@ -306,7 +316,10 @@ + struct wildcard_list *section_list; + bfd_boolean keep_sections; + lang_statement_list_type children; +-} lang_wild_statement_type; ++ ++ walk_wild_section_handler_t walk_wild_section_handler; ++ struct wildcard_list *handler_data[4]; ++}; + + typedef struct lang_address_statement_struct + { diff --git a/patches/binutils/2.16.1/cross-gprof.patch b/patches/binutils/2.16.1/cross-gprof.patch new file mode 100644 index 00000000..ea6c18fd --- /dev/null +++ b/patches/binutils/2.16.1/cross-gprof.patch @@ -0,0 +1,22 @@ +--- binutils-2.15/configure.old 2004-07-21 21:36:47.000000000 -0700 ++++ binutils-2.15/configure 2004-07-21 21:37:08.000000000 -0700 +@@ -999,7 +999,7 @@ + + # Some tools are only suitable for building in a "native" situation. + # Remove these if host!=target. +-native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff gprof target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" ++native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" + + # Similarly, some are only suitable for cross toolchains. + # Remove these if host=target. +--- binutils-2.15/configure.in.old 2004-07-21 21:37:19.000000000 -0700 ++++ binutils-2.15/configure.in 2004-07-21 21:37:34.000000000 -0700 +@@ -236,7 +236,7 @@ + + # Some tools are only suitable for building in a "native" situation. + # Remove these if host!=target. +-native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff gprof target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" ++native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" + + # Similarly, some are only suitable for cross toolchains. + # Remove these if host=target. diff --git a/patches/binutils/2.16.1/stabs-tweak.patch b/patches/binutils/2.16.1/stabs-tweak.patch new file mode 100644 index 00000000..86e36114 --- /dev/null +++ b/patches/binutils/2.16.1/stabs-tweak.patch @@ -0,0 +1,28 @@ +Signed-off-by: dank@kegel.com + +See http://sourceware.org/ml/binutils/2005-12/msg00270.html +http://sourceware.org/ml/binutils-cvs/2005-12/msg00139.html + +STABS hash table size change, backported from the binutils CVS tree. Here's +the CVS log comment for the original change: + +revision 1.25 +date: 2005/12/29 10:29:23; author: nickc; state: Exp; lines: +2 -3 +(_bfd_link_section_stabs): Use bfd_hash_table_init rather than +bfd_hash_table_init_n(...,251) so that the size of the hash table can be +controlled by the user. + +--- binutils/bfd/stabs.c.old 4 May 2005 15:53:39 -0000 1.24 ++++ binutils/bfd/stabs.c 29 Dec 2005 10:29:23 -0000 1.25 +@@ -194,9 +194,8 @@ + goto error_return; + /* Make sure the first byte is zero. */ + (void) _bfd_stringtab_add (sinfo->strings, "", TRUE, TRUE); +- if (! bfd_hash_table_init_n (&sinfo->includes, +- stab_link_includes_newfunc, +- 251)) ++ if (! bfd_hash_table_init (&sinfo->includes, ++ stab_link_includes_newfunc)) + goto error_return; + sinfo->stabstr = bfd_make_section_anyway (abfd, ".stabstr"); + if (sinfo->stabstr == NULL) diff --git a/patches/binutils/2.17.50.0.10/100-uclibc-conf.patch b/patches/binutils/2.17.50.0.10/100-uclibc-conf.patch new file mode 100644 index 00000000..25222e5d --- /dev/null +++ b/patches/binutils/2.17.50.0.10/100-uclibc-conf.patch @@ -0,0 +1,139 @@ +--- binutils-2.16.91.0.7/bfd/configure ++++ binutils-2.16.91.0.7/bfd/configure +@@ -3576,7 +3576,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/binutils/configure ++++ binutils-2.16.91.0.7/binutils/configure +@@ -3411,7 +3411,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/configure ++++ binutils-2.16.91.0.7/configure +@@ -1270,7 +1270,7 @@ + am33_2.0-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; +- sh-*-linux*) ++ sh*-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; + sh*-*-pe|mips*-*-pe|*arm-wince-pe) +@@ -1578,7 +1578,7 @@ + romp-*-*) + noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}" + ;; +- sh-*-* | sh64-*-*) ++ sh*-*-* | sh64-*-*) + case "${host}" in + i[3456789]86-*-vsta) ;; # don't add gprof back in + i[3456789]86-*-go32*) ;; # don't add gprof back in +--- binutils-2.16.91.0.7/configure.in ++++ binutils-2.16.91.0.7/configure.in +@@ -468,7 +468,7 @@ + am33_2.0-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; +- sh-*-linux*) ++ sh*-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; + sh*-*-pe|mips*-*-pe|*arm-wince-pe) +@@ -776,7 +776,7 @@ + romp-*-*) + noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}" + ;; +- sh-*-* | sh64-*-*) ++ sh*-*-* | sh64-*-*) + case "${host}" in + i[[3456789]]86-*-vsta) ;; # don't add gprof back in + i[[3456789]]86-*-go32*) ;; # don't add gprof back in +--- binutils-2.16.91.0.7/gas/configure ++++ binutils-2.16.91.0.7/gas/configure +@@ -3411,7 +3411,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/gprof/configure ++++ binutils-2.16.91.0.7/gprof/configure +@@ -3419,6 +3419,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- binutils-2.16.91.0.7/ld/configure ++++ binutils-2.16.91.0.7/ld/configure +@@ -3413,7 +3413,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/libtool.m4 ++++ binutils-2.16.91.0.7/libtool.m4 +@@ -739,7 +739,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/ltconfig ++++ binutils-2.16.91.0.7/ltconfig +@@ -602,6 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1247,7 +1248,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + version_type=linux + need_lib_prefix=no + need_version=no +--- binutils-2.16.91.0.7/opcodes/configure ++++ binutils-2.16.91.0.7/opcodes/configure +@@ -3579,7 +3579,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + diff --git a/patches/binutils/2.17.50.0.10/110-arm-eabi-conf.patch b/patches/binutils/2.17.50.0.10/110-arm-eabi-conf.patch new file mode 100644 index 00000000..be85ceb1 --- /dev/null +++ b/patches/binutils/2.17.50.0.10/110-arm-eabi-conf.patch @@ -0,0 +1,24 @@ +diff -urN binutils-2.16.91.0.7.orig/configure binutils-2.16.91.0.7/configure +--- binutils-2.16.91.0.7.orig/configure 2006-05-31 14:54:24.000000000 +0300 ++++ binutils-2.16.91.0.7/configure 2006-05-31 14:55:53.000000000 +0300 +@@ -1299,7 +1299,7 @@ + arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* ) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + ;; +- arm*-*-linux-gnueabi) ++ arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + noconfigdirs="$noconfigdirs target-libjava target-libobjc" + ;; +diff -urN binutils-2.16.91.0.7.orig/configure.in binutils-2.16.91.0.7/configure.in +--- binutils-2.16.91.0.7.orig/configure.in 2006-05-31 14:54:24.000000000 +0300 ++++ binutils-2.16.91.0.7/configure.in 2006-05-31 14:55:53.000000000 +0300 +@@ -497,7 +497,7 @@ + arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* ) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + ;; +- arm*-*-linux-gnueabi) ++ arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + noconfigdirs="$noconfigdirs target-libjava target-libobjc" + ;; diff --git a/patches/binutils/2.17.50.0.10/300-001_ld_makefile_patch.patch b/patches/binutils/2.17.50.0.10/300-001_ld_makefile_patch.patch new file mode 100644 index 00000000..04a7e61e --- /dev/null +++ b/patches/binutils/2.17.50.0.10/300-001_ld_makefile_patch.patch @@ -0,0 +1,50 @@ +#!/bin/sh -e +## 001_ld_makefile_patch.dpatch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: correct where ld scripts are installed +## DP: Author: Chris Chimelis <chris@debian.org> +## DP: Upstream status: N/A +## DP: Date: ?? + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +--- binutils-2.16.91.0.1/ld/Makefile.am ++++ binutils-2.16.91.0.1/ld/Makefile.am +@@ -20,7 +20,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +--- binutils-2.16.91.0.1/ld/Makefile.in ++++ binutils-2.16.91.0.1/ld/Makefile.in +@@ -268,7 +268,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + BASEDIR = $(srcdir)/.. + BFDDIR = $(BASEDIR)/bfd + INCDIR = $(BASEDIR)/include diff --git a/patches/binutils/2.17.50.0.10/300-012_check_ldrunpath_length.patch b/patches/binutils/2.17.50.0.10/300-012_check_ldrunpath_length.patch new file mode 100644 index 00000000..498651a9 --- /dev/null +++ b/patches/binutils/2.17.50.0.10/300-012_check_ldrunpath_length.patch @@ -0,0 +1,47 @@ +#!/bin/sh -e +## 012_check_ldrunpath_length.dpatch by Chris Chimelis <chris@debian.org> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Only generate an RPATH entry if LD_RUN_PATH is not empty, for +## DP: cases where -rpath isn't specified. (#151024) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em binutils-2.15/ld/emultempl/elf32.em +--- /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:58.000000000 +0100 ++++ binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:59.000000000 +0100 +@@ -692,6 +692,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, &n, + force)) + break; +@@ -871,6 +873,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, diff --git a/patches/binutils/2.17.50.0.8/100-uclibc-conf.patch b/patches/binutils/2.17.50.0.8/100-uclibc-conf.patch new file mode 100644 index 00000000..25222e5d --- /dev/null +++ b/patches/binutils/2.17.50.0.8/100-uclibc-conf.patch @@ -0,0 +1,139 @@ +--- binutils-2.16.91.0.7/bfd/configure ++++ binutils-2.16.91.0.7/bfd/configure +@@ -3576,7 +3576,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/binutils/configure ++++ binutils-2.16.91.0.7/binutils/configure +@@ -3411,7 +3411,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/configure ++++ binutils-2.16.91.0.7/configure +@@ -1270,7 +1270,7 @@ + am33_2.0-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; +- sh-*-linux*) ++ sh*-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; + sh*-*-pe|mips*-*-pe|*arm-wince-pe) +@@ -1578,7 +1578,7 @@ + romp-*-*) + noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}" + ;; +- sh-*-* | sh64-*-*) ++ sh*-*-* | sh64-*-*) + case "${host}" in + i[3456789]86-*-vsta) ;; # don't add gprof back in + i[3456789]86-*-go32*) ;; # don't add gprof back in +--- binutils-2.16.91.0.7/configure.in ++++ binutils-2.16.91.0.7/configure.in +@@ -468,7 +468,7 @@ + am33_2.0-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; +- sh-*-linux*) ++ sh*-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; + sh*-*-pe|mips*-*-pe|*arm-wince-pe) +@@ -776,7 +776,7 @@ + romp-*-*) + noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}" + ;; +- sh-*-* | sh64-*-*) ++ sh*-*-* | sh64-*-*) + case "${host}" in + i[[3456789]]86-*-vsta) ;; # don't add gprof back in + i[[3456789]]86-*-go32*) ;; # don't add gprof back in +--- binutils-2.16.91.0.7/gas/configure ++++ binutils-2.16.91.0.7/gas/configure +@@ -3411,7 +3411,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/gprof/configure ++++ binutils-2.16.91.0.7/gprof/configure +@@ -3419,6 +3419,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- binutils-2.16.91.0.7/ld/configure ++++ binutils-2.16.91.0.7/ld/configure +@@ -3413,7 +3413,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/libtool.m4 ++++ binutils-2.16.91.0.7/libtool.m4 +@@ -739,7 +739,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/ltconfig ++++ binutils-2.16.91.0.7/ltconfig +@@ -602,6 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1247,7 +1248,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + version_type=linux + need_lib_prefix=no + need_version=no +--- binutils-2.16.91.0.7/opcodes/configure ++++ binutils-2.16.91.0.7/opcodes/configure +@@ -3579,7 +3579,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + diff --git a/patches/binutils/2.17.50.0.8/110-arm-eabi-conf.patch b/patches/binutils/2.17.50.0.8/110-arm-eabi-conf.patch new file mode 100644 index 00000000..be85ceb1 --- /dev/null +++ b/patches/binutils/2.17.50.0.8/110-arm-eabi-conf.patch @@ -0,0 +1,24 @@ +diff -urN binutils-2.16.91.0.7.orig/configure binutils-2.16.91.0.7/configure +--- binutils-2.16.91.0.7.orig/configure 2006-05-31 14:54:24.000000000 +0300 ++++ binutils-2.16.91.0.7/configure 2006-05-31 14:55:53.000000000 +0300 +@@ -1299,7 +1299,7 @@ + arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* ) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + ;; +- arm*-*-linux-gnueabi) ++ arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + noconfigdirs="$noconfigdirs target-libjava target-libobjc" + ;; +diff -urN binutils-2.16.91.0.7.orig/configure.in binutils-2.16.91.0.7/configure.in +--- binutils-2.16.91.0.7.orig/configure.in 2006-05-31 14:54:24.000000000 +0300 ++++ binutils-2.16.91.0.7/configure.in 2006-05-31 14:55:53.000000000 +0300 +@@ -497,7 +497,7 @@ + arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* ) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + ;; +- arm*-*-linux-gnueabi) ++ arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + noconfigdirs="$noconfigdirs target-libjava target-libobjc" + ;; diff --git a/patches/binutils/2.17.50.0.8/300-001_ld_makefile_patch.patch b/patches/binutils/2.17.50.0.8/300-001_ld_makefile_patch.patch new file mode 100644 index 00000000..04a7e61e --- /dev/null +++ b/patches/binutils/2.17.50.0.8/300-001_ld_makefile_patch.patch @@ -0,0 +1,50 @@ +#!/bin/sh -e +## 001_ld_makefile_patch.dpatch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: correct where ld scripts are installed +## DP: Author: Chris Chimelis <chris@debian.org> +## DP: Upstream status: N/A +## DP: Date: ?? + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +--- binutils-2.16.91.0.1/ld/Makefile.am ++++ binutils-2.16.91.0.1/ld/Makefile.am +@@ -20,7 +20,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +--- binutils-2.16.91.0.1/ld/Makefile.in ++++ binutils-2.16.91.0.1/ld/Makefile.in +@@ -268,7 +268,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + BASEDIR = $(srcdir)/.. + BFDDIR = $(BASEDIR)/bfd + INCDIR = $(BASEDIR)/include diff --git a/patches/binutils/2.17.50.0.8/300-012_check_ldrunpath_length.patch b/patches/binutils/2.17.50.0.8/300-012_check_ldrunpath_length.patch new file mode 100644 index 00000000..498651a9 --- /dev/null +++ b/patches/binutils/2.17.50.0.8/300-012_check_ldrunpath_length.patch @@ -0,0 +1,47 @@ +#!/bin/sh -e +## 012_check_ldrunpath_length.dpatch by Chris Chimelis <chris@debian.org> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Only generate an RPATH entry if LD_RUN_PATH is not empty, for +## DP: cases where -rpath isn't specified. (#151024) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em binutils-2.15/ld/emultempl/elf32.em +--- /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:58.000000000 +0100 ++++ binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:59.000000000 +0100 +@@ -692,6 +692,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, &n, + force)) + break; +@@ -871,6 +873,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, diff --git a/patches/binutils/2.17.50.0.9/100-uclibc-conf.patch b/patches/binutils/2.17.50.0.9/100-uclibc-conf.patch new file mode 100644 index 00000000..25222e5d --- /dev/null +++ b/patches/binutils/2.17.50.0.9/100-uclibc-conf.patch @@ -0,0 +1,139 @@ +--- binutils-2.16.91.0.7/bfd/configure ++++ binutils-2.16.91.0.7/bfd/configure +@@ -3576,7 +3576,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/binutils/configure ++++ binutils-2.16.91.0.7/binutils/configure +@@ -3411,7 +3411,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/configure ++++ binutils-2.16.91.0.7/configure +@@ -1270,7 +1270,7 @@ + am33_2.0-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; +- sh-*-linux*) ++ sh*-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; + sh*-*-pe|mips*-*-pe|*arm-wince-pe) +@@ -1578,7 +1578,7 @@ + romp-*-*) + noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}" + ;; +- sh-*-* | sh64-*-*) ++ sh*-*-* | sh64-*-*) + case "${host}" in + i[3456789]86-*-vsta) ;; # don't add gprof back in + i[3456789]86-*-go32*) ;; # don't add gprof back in +--- binutils-2.16.91.0.7/configure.in ++++ binutils-2.16.91.0.7/configure.in +@@ -468,7 +468,7 @@ + am33_2.0-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; +- sh-*-linux*) ++ sh*-*-linux*) + noconfigdirs="$noconfigdirs ${libgcj} target-newlib target-libgloss" + ;; + sh*-*-pe|mips*-*-pe|*arm-wince-pe) +@@ -776,7 +776,7 @@ + romp-*-*) + noconfigdirs="$noconfigdirs bfd binutils ld gas opcodes target-libgloss ${libgcj}" + ;; +- sh-*-* | sh64-*-*) ++ sh*-*-* | sh64-*-*) + case "${host}" in + i[[3456789]]86-*-vsta) ;; # don't add gprof back in + i[[3456789]]86-*-go32*) ;; # don't add gprof back in +--- binutils-2.16.91.0.7/gas/configure ++++ binutils-2.16.91.0.7/gas/configure +@@ -3411,7 +3411,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/gprof/configure ++++ binutils-2.16.91.0.7/gprof/configure +@@ -3419,6 +3419,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- binutils-2.16.91.0.7/ld/configure ++++ binutils-2.16.91.0.7/ld/configure +@@ -3413,7 +3413,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/libtool.m4 ++++ binutils-2.16.91.0.7/libtool.m4 +@@ -739,7 +739,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + +--- binutils-2.16.91.0.7/ltconfig ++++ binutils-2.16.91.0.7/ltconfig +@@ -602,6 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1247,7 +1248,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + version_type=linux + need_lib_prefix=no + need_version=no +--- binutils-2.16.91.0.7/opcodes/configure ++++ binutils-2.16.91.0.7/opcodes/configure +@@ -3579,7 +3579,7 @@ + ;; + + # This must be Linux ELF. +-linux-gnu*) ++linux-gnu*|linux-uclibc*) + lt_cv_deplibs_check_method=pass_all + ;; + diff --git a/patches/binutils/2.17.50.0.9/110-arm-eabi-conf.patch b/patches/binutils/2.17.50.0.9/110-arm-eabi-conf.patch new file mode 100644 index 00000000..be85ceb1 --- /dev/null +++ b/patches/binutils/2.17.50.0.9/110-arm-eabi-conf.patch @@ -0,0 +1,24 @@ +diff -urN binutils-2.16.91.0.7.orig/configure binutils-2.16.91.0.7/configure +--- binutils-2.16.91.0.7.orig/configure 2006-05-31 14:54:24.000000000 +0300 ++++ binutils-2.16.91.0.7/configure 2006-05-31 14:55:53.000000000 +0300 +@@ -1299,7 +1299,7 @@ + arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* ) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + ;; +- arm*-*-linux-gnueabi) ++ arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + noconfigdirs="$noconfigdirs target-libjava target-libobjc" + ;; +diff -urN binutils-2.16.91.0.7.orig/configure.in binutils-2.16.91.0.7/configure.in +--- binutils-2.16.91.0.7.orig/configure.in 2006-05-31 14:54:24.000000000 +0300 ++++ binutils-2.16.91.0.7/configure.in 2006-05-31 14:55:53.000000000 +0300 +@@ -497,7 +497,7 @@ + arm-*-elf* | strongarm-*-elf* | xscale-*-elf* | arm*-*-eabi* ) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + ;; +- arm*-*-linux-gnueabi) ++ arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi) + noconfigdirs="$noconfigdirs target-libffi target-qthreads" + noconfigdirs="$noconfigdirs target-libjava target-libobjc" + ;; diff --git a/patches/binutils/2.17.50.0.9/300-001_ld_makefile_patch.patch b/patches/binutils/2.17.50.0.9/300-001_ld_makefile_patch.patch new file mode 100644 index 00000000..04a7e61e --- /dev/null +++ b/patches/binutils/2.17.50.0.9/300-001_ld_makefile_patch.patch @@ -0,0 +1,50 @@ +#!/bin/sh -e +## 001_ld_makefile_patch.dpatch +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Description: correct where ld scripts are installed +## DP: Author: Chris Chimelis <chris@debian.org> +## DP: Upstream status: N/A +## DP: Date: ?? + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +--- binutils-2.16.91.0.1/ld/Makefile.am ++++ binutils-2.16.91.0.1/ld/Makefile.am +@@ -20,7 +20,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + + EMUL = @EMUL@ + EMULATION_OFILES = @EMULATION_OFILES@ +--- binutils-2.16.91.0.1/ld/Makefile.in ++++ binutils-2.16.91.0.1/ld/Makefile.in +@@ -268,7 +268,7 @@ + # We put the scripts in the directory $(scriptdir)/ldscripts. + # We can't put the scripts in $(datadir) because the SEARCH_DIR + # directives need to be different for native and cross linkers. +-scriptdir = $(tooldir)/lib ++scriptdir = $(libdir) + BASEDIR = $(srcdir)/.. + BFDDIR = $(BASEDIR)/bfd + INCDIR = $(BASEDIR)/include diff --git a/patches/binutils/2.17.50.0.9/300-012_check_ldrunpath_length.patch b/patches/binutils/2.17.50.0.9/300-012_check_ldrunpath_length.patch new file mode 100644 index 00000000..498651a9 --- /dev/null +++ b/patches/binutils/2.17.50.0.9/300-012_check_ldrunpath_length.patch @@ -0,0 +1,47 @@ +#!/bin/sh -e +## 012_check_ldrunpath_length.dpatch by Chris Chimelis <chris@debian.org> +## +## All lines beginning with `## DP:' are a description of the patch. +## DP: Only generate an RPATH entry if LD_RUN_PATH is not empty, for +## DP: cases where -rpath isn't specified. (#151024) + +if [ $# -ne 1 ]; then + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1 +fi + +[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts +patch_opts="${patch_opts:--f --no-backup-if-mismatch}" + +case "$1" in + -patch) patch $patch_opts -p1 < $0;; + -unpatch) patch $patch_opts -p1 -R < $0;; + *) + echo >&2 "`basename $0`: script expects -patch|-unpatch as argument" + exit 1;; +esac + +exit 0 + +@DPATCH@ +diff -urNad /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em binutils-2.15/ld/emultempl/elf32.em +--- /home/james/debian/packages/binutils/new/binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:58.000000000 +0100 ++++ binutils-2.15/ld/emultempl/elf32.em 2004-05-21 23:12:59.000000000 +0100 +@@ -692,6 +692,8 @@ + && command_line.rpath == NULL) + { + lib_path = (const char *) getenv ("LD_RUN_PATH"); ++ if ((lib_path) && (strlen (lib_path) == 0)) ++ lib_path = NULL; + if (gld${EMULATION_NAME}_search_needed (lib_path, &n, + force)) + break; +@@ -871,6 +873,8 @@ + rpath = command_line.rpath; + if (rpath == NULL) + rpath = (const char *) getenv ("LD_RUN_PATH"); ++ if ((rpath) && (strlen (rpath) == 0)) ++ rpath = NULL; + if (! (bfd_elf_size_dynamic_sections + (output_bfd, command_line.soname, rpath, + command_line.filter_shlib, diff --git a/patches/cygwin/1.5.15-1/cygwin-1.5.15-1-crossbuild.patch b/patches/cygwin/1.5.15-1/cygwin-1.5.15-1-crossbuild.patch new file mode 100644 index 00000000..d3124031 --- /dev/null +++ b/patches/cygwin/1.5.15-1/cygwin-1.5.15-1-crossbuild.patch @@ -0,0 +1,40 @@ +Message-ID: <4269173F.7020705@zee2.com> +Date: Fri, 22 Apr 2005 16:24:47 +0100 +From: Steve Papacharalambous <stevep@zee2.com> +To: "Robert P. J. Day" <rpjday@mindspring.com> +CC: crossgcc list <crossgcc@sources.redhat.com> +Subject: Re: cygwin source directory has moved +In-Reply-To: <Pine.LNX.4.61.0504181746050.11794@localhost.localdomain> + +Hi Robert, + +I've attached two patches: + +1/ For crosstool-0.31 which changes the CYGWIN_URL to one which has the +cygwin source archives. The version of cygwin that is used to build the +cross toolchain has been changed to cygwin-1.5.15-1-src.tar.bz2 since +most of the mirror sites don't seem to have the original archive used. +[created gcc-3.3.2-cygwin-1.5.15-1.dat - dank] + + +2/ The later cygwin source archive fails to cross build with the error: +/opt/crosstool/i686-pc-cygwin/gcc-3.3.2-cygwin-1.5.15-1/lib/gcc-lib/i686-pc-cygwin/bin/ld: +cannot find -luser32 + +unless the second patch is applied, + + +diff -uNr cygwin-1.5.15-1.orig/winsup/mingw/Makefile.in cygwin-1.5.15-1/winsup/mingw/Makefile.in +--- cygwin-1.5.15-1.orig/winsup/mingw/Makefile.in 2005-02-28 22:51:02.000000000 +0000 ++++ cygwin-1.5.15-1/winsup/mingw/Makefile.in 2005-04-22 15:29:18.000000000 +0100 +@@ -71,7 +71,7 @@ + mkinstalldirs = $(SHELL) @MKINSTALLDIRS@ + + CC := @CC@ +-override CC := ${filter-out -L% -B%,${shell echo $(CC) | sed -e 's%\(-isystem\|-iwithprefixbefore\) *[^ ]*\( \|$$\)% %g'}} ++override CC := ${filter-out -B%,${shell echo $(CC) | sed -e 's%\(-isystem\|-iwithprefixbefore\) *[^ ]*\( \|$$\)% %g'}} + # FIXME: Which is it, CC or CC_FOR_TARGET? + CC_FOR_TARGET = $(CC) + AS_FOR_TARGET = $(AS) + + diff --git a/patches/gcc/2.95.3/arm-linux.patch b/patches/gcc/2.95.3/arm-linux.patch new file mode 100644 index 00000000..00974f6e --- /dev/null +++ b/patches/gcc/2.95.3/arm-linux.patch @@ -0,0 +1,647 @@ +--------- snip ------- +Downloaded from ftp://ftp.linux.org.uk/pub/armlinux/toolchain/src-2.95.3/gcc-2.95.3.diff.bz2 +Not sure what it fixes, but this appears to be The Patch used with gcc-2.95.3 on arm. +--------- snip ------- + +diff -urN gcc-2.95.3-orig/gcc/config/arm/arm.c gcc-2.95.3/gcc/config/arm/arm.c +--- gcc-2.95.3-orig/gcc/config/arm/arm.c Thu Jan 25 15:03:24 2001 ++++ gcc-2.95.3/gcc/config/arm/arm.c Fri Jul 20 19:39:11 2001 +@@ -1529,27 +1529,34 @@ + return gen_rtx_PLUS (Pmode, base, offset); + } + else if (GET_CODE (orig) == LABEL_REF) +- current_function_uses_pic_offset_table = 1; +- +- return orig; +-} ++ { ++ current_function_uses_pic_offset_table = 1; + +-static rtx pic_rtx; ++ if (NEED_PLT_GOT) ++ { ++ rtx pic_ref, address = gen_reg_rtx (Pmode); ++ ++ emit_insn (gen_pic_load_addr (address, orig)); ++ pic_ref = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, ++ address); ++ emit_move_insn (address, pic_ref); ++ return address; ++ } ++ } + +-int +-is_pic(x) +- rtx x; +-{ +- if (x == pic_rtx) +- return 1; +- return 0; ++ return orig; + } + ++/* Generate code to load the PIC register. PROLOGUE is true if ++ called from arm_expand_prologue (in which case we want the ++ generated insns at the start of the function); false if called ++ by an exception receiver that needs the PIC register reloaded ++ (in which case the insns are just dumped at the current location). */ + void +-arm_finalize_pic () ++arm_finalize_pic (int prologue) + { + #ifndef AOF_ASSEMBLER +- rtx l1, pic_tmp, pic_tmp2, seq; ++ rtx l1, pic_tmp, pic_tmp2, seq, pic_rtx; + rtx global_offset_table; + + if (current_function_uses_pic_offset_table == 0) +@@ -1578,7 +1585,10 @@ + + seq = gen_sequence (); + end_sequence (); +- emit_insn_after (seq, get_insns ()); ++ if (prologue) ++ emit_insn_after (seq, get_insns ()); ++ else ++ emit_insn (seq); + + /* Need to emit this whether or not we obey regdecls, + since setjmp/longjmp can cause life info to screw up. */ +@@ -5327,7 +5337,13 @@ + if (frame_pointer_needed) + live_regs += 4; + +- if (live_regs) ++ if (live_regs == 1 && regs_ever_live[LR_REGNUM] ++ && ! lr_save_eliminated && ! really_return) ++ { ++ output_asm_insn (reverse ? "ldr%?%D0\t%|lr, [%|sp}, #4" ++ : "ldr%?%d0\t%|lr, [%|sp], #4", &operand); ++ } ++ else if (live_regs) + { + if (lr_save_eliminated || ! regs_ever_live[14]) + live_regs++; +@@ -5446,7 +5462,7 @@ + rtx x; + + length = strlen (name); +- alignlength = (length + 1) + 3 & ~3; ++ alignlength = ((length + 1) + 3) & ~3; + + ASM_OUTPUT_ASCII (stream, name, length + 1); + ASM_OUTPUT_ALIGN (stream, 2); +@@ -5838,6 +5854,9 @@ + int store_arg_regs = 0; + int volatile_func = (optimize > 0 + && TREE_THIS_VOLATILE (current_function_decl)); ++ rtx ip_rtx; ++ int fp_offset = 0; ++ rtx insn; + + /* Naked functions don't have prologues. */ + if (arm_naked_function_p (current_function_decl)) +@@ -5859,11 +5878,59 @@ + live_regs_mask |= 0x4000; + } + ++ ip_rtx = gen_rtx_REG (SImode, IP_REGNUM); ++ + if (frame_pointer_needed) + { ++ if (current_function_needs_context) ++ { ++ /* The Static chain register is the same as the IP register ++ used as a scratch register during stack frame creation. ++ To get around this need to find somewhere to store IP ++ whilst the frame is being created. We try the following ++ places in order: ++ ++ 1. An unused argument register. ++ 2. A slot on the stack above the frame. (This only ++ works if the function is not a varargs function). ++ ++ If neither of these places is available, we abort (for now). */ ++ if (regs_ever_live[3] == 0) ++ { ++ insn = gen_rtx_REG (SImode, 3); ++ insn = gen_rtx_SET (SImode, insn, ip_rtx); ++ insn = emit_insn (insn); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ } ++ else if (current_function_pretend_args_size == 0) ++ { ++ insn = gen_rtx_PRE_DEC (SImode, stack_pointer_rtx); ++ insn = gen_rtx_MEM (SImode, insn); ++ insn = gen_rtx_SET (VOIDmode, insn, ip_rtx); ++ insn = emit_insn (insn); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ fp_offset = 4; ++ } ++ else ++ /* FIXME - the way to handle this situation is to allow ++ the pretend args to be dumped onto the stack, then ++ reuse r3 to save IP. This would involve moving the ++ copying os SP into IP until after the pretend args ++ have been dumped, but this is not too hard. */ ++ error ("Unable to find a temporary location for static chanin register"); ++ } ++ + live_regs_mask |= 0xD800; +- emit_insn (gen_movsi (gen_rtx_REG (SImode, 12), +- stack_pointer_rtx)); ++ if (fp_offset) ++ { ++ insn = gen_rtx_PLUS (SImode, stack_pointer_rtx, GEN_INT (fp_offset)); ++ insn = gen_rtx_SET (SImode, ip_rtx, insn); ++ } ++ else ++ insn = gen_movsi (ip_rtx, stack_pointer_rtx); ++ ++ insn = emit_insn (insn); ++ RTX_FRAME_RELATED_P (insn) = 1; + } + + if (current_function_pretend_args_size) +@@ -5927,9 +5994,31 @@ + } + + if (frame_pointer_needed) +- emit_insn (gen_addsi3 (hard_frame_pointer_rtx, gen_rtx_REG (SImode, 12), +- (GEN_INT +- (-(4 + current_function_pretend_args_size))))); ++ { ++ insn = GEN_INT (-(4 + current_function_pretend_args_size + fp_offset)); ++ insn = emit_insn (gen_addsi3 (hard_frame_pointer_rtx, ip_rtx, insn)); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ ++ if (current_function_needs_context) ++ { ++ /* Recover the static chain register. */ ++ if (regs_ever_live [3] == 0) ++ { ++ insn = gen_rtx_REG (SImode, 3); ++ insn = gen_rtx_SET (SImode, ip_rtx, insn); ++ insn = emit_insn (insn); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ } ++ else /* if (current_function_pretend_args_size == 0) */ ++ { ++ insn = gen_rtx_PLUS (SImode, hard_frame_pointer_rtx, GEN_INT (4)); ++ insn = gen_rtx_MEM (SImode, insn); ++ insn = gen_rtx_SET (SImode, ip_rtx, insn); ++ insn = emit_insn (insn); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ } ++ } ++ } + + if (amount != const0_rtx) + { +diff -urN gcc-2.95.3-orig/gcc/config/arm/arm.h gcc-2.95.3/gcc/config/arm/arm.h +--- gcc-2.95.3-orig/gcc/config/arm/arm.h Thu Jan 25 15:03:26 2001 ++++ gcc-2.95.3/gcc/config/arm/arm.h Fri Jul 20 19:39:11 2001 +@@ -601,14 +601,20 @@ + (TREE_CODE (EXP) == STRING_CST \ + && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN)) + ++#ifndef STRUCTURE_SIZE_BOUNDARY + /* Every structures size must be a multiple of 32 bits. */ + /* This is for compatibility with ARMCC. ARM SDT Reference Manual + (ARM DUI 0020D) page 2-20 says "Structures are aligned on word + boundaries". */ +-#ifndef STRUCTURE_SIZE_BOUNDARY +-#define STRUCTURE_SIZE_BOUNDARY 32 ++/* Setting this to 32 produces more efficient code, but the value set in previous ++ versions of this toolchain was 8, which produces more compact structures. The ++ command line option -mstructure_size_boundary=<n> can be used to change this ++ value. */ ++#define STRUCTURE_SIZE_BOUNDARY arm_structure_size_boundary + #endif + ++extern int arm_structure_size_boundary; ++ + /* Used when parsing command line option -mstructure_size_boundary. */ + extern const char * structure_size_string; + +@@ -768,6 +774,9 @@ + /* Specify the registers used for certain standard purposes. + The values of these macros are register numbers. */ + ++/* Register which holds return address from a subroutine call. */ ++#define LR_REGNUM 14 ++ + /* Define this if the program counter is overloaded on a register. */ + #define PC_REGNUM 15 + +@@ -777,6 +786,9 @@ + /* Base register for access to local variables of the function. */ + #define FRAME_POINTER_REGNUM 25 + ++/* Scratch register - used in all kinds of places, eg trampolines. */ ++#define IP_REGNUM 12 ++ + /* Define this to be where the real frame pointer is if it is not possible to + work out the offset between the frame pointer and the automatic variables + until after register allocation has taken place. FRAME_POINTER_REGNUM +@@ -798,7 +810,7 @@ + /* The native (Norcroft) Pascal compiler for the ARM passes the static chain + as an invisible last argument (possible since varargs don't exist in + Pascal), so the following is not true. */ +-#define STATIC_CHAIN_REGNUM 8 ++#define STATIC_CHAIN_REGNUM 12 + + /* Register in which address to store a structure value + is passed to a function. */ +@@ -1248,7 +1260,12 @@ + { \ + int volatile_func = arm_volatile_func (); \ + if ((FROM) == ARG_POINTER_REGNUM && (TO) == HARD_FRAME_POINTER_REGNUM)\ +- (OFFSET) = 0; \ ++ { \ ++ if (! current_function_needs_context || ! frame_pointer_needed) \ ++ (OFFSET) = 0; \ ++ else \ ++ (OFFSET) = 4; \ ++ } \ + else if ((FROM) == FRAME_POINTER_REGNUM \ + && (TO) == STACK_POINTER_REGNUM) \ + (OFFSET) = (current_function_outgoing_args_size \ +@@ -1379,8 +1396,10 @@ + + On the ARM, allow any integer (invalid ones are removed later by insn + patterns), nice doubles and symbol_refs which refer to the function's +- constant pool XXX. */ +-#define LEGITIMATE_CONSTANT_P(X) (! label_mentioned_p (X)) ++ constant pool XXX. ++ ++ When generating PIC code, allow anything. */ ++#define LEGITIMATE_CONSTANT_P(X) (flag_pic || ! label_mentioned_p (X)) + + /* Symbols in the text segment can be accessed without indirecting via the + constant pool; it may take an extra binary operation, but this is still +@@ -1496,9 +1515,8 @@ + && INTVAL (op) <= 31) \ + goto LABEL; \ + } \ +- /* NASTY: Since this limits the addressing of unsigned byte loads */ \ + range = ((MODE) == HImode || (MODE) == QImode) \ +- ? (arm_arch4 ? 256 : 4095) : 4096; \ ++ ? (((MODE) == HImode && arm_arch4) ? 256 : 4095) : 4096; \ + if (code == CONST_INT && INTVAL (INDEX) < range \ + && INTVAL (INDEX) > -range) \ + goto LABEL; \ +@@ -1812,14 +1830,15 @@ + data addresses in memory. */ + #define PIC_OFFSET_TABLE_REGNUM arm_pic_register + +-#define FINALIZE_PIC arm_finalize_pic () ++#define FINALIZE_PIC arm_finalize_pic (1) + +-/* We can't directly access anything that contains a symbol, ++/* We can't directly access anything that contains a symbol or label, + nor can we indirect via the constant pool. */ + #define LEGITIMATE_PIC_OPERAND_P(X) \ +- (! symbol_mentioned_p (X) \ ++ (! symbol_mentioned_p (X) && ! label_mentioned_p (X) \ + && (! CONSTANT_POOL_ADDRESS_P (X) \ +- || ! symbol_mentioned_p (get_pool_constant (X)))) ++ || (! symbol_mentioned_p (get_pool_constant (X))) \ ++ && (! label_mentioned_p (get_pool_constant (X))))) + + /* We need to know when we are making a constant pool; this determines + whether data needs to be in the GOT or can be referenced via a GOT +@@ -2046,17 +2065,9 @@ + else output_addr_const(STREAM, X); \ + } + +-/* Handles PIC addr specially */ + #define OUTPUT_INT_ADDR_CONST(STREAM,X) \ + { \ +- if (flag_pic && GET_CODE(X) == CONST && is_pic(X)) \ +- { \ +- output_addr_const(STREAM, XEXP (XEXP (XEXP (X, 0), 0), 0)); \ +- fputs(" - (", STREAM); \ +- output_addr_const(STREAM, XEXP (XEXP (XEXP (X, 0), 1), 0)); \ +- fputs(")", STREAM); \ +- } \ +- else output_addr_const(STREAM, X); \ ++ output_addr_const(STREAM, X); \ + \ + /* Mark symbols as position independent. We only do this in the \ + .text segment, not in the .data segment. */ \ +@@ -2170,8 +2181,7 @@ + int arm_return_in_memory PROTO ((Tree)); + int legitimate_pic_operand_p PROTO ((Rtx)); + Rtx legitimize_pic_address PROTO ((Rtx, Mmode, Rtx)); +-int is_pic PROTO ((Rtx)); +-void arm_finalize_pic PROTO ((void)); ++void arm_finalize_pic PROTO ((int)); + int arm_rtx_costs RTX_CODE_PROTO ((Rtx, Rcode)); + int arm_adjust_cost PROTO ((Rtx, Rtx, Rtx, int)); + int const_double_rtx_ok_for_fpu PROTO ((Rtx)); +diff -urN gcc-2.95.3-orig/gcc/config/arm/arm.md gcc-2.95.3/gcc/config/arm/arm.md +--- gcc-2.95.3-orig/gcc/config/arm/arm.md Thu Jan 25 15:03:27 2001 ++++ gcc-2.95.3/gcc/config/arm/arm.md Fri Jul 20 19:39:11 2001 +@@ -2629,7 +2629,8 @@ + : preserve_subexpressions_p ())); + DONE; + } +- if (CONSTANT_P (operands[1]) && flag_pic) ++ if ((CONSTANT_P (operands[1]) || symbol_mentioned_p (operands[1]) ++ || label_mentioned_p (operands[1])) && flag_pic) + operands[1] = legitimize_pic_address (operands[1], SImode, + ((reload_in_progress + || reload_completed) +@@ -2721,6 +2722,15 @@ + return \"add%?\\t%0, %|pc, %0\"; + ") + ++(define_expand "builtin_setjmp_receiver" ++ [(label_ref (match_operand 0 "" ""))] ++ "flag_pic" ++ " ++{ ++ arm_finalize_pic (0); ++ DONE; ++}") ++ + ;; If copying one reg to another we can set the condition codes according to + ;; its value. Such a move is common after a return from subroutine and the + ;; result is being tested against zero. +@@ -6184,15 +6194,20 @@ + abort (); + return \"\"; + } +- strcpy (pattern, \"stmfd\\t%m0!, {%1\"); +- for (i = 1; i < XVECLEN (operands[2], 0); i++) ++ if (XVECLEN (operands[2], 0) > 1) + { +- strcat (pattern, \", %|\"); +- strcat (pattern, reg_names[REGNO (XEXP (XVECEXP (operands[2], 0, i), ++ strcpy (pattern, \"stmfd\\t%m0!, {%1\"); ++ for (i = 1; i < XVECLEN (operands[2], 0); i++) ++ { ++ strcat (pattern, \", %|\"); ++ strcat (pattern, reg_names[REGNO (XEXP (XVECEXP (operands[2], 0, i), + 0))]); ++ } ++ strcat (pattern, \"}\"); ++ output_asm_insn (pattern, operands); + } +- strcat (pattern, \"}\"); +- output_asm_insn (pattern, operands); ++ else ++ output_asm_insn (\"str\\t%1, [%m0, #-4]!\", operands); + return \"\"; + }" + [(set_attr "type" "store4")]) +diff -urN gcc-2.95.3-orig/gcc/config/arm/elf.h gcc-2.95.3/gcc/config/arm/elf.h +--- gcc-2.95.3-orig/gcc/config/arm/elf.h Mon May 31 10:21:53 1999 ++++ gcc-2.95.3/gcc/config/arm/elf.h Fri Jul 20 19:39:11 2001 +@@ -167,15 +167,6 @@ + #define MULTILIB_DEFAULTS { "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" } + #endif + +-/* Setting this to 32 produces more efficient code, but the value set in previous +- versions of this toolchain was 8, which produces more compact structures. The +- command line option -mstructure_size_boundary=<n> can be used to change this +- value. */ +-#undef STRUCTURE_SIZE_BOUNDARY +-#define STRUCTURE_SIZE_BOUNDARY arm_structure_size_boundary +- +-extern int arm_structure_size_boundary; +- + /* A C expression whose value is nonzero if IDENTIFIER with arguments ARGS + is a valid machine specific attribute for DECL. + The attributes in ATTRIBUTES have previously been assigned to DECL. */ +diff -urN gcc-2.95.3-orig/gcc/config/arm/linux-gas.h gcc-2.95.3/gcc/config/arm/linux-gas.h +--- gcc-2.95.3-orig/gcc/config/arm/linux-gas.h Mon Feb 22 17:47:57 1999 ++++ gcc-2.95.3/gcc/config/arm/linux-gas.h Fri Jul 20 19:39:11 2001 +@@ -1,6 +1,6 @@ + /* Definitions of target machine for GNU compiler. + ARM Linux-based GNU systems version. +- Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation, Inc. + Contributed by Russell King <rmk92@ecs.soton.ac.uk>. + + This file is part of GNU CC. +@@ -79,5 +79,7 @@ + register unsigned long _beg __asm ("a1") = (unsigned long) (BEG); \ + register unsigned long _end __asm ("a2") = (unsigned long) (END); \ + register unsigned long _flg __asm ("a3") = 0; \ +- __asm __volatile ("swi 0x9f0002"); \ ++ __asm __volatile ("swi 0x9f0002 @ sys_cacheflush" \ ++ : "=r" (_beg) \ ++ : "0" (_beg), "r" (_end), "r" (_flg)); \ + } +diff -urN gcc-2.95.3-orig/gcc/config/arm/t-linux gcc-2.95.3/gcc/config/arm/t-linux +--- gcc-2.95.3-orig/gcc/config/arm/t-linux Fri Mar 26 16:30:20 1999 ++++ gcc-2.95.3/gcc/config/arm/t-linux Fri Jul 20 20:46:19 2001 +@@ -1,6 +1,6 @@ + # Just for these, we omit the frame pointer since it makes such a big + # difference. It is then pointless adding debugging. +-TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC ++TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer -fPIC + LIBGCC2_DEBUG_CFLAGS = -g0 + + # Don't build enquire +diff -urN gcc-2.95.3-orig/gcc/final.c gcc-2.95.3/gcc/final.c +--- gcc-2.95.3-orig/gcc/final.c Mon Mar 12 13:07:59 2001 ++++ gcc-2.95.3/gcc/final.c Fri Jul 20 19:39:11 2001 +@@ -3652,8 +3652,9 @@ + + output_addr_const (file, XEXP (x, 0)); + fprintf (file, "-"); +- if (GET_CODE (XEXP (x, 1)) == CONST_INT +- && INTVAL (XEXP (x, 1)) < 0) ++ if ((GET_CODE (XEXP (x, 1)) == CONST_INT ++ && INTVAL (XEXP (x, 1)) < 0) ++ || GET_CODE (XEXP (x, 1)) != CONST_INT) + { + fprintf (file, ASM_OPEN_PAREN); + output_addr_const (file, XEXP (x, 1)); +diff -urN gcc-2.95.3-orig/gcc/function.c gcc-2.95.3/gcc/function.c +--- gcc-2.95.3-orig/gcc/function.c Thu Jan 25 15:03:15 2001 ++++ gcc-2.95.3/gcc/function.c Fri Jul 20 19:39:10 2001 +@@ -3053,6 +3053,105 @@ + extracted by usage MEM with narrower mode. */ + static rtx purge_addressof_replacements; + ++/* Return 1 if X and Y are identical-looking rtx's. ++ This is the Lisp function EQUAL for rtx arguments. */ ++ ++int ++rtx_equal_for_addressof_p (x, y) ++ rtx x, y; ++{ ++ register int i; ++ register int j; ++ register enum rtx_code code; ++ register char *fmt; ++ ++ if (x == y) ++ return 1; ++ if (x == 0 || y == 0) ++ return 0; ++ ++ code = GET_CODE (x); ++ /* Rtx's of different codes cannot be equal. */ ++ if (code != GET_CODE (y)) ++ return 0; ++ ++ /* (MULT:SI x y) and (MULT:HI x y) are NOT equivalent. ++ (REG:SI x) and (REG:HI x) are NOT equivalent. ++ But (MEM:SI x) and (MEM:HI x) are equivalent for our purposes. */ ++ ++ if (code != MEM && (GET_MODE (x) != GET_MODE (y))) ++ return 0; ++ ++ /* REG, LABEL_REF, and SYMBOL_REF can be compared nonrecursively. */ ++ ++ if (code == REG) ++ return REGNO (x) == REGNO (y); ++ else if (code == LABEL_REF) ++ return XEXP (x, 0) == XEXP (y, 0); ++ else if (code == SYMBOL_REF) ++ return XSTR (x, 0) == XSTR (y, 0); ++ else if (code == SCRATCH || code == CONST_DOUBLE) ++ return 0; ++ ++ /* Compare the elements. If any pair of corresponding elements ++ fail to match, return 0 for the whole things. */ ++ ++ fmt = GET_RTX_FORMAT (code); ++ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) ++ { ++ switch (fmt[i]) ++ { ++ case 'w': ++ if (XWINT (x, i) != XWINT (y, i)) ++ return 0; ++ break; ++ ++ case 'n': ++ case 'i': ++ if (XINT (x, i) != XINT (y, i)) ++ return 0; ++ break; ++ ++ case 'V': ++ case 'E': ++ /* Two vectors must have the same length. */ ++ if (XVECLEN (x, i) != XVECLEN (y, i)) ++ return 0; ++ ++ /* And the corresponding elements must match. */ ++ for (j = 0; j < XVECLEN (x, i); j++) ++ if (rtx_equal_p (XVECEXP (x, i, j), XVECEXP (y, i, j)) == 0) ++ return 0; ++ break; ++ ++ case 'e': ++ if (rtx_equal_p (XEXP (x, i), XEXP (y, i)) == 0) ++ return 0; ++ break; ++ ++ case 'S': ++ case 's': ++ if (strcmp (XSTR (x, i), XSTR (y, i))) ++ return 0; ++ break; ++ ++ case 'u': ++ /* These are just backpointers, so they don't matter. */ ++ break; ++ ++ case '0': ++ break; ++ ++ /* It is believed that rtx's at this level will never ++ contain anything but integers and other rtx's, ++ except for within LABEL_REFs and SYMBOL_REFs. */ ++ default: ++ abort (); ++ } ++ } ++ return 1; ++} ++ + /* Helper function for purge_addressof. See if the rtx expression at *LOC + in INSN needs to be changed. If FORCE, always put any ADDRESSOFs into + the stack. */ +@@ -3133,7 +3232,7 @@ + for (tem = purge_bitfield_addressof_replacements; + tem != NULL_RTX; + tem = XEXP (XEXP (tem, 1), 1)) +- if (rtx_equal_p (x, XEXP (tem, 0))) ++ if (rtx_equal_for_addressof_p (x, XEXP (tem, 0))) + { + *loc = XEXP (XEXP (tem, 1), 0); + return; +@@ -3143,7 +3242,7 @@ + for (tem = purge_addressof_replacements; + tem != NULL_RTX; + tem = XEXP (XEXP (tem, 1), 1)) +- if (rtx_equal_p (XEXP (x, 0), XEXP (tem, 0))) ++ if (rtx_equal_for_addressof_p (XEXP (x, 0), XEXP (tem, 0))) + { + rtx z = XEXP (XEXP (tem, 1), 0); + +diff -urN gcc-2.95.3-orig/gcc/jump.c gcc-2.95.3/gcc/jump.c +--- gcc-2.95.3-orig/gcc/jump.c Thu Oct 21 08:24:03 1999 ++++ gcc-2.95.3/gcc/jump.c Fri Jul 20 19:39:10 2001 +@@ -115,7 +115,7 @@ + static rtx delete_unreferenced_labels PROTO((rtx)); + static void delete_noop_moves PROTO((rtx)); + static int calculate_can_reach_end PROTO((rtx, int, int)); +-static int duplicate_loop_exit_test PROTO((rtx)); ++static int duplicate_loop_exit_test PROTO((rtx, int)); + static void find_cross_jump PROTO((rtx, rtx, int, rtx *, rtx *)); + static void do_cross_jump PROTO((rtx, rtx, rtx)); + static int jump_back_p PROTO((rtx, rtx)); +@@ -338,7 +338,7 @@ + && simplejump_p (temp1)) + { + temp = PREV_INSN (insn); +- if (duplicate_loop_exit_test (insn)) ++ if (duplicate_loop_exit_test (insn, after_regscan)) + { + changed = 1; + next = NEXT_INSN (temp); +@@ -2548,8 +2548,9 @@ + values of regno_first_uid and regno_last_uid. */ + + static int +-duplicate_loop_exit_test (loop_start) ++duplicate_loop_exit_test (loop_start, after_regscan) + rtx loop_start; ++ int after_regscan; + { + rtx insn, set, reg, p, link; + rtx copy = 0, first_copy = 0; +@@ -2662,6 +2663,9 @@ + reg_map[REGNO (reg)] = gen_reg_rtx (GET_MODE (reg)); + } + } ++ ++ if (after_regscan) ++ reg_scan_update (exitcode, lastexit, max_reg); + + /* Now copy each insn. */ + for (insn = exitcode; insn != lastexit; insn = NEXT_INSN (insn)) +diff -urN gcc-2.95.3-orig/gcc/varasm.c gcc-2.95.3/gcc/varasm.c +--- gcc-2.95.3-orig/gcc/varasm.c Mon Feb 19 15:02:02 2001 ++++ gcc-2.95.3/gcc/varasm.c Fri Jul 20 19:39:11 2001 +@@ -3286,7 +3286,10 @@ + value->un.addr.offset = - INTVAL (XEXP (x, 1)); + } + else +- abort (); ++ { ++ value->un.addr.base = x; ++ value->un.addr.offset = 0; ++ } + break; + + default: diff --git a/patches/gcc/2.95.3/backport-config.gcc-1.4.patch b/patches/gcc/2.95.3/backport-config.gcc-1.4.patch new file mode 100644 index 00000000..141de0c7 --- /dev/null +++ b/patches/gcc/2.95.3/backport-config.gcc-1.4.patch @@ -0,0 +1,35 @@ +# Taken from http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config.gcc.diff?r1=1.3&r2=1.4 +# Should fix error +# Configuration powerpc-host_apple-darwin7.3.0 not supported +# when configuring gcc-2.95 on Mac OS X for i686 target +# Also create xm-darwin.h, seems to be required, else we get the error +# In file included from .../gcc-2.95.3/gcc/gencheck.c:21: +# hconfig.h:11:30: rs6000/xm-darwin.h: No such file or directory +# make[1]: *** [gencheck.o] Error 1 + + +--- gcc-2.95.3/gcc/configure.old 2004-03-24 12:17:44.000000000 -0800 ++++ gcc-2.95.3/gcc/configure 2004-03-24 17:14:38.000000000 -0800 +@@ -5079,6 +5079,10 @@ + tmake_file=rs6000/t-beos + xmake_file=rs6000/x-beos + ;; ++ powerpc-*-darwin*) ++ xm_file="rs6000/xm-rs6000.h rs6000/xm-darwin.h" ++ xmake_file=rs6000/x-darwin ++ ;; + powerpc-*-sysv* | powerpc-*-elf*) + tm_file=rs6000/sysv4.h + xm_file="xm-siglist.h rs6000/xm-sysv4.h" +--- /dev/null 2003-01-30 02:24:37.000000000 -0800 ++++ gcc-3.0.4/gcc/config/rs6000/xm-darwin.h 2000-11-20 19:02:09.000000000 -0800 +@@ -0,0 +1,9 @@ ++/* Undo the USG definition in xm-rs6000.h, Darwin is a BSD flavor. */ ++ ++#undef USG ++ ++/* Override the usual setting, since Apple's GCC has lame bugs and ++ can't handle the initializers. Someday the bugs will be fixed and ++ we can get rid of this silliness. */ ++ ++#define HAVE_DESIGNATED_INITIALIZERS 0 diff --git a/patches/gcc/2.95.3/backport-config.gcc-1.92.patch b/patches/gcc/2.95.3/backport-config.gcc-1.92.patch new file mode 100644 index 00000000..fc55681d --- /dev/null +++ b/patches/gcc/2.95.3/backport-config.gcc-1.92.patch @@ -0,0 +1,39 @@ +# Taken from http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config.gcc.diff?r1=1.91&r2=1.92 +# Should fix error +# Configuration x86_64-host_unknown-linux-gnu not supported +# when configuring gcc-2.95 on x86_64 build for i686 target +# It's a bit silly, since tm_file refers to files that don't exist, +# but as long as x86_64 is just the build machine, that doesn't matter. + +--- gcc-2.95.3/gcc/configure.old 2004-03-24 12:17:44.000000000 -0800 ++++ gcc-2.95.3/gcc/configure 2004-03-24 12:19:30.000000000 -0800 +@@ -2929,6 +2929,9 @@ + i[34567]86-*-*) + cpu_type=i386 + ;; ++ x86_64-*-*) ++ cpu_type=i386 ++ ;; + hppa*-*-*) + cpu_type=pa + ;; +@@ -3643,6 +3646,19 @@ + thread_file='posix' + fi + ;; ++ x86_64-*-linux*) ++ xmake_file=x-linux ++ tm_file="i386/biarch64.h i386/i386.h i386/att.h linux.h i386/x86-64.h \ ++ i386/linux64.h" ++ tmake_file="t-slibgcc-elf-ver t-linux i386/t-crtstuff" ++ extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++ gnu_ld=yes ++ float_format=i386 ++ if test x$enable_threads = xyes; then ++ thread_file='posix' ++ fi ++ ;; ++ + i[34567]86-*-gnu*) + float_format=i386 + ;; diff --git a/patches/gcc/2.95.3/config.sub.patch b/patches/gcc/2.95.3/config.sub.patch new file mode 100644 index 00000000..c8189b59 --- /dev/null +++ b/patches/gcc/2.95.3/config.sub.patch @@ -0,0 +1,1257 @@ +# Backport from gcc-3.3.3 +# Fixes errors like +# Invalid configuration `x86_64-host_unknown-linux-gnu': machine `x86_64-host_unknown' not recognized +# Unrecognized host system name x86_64-host_unknown-linux-gnu. +# when configuring on chip types or operating systems like x86_64 or Darwin +# which are newer than gcc-2.95 + +--- gcc-2.95.3/config.sub.old 1999-08-04 01:09:26.000000000 -0700 ++++ gcc-2.95.3/config.sub 2004-03-24 11:28:24.000000000 -0800 +@@ -1,6 +1,10 @@ + #! /bin/sh +-# Configuration validation subroutine script, version 1.1. +-# Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc. ++# Configuration validation subroutine script. ++# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, ++# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ ++timestamp='2003-01-28' ++ + # This file is (in principle) common to ALL GNU software. + # The presence of a machine in this file suggests that SOME GNU software + # can handle that machine. It does not imply ALL GNU software can. +@@ -25,6 +29,9 @@ + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + ++# Please send patches to <config-patches@gnu.org>. Submit a context ++# diff and a properly formatted ChangeLog entry. ++# + # Configuration subroutine to validate and canonicalize a configuration type. + # Supply the specified configuration type as an argument. + # If it is invalid, we print an error message on stderr and exit with code 1. +@@ -45,30 +52,73 @@ + # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM + # It is wrong to echo any other type of specification. + +-if [ x$1 = x ] +-then +- echo Configuration name missing. 1>&2 +- echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 +- echo "or $0 ALIAS" 1>&2 +- echo where ALIAS is a recognized configuration type. 1>&2 +- exit 1 +-fi ++me=`echo "$0" | sed -e 's,.*/,,'` + +-# First pass through any local machine types. +-case $1 in +- *local*) +- echo $1 +- exit 0 +- ;; +- *) +- ;; ++usage="\ ++Usage: $0 [OPTION] CPU-MFR-OPSYS ++ $0 [OPTION] ALIAS ++ ++Canonicalize a configuration name. ++ ++Operation modes: ++ -h, --help print this help, then exit ++ -t, --time-stamp print date of last modification, then exit ++ -v, --version print version number, then exit ++ ++Report bugs and patches to <config-patches@gnu.org>." ++ ++version="\ ++GNU config.sub ($timestamp) ++ ++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 ++Free Software Foundation, Inc. ++ ++This is free software; see the source for copying conditions. There is NO ++warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." ++ ++help=" ++Try \`$me --help' for more information." ++ ++# Parse command line ++while test $# -gt 0 ; do ++ case $1 in ++ --time-stamp | --time* | -t ) ++ echo "$timestamp" ; exit 0 ;; ++ --version | -v ) ++ echo "$version" ; exit 0 ;; ++ --help | --h* | -h ) ++ echo "$usage"; exit 0 ;; ++ -- ) # Stop option processing ++ shift; break ;; ++ - ) # Use stdin as input. ++ break ;; ++ -* ) ++ echo "$me: invalid option $1$help" ++ exit 1 ;; ++ ++ *local*) ++ # First pass through any local machine types. ++ echo $1 ++ exit 0;; ++ ++ * ) ++ break ;; ++ esac ++done ++ ++case $# in ++ 0) echo "$me: missing argument$help" >&2 ++ exit 1;; ++ 1) ;; ++ *) echo "$me: too many arguments$help" >&2 ++ exit 1;; + esac + + # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- linux-gnu*) ++ nto-qnx* | linux-gnu* | freebsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -94,20 +144,28 @@ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ +- -apple) ++ -apple | -axis) + os= + basic_machine=$1 + ;; +- -sim | -cisco | -oki | -wec | -winbond ) # EGCS LOCAL ++ -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; +- -scout) # EGCS LOCAL ++ -scout) + ;; +- -wrs) # EGCS LOCAL ++ -wrs) + os=-vxworks + basic_machine=$1 + ;; ++ -chorusos*) ++ os=-chorusos ++ basic_machine=$1 ++ ;; ++ -chorusrdb) ++ os=-chorusrdb ++ basic_machine=$1 ++ ;; + -hiux*) + os=-hiuxwe2 + ;; +@@ -156,49 +214,72 @@ + -psos*) + os=-psos + ;; ++ -mint | -mint[0-9]*) ++ basic_machine=m68k-atari ++ os=-mint ++ ;; + esac + + # Decode aliases for certain CPU-COMPANY combinations. + case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. +- tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \ +- | arme[lb] | pyramid | mn10200 | mn10300 \ +- | tron | a29k | 580 | i960 | h8300 \ +- | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ +- | alpha | alphaev5 | alphaev56 | alphapca56 | alphaev6 \ +- | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \ +- | 1750a | dsp16xx | pdp11 \ +- | mips64 | mipsel | mips64el | mips64orion | mips64orionel \ +- | mipstx39 | mipstx39el \ +- | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x) +- basic_machine=$basic_machine-unknown +- ;; +- m88110 | m680[012346]0 | m683?2 | m68360 | m5200 | z8k | v70 \ +- | h8500 | w65) # EGCS LOCAL +- ;; +- thumb) +- basic_machine=$basic_machine-unknown +- ;; +- mips64vr4300 | mips64vr4300el) # EGCS LOCAL jsmith/vr4300 ++ 1750a | 580 \ ++ | a29k \ ++ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ ++ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ ++ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ ++ | clipper \ ++ | d10v | d30v | dlx | dsp16xx \ ++ | fr30 | frv \ ++ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ ++ | i370 | i860 | i960 | ia64 \ ++ | ip2k \ ++ | m32r | m68000 | m68k | m88k | mcore \ ++ | mips | mipsbe | mipseb | mipsel | mipsle \ ++ | mips16 \ ++ | mips64 | mips64el \ ++ | mips64vr | mips64vrel \ ++ | mips64orion | mips64orionel \ ++ | mips64vr4100 | mips64vr4100el \ ++ | mips64vr4300 | mips64vr4300el \ ++ | mips64vr5000 | mips64vr5000el \ ++ | mipsisa32 | mipsisa32el \ ++ | mipsisa32r2 | mipsisa32r2el \ ++ | mipsisa64 | mipsisa64el \ ++ | mipsisa64sb1 | mipsisa64sb1el \ ++ | mipsisa64sr71k | mipsisa64sr71kel \ ++ | mipstx39 | mipstx39el \ ++ | mn10200 | mn10300 \ ++ | msp430 \ ++ | ns16k | ns32k \ ++ | openrisc | or32 \ ++ | pdp10 | pdp11 | pj | pjl \ ++ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ ++ | pyramid \ ++ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ ++ | sh64 | sh64le \ ++ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ ++ | strongarm \ ++ | tahoe | thumb | tic80 | tron \ ++ | v850 | v850e \ ++ | we32k \ ++ | x86 | xscale | xstormy16 | xtensa \ ++ | z8k) + basic_machine=$basic_machine-unknown + ;; +- mips64vr4100 | mips64vr4100el) # EGCS LOCAL jsmith/vr4100 +- basic_machine=$basic_machine-unknown +- ;; +- mips64vr5000 | mips64vr5000el) # EGCS LOCAL ian/vr5000 +- basic_machine=$basic_machine-unknown +- ;; +- mips16) ++ m6811 | m68hc11 | m6812 | m68hc12) ++ # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown ++ os=-none + ;; +- d10v) +- basic_machine=$basic_machine-unknown ++ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; ++ + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. +- i[34567]86) ++ i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. +@@ -207,44 +288,62 @@ + exit 1 + ;; + # Recognize the basic CPU types with company name. +- vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \ +- | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \ +- | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ +- | power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \ +- | xmp-* | ymp-* \ +- | hppa-* | hppa1.0-* | hppa1.1-* \ +- | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \ +- | alpha-* | alphaev5-* | alphaev56-* | alphapca56-* \ +- | alphaev6-* | we32k-* | cydra-* | ns16k-* | pn-* | np1-* \ +- | xps100-* | clipper-* | orion-* \ +- | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ +- | sparc64-* | sparcv9-* | sparc86x-* | mips64-* | mipsel-* \ +- | mips64el-* | mips64orion-* | mips64orionel-* \ +- | mipstx39-* | mipstx39el-* \ +- | f301-* | arm*-*) +- ;; +- m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | h8500-* | d10v-*) # EGCS LOCAL +- ;; +- thumb-*) # EGCS LOCAL angela/thumb +- ;; +- v850-*) # EGCS LOCAL +- ;; +- d30v-*) # EGCS LOCAL +- ;; +- mips64vr4300-* | mips64vr4300el-*) # EGCS LOCAL jsmith/vr4300 +- ;; +- mips64vr4100-* | mips64vr4100el-*) # EGCS LOCAL jsmith/vr4100 +- ;; +- mips16-*) # EGCS LOCAL krk/mips16 +- ;; +- tic30-*) # EGCS LOCAL ian/tic30 +- ;; +- c30-*) # EGCS LOCAL ian/tic30 +- basic_machine=tic30-unknown ++ 580-* \ ++ | a29k-* \ ++ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ ++ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ ++ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ ++ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ ++ | avr-* \ ++ | bs2000-* \ ++ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* \ ++ | clipper-* | cydra-* \ ++ | d10v-* | d30v-* | dlx-* \ ++ | elxsi-* \ ++ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ ++ | h8300-* | h8500-* \ ++ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ ++ | i*86-* | i860-* | i960-* | ia64-* \ ++ | ip2k-* \ ++ | m32r-* \ ++ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ ++ | m88110-* | m88k-* | mcore-* \ ++ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ ++ | mips16-* \ ++ | mips64-* | mips64el-* \ ++ | mips64vr-* | mips64vrel-* \ ++ | mips64orion-* | mips64orionel-* \ ++ | mips64vr4100-* | mips64vr4100el-* \ ++ | mips64vr4300-* | mips64vr4300el-* \ ++ | mips64vr5000-* | mips64vr5000el-* \ ++ | mipsisa32-* | mipsisa32el-* \ ++ | mipsisa32r2-* | mipsisa32r2el-* \ ++ | mipsisa64-* | mipsisa64el-* \ ++ | mipsisa64sb1-* | mipsisa64sb1el-* \ ++ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ ++ | mipstx39-* | mipstx39el-* \ ++ | msp430-* \ ++ | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ ++ | orion-* \ ++ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ ++ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ ++ | pyramid-* \ ++ | romp-* | rs6000-* \ ++ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ ++ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ ++ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ ++ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ ++ | tahoe-* | thumb-* | tic30-* | tic4x-* | tic54x-* | tic80-* | tron-* \ ++ | v850-* | v850e-* | vax-* \ ++ | we32k-* \ ++ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ ++ | xtensa-* \ ++ | ymp-* \ ++ | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. +- 386bsd) # EGCS LOCAL ++ 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; +@@ -254,11 +353,11 @@ + 3b*) + basic_machine=we32k-att + ;; +- a29khif) # EGCS LOCAL ++ a29khif) + basic_machine=a29k-amd + os=-udi + ;; +- adobe68k) # EGCS LOCAL ++ adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; +@@ -277,21 +376,21 @@ + os=-sysv + ;; + amiga | amiga-*) +- basic_machine=m68k-cbm ++ basic_machine=m68k-unknown + ;; + amigaos | amigados) +- basic_machine=m68k-cbm ++ basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) +- basic_machine=m68k-cbm ++ basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; +- apollo68bsd) # EGCS LOCAL ++ apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; +@@ -303,6 +402,10 @@ + basic_machine=ns32k-sequent + os=-dynix + ;; ++ c90) ++ basic_machine=c90-cray ++ os=-unicos ++ ;; + convex-c1) + basic_machine=c1-convex + os=-bsd +@@ -323,27 +426,30 @@ + basic_machine=c38-convex + os=-bsd + ;; +- cray | ymp) +- basic_machine=ymp-cray +- os=-unicos +- ;; +- cray2) +- basic_machine=cray2-cray +- os=-unicos +- ;; +- [ctj]90-cray) +- basic_machine=c90-cray ++ cray | j90) ++ basic_machine=j90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; ++ cris | cris-* | etrax*) ++ basic_machine=cris-axis ++ ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; ++ decsystem10* | dec10*) ++ basic_machine=pdp10-dec ++ os=-tops10 ++ ;; ++ decsystem20* | dec20*) ++ basic_machine=pdp10-dec ++ os=-tops20 ++ ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola +@@ -371,7 +477,7 @@ + encore | umax | mmax) + basic_machine=ns32k-encore + ;; +- es1800 | OSE68k | ose68k | ose | OSE) # EGCS LOCAL ++ es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; +@@ -385,6 +491,10 @@ + basic_machine=tron-gmicro + os=-sysv + ;; ++ go32) ++ basic_machine=i386-pc ++ os=-go32 ++ ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 +@@ -393,11 +503,11 @@ + basic_machine=h8300-hitachi + os=-hms + ;; +- h8300xray) # EGCS LOCAL ++ h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; +- h8500hms) # EGCS LOCAL ++ h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; +@@ -416,22 +526,6 @@ + basic_machine=m68k-hp + os=-hpux + ;; +- w89k-*) # EGCS LOCAL +- basic_machine=hppa1.1-winbond +- os=-proelf +- ;; +- op50n-*) # EGCS LOCAL +- basic_machine=hppa1.1-oki +- os=-proelf +- ;; +- op60c-*) # EGCS LOCAL +- basic_machine=hppa1.1-oki +- os=-proelf +- ;; +- hppro) # EGCS LOCAL +- basic_machine=hppa1.1-hp +- os=-proelf +- ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; +@@ -441,22 +535,21 @@ + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; +- hp9k6[0-9][0-9] | hp6[0-9][0-9] ) ++ hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; +- hp9k7[0-79][0-9] | hp7[0-79][0-9] ) ++ hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; +- hp9k78[0-9] | hp78[0-9] ) ++ hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; +- hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | \ +- hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893 ) ++ hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; +- hp9k8[0-9][13679] | hp8[0-9][13679] ) ++ hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) +@@ -465,47 +558,42 @@ + hppa-next) + os=-nextstep3 + ;; +- hppaosf) # EGCS LOCAL ++ hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; ++ hppro) ++ basic_machine=hppa1.1-hp ++ os=-proelf ++ ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm +- os=-mvs + ;; + # I'm not sure what "Sysv32" means. Should this be sysv3.2? +- i[34567]86v32) ++ i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; +- i[34567]86v4*) ++ i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; +- i[34567]86v) ++ i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; +- i[34567]86sol2) ++ i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; +- i386mach) # EGCS LOCAL ++ i386mach) + basic_machine=i386-mach + os=-mach + ;; +- i386-vsta | vsta) # EGCS LOCAL ++ i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; +- i386-go32 | go32) # EGCS LOCAL +- basic_machine=i386-unknown +- os=-go32 +- ;; +- i386-mingw32 | mingw32) +- basic_machine=i386-unknown +- os=-mingw32 +- ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in +@@ -531,16 +619,16 @@ + basic_machine=ns32k-utek + os=-sysv + ;; ++ mingw32) ++ basic_machine=i386-pc ++ os=-mingw32 ++ ;; + miniframe) + basic_machine=m68000-convergent + ;; +- mipsel*-linux*) +- basic_machine=mipsel-unknown +- os=-linux-gnu +- ;; +- mips*-linux*) +- basic_machine=mips-unknown +- os=-linux-gnu ++ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) ++ basic_machine=m68k-atari ++ os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` +@@ -548,24 +636,36 @@ + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; +- monitor) # EGCS LOCAL ++ mmix*) ++ basic_machine=mmix-knuth ++ os=-mmixware ++ ;; ++ monitor) + basic_machine=m68k-rom68k + os=-coff + ;; +- msdos) # EGCS LOCAL +- basic_machine=i386-unknown ++ morphos) ++ basic_machine=powerpc-unknown ++ os=-morphos ++ ;; ++ msdos) ++ basic_machine=i386-pc + os=-msdos + ;; ++ mvs) ++ basic_machine=i370-ibm ++ os=-mvs ++ ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) +- basic_machine=i386-unknown # EGCS LOCAL ++ basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) +- basic_machine=armv4l-corel ++ basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) +@@ -580,7 +680,7 @@ + basic_machine=mips-sony + os=-newsos + ;; +- necv70) # EGCS LOCAL ++ necv70) + basic_machine=v70-nec + os=-sysv + ;; +@@ -609,18 +709,37 @@ + basic_machine=i960-intel + os=-nindy + ;; +- mon960) # EGCS LOCAL ++ mon960) + basic_machine=i960-intel + os=-mon960 + ;; ++ nonstopux) ++ basic_machine=mips-compaq ++ os=-nonstopux ++ ;; + np1) + basic_machine=np1-gould + ;; +- OSE68000 | ose68000) # EGCS LOCAL ++ nv1) ++ basic_machine=nv1-cray ++ os=-unicosmp ++ ;; ++ nsr-tandem) ++ basic_machine=nsr-tandem ++ ;; ++ op50n-* | op60c-*) ++ basic_machine=hppa1.1-oki ++ os=-proelf ++ ;; ++ or32 | or32-*) ++ basic_machine=or32-unknown ++ os=-coff ++ ;; ++ OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; +- os68k) # EGCS LOCAL ++ os68k) + basic_machine=m68k-none + os=-os68k + ;; +@@ -638,46 +757,60 @@ + pbb) + basic_machine=m68k-tti + ;; +- pc532 | pc532-*) ++ pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; +- pentium | p5 | k5 | k6 | nexen) ++ pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; +- pentiumpro | p6 | 6x86) ++ pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2) +- basic_machine=i786-pc ++ basic_machine=i686-pc + ;; +- pentium-* | p5-* | k5-* | k6-* | nexen-*) ++ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; +- pentiumpro-* | p6-* | 6x86-*) ++ pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) +- basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; +- power) basic_machine=rs6000-ibm ++ power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown +- ;; ++ ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown +- ;; ++ ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; ++ ppc64) basic_machine=powerpc64-unknown ++ ;; ++ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ ppc64le | powerpc64little | ppc64-le | powerpc64-little) ++ basic_machine=powerpc64le-unknown ++ ;; ++ ppc64le-* | powerpc64little-*) ++ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + ps2) + basic_machine=i386-ibm + ;; +- rom68k) # EGCS LOCAL ++ pw32) ++ basic_machine=i586-unknown ++ os=-pw32 ++ ;; ++ rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; +@@ -687,10 +820,22 @@ + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; +- sa29200) # EGCS LOCAL ++ s390 | s390-*) ++ basic_machine=s390-ibm ++ ;; ++ s390x | s390x-*) ++ basic_machine=s390x-ibm ++ ;; ++ sa29200) + basic_machine=a29k-amd + os=-udi + ;; ++ sb1) ++ basic_machine=mipsisa64sb1-unknown ++ ;; ++ sb1el) ++ basic_machine=mipsisa64sb1el-unknown ++ ;; + sequent) + basic_machine=i386-sequent + ;; +@@ -698,7 +843,7 @@ + basic_machine=sh-hitachi + os=-hms + ;; +- sparclite-wrs) # EGCS LOCAL ++ sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; +@@ -709,10 +854,10 @@ + spur) + basic_machine=spur-unknown + ;; +- st2000) # EGCS LOCAL ++ st2000) + basic_machine=m68k-tandem + ;; +- stratus) # EGCS LOCAL ++ stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; +@@ -756,16 +901,40 @@ + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; ++ sv1) ++ basic_machine=sv1-cray ++ os=-unicos ++ ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; ++ t3e) ++ basic_machine=alphaev5-cray ++ os=-unicos ++ ;; ++ t90) ++ basic_machine=t90-cray ++ os=-unicos ++ ;; ++ tic4x | c4x*) ++ basic_machine=tic4x-unknown ++ os=-coff ++ ;; ++ tic54x | c54x*) ++ basic_machine=tic54x-unknown ++ os=-coff ++ ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; ++ toad1) ++ basic_machine=pdp10-xkl ++ os=-tops20 ++ ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; +@@ -777,7 +946,7 @@ + basic_machine=a29k-nyu + os=-sym1 + ;; +- v810 | necv810) # EGCS LOCAL ++ v810 | necv810) + basic_machine=v810-nec + os=-none + ;; +@@ -790,8 +959,8 @@ + os=-vms + ;; + vpp*|vx|vx-*) +- basic_machine=f301-fujitsu +- ;; ++ basic_machine=f301-fujitsu ++ ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks +@@ -804,18 +973,22 @@ + basic_machine=a29k-wrs + os=-vxworks + ;; +- w65*) # EGCS LOCAL +- basic_machine=w65-wdc +- os=-none ++ w65*) ++ basic_machine=w65-wdc ++ os=-none + ;; +- xmp) +- basic_machine=xmp-cray +- os=-unicos ++ w89k-*) ++ basic_machine=hppa1.1-winbond ++ os=-proelf + ;; +- xps | xps100) ++ xps | xps100) + basic_machine=xps100-honeywell + ;; +- z8k-*-coff) # EGCS LOCAL ++ ymp) ++ basic_machine=ymp-cray ++ os=-unicos ++ ;; ++ z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; +@@ -826,22 +999,15 @@ + + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. +- w89k) # EGCS LOCAL ++ w89k) + basic_machine=hppa1.1-winbond + ;; +- op50n) # EGCS LOCAL ++ op50n) + basic_machine=hppa1.1-oki + ;; +- op60c) # EGCS LOCAL ++ op60c) + basic_machine=hppa1.1-oki + ;; +- mips) +- if [ x$os = x-linux-gnu ]; then +- basic_machine=mips-unknown +- else +- basic_machine=mips-mips +- fi +- ;; + romp) + basic_machine=romp-ibm + ;; +@@ -851,16 +1017,26 @@ + vax) + basic_machine=vax-dec + ;; ++ pdp10) ++ # there are many clones, so DEC is not a safe bet ++ basic_machine=pdp10-unknown ++ ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; +- sparc | sparcv9) ++ sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) ++ basic_machine=sh-unknown ++ ;; ++ sh64) ++ basic_machine=sh64-unknown ++ ;; ++ sparc | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; +- cydra) ++ cydra) + basic_machine=cydra-cydrome + ;; + orion) +@@ -869,16 +1045,15 @@ + orion105) + basic_machine=clipper-highlevel + ;; +- mac | mpw | mac-mpw) # EGCS LOCAL ++ mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; +- pmac | pmac-mpw) # EGCS LOCAL ++ pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; +- c4x*) +- basic_machine=c4x-none +- os=-coff +- ;; ++ *-unknown) ++ # Make sure to match an already-canonicalized machine name. ++ ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 +@@ -935,20 +1110,38 @@ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ ++ | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ +- | -interix* | -uwin* ) ++ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ ++ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ ++ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ ++ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ ++ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ ++ | -powermax* | -dnix* | -microbsd*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; +- # EGCS LOCAL ++ -qnx*) ++ case $basic_machine in ++ x86-* | i*86-*) ++ ;; ++ *) ++ os=-nto$os ++ ;; ++ esac ++ ;; ++ -nto-qnx*) ++ ;; ++ -nto*) ++ os=`echo $os | sed -e 's|nto|nto-qnx|'` ++ ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ +- | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ +- | -macos* | -mpw* | -magic* | -mon960* | -lnews* ) ++ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ ++ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; +- # END EGCS LOCAL + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; +@@ -958,6 +1151,12 @@ + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; ++ -opened*) ++ os=-openedition ++ ;; ++ -wince*) ++ os=-wince ++ ;; + -osfrose*) + os=-osfrose + ;; +@@ -973,14 +1172,23 @@ + -acis*) + os=-aos + ;; +- -386bsd) # EGCS LOCAL ++ -atheos*) ++ os=-atheos ++ ;; ++ -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; ++ -nova*) ++ os=-rtmk-nova ++ ;; + -ns2 ) +- os=-nextstep2 ++ os=-nextstep2 ++ ;; ++ -nsk*) ++ os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) +@@ -1007,15 +1215,21 @@ + # This must come after -sysvr4. + -sysv*) + ;; +- -ose*) # EGCS LOCAL ++ -ose*) + os=-ose + ;; +- -es1800*) # EGCS LOCAL ++ -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; ++ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) ++ os=-mint ++ ;; ++ -aros*) ++ os=-aros ++ ;; + -none) + ;; + *) +@@ -1041,13 +1255,17 @@ + *-acorn) + os=-riscix1.2 + ;; +- arm*-corel) ++ arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; +- pdp11-*) ++ # This must come before the *-dec entry. ++ pdp10-*) ++ os=-tops20 ++ ;; ++ pdp11-*) + os=-none + ;; + *-dec | vax-*) +@@ -1065,15 +1283,18 @@ + # default. + # os=-sunos4 + ;; +- m68*-cisco) # EGCS LOCAL ++ m68*-cisco) + os=-aout + ;; +- mips*-cisco) # EGCS LOCAL ++ mips*-cisco) + os=-elf + ;; +- mips*-*) # EGCS LOCAL +- os=-elf +- ;; ++ mips*-*) ++ os=-elf ++ ;; ++ or32-*) ++ os=-coff ++ ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; +@@ -1086,13 +1307,13 @@ + *-ibm) + os=-aix + ;; +- *-wec) # EGCS LOCAL ++ *-wec) + os=-proelf + ;; +- *-winbond) # EGCS LOCAL ++ *-winbond) + os=-proelf + ;; +- *-oki) # EGCS LOCAL ++ *-oki) + os=-proelf + ;; + *-hp) +@@ -1137,36 +1358,39 @@ + *-next) + os=-nextstep3 + ;; +- *-gould) ++ *-gould) + os=-sysv + ;; +- *-highlevel) ++ *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; +- *-sgi) ++ *-sgi) + os=-irix + ;; +- *-siemens) ++ *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; +- f301-fujitsu) ++ f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; +- *-rom68k) # EGCS LOCAL ++ *-rom68k) + os=-coff + ;; +- *-*bug) # EGCS LOCAL ++ *-*bug) + os=-coff + ;; +- *-apple) # EGCS LOCAL ++ *-apple) + os=-macos + ;; ++ *-atari*) ++ os=-mint ++ ;; + *) + os=-none + ;; +@@ -1212,27 +1436,41 @@ + -genix*) + vendor=ns + ;; +- -mvs*) ++ -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; +- -vxsim* | -vxworks*) ++ -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; +- -hms*) # EGCS LOCAL ++ -hms*) + vendor=hitachi + ;; +- -mpw* | -macos*) # EGCS LOCAL ++ -mpw* | -macos*) + vendor=apple + ;; ++ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) ++ vendor=atari ++ ;; ++ -vos*) ++ vendor=stratus ++ ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; + esac + + echo $basic_machine$os ++exit 0 ++ ++# Local variables: ++# eval: (add-hook 'write-file-hooks 'time-stamp) ++# time-stamp-start: "timestamp='" ++# time-stamp-format: "%:y-%02m-%02d" ++# time-stamp-end: "'" ++# End: diff --git a/patches/gcc/2.95.3/deque-leak-fix.patch b/patches/gcc/2.95.3/deque-leak-fix.patch new file mode 100644 index 00000000..44d2a012 --- /dev/null +++ b/patches/gcc/2.95.3/deque-leak-fix.patch @@ -0,0 +1,31 @@ +[See also http://gcc.gnu.org/ml/libstdc++/2001-11/msg00133.html ] + +Date: Fri, 16 Nov 2001 16:06:22 -0500 +From: Phil Edwards <pedwards at disaster dot jaj dot com> +To: gcc-patches at gcc dot gnu dot org +Subject: [libstdc++ trunk & 3.0] Fix deque memory leak +Message-ID: <20011116160622.A23094@disaster.jaj.com> + + +As discussed on the libstdc++ mailing list. Tested on i686/linux. + + + +2001-11-16 Paolo Carlini <pcarlini@unitus.it> + + * include/bits/stl_deque.h (deque::erase()): Fix memory leak. + + +[rediffed against 2.95.3 -- dank] + +--- gcc-2.95.3/libstdc++/stl/stl_deque.h.old 2001-01-01 09:48:22.000000000 -0800 ++++ gcc-2.95.3/libstdc++/stl/stl_deque.h 2006-02-18 15:24:17.000000000 -0800 +@@ -1052,7 +1052,7 @@ + copy_backward(_M_start, __first, __last); + iterator __new_start = _M_start + __n; + destroy(_M_start, __new_start); +- _M_destroy_nodes(__new_start._M_node, _M_start._M_node); ++ _M_destroy_nodes(_M_start._M_node, __new_start._M_node); /* fixed per http://gcc.gnu.org/ml/libstdc++/2001-11/msg00139.html */ + _M_start = __new_start; + } + else { diff --git a/patches/gcc/2.95.3/gcc-2.95.3-cygwin-020611.patch b/patches/gcc/2.95.3/gcc-2.95.3-cygwin-020611.patch new file mode 100644 index 00000000..fb2b8da9 --- /dev/null +++ b/patches/gcc/2.95.3/gcc-2.95.3-cygwin-020611.patch @@ -0,0 +1,33 @@ +[ Building gcc-2.95.3 on cygwin yields a compiler that sticks a .exe + on the end of every executable, even if they're linux executable. + This is highly annoying, and causes glibc build failures that look like this: + mv: `.../bin/makedb.new' and `.../bin/makedb' are the same file + make[2]: *** [.../bin/makedb] Error 1 + make[2]: Leaving directory `.../gcc-2.95.3-glibc-2.1.3/glibc-2.1.3/db2' + + The mainline solves this with http://gcc.gnu.org/ml/gcc-cvs/2001-04/msg00440.html, + but that doesn't apply cleanly to gcc-2.95.3. + + So, I'm using + http://www.uclinux.org/pub/uClinux/uclinux-elf-tools/tools-20030314/gcc-2.95.3-cygwin-020611.patch + This is the only patch in crosstool that *isn't* suitable for the mainline. + I can live with this patch simply because crosstool does not build + compilers that target cygwin or VAX/VMS. + If that ever changes, I might need to try applying the real patch. +] + + + +# +# This patch can be found at http://www.uclinux.org/pub/uClinux/m68k-elf-tools/ +# +--- gcc-2.95.3/gcc/config/i386/xm-cygwin.h 1999-04-22 16:40:56.000000000 +0200 ++++ gcc-2.95.3-cygwin/gcc/config/i386/xm-cygwin.h 2002-06-11 08:23:18.000000000 +0200 +@@ -19,7 +19,6 @@ + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +-#define EXECUTABLE_SUFFIX ".exe" + #define NO_SYS_SIGLIST 1 + + /* We support both "/" and "\" since everybody tests both but we diff --git a/patches/gcc/2.95.3/gcc-2.95.3-trap-posix.patch b/patches/gcc/2.95.3/gcc-2.95.3-trap-posix.patch new file mode 100644 index 00000000..1d180552 --- /dev/null +++ b/patches/gcc/2.95.3/gcc-2.95.3-trap-posix.patch @@ -0,0 +1,44 @@ +# +# Submitted-By: Marc Kleine-Budde <mkl@pengutronix.de>, 2005-04-20 +# +# Error: +# +# creating libintl.h +# Configuring etc... +# loading cache ../config.cache +# checking for a BSD compatible install... (cached) /usr/bin/install -c +# creating ./config.status +# creating Makefile +# trap: usage: trap [-lp] [[arg] signal_spec ...] +# +# Description: +# +# non-posix conform usage of trap causes bash >= 3.0 to fail +# e.g.: http://sourceware.org/ml/crossgcc/2004-12/msg00132.html +# +# Status: +# +# fixed in gcc >= 3.3.5 +# backport of gcc-3.3.5 fix +# +diff -ruN gcc-2.95.3-orig/configure gcc-2.95.3/configure +--- gcc-2.95.3-orig/configure 1999-04-02 16:17:40.000000000 +0200 ++++ gcc-2.95.3/configure 2005-04-20 18:25:45.030488235 +0200 +@@ -687,7 +687,7 @@ + if test -f skip-this-dir; then + # Perform the same cleanup as the trap handler, minus the "exit 1" of course, + # and reset the trap handler. +- trap 0 ++ trap '' 0 + rm -f Makefile* ${tmpfile}.com ${tmpfile}.tgt ${tmpfile}.hst ${tmpfile}.pos + # Execute the final clean-up actions + ${config_shell} skip-this-dir +@@ -1599,7 +1599,7 @@ + # Perform the same cleanup as the trap handler, minus the "exit 1" of course, + # and reset the trap handler. + rm -f ${tmpfile}.com ${tmpfile}.tgt ${tmpfile}.hst ${tmpfile}.pos +-trap 0 ++trap '' 0 + + exit 0 + diff --git a/patches/gcc/2.95.3/gcc-pr3106.patch b/patches/gcc/2.95.3/gcc-pr3106.patch new file mode 100644 index 00000000..0e077ea3 --- /dev/null +++ b/patches/gcc/2.95.3/gcc-pr3106.patch @@ -0,0 +1,28 @@ +See http://gcc.gnu.org/PR3106 +Backported from gcc-3.0.x + +Fixes error + .../binutils-2.11.2/libiberty/strerror.c:468: error: conflicting types for `sys_nerr' + /usr/include/stdio.h:258: error: previous declaration of `sys_nerr' + make[1]: *** [strerror.o] Error 1 + make: *** [all-libiberty] Error 2 +on Mac OS X. + +--- gcc-2.95.3/libiberty/strerror.c.old 2004-03-24 16:23:19.000000000 -0800 ++++ gcc-2.95.3/libiberty/strerror.c 2004-03-24 16:23:48.000000000 -0800 +@@ -13,6 +13,7 @@ + incompatible with our later declaration, perhaps by using const + attributes. So we hide the declaration in errno.h (if any) using a + macro. */ ++#define sys_nerr sys_nerr__ + #define sys_errlist sys_errlist__ + #endif + +@@ -20,6 +21,7 @@ + #include <errno.h> + + #ifdef HAVE_SYS_ERRLIST ++#undef sys_nerr + #undef sys_errlist + #endif + diff --git a/patches/gcc/2.95.3/threads_snafu.patch b/patches/gcc/2.95.3/threads_snafu.patch new file mode 100644 index 00000000..2c5297ef --- /dev/null +++ b/patches/gcc/2.95.3/threads_snafu.patch @@ -0,0 +1,28 @@ +This fixes the error + +In file included from gthr-default.h:1, + from /build/arm-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/gcc-2.95.3/gcc/gthr.h:98, + from /build/arm-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/gcc-2.95.3/gcc/libgcc2.c:3034: +/build/arm-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/gcc-2.95.3/gcc/gthr-posix.h:37: pthread.h: No such file or directory +make[3]: *** [libgcc2.a] Error 1 +make[3]: Leaving directory `/build/arm-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.2/build-gcc-core/gcc' + +in what I think is a nicer way than the patch used by the arm team, +i.e. "perl -pi -e 's/^(TARGET_LIBGCC2_CFLAGS.*)/$1 -Dinhibit_libc -D__gthr_posix_h/' gcc/config/arm/t-linux" +which seems a bit of a kludge. + +--- gcc-2.95.3/gcc/configure.old Fri Mar 16 06:13:48 2001 ++++ gcc-2.95.3/gcc/configure Sun Jun 8 13:02:20 2003 +@@ -853,9 +853,9 @@ + # Check whether --enable-threads or --disable-threads was given. + if test "${enable_threads+set}" = set; then + enableval="$enable_threads" +- if test x$enable_threads = xno; then +- enable_threads='' +-fi ++ #if test x$enable_threads = xno; then ++ #enable_threads='' ++ #fi + else + enable_threads='' + fi diff --git a/patches/gcc/3.2.3/README-mips b/patches/gcc/3.2.3/README-mips new file mode 100644 index 00000000..170b21d9 --- /dev/null +++ b/patches/gcc/3.2.3/README-mips @@ -0,0 +1,1648 @@ +See also http://www.spinics.net/lists/mips/msg12236.html + +ftp://ftp.linux-mips.org/pub/linux/mips/redhat/7.3/test/SRPMS/gcc-3.2-7.1.src.rpm +contains the following patches and spec file. +You may wish to investigate some of these patches; I haven't. +I think this is mostly the Red Hat 8.0 srpm for a prerelease gcc-3.2, plus a couple +mips specific fixes, but you'd have to ask H.J.Lu or compare with the regular +Red Hat 8.0 srpm to find out. +In any case, the spec file is interesting reading. +- Dan K. + +total 1164 + 4 boehm-gc-LINUX.patch + 4 boehm-gc-mips.patch + 4 contrib-touch.patch + 8 gcc-arch.patch + 4 gcc-c++-template.patch + 4 gcc-copy.patch + 4 gcc-cross-bfd.patch + 4 gcc-cross.patch + 4 gcc-gcj-cross.patch + 4 gcc-libffi-mips.patch + 4 gcc-libgcc.patch + 480 gcc-libstdc++-glibc-2.2.patch + 4 gcc-libstdc++-mips.patch + 4 gcc-linux-atexit.patch + 8 gcc-linux-crt.patch + 4 gcc-mips-coff.patch + 4 gcc-mips-file.patch + 4 gcc-mips-ieee.patch + 4 gcc-mips-return.patch + 4 gcc-ppc-linux.patch + 8 gcc-sizeof.patch + 4 gcc-test-atexit.patch + 4 gcc-testsuite-c++.patch + 4 gcc-var.patch + 8 gcc32-2.96-RH-compat.patch + 4 gcc32-ada-addr2line.patch + 8 gcc32-ada-link.patch + 12 gcc32-attr-visibility.patch + 4 gcc32-attr-visibility2.patch + 4 gcc32-attr-visibility3.patch + 4 gcc32-attr-visibility4.patch + 4 gcc32-attr-visibility5.patch + 8 gcc32-boehm-gc-libs.patch + 4 gcc32-bogus-inline.patch + 4 gcc32-c++-nrv-test.patch + 4 gcc32-c++-pretty_function.patch + 16 gcc32-c++-tail-pad-backout.patch + 4 gcc32-c++-tsubst-asm.patch + 4 gcc32-cfg-eh.patch + 4 gcc32-debug-pr7241.patch + 4 gcc32-doc-gcov.patch + 4 gcc32-duplicate-decl.patch + 4 gcc32-dwarf2-pr6381.patch + 4 gcc32-dwarf2-pr6436-test.patch + 4 gcc32-fde-merge-compat.patch + 4 gcc32-fold-const-associate.patch + 4 gcc32-fold-const2.patch + 24 gcc32-hard-reg-sharing.patch + 4 gcc32-hard-reg-sharing2.patch + 4 gcc32-i386-default-momit-leaf-frame-pointer.patch + 4 gcc32-i386-memtest-test.patch + 4 gcc32-i386-no-default-momit-leaf-frame-pointer.patch + 4 gcc32-i386-pic-label-thunk.patch + 4 gcc32-i386-pr7242.patch + 4 gcc32-i386-profile-olfp.patch + 4 gcc32-inline-label.patch + 4 gcc32-interface_only.patch + 4 gcc32-java-no-rpath.patch + 20 gcc32-libstdc++-glibc23-1.patch + 4 gcc32-libstdc++-glibc23-2.patch + 4 gcc32-libstdc++-glibc23-3.patch + 4 gcc32-libstdc++-glibc23-4.patch + 4 gcc32-loop-prefetch.patch + 4 gcc32-pr6842.patch + 8 gcc32-rh69989.patch + 40 gcc32-s390-java.patch + 4 gcc32-sparc-sll1.patch + 4 gcc32-test-rh65771.patch + 8 gcc32-test-rotate.patch + 12 gcc32-tls-dwarf2.patch + 140 gcc32-tls.patch + 4 gcc32-tls2.patch + 4 gcc32-tls3.patch + 4 gcc32-tls4.patch + 4 gcc32-tls5.patch + 24 gcc32-tree-code.patch + 4 gcc32-trunc_int_for_mode.patch + 4 gcc32-typeof-asm.patch + 4 gcc32-x86_64-libiberty-pic.patch + 4 gcc32-x86_64-pr7559.patch + 4 gcc32-x86_64-q_regs_operand.patch + 4 gcc32-x86_64-rip-lowercase.patch + 4 libjava-cross.patch + 4 libtool-libs.patch + 4 libtool-mips.patch + +---------- gcc32.spec --------- + +%if %{_arch} != %{_build_arch} +%define cross_compile 1 +%else +%define cross_compile 0 +%endif +%{?_with_crosscompile: %{expand: %%define cross_compile 1}} + +%if %{cross_compile} +%define make_check 0 +%else +%define make_check 1 +%endif +%{?_without_check: %{expand: %%define make_check 0}} +%{?_with_check: %{expand: %%define make_check 1}} + +%define default 0 +%{?_with_default: %{expand: %%define default 1}} + +%define gcconly 0 +%{?_with_gcconly: %{expand: %%define gcconly 1}} + +%define DATE 20020903 +%define gcc_version 3.2 +%define gcc_release 7.1 +%ifarch %{ix86} alpha ia64 ppc +%define build_ada 1 +%else +%define build_ada 0 +%endif +%{?_without_ada: %{expand: %%define build_ada 0}} +%if %{cross_compile} +%define build_ada 0 +%endif +Summary: Various compilers (C, C++, Objective-C, Java, ...) +%if !%{gcconly} +Name: gcc +Version: 3.2 +Release: %{gcc_release} +%else +Name: gcc-%{gcc_version} +Version: %{gcc_release} +Release: 1 +%endif +Copyright: GPL +Group: Development/Languages +Source0: gcc-%{version}-%{DATE}.tar.bz2 +URL: http://gcc.gnu.org +BuildRoot: %{_tmppath}/%{name}-%{version}-root +BuildRequires: binutils >= 2.12.90.0.9-1 +BuildRequires: zlib-devel, gettext, dejagnu +# Make sure pthread.h doesn't contain __thread tokens +BuildRequires: glibc-devel >= 2.2.5-36.2 +%if %{build_ada} +# Ada requires Ada to build +BuildRequires: gcc-gnat >= 3.1, libgnat >= 3.1 +%endif +Requires: cpp = %{version}-%{release} +# Need .eh_frame ld optimizations +# Need proper visibility support +Requires: binutils >= 2.12.90.0.7-1 +# Make sure gdb will understand DW_FORM_strp +Conflicts: gdb < 5.1-2 +Requires: glibc-devel >= 2.2.5-36.2 +Requires: libgcc >= %{version}-%{release} +%if !%{gcconly} +Obsoletes: gcc3 +%endif +Prereq: /sbin/install-info + +Patch1: gcc32-2.96-RH-compat.patch +Patch2: gcc32-boehm-gc-libs.patch +Patch3: gcc32-bogus-inline.patch +Patch6: gcc32-fde-merge-compat.patch +Patch7: gcc32-attr-visibility.patch +Patch8: gcc32-attr-visibility2.patch +Patch9: gcc32-duplicate-decl.patch +Patch10: gcc32-trunc_int_for_mode.patch +Patch11: gcc32-sparc-sll1.patch +Patch12: gcc32-x86_64-q_regs_operand.patch +Patch13: gcc32-dwarf2-pr6381.patch +Patch14: gcc32-dwarf2-pr6436-test.patch +Patch15: gcc32-c++-pretty_function.patch +Patch16: gcc32-c++-tsubst-asm.patch +Patch18: gcc32-i386-memtest-test.patch +Patch19: gcc32-fold-const2.patch +Patch21: gcc32-ada-addr2line.patch +Patch22: gcc32-ada-link.patch +Patch23: gcc32-java-no-rpath.patch +Patch25: gcc32-s390-java.patch +Patch26: gcc32-test-rotate.patch +Patch27: gcc32-x86_64-libiberty-pic.patch +Patch29: gcc32-test-rh65771.patch +Patch30: gcc32-i386-default-momit-leaf-frame-pointer.patch +Patch31: gcc32-i386-pic-label-thunk.patch +Patch34: gcc32-pr6842.patch +Patch35: gcc32-tls.patch +Patch36: gcc32-i386-profile-olfp.patch +Patch37: gcc32-tree-code.patch +Patch38: gcc32-hard-reg-sharing.patch +Patch39: gcc32-hard-reg-sharing2.patch +Patch40: gcc32-c++-nrv-test.patch +Patch41: gcc32-debug-pr7241.patch +Patch42: gcc32-i386-pr7242.patch +Patch43: gcc32-cfg-eh.patch +Patch44: gcc32-attr-visibility3.patch +Patch45: gcc32-tls2.patch +Patch46: gcc32-fold-const-associate.patch +Patch47: gcc32-inline-label.patch +Patch48: gcc32-typeof-asm.patch +Patch50: gcc32-rh69989.patch +Patch51: gcc32-tls3.patch +Patch52: gcc32-tls4.patch +Patch54: gcc32-tls5.patch +Patch55: gcc32-tls-dwarf2.patch +Patch56: gcc32-x86_64-pr7559.patch +Patch57: gcc32-loop-prefetch.patch +Patch58: gcc32-doc-gcov.patch +Patch59: gcc32-attr-visibility4.patch +Patch60: gcc32-c++-tail-pad-backout.patch +Patch61: gcc32-attr-visibility5.patch +Patch62: gcc32-i386-no-default-momit-leaf-frame-pointer.patch +Patch64: gcc32-x86_64-rip-lowercase.patch +Patch65: gcc32-libstdc++-glibc23-1.patch +Patch66: gcc32-libstdc++-glibc23-2.patch +Patch67: gcc32-libstdc++-glibc23-3.patch +Patch68: gcc32-libstdc++-glibc23-4.patch +Patch69: gcc32-interface_only.patch + +%define _gnu %{nil} + +Patch10000: boehm-gc-mips.patch +Patch10001: boehm-gc-LINUX.patch +Patch10002: gcc-libffi-mips.patch + +Patch11000: gcc-mips-coff.patch +Patch11001: gcc-mips-file.patch +Patch11002: gcc-mips-ieee.patch +Patch11003: gcc-mips-return.patch +Patch11004: gcc-libstdc++-mips.patch +Patch11005: libtool-mips.patch + +Patch12000: gcc-libgcc.patch + +Patch13000: gcc-ppc-linux.patch +Patch13001: gcc-linux-crt.patch + +Patch14000: gcc-linux-atexit.patch +Patch14001: gcc-test-atexit.patch + +Patch15000: gcc-var.patch +Patch15001: gcc-copy.patch + +Patch16000: gcc-c++-template.patch +Patch16001: gcc-testsuite-c++.patch + +Patch17000: gcc-cross.patch +Patch17001: gcc-cross-bfd.patch +Patch17002: gcc-sizeof.patch +Patch17003: gcc-arch.patch + +Patch18000: libjava-cross.patch +Patch18001: gcc-gcj-cross.patch + +Patch19000: contrib-touch.patch + +Patch20000: libtool-libs.patch + +Patch21000: gcc-libstdc++-glibc-2.2.patch + +%description +The gcc package contains the GNU Compiler Collection version 3.2. +You'll need this package in order to compile C code. + +%package -n libgcc +Summary: GCC version 3.2 shared support library +Group: System Environment/Libraries + +%description -n libgcc +This package contains GCC shared support library which is needed +e.g. for exception handling support. + +%package c++ +Summary: C++ support for GCC +Group: Development/Languages +Requires: gcc = %{version}-%{release} +Requires: libstdc++ = %{version} +Requires: libstdc++-devel = %{version} +Obsoletes: gcc3-c++ + +%description c++ +This package adds C++ support to the GNU Compiler Collection. +It includes support for most of the current C++ specification, +including templates and exception handling. + +%package -n libstdc++ +Summary: GNU Standard C++ Library +Group: System Environment/Libraries +Obsoletes: libstdc++3 + +%description -n libstdc++ +The libstdc++ package contains a rewritten standard compliant GCC Standard +C++ Library. + +%package -n libstdc++-devel +Summary: Header files and libraries for C++ development +Group: Development/Libraries +Requires: libstdc++ = %{version}-%{release} +Obsoletes: libstdc++3-devel + +%description -n libstdc++-devel +This is the GNU implementation of the standard C++ libraries. This +package includes the header files and libraries needed for C++ +development. This includes rewritten implementation of STL. + +%package objc +Summary: Objective-C support for GCC +Group: Development/Languages +Requires: gcc = %{version}-%{release} +Requires: libobjc = %{version}-%{release} +Obsoletes: gcc3-objc + +%description objc +gcc-objc provides Objective-C support for the GCC. +Mainly used on systems running NeXTSTEP, Objective-C is an +object-oriented derivative of the C language. + +%package -n libobjc +Summary: Objective-C runtime +Group: System Environment/Libraries + +%description -n libobjc +This package contains Objective-C shared library which is needed to run +Objective-C dynamically linked programs. + +%package g77 +Summary: Fortran 77 support +Group: Development/Languages +Requires: gcc = %{version}-%{release} +Requires: libf2c = %{version}-%{release} +Prereq: /sbin/install-info +Obsoletes: gcc3-g77 + +%description g77 +The gcc-g77 package provides support for compiling Fortran 77 +programs with the GNU Compiler Collection. + +%package -n libf2c +Summary: Fortran 77 runtime +Group: System Environment/Libraries + +%description -n libf2c +This package contains Fortran 77 shared library which is needed to run +Fortran 77 dynamically linked programs. + +%package java +Summary: Java support for GCC +Group: Development/Languages +Requires: gcc = %{version}-%{release} +Requires: libgcj >= %{version}, libgcj-devel >= %{version} +Obsoletes: gcc3-java +Prereq: /sbin/install-info + +%description java +This package adds support for compiling Java(tm) programs and +bytecode into native code. + +%package -n libgcj +Summary: Java runtime library for gcc +Group: System Environment/Libraries +Requires: zip >= 2.1 +Obsoletes: gcc-libgcj +Obsoletes: libgcj3 +# Kaffe includes jar too +Conflicts: kaffe + +%description -n libgcj +The Java(tm) runtime library. You will need this package to run your Java +programs compiled using the Java compiler from GNU Compiler Collection (gcj). + +%package -n libgcj-devel +Summary: Libraries for Java development using GCC +Group: Development/Languages +Requires: zip >= 2.1, libgcj = %{version} +Obsoletes: libgcj3-devel + +%description -n libgcj-devel +The Java(tm) static libraries and C header files. You will need this +package to compile your Java programs using the GCC Java compiler (gcj). + +%package -n cpp +Summary: The C Preprocessor. +Group: Development/Languages +Prereq: /sbin/install-info +%ifarch ia64 +Obsoletes: gnupro +%endif + +%description -n cpp +Cpp is the GNU C-Compatible Compiler Preprocessor. +Cpp is a macro processor which is used automatically +by the C compiler to transform your program before actual +compilation. It is called a macro processor because it allows +you to define macros, abbreviations for longer +constructs. + +The C preprocessor provides four separate functionalities: the +inclusion of header files (files of declarations that can be +substituted into your program); macro expansion (you can define macros, +and the C preprocessor will replace the macros with their definitions +throughout the program); conditional compilation (using special +preprocessing directives, you can include or exclude parts of the +program according to various conditions); and line control (if you use +a program to combine or rearrange source files into an intermediate +file which is then compiled, you can use line control to inform the +compiler about where each source line originated). + +You should install this package if you are a C programmer and you use +macros. + +%package gnat +Summary: Ada 95 support for GCC +Group: Development/Languages +Requires: gcc = %{version}-%{release}, libgnat = %{version}-%{release} +Obsoletes: gnat-devel, gcc3-gnat +Prereq: /sbin/install-info + +%description gnat +GNAT is a GNU Ada 95 front-end to GCC. This package includes development tools, +the documents and Ada 95 compiler. + +%package -n libgnat +Summary: GNU Ada 95 runtime shared libraries +Group: System Environment/Libraries +Obsoletes: gnat libgnat3 + +%description -n libgnat +GNAT is a GNU Ada 95 front-end to GCC. This package includes shared libraries, +which are required to run programs compiled with the GNAT. + +%prep +%setup -q -n gcc-%{version}-%{DATE} +%patch1 -p0 -b .2.96-RH-compat~ +%patch2 -p0 -b .boehm-gc-libs~ +%patch3 -p0 -b .bogus-inline~ +%patch6 -p0 -b .fde-merge-compat~ +%patch7 -p0 -b .attr-visibility~ +%patch8 -p0 -b .attr-visibility2~ +%patch9 -p0 -b .duplicate-decl~ +%patch10 -p0 -b .trunc_int_for_mode~ +%patch11 -p0 -b .sparc-sll1~ +%patch12 -p0 -b .x86_64-q_regs_operand~ +%patch13 -p0 -b .dwarf2-pr6381~ +%patch14 -p0 -b .dwarf2-pr6436-test~ +%patch15 -p0 -b .c++-pretty_function~ +%patch16 -p0 -b .c++-tsubst-asm~ +%patch18 -p0 -b .i386-memtest-test~ +%patch19 -p0 -b .fold-const2~ +%patch21 -p0 -b .ada-addr2line~ +%patch22 -p0 -b .ada-link~ +%patch23 -p0 -b .java-no-rpath~ +%patch25 -p0 -b .s390-java~ +%patch26 -p0 -b .test-rotate~ +%patch27 -p0 -b .x86_64-libiberty-pic~ +%patch29 -p0 -b .test-rh65771~ +%patch30 -p0 -b .i386-default-momit-leaf-frame-pointer~ +%patch31 -p0 -b .i386-pic-label-thunk~ +%patch34 -p0 -b .pr6842~ +%patch35 -p0 -b .tls~ +%patch36 -p0 -b .i386-profile-olfp~ +%patch37 -p0 -b .tree-code~ +%patch38 -p0 -b .hard-reg-sharing~ +%patch39 -p0 -b .hard-reg-sharing2~ +%patch40 -p0 -b .c++-nrv-test~ +%patch41 -p0 -b .debug-pr7241~ +%patch42 -p0 -b .i386-pr7242~ +%patch43 -p0 -b .cfg-eh~ +%patch44 -p0 -b .attr-visibility3~ +%patch45 -p0 -b .tls2~ +%patch46 -p0 -b .fold-const-associate~ +%patch47 -p0 -b .inline-label~ +%patch48 -p0 -b .typeof-asm~ +%patch50 -p0 -b .rh69989~ +%patch51 -p0 -b .tls3~ +%patch52 -p0 -b .tls4~ +%patch54 -p0 -b .tls5~ +%patch55 -p0 -b .tls-dwarf2~ +%patch56 -p0 -b .x86_64-pr7559~ +%patch57 -p0 -b .loop-prefetch~ +%patch58 -p0 -b .doc-gcov~ +%patch59 -p0 -b .attr-visibility4~ +%patch60 -p0 -b .c++-tail-pad-backout~ +%patch61 -p0 -b .attr-visibility5~ +%patch62 -p0 -b .i386-no-default-momit-leaf-frame-pointer~ +%patch64 -p0 -b .x86_64-rip-lowercase~ +%patch65 -p0 -b .libstdc++-glibc23-1~ +%patch66 -p0 -b .libstdc++-glibc23-2~ +%patch67 -p0 -b .libstdc++-glibc23-3~ +%patch68 -p0 -b .libstdc++-glibc23-4~ +%patch69 -p0 -b .interface_only + +%patch10000 -p0 -b .mips +%patch10001 -p0 -b .LINUX +%patch10002 -p0 -b .mips +pushd boehm-gc +autoconf +popd +pushd libffi +autoconf +# Ignore the error from automake +automake --cygnus Makefile || : +popd + +%patch11000 -p0 -b .coff +%patch11001 -p0 -b .file +%patch11002 -p0 -b .ieee +%patch11003 -p0 -b .return +%patch11004 -p0 -b .mips +%patch11005 -p1 -b .mips + +%patch12000 -p0 -b .libgcc + +%patch13000 -p0 -b .ppc +%patch13001 -p0 -b .crt + +%patch14000 -p0 -b .order +%patch14001 -p0 -b .order + +%patch15000 -p0 -b .var +%patch15001 -p0 -b .copy + +%patch16000 -p0 -b .template +%patch16001 -p0 -b .template + +%patch17000 -p1 -b .cross +%patch17001 -p0 -b .cross-bfd +%patch17002 -p1 -b .sizeof +%patch17003 -p0 -b .arch +pushd gcc +autoheader +autoconf +popd +pushd fastjar +aclocal +autoconf +popd +pushd libffi +aclocal +autoconf +popd + +%patch18000 -p0 -b .cross +%patch18001 -p0 -b .build +pushd libjava +autoconf +automake --foreign Makefile +popd + +%patch19000 -p0 -b .touch + +%patch20000 -p0 -b .libs + +%patch21000 -p0 -b .glibc-2.2 +pushd libstdc++-v3 +autoconf +popd + +perl -pi -e 's/3\.2\.1/3.2/' gcc/version.c gcc/f/version.c gcc/ada/gnatvsn.ads +perl -pi -e 's/"%{gcc_version}"/"%{gcc_version} \(release\)"/' gcc/version.c +perl -pi -e 's/\((prerelease|experimental|release)\)/\(Red Hat Linux 8.0 %{version}-%{gcc_release}\)/' gcc/version.c gcc/f/version.c +perl -pi -e 's/\((prerelease|experimental|release)\)/\(%{version}-%{gcc_release}\)/' gcc/ada/gnatvsn.ads +perl -pi -e 's/#define GCCBUGURL.*$/#define GCCBUGURL "<URL:http:\/\/bugzilla.redhat.com\/bugzilla\/>"/' gcc/system.h +# The version string is now longer than 32 bytes and the line containing it +# doesn't fit into 80 columns +#perl -pi -e 's/:= 32/:= 64/;s/(Gnat_Version_String.*:=)/\1\n /' gcc/ada/gnatvsn.ads + +./contrib/gcc_update --touch + +%build +rm -fr obj-%{_target_platform} +mkdir obj-%{_target_platform} +cd obj-%{_target_platform} + +%if %{_arch} != %{_build_arch} +%ifos linux +export ac_cv_func_mmap_anywhere=yes +export ac_cv_func_mmap_file=yes +export ac_cv_func_mmap_fixed_mapped=yes +export ac_cv_func_strncmp_works=yes +export gcc_cv_func_printf_ptr=yes +%endif +%endif + +DEFAULT_FLAGS= +%if %{default} +%ifarch %{ix86} +TARGET_CPU="%{_target_cpu}" +DEFAULT_FLAGS="--with-arch=$TARGET_CPU --with-cpu=$TARGET_CPU" +%endif +%endif + +CC=%{__cc} +OPT_FLAGS=`echo $RPM_OPT_FLAGS|sed -e 's/-fno-rtti//g' -e 's/-fno-exceptions//g'` +CC="$CC" CFLAGS="$OPT_FLAGS" CXXFLAGS="$OPT_FLAGS" XCFLAGS="$OPT_FLAGS" TCFLAGS="$OPT_FLAGS" \ + ../configure --prefix=%{_prefix} --mandir=%{_mandir} --infodir=%{_infodir} \ + --enable-shared --enable-threads=posix --disable-checking --host=%{_target_platform} \ + $DEFAULT_FLAGS \ +%if %{cross_compile} + --target=%{_target_platform} --build=%{_build_alias} \ +%endif + --with-system-zlib --enable-__cxa_atexit + +# We have to make sure all gcc configure files are up to date for +# parallel build. We have to do it twice due to the stupid Makefile. +make -C gcc cstamp-h +make -C gcc cstamp-h + +# if RPM_BUILD_NCPUS unset, set it +if [ -z "$RPM_BUILD_NCPUS" ] ; then + if [ -x /usr/bin/getconf ] ; then + RPM_BUILD_NCPUS=$(/usr/bin/getconf _NPROCESSORS_ONLN) + if [ $RPM_BUILD_NCPUS -eq 0 ]; then + RPM_BUILD_NCPUS=1 + fi + else + RPM_BUILD_NCPUS=1 + fi +fi + +RPM_BUILD_NCPUS=`expr $RPM_BUILD_NCPUS + $RPM_BUILD_NCPUS` + +cat <<EOF > makefile +MAKE=make -j $RPM_BUILD_NCPUS +include Makefile +CFLAGS:=\$(CFLAGS) -pipe +CXXFLAGS:=\$(CXXFLAGS) -pipe +EOF + +# FIXME: It is a kludge. +export GCJFLAGS="$OPT_FLAGS" + +%if %{cross_compile} +make -j$RPM_BUILD_NCPUS \ + CC=%{__cc} \ + CXX=%{__cxx} \ + AR=%{__ar} \ + AS=%{__as} \ + LD=%{__ld} \ + NM=%{__nm} \ + RANLIB=%{__ranlib} \ + CC_FOR_TARGET=%{__cc} \ + GCC_FOR_TARGET=%{__cc} \ + CXX_FOR_TARGET=%{__cxx} \ + AR_FOR_TARGET=%{__ar} \ + AS_FOR_TARGET=%{__as} \ + LD_FOR_TARGET=%{__ld} \ + NM_FOR_TARGET=%{__nm} \ + RANLIB_FOR_TARGET=%{__ranlib} \ + HOST_CC=cc \ + CFLAGS_FOR_TARGET="$RPM_OPT_FLAGS -pipe" \ + CFLAGS_FOR_BUILD="-O -pipe" \ + CFLAGS="$RPM_OPT_FLAGS -pipe" \ + CXXFLAGS="$RPM_OPT_FLAGS -pipe" +%else +make -j$RPM_BUILD_NCPUS bootstrap-lean +#make -j$RPM_BUILD_NCPUS bootstrap +%endif + +%if %{build_ada} +# This doesn't work with -j$RPM_BUILD_NCPUS +make -C gcc gnatlib-shared +make -C gcc gnattools +make -C gcc/ada doc +%endif + +%if %{make_check} +# run the tests. +make -j$RPM_BUILD_NCPUS -k check || : +%ifarch %{ix86} +ln -sf i686-pc-linux-gnu ../libstdc++-v3/config/abi/%{_target_platform} +ln -sf i686-pc-linux-gnu ../libstdc++-v3/config/abi/%{_target_platform}-gnu +%endif +echo ====================TESTING========================= +( ../contrib/test_summary || : ) 2>&1 | sed -n '/^cat.*EOF/,/^EOF/{/^cat.*EOF/d;/^EOF/d;/^LAST_UPDATED:/d;p;}' +%ifarch %{ix86} +make -C %{_target_platform}/libstdc++-v3 check-abi +%endif +echo ====================TESTING END===================== +#cd %{_target_platform}/libstdc++-v3 +#./mkcheck 0 +#cd ../.. +%endif + +%if !%{cross_compile} +# Make protoize +make -C gcc CC="./xgcc -B ./ -O2" proto +%endif + +# Make generated man pages even if Pod::Man is not new enough +perl -pi -e 's/head3/head2/' ../contrib/texi2pod.pl +for i in ../gcc/doc/*.texi; do + cp -a $i $i.orig; sed 's/ftable/table/' $i.orig > $i +done +make -C gcc generated-manpages +for i in ../gcc/doc/*.texi; do mv -f $i.orig $i; done + +# Copy various doc files here and there +cd .. +mkdir -p rpm.doc/g77 rpm.doc/objc +mkdir -p rpm.doc/boehm-gc rpm.doc/fastjar rpm.doc/libffi rpm.doc/libjava + +(cd gcc/f; for i in ChangeLog*; do + cp -p $i ../../rpm.doc/g77/$i.f +done) +(cd libf2c; for i in ChangeLog*; do + cp -p $i ../rpm.doc/g77/$i.libf2c +done) +(cd gcc/objc; for i in README*; do + cp -p $i ../../rpm.doc/objc/$i.objc +done) +(cd libobjc; for i in README*; do + cp -p $i ../rpm.doc/objc/$i.libobjc +done) +(cd boehm-gc; for i in ChangeLog*; do + cp -p $i ../rpm.doc/boehm-gc/$i.gc +done) +(cd fastjar; for i in ChangeLog* README*; do + cp -p $i ../rpm.doc/fastjar/$i.fastjar +done) +(cd libffi; for i in ChangeLog* README* LICENSE; do + cp -p $i ../rpm.doc/libffi/$i.libffi +done) +(cd libjava; for i in ChangeLog* README*; do + cp -p $i ../rpm.doc/libjava/$i.libjava +done) + +%install +rm -fr $RPM_BUILD_ROOT + +perl -pi -e \ + 's~href="l(ibstdc|atest)~href="http://gcc.gnu.org/onlinedocs/libstdc++/l\1~' \ + libstdc++-v3/docs/html/documentation.html +ln -sf documentation.html libstdc++-v3/docs/html/index.html +find libstdc++-v3/docs/html -name CVS | xargs rm -rf + +cd obj-%{_target_platform} +TARGET_PLATFORM=%{_target_platform} + +# There are some MP bugs in libstdc++ and libjava Makefiles +make -C %{_target_platform}/libstdc++-v3 +make -C %{_target_platform}/libjava + +make prefix=$RPM_BUILD_ROOT%{_prefix} mandir=$RPM_BUILD_ROOT%{_mandir} \ +%if %{cross_compile} + CC=%{__cc} \ + CXX=%{__cxx} \ + AR=%{__ar} \ + AS=%{__as} \ + LD=%{__ld} \ + NM=%{__nm} \ + RANLIB=%{__ranlib} \ + CC_FOR_TARGET=%{__cc} \ + GCC_FOR_TARGET=%{__cc} \ + CXX_FOR_TARGET=%{__cxx} \ + AR_FOR_TARGET=%{__ar} \ + AS_FOR_TARGET=%{__as} \ + LD_FOR_TARGET=%{__ld} \ + NM_FOR_TARGET=%{__nm} \ + RANLIB_FOR_TARGET=%{__ranlib} \ + HOST_CC=cc \ + CFLAGS_FOR_TARGET="$RPM_OPT_FLAGS -pipe" \ + CFLAGS_FOR_BUILD="-O -pipe" \ + CFLAGS="$RPM_OPT_FLAGS -pipe" \ + CXXFLAGS="$RPM_OPT_FLAGS -pipe" \ +%endif + infodir=$RPM_BUILD_ROOT%{_infodir} install +%if %{build_ada} +pushd gcc/ada +cp -a gnat-style.info* gnat_rm.info* $RPM_BUILD_ROOT%{_infodir}/ +for i in gnat_ug_unx.info*; do + sed 's/gnat_ug_unx/gnat_ug/g' $i > $RPM_BUILD_ROOT%{_infodir}/`echo $i | sed 's/gnat_ug_unx/gnat_ug/'` +done +chmod 644 $RPM_BUILD_ROOT%{_infodir}/gnat* +popd +%endif + +FULLPATH=$(dirname $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1) + +file $RPM_BUILD_ROOT/%{_prefix}/bin/* | grep ELF | cut -d':' -f1 | xargs %{__strip} || : +%{__strip} $FULLPATH/{cc1,cc1obj,cc1plus,cpp0,tradcpp0,f771,jc1,jvgenmain} + +# fix some things +ln -sf gcc $RPM_BUILD_ROOT%{_prefix}/bin/cc +mkdir -p $RPM_BUILD_ROOT/lib +ln -sf ..%{_prefix}/bin/cpp $RPM_BUILD_ROOT/lib/cpp +ln -sf g77 $RPM_BUILD_ROOT%{_prefix}/bin/f77 +rm -f $RPM_BUILD_ROOT%{_infodir}/dir +gzip -9 $RPM_BUILD_ROOT%{_infodir}/*.info* +ln -sf gcc $RPM_BUILD_ROOT%{_prefix}/bin/gnatgcc + +mv $RPM_BUILD_ROOT%{_prefix}/lib/libgcj.*a $FULLPATH/ +sed 's/-lgcjgc//g;s/-lzgcj//g;s/-lpthread//g' $RPM_BUILD_ROOT%{_prefix}/lib/libgcj.spec > $FULLPATH/libgcj.spec +mv $RPM_BUILD_ROOT%{_prefix}/include/gc*.h $FULLPATH/include/ +mv $RPM_BUILD_ROOT%{_prefix}/include/j*.h $FULLPATH/include/ +mv -f $RPM_BUILD_ROOT%{_prefix}/include/{java,javax,gnu,org} $FULLPATH/include/ +mkdir -p $FULLPATH/include/gcj +mv -f $RPM_BUILD_ROOT%{_prefix}/include/gcj/* $FULLPATH/include/gcj/ +rmdir $RPM_BUILD_ROOT%{_prefix}/include/gcj + +mkdir -p $RPM_BUILD_ROOT/%{_lib} +mv -f `find $RPM_BUILD_ROOT%{_prefix}/lib -name libgcc_s.so.1` $RPM_BUILD_ROOT/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1 +chmod 755 $RPM_BUILD_ROOT/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1 +ln -sf libgcc_s-%{gcc_version}-%{DATE}.so.1 $RPM_BUILD_ROOT/%{_lib}/libgcc_s.so.1 +ln -sf ../../%{_lib}/libgcc_s.so.1 $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgcc_s.so +#ln -sf `echo "%{_prefix}" | sed 's~/[^/]*~\.\./~g'`../%{_lib}/libgcc_s.so.1 \ +# $RPM_BUILD_ROOT%{_prefix}/%{_lib}/libgcc_s.so +#mv -f $FULLPATH/libobjc.so.1* $RPM_BUILD_ROOT%{_prefix}/%{_lib}/ +%if %{build_ada} +mv -f $FULLPATH/adalib/libgnarl-*.so.* $RPM_BUILD_ROOT%{_prefix}/%{_lib}/ +mv -f $FULLPATH/adalib/libgnat-*.so.* $RPM_BUILD_ROOT%{_prefix}/%{_lib}/ +rm -f $FULLPATH/adalib/libgnarl.so* $FULLPATH/adalib/libgnat.so* +%endif +pushd $FULLPATH +if [ "%{_lib}" = "lib" ]; then +ln -sf ../../../libobjc.so.1 libobjc.so +ln -sf ../../../libstdc++.so.5.* libstdc++.so +ln -sf ../../../libgcj.so.3.* libgcj.so +ln -sf ../../../libg2c.so.0.* libg2c.so +%if %{build_ada} +cd adalib +ln -sf ../../../../libgnarl-*.so.* libgnarl.so +ln -sf ../../../../libgnat-*.so.* libgnat.so +cd .. +%endif +else +ln -sf ../../../../%{_lib}/libobjc.so.1 libobjc.so +ln -sf ../../../../%{_lib}/libstdc++.so.5.* libstdc++.so +ln -sf ../../../../%{_lib}/libgcj.so.3.* libgcj.so +ln -sf ../../../../%{_lib}/libg2c.so.0.* libg2c.so +%if %{build_ada} +cd adalib +ln -sf ../../../../../%{_lib}/libgnarl-*.so.* libgnarl.so +ln -sf ../../../../../%{_lib}/libgnat-*.so.* libgnat.so +cd .. +%endif +fi +mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libstdc++.*a . +mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libsupc++.*a . +mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libg2c.*a . +mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libfrtbegin.*a . +mv -f $RPM_BUILD_ROOT%{_prefix}/lib/libobjc.*a . +# Strip debug info from Fortran/ObjC/Java static libraries +%{__strip} -g libg2c.a libobjc.a libgcj.a +# Fix up .la files +for i in *.la; do + sed -e '/^libdir/s_%{_prefix}/lib_%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}_' \ + -e '/^dependency_libs/s_%{_prefix}/lib_%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}_' \ + -e '/^dependency_libs/s~'\''$~ '\''~' \ + -e '/^dependency_libs/s~[ ][ ]*~ ~g' \ + -e '/^dependency_libs/s~-L[^ ]* ~~g' \ + -e '/^dependency_libs/s~-lgcc_s -lgcc -lc -lgcc_s -lgcc ~~g' \ + -e '/^dependency_libs/s~-lgcc -lc -lgcc ~~g' \ + -e '/^dependency_libs/s~-lc ~~g' \ + -e '/^dependency_libs/s~-lm \(-lm \)*~-lm ~g' \ + $i > $i.tmp + mv -f $i.tmp $i +done +popd +chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libg2c.so.0.* +chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libobjc.so.1.* +%if %{build_ada} +chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libgnarl*so* +chmod 755 $RPM_BUILD_ROOT%{_prefix}/lib/libgnat*so* +%endif + +cat > $RPM_BUILD_ROOT%{_prefix}/bin/c89 <<"EOF" +#!/bin/sh +fl="-std=c89" +for opt; do + case "$opt" in + -ansi|-std=c89|-std=iso9899:1990) fl="";; + -std=*) echo "`basename $0` called with non ANSI/ISO C option $opt" >&2 + exit 1;; + esac +done +exec %{_prefix}/bin/gcc $fl ${1+"$@"} +EOF +cat > $RPM_BUILD_ROOT%{_prefix}/bin/c99 <<"EOF" +#!/bin/sh +fl="-std=c99" +for opt; do + case "$opt" in + -std=c99|-std=iso9899:1999) fl="";; + -std=*) echo "`basename $0` called with non ISO C99 option $opt" >&2 + exit 1;; + esac +done +exec %{_prefix}/bin/gcc $fl ${1+"$@"} +EOF +chmod 755 $RPM_BUILD_ROOT%{_prefix}/bin/c?9 + +cd .. +%find_lang %{name} + +%if %{cross_compile} +# Install syslimits.h for canadian cross compile. +pushd $RPM_BUILD_DIR/gcc-%{gcc_version}-%{DATE}/obj-%{_target_platform} +cp -af ../gcc/gsyslimits.h $FULLPATH/include/syslimits.h +# Fix the specs file. +cat gcc/specs | +awk ' +BEGIN { + cross=0; +} +/cross_compile/ { print; cross = 1; next; } +/^1$/ { + if (cross == 0) { + print; + } + else { + cross = 0; + print "0"; + } + next; +} +{ print; } +' > $FULLPATH/specs +popd +%endif + +%clean +rm -rf $RPM_BUILD_ROOT + +%post +/sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/gcc.info.gz + +%preun +if [ $1 = 0 ]; then + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/gcc.info.gz +fi + +%post -n cpp +/sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/cpp.info.gz + +%preun -n cpp +if [ $1 = 0 ]; then + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/cpp.info.gz +fi + +%post g77 +/sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/g77.info.gz + +%preun g77 +if [ $1 = 0 ]; then + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/g77.info.gz +fi + +%post java +/sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/gcj.info.gz + +%preun java +if [ $1 = 0 ]; then + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/gcj.info.gz +fi + +%post gnat +/sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/gnat_rm.info.gz +/sbin/install-info \ + --info-dir=%{_infodir} %{_infodir}/gnat_ug.info.gz + +%preun gnat +if [ $1 = 0 ]; then + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/gnat_rm.info.gz + /sbin/install-info --delete \ + --info-dir=%{_infodir} %{_infodir}/gnat_ug.info.gz +fi + +%post -n libgcc -p /sbin/ldconfig + +%postun -n libgcc -p /sbin/ldconfig + +%post -n libstdc++ -p /sbin/ldconfig + +%postun -n libstdc++ -p /sbin/ldconfig + +%post -n libobjc -p /sbin/ldconfig + +%postun -n libobjc -p /sbin/ldconfig + +%post -n libgcj -p /sbin/ldconfig + +%postun -n libgcj -p /sbin/ldconfig + +%post -n libf2c -p /sbin/ldconfig + +%postun -n libf2c -p /sbin/ldconfig + +%post -n libgnat -p /sbin/ldconfig + +%postun -n libgnat -p /sbin/ldconfig + +%files -f %{name}.lang +%defattr(-,root,root) +%{_prefix}/bin/cc +%{_prefix}/bin/c89 +%{_prefix}/bin/c99 +%{_prefix}/bin/gcc +%{_prefix}/bin/gcov +%if !%{cross_compile} +%{_prefix}/bin/protoize +%{_prefix}/bin/unprotoize +%endif +%{_prefix}/bin/%{_target_platform}-gcc +%{_mandir}/man1/gcc.1* +%{_mandir}/man1/gcov.1* +%{_infodir}/gcc* +%dir %{_prefix}/lib/gcc-lib +%dir %{_prefix}/lib/gcc-lib/%{_target_platform} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/stddef.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/stdarg.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/varargs.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/float.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/limits.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/stdbool.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/iso646.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/syslimits.h +%ifarch %{ix86} x86_64 +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/mmintrin.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/xmmintrin.h +%endif +%ifarch ia64 +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/ia64intrin.h +%endif +%ifarch ppc +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/ppc-asm.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/altivec.h +%endif +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/README +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1 +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/collect2 +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/crt*.o +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcc.a +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcc_eh.a +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/specs +%{_prefix}/%{_lib}/libgcc_s.so +%doc gcc/README* gcc/*ChangeLog* + +%if !%{gcconly} +%files -n cpp +%defattr(-,root,root) +/lib/cpp +%endif +%{_prefix}/bin/cpp +%{_mandir}/man1/cpp.1* +%{_infodir}/cpp* +%dir %{_prefix}/lib/gcc-lib +%dir %{_prefix}/lib/gcc-lib/%{_target_platform} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version} +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cpp0 +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/tradcpp0 + +%files -n libgcc +%defattr(-,root,root) +/%{_lib}/libgcc_s-%{gcc_version}-%{DATE}.so.1 +/%{_lib}/libgcc_s.so.1 + +%if !%{gcconly} +%files c++ +%defattr(-,root,root) +%{_prefix}/bin/%{_target_platform}-*++ +%{_prefix}/bin/g++ +%{_prefix}/bin/c++ +%{_prefix}/bin/c++filt +%{_mandir}/man1/g++.1* +%dir %{_prefix}/lib/gcc-lib +%dir %{_prefix}/lib/gcc-lib/%{_target_platform} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version} +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1plus +%doc gcc/cp/ChangeLog* + +%files -n libstdc++ +%defattr(-,root,root) +%{_prefix}/%{_lib}/libstdc++.so.5* + +%files -n libstdc++-devel +%defattr(-,root,root) +%{_prefix}/include/c++ +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libstdc++.so +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libstdc++.a +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libsupc++.a +%doc libstdc++-v3/ChangeLog* libstdc++-v3/README* libstdc++-v3/docs/html/ + +%files objc +%defattr(-,root,root) +%dir %{_prefix}/lib/gcc-lib +%dir %{_prefix}/lib/gcc-lib/%{_target_platform} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/objc +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/cc1obj +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libobjc.a +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libobjc.so +%doc rpm.doc/objc/* +%doc libobjc/THREADS* libobjc/ChangeLog + +%files -n libobjc +%defattr(-,root,root) +%{_prefix}/%{_lib}/libobjc.so.1* + +%files g77 +%defattr(-,root,root) +%{_prefix}/bin/g77 +%{_prefix}/bin/f77 +%{_mandir}/man1/g77.1* +%{_infodir}/g77* +%dir %{_prefix}/lib/gcc-lib +%dir %{_prefix}/lib/gcc-lib/%{_target_platform} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/f771 +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libfrtbegin.a +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libg2c.a +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libg2c.so +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/g2c.h +%doc gcc/f/README rpm.doc/g77/* + +%files -n libf2c +%defattr(-,root,root) +%{_prefix}/%{_lib}/libg2c.so.0* + +%files java +%defattr(-,root,root) +%{_prefix}/bin/gcj +%{_prefix}/bin/gcjh +%{_prefix}/bin/jcf-dump +%{_prefix}/bin/jv-scan +%{_mandir}/man1/gcj.1* +%{_mandir}/man1/gcjh.1* +%{_mandir}/man1/jcf-dump.1* +%{_mandir}/man1/jv-scan.1* +%{_infodir}/gcj* +%dir %{_prefix}/lib/gcc-lib +%dir %{_prefix}/lib/gcc-lib/%{_target_platform} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version} +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/jc1 +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/jvgenmain +%doc gcc/java/ChangeLog* + +%files -n libgcj +%defattr(-,root,root) +%{_prefix}/bin/jv-convert +%{_prefix}/bin/gij +%{_prefix}/bin/jar +%{_prefix}/bin/grepjar +%{_prefix}/bin/rmic +%{_prefix}/bin/rmiregistry +%{_mandir}/man1/jv-convert.1* +%{_mandir}/man1/gij.1* +%{_mandir}/man1/rmic.1* +%{_mandir}/man1/rmiregistry.1* +%{_prefix}/%{_lib}/libgcj.so.* +%{_prefix}/share/java +%{_prefix}/lib/security + +%files -n libgcj-devel +%defattr(-,root,root) +%{_prefix}/bin/addr2name.awk +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcj.a +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcj.so +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/libgcj.spec +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/gc*.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/j*.h +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/java +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/javax +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/gnu +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/gcj +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/include/org +%doc rpm.doc/boehm-gc/* rpm.doc/fastjar/* rpm.doc/libffi/* +%doc rpm.doc/libjava/* + +%if %{build_ada} +%files gnat +%defattr(-,root,root) +%{_prefix}/bin/gnat* +%{_infodir}/gnat* +%dir %{_prefix}/lib/gcc-lib +%dir %{_prefix}/lib/gcc-lib/%{_target_platform} +%dir %{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version} +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/adainclude +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/adalib +%{_prefix}/lib/gcc-lib/%{_target_platform}/%{gcc_version}/gnat1 +%doc gcc/ada/ChangeLog + +%files -n libgnat +%defattr(-,root,root) +%{_prefix}/%{_lib}/libgnat-*.so.* +%{_prefix}/%{_lib}/libgnarl-*.so.* +%endif +%endif + +%changelog +* Tue Sep 3 2002 Bill Nottingham <notting@redhat.com> 3.2-7 +- fix calling of C++ destructors in certain cases + +* Tue Sep 3 2002 Jakub Jelinek <jakub@redhat.com> 3.2-6 +- update from CVS (but revert C++ tail padding patches + for now) +- further fixes to make libstdc++-v3 build on glibc 2.3 +- run libstdc++-v3 make check-abi on IA-32 during testing + +* Fri Aug 30 2002 Jakub Jelinek <jakub@redhat.com> 3.2-5 +- disable tail copy patches, they seem to still have problems +- make libstdc++-v3 build on glibc 2.3 (and use thread-local + locale model) +- fix c89 and c99 scripts (#73104) + +* Wed Aug 26 2002 Jakub Jelinek <jakub@redhat.com> 3.2-4 +- reorder alpha_encode_section_info checks slightly to fix an ICE + when building glibc and to take better advantage of visibility + attribute on Alpha +- as gdb is not there yet, disable -momit-leaf-frame-pointer + by default for now on IA-32 +- fix IA-64 bootstrap with tail padding patch (Jason Merrill, Daniel Berlin) +- fix x86-64 %RIP to %rip, only output (%rip) if no other relocation + is used (Richard Henderson) + +* Fri Aug 23 2002 Jakub Jelinek <jakub@redhat.com> 3.2-3 +- take advantage of __attribute__((visibility())) on Alpha +- avoid copying tail padding (Jason Merrill) + +* Thu Aug 22 2002 Jakub Jelinek <jakub@redhat.com> 3.2-2 +- fixed Dwarf2 DW_OP_GNU_push_tls_address patch from Richard Henderson +- don't mention removed -a and -ax options in the documentation + (Nathan Sidwell, #72233) +- fixed __typeof() followed by __asm() redirection from Alexandre Oliva + +* Wed Aug 14 2002 Jakub Jelinek <jakub@redhat.com> 3.2-1 +- update to 3.2 release +- fix x86-64 PR target/7559 (Jan Hubicka) +- fix -fprefetch-loop-arrays (Janis Johnson) +- fix x86-64 prefetch (Jan Hubicka) + +* Fri Aug 9 2002 Jakub Jelinek <jakub@redhat.com> 3.2-0.3 +- istream fix (Benjamin Kosnik) +- emit Dwarf2 DW_OP_GNU_push_tls_address extension for TLS (Richard Henderson) +- temporarily disable __typeof() + __asm() fix + +* Thu Aug 8 2002 Jakub Jelinek <jakub@redhat.com> 3.2-0.2 +- update from 3.2 branch + - ABI incompatible changes in libstdc++.so.5, long long bitfield + layout on IA-32 (both C and C++), oversized bitfields layout + on IA-32 and bitfields with base type with __attribute__((aligned ())) + - fix strstream segfaults (#68292, Benjamin Kosnik) +- fix __attribute__((visibility())) together with __asm__() + function redirection +- fix __typeof() followed by __asm() redirection (Alexandre Oliva) +- fix TLS ICE on glibc (#70061) +- fix K6 ICE on linux kernel (#69989, Richard Sandiford, Jan Hubicka) +- fix inlining bug with labels (#70941) +- fix fold-const bug (#70541) +- fix PR preprocessor/7358 (Neil Booth) +- error when mixing __thread and non-__thread declarations + (#70059, Aldy Hernandez) +- fix TLS bug on g++.dg/tls/diag-1.C (Jason Merrill) +- add -mcmodel= x86-64 documentation (Andreas Jaeger) +- avoid TLS emitting movl %gs:0, MEMORY on IA-32 (#71033) + +* Mon Jul 22 2002 Jakub Jelinek <jakub@redhat.com> 3.2-0.1 +- first attempt for gcc 3.2 +- remove .la files + +* Sat Jul 20 2002 Jakub Jelinek <jakub@redhat.com> 3.1-10 +- update from 3.1 branch + - add throw() to set_new_handler (Andreas Schwab) + - fixed PR optimization/7147, optimization/7153 +- make sure pic register is set up even when the only @PLT calls + are done in EH basic blocks (Richard Henderson) + +* Sun Jul 14 2002 Jakub Jelinek <jakub@redhat.com> 3.1-9 +- define %%_gnu to nothing for compatibility + +* Sat Jul 13 2002 Jakub Jelinek <jakub@redhat.com> 3.1-8 +- update from 3.1 branch + - fix OpenOffice miscompilation (PR c++/7279, Jason Merrill) + - PRs c++/7224, c++/6255, optimization/7145, c++/6706, preprocessor/7070, + middle-end/6963, target/6841, target/6770, target/6719, + other/6836, libstdc++/7057, libstdc++/7097, libstdc++/3946, + libstdc++/7173 + - fix a GC bug with named labels in C++ (Jim Wilson) + - fix ICE on Mesa (Bernd Schmidt, #65771) +- added some NRV tests +- fix typo in i386 specs (PR c/7242) +- fix IA-32 ICE with shifts by negative values followed by compare + (PR middle-end/7245, #68395) +- fixed DWARF-2 output for const char * (PR debug/7241) +- actually enable __cxa_atexit for standard compliance at configury time +- added PPC as Ada enabled architecture + +* Wed Jun 19 2002 Jakub Jelinek <jakub@redhat.com> 3.1-7 +- update from 3.1 branch + - PRs target/6922, opt/6722, c/7030, c/6677, objc/6834, c++/6892, + c++/6723, opt/6793 +- use __cxa_atexit for standard compliance: + if your C++ project knows it won't call atexit from within its + static constructors, use -fno-use-cxa-atexit to optimize it +- share hard register rtxs where possible to speed the compiler up (Jeff Law) +- optimize tree_code_* arrays (Kaveh Ghazi) +- don't link prefix.o into libgnat, link libgnat against libgcc_s and + libgnarl against libgnat +- fix typo in GNAT %%post (#66847, #66941, #66639) +- add TLS support + +* Fri Jun 7 2002 Jakub Jelinek <jakub@redhat.com> 3.1-6 +- add GNAT +- remove DT_RPATH from Java binaries (#66103) +- obsolete kaffe, install jar as %{_prefix}/bin/jar +- add include/org directory in java +- add rmic and rmiregistry programs to libgcj +- add info documentation for gcj and various man pages +- add message catalogues for da, el, es, fr, ja, nl, sv, tr +- don't put IA-64 vtables with relocations into read-only sections + with -fpic + +* Tue Jun 4 2002 Jakub Jelinek <jakub@redhat.com> 3.1-5 +- update from 3.1 branch + - PRs optimization/6822, preprocessor/6844, target/6838, target/6788, + libstdc++/6886, libstdc++/6795, libstdc++/6811 +- m$ compatibility for unnamed fields as typedef of struct/union + (PR c/6660) +- fix -fverbose-asm with unnamed fields (PR c/6809) +- fix -mmmx ICE (PR optimization/6842) +- default to -momit-leaf-frame-pointer on i386 (Richard Henderson) +- use linkonce section/hidden symbol for i686 pic getpc thunks + (Richard Henderson) + +* Tue May 28 2002 Jakub Jelinek <jakub@redhat.com> 3.1-4 +- rebuilt + +* Sat May 25 2002 Jakub Jelinek <jakub@redhat.com> 3.1-3 +- update from 3.1 branch + - PRs other/6782, preprocessor/6780, preprocessor/6517, + libstdc++/6282, libstdc++/6701, libstdc++/6701 + - fix out << "" bug (Ben Kosnik, #65409, PR libstdc++/6750) +- 3 new patches + - fix C++ __PRETTY_FUNCTION__ (PR c++/6794) + - fix ICE on jikes (#65379) + - add test for fixed mozilla miscompilation +- include intrinsic headers on IA-32/x86-64, include altivec.h on PPC + +* Wed May 22 2002 Jakub Jelinek <jakub@redhat.com> 3.1-2 +- update from 3.1 branch +- 8 new patches + - fix as version test for 2.12.1 and newer binutils non-CVS releases + - fix ICE in do_subst (#65049) + - fix SSE conditional move (PR target/6753) + - fix SPARC CSE ICE (PR optimization/6759) + - fix x86_64 dbx64_register_map typo (Jan Hubicka) + - fix DWARF-2 with flag_asynchronous_unwind_tables set for leaf + functions (Jan Hubicka) + - fix DWARF-2 x86_64 __builtin_dwarf_reg_sizes (Jan Hubicka) + - fix x86_64 movabsdi (Michael Matz) + +* Wed May 15 2002 Jakub Jelinek <jakub@redhat.com> 3.1-1 +- update to 3.1 final +- 15 new patches + - fix PR c/6643 + - fix fold-const.c typo + - fix unitialized pointer-to-member values (Alexandre Oliva) + - fix templates with asm inputs (Jason Merrill) + - fix -fdata-section (Andreas Schwab) + - readd warning about i386 -malign-double into documentation (Jan Hubicka) + - fix PR libstdc++/6594 (Ben Kosnik) + - fix PR PR libstdc++/6648 (Paolo Carlini) + - fix libstdc++ testsuite rlimits (Rainer Orth) + - s390 java support (Gerhard Tonn) + - rotate testcases (Tom Rix) + - build libiberty with -fpic on x86_64 (Andreas Schwab) + - fix x86_64 multilib build (Bo Thorsen) + - fix x86_64 ASM_OUTPUT_MI_THUNK (Jan Hubicka) + - fix loop-2[cd].c tests on i386 (Eric Botcazou) +- fix typo in g77 info files tweaking +- fix libgcj.so symlink + +* Thu May 9 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.28 +- update to CVS 3.1 branch + - PR c++/6212, target/6429, opt/6534, c/6543, target/6561, c/6569 +- fix x86_64 q_regs_operand (Jan Hubicka) +- better PR c++/6381 fix (Jason Merrill) + +* Fri May 3 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.27 +- update to CVS 3.1 branch + - PR target/5628, libstdc++/5820, c++/6396, preprocessor/6489, + libstdc++/6501, libstdc++/6511, target/6512, libstdc++/6513, + bootstrap/6514, opt/6516, bootstrap/6525, c++/6527, libstdc++/6533, + target/6540 +- fix PR target/6542, target/6522, libstdc++/6549 + +* Mon Apr 29 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.26 +- update to CVS 3.1 branch + - PR c/3581, libstdc++/4150, libstdc++/4164, c/5154, c/5430, c++/5504, + c++/5658, c++/5719, f/6138, libgcj/6158, middle-end/6205, c++/6256, + c/6300, c++/6331, c/6343, c/6344, c++/6352, c/6358, libstdc++/6360, + c++/6395, target/6413, libstdc++/6414, target/6422, bootstrap/6445, + optimization/6475, target/6476, c++/6477, c++/6479, c++/6486, c++/6492, + target/6494, target/6496, c/6497, target/6500 +- fix PR c++/6396 +- run make check as part of build process + +* Thu Apr 18 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.25 +- update to CVS 3.1 branch + - PR opt/420, c++/525, target/817, target/1538, opt/3967, target/3997, + opt/4120, bootstrap/4191, opt/4311, optimization/4328, c++/4884, c++/4934, + c/5078, c++/5104, opt/5120, c++/5189, c++/5373, target/5446, c/5484, + c++/5507, c++/5571, c++/5636, target/5672, target/5715, target/5886, + c++/5933, c++/5964, c++/5998, opt/6007, target/6032, target/6041, + target/6054, c++/6073, target/6082, optimization/6086, target/6087, + middle-end/6096, middle-end/6098, middle-end/6099, middle-end/6100, + middle-end/6102, fortran/6106, c++/6119, opt/6165, optimization/6177, + c++/6179, optimization/6189, c/6202, c/6223, optimization/6233, + middle-end/6279, c/6290, optimization/6305, target/6305, bootstrap/6315, + c++/6320... +- fix PR c++/6316 + +* Wed Mar 27 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.24 +- update to CVS 3.1 branch + - PRs c/5656, c/5972, bootstrap/4192, target/4792, bootstrap/4195, + optimization/5854, target/6043, c++/6037, bootstrap/4128, target/5740, + c/5597, optimization/5863, optimization/5742, target/3177, c/5354, + optimization/5999, target/5977, middle-end/5731, target/5312... + +* Fri Mar 15 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.23.1 +- fix info and man page generation + +* Thu Mar 14 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.23 +- update to CVS 3.1 branch + - fix IA-64 packet selection (PR optimization/5892) + - make highest_pow2_factor work for all constants (PR middle-end/5877) + - fix -Wunused (#61047) + - fix loop on mixed mode class assignments (#60923) + - fix wide character literals + - support SPARC v9 long distance branches (PR target/5626) + - fix SPARC leaf functions + - fix a rtl sharing problem (Richard Henderson, #60760, + PR optimization/5844) + - fix va_arg with variable size types (PR c/3711) + - PRs optimization/5901, optimization/5878, 5693, preprocessor/5899 +- fix C++ ?: at the end of stmt expr (PR c++/5373) +- fix loop unrolling with sibcalls (PR optimization/5891) + +* Thu Mar 7 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.22 +- update to CVS 3.1 branch + - fix ICE with volatile long long (#60650) + - fix tempbuf.h (Philipp Thomas, #60212) + - fix -fssa-ccp (Jeff Law, #60651) + - versioned libstdc++ + - backport __attribute__((visibility("..."))) patches from trunk +- include libstdc++ html documentation + +* Tue Feb 5 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.21 +- update to CVS HEAD + - fix demangler (H.J. Lu, #59300, #59310) + - fix typo in IA-32 specs file (#59081) + - support moving SFmode values in MMX regs if -mmmx (#59083) + - fix recog_for_combine (#59084) + - don't ICE when inserting insns on edge from bb0 to bb0 (Bernd Schmidt, + #59087) + - make sure configure has not time in the future (#59203) + - fix division/modulo by certain constants (#58065, PR c/5304) + - fix -Wswitch (PR c/4475) + +* Thu Jan 31 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.20 +- update to CVS HEAD + - fix jar (Tom Tromey) + - fix loop unrolling (Richard Henderson) + +* Wed Jan 30 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.19 +- update to CVS HEAD + - fix a reload bug on ia32 (#58579, #58648) + - issue error about unknown -W* options (#58909) + - fix ia64 libbfd miscompilation (#58694) + - register all pending unparsed_text structures with GC (#58647) + - fix __builtin_apply with ia32 -msse (#58447) + - prevent ia64 prologue insns saving regs required for eh from being + deleted (#58387) + +* Tue Jan 15 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.18 +- update to CVS HEAD + - handle static x[] = { [X...Y] = (foo) { Z } } (#58338) + - fix getdents.os miscompilation (Richard Henderson, #58308) + - fix ICE in try_forward_edges (#58125) + - fix ICE with -fexceptions -foptimize-sibling-calls + +* Tue Jan 8 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.17 +- avoid division by 0 when computing prediction probabilities (#57992) +- fix ICE due to store_expr not adjusting value back for mode +- increase -ftemplate-depth default value to 500 + +* Mon Jan 7 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.16 +- if using PT_GNU_EH_FRAME registry, work around assembler bug resp. feature + and don't provide weak prototypes of functions which won't be used +- on Alpha, fix a typo so that crtbeginT.o is built and installed +- fix glibc inl-tester miscompilation on ia32 + +* Sun Jan 6 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.15 +- update to CVS HEAD (fix glibc bootstrap failure) + +* Thu Jan 3 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.14 +- update to CVS HEAD (#57907) + - fix alpha bootstrap (Richard Henderson) +- fix simplification of (div:SI (???:DI ???) (const_int 1)) + (#57916) +- add contrib/gcc_update --touch + +* Tue Jan 1 2002 Jakub Jelinek <jakub@redhat.com> 3.1-0.13 +- update to CVS HEAD (fix glibc miscompilation on alpha) +- fix objc to not emit __objc_class_name_* without type and size + +* Mon Dec 31 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.12 +- update to CVS HEAD +- fix sed commands for .la files +- make Alpha use PT_GNU_EH_FRAME + +* Thu Dec 27 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.11 +- update to CVS HEAD (#57165, #57212, #57467, #57488, #57502, + #57505, #57574) +- readd .la files after fixing them up by sed +- add %%defattr(-,root,root) to libobjc subpackage + +* Mon Dec 3 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.10 +- one more gcc.spec fix for passing --gdwarf-2 resp. --gstabs to as +- fix conditional register dead computation on IA-64 +- fix extern array of incomplete structures handling +- fix gcc -xc - +- fix Fortran ICEs with SAVE_EXPRs (Richard Kenner) + +* Tue Nov 27 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.9 +- update to CVS HEAD +- make DWARF 2 preferred debugging format on Linux + +* Mon Nov 12 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.8 +- don't ship .la files (#56072) +- include libfrtbegin.a (#56098) + +* Mon Nov 12 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.7 +- update to CVS HEAD +- back out Nov 7th loop.c change for now + +* Fri Nov 9 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.6 +- update to CVS HEAD +- frame unwind compatibility with 7.[12] binutils + +* Tue Nov 6 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.5 +- update to CVS HEAD +- merge DW_EH_PE_indirect constants and their relocs + +* Thu Oct 25 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.4 +- don't loop forever or ICE on bogus array initializers (#53704) +- fix store motion with pure calls +- disable store motion for now + +* Tue Oct 23 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.3 +- fix inlining of C nested functions with auto prototypes + +* Mon Oct 22 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.2 +- update to CVS HEAD +- tree inlining fix from Alexandre Oliva +- fix anonymous union ICE on alpha + +* Mon Oct 15 2001 Jakub Jelinek <jakub@redhat.com> 3.1-0.1 +- switch package to main compiler from alternate compiler +- update to CVS HEAD +- early gcc-2.96-RH compatibility in __frame_state_for +- change weak function tests for functions always present in GLIBC 2.2 + into simple non-weak calls in crt*.o to avoid unnecessary symbol + lookups and prelink conflicts +- don't link against libgcc_s C shared libraries + +* Tue Oct 2 2001 Jakub Jelinek <jakub@redhat.com> 3.0.1-4 +- update from CVS 3.0 branch + - ia64 function descriptors in vtables +- handle large files in Fortran (#53328) +- allow Java programs to be statically linked (#53605) +- remove #include_next patch, Benjamin commited it + +* Thu Sep 6 2001 Jakub Jelinek <jakub@redhat.com> 3.0.1-3 +- don't use #include_next in <bits/std_c*> headers (Benjamin Kosnik, #53262) + +* Wed Sep 5 2001 Jakub Jelinek <jakub@redhat.com> 3.0.1-2 +- update from CVS 3.0 branch +- check all gcc-2.96-RH patches whether they have made it into 3.0.1, + and if not, whether they are appropriate for 3.0.1 +- 8 new patches + - add 36 testcases from gcc-2.96-RH + - fix ICE on very questionable C++ code from JDK (#39858, #52960) + - fix -frepo (Nathan Sidwell, #52877) + - avoid generating bogus .stabs (#49214) + - issue a clear error message about invalid ia32 floating point + asm constraints (#27137) + - fix some comment typos + - fix ADDRESSOF recognition (#29686) + +* Mon Aug 27 2001 Jakub Jelinek <jakub@redhat.com> 3.0.1-1 +- update from CVS (3.0.1 final) +- properly handle throw() exception specifiers in template decls (#51824) +- fix IA-64 varargs handling in presence of additional anonymous arguments + (#50757) +- fix boehm-gc for prelink +- fix a typo in gcc3-c++ description (#52323) +- remove Chill from package summary (#51764) + +* Tue Aug 7 2001 Jakub Jelinek <jakub@redhat.com> 3.0-6 +- update from CVS + - fix glibc vfprintf miscompilation +- don't warn about if (&foo) if foo is weak (H.J.Lu, #50855) + +* Wed Jul 25 2001 Jakub Jelinek <jakub@redhat.com> 3.0-5 +- include libgcjgc.a in libgcj3-devel +- include libgcjgc.so.* in libgcj3 on ia64 +- remove dependency on libgcj on ia64 +- add ldconfig to libgcj3 post/postun + +* Tue Jul 24 2001 Jakub Jelinek <jakub@redhat.com> 3.0-4 +- update from CVS +- make gcc3-java/libgcj3* packages, so that they can coexist + with 2.96-RH Java +- make sure shared Java libraries are built with proper dependencies + +* Wed Jul 11 2001 Jakub Jelinek <jakub@redhat.com> 3.0-3 +- fix libgcc_s.so and libstdc++.so symlinks +- don't ship jar + +* Tue Jul 10 2001 Jakub Jelinek <jakub@redhat.com> 3.0-2 +- move libstdc++.so into gcc-lib +- add libobjc.so symlink + +* Tue Jul 10 2001 Jakub Jelinek <jakub@redhat.com> 3.0-1 +- new rpm diff --git a/patches/gcc/3.2.3/README-sh b/patches/gcc/3.2.3/README-sh new file mode 100644 index 00000000..a75042a3 --- /dev/null +++ b/patches/gcc/3.2.3/README-sh @@ -0,0 +1,16 @@ +http://mirror.sh-linux.org/rpm-2003/SRPMS/gcc-3.2.3-3.src.rpm contains the following patches: + +gcc-20030210-sh-linux-1.patch +gcc-3.2.3-libffi-1.patch +gcc-3.2.3-sh-linux-dwarf2-1.patch (*not* applied by the spec file, it's in there by accident) + +gcc-3.2.3-libffi-1.patch was needed just to build, I think. + +After that was applied, sh4 gcc seemed to compile fine, but c++ programs +failed to execute because libstdc++.so.5 was built without version +info. This was caused directly by libstdc++-v3/configure setting +SYMVER_MAP=config/linker-map.dummy because it sees that +no libgcc_s.so was generated; configure says + checking for shared libgcc... no. + +Applying gcc-20030210-sh-linux-1.patch in hopes it makes those problems go away. diff --git a/patches/gcc/3.2.3/config.sub.patch b/patches/gcc/3.2.3/config.sub.patch new file mode 100644 index 00000000..928f9115 --- /dev/null +++ b/patches/gcc/3.2.3/config.sub.patch @@ -0,0 +1,72 @@ +When configuring a s390->s390 or cris->cris crosscompiler +(ok, I haven't hit this yet, but one of these days I'll get me an account +on an s390, and then I'll need this patch :-), you'll get the +following error: + ++ /build/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/gcc-3.3/configure +--target=s390-unknown-linux-gnu --host=s390-host_unknown-linux-gnu +--prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2 +--enable-languages=c +--with-local-prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/s390- +unknown-linux-gnu --enable-threads=no --without-headers --with-newlib +--disable-shared +... +*** --with-headers is only supported when cross compiling + +This error pops up only when you're using Daniel Jacobowitz's technique +of slightly changing the target and host tuples to make them different +enough to force gcc's build system to not try to pull in system libraries +or headers. This technique is needed e.g. to build an x86 -> x86 +cross-compiler. +(The LFS developers ran into the same bug that prompted me to use +this technique; they point people who run into it to +http://linuxfromscratch.org/~greg/pure_lfs.txt, which is a different +way of avoiding this problem. I think the tuple tweak is the way to go, though.) + +config-patches@gnu.org rejected this patch, on the grounds that there +is only one vendor of each of those two architectures, so the +canonicalization is by definition correct. When I pointed out the +difficulty this causes for people building s390 -> s390 or +cris -> cris compilers that are incompatible with the system +libraries and thus must be built like cross-compilers, he grumped and said +"autoconf should let you specify a cross-compiler in some other way than +comparing tuple strings". + + + +--- gcc-3.3/config.sub.old Sun Jun 8 20:38:47 2003 ++++ gcc-3.3/config.sub Sun Jun 8 20:40:34 2003 +@@ -433,9 +433,12 @@ + crds | unos) + basic_machine=m68k-crds + ;; +- cris | cris-* | etrax*) ++ cris | etrax*) + basic_machine=cris-axis + ;; ++ cris-*) ++ basic_machine=cris-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; +@@ -820,11 +823,17 @@ + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; +- s390 | s390-*) ++ s390) + basic_machine=s390-ibm + ;; +- s390x | s390x-*) ++ s390-*) ++ basic_machine=s390-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ s390x) + basic_machine=s390x-ibm ++ ;; ++ s390x-*) ++ basic_machine=s390x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sa29200) + basic_machine=a29k-amd diff --git a/patches/gcc/3.2.3/gcc-20020722-ppc405erratum77.patch b/patches/gcc/3.2.3/gcc-20020722-ppc405erratum77.patch new file mode 100644 index 00000000..bd717f52 --- /dev/null +++ b/patches/gcc/3.2.3/gcc-20020722-ppc405erratum77.patch @@ -0,0 +1,105 @@ +# See http://gcc.gnu.org/PR7383, http://www.kegel.com/xgcc3/ppc405erratum77.html +# Fixed in gcc-3.3 + +diff -aur gcc-20020722.orig/gcc/config/rs6000/rs6000.h gcc-20020722/gcc/config/rs6000/rs6000.h +--- gcc-20020722.orig/gcc/config/rs6000/rs6000.h Thu Jul 25 09:32:21 2002 ++++ gcc-20020722/gcc/config/rs6000/rs6000.h Thu Jul 25 09:34:45 2002 +@@ -66,7 +66,7 @@ + %{mcpu=rsc1: -D_ARCH_PWR} \ + %{mcpu=401: -D_ARCH_PPC} \ + %{mcpu=403: -D_ARCH_PPC} \ +-%{mcpu=405: -D_ARCH_PPC} \ ++%{mcpu=405: -D_ARCH_PPC -D__PPC405__} \ + %{mcpu=505: -D_ARCH_PPC} \ + %{mcpu=601: -D_ARCH_PPC -D_ARCH_PWR} \ + %{mcpu=602: -D_ARCH_PPC} \ +diff -aur gcc-20020722.orig/libjava/sysdep/powerpc/locks.h gcc-20020722/libjava/sysdep/powerpc/locks.h +--- gcc-20020722.orig/libjava/sysdep/powerpc/locks.h Thu Jul 25 09:32:30 2002 ++++ gcc-20020722/libjava/sysdep/powerpc/locks.h Thu Jul 25 11:39:13 2002 +@@ -11,6 +11,17 @@ + #ifndef __SYSDEP_LOCKS_H__ + #define __SYSDEP_LOCKS_H__ + ++#ifdef __PPC405__ ++// workaround for PPC405 erratum #77 - 07/18/02 JRO, dank, NN. References: ++// http://www-3.ibm.com/chips/techlib/techlib.nsf/techdocs/89DED00DEBFF54BF87256A8000491BA2/$file/405CR_C_errata_1_2.pdf ++// http://ppc.bkbits.net:8080/linuxppc_2_4_devel/cset@1.489 ++// http://www.kegel.com/xgcc3/ppc405erratum77.html ++// FIXME: using dbct instead of sync would be faster ++#define __LIBGCJ_PPC405_ERR77_SYNC "sync \n\t" ++#else ++#define __LIBGCJ_PPC405_ERR77_SYNC ++#endif ++ + typedef size_t obj_addr_t; /* Integer type big enough for object */ + /* address. */ + +@@ -25,6 +36,7 @@ + "0: lwarx %0,0,%1 ;" + " xor. %0,%3,%0;" + " bne 1f;" ++ __LIBGCJ_PPC405_ERR77_SYNC + " stwcx. %2,0,%1;" + " bne- 0b;" + "1: " +@@ -58,6 +70,7 @@ + "0: lwarx %0,0,%1 ;" + " xor. %0,%3,%0;" + " bne 1f;" ++ __LIBGCJ_PPC405_ERR77_SYNC + " stwcx. %2,0,%1;" + " bne- 0b;" + "1: " +diff -aur gcc-20020722.orig/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h gcc-20020722/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h +--- gcc-20020722.orig/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h Thu Jul 25 09:32:31 2002 ++++ gcc-20020722/libstdc++-v3/config/cpu/powerpc/bits/atomicity.h Thu Jul 25 09:34:45 2002 +@@ -32,6 +32,17 @@ + + typedef int _Atomic_word; + ++#ifdef __PPC405__ ++// workaround for PPC405 erratum #77 - 07/18/02 JRO & dank. References: ++// http://www-3.ibm.com/chips/techlib/techlib.nsf/techdocs/89DED00DEBFF54BF87256A8000491BA2/$file/405CR_C_errata_1_2.pdf ++// http://ppc.bkbits.net:8080/linuxppc_2_4_devel/cset@1.489 ++// http://www.kegel.com/xgcc3/ppc405erratum77.html ++// FIXME: using dbct instead of sync would be faster ++#define __LIBSTDCPP_PPC405_ERR77_SYNC "sync \n\t" ++#else ++#define __LIBSTDCPP_PPC405_ERR77_SYNC ++#endif ++ + static inline _Atomic_word + __attribute__ ((__unused__)) + __exchange_and_add (volatile _Atomic_word* __mem, int __val) +@@ -42,6 +53,7 @@ + "0:\t" + "lwarx %0,0,%2 \n\t" + "add%I3 %1,%0,%3 \n\t" ++ __LIBSTDCPP_PPC405_ERR77_SYNC + "stwcx. %1,0,%2 \n\t" + "bne- 0b \n\t" + "/* End exchange & add */" +@@ -61,6 +73,7 @@ + "0:\t" + "lwarx %0,0,%1 \n\t" + "add%I2 %0,%0,%2 \n\t" ++ __LIBSTDCPP_PPC405_ERR77_SYNC + "stwcx. %0,0,%1 \n\t" + "bne- 0b \n\t" + "/* End atomic add */" +@@ -78,6 +91,7 @@ + "/* Inline always swap */\n" + "0:\t" + "lwarx %0,0,%1 \n\t" ++ __LIBSTDCPP_PPC405_ERR77_SYNC + "stwcx. %2,0,%1 \n\t" + "bne- 0b \n\t" + "/* End always swap */" +@@ -98,6 +112,7 @@ + "lwarx %0,0,%1 \n\t" + "cmpwi %0,0 \n\t" + "bne- 1f \n\t" ++ __LIBSTDCPP_PPC405_ERR77_SYNC + "stwcx. %2,0,%1 \n\t" + "bne- 0b \n" + "1:\n\t" diff --git a/patches/gcc/3.2.3/gcc-20030210-sh-linux-1.patch b/patches/gcc/3.2.3/gcc-20030210-sh-linux-1.patch new file mode 100644 index 00000000..43930785 --- /dev/null +++ b/patches/gcc/3.2.3/gcc-20030210-sh-linux-1.patch @@ -0,0 +1,1761 @@ +diff -ruN gcc-20030210.orig/boehm-gc/configure gcc-20030210/boehm-gc/configure +--- gcc-20030210.orig/boehm-gc/configure Fri Jan 31 19:17:00 2003 ++++ gcc-20030210/boehm-gc/configure Sat Feb 22 01:40:14 2003 +@@ -1922,7 +1922,7 @@ + # This must be Linux ELF. + linux-gnu*) + case $host_cpu in +- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* ) ++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM +diff -ruN gcc-20030210.orig/config-ml.in gcc-20030210/config-ml.in +--- gcc-20030210.orig/config-ml.in Fri Jan 31 19:16:59 2003 ++++ gcc-20030210/config-ml.in Sat Feb 22 01:40:14 2003 +@@ -545,6 +545,7 @@ + if [ -d ../$${dir}/$${lib} ]; then \ + flags=`echo $$i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \ + if (cd ../$${dir}/$${lib}; $(MAKE) $(FLAGS_TO_PASS) \ ++ DESTDIR="$(DESTDIR)" \ + CFLAGS="$(CFLAGS) $${flags}" \ + prefix="$(prefix)" \ + exec_prefix="$(exec_prefix)" \ +diff -ruN gcc-20030210.orig/debian/edit-specs.in gcc-20030210/debian/edit-specs.in +--- gcc-20030210.orig/debian/edit-specs.in Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/debian/edit-specs.in Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,45 @@ ++/^*asm:$/ { ++n ++c\ ++@AS_ENDIAN_FLAG@ %{mrelax:-relax} ++} ++/^*cpp:$/ { ++n ++c\ ++%(cpp_default_cpu_spec) %(subtarget_cpp_spec) %(subtarget_cpp_ptr_spec) %(subtarget_cpp_endian_spec) ++} ++/^*cc1:$/ { ++n ++c\ ++-musermode @CC1_CPU_ENDIAN_FLAGS@ %{profile:-p} ++} ++/^*link:$/ { ++n ++c\ ++%{!static:--eh-frame-hdr} @LINKER_CPU_ENDIAN_FLAGS@ @LINKER_RPATH_LINK_FLAG@ %{mrelax:-relax} %{shared:-shared} %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} %{static:-static} ++} ++/^*multilib:$/ { ++n ++c\ ++. ; ++} ++/^*multilib_matches:$/ { ++n ++c\ ++ ++} ++/^*multilib_options:$/ { ++n ++c\ ++ ++} ++/^*subtarget_cpp_endian_spec:$/ { ++n ++c\ ++@CPP_ENDIAN_DEF@ ++} ++/^*cpp_default_cpu_spec:$/ { ++n ++c\ ++@CPP_CPU_DEFS@ ++} +diff -ruN gcc-20030210.orig/debian/install-CPU-linux gcc-20030210/debian/install-CPU-linux +--- gcc-20030210.orig/debian/install-CPU-linux Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/debian/install-CPU-linux Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,111 @@ ++#! /bin/sh ++ ++VERSION=$1; shift ++CPU=$1 ++ ++# literally (binary-ly) same ++PROGS_C="cpp gcc" ++PROGS_ADDITIONAL="c++ g++ g77 gcj" ++ ++DRIVERS_C="cc1 cpp0 tradcpp0" ++DRIVERS_ADDITIONAL="cc1obj cc1plus collect2 f771 jc1 jvgenmain" ++if [ -z "$STEP1_COMPILER_BUILD" ]; then ++ PROGS="$PROGS_C $PROGS_ADDITIONAL" ++ DRIVERS="$DRIVERS_C $DRIVERSADDITIONAL" ++ INITIAL="" ++else ++ PROGS=$PROGS_C ++ DRIVERS=$DRIVERS_C ++ INITIAL="-initial" ++fi ++ ++OBJS="crtbegin.o crtbeginS.o crtend.o crtendS.o" ++LIBS_C="libgcc.a" ++LIBS_1="libgcc_s.so libgcc_s.so.1 libstdc++.so libstdc++.so.3 libstdc++.so.3.0.2" ++LIBS_2="libobjc.a libstdc++.a libsupc++.a" ++INCLUDE="include" ++ ++cd debian/gcc-sh-linux-others${INITIAL} || exit 1 ++ ++# Make directories. ++mkdir -p usr/bin usr/share usr/share/man usr/share/man/man1 usr/lib \ ++ usr/lib/gcc-lib usr/lib/gcc-lib/${CPU}-linux \ ++ usr/lib/gcc-lib/${CPU}-linux/${VERSION} \ ++ usr/${CPU}-linux usr/${CPU}-linux/lib ++ ++# Make symbolic links for include dir. ++(cd usr/${CPU}-linux; ln -s ../sh-linux/include .) ++ ++# Make symbolic links for executables. ++(cd usr/bin; ++ for p in ${PROGS}; do ++ ln -s shCPU-linux-GCC ${CPU}-linux-$p ++ done) ++ ++case "${CPU}" in ++ sh3) ++ MULTILIBDIR= ++ AS_ENDIAN_FLAG="-little" ++ CPP_ENDIAN_DEF="-D__LITTLE_ENDIAN__" ++ CPP_CPU_DEFS="-D__SH3__ -D__sh3__" ++ CC1_CPU_ENDIAN_FLAGS="-ml -m3" ++ LINKER_CPU_ENDIAN_FLAGS="-m shlelf_linux -EL --architecture sh3" ++ LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh3-linux/lib" ++ ;; ++ sh3eb) ++ MULTILIBDIR=/mb ++ AS_ENDIAN_FLAG="-big" ++ CPP_ENDIAN_DEF="-D__BIG_ENDIAN__" ++ CPP_CPU_DEFS="-D__SH3__ -D__sh3__" ++ CC1_CPU_ENDIAN_FLAGS="-mb -m3" ++ LINKER_CPU_ENDIAN_FLAGS="-m shelf_linux -EB --architecture sh3" ++ LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh3eb-linux/lib" ++ ;; ++ sh4) ++ MULTILIBDIR=/m4 ++ AS_ENDIAN_FLAG="-little" ++ CPP_ENDIAN_DEF="-D__LITTLE_ENDIAN__" ++ CPP_CPU_DEFS="-D__SH4__" ++ CC1_CPU_ENDIAN_FLAGS="-ml -m4" ++ LINKER_CPU_ENDIAN_FLAGS="-m shlelf_linux -EL --architecture sh4" ++ LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh4-linux/lib" ++ ;; ++ sh4eb) ++ MULTILIBDIR=/mb/m4 ++ AS_ENDIAN_FLAG="-big" ++ CPP_ENDIAN_DEF="-D__BIG_ENDIAN__" ++ CPP_CPU_DEFS="-D__SH4__" ++ CC1_CPU_ENDIAN_FLAGS="-mb -m4" ++ LINKER_CPU_ENDIAN_FLAGS="-m shelf_linux -EB --architecture sh4" ++ LINKER_RPATH_LINK_FLAG="-rpath-link /usr/sh4eb-linux/lib" ++ ;; ++esac ++ ++# Make symbolic links for GCC drivers, objects, libraries, and include dir. ++(cd usr/lib/gcc-lib/${CPU}-linux/${VERSION}; ++ for f in ${DRIVERS} ${INCLUDE}; do ++ ln -s ../../sh-linux/${VERSION}/$f $f; ++ done ++ for f in ${OBJS} ${LIBS_C}; do ++ ln -s ../../sh-linux/${VERSION}${MULTILIBDIR}/$f $f; ++ done) ++ ++if [ -z "$STEP1_COMPILER_BUILD" ]; then ++ for f in ${LIBS_1} ${LIBS_2}; do ++ mv ../gcc-sh-linux/usr/sh-linux/lib${MULTILIBDIR}/$f usr/${CPU}-linux/lib/; ++ done ++fi ++ ++sed -e "s+@AS_ENDIAN_FLAG@+${AS_ENDIAN_FLAG}+" \ ++ -e "s+@CPP_ENDIAN_DEF@+${CPP_ENDIAN_DEF}+" \ ++ -e "s+@CPP_CPU_DEFS@+${CPP_CPU_DEFS}+" \ ++ -e "s+@CC1_CPU_ENDIAN_FLAGS@+${CC1_CPU_ENDIAN_FLAGS}+" \ ++ -e "s+@LINKER_CPU_ENDIAN_FLAGS@+${LINKER_CPU_ENDIAN_FLAGS}+" \ ++ -e "s+@LINKER_RPATH_LINK_FLAG@+${LINKER_RPATH_LINK_FLAG}+" \ ++ ../edit-specs.in >../edit-specs-${CPU}.sed ++ ++sed -f ../edit-specs-${CPU}.sed \ ++ ../gcc-sh-linux${INITIAL}/usr/lib/gcc-lib/sh-linux/${VERSION}/specs \ ++ > usr/lib/gcc-lib/${CPU}-linux/${VERSION}/specs ++ ++exit 0 +diff -ruN gcc-20030210.orig/debian/multilib-symlink gcc-20030210/debian/multilib-symlink +--- gcc-20030210.orig/debian/multilib-symlink Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/debian/multilib-symlink Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,10 @@ ++#! /bin/sh ++ ++cd /usr/sh-linux/lib ++ln -s ../../sh3-linux/lib/{*.a,*.so*,*.o} . ++cd m4 ++ln -s ../../../sh4-linux/lib/{*.a,*.so*,*.o} . ++cd ../mb ++ln -s ../../../sh3eb-linux/lib/{*.a,*.so*,*.o} . ++cd m4 ++ln -s ../../../../sh4eb-linux/lib/{*.a,*.so*,*.o} . +diff -ruN gcc-20030210.orig/debian/shCPU-linux-GCC gcc-20030210/debian/shCPU-linux-GCC +--- gcc-20030210.orig/debian/shCPU-linux-GCC Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/debian/shCPU-linux-GCC Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,59 @@ ++#! /bin/bash ++ ++BASENAME=${0##*/} ++PROG=${BASENAME##*-} ++CPU=${BASENAME%%-*} ++ ++if [ "$PROG" = gcc ]; then ++ if [ "$1" = "-b" -a "$2" = "i386-linux" ]; then ++ shift 2 ++ exec /usr/bin/gcc "$@" ++ elif [ "$1" = "-print-multi-lib" -o "$1" = "--print-multi-lib" ]; then ++ echo ".;" ++ exit 0 ++ elif [ "$1" = "-print-multi-os-directory" -o "$1" = "--print-multi-os-directory" ]; then ++ echo "." ++ exit 0 ++ elif [ "$1" = "-dumpspecs" ]; then ++ cat /usr/lib/gcc-lib/${CPU}-linux/@@VERSION@@/specs ++ exit 0 ++ fi ++fi ++ ++case "${CPU}" in ++ sh3) ++ ARCH=m3 ++ DEFINES="-D__sh3__ -D__SH3__ -D__LITTLE_ENDIAN__" ++ ENDIAN=ml ++ ;; ++ sh3eb) ++ ARCH=m3 ++ DEFINES="-D__sh3__ -D__SH3__ -D__BIG_ENDIAN__" ++ ENDIAN=mb ++ ;; ++ sh4) ++ ARCH=m4 ++ DEFINES="-D__SH4__ -D__LITTLE_ENDIAN__" ++ ENDIAN=ml ++ ;; ++ sh4eb) ++ ARCH=m4 ++ DEFINES="-D__SH4__ -D__BIG_ENDIAN__" ++ ENDIAN=mb ++ ;; ++esac ++ ++# Prepend the appropriate options ++# If user specifies some options, it will be overridden ++ ++case "${PROG}" in ++ cpp) ++ exec sh-linux-${PROG} $DEFINES "$@" ++ ;; ++ c++|g++|g77|gcc|gcj) ++ exec sh-linux-${PROG} -$ARCH -$ENDIAN "$@" ++ ;; ++esac ++ ++echo "Something wrong..." ++exit 1 +diff -ruN gcc-20030210.orig/gcc/config/sh/elf.h gcc-20030210/gcc/config/sh/elf.h +--- gcc-20030210.orig/gcc/config/sh/elf.h Fri Feb 22 01:42:28 2002 ++++ gcc-20030210/gcc/config/sh/elf.h Sat Feb 22 01:40:14 2003 +@@ -170,3 +170,7 @@ + #undef ENDFILE_SPEC + #define ENDFILE_SPEC \ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" ++ ++/* ASM_OUTPUT_CASE_LABEL is defined in elfos.h. With it, ++ redundant .align will be generated. */ ++#undef ASM_OUTPUT_CASE_LABEL +diff -ruN gcc-20030210.orig/gcc/config/sh/lib1funcs.asm gcc-20030210/gcc/config/sh/lib1funcs.asm +--- gcc-20030210.orig/gcc/config/sh/lib1funcs.asm Fri Feb 22 01:42:28 2002 ++++ gcc-20030210/gcc/config/sh/lib1funcs.asm Sat Feb 22 01:40:14 2003 +@@ -39,8 +39,13 @@ + + #ifdef __ELF__ + #define LOCAL(X) .L_##X ++#define FUNC(X) .type X,@function; .hidden X ++#define _ENDFUNC(X) .Lfe_##X: .size X,.Lfe_##X-X ++#define ENDFUNC(X) _ENDFUNC(X) + #else + #define LOCAL(X) L_##X ++#define FUNC(X) ++#define ENDFUNC(X) + #endif + + #ifdef __linux__ +@@ -91,6 +96,40 @@ + .global GLOBAL(ashiftrt_r4_31) + .global GLOBAL(ashiftrt_r4_32) + ++ FUNC(GLOBAL(ashiftrt_r4_0)) ++ FUNC(GLOBAL(ashiftrt_r4_1)) ++ FUNC(GLOBAL(ashiftrt_r4_2)) ++ FUNC(GLOBAL(ashiftrt_r4_3)) ++ FUNC(GLOBAL(ashiftrt_r4_4)) ++ FUNC(GLOBAL(ashiftrt_r4_5)) ++ FUNC(GLOBAL(ashiftrt_r4_6)) ++ FUNC(GLOBAL(ashiftrt_r4_7)) ++ FUNC(GLOBAL(ashiftrt_r4_8)) ++ FUNC(GLOBAL(ashiftrt_r4_9)) ++ FUNC(GLOBAL(ashiftrt_r4_10)) ++ FUNC(GLOBAL(ashiftrt_r4_11)) ++ FUNC(GLOBAL(ashiftrt_r4_12)) ++ FUNC(GLOBAL(ashiftrt_r4_13)) ++ FUNC(GLOBAL(ashiftrt_r4_14)) ++ FUNC(GLOBAL(ashiftrt_r4_15)) ++ FUNC(GLOBAL(ashiftrt_r4_16)) ++ FUNC(GLOBAL(ashiftrt_r4_17)) ++ FUNC(GLOBAL(ashiftrt_r4_18)) ++ FUNC(GLOBAL(ashiftrt_r4_19)) ++ FUNC(GLOBAL(ashiftrt_r4_20)) ++ FUNC(GLOBAL(ashiftrt_r4_21)) ++ FUNC(GLOBAL(ashiftrt_r4_22)) ++ FUNC(GLOBAL(ashiftrt_r4_23)) ++ FUNC(GLOBAL(ashiftrt_r4_24)) ++ FUNC(GLOBAL(ashiftrt_r4_25)) ++ FUNC(GLOBAL(ashiftrt_r4_26)) ++ FUNC(GLOBAL(ashiftrt_r4_27)) ++ FUNC(GLOBAL(ashiftrt_r4_28)) ++ FUNC(GLOBAL(ashiftrt_r4_29)) ++ FUNC(GLOBAL(ashiftrt_r4_30)) ++ FUNC(GLOBAL(ashiftrt_r4_31)) ++ FUNC(GLOBAL(ashiftrt_r4_32)) ++ + .align 1 + GLOBAL(ashiftrt_r4_32): + GLOBAL(ashiftrt_r4_31): +@@ -170,6 +209,41 @@ + GLOBAL(ashiftrt_r4_0): + rts + nop ++ ++ ENDFUNC(GLOBAL(ashiftrt_r4_0)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_1)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_2)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_3)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_4)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_5)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_6)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_7)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_8)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_9)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_10)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_11)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_12)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_13)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_14)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_15)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_16)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_17)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_18)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_19)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_20)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_21)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_22)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_23)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_24)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_25)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_26)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_27)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_28)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_29)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_30)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_31)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_32)) ++ + #endif + + #ifdef L_ashiftrt_n +@@ -192,6 +266,7 @@ + ! + + .global GLOBAL(ashrsi3) ++ FUNC(GLOBAL(ashrsi3)) + .align 2 + GLOBAL(ashrsi3): + mov #31,r0 +@@ -319,6 +394,8 @@ + rts + nop + ++ ENDFUNC(GLOBAL(ashrsi3)) ++ + #endif + + #ifdef L_ashiftlt +@@ -340,6 +417,7 @@ + ! (none) + ! + .global GLOBAL(ashlsi3) ++ FUNC(GLOBAL(ashlsi3)) + .align 2 + GLOBAL(ashlsi3): + mov #31,r0 +@@ -476,6 +554,8 @@ + rts + nop + ++ ENDFUNC(GLOBAL(ashlsi3)) ++ + #endif + + #ifdef L_lshiftrt +@@ -497,6 +577,7 @@ + ! (none) + ! + .global GLOBAL(lshrsi3) ++ FUNC(GLOBAL(lshrsi3)) + .align 2 + GLOBAL(lshrsi3): + mov #31,r0 +@@ -633,6 +714,8 @@ + rts + nop + ++ ENDFUNC(GLOBAL(lshrsi3)) ++ + #endif + + #ifdef L_movstr +@@ -649,76 +732,113 @@ + add #64,r4 + .align 4 + .global GLOBAL(movstrSI64) ++ FUNC(GLOBAL(movstrSI64)) + GLOBAL(movstrSI64): + mov.l @(60,r5),r0 + mov.l r0,@(60,r4) + .global GLOBAL(movstrSI60) ++ FUNC(GLOBAL(movstrSI60)) + GLOBAL(movstrSI60): + mov.l @(56,r5),r0 + mov.l r0,@(56,r4) + .global GLOBAL(movstrSI56) ++ FUNC(GLOBAL(movstrSI56)) + GLOBAL(movstrSI56): + mov.l @(52,r5),r0 + mov.l r0,@(52,r4) + .global GLOBAL(movstrSI52) ++ FUNC(GLOBAL(movstrSI52)) + GLOBAL(movstrSI52): + mov.l @(48,r5),r0 + mov.l r0,@(48,r4) + .global GLOBAL(movstrSI48) ++ FUNC(GLOBAL(movstrSI48)) + GLOBAL(movstrSI48): + mov.l @(44,r5),r0 + mov.l r0,@(44,r4) + .global GLOBAL(movstrSI44) ++ FUNC(GLOBAL(movstrSI44)) + GLOBAL(movstrSI44): + mov.l @(40,r5),r0 + mov.l r0,@(40,r4) + .global GLOBAL(movstrSI40) ++ FUNC(GLOBAL(movstrSI40)) + GLOBAL(movstrSI40): + mov.l @(36,r5),r0 + mov.l r0,@(36,r4) + .global GLOBAL(movstrSI36) ++ FUNC(GLOBAL(movstrSI36)) + GLOBAL(movstrSI36): + mov.l @(32,r5),r0 + mov.l r0,@(32,r4) + .global GLOBAL(movstrSI32) ++ FUNC(GLOBAL(movstrSI32)) + GLOBAL(movstrSI32): + mov.l @(28,r5),r0 + mov.l r0,@(28,r4) + .global GLOBAL(movstrSI28) ++ FUNC(GLOBAL(movstrSI28)) + GLOBAL(movstrSI28): + mov.l @(24,r5),r0 + mov.l r0,@(24,r4) + .global GLOBAL(movstrSI24) ++ FUNC(GLOBAL(movstrSI24)) + GLOBAL(movstrSI24): + mov.l @(20,r5),r0 + mov.l r0,@(20,r4) + .global GLOBAL(movstrSI20) ++ FUNC(GLOBAL(movstrSI20)) + GLOBAL(movstrSI20): + mov.l @(16,r5),r0 + mov.l r0,@(16,r4) + .global GLOBAL(movstrSI16) ++ FUNC(GLOBAL(movstrSI16)) + GLOBAL(movstrSI16): + mov.l @(12,r5),r0 + mov.l r0,@(12,r4) + .global GLOBAL(movstrSI12) ++ FUNC(GLOBAL(movstrSI12)) + GLOBAL(movstrSI12): + mov.l @(8,r5),r0 + mov.l r0,@(8,r4) + .global GLOBAL(movstrSI8) ++ FUNC(GLOBAL(movstrSI8)) + GLOBAL(movstrSI8): + mov.l @(4,r5),r0 + mov.l r0,@(4,r4) + .global GLOBAL(movstrSI4) ++ FUNC(GLOBAL(movstrSI4)) + GLOBAL(movstrSI4): + mov.l @(0,r5),r0 + mov.l r0,@(0,r4) ++ .global GLOBAL(movstrSI0) ++ FUNC(GLOBAL(movstrSI0)) + GLOBAL(movstrSI0): + rts + nop + ++ ENDFUNC(GLOBAL(movstrSI64)) ++ ENDFUNC(GLOBAL(movstrSI60)) ++ ENDFUNC(GLOBAL(movstrSI56)) ++ ENDFUNC(GLOBAL(movstrSI52)) ++ ENDFUNC(GLOBAL(movstrSI48)) ++ ENDFUNC(GLOBAL(movstrSI44)) ++ ENDFUNC(GLOBAL(movstrSI40)) ++ ENDFUNC(GLOBAL(movstrSI36)) ++ ENDFUNC(GLOBAL(movstrSI32)) ++ ENDFUNC(GLOBAL(movstrSI28)) ++ ENDFUNC(GLOBAL(movstrSI24)) ++ ENDFUNC(GLOBAL(movstrSI20)) ++ ENDFUNC(GLOBAL(movstrSI16)) ++ ENDFUNC(GLOBAL(movstrSI12)) ++ ENDFUNC(GLOBAL(movstrSI8)) ++ ENDFUNC(GLOBAL(movstrSI4)) ++ ENDFUNC(GLOBAL(movstrSI0)) ++ + .align 4 + + .global GLOBAL(movstr) ++ FUNC(GLOBAL(movstr)) + GLOBAL(movstr): + mov.l @(60,r5),r0 + mov.l r0,@(60,r4) +@@ -775,6 +895,8 @@ + add #64,r5 + bra GLOBAL(movstr) + add #64,r4 ++ ++ FUNC(GLOBAL(movstr)) + #endif + + #ifdef L_movstr_i4 +@@ -783,6 +905,10 @@ + .global GLOBAL(movstr_i4_odd) + .global GLOBAL(movstrSI12_i4) + ++ FUNC(GLOBAL(movstr_i4_even)) ++ FUNC(GLOBAL(movstr_i4_odd)) ++ FUNC(GLOBAL(movstrSI12_i4)) ++ + .p2align 5 + L_movstr_2mod4_end: + mov.l r0,@(16,r4) +@@ -791,6 +917,11 @@ + + .p2align 2 + ++GLOBAL(movstr_i4_even): ++ mov.l @r5+,r0 ++ bra L_movstr_start_even ++ mov.l @r5+,r1 ++ + GLOBAL(movstr_i4_odd): + mov.l @r5+,r1 + add #-4,r4 +@@ -817,10 +948,8 @@ + rts + mov.l r3,@(12,r4) + +-GLOBAL(movstr_i4_even): +- mov.l @r5+,r0 +- bra L_movstr_start_even +- mov.l @r5+,r1 ++ ENDFUNC(GLOBAL(movstr_i4_even)) ++ ENDFUNC(GLOBAL(movstr_i4_odd)) + + .p2align 4 + GLOBAL(movstrSI12_i4): +@@ -831,12 +960,16 @@ + mov.l r1,@(4,r4) + rts + mov.l r2,@(8,r4) ++ ++ ENDFUNC(GLOBAL(movstrSI12_i4)) ++ + #endif + + #ifdef L_mulsi3 + + + .global GLOBAL(mulsi3) ++ FUNC(GLOBAL(mulsi3)) + + ! r4 = aabb + ! r5 = ccdd +@@ -869,7 +1002,7 @@ + rts + add r2,r0 + +- ++ FUNC(GLOBAL(mulsi3)) + #endif + #endif /* ! __SH5__ */ + #ifdef L_sdivsi3_i4 +@@ -879,6 +1012,7 @@ + !! args in r4 and r5, result in fpul, clobber dr0, dr2 + + .global GLOBAL(sdivsi3_i4) ++ FUNC(GLOBAL(sdivsi3_i4)) + GLOBAL(sdivsi3_i4): + lds r4,fpul + float fpul,dr0 +@@ -888,6 +1022,8 @@ + rts + ftrc dr0,fpul + ++ ENDFUNC(GLOBAL(sdivsi3_i4)) ++ + #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__) + !! args in r4 and r5, result in fpul, clobber r2, dr0, dr2 + +@@ -896,6 +1032,7 @@ + .mode SHcompact + #endif + .global GLOBAL(sdivsi3_i4) ++ FUNC(GLOBAL(sdivsi3_i4)) + GLOBAL(sdivsi3_i4): + sts.l fpscr,@-r15 + mov #8,r2 +@@ -910,6 +1047,8 @@ + rts + lds.l @r15+,fpscr + ++ ENDFUNC(GLOBAL(sdivsi3_i4)) ++ + #endif /* ! __SH5__ || __SH5__ == 32 */ + #endif /* ! __SH4__ */ + #endif +@@ -924,9 +1063,10 @@ + !! + !! + +-!! args in r4 and r5, result in r0 clobber r1,r2,r3 ++!! args in r4 and r5, result in r0 clobber r1, r2, r3, and t bit + + .global GLOBAL(sdivsi3) ++ FUNC(GLOBAL(sdivsi3)) + #if __SHMEDIA__ + #if __SH5__ == 32 + .section .text..SHmedia32,"ax" +@@ -1076,6 +1216,7 @@ + div0: rts + mov #0,r0 + ++ ENDFUNC(GLOBAL(sdivsi3)) + #endif /* ! __SHMEDIA__ */ + #endif /* ! __SH4__ */ + #endif +@@ -1084,9 +1225,11 @@ + .title "SH DIVIDE" + !! 4 byte integer Divide code for the Hitachi SH + #ifdef __SH4__ +-!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4 ++!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4, ++!! and t bit + + .global GLOBAL(udivsi3_i4) ++ FUNC(GLOBAL(udivsi3_i4)) + GLOBAL(udivsi3_i4): + mov #1,r1 + cmp/hi r1,r5 +@@ -1127,6 +1270,8 @@ + L1: + .double 2147483648 + ++ ENDFUNC(GLOBAL(udivsi3_i4)) ++ + #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__) + !! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4 + +@@ -1135,6 +1280,7 @@ + .mode SHcompact + #endif + .global GLOBAL(udivsi3_i4) ++ FUNC(GLOBAL(udivsi3_i4)) + GLOBAL(udivsi3_i4): + mov #1,r1 + cmp/hi r1,r5 +@@ -1183,6 +1329,8 @@ + #endif + .double 2147483648 + ++ ENDFUNC(GLOBAL(udivsi3_i4)) ++ + #endif /* ! __SH5__ || __SH5__ == 32 */ + #endif /* ! __SH4__ */ + #endif +@@ -1199,6 +1347,7 @@ + + !! args in r4 and r5, result in r0, clobbers r4, pr, and t bit + .global GLOBAL(udivsi3) ++ FUNC(GLOBAL(udivsi3)) + + #if __SHMEDIA__ + #if __SH5__ == 32 +@@ -1299,6 +1448,8 @@ + ret: rts + mov r4,r0 + ++ ENDFUNC(GLOBAL(udivsi3)) ++ + #endif /* ! __SHMEDIA__ */ + #endif /* __SH4__ */ + #endif +@@ -1308,6 +1459,7 @@ + .mode SHcompact + #endif + .global GLOBAL(set_fpscr) ++ FUNC(GLOBAL(set_fpscr)) + GLOBAL(set_fpscr): + lds r4,fpscr + mov.l LOCAL(set_fpscr_L1),r1 +@@ -1340,11 +1492,16 @@ + .align 2 + LOCAL(set_fpscr_L1): + .long GLOBAL(fpscr_values) ++ ++ ENDFUNC(GLOBAL(set_fpscr)) ++ ++#ifndef NO_FPSCR_VALUES + #ifdef __ELF__ + .comm GLOBAL(fpscr_values),8,4 + #else + .comm GLOBAL(fpscr_values),8 + #endif /* ELF */ ++#endif /* NO_FPSCR_VALUES */ + #endif /* SH3E / SH4 */ + #endif /* L_set_fpscr */ + #ifdef L_ic_invalidate +@@ -1360,6 +1517,7 @@ + blink tr0, r63 + #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) + .global GLOBAL(ic_invalidate) ++ FUNC(GLOBAL(ic_invalidate)) + GLOBAL(ic_invalidate): + ocbwb @r4 + mova 0f,r0 +@@ -1382,6 +1540,9 @@ + nop + .endr + .endr ++ ++ ENDFUNC(GLOBAL(ic_invalidate)) ++ + #endif /* SH4 */ + #endif /* L_ic_invalidate */ + +diff -ruN gcc-20030210.orig/gcc/config/sh/libgcc-glibc.ver gcc-20030210/gcc/config/sh/libgcc-glibc.ver +--- gcc-20030210.orig/gcc/config/sh/libgcc-glibc.ver Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/gcc/config/sh/libgcc-glibc.ver Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,21 @@ ++# In order to work around the very problems that force us to now generally ++# create a libgcc.so, glibc reexported a number of routines from libgcc.a. ++# By now choosing the same version tags for these specific routines, we ++# maintain enough binary compatibility to allow future versions of glibc ++# to defer implementation of these routines to libgcc.so via DT_AUXILIARY. ++ ++# Note that we cannot use the default libgcc-glibc.ver file on sh, ++# because GLIBC_2.0 does not exist on this architecture, as the first ++# ever glibc release on the platform was GLIBC_2.2. ++ ++%inherit GCC_3.0 GLIBC_2.2 ++GLIBC_2.2 { ++ __register_frame ++ __register_frame_table ++ __deregister_frame ++ __register_frame_info ++ __deregister_frame_info ++ __frame_state_for ++ __register_frame_info_table ++} ++ +diff -ruN gcc-20030210.orig/gcc/config/sh/linux.h gcc-20030210/gcc/config/sh/linux.h +--- gcc-20030210.orig/gcc/config/sh/linux.h Tue Apr 16 05:27:42 2002 ++++ gcc-20030210/gcc/config/sh/linux.h Sat Feb 22 01:40:14 2003 +@@ -19,6 +19,10 @@ + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + ++/* We're not SYSVR4, not having /usr/ccs */ ++#undef MD_EXEC_PREFIX ++#undef MD_STARTFILE_PREFIX ++ + /* Run-time Target Specification. */ + #undef TARGET_VERSION + #define TARGET_VERSION fputs (" (SH GNU/Linux with ELF)", stderr); +@@ -39,6 +43,28 @@ + #undef WCHAR_TYPE_SIZE + #define WCHAR_TYPE_SIZE BITS_PER_WORD + ++/* This was defined in linux.h. Define it here also. */ ++#undef DEFAULT_VTABLE_THUNKS ++#define DEFAULT_VTABLE_THUNKS 1 ++ ++/* Likewise. */ ++#define HANDLE_PRAGMA_PACK_PUSH_POP ++ ++/* Pick up the return address upon entry to a procedure. Used for ++ dwarf2 unwind information. This also enables the table driven ++ mechanism. */ ++ ++#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, PR_REG) ++#define DWARF_FRAME_RETURN_COLUMN DWARF_FRAME_REGNUM (PR_REG) ++ ++#undef CPP_SPEC ++#define CPP_SPEC "\ ++ %{m4:-D__SH4__} \ ++ %{!m4:%(cpp_default_cpu_spec)} \ ++ %(subtarget_cpp_spec) \ ++ %(subtarget_cpp_ptr_spec) \ ++ %(subtarget_cpp_endian_spec) " ++ + #undef SUBTARGET_CPP_SPEC + #define SUBTARGET_CPP_SPEC "\ + %{fPIC:-D__PIC__ -D__pic__} \ +@@ -55,36 +81,45 @@ + #undef CPP_DEFAULT_CPU_SPEC + #define CPP_DEFAULT_CPU_SPEC "-D__SH3__ -D__sh3__" + +- + #undef CPP_PREDEFINES + #define CPP_PREDEFINES "-D__ELF__ -Dunix -D__sh__ -D__gnu_linux__ -Dlinux -Asystem=posix" + ++/* The GNU C++ standard library requires that these macros be defined. */ ++#undef CPLUSPLUS_CPP_SPEC ++#define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)" ++ + #undef ASM_SPEC +-#define ASM_SPEC "%{!mb:-little} %{mrelax:-relax}" ++#define ASM_SPEC "%{mb:-big} %{!mb:-little} %{mrelax:-relax}" + + #undef CC1_SPEC + #define CC1_SPEC \ +- "-musermode %{!mb:-ml} %{!m3e:%{!m4:-m3}}" +- +-#undef CC1PLUS_SPEC +-#define CC1PLUS_SPEC \ +- "-musermode %{!mb:-ml} %{!m3e:%{!m4:-m3}}" ++ "-musermode %{!mb:-ml} %{!m4:-m3} %{profile:-p}" + ++/* XXX: It's wrong if prefix != /usr */ + #undef LINK_SPEC + #define LINK_SPEC \ +- "%{!mb:-m shlelf_linux} %{mrelax:-relax} \ ++ "%{!mb:-m shlelf_linux -EL} %{mb:-m shelf_linux -EB} %{mrelax:-relax} \ + %{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ +- %{!rpath:-rpath /lib}} \ ++ %{!mb:%{!m4:-rpath-link /usr/sh-linux/lib }} \ ++ %{!mb:%{m4:-rpath-link /usr/sh-linux/lib/m4 }} \ ++ %{mb:%{!m4:-rpath-link /usr/sh-linux/lib/mb }} \ ++ %{mb:%{m4:-rpath-link /usr/sh-linux/lib/mb/m4 }}} \ + %{static:-static}" + + #undef LIB_SPEC ++#undef LIB_SPEC + #define LIB_SPEC \ + "%{shared: -lc} \ +- %{!shared: %{pthread:-lthread} \ +- %{profile:-lc_p} %{!profile: -lc}}" ++ %{!shared: %{mieee:-lieee} %{pthread:-lpthread} \ ++ %{profile:-lc_p} %{!profile: -lc}}" ++ ++#if defined(HAVE_LD_EH_FRAME_HDR) ++#undef LINK_EH_SPEC ++#define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " ++#endif + + #undef STARTFILE_SPEC + #define STARTFILE_SPEC \ +@@ -92,4 +127,40 @@ + %{pg:gcrt1.o%s} %{!pg:%{p:gcrt1.o%s} \ + %{!p:%{profile:gcrt1.o%s} \ + %{!profile:crt1.o%s}}}} \ +- crti.o%s %{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}" ++ crti.o%s %{static:crtbeginT.o%s}\ ++ %{!static:%{!shared:crtbegin.o%s} %{shared:crtbeginS.o%s}}" ++ ++#undef FUNCTION_PROFILER ++#define FUNCTION_PROFILER(STREAM,LABELNO) \ ++do \ ++{ \ ++ if (flag_pic) \ ++ { \ ++ fprintf (STREAM, " mov.l 3f,r1\n"); \ ++ fprintf (STREAM, " mova 3f,r0\n"); \ ++ fprintf (STREAM, " add r1,r0\n"); \ ++ fprintf (STREAM, " mov.l 1f,r1\n"); \ ++ fprintf (STREAM, " mov.l @(r0,r1),r1\n"); \ ++ } \ ++ else \ ++ { \ ++ fprintf (STREAM, " mov.l 1f,r1\n"); \ ++ } \ ++ fprintf (STREAM, " sts.l pr,@-r15\n"); \ ++ fprintf (STREAM, " mova 2f,r0\n"); \ ++ fprintf (STREAM, " jmp @r1\n"); \ ++ fprintf (STREAM, " lds r0,pr\n"); \ ++ fprintf (STREAM, " .align 2\n"); \ ++ if (flag_pic) \ ++ { \ ++ fprintf (STREAM, "1: .long mcount@GOT\n"); \ ++ fprintf (STREAM, "3: .long _GLOBAL_OFFSET_TABLE_\n"); \ ++ } \ ++ else \ ++ { \ ++ fprintf (STREAM, "1: .long mcount\n"); \ ++ } \ ++ fprintf (STREAM, "2: lds.l @r15+,pr\n"); \ ++} while (0) ++ ++#define NO_SHARED_LIBGCC_MULTILIB +diff -ruN gcc-20030210.orig/gcc/config/sh/sh-protos.h gcc-20030210/gcc/config/sh/sh-protos.h +--- gcc-20030210.orig/gcc/config/sh/sh-protos.h Fri Feb 22 01:42:28 2002 ++++ gcc-20030210/gcc/config/sh/sh-protos.h Sat Feb 22 01:40:14 2003 +@@ -74,6 +74,7 @@ + extern int shl_sext_length PARAMS ((rtx)); + extern int gen_shl_sext PARAMS ((rtx, rtx, rtx, rtx)); + extern rtx gen_datalabel_ref PARAMS ((rtx)); ++extern int shl_casesi_worker_length PARAMS ((rtx)); + extern int regs_used PARAMS ((rtx, int)); + extern void fixup_addr_diff_vecs PARAMS ((rtx)); + extern int get_dest_uid PARAMS ((rtx, int)); +diff -ruN gcc-20030210.orig/gcc/config/sh/sh.c gcc-20030210/gcc/config/sh/sh.c +--- gcc-20030210.orig/gcc/config/sh/sh.c Fri Feb 22 01:42:28 2002 ++++ gcc-20030210/gcc/config/sh/sh.c Sat Feb 22 01:40:14 2003 +@@ -2143,6 +2143,48 @@ + return sym; + } + ++ ++/* Function to be used in the length attribute of the casesi_worker ++ instruction. Returns number of instructions, which is half of the ++ length of bytes. */ ++ ++int ++shl_casesi_worker_length (insn) ++ rtx insn; ++{ ++ rtx set_src, label; ++ rtx diff_vec; ++ ++ set_src = SET_SRC (XVECEXP (PATTERN (insn), 0, 0)); ++ if (!(GET_CODE (set_src) == UNSPEC ++ && XINT (set_src, 1) == UNSPEC_CASESI)) ++ abort (); ++ ++ label = XVECEXP (set_src, 0, 2); ++ if (GET_CODE (label) != LABEL_REF) ++ abort (); ++ ++ diff_vec = PATTERN (next_real_insn (XEXP (label, 0))); ++ ++ if (GET_CODE (diff_vec) != ADDR_DIFF_VEC) ++ abort (); ++ ++ switch (GET_MODE (diff_vec)) ++ { ++ case SImode: ++ return 2; ++ case HImode: ++ if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned) ++ return 3; ++ return 2; ++ case QImode: ++ if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned) ++ return 2; ++ return 1; ++ default: ++ abort (); ++ } ++} + + /* The SH cannot load a large constant into a register, constants have to + come from a pc relative load. The reference of a pc relative load +@@ -3190,7 +3232,7 @@ + vec_lab = XEXP (XEXP (pat, 0), 0); + + /* Search the matching casesi_jump_2. */ +- for (prev = vec_lab; ; prev = PREV_INSN (prev)) ++ for (prev = vec_lab; prev; prev = PREV_INSN (prev)) + { + if (GET_CODE (prev) != JUMP_INSN) + continue; +@@ -3205,6 +3247,13 @@ + break; + } + ++ if (prev == NULL) ++ { /* Switch statement has been optimized out. */ ++ delete_insn (PREV_INSN (insn)); ++ delete_insn (insn); ++ continue; ++ } ++ + /* Emit the reference label of the braf where it belongs, right after + the casesi_jump_2 (i.e. braf). */ + braf_label = XEXP (XEXP (SET_SRC (XVECEXP (prevpat, 0, 0)), 1), 0); +@@ -3223,7 +3272,7 @@ + rtx barrier_or_label; + { + rtx next = next_real_insn (barrier_or_label), pat, prev; +- int slot, credit, jump_to_next; ++ int slot, credit, jump_to_next = 0; + + if (! next) + return 0; +@@ -4507,7 +4556,8 @@ + if (current_function_varargs || current_function_stdarg) + { + /* This is not used by the SH3E calling convention */ +- if (TARGET_SH1 && ! TARGET_SH3E && ! TARGET_SH5 && ! TARGET_HITACHI) ++ if (TARGET_SH1 && ! TARGET_SH3E && ! TARGET_SH5 && ! TARGET_HITACHI ++ || TARGET_NO_IMPLICIT_FP) + { + /* Push arg regs as if they'd been provided by caller in stack. */ + for (i = 0; i < NPARM_REGS(SImode); i++) +@@ -5149,7 +5199,8 @@ + tree f_next_o, f_next_o_limit, f_next_fp, f_next_fp_limit, f_next_stack; + tree record; + +- if (TARGET_SH5 || (! TARGET_SH3E && ! TARGET_SH4) || TARGET_HITACHI) ++ if (TARGET_SH5 || (! TARGET_SH3E && ! TARGET_SH4) || TARGET_HITACHI ++ || TARGET_NO_IMPLICIT_FP) + return ptr_type_node; + + record = make_node (RECORD_TYPE); +@@ -5211,7 +5262,8 @@ + return; + } + +- if ((! TARGET_SH3E && ! TARGET_SH4) || TARGET_HITACHI) ++ if ((! TARGET_SH3E && ! TARGET_SH4) ++ || TARGET_HITACHI || TARGET_NO_IMPLICIT_FP) + { + std_expand_builtin_va_start (stdarg_p, valist, nextarg); + return; +@@ -5289,7 +5341,8 @@ + rsize = (size + UNITS_PER_WORD - 1) & -UNITS_PER_WORD; + pptr_type_node = build_pointer_type (ptr_type_node); + +- if (! TARGET_SH5 && (TARGET_SH3E || TARGET_SH4) && ! TARGET_HITACHI) ++ if (! TARGET_SH5 && (TARGET_SH3E || TARGET_SH4) ++ && ! TARGET_HITACHI && ! TARGET_NO_IMPLICIT_FP) + { + tree f_next_o, f_next_o_limit, f_next_fp, f_next_fp_limit, f_next_stack; + tree next_o, next_o_limit, next_fp, next_fp_limit, next_stack; +diff -ruN gcc-20030210.orig/gcc/config/sh/sh.h gcc-20030210/gcc/config/sh/sh.h +--- gcc-20030210.orig/gcc/config/sh/sh.h Fri Feb 22 01:42:28 2002 ++++ gcc-20030210/gcc/config/sh/sh.h Sat Feb 22 01:40:14 2003 +@@ -147,10 +147,10 @@ + #define HARD_SH4_BIT (1<<5) + #define FPU_SINGLE_BIT (1<<7) + #define SH4_BIT (1<<12) ++#define NO_IMPLICIT_FP_BIT (1<<3) + #define FMOVD_BIT (1<<4) + #define SH5_BIT (1<<0) + #define SPACE_BIT (1<<13) +-#define BIGTABLE_BIT (1<<14) + #define RELAX_BIT (1<<15) + #define USERMODE_BIT (1<<16) + #define HITACHI_BIT (1<<22) +@@ -205,6 +205,9 @@ + /* Nonzero if we should generate code for a SH5 CPU (either ISA). */ + #define TARGET_SH5 (target_flags & SH5_BIT) + ++/* Nonzero if we should not use FPU implicitly. */ ++#define TARGET_NO_IMPLICIT_FP (target_flags & NO_IMPLICIT_FP_BIT) ++ + /* Nonzero if we should generate code using the SHcompact instruction + set and 32-bit ABI. */ + #define TARGET_SHCOMPACT (TARGET_SH5 && TARGET_SH1) +@@ -225,6 +228,7 @@ + + /* Nonzero if we should generate code using SHmedia FPU instructions. */ + #define TARGET_SHMEDIA_FPU (TARGET_SHMEDIA && TARGET_FPU_DOUBLE) ++ + /* Nonzero if we should generate fmovd. */ + #define TARGET_FMOVD (target_flags & FMOVD_BIT) + +@@ -234,9 +238,6 @@ + /* Nonzero if we should generate smaller code rather than faster code. */ + #define TARGET_SMALLCODE (target_flags & SPACE_BIT) + +-/* Nonzero to use long jump tables. */ +-#define TARGET_BIGTABLE (target_flags & BIGTABLE_BIT) +- + /* Nonzero to generate pseudo-ops needed by the assembler and linker + to do function call relaxing. */ + #define TARGET_RELAX (target_flags & RELAX_BIT) +@@ -297,7 +298,6 @@ + {"5-compact-nofpu", TARGET_NONE, "" }, \ + {"5-compact-nofpu", SH5_BIT|SH3_BIT|SH2_BIT|SH1_BIT, "Generate FPU-less SHcompact code" }, \ + {"b", -LITTLE_ENDIAN_BIT, "" }, \ +- {"bigtable", BIGTABLE_BIT, "" }, \ + {"dalign", DALIGN_BIT, "" }, \ + {"fmovd", FMOVD_BIT, "" }, \ + {"hitachi", HITACHI_BIT, "" }, \ +@@ -306,6 +306,7 @@ + {"isize", ISIZE_BIT, "" }, \ + {"l", LITTLE_ENDIAN_BIT, "" }, \ + {"no-ieee", -IEEE_BIT, "" }, \ ++ {"no-implicit-fp", NO_IMPLICIT_FP_BIT, "" }, \ + {"padstruct", PADSTRUCT_BIT, "" }, \ + {"prefergot", PREFERGOT_BIT, "" }, \ + {"relax", RELAX_BIT, "" }, \ +@@ -2493,16 +2494,22 @@ + goto LABEL; \ + } + ++extern int optimize; /* needed for gen_casesi. */ ++extern int optimize_size; ++ + /* Specify the machine mode that this machine uses + for the index in the tablejump instruction. */ +-#define CASE_VECTOR_MODE (TARGET_BIGTABLE ? SImode : HImode) ++#define CASE_VECTOR_MODE SImode + + #define CASE_VECTOR_SHORTEN_MODE(MIN_OFFSET, MAX_OFFSET, BODY) \ + ((MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 127 \ + ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 0, QImode) \ + : (MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 255 \ + ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 1, QImode) \ +- : (MIN_OFFSET) >= -32768 && (MAX_OFFSET) <= 32767 ? HImode \ ++ : (MIN_OFFSET) >= -32768 && (MAX_OFFSET) <= 32767 \ ++ ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 0, HImode) \ ++ : optimize_size && (MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 65535 \ ++ ? (ADDR_DIFF_VEC_FLAGS (BODY).offset_unsigned = 1, HImode) \ + : SImode) + + /* Define as C expression which evaluates to nonzero if the tablejump +@@ -3038,10 +3045,7 @@ + /* Output an absolute table element. */ + + #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM,VALUE) \ +- if (TARGET_BIGTABLE) \ +- asm_fprintf ((STREAM), "\t.long\t%LL%d\n", (VALUE)); \ +- else \ +- asm_fprintf ((STREAM), "\t.word\t%LL%d\n", (VALUE)); \ ++ asm_fprintf ((STREAM), "\t.long\t%LL%d\n", (VALUE)) + + /* Output various types of constants. */ + +@@ -3167,8 +3171,6 @@ + #define sh_cpu_attr ((enum attr_cpu)sh_cpu) + extern enum processor_type sh_cpu; + +-extern int optimize; /* needed for gen_casesi. */ +- + enum mdep_reorg_phase_e + { + SH_BEFORE_MDEP_REORG, +diff -ruN gcc-20030210.orig/gcc/config/sh/sh.md gcc-20030210/gcc/config/sh/sh.md +--- gcc-20030210.orig/gcc/config/sh/sh.md Sat Nov 23 04:58:06 2002 ++++ gcc-20030210/gcc/config/sh/sh.md Sat Feb 22 01:40:14 2003 +@@ -1242,7 +1242,7 @@ + (clobber (reg:SI PR_REG)) + (clobber (reg:SI R4_REG)) + (use (match_operand:SI 1 "arith_reg_operand" "r"))] +- "TARGET_SH1 && ! TARGET_SH4" ++ "TARGET_SH1 && ! TARGET_SH4 || TARGET_NO_IMPLICIT_FP" + "jsr @%1%#" + [(set_attr "type" "sfunc") + (set_attr "needs_delay_slot" "yes")]) +@@ -1336,7 +1336,7 @@ + + operands[3] = gen_reg_rtx (Pmode); + /* Emit the move of the address to a pseudo outside of the libcall. */ +- if (TARGET_HARD_SH4 && TARGET_SH3E) ++ if (TARGET_HARD_SH4 && TARGET_SH3E && !TARGET_NO_IMPLICIT_FP) + { + emit_move_insn (operands[3], + gen_rtx_SYMBOL_REF (SImode, \"__udivsi3_i4\")); +@@ -1391,7 +1391,7 @@ + (clobber (reg:SI R2_REG)) + (clobber (reg:SI R3_REG)) + (use (match_operand:SI 1 "arith_reg_operand" "r"))] +- "TARGET_SH1 && ! TARGET_SH4" ++ "TARGET_SH1 && ! TARGET_SH4 || TARGET_NO_IMPLICIT_FP" + "jsr @%1%#" + [(set_attr "type" "sfunc") + (set_attr "needs_delay_slot" "yes")]) +@@ -1476,7 +1476,7 @@ + + operands[3] = gen_reg_rtx (Pmode); + /* Emit the move of the address to a pseudo outside of the libcall. */ +- if (TARGET_HARD_SH4 && TARGET_SH3E) ++ if (TARGET_HARD_SH4 && TARGET_SH3E && !TARGET_NO_IMPLICIT_FP) + { + emit_move_insn (operands[3], + gen_rtx_SYMBOL_REF (SImode, \"__sdivsi3_i4\")); +@@ -6446,6 +6446,8 @@ + case SImode: + return \"shll2 %1\;mov.l @(r0,%1),%0\"; + case HImode: ++ if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned) ++ return \"add %1,%1\;mov.w @(r0,%1),%0\;extu.w %0,%0\"; + return \"add %1,%1\;mov.w @(r0,%1),%0\"; + case QImode: + if (ADDR_DIFF_VEC_FLAGS (diff_vec).offset_unsigned) +@@ -6455,7 +6457,15 @@ + abort (); + } + }" +- [(set_attr "length" "4")]) ++ [(set (attr "length") ++ (cond [(eq (symbol_ref "shl_casesi_worker_length (insn)") (const_int 1)) ++ (const_string "2") ++ (eq (symbol_ref "shl_casesi_worker_length (insn)") (const_int 2)) ++ (const_string "4") ++ ;; Put "match_dup" here so that insn_variable_length_p return 1. ++ (ne (match_dup 2) (match_dup 2)) ++ (const_string "4")] ++ (const_string "6")))]) + + (define_insn "casesi_shift_media" + [(set (match_operand 0 "arith_reg_operand" "=r") +diff -ruN gcc-20030210.orig/gcc/config/sh/sh3-linux.h gcc-20030210/gcc/config/sh/sh3-linux.h +--- gcc-20030210.orig/gcc/config/sh/sh3-linux.h Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/gcc/config/sh/sh3-linux.h Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,29 @@ ++#undef TARGET_VERSION ++#define TARGET_VERSION fputs (" (SH3 GNU/Linux with ELF)", stderr); ++ ++#undef CPP_SPEC ++#define CPP_SPEC \ ++ "-D__LITTLE_ENDIAN__ \ ++ -D__SH3__ -D__sh3__ \ ++ -D__SIZE_TYPE__=unsigned\\ int \ ++ -D__PTRDIFF_TYPE__=int \ ++ %{fPIC:-D__PIC__ -D__pic__} \ ++ %{fpic:-D__PIC__ -D__pic__} \ ++ %{posix:-D_POSIX_SOURCE} \ ++ %{pthread:-D_REENTRANT -D_PTHREADS}" ++ ++#undef ASM_SPEC ++#define ASM_SPEC "%{mrelax:-relax}" ++ ++#undef CC1_SPEC ++#define CC1_SPEC \ ++ "-musermode -ml -m3 %{profile:-p}" ++ ++#undef LINK_SPEC ++#define LINK_SPEC \ ++ "%{mrelax:-relax} \ ++ %{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{static:-static}" +diff -ruN gcc-20030210.orig/gcc/config/sh/sh3eb-linux.h gcc-20030210/gcc/config/sh/sh3eb-linux.h +--- gcc-20030210.orig/gcc/config/sh/sh3eb-linux.h Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/gcc/config/sh/sh3eb-linux.h Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,29 @@ ++#undef TARGET_VERSION ++#define TARGET_VERSION fputs (" (SH3EB GNU/Linux with ELF)", stderr); ++ ++#undef CPP_SPEC ++#define CPP_SPEC \ ++ "-D__BIG_ENDIAN__ \ ++ -D__SH3__ -D__sh3__ \ ++ -D__SIZE_TYPE__=unsigned\\ int \ ++ -D__PTRDIFF_TYPE__=int \ ++ %{fPIC:-D__PIC__ -D__pic__} \ ++ %{fpic:-D__PIC__ -D__pic__} \ ++ %{posix:-D_POSIX_SOURCE} \ ++ %{pthread:-D_REENTRANT -D_PTHREADS}" ++ ++#undef ASM_SPEC ++#define ASM_SPEC "%{mrelax:-relax}" ++ ++#undef CC1_SPEC ++#define CC1_SPEC \ ++ "-musermode -mb -m3 %{profile:-p}" ++ ++#undef LINK_SPEC ++#define LINK_SPEC \ ++ "%{mrelax:-relax} \ ++ %{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{static:-static}" +diff -ruN gcc-20030210.orig/gcc/config/sh/sh4-linux.h gcc-20030210/gcc/config/sh/sh4-linux.h +--- gcc-20030210.orig/gcc/config/sh/sh4-linux.h Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/gcc/config/sh/sh4-linux.h Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,29 @@ ++#undef TARGET_VERSION ++#define TARGET_VERSION fputs (" (SH4 GNU/Linux with ELF)", stderr); ++ ++#undef CPP_SPEC ++#define CPP_SPEC \ ++ "-D__LITTLE_ENDIAN__ \ ++ -D__SH4__ \ ++ -D__SIZE_TYPE__=unsigned\\ int \ ++ -D__PTRDIFF_TYPE__=int \ ++ %{fPIC:-D__PIC__ -D__pic__} \ ++ %{fpic:-D__PIC__ -D__pic__} \ ++ %{posix:-D_POSIX_SOURCE} \ ++ %{pthread:-D_REENTRANT -D_PTHREADS}" ++ ++#undef ASM_SPEC ++#define ASM_SPEC "%{mrelax:-relax}" ++ ++#undef CC1_SPEC ++#define CC1_SPEC \ ++ "-musermode -ml -m4 %{profile:-p}" ++ ++#undef LINK_SPEC ++#define LINK_SPEC \ ++ "%{mrelax:-relax} \ ++ %{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{static:-static}" +diff -ruN gcc-20030210.orig/gcc/config/sh/sh4eb-linux.h gcc-20030210/gcc/config/sh/sh4eb-linux.h +--- gcc-20030210.orig/gcc/config/sh/sh4eb-linux.h Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/gcc/config/sh/sh4eb-linux.h Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,29 @@ ++#undef TARGET_VERSION ++#define TARGET_VERSION fputs (" (SH4EB GNU/Linux with ELF)", stderr); ++ ++#undef CPP_SPEC ++#define CPP_SPEC \ ++ "-D__BIG_ENDIAN__ \ ++ -D__SH4__ \ ++ -D__SIZE_TYPE__=unsigned\\ int \ ++ -D__PTRDIFF_TYPE__=int \ ++ %{fPIC:-D__PIC__ -D__pic__} \ ++ %{fpic:-D__PIC__ -D__pic__} \ ++ %{posix:-D_POSIX_SOURCE} \ ++ %{pthread:-D_REENTRANT -D_PTHREADS}" ++ ++#undef ASM_SPEC ++#define ASM_SPEC "%{mrelax:-relax}" ++ ++#undef CC1_SPEC ++#define CC1_SPEC \ ++ "-musermode -mb -m4 %{profile:-p}" ++ ++#undef LINK_SPEC ++#define LINK_SPEC \ ++ "%{mrelax:-relax} \ ++ %{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{static:-static}" +diff -ruN gcc-20030210.orig/gcc/config/sh/t-linux gcc-20030210/gcc/config/sh/t-linux +--- gcc-20030210.orig/gcc/config/sh/t-linux Thu May 17 12:16:12 2001 ++++ gcc-20030210/gcc/config/sh/t-linux Sat Feb 22 01:40:14 2003 +@@ -1,10 +1,20 @@ +-TARGET_LIBGCC2_CFLAGS = -fpic ++TARGET_LIBGCC2_CFLAGS = -fpic -DNO_FPSCR_VALUES ++LIBGCC1 = libgcc1-asm.a ++CROSS_LIBGCC1 = libgcc1-asm.a ++LIBGCC1_TEST = libgcc1-test + LIB1ASMFUNCS = _ashiftrt _ashiftrt_n _ashiftlt _lshiftrt _movstr \ + _movstr_i4 _mulsi3 _sdivsi3 _sdivsi3_i4 _udivsi3 _udivsi3_i4 _set_fpscr \ + _ic_invalidate ++LIB2ADDEH = $(srcdir)/unwind-sjlj.c ++LIB2ADDEHDEP = unwind.inc unwind-sjlj.c + +-MULTILIB_OPTIONS= mb m3e/m4 ++MULTILIB_OPTIONS= mb m4 + MULTILIB_DIRNAMES= + MULTILIB_MATCHES = + +-EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o ++EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used and SH specific. ++SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \ ++ $(srcdir)/config/sh/libgcc-glibc.ver +diff -ruN gcc-20030210.orig/gcc/config/sh/t-linux-nomulti gcc-20030210/gcc/config/sh/t-linux-nomulti +--- gcc-20030210.orig/gcc/config/sh/t-linux-nomulti Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/gcc/config/sh/t-linux-nomulti Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,9 @@ ++LIBGCC = libgcc.a ++EXTRA_PARTS = crtbegin.o crtbeginS.o crtend.o crtendS.o crtbeginT.o ++ ++INSTALL_LIBGCC = install-libgcc ++ ++MULTILIB_OPTIONS= ++MULTILIB_DIRNAMES= ++MULTILIB_MATCHES = ++EXTRA_MULTILIB_PARTS= +diff -ruN gcc-20030210.orig/gcc/config.gcc gcc-20030210/gcc/config.gcc +--- gcc-20030210.orig/gcc/config.gcc Fri Jan 31 19:17:13 2003 ++++ gcc-20030210/gcc/config.gcc Sat Feb 22 01:40:14 2003 +@@ -337,9 +337,9 @@ + sparc*-*-*) + cpu_type=sparc + ;; +-sh64-*-*) +- cpu_type=sh +- ;; ++sh*-*-*) ++ cpu_type=sh ++ ;; + esac + + tm_file=${cpu_type}/${cpu_type}.h +@@ -3018,9 +3018,31 @@ + thread_file='rtems' + fi + ;; +-sh-*-linux*) ++sh*-*-linux*) + tm_file="${tm_file} sh/elf.h sh/linux.h" +- tmake_file="sh/t-sh sh/t-elf sh/t-linux" ++ tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver t-linux sh/t-linux" ++ extra_parts="crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o" ++ case $machine in ++ sh3eb-*) ++ tm_file="${tm_file} sh/sh3eb-linux.h" ++ tmake_file="${tmake_file} sh/t-linux-nomulti" ++ ;; ++ sh4eb-*) ++ tm_file="${tm_file} sh/sh4eb-linux.h" ++ tmake_file="${tmake_file} sh/t-linux-nomulti" ++ ;; ++ sh3-*) ++ tm_file="${tm_file} sh/sh3-linux.h" ++ tmake_file="${tmake_file} sh/t-linux-nomulti" ++ ;; ++ sh4-*) ++ tm_file="${tm_file} sh/sh4-linux.h" ++ tmake_file="${tmake_file} sh/t-linux-nomulti" ++ ;; ++ *) ++ ;; ++ esac ++ xmake_file=x-linux + gas=yes gnu_ld=yes + float_format=sh + ;; +diff -ruN gcc-20030210.orig/gcc/dwarf2out.c gcc-20030210/gcc/dwarf2out.c +--- gcc-20030210.orig/gcc/dwarf2out.c Mon Feb 10 19:36:25 2003 ++++ gcc-20030210/gcc/dwarf2out.c Sat Feb 22 01:40:14 2003 +@@ -10224,7 +10224,9 @@ + /* We can have a normal definition following an inline one in the + case of redefinition of GNU C extern inlines. + It seems reasonable to use AT_specification in this case. */ +- && !get_AT_unsigned (old_die, DW_AT_inline)) ++ && !get_AT_unsigned (old_die, DW_AT_inline) ++ /* Skip the nested function. */ ++ && !decl_function_context (decl)) + { + /* ??? This can happen if there is a bug in the program, for + instance, if it has duplicate function definitions. Ideally, +diff -ruN gcc-20030210.orig/gcc/final.c gcc-20030210/gcc/final.c +--- gcc-20030210.orig/gcc/final.c Fri Jan 31 19:17:20 2003 ++++ gcc-20030210/gcc/final.c Sat Feb 22 01:40:14 2003 +@@ -1128,7 +1128,7 @@ + } + } + +- INSN_ADDRESSES (uid) = insn_current_address; ++ INSN_ADDRESSES (uid) = insn_current_address + insn_lengths[uid]; + + if (GET_CODE (insn) == NOTE || GET_CODE (insn) == BARRIER + || GET_CODE (insn) == CODE_LABEL) +diff -ruN gcc-20030210.orig/gcc/mkmap-symver.awk gcc-20030210/gcc/mkmap-symver.awk +--- gcc-20030210.orig/gcc/mkmap-symver.awk Fri Jan 31 19:17:26 2003 ++++ gcc-20030210/gcc/mkmap-symver.awk Sat Feb 22 01:40:14 2003 +@@ -89,7 +89,11 @@ + output(inherit[lib]); + + printf("%s {\n", lib); +- printf(" global:\n"); ++ for (sym in ver) ++ if ((ver[sym] == lib) && (sym in def)) ++ count++; ++ if (count > 0) ++ printf(" global:\n"); + for (sym in ver) + if ((ver[sym] == lib) && (sym in def)) + { +diff -ruN gcc-20030210.orig/gcc/reload1.c gcc-20030210/gcc/reload1.c +--- gcc-20030210.orig/gcc/reload1.c Fri Jan 31 19:17:29 2003 ++++ gcc-20030210/gcc/reload1.c Sat Feb 22 01:40:14 2003 +@@ -6103,6 +6103,7 @@ + for (j = 0; j < n_reloads; j++) + if (rld[j].in != 0 + && rld[j].when_needed != RELOAD_OTHER ++ && rld[j].when_needed != RELOAD_FOR_OUTPUT_ADDRESS + && reg_overlap_mentioned_for_reload_p (rld[j].in, + rld[i].in)) + rld[j].when_needed +diff -ruN gcc-20030210.orig/gcc/reorg.c gcc-20030210/gcc/reorg.c +--- gcc-20030210.orig/gcc/reorg.c Fri Jan 31 19:17:30 2003 ++++ gcc-20030210/gcc/reorg.c Sat Feb 22 01:40:14 2003 +@@ -3265,6 +3265,14 @@ + || condjump_in_parallel_p (XVECEXP (PATTERN (insn), 0, 0)))) + continue; + ++#ifdef MD_CAN_REDIRECT_BRANCH ++ /* On some targets, branches with delay slots can have a limited ++ displacement. Give the back end a chance to tell us we can't do ++ this. */ ++ if (! MD_CAN_REDIRECT_BRANCH (insn, delay_insn)) ++ continue; ++#endif ++ + target_label = JUMP_LABEL (delay_insn); + + if (target_label) +diff -ruN gcc-20030210.orig/gcc/tree-inline.c gcc-20030210/gcc/tree-inline.c +--- gcc-20030210.orig/gcc/tree-inline.c Fri Jan 31 19:17:33 2003 ++++ gcc-20030210/gcc/tree-inline.c Sat Feb 22 01:40:14 2003 +@@ -836,11 +836,17 @@ + + /* Don't try to inline functions that are not well-suited to + inlining. */ +- if (!inlinable_function_p (fn, id)) +- return NULL_TREE; ++ if (! inlinable_function_p (fn, id) ++ || ! (*lang_hooks.tree_inlining.start_inlining) (fn)) ++ { ++ if (DECL_INLINE (fn) && warn_inline && ! flag_really_no_inline) ++ { ++ warning_with_decl (fn, "inlining failed in call to `%s'"); ++ warning ("called from here"); ++ } + +- if (! (*lang_hooks.tree_inlining.start_inlining) (fn)) +- return NULL_TREE; ++ return NULL_TREE; ++ } + + /* Set the current filename and line number to the function we are + inlining so that when we create new _STMT nodes here they get +diff -ruN gcc-20030210.orig/libjava/Makefile.in gcc-20030210/libjava/Makefile.in +--- gcc-20030210.orig/libjava/Makefile.in Tue Jan 28 10:44:37 2003 ++++ gcc-20030210/libjava/Makefile.in Sat Feb 22 01:40:14 2003 +@@ -1637,6 +1637,7 @@ + "AS=$(AS)" \ + "CC=$(CC)" \ + "CXX=$(CXX)" \ ++ "GCJ=$(GCJ)" \ + "LD=$(LD)" \ + "LIBCFLAGS=$(LIBCFLAGS)" \ + "NM=$(NM)" \ +diff -ruN gcc-20030210.orig/libjava/configure gcc-20030210/libjava/configure +--- gcc-20030210.orig/libjava/configure Tue Jan 28 10:44:37 2003 ++++ gcc-20030210/libjava/configure Sat Feb 22 01:42:11 2003 +@@ -2031,7 +2031,7 @@ + # This must be Linux ELF. + linux-gnu*) + case $host_cpu in +- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* ) ++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM +diff -ruN gcc-20030210.orig/libjava/java/net/natInetAddress.cc gcc-20030210/libjava/java/net/natInetAddress.cc +--- gcc-20030210.orig/libjava/java/net/natInetAddress.cc Tue Mar 5 05:02:19 2002 ++++ gcc-20030210/libjava/java/net/natInetAddress.cc Sat Feb 22 01:40:14 2003 +@@ -56,7 +56,7 @@ + #endif + + #ifndef HAVE_GETHOSTNAME_DECL +-extern "C" int gethostname (char *name, int namelen); ++extern "C" int gethostname (char *name, unsigned int namelen); + #endif + + #ifdef DISABLE_JAVA_NET +diff -ruN gcc-20030210.orig/libjava/libltdl/aclocal.m4 gcc-20030210/libjava/libltdl/aclocal.m4 +--- gcc-20030210.orig/libjava/libltdl/aclocal.m4 Sun Sep 10 17:04:40 2000 ++++ gcc-20030210/libjava/libltdl/aclocal.m4 Sat Feb 22 01:40:14 2003 +@@ -573,7 +573,7 @@ + # This must be Linux ELF. + linux-gnu*) + case "$host_cpu" in +- alpha* | i*86 | powerpc* | sparc* | ia64* ) ++ alpha* | i*86 | powerpc* | sparc* | ia64* | sh*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM +diff -ruN gcc-20030210.orig/libjava/sysdep/sh/locks.h gcc-20030210/libjava/sysdep/sh/locks.h +--- gcc-20030210.orig/libjava/sysdep/sh/locks.h Thu Jan 1 09:00:00 1970 ++++ gcc-20030210/libjava/sysdep/sh/locks.h Sat Feb 22 01:40:14 2003 +@@ -0,0 +1,72 @@ ++// locks.h - Thread synchronization primitives. SuperH implementation. ++ ++/* Copyright (C) 2002 Free Software Foundation ++ ++ This file is part of libgcj. ++ ++This software is copyrighted work licensed under the terms of the ++Libgcj License. Please consult the file "LIBGCJ_LICENSE" for ++details. */ ++ ++#ifndef __SYSDEP_LOCKS_H__ ++#define __SYSDEP_LOCKS_H__ ++ ++typedef size_t obj_addr_t; /* Integer type big enough for object */ ++ /* address. */ ++ ++static unsigned char __cas_lock = 0; ++ ++inline static void ++__cas_start_atomic (void) ++{ ++ unsigned int val; ++ ++ do ++ __asm__ __volatile__ ("tas.b @%1; movt %0" ++ : "=r" (val) ++ : "r" (&__cas_lock) ++ : "memory"); ++ while (val == 0); ++} ++ ++inline static void ++__cas_end_atomic (void) ++{ ++ __asm__ __volatile__ (" " : : : "memory"); ++ __cas_lock = 0; ++} ++ ++inline static bool ++compare_and_swap (volatile obj_addr_t *addr, obj_addr_t old, ++ obj_addr_t new_val) ++{ ++ bool ret; ++ ++ __cas_start_atomic (); ++ if (*addr != old) ++ ret = false; ++ else ++ { ++ *addr = new_val; ++ ret = true; ++ } ++ __cas_end_atomic (); ++ ++ return ret; ++} ++ ++inline static void ++release_set (volatile obj_addr_t *addr, obj_addr_t new_val) ++{ ++ __asm__ __volatile__ (" " : : : "memory"); ++ *(addr) = new_val; ++} ++ ++inline static bool ++compare_and_swap_release (volatile obj_addr_t *addr, obj_addr_t old, ++ obj_addr_t new_val) ++{ ++ return compare_and_swap (addr, old, new_val); ++} ++ ++#endif /* ! __SYSDEP_LOCKS_H__ */ +diff -ruN gcc-20030210.orig/libstdc++-v3/acinclude.m4 gcc-20030210/libstdc++-v3/acinclude.m4 +--- gcc-20030210.orig/libstdc++-v3/acinclude.m4 Tue Jan 28 02:30:41 2003 ++++ gcc-20030210/libstdc++-v3/acinclude.m4 Sat Feb 22 01:40:14 2003 +@@ -1828,9 +1828,10 @@ + GLIBCPP_INCLUDES="-I${glibcpp_builddir}/include/${target_alias} -I${glibcpp_builddir}/include" + + # Passed down for canadian crosses. +- if test x"$CANADIAN" = xyes; then +- TOPLEVEL_INCLUDES='-I$(includedir)' +- fi ++ #if test x"$CANADIAN" = xyes; then ++ # TOPLEVEL_INCLUDES='-I$(includedir)' ++ #fi ++ TOPLEVEL_INCLUDES='' + + LIBMATH_INCLUDES='-I$(top_srcdir)/libmath' + +diff -ruN gcc-20030210.orig/libstdc++-v3/aclocal.m4 gcc-20030210/libstdc++-v3/aclocal.m4 +--- gcc-20030210.orig/libstdc++-v3/aclocal.m4 Mon Feb 10 19:36:47 2003 ++++ gcc-20030210/libstdc++-v3/aclocal.m4 Sat Feb 22 01:40:14 2003 +@@ -1840,9 +1840,10 @@ + GLIBCPP_INCLUDES="-I${glibcpp_builddir}/include/${target_alias} -I${glibcpp_builddir}/include" + + # Passed down for canadian crosses. +- if test x"$CANADIAN" = xyes; then +- TOPLEVEL_INCLUDES='-I$(includedir)' +- fi ++ #if test x"$CANADIAN" = xyes; then ++ # TOPLEVEL_INCLUDES='-I$(includedir)' ++ #fi ++ TOPLEVEL_INCLUDES='' + + LIBMATH_INCLUDES='-I$(top_srcdir)/libmath' + +diff -ruN gcc-20030210.orig/libstdc++-v3/configure gcc-20030210/libstdc++-v3/configure +--- gcc-20030210.orig/libstdc++-v3/configure Mon Feb 10 19:37:17 2003 ++++ gcc-20030210/libstdc++-v3/configure Sat Feb 22 01:40:14 2003 +@@ -1982,7 +1982,7 @@ + # This must be Linux ELF. + linux-gnu*) + case $host_cpu in +- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* ) ++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh*) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM +@@ -22340,9 +22340,10 @@ + GLIBCPP_INCLUDES="-I${glibcpp_builddir}/include/${target_alias} -I${glibcpp_builddir}/include" + + # Passed down for canadian crosses. +- if test x"$CANADIAN" = xyes; then +- TOPLEVEL_INCLUDES='-I$(includedir)' +- fi ++ #if test x"$CANADIAN" = xyes; then ++ # TOPLEVEL_INCLUDES='-I$(includedir)' ++ #fi ++ TOPLEVEL_INCLUDES='' + + LIBMATH_INCLUDES='-I$(top_srcdir)/libmath' + +diff -ruN gcc-20030210.orig/libtool.m4 gcc-20030210/libtool.m4 +--- gcc-20030210.orig/libtool.m4 Fri Jan 31 19:16:59 2003 ++++ gcc-20030210/libtool.m4 Sat Feb 22 01:40:14 2003 +@@ -597,7 +597,7 @@ + # This must be Linux ELF. + linux-gnu*) + case $host_cpu in +- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* ) ++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM +diff -ruN gcc-20030210.orig/zlib/configure gcc-20030210/zlib/configure +--- gcc-20030210.orig/zlib/configure Tue Jan 28 10:44:15 2003 ++++ gcc-20030210/zlib/configure Sat Feb 22 01:40:14 2003 +@@ -1571,7 +1571,7 @@ + # This must be Linux ELF. + linux-gnu*) + case $host_cpu in +- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* ) ++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM diff --git a/patches/gcc/3.2.3/gcc-3.2.3-g++.exp.patch b/patches/gcc/3.2.3/gcc-3.2.3-g++.exp.patch new file mode 100644 index 00000000..0de46fc4 --- /dev/null +++ b/patches/gcc/3.2.3/gcc-3.2.3-g++.exp.patch @@ -0,0 +1,98 @@ +g++ testsuite fixes for cross-compilers, Dan Kegel, Ixia Communications, 12 July 2003 + +The first hunk fixes the error + +/testsuite_flags: /testsuite_flags: No such file or directory + while executing +"exec sh ${odir_v3}/testsuite_flags --build-includes" + (procedure "g++_include_flags" line 21) + invoked from within +"g++_include_flags [get_multilibs] " + (procedure "g++_init" line 63) + invoked from within +"${tool}_init $test_file_name" + (procedure "runtest" line 19) + invoked from within +"runtest $test_name" + ("foreach" body line 42) + invoked from within +... +make[1]: [check-g++] Error 1 (ignored) + +The fix isn't especially pretty, but it worked for me, and can't hurt the +more common native compiler case. Maybe someone who knows the code better +can come up with a better fix. + +The second hunk fixes the error + +sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-405-linux-gnu/gcc-3.2.3-glibc-2.2.5/powerpc-405-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian + +when trying to compile g++ testcases (!); setting up +the shared library environment when running crosstests of g++ +should either be done by a special board file, or by +setting up a remote chroot environment (see http://kegel.com/crosstool), +not by blithely setting LD_LIBRARY_PATH on the local system. + +--- gcc-3.2.3/gcc/testsuite/lib/g++.exp.old Fri Jul 11 15:42:47 2003 ++++ gcc-3.2.3/gcc/testsuite/lib/g++.exp Sat Jul 12 12:57:07 2003 +@@ -72,6 +72,8 @@ + # + proc g++_include_flags { paths } { + global srcdir ++ global objdir ++ global target_triplet + global HAVE_LIBSTDCXX_V3 + global TESTING_IN_BUILD_TREE + +@@ -90,6 +92,20 @@ + + if { ${HAVE_LIBSTDCXX_V3} } { + set odir_v3 [lookfor_file ${gccpath} libstdc++-v3] ++ if { $odir_v3 == "" } { ++ verbose "g++_include_flags: couldn't find libstdc++-v3 on first try, now looking in build directory $objdir" ++ # first assume no multilibs ++ set odir_v3 [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"] ++ } ++ if { $odir_v3 == "" } { ++ verbose "g++_include_flags: couldn't find libstdc++-v3 on second try, trying multilib" ++ # assume multilib only one level deep ++ set multisub [file tail $gccpath] ++ set odir_v3 [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"] ++ } ++ if { $odir_v3 == "" } { ++ error "Can't find libstdc++-v3" ++ } + append flags [exec sh ${odir_v3}/testsuite_flags --build-includes] + } else { + set odir_v2 [lookfor_file ${gccpath} libstdc++] +@@ -192,16 +192,20 @@ + } + } + +- # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but +- # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH +- # (for the 64-bit ABI). The right way to do this would be to modify +- # unix.exp -- but that's not an option since it's part of DejaGNU +- # proper, so we do it here. We really only need to do +- # this on IRIX, but it shouldn't hurt to do it anywhere else. +- setenv LD_LIBRARY_PATH $ld_library_path +- setenv SHLIB_PATH $ld_library_path +- setenv LD_LIBRARYN32_PATH $ld_library_path +- setenv LD_LIBRARY64_PATH $ld_library_path ++ if {![is_remote target]} { ++ # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but ++ # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH ++ # (for the 64-bit ABI). The right way to do this would be to modify ++ # unix.exp -- but that's not an option since it's part of DejaGNU ++ # proper, so we do it here. We really only need to do ++ # this on IRIX, but it shouldn't hurt to do it anywhere else. ++ ++ # Doing this causes us to be unable to run cross-compilers. ++ setenv LD_LIBRARY_PATH $ld_library_path ++ setenv SHLIB_PATH $ld_library_path ++ setenv LD_LIBRARYN32_PATH $ld_library_path ++ setenv LD_LIBRARY64_PATH $ld_library_path ++ } + + return "$flags" + } diff --git a/patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch b/patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch new file mode 100644 index 00000000..db78ba1f --- /dev/null +++ b/patches/gcc/3.2.3/gcc-3.2.3-libffi-1.patch @@ -0,0 +1,6864 @@ +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.am gcc/libffi/Makefile.am +--- gcc-3.2.2.orig/libffi/Makefile.am Tue Jan 28 10:43:56 2003 ++++ gcc/libffi/Makefile.am Tue Jan 28 10:48:33 2003 +@@ -8,14 +8,17 @@ + src/mips/n32.s src/mips/o32.S src/mips/o32.s \ + src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \ + src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \ ++ src/x86/ffi64.c src/x86/unix64.S \ + src/alpha/ffi.c src/alpha/osf.S \ + src/m68k/ffi.c src/m68k/sysv.S \ + src/powerpc/ffi.c src/powerpc/sysv.S \ + src/powerpc/ppc_closure.S src/powerpc/asm.h \ + src/powerpc/ffi_darwin.c \ + src/powerpc/darwin.S src/powerpc/aix.S \ +- src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \ +- src/arm/ffi.c src/arm/sysv.S ++ src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \ ++ src/arm/ffi.c src/arm/sysv.S \ ++ src/s390/ffi.c src/s390/sysv.S \ ++ src/sh/ffi.c src/sh/sysv.S + + VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@ + +@@ -83,6 +86,7 @@ + ffitest_LDFLAGS = -shared-libgcc + + TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S ++TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S + TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s + TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S + TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S +@@ -91,9 +95,12 @@ + TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S + TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S + TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S +-TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S ++TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S + TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S + TARGET_SRC_ARM = src/arm/sysv.S src/arm/ffi.c ++TARGET_SRC_S390 = src/s390/sysv.S src/s390/ffi.c ++TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S ++TARGET_SRC_SH = src/sh/sysv.S src/sh/ffi.c + + ##libffi_la_SOURCES = src/debug.c src/prep_cif.c src/types.c $(TARGET_SRC_@TARGET@) + ## Work around automake deficiency +@@ -103,6 +110,10 @@ + libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) + libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) + endif ++if MIPS_LINUX ++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX) ++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX) ++endif + if MIPS_SGI + libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) + libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) +@@ -147,6 +158,18 @@ + libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) + libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) + endif ++if S390 ++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390) ++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_S390) ++endif ++if X86_64 ++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64) ++libffi_convenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64) ++endif ++if SH ++libffi_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH) ++libfficonvenience_la_SOURCES = $(libffi_la_common_SOURCES) $(TARGET_SRC_SH) ++endif + + AM_CFLAGS = -fexceptions + +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/Makefile.in gcc/libffi/Makefile.in +--- gcc-3.2.2.orig/libffi/Makefile.in Wed Jan 29 07:59:05 2003 ++++ gcc/libffi/Makefile.in Wed Jan 29 07:58:58 2003 +@@ -91,14 +91,17 @@ + src/mips/n32.s src/mips/o32.S src/mips/o32.s \ + src/sparc/ffi.c src/sparc/v8.S src/sparc/v9.S \ + src/x86/ffi.c src/x86/sysv.S src/x86/win32.S \ ++ src/x86/ffi64.c src/x86/unix64.S \ + src/alpha/ffi.c src/alpha/osf.S \ + src/m68k/ffi.c src/m68k/sysv.S \ + src/powerpc/ffi.c src/powerpc/sysv.S \ + src/powerpc/ppc_closure.S src/powerpc/asm.h \ + src/powerpc/ffi_darwin.c \ + src/powerpc/darwin.S src/powerpc/aix.S \ +- src/powerpc/darwin_closure.S src/powerpc/aix_closures.S \ +- src/arm/ffi.c src/arm/sysv.S ++ src/powerpc/darwin_closure.S src/powerpc/aix_closure.S \ ++ src/arm/ffi.c src/arm/sysv.S \ ++ src/s390/ffi.c src/s390/sysv.S \ ++ src/sh/ffi.c src/sh/sysv.S + + + VPATH = @srcdir@:@srcdir@/src:@srcdir@/src/@TARGETDIR@ +@@ -162,6 +165,7 @@ + ffitest_LDFLAGS = -shared-libgcc + + TARGET_SRC_MIPS_GCC = src/mips/ffi.c src/mips/o32.S src/mips/n32.S ++TARGET_SRC_MIPS_LINUX = src/mips/ffi.c src/mips/o32.S + TARGET_SRC_MIPS_SGI = src/mips/ffi.c src/mips/o32.s src/mips/n32.s + TARGET_SRC_X86 = src/x86/ffi.c src/x86/sysv.S + TARGET_SRC_X86_WIN32 = src/x86/ffi.c src/x86/win32.S +@@ -170,14 +174,18 @@ + TARGET_SRC_IA64 = src/ia64/ffi.c src/ia64/unix.S + TARGET_SRC_M68K = src/m68k/ffi.c src/m68k/sysv.S + TARGET_SRC_POWERPC = src/powerpc/ffi.c src/powerpc/sysv.S src/powerpc/ppc_closure.S +-TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closures.S ++TARGET_SRC_POWERPC_AIX = src/powerpc/ffi_darwin.c src/powerpc/aix.S src/powerpc/aix_closure.S + TARGET_SRC_POWERPC_DARWIN = src/powerpc/ffi_darwin.c src/powerpc/darwin.S src/powerpc/darwin_closure.S + TARGET_SRC_ARM = src/arm/sysv.S src/arm/ffi.c ++TARGET_SRC_S390 = src/s390/sysv.S src/s390/ffi.c ++TARGET_SRC_X86_64 = src/x86/ffi64.c src/x86/unix64.S src/x86/ffi.c src/x86/sysv.S ++TARGET_SRC_SH = src/sh/sysv.S src/sh/ffi.c + + libffi_la_common_SOURCES = src/debug.c src/prep_cif.c src/types.c \ + src/raw_api.c src/java_raw_api.c + + @MIPS_GCC_TRUE@libffi_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) ++@MIPS_LINUX_TRUE@libffi_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX) + @MIPS_SGI_TRUE@libffi_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) + @X86_TRUE@libffi_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86) + @X86_WIN32_TRUE@libffi_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32) +@@ -189,7 +197,11 @@ + @POWERPC_AIX_TRUE@libffi_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX) + @POWERPC_DARWIN_TRUE@libffi_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN) + @ARM_TRUE@libffi_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) ++@S390_TRUE@libffi_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390) ++@X86_64_TRUE@libffi_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64) ++@SH_TRUE@libffi_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH) + @MIPS_GCC_TRUE@libffi_convenience_la_SOURCES = @MIPS_GCC_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_GCC) ++@MIPS_LINUX_TRUE@libffi_convenience_la_SOURCES = @MIPS_LINUX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_LINUX) + @MIPS_SGI_TRUE@libffi_convenience_la_SOURCES = @MIPS_SGI_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_MIPS_SGI) + @X86_TRUE@libffi_convenience_la_SOURCES = @X86_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86) + @X86_WIN32_TRUE@libffi_convenience_la_SOURCES = @X86_WIN32_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_WIN32) +@@ -201,6 +213,9 @@ + @POWERPC_AIX_TRUE@libffi_convenience_la_SOURCES = @POWERPC_AIX_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_AIX) + @POWERPC_DARWIN_TRUE@libffi_convenience_la_SOURCES = @POWERPC_DARWIN_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_POWERPC_DARWIN) + @ARM_TRUE@libffi_convenience_la_SOURCES = @ARM_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_ARM) ++@S390_TRUE@libffi_convenience_la_SOURCES = @S390_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_S390) ++@X86_64_TRUE@libffi_convenience_la_SOURCES = @X86_64_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_X86_64) ++@SH_TRUE@libfficonvenience_la_SOURCES = @SH_TRUE@$(libffi_la_common_SOURCES) $(TARGET_SRC_SH) + + AM_CFLAGS = -fexceptions + +@@ -208,7 +223,7 @@ + + INCLUDES = -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src + ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +-mkinstalldirs = $(SHELL) $(top_srcdir)/../mkinstalldirs ++mkinstalldirs = $(SHELL) $(top_srcdir)/${libffi_basedir}/../mkinstalldirs + CONFIG_HEADER = fficonfig.h + CONFIG_CLEAN_FILES = + LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES) +@@ -220,10 +235,6 @@ + LIBS = @LIBS@ + libffi_convenience_la_LDFLAGS = + libffi_convenience_la_LIBADD = +-@POWERPC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ +-@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ +-@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \ +-@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo + @ALPHA_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ + @ALPHA_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ + @ALPHA_TRUE@src/java_raw_api.lo src/alpha/ffi.lo src/alpha/osf.lo +@@ -234,12 +245,29 @@ + @MIPS_GCC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ + @MIPS_GCC_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \ + @MIPS_GCC_TRUE@src/mips/n32.lo +-@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ +-@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ +-@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo ++@S390_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo + @M68K_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo ++@X86_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo ++@POWERPC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ++@POWERPC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ++@POWERPC_TRUE@src/java_raw_api.lo src/powerpc/ffi.lo \ ++@POWERPC_TRUE@src/powerpc/sysv.lo src/powerpc/ppc_closure.lo ++@MIPS_LINUX_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ++@MIPS_LINUX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ++@MIPS_LINUX_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo ++@X86_WIN32_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ++@X86_WIN32_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ++@X86_WIN32_TRUE@src/java_raw_api.lo src/x86/ffi.lo src/x86/win32.lo ++@X86_64_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ++@X86_64_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ++@X86_64_TRUE@src/java_raw_api.lo src/x86/ffi64.lo src/x86/unix64.lo \ ++@X86_64_TRUE@src/x86/ffi.lo src/x86/sysv.lo + @SPARC_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ + @SPARC_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ + @SPARC_TRUE@src/java_raw_api.lo src/sparc/ffi.lo src/sparc/v8.lo \ +@@ -247,62 +275,75 @@ + @POWERPC_AIX_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ + @POWERPC_AIX_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ + @POWERPC_AIX_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \ +-@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closures.lo +-@X86_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@X86_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@X86_TRUE@src/x86/ffi.lo src/x86/sysv.lo +-@ARM_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo ++@POWERPC_AIX_TRUE@src/powerpc/aix.lo src/powerpc/aix_closure.lo ++@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ ++@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ ++@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \ ++@MIPS_SGI_TRUE@src/mips/n32.lo + @POWERPC_DARWIN_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ + @POWERPC_DARWIN_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ + @POWERPC_DARWIN_TRUE@src/java_raw_api.lo src/powerpc/ffi_darwin.lo \ + @POWERPC_DARWIN_TRUE@src/powerpc/darwin.lo \ + @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo +-@MIPS_SGI_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo \ +-@MIPS_SGI_TRUE@src/prep_cif.lo src/types.lo src/raw_api.lo \ +-@MIPS_SGI_TRUE@src/java_raw_api.lo src/mips/ffi.lo src/mips/o32.lo \ +-@MIPS_SGI_TRUE@src/mips/n32.lo ++@ARM_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@ARM_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@ARM_TRUE@src/arm/sysv.lo src/arm/ffi.lo ++@SH_TRUE@libffi_convenience_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@SH_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@SH_TRUE@src/sh/sysv.lo src/sh/ffi.lo + libffi_la_LIBADD = ++@SH_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ ++@SH_TRUE@src/raw_api.lo src/java_raw_api.lo src/sh/sysv.lo \ ++@SH_TRUE@src/sh/ffi.lo ++@IA64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo ++@X86_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ ++@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \ ++@X86_TRUE@src/x86/sysv.lo + @POWERPC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @POWERPC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @POWERPC_TRUE@src/powerpc/ffi.lo src/powerpc/sysv.lo \ + @POWERPC_TRUE@src/powerpc/ppc_closure.lo +-@ALPHA_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo +-@IA64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@IA64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@IA64_TRUE@src/ia64/ffi.lo src/ia64/unix.lo +-@MIPS_GCC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo +-@X86_WIN32_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo +-@M68K_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo ++@MIPS_LINUX_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@MIPS_LINUX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@MIPS_LINUX_TRUE@src/mips/ffi.lo src/mips/o32.lo + @SPARC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @SPARC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @SPARC_TRUE@src/sparc/ffi.lo src/sparc/v8.lo src/sparc/v9.lo + @POWERPC_AIX_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @POWERPC_AIX_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @POWERPC_AIX_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/aix.lo \ +-@POWERPC_AIX_TRUE@src/powerpc/aix_closures.lo +-@X86_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ +-@X86_TRUE@src/raw_api.lo src/java_raw_api.lo src/x86/ffi.lo \ +-@X86_TRUE@src/x86/sysv.lo ++@POWERPC_AIX_TRUE@src/powerpc/aix_closure.lo ++@MIPS_SGI_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo + @ARM_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo src/types.lo \ + @ARM_TRUE@src/raw_api.lo src/java_raw_api.lo src/arm/sysv.lo \ + @ARM_TRUE@src/arm/ffi.lo ++@ALPHA_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@ALPHA_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@ALPHA_TRUE@src/alpha/ffi.lo src/alpha/osf.lo ++@MIPS_GCC_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@MIPS_GCC_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@MIPS_GCC_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo ++@S390_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@S390_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@S390_TRUE@src/s390/sysv.lo src/s390/ffi.lo ++@M68K_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@M68K_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@M68K_TRUE@src/m68k/ffi.lo src/m68k/sysv.lo ++@X86_WIN32_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@X86_WIN32_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@X86_WIN32_TRUE@src/x86/ffi.lo src/x86/win32.lo ++@X86_64_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ ++@X86_64_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ ++@X86_64_TRUE@src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffi.lo \ ++@X86_64_TRUE@src/x86/sysv.lo + @POWERPC_DARWIN_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ + @POWERPC_DARWIN_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ + @POWERPC_DARWIN_TRUE@src/powerpc/ffi_darwin.lo src/powerpc/darwin.lo \ + @POWERPC_DARWIN_TRUE@src/powerpc/darwin_closure.lo +-@MIPS_SGI_TRUE@libffi_la_OBJECTS = src/debug.lo src/prep_cif.lo \ +-@MIPS_SGI_TRUE@src/types.lo src/raw_api.lo src/java_raw_api.lo \ +-@MIPS_SGI_TRUE@src/mips/ffi.lo src/mips/o32.lo src/mips/n32.lo + noinst_PROGRAMS = ffitest$(EXEEXT) + PROGRAMS = $(noinst_PROGRAMS) + +@@ -578,8 +616,8 @@ + -chmod 777 $(distdir) + $(mkinstalldirs) $(distdir)/src/alpha $(distdir)/src/arm \ + $(distdir)/src/m68k $(distdir)/src/mips \ +- $(distdir)/src/powerpc $(distdir)/src/sparc \ +- $(distdir)/src/x86 ++ $(distdir)/src/powerpc $(distdir)/src/s390 $(distdir)/src/sh \ ++ $(distdir)/src/sparc $(distdir)/src/x86 + @for file in $(DISTFILES); do \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/acinclude.m4 gcc/libffi/acinclude.m4 +--- gcc-3.2.2.orig/libffi/acinclude.m4 Sun Sep 10 16:43:14 2000 ++++ gcc/libffi/acinclude.m4 Tue Dec 17 03:22:47 2002 +@@ -4,5 +4,8 @@ + dnl to add a definition of LIBTOOL to Makefile.in. + ifelse(yes,no,[ + AC_DEFUN([AC_PROG_LIBTOOL],) ++AC_DEFUN([AM_PROG_LIBTOOL],) + AC_SUBST(LIBTOOL) + ]) ++ ++sinclude(../config/accross.m4) +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/aclocal.m4 gcc/libffi/aclocal.m4 +--- gcc-3.2.2.orig/libffi/aclocal.m4 Fri Feb 1 07:25:31 2002 ++++ gcc/libffi/aclocal.m4 Tue Dec 17 03:22:47 2002 +@@ -1,6 +1,6 @@ +-dnl aclocal.m4 generated automatically by aclocal 1.4 ++dnl aclocal.m4 generated automatically by aclocal 1.4-p5 + +-dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. ++dnl Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc. + dnl This file is free software; the Free Software Foundation + dnl gives unlimited permission to copy and/or distribute it, + dnl with or without modifications, as long as this notice is preserved. +@@ -16,108 +16,15 @@ + dnl to add a definition of LIBTOOL to Makefile.in. + ifelse(yes,no,[ + AC_DEFUN([AC_PROG_LIBTOOL],) ++AC_DEFUN([AM_PROG_LIBTOOL],) + AC_SUBST(LIBTOOL) + ]) + +-AC_DEFUN([AC_COMPILE_CHECK_SIZEOF], +-[changequote(<<, >>)dnl +-dnl The name to #define. +-define(<<AC_TYPE_NAME>>, translit(sizeof_$1, [a-z *], [A-Z_P]))dnl +-dnl The cache variable name. +-define(<<AC_CV_NAME>>, translit(ac_cv_sizeof_$1, [ *], [_p]))dnl +-changequote([, ])dnl +-AC_MSG_CHECKING(size of $1) +-AC_CACHE_VAL(AC_CV_NAME, +-[for ac_size in 4 8 1 2 16 12 $2 ; do # List sizes in rough order of prevalence. +- AC_TRY_COMPILE([#include "confdefs.h" +-#include <sys/types.h> +-$2 +-], [switch (0) case 0: case (sizeof ($1) == $ac_size):;], AC_CV_NAME=$ac_size) +- if test x$AC_CV_NAME != x ; then break; fi +-done +-]) +-if test x$AC_CV_NAME = x ; then +- AC_MSG_ERROR([cannot determine a size for $1]) +-fi +-AC_MSG_RESULT($AC_CV_NAME) +-AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The number of bytes in type $1]) +-undefine([AC_TYPE_NAME])dnl +-undefine([AC_CV_NAME])dnl +-]) +- +-AC_DEFUN([AC_C_BIGENDIAN_CROSS], +-[AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian, +-[ac_cv_c_bigendian=unknown +-# See if sys/param.h defines the BYTE_ORDER macro. +-AC_TRY_COMPILE([#include <sys/types.h> +-#include <sys/param.h>], [ +-#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN +- bogus endian macros +-#endif], [# It does; now see whether it defined to BIG_ENDIAN or not. +-AC_TRY_COMPILE([#include <sys/types.h> +-#include <sys/param.h>], [ +-#if BYTE_ORDER != BIG_ENDIAN +- not big endian +-#endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)]) +-if test $ac_cv_c_bigendian = unknown; then +-AC_TRY_RUN([main () { +- /* Are we little or big endian? From Harbison&Steele. */ +- union +- { +- long l; +- char c[sizeof (long)]; +- } u; +- u.l = 1; +- exit (u.c[sizeof (long) - 1] == 1); +-}], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes, +-[ echo $ac_n "cross-compiling... " 2>&AC_FD_MSG ]) +-fi]) +-if test $ac_cv_c_bigendian = unknown; then +-AC_MSG_CHECKING(to probe for byte ordering) +-[ +-cat >conftest.c <<EOF +-short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; +-short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; +-void _ascii() { char* s = (char*) ascii_mm; s = (char*) ascii_ii; } +-short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; +-short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; +-void _ebcdic() { char* s = (char*) ebcdic_mm; s = (char*) ebcdic_ii; } +-int main() { _ascii (); _ebcdic (); return 0; } +-EOF +-] if test -f conftest.c ; then +- if ${CC-cc} ${CFLAGS} conftest.c -o conftest.o && test -f conftest.o ; then +- if test `grep -l BIGenDianSyS conftest.o` ; then +- echo $ac_n ' big endian probe OK, ' 1>&AC_FD_MSG +- ac_cv_c_bigendian=yes +- fi +- if test `grep -l LiTTleEnDian conftest.o` ; then +- echo $ac_n ' little endian probe OK, ' 1>&AC_FD_MSG +- if test $ac_cv_c_bigendian = yes ; then +- ac_cv_c_bigendian=unknown; +- else +- ac_cv_c_bigendian=no +- fi +- fi +- echo $ac_n 'guessing bigendian ... ' >&AC_FD_MSG +- fi +- fi +-AC_MSG_RESULT($ac_cv_c_bigendian) +-fi +-if test $ac_cv_c_bigendian = yes; then +- AC_DEFINE(WORDS_BIGENDIAN, 1, [whether byteorder is bigendian]) +- BYTEORDER=4321 +-else +- BYTEORDER=1234 +-fi +-AC_DEFINE_UNQUOTED(BYTEORDER, $BYTEORDER, [1234 = LIL_ENDIAN, 4321 = BIGENDIAN]) +-if test $ac_cv_c_bigendian = unknown; then +- AC_MSG_ERROR(unknown endianess - sorry, please pre-set ac_cv_c_bigendian) +-fi +-]) ++sinclude(../config/accross.m4) + + # Like AC_CONFIG_HEADER, but automatically create stamp file. + +-AC_DEFUN(AM_CONFIG_HEADER, ++AC_DEFUN([AM_CONFIG_HEADER], + [AC_PREREQ([2.12]) + AC_CONFIG_HEADER([$1]) + dnl When config.status generates a header, we must update the stamp-h file. +@@ -147,7 +54,7 @@ + dnl Usage: + dnl AM_INIT_AUTOMAKE(package,version, [no-define]) + +-AC_DEFUN(AM_INIT_AUTOMAKE, ++AC_DEFUN([AM_INIT_AUTOMAKE], + [AC_REQUIRE([AC_PROG_INSTALL]) + PACKAGE=[$1] + AC_SUBST(PACKAGE) +@@ -175,7 +82,7 @@ + # Check to make sure that the build environment is sane. + # + +-AC_DEFUN(AM_SANITY_CHECK, ++AC_DEFUN([AM_SANITY_CHECK], + [AC_MSG_CHECKING([whether build environment is sane]) + # Just in case + sleep 1 +@@ -216,7 +123,7 @@ + + dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) + dnl The program must properly implement --version. +-AC_DEFUN(AM_MISSING_PROG, ++AC_DEFUN([AM_MISSING_PROG], + [AC_MSG_CHECKING(for working $2) + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. +@@ -235,7 +142,7 @@ + + # serial 1 + +-AC_DEFUN(AM_MAINTAINER_MODE, ++AC_DEFUN([AM_MAINTAINER_MODE], + [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) + dnl maintainer-mode is disabled by default + AC_ARG_ENABLE(maintainer-mode, +@@ -252,7 +159,7 @@ + + # Define a conditional. + +-AC_DEFUN(AM_CONDITIONAL, ++AC_DEFUN([AM_CONDITIONAL], + [AC_SUBST($1_TRUE) + AC_SUBST($1_FALSE) + if $2; then +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure gcc/libffi/configure +--- gcc-3.2.2.orig/libffi/configure Wed Jan 29 07:59:05 2003 ++++ gcc/libffi/configure Sat Feb 1 20:16:19 2003 +@@ -633,17 +633,16 @@ + + if test "${srcdir}" = "."; then + if test "${with_target_subdir}" != "."; then +- libffi_basedir="${srcdir}/${with_multisrctop}.." ++ libffi_basedir="${with_multisrctop}../" + else +- libffi_basedir="${srcdir}/${with_multisrctop}" ++ libffi_basedir="${with_multisrctop}" + fi + else +- libffi_basedir="${srcdir}" ++ libffi_basedir= + fi + +- + ac_aux_dir= +-for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do ++for ac_dir in ${libffi_basedir}.. $srcdir/${libffi_basedir}..; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" +@@ -655,13 +654,14 @@ + fi + done + if test -z "$ac_aux_dir"; then +- { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } ++ { echo "configure: error: can not find install-sh or install.sh in ${libffi_basedir}.. $srcdir/${libffi_basedir}.." 1>&2; exit 1; } + fi + ac_config_guess=$ac_aux_dir/config.guess + ac_config_sub=$ac_aux_dir/config.sub + ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. + + ++ + # Make sure we can run config.sub. + if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then : + else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; } +@@ -1238,9 +1238,18 @@ + ;; + + hpux10.20*|hpux11*) +- lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' +- lt_cv_file_magic_cmd=/usr/bin/file +- lt_cv_file_magic_test_file=/usr/lib/libc.sl ++ case $host_cpu in ++ hppa*) ++ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' ++ lt_cv_file_magic_cmd=/usr/bin/file ++ lt_cv_file_magic_test_file=/usr/lib/libc.sl ++ ;; ++ ia64*) ++ lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' ++ lt_cv_file_magic_cmd=/usr/bin/file ++ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ++ ;; ++ esac + ;; + + irix5* | irix6*) +@@ -1267,7 +1276,7 @@ + # This must be Linux ELF. + linux-gnu*) + case $host_cpu in +- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* ) ++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM +@@ -1330,13 +1339,13 @@ + deplibs_check_method=$lt_cv_deplibs_check_method + + echo $ac_n "checking for object suffix""... $ac_c" 1>&6 +-echo "configure:1334: checking for object suffix" >&5 ++echo "configure:1343: checking for object suffix" >&5 + if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + rm -f conftest* + echo 'int i = 1;' > conftest.$ac_ext +-if { (eval echo configure:1340: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:1349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + for ac_file in conftest.*; do + case $ac_file in + *.c) ;; +@@ -1356,7 +1365,7 @@ + + + echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 +-echo "configure:1360: checking for executable suffix" >&5 ++echo "configure:1369: checking for executable suffix" >&5 + if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1366,7 +1375,7 @@ + rm -f conftest* + echo 'int main () { return 0; }' > conftest.$ac_ext + ac_cv_exeext= +- if { (eval echo configure:1370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then ++ if { (eval echo configure:1379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + for file in conftest.*; do + case $file in + *.c | *.o | *.obj) ;; +@@ -1399,7 +1408,7 @@ + file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6 +-echo "configure:1403: checking for ${ac_tool_prefix}file" >&5 ++echo "configure:1412: checking for ${ac_tool_prefix}file" >&5 + if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1461,7 +1470,7 @@ + if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + echo $ac_n "checking for file""... $ac_c" 1>&6 +-echo "configure:1465: checking for file" >&5 ++echo "configure:1474: checking for file" >&5 + if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1532,7 +1541,7 @@ + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. + set dummy ${ac_tool_prefix}ranlib; ac_word=$2 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:1536: checking for $ac_word" >&5 ++echo "configure:1545: checking for $ac_word" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1564,7 +1573,7 @@ + # 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 +-echo "configure:1568: checking for $ac_word" >&5 ++echo "configure:1577: checking for $ac_word" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1599,7 +1608,7 @@ + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. + set dummy ${ac_tool_prefix}strip; ac_word=$2 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:1603: checking for $ac_word" >&5 ++echo "configure:1612: checking for $ac_word" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1631,7 +1640,7 @@ + # Extract the first word of "strip", so it can be a program name with args. + set dummy strip; ac_word=$2 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:1635: checking for $ac_word" >&5 ++echo "configure:1644: checking for $ac_word" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1698,8 +1707,8 @@ + case $host in + *-*-irix6*) + # Find out which ABI we are using. +- echo '#line 1702 "configure"' > conftest.$ac_ext +- if { (eval echo configure:1703: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ echo '#line 1711 "configure"' > conftest.$ac_ext ++ if { (eval echo configure:1712: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" +@@ -1715,12 +1724,70 @@ + rm -rf conftest* + ;; + ++ia64-*-hpux*) ++ # Find out which ABI we are using. ++ echo 'int i;' > conftest.$ac_ext ++ if { (eval echo configure:1731: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ case "`/usr/bin/file conftest.o`" in ++ *ELF-32*) ++ HPUX_IA64_MODE="32" ++ ;; ++ *ELF-64*) ++ HPUX_IA64_MODE="64" ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ ++x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*) ++ # Find out which ABI we are using. ++ echo 'int i;' > conftest.$ac_ext ++ if { (eval echo configure:1747: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++ case "`/usr/bin/file conftest.o`" in ++ *32-bit*) ++ case $host in ++ x86_64-*linux*) ++ LD="${LD-ld} -m elf_i386" ++ ;; ++ ppc64-*linux*) ++ LD="${LD-ld} -m elf32ppclinux" ++ ;; ++ s390x-*linux*) ++ LD="${LD-ld} -m elf_s390" ++ ;; ++ sparc64-*linux*) ++ LD="${LD-ld} -m elf32_sparc" ++ ;; ++ esac ++ ;; ++ *64-bit*) ++ case $host in ++ x86_64-*linux*) ++ LD="${LD-ld} -m elf_x86_64" ++ ;; ++ ppc*-*linux*|powerpc*-*linux*) ++ LD="${LD-ld} -m elf64ppc" ++ ;; ++ s390*-*linux*) ++ LD="${LD-ld} -m elf64_s390" ++ ;; ++ sparc*-*linux*) ++ LD="${LD-ld} -m elf64_sparc" ++ ;; ++ esac ++ ;; ++ esac ++ fi ++ rm -rf conftest* ++ ;; ++ + *-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6 +-echo "configure:1724: checking whether the C compiler needs -belf" >&5 ++echo "configure:1791: checking whether the C compiler needs -belf" >&5 + if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -1733,14 +1800,14 @@ + cross_compiling=$ac_cv_prog_cc_cross + + cat > conftest.$ac_ext <<EOF +-#line 1737 "configure" ++#line 1804 "configure" + #include "confdefs.h" + + int main() { + + ; return 0; } + EOF +-if { (eval echo configure:1744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++if { (eval echo configure:1811: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + lt_cv_cc_needs_belf=yes + else +@@ -1868,7 +1935,7 @@ + # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" + # ./install, which can be erroneously created by make from ./install.sh. + echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 +-echo "configure:1872: checking for a BSD compatible install" >&5 ++echo "configure:1939: checking for a BSD compatible install" >&5 + if test -z "$INSTALL"; then + if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +@@ -1921,7 +1988,7 @@ + test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 +-echo "configure:1925: checking whether build environment is sane" >&5 ++echo "configure:1992: checking whether build environment is sane" >&5 + # Just in case + sleep 1 + echo timestamp > conftestfile +@@ -1978,7 +2045,7 @@ + test "$program_transform_name" = "" && program_transform_name="s,x,x," + + echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 +-echo "configure:1982: checking whether ${MAKE-make} sets \${MAKE}" >&5 ++echo "configure:2049: checking whether ${MAKE-make} sets \${MAKE}" >&5 + set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` + if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +@@ -2017,7 +2084,7 @@ + + missing_dir=`cd $ac_aux_dir && pwd` + echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 +-echo "configure:2021: checking for working aclocal" >&5 ++echo "configure:2088: checking for working aclocal" >&5 + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. + # Redirect stdin to placate older versions of autoconf. Sigh. +@@ -2030,7 +2097,7 @@ + fi + + echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 +-echo "configure:2034: checking for working autoconf" >&5 ++echo "configure:2101: checking for working autoconf" >&5 + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. + # Redirect stdin to placate older versions of autoconf. Sigh. +@@ -2043,7 +2110,7 @@ + fi + + echo $ac_n "checking for working automake""... $ac_c" 1>&6 +-echo "configure:2047: checking for working automake" >&5 ++echo "configure:2114: checking for working automake" >&5 + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. + # Redirect stdin to placate older versions of autoconf. Sigh. +@@ -2056,7 +2123,7 @@ + fi + + echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 +-echo "configure:2060: checking for working autoheader" >&5 ++echo "configure:2127: checking for working autoheader" >&5 + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. + # Redirect stdin to placate older versions of autoconf. Sigh. +@@ -2069,7 +2136,7 @@ + fi + + echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 +-echo "configure:2073: checking for working makeinfo" >&5 ++echo "configure:2140: checking for working makeinfo" >&5 + # Run test in a subshell; some versions of sh will print an error if + # an executable is not found, even if stderr is redirected. + # Redirect stdin to placate older versions of autoconf. Sigh. +@@ -2086,7 +2153,7 @@ + + + echo $ac_n "checking for executable suffix""... $ac_c" 1>&6 +-echo "configure:2090: checking for executable suffix" >&5 ++echo "configure:2157: checking for executable suffix" >&5 + if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -2096,7 +2163,7 @@ + rm -f conftest* + echo 'int main () { return 0; }' > conftest.$ac_ext + ac_cv_exeext= +- if { (eval echo configure:2100: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then ++ if { (eval echo configure:2167: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then + for file in conftest.*; do + case $file in + *.c | *.o | *.obj) ;; +@@ -2117,7 +2184,7 @@ + ac_exeext=$EXEEXT + + echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6 +-echo "configure:2121: checking whether to enable maintainer-specific portions of Makefiles" >&5 ++echo "configure:2188: checking whether to enable maintainer-specific portions of Makefiles" >&5 + # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. + if test "${enable_maintainer_mode+set}" = set; then + enableval="$enable_maintainer_mode" +@@ -2143,7 +2210,7 @@ + # 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 +-echo "configure:2147: checking for $ac_word" >&5 ++echo "configure:2214: checking for $ac_word" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -2173,7 +2240,7 @@ + # 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 +-echo "configure:2177: checking for $ac_word" >&5 ++echo "configure:2244: checking for $ac_word" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -2224,7 +2291,7 @@ + # Extract the first word of "cl", so it can be a program name with args. + set dummy cl; ac_word=$2 + echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +-echo "configure:2228: checking for $ac_word" >&5 ++echo "configure:2295: checking for $ac_word" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -2256,7 +2323,7 @@ + fi + + echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +-echo "configure:2260: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ++echo "configure:2327: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + + ac_ext=c + # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +@@ -2267,12 +2334,12 @@ + + cat > conftest.$ac_ext << EOF + +-#line 2271 "configure" ++#line 2338 "configure" + #include "confdefs.h" + + main(){return(0);} + EOF +-if { (eval echo configure:2276: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++if { (eval echo configure:2343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then +@@ -2298,12 +2365,12 @@ + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } + fi + echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +-echo "configure:2302: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 ++echo "configure:2369: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 + echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 + cross_compiling=$ac_cv_prog_cc_cross + + echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +-echo "configure:2307: checking whether we are using GNU C" >&5 ++echo "configure:2374: checking whether we are using GNU C" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -2312,7 +2379,7 @@ + yes; + #endif + EOF +-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2316: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ++if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2383: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes + else + ac_cv_prog_gcc=no +@@ -2331,7 +2398,7 @@ + ac_save_CFLAGS="$CFLAGS" + CFLAGS= + echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +-echo "configure:2335: checking whether ${CC-cc} accepts -g" >&5 ++echo "configure:2402: checking whether ${CC-cc} accepts -g" >&5 + if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -2381,17 +2448,23 @@ + i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;; + sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;; + sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;; +-sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; +-sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; +-alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;; ++sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;; ++sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;; ++alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;; + ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;; + m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;; ++mips64*-*);; ++mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;; + powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;; + powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;; + powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;; + powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; + rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; + arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;; ++s390-*-linux-*) TARGET=S390; TARGETDIR=s390;; ++s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;; ++x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;; ++sh-*-linux* | sh[34]*-*-linux*) TARGET=SH; TARGETDIR=sh;; + esac + + if test $TARGETDIR = unknown; then +@@ -2418,6 +2491,15 @@ + fi + + ++if test x$TARGET = xMIPS_LINUX; then ++ MIPS_LINUX_TRUE= ++ MIPS_LINUX_FALSE='#' ++else ++ MIPS_LINUX_TRUE='#' ++ MIPS_LINUX_FALSE= ++fi ++ ++ + if test x$TARGET = xSPARC; then + SPARC_TRUE= + SPARC_FALSE='#' +@@ -2507,8 +2589,39 @@ + ARM_FALSE= + fi + ++ ++if test x$TARGET = xS390; then ++ S390_TRUE= ++ S390_FALSE='#' ++else ++ S390_TRUE='#' ++ S390_FALSE= ++fi ++ ++ ++if test x$TARGET = xX86_64; then ++ X86_64_TRUE= ++ X86_64_FALSE='#' ++else ++ X86_64_TRUE='#' ++ X86_64_FALSE= ++fi ++ ++ ++if test x$TARGET = xSH; then ++ SH_TRUE= ++ SH_FALSE='#' ++else ++ SH_TRUE='#' ++ SH_FALSE= ++fi ++ ++if test x$TARGET = xMIPS_LINUX; then ++ TARGET=MIPS ++fi ++ + echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +-echo "configure:2512: checking how to run the C preprocessor" >&5 ++echo "configure:2625: checking how to run the C preprocessor" >&5 + # On Suns, sometimes $CPP names a directory. + if test -n "$CPP" && test -d "$CPP"; then + CPP= +@@ -2523,13 +2636,13 @@ + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext <<EOF +-#line 2527 "configure" ++#line 2640 "configure" + #include "confdefs.h" + #include <assert.h> + Syntax Error + EOF + ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +-{ (eval echo configure:2533: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++{ (eval echo configure:2646: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } + ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` + if test -z "$ac_err"; then + : +@@ -2540,13 +2653,13 @@ + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext <<EOF +-#line 2544 "configure" ++#line 2657 "configure" + #include "confdefs.h" + #include <assert.h> + Syntax Error + EOF + ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +-{ (eval echo configure:2550: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++{ (eval echo configure:2663: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } + ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` + if test -z "$ac_err"; then + : +@@ -2557,13 +2670,13 @@ + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext <<EOF +-#line 2561 "configure" ++#line 2674 "configure" + #include "confdefs.h" + #include <assert.h> + Syntax Error + EOF + ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +-{ (eval echo configure:2567: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++{ (eval echo configure:2680: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } + ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` + if test -z "$ac_err"; then + : +@@ -2588,12 +2701,12 @@ + echo "$ac_t""$CPP" 1>&6 + + echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +-echo "configure:2592: checking for ANSI C header files" >&5 ++echo "configure:2705: checking for ANSI C header files" >&5 + if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext <<EOF +-#line 2597 "configure" ++#line 2710 "configure" + #include "confdefs.h" + #include <stdlib.h> + #include <stdarg.h> +@@ -2601,7 +2714,7 @@ + #include <float.h> + EOF + ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +-{ (eval echo configure:2605: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ++{ (eval echo configure:2718: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } + ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` + if test -z "$ac_err"; then + rm -rf conftest* +@@ -2618,7 +2731,7 @@ + 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 +-#line 2622 "configure" ++#line 2735 "configure" + #include "confdefs.h" + #include <string.h> + EOF +@@ -2636,7 +2749,7 @@ + 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 +-#line 2640 "configure" ++#line 2753 "configure" + #include "confdefs.h" + #include <stdlib.h> + EOF +@@ -2657,7 +2770,7 @@ + : + else + cat > conftest.$ac_ext <<EOF +-#line 2661 "configure" ++#line 2774 "configure" + #include "confdefs.h" + #include <ctype.h> + #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +@@ -2668,7 +2781,7 @@ + exit (0); } + + EOF +-if { (eval echo configure:2672: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ++if { (eval echo configure:2785: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null + then + : + else +@@ -2694,12 +2807,12 @@ + for ac_func in memcpy + do + echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 +-echo "configure:2698: checking for $ac_func" >&5 ++echo "configure:2811: checking for $ac_func" >&5 + 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 <<EOF +-#line 2703 "configure" ++#line 2816 "configure" + #include "confdefs.h" + /* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func(); below. */ +@@ -2722,7 +2835,7 @@ + + ; return 0; } + EOF +-if { (eval echo configure:2726: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++if { (eval echo configure:2839: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" + else +@@ -2749,19 +2862,19 @@ + # 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 +-echo "configure:2753: checking for working alloca.h" >&5 ++echo "configure:2866: checking for working alloca.h" >&5 + 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 <<EOF +-#line 2758 "configure" ++#line 2871 "configure" + #include "confdefs.h" + #include <alloca.h> + int main() { + char *p = alloca(2 * sizeof(int)); + ; return 0; } + EOF +-if { (eval echo configure:2765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++if { (eval echo configure:2878: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_cv_header_alloca_h=yes + else +@@ -2782,12 +2895,12 @@ + fi + + echo $ac_n "checking for alloca""... $ac_c" 1>&6 +-echo "configure:2786: checking for alloca" >&5 ++echo "configure:2899: checking for alloca" >&5 + if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext <<EOF +-#line 2791 "configure" ++#line 2904 "configure" + #include "confdefs.h" + + #ifdef __GNUC__ +@@ -2815,7 +2928,7 @@ + char *p = (char *) alloca(1); + ; return 0; } + EOF +-if { (eval echo configure:2819: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++if { (eval echo configure:2932: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + ac_cv_func_alloca_works=yes + else +@@ -2847,12 +2960,12 @@ + + + echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6 +-echo "configure:2851: checking whether alloca needs Cray hooks" >&5 ++echo "configure:2964: checking whether alloca needs Cray hooks" >&5 + if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + cat > conftest.$ac_ext <<EOF +-#line 2856 "configure" ++#line 2969 "configure" + #include "confdefs.h" + #if defined(CRAY) && ! defined(CRAY2) + webecray +@@ -2877,12 +2990,12 @@ + 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 +-echo "configure:2881: checking for $ac_func" >&5 ++echo "configure:2994: checking for $ac_func" >&5 + 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 <<EOF +-#line 2886 "configure" ++#line 2999 "configure" + #include "confdefs.h" + /* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func(); below. */ +@@ -2905,7 +3018,7 @@ + + ; return 0; } + EOF +-if { (eval echo configure:2909: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++if { (eval echo configure:3022: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_$ac_func=yes" + else +@@ -2932,7 +3045,7 @@ + fi + + echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6 +-echo "configure:2936: checking stack direction for C alloca" >&5 ++echo "configure:3049: checking stack direction for C alloca" >&5 + if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -2940,7 +3053,7 @@ + ac_cv_c_stack_direction=0 + else + cat > conftest.$ac_ext <<EOF +-#line 2944 "configure" ++#line 3057 "configure" + #include "confdefs.h" + find_stack_direction () + { +@@ -2959,7 +3072,7 @@ + exit (find_stack_direction() < 0); + } + EOF +-if { (eval echo configure:2963: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ++if { (eval echo configure:3076: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null + then + ac_cv_c_stack_direction=1 + else +@@ -2982,13 +3095,13 @@ + + + echo $ac_n "checking size of short""... $ac_c" 1>&6 +-echo "configure:2986: checking size of short" >&5 ++echo "configure:3099: checking size of short" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext <<EOF +-#line 2992 "configure" ++#line 3105 "configure" + #include "confdefs.h" + #include "confdefs.h" + #include <sys/types.h> +@@ -2998,7 +3111,7 @@ + switch (0) case 0: case (sizeof (short) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3002: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3115: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_short=$ac_size + else +@@ -3021,13 +3134,13 @@ + + + echo $ac_n "checking size of int""... $ac_c" 1>&6 +-echo "configure:3025: checking size of int" >&5 ++echo "configure:3138: checking size of int" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext <<EOF +-#line 3031 "configure" ++#line 3144 "configure" + #include "confdefs.h" + #include "confdefs.h" + #include <sys/types.h> +@@ -3037,7 +3150,7 @@ + switch (0) case 0: case (sizeof (int) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3041: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3154: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_int=$ac_size + else +@@ -3060,13 +3173,13 @@ + + + echo $ac_n "checking size of long""... $ac_c" 1>&6 +-echo "configure:3064: checking size of long" >&5 ++echo "configure:3177: checking size of long" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext <<EOF +-#line 3070 "configure" ++#line 3183 "configure" + #include "confdefs.h" + #include "confdefs.h" + #include <sys/types.h> +@@ -3076,7 +3189,7 @@ + switch (0) case 0: case (sizeof (long) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3080: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3193: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_long=$ac_size + else +@@ -3099,13 +3212,13 @@ + + + echo $ac_n "checking size of long long""... $ac_c" 1>&6 +-echo "configure:3103: checking size of long long" >&5 ++echo "configure:3216: checking size of long long" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_long_long'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext <<EOF +-#line 3109 "configure" ++#line 3222 "configure" + #include "confdefs.h" + #include "confdefs.h" + #include <sys/types.h> +@@ -3115,7 +3228,7 @@ + switch (0) case 0: case (sizeof (long long) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3119: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3232: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_long_long=$ac_size + else +@@ -3138,13 +3251,13 @@ + + + echo $ac_n "checking size of float""... $ac_c" 1>&6 +-echo "configure:3142: checking size of float" >&5 ++echo "configure:3255: checking size of float" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_float'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext <<EOF +-#line 3148 "configure" ++#line 3261 "configure" + #include "confdefs.h" + #include "confdefs.h" + #include <sys/types.h> +@@ -3154,7 +3267,7 @@ + switch (0) case 0: case (sizeof (float) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3158: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3271: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_float=$ac_size + else +@@ -3177,13 +3290,13 @@ + + + echo $ac_n "checking size of double""... $ac_c" 1>&6 +-echo "configure:3181: checking size of double" >&5 ++echo "configure:3294: checking size of double" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_double'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext <<EOF +-#line 3187 "configure" ++#line 3300 "configure" + #include "confdefs.h" + #include "confdefs.h" + #include <sys/types.h> +@@ -3193,7 +3306,7 @@ + switch (0) case 0: case (sizeof (double) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3197: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3310: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_double=$ac_size + else +@@ -3216,13 +3329,13 @@ + + + echo $ac_n "checking size of long double""... $ac_c" 1>&6 +-echo "configure:3220: checking size of long double" >&5 ++echo "configure:3333: checking size of long double" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_long_double'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext <<EOF +-#line 3226 "configure" ++#line 3339 "configure" + #include "confdefs.h" + #include "confdefs.h" + #include <sys/types.h> +@@ -3232,7 +3345,7 @@ + switch (0) case 0: case (sizeof (long double) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3236: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3349: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_long_double=$ac_size + else +@@ -3256,13 +3369,13 @@ + + + echo $ac_n "checking size of void *""... $ac_c" 1>&6 +-echo "configure:3260: checking size of void *" >&5 ++echo "configure:3373: checking size of void *" >&5 + if eval "test \"`echo '$''{'ac_cv_sizeof_void_p'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + for ac_size in 4 8 1 2 16 12 ; do # List sizes in rough order of prevalence. + cat > conftest.$ac_ext <<EOF +-#line 3266 "configure" ++#line 3379 "configure" + #include "confdefs.h" + #include "confdefs.h" + #include <sys/types.h> +@@ -3272,7 +3385,7 @@ + switch (0) case 0: case (sizeof (void *) == $ac_size):; + ; return 0; } + EOF +-if { (eval echo configure:3276: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3389: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_sizeof_void_p=$ac_size + else +@@ -3295,14 +3408,14 @@ + + + echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6 +-echo "configure:3299: checking whether byte ordering is bigendian" >&5 ++echo "configure:3412: checking whether byte ordering is bigendian" >&5 + if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else + ac_cv_c_bigendian=unknown + # See if sys/param.h defines the BYTE_ORDER macro. + cat > conftest.$ac_ext <<EOF +-#line 3306 "configure" ++#line 3419 "configure" + #include "confdefs.h" + #include <sys/types.h> + #include <sys/param.h> +@@ -3313,11 +3426,11 @@ + #endif + ; return 0; } + EOF +-if { (eval echo configure:3317: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3430: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + # It does; now see whether it defined to BIG_ENDIAN or not. + cat > conftest.$ac_ext <<EOF +-#line 3321 "configure" ++#line 3434 "configure" + #include "confdefs.h" + #include <sys/types.h> + #include <sys/param.h> +@@ -3328,7 +3441,7 @@ + #endif + ; return 0; } + EOF +-if { (eval echo configure:3332: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then ++if { (eval echo configure:3445: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_c_bigendian=yes + else +@@ -3348,7 +3461,7 @@ + echo $ac_n "cross-compiling... " 2>&6 + else + cat > conftest.$ac_ext <<EOF +-#line 3352 "configure" ++#line 3465 "configure" + #include "confdefs.h" + main () { + /* Are we little or big endian? From Harbison&Steele. */ +@@ -3361,7 +3474,7 @@ + exit (u.c[sizeof (long) - 1] == 1); + } + EOF +-if { (eval echo configure:3365: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null ++if { (eval echo configure:3478: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null + then + ac_cv_c_bigendian=no + else +@@ -3379,7 +3492,7 @@ + echo "$ac_t""$ac_cv_c_bigendian" 1>&6 + if test $ac_cv_c_bigendian = unknown; then + echo $ac_n "checking to probe for byte ordering""... $ac_c" 1>&6 +-echo "configure:3383: checking to probe for byte ordering" >&5 ++echo "configure:3496: checking to probe for byte ordering" >&5 + + cat >conftest.c <<EOF + short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; +@@ -3414,6 +3527,10 @@ + #define WORDS_BIGENDIAN 1 + EOF + ++ cat >> confdefs.h <<\EOF ++#define HOST_WORDS_BIG_ENDIAN 1 ++EOF ++ + BYTEORDER=4321 + else + BYTEORDER=1234 +@@ -3429,7 +3546,7 @@ + + if test x$TARGET = xSPARC; then + echo $ac_n "checking assembler and linker support unaligned pc related relocs""... $ac_c" 1>&6 +-echo "configure:3433: checking assembler and linker support unaligned pc related relocs" >&5 ++echo "configure:3550: checking assembler and linker support unaligned pc related relocs" >&5 + if eval "test \"`echo '$''{'libffi_cv_as_sparc_ua_pcrel'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 + else +@@ -3439,14 +3556,14 @@ + CFLAGS="$CFLAGS -fpic" + LDFLAGS="$LDFLAGS -shared" + cat > conftest.$ac_ext <<EOF +-#line 3443 "configure" ++#line 3560 "configure" + #include "confdefs.h" + asm (".text; foo: nop; .data; .align 4; .byte 0; .uaword %r_disp32(foo); .text"); + int main() { + + ; return 0; } + EOF +-if { (eval echo configure:3450: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ++if { (eval echo configure:3567: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + libffi_cv_as_sparc_ua_pcrel=yes + else +@@ -3709,6 +3826,8 @@ + s%@MIPS_GCC_FALSE@%$MIPS_GCC_FALSE%g + s%@MIPS_SGI_TRUE@%$MIPS_SGI_TRUE%g + s%@MIPS_SGI_FALSE@%$MIPS_SGI_FALSE%g ++s%@MIPS_LINUX_TRUE@%$MIPS_LINUX_TRUE%g ++s%@MIPS_LINUX_FALSE@%$MIPS_LINUX_FALSE%g + s%@SPARC_TRUE@%$SPARC_TRUE%g + s%@SPARC_FALSE@%$SPARC_FALSE%g + s%@X86_TRUE@%$X86_TRUE%g +@@ -3729,6 +3848,12 @@ + s%@POWERPC_DARWIN_FALSE@%$POWERPC_DARWIN_FALSE%g + s%@ARM_TRUE@%$ARM_TRUE%g + s%@ARM_FALSE@%$ARM_FALSE%g ++s%@S390_TRUE@%$S390_TRUE%g ++s%@S390_FALSE@%$S390_FALSE%g ++s%@X86_64_TRUE@%$X86_64_TRUE%g ++s%@X86_64_FALSE@%$X86_64_FALSE%g ++s%@SH_TRUE@%$SH_TRUE%g ++s%@SH_FALSE@%$SH_FALSE%g + s%@CPP@%$CPP%g + s%@ALLOCA@%$ALLOCA%g + s%@TARGET@%$TARGET%g +@@ -3969,7 +4094,7 @@ + + if test -n "$CONFIG_FILES"; then + LD="${ORIGINAL_LD_FOR_MULTILIBS}" +- ac_file=Makefile . ${libffi_basedir}/../config-ml.in ++ ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in + fi + + exit 0 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/configure.in gcc/libffi/configure.in +--- gcc-3.2.2.orig/libffi/configure.in Tue Jan 28 10:43:56 2003 ++++ gcc/libffi/configure.in Sat Feb 1 20:16:19 2003 +@@ -22,14 +22,15 @@ + + if test "${srcdir}" = "."; then + if test "${with_target_subdir}" != "."; then +- libffi_basedir="${srcdir}/${with_multisrctop}.." ++ libffi_basedir="${with_multisrctop}../" + else +- libffi_basedir="${srcdir}/${with_multisrctop}" ++ libffi_basedir="${with_multisrctop}" + fi + else +- libffi_basedir="${srcdir}" ++ libffi_basedir= + fi + AC_SUBST(libffi_basedir) ++AC_CONFIG_AUX_DIR(${libffi_basedir}..) + + AC_CANONICAL_HOST + +@@ -56,17 +57,23 @@ + i*86-*-mingw*) TARGET=X86_WIN32; TARGETDIR=x86;; + sparc-sun-4*) TARGET=SPARC; TARGETDIR=sparc;; + sparc*-sun-*) TARGET=SPARC; TARGETDIR=sparc;; +-sparc-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; +-sparc64-*-linux*) TARGET=SPARC; TARGETDIR=sparc;; +-alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd*) TARGET=ALPHA; TARGETDIR=alpha;; ++sparc-*-linux* | sparc-*-netbsdelf*) TARGET=SPARC; TARGETDIR=sparc;; ++sparc64-*-linux* | sparc64-*-netbsd*) TARGET=SPARC; TARGETDIR=sparc;; ++alpha*-*-linux* | alpha*-*-osf* | alpha*-*-freebsd* | alpha*-*-netbsd*) TARGET=ALPHA; TARGETDIR=alpha;; + ia64*-*-*) TARGET=IA64; TARGETDIR=ia64;; + m68k-*-linux*) TARGET=M68K; TARGETDIR=m68k;; ++mips64*-*);; ++mips*-*-linux*) TARGET=MIPS_LINUX; TARGETDIR=mips;; + powerpc-*-linux* | powerpc-*-sysv*) TARGET=POWERPC; TARGETDIR=powerpc;; + powerpc-*-beos*) TARGET=POWERPC; TARGETDIR=powerpc;; + powerpc-*-darwin*) TARGET=POWERPC_DARWIN; TARGETDIR=powerpc;; + powerpc-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; + rs6000-*-aix*) TARGET=POWERPC_AIX; TARGETDIR=powerpc;; + arm*-*-linux-*) TARGET=ARM; TARGETDIR=arm;; ++s390-*-linux-*) TARGET=S390; TARGETDIR=s390;; ++s390x-*-linux-*) TARGET=S390; TARGETDIR=s390;; ++x86_64-*-linux*) TARGET=X86_64; TARGETDIR=x86;; ++sh-*-linux* | sh[[34]]*-*-linux*) TARGET=SH; TARGETDIR=sh;; + esac + + if test $TARGETDIR = unknown; then +@@ -75,6 +82,7 @@ + + AM_CONDITIONAL(MIPS_GCC, test ${TARGET}${ac_cv_prog_gcc} = MIPSyes) + AM_CONDITIONAL(MIPS_SGI, test ${TARGET}${ac_cv_prog_gcc} = MIPSno) ++AM_CONDITIONAL(MIPS_LINUX, test x$TARGET = xMIPS_LINUX) + AM_CONDITIONAL(SPARC, test x$TARGET = xSPARC) + AM_CONDITIONAL(X86, test x$TARGET = xX86) + AM_CONDITIONAL(X86_WIN32, test x$TARGET = xX86_WIN32) +@@ -85,6 +93,13 @@ + AM_CONDITIONAL(POWERPC_AIX, test x$TARGET = xPOWERPC_AIX) + AM_CONDITIONAL(POWERPC_DARWIN, test x$TARGET = xPOWERPC_DARWIN) + AM_CONDITIONAL(ARM, test x$TARGET = xARM) ++AM_CONDITIONAL(S390, test x$TARGET = xS390) ++AM_CONDITIONAL(X86_64, test x$TARGET = xX86_64) ++AM_CONDITIONAL(SH, test x$TARGET = xSH) ++ ++if test x$TARGET = xMIPS_LINUX; then ++ TARGET=MIPS ++fi + + AC_HEADER_STDC + AC_CHECK_FUNCS(memcpy) +@@ -171,7 +186,7 @@ + [ + if test -n "$CONFIG_FILES"; then + LD="${ORIGINAL_LD_FOR_MULTILIBS}" +- ac_file=Makefile . ${libffi_basedir}/../config-ml.in ++ ac_file=Makefile . ${srcdir}/${libffi_basedir}../config-ml.in + fi + ], + srcdir=${srcdir} +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/Makefile.in gcc/libffi/include/Makefile.in +--- gcc-3.2.2.orig/libffi/include/Makefile.in Tue Oct 9 14:32:16 2001 ++++ gcc/libffi/include/Makefile.in Mon Apr 29 13:14:44 2002 +@@ -99,7 +99,7 @@ + + DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) + +-TAR = gnutar ++TAR = gtar + GZIP_ENV = --best + all: all-redirect + .SUFFIXES: +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/include/ffi.h.in gcc/libffi/include/ffi.h.in +--- gcc-3.2.2.orig/libffi/include/ffi.h.in Wed Mar 13 07:35:56 2002 ++++ gcc/libffi/include/ffi.h.in Wed Jan 29 00:54:28 2003 +@@ -1,5 +1,5 @@ + /* -----------------------------------------------------------------*-C-*- +- libffi @VERSION@ - Copyright (c) 1996-2002 Cygnus Solutions ++ libffi @VERSION@ - Copyright (c) 1996-2003 Cygnus Solutions + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the +@@ -164,6 +164,12 @@ + #endif + #endif + ++#ifdef S390 ++#if defined (__s390x__) ++#define S390X ++#endif ++#endif ++ + #ifndef LIBFFI_ASM + + /* ---- Generic type definitions ----------------------------------------- */ +@@ -189,16 +195,23 @@ + #endif + #endif + +- /* ---- Intel x86 ---------------- */ +-#ifdef X86 ++ /* ---- Intel x86 Win32 ---------- */ ++#ifdef X86_WIN32 + FFI_SYSV, ++ FFI_STDCALL, ++ /* TODO: Add fastcall support for the sake of completeness */ + FFI_DEFAULT_ABI = FFI_SYSV, + #endif + +- /* ---- Intel x86 Win32 ---------- */ +-#ifdef X86_WIN32 ++ /* ---- Intel x86 and AMD x86-64 - */ ++#if !defined(X86_WIN32) && (defined(__i386__) || defined(__x86_64__)) + FFI_SYSV, ++ FFI_UNIX64, /* Unix variants all use the same ABI for x86-64 */ ++#ifdef __i386__ + FFI_DEFAULT_ABI = FFI_SYSV, ++#else ++ FFI_DEFAULT_ABI = FFI_UNIX64, ++#endif + #endif + + /* ---- Intel ia64 ---------------- */ +@@ -251,6 +264,18 @@ + FFI_DEFAULT_ABI = FFI_SYSV, + #endif + ++ /* ---- S390 --------------------- */ ++#ifdef S390 ++ FFI_SYSV, ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ ++ /* ---- SuperH ------------------- */ ++#ifdef SH ++ FFI_SYSV, ++ FFI_DEFAULT_ABI = FFI_SYSV, ++#endif ++ + /* Leave this for debugging purposes */ + FFI_LAST_ABI + +@@ -264,7 +289,7 @@ + /*@null@*/ struct _ffi_type **elements; + } ffi_type; + +-/* These are defined in ffi.c */ ++/* These are defined in types.c */ + extern ffi_type ffi_type_void; + extern ffi_type ffi_type_uint8; + extern ffi_type ffi_type_sint8; +@@ -373,13 +398,7 @@ + + /* ---- Definitions for closures ----------------------------------------- */ + +-#ifdef X86 +- +-#define FFI_CLOSURES 1 /* x86 supports closures */ +-#define FFI_TRAMPOLINE_SIZE 10 +-#define FFI_NATIVE_RAW_API 1 /* and has native raw api support */ +- +-#elif defined(X86_WIN32) ++#ifdef __i386__ + + #define FFI_CLOSURES 1 /* x86 supports closures */ + #define FFI_TRAMPOLINE_SIZE 10 +@@ -424,6 +443,40 @@ + #define FFI_TRAMPOLINE_SIZE 24 /* see struct below */ + #define FFI_NATIVE_RAW_API 0 + ++#elif defined(SPARC64) ++ ++#define FFI_CLOSURES 1 ++#define FFI_TRAMPOLINE_SIZE 24 ++#define FFI_NATIVE_RAW_API 0 ++ ++#elif defined(SPARC) ++ ++#define FFI_CLOSURES 1 ++#define FFI_TRAMPOLINE_SIZE 16 ++#define FFI_NATIVE_RAW_API 0 ++ ++#elif defined(S390) ++ ++#define FFI_CLOSURES 1 ++#ifdef S390X ++#define FFI_TRAMPOLINE_SIZE 32 ++#else ++#define FFI_TRAMPOLINE_SIZE 16 ++#endif ++#define FFI_NATIVE_RAW_API 0 ++ ++#elif defined(SH) ++ ++#define FFI_CLOSURES 1 ++#define FFI_TRAMPOLINE_SIZE 16 ++#define FFI_NATIVE_RAW_API 0 ++ ++#elif defined(__x86_64__) ++ ++#define FFI_CLOSURES 1 ++#define FFI_TRAMPOLINE_SIZE 24 ++#define FFI_NATIVE_RAW_API 0 ++ + #else + + #define FFI_CLOSURES 0 +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/ffi.c gcc/libffi/src/arm/ffi.c +--- gcc-3.2.2.orig/libffi/src/arm/ffi.c Sat Mar 3 07:21:23 2001 ++++ gcc/libffi/src/arm/ffi.c Fri Jul 19 08:08:30 2002 +@@ -36,13 +36,10 @@ + /*@=exportheader@*/ + { + register unsigned int i; +- register int tmp; +- register unsigned int avn; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + +- tmp = 0; + argp = stack; + + if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) { +@@ -50,11 +47,10 @@ + argp += 4; + } + +- avn = ecif->cif->nargs; + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; +- (i != 0) && (avn != 0); ++ (i != 0); + i--, p_arg++) + { + size_t z; +@@ -64,9 +60,6 @@ + argp = (char *) ALIGN(argp, (*p_arg)->alignment); + } + +- if (avn != 0) +- { +- avn--; + z = (*p_arg)->size; + if (z < sizeof(int)) + { +@@ -107,7 +100,6 @@ + } + p_argv++; + argp += z; +- } + } + + return; +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/arm/sysv.S gcc/libffi/src/arm/sysv.S +--- gcc-3.2.2.orig/libffi/src/arm/sysv.S Sat Mar 3 07:21:23 2001 ++++ gcc/libffi/src/arm/sysv.S Mon Sep 30 03:08:58 2002 +@@ -28,8 +28,15 @@ + #ifdef HAVE_MACHINE_ASM_H + #include <machine/asm.h> + #else +-/* XXX these lose for some platforms, I'm sure. */ ++#ifdef __USER_LABEL_PREFIX__ ++#define CONCAT1(a, b) CONCAT2(a, b) ++#define CONCAT2(a, b) a ## b ++ ++/* Use the right prefix for global labels. */ ++#define CNAME(x) CONCAT1 (__USER_LABEL_PREFIX__, x) ++#else + #define CNAME(x) x ++#endif + #define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): + #endif + +@@ -96,12 +103,20 @@ + + # return FLOAT + cmp a4, #FFI_TYPE_FLOAT ++#ifdef __SOFTFP__ ++ streq a1, [a3] ++#else + stfeqs f0, [a3] ++#endif + beq epilogue + + # return DOUBLE or LONGDOUBLE + cmp a4, #FFI_TYPE_DOUBLE ++#ifdef __SOFTFP__ ++ stmeqia a3, {a1, a2} ++#else + stfeqd f0, [a3] ++#endif + + epilogue: + ldmfd sp!, {a1-a4, fp, pc} +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/java_raw_api.c gcc/libffi/src/java_raw_api.c +--- gcc-3.2.2.orig/libffi/src/java_raw_api.c Tue Apr 9 07:31:14 2002 ++++ gcc/libffi/src/java_raw_api.c Tue Oct 8 23:55:02 2002 +@@ -81,21 +81,14 @@ + { + case FFI_TYPE_UINT8: + case FFI_TYPE_SINT8: +- *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 1); ++ *args = (void*) ((char*)(raw++) + 3); + break; + + case FFI_TYPE_UINT16: + case FFI_TYPE_SINT16: +- *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 2); ++ *args = (void*) ((char*)(raw++) + 2); + break; + +-#if SIZEOF_ARG >= 4 +- case FFI_TYPE_UINT32: +- case FFI_TYPE_SINT32: +- *args = (void*) ((char*)(raw++) + SIZEOF_ARG - 4); +- break; +-#endif +- + #if SIZEOF_ARG == 8 + case FFI_TYPE_UINT64: + case FFI_TYPE_SINT64: +@@ -157,31 +150,54 @@ + switch ((*tp)->type) + { + case FFI_TYPE_UINT8: ++#if WORDS_BIGENDIAN ++ *(UINT32*)(raw++) = *(UINT8*) (*args); ++#else + (raw++)->uint = *(UINT8*) (*args); ++#endif + break; + + case FFI_TYPE_SINT8: ++#if WORDS_BIGENDIAN ++ *(SINT32*)(raw++) = *(SINT8*) (*args); ++#else + (raw++)->sint = *(SINT8*) (*args); ++#endif + break; + + case FFI_TYPE_UINT16: ++#if WORDS_BIGENDIAN ++ *(UINT32*)(raw++) = *(UINT16*) (*args); ++#else + (raw++)->uint = *(UINT16*) (*args); ++#endif + break; + + case FFI_TYPE_SINT16: ++#if WORDS_BIGENDIAN ++ *(SINT32*)(raw++) = *(SINT16*) (*args); ++#else + (raw++)->sint = *(SINT16*) (*args); ++#endif + break; + +-#if SIZEOF_ARG >= 4 + case FFI_TYPE_UINT32: ++#if WORDS_BIGENDIAN ++ *(UINT32*)(raw++) = *(UINT32*) (*args); ++#else + (raw++)->uint = *(UINT32*) (*args); ++#endif + break; + + case FFI_TYPE_SINT32: ++#if WORDS_BIGENDIAN ++ *(SINT32*)(raw++) = *(SINT32*) (*args); ++#else + (raw++)->sint = *(SINT32*) (*args); +- break; + #endif +- case FFI_TYPE_FLOAT: ++ break; ++ ++ case FFI_TYPE_FLOAT: + (raw++)->flt = *(FLOAT32*) (*args); + break; + +@@ -211,6 +227,55 @@ + + #if !FFI_NATIVE_RAW_API + ++static void ++ffi_java_rvalue_to_raw (ffi_cif *cif, void *rvalue) ++{ ++#if WORDS_BIGENDIAN && SIZEOF_ARG == 8 ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_UINT32: ++ *(UINT64 *)rvalue <<= 32; ++ break; ++ ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_INT: ++ *(SINT64 *)rvalue <<= 32; ++ break; ++ ++ default: ++ break; ++ } ++#endif ++} ++ ++static void ++ffi_java_raw_to_rvalue (ffi_cif *cif, void *rvalue) ++{ ++#if WORDS_BIGENDIAN && SIZEOF_ARG == 8 ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_UINT32: ++ *(UINT64 *)rvalue >>= 32; ++ break; ++ ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_INT: ++ *(SINT64 *)rvalue >>= 32; ++ break; ++ ++ default: ++ break; ++ } ++#endif ++} + + /* This is a generic definition of ffi_raw_call, to be used if the + * native system does not provide a machine-specific implementation. +@@ -227,6 +292,7 @@ + void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); + ffi_java_raw_to_ptrarray (cif, raw, avalue); + ffi_call (cif, fn, rvalue, avalue); ++ ffi_java_rvalue_to_raw (cif, rvalue); + } + + #if FFI_CLOSURES /* base system provides closures */ +@@ -240,6 +306,7 @@ + + ffi_java_ptrarray_to_raw (cif, avalue, raw); + (*cl->fun) (cif, rvalue, raw, cl->user_data); ++ ffi_java_raw_to_rvalue (cif, rvalue); + } + + /* Again, here is the generic version of ffi_prep_raw_closure, which +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/m68k/ffi.c gcc/libffi/src/m68k/ffi.c +--- gcc-3.2.2.orig/libffi/src/m68k/ffi.c Sun Aug 8 22:27:19 1999 ++++ gcc/libffi/src/m68k/ffi.c Fri Jul 19 08:08:30 2002 +@@ -16,14 +16,11 @@ + ffi_prep_args (void *stack, extended_cif *ecif) + { + unsigned int i; +- int tmp; +- unsigned int avn; + void **p_argv; + char *argp; + ffi_type **p_arg; + void *struct_value_ptr; + +- tmp = 0; + argp = stack; + + if (ecif->cif->rtype->type == FFI_TYPE_STRUCT +@@ -32,11 +29,10 @@ + else + struct_value_ptr = NULL; + +- avn = ecif->cif->nargs; + p_argv = ecif->avalue; + + for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; +- i != 0 && avn != 0; ++ i != 0; + i--, p_arg++) + { + size_t z; +@@ -45,9 +41,6 @@ + if (((*p_arg)->alignment - 1) & (unsigned) argp) + argp = (char *) ALIGN (argp, (*p_arg)->alignment); + +- if (avn != 0) +- { +- avn--; + z = (*p_arg)->size; + if (z < sizeof (int)) + { +@@ -82,7 +75,6 @@ + memcpy (argp, *p_argv, z); + p_argv++; + argp += z; +- } + } + + return struct_value_ptr; +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/mips/ffi.c gcc/libffi/src/mips/ffi.c +--- gcc-3.2.2.orig/libffi/src/mips/ffi.c Sat Mar 3 07:21:23 2001 ++++ gcc/libffi/src/mips/ffi.c Fri Jul 19 08:08:31 2002 +@@ -23,6 +23,7 @@ + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + ++#include <sgidefs.h> + #include <ffi.h> + #include <ffi_common.h> + +@@ -50,7 +51,6 @@ + int flags) + { + register int i; +- register int avn; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; +@@ -80,12 +80,9 @@ + FIX_ARGP; + } + +- avn = ecif->cif->nargs; + p_argv = ecif->avalue; + +- for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; +- i && avn; +- i--, p_arg++) ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++) + { + size_t z; + +@@ -101,9 +98,6 @@ + #define OFFSET sizeof(int) + #endif + +- if (avn) +- { +- avn--; + z = (*p_arg)->size; + if (z < sizeof(SLOT_TYPE_UNSIGNED)) + { +@@ -179,7 +173,6 @@ + p_argv++; + argp += z; + FIX_ARGP; +- } + } + + return; +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/powerpc/darwin.S gcc/libffi/src/powerpc/darwin.S +--- gcc-3.2.2.orig/libffi/src/powerpc/darwin.S Sat Jan 19 01:22:34 2002 ++++ gcc/libffi/src/powerpc/darwin.S Thu Jan 23 03:21:55 2003 +@@ -3,8 +3,6 @@ + + PowerPC Assembly glue. + +- $Id: darwin.S,v 1.2 2002/01/18 16:22:34 dje Exp $ +- + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + ``Software''), to deal in the Software without restriction, including +@@ -39,30 +37,34 @@ + .text + .align 2 + _ffi_call_DARWIN: +- mr r12,r8 // We only need r12 until the call, so it doesn't have to be saved... ++LFB0: ++ mr r12,r8 /* We only need r12 until the call, ++ so it doesn't have to be saved... */ ++LFB1: + /* Save the old stack pointer as AP. */ + mr r8,r1 +- ++LCFI0: + /* Allocate the stack space we need. */ + stwux r1,r1,r4 + + /* Save registers we use. */ + mflr r9 + +- stw r28,-16(r8) ++ stw r28,-16(r8) + stw r29,-12(r8) + stw r30, -8(r8) + stw r31, -4(r8) +- +- stw r9, 8(r8) ++ ++ stw r9, 8(r8) + stw r2, 20(r1) ++LCFI1: + + /* Save arguments over call... */ +- mr r31,r5 /* flags, */ +- mr r30,r6 /* rvalue, */ +- mr r29,r7 /* function address, */ +- mr r28,r8 /* our AP. */ +- ++ mr r31,r5 /* flags, */ ++ mr r30,r6 /* rvalue, */ ++ mr r29,r7 /* function address, */ ++ mr r28,r8 /* our AP. */ ++LCFI2: + /* Call ffi_prep_args. */ + mr r4,r1 + li r9,0 +@@ -145,7 +147,8 @@ + L(float_return_value): + stfs f1,0(r30) + b L(done_return_value) +-//END(_ffi_call_DARWIN) ++LFE1: ++/* END(_ffi_call_DARWIN) */ + + /* Provide a null definition of _ffi_call_AIX. */ + .text +@@ -155,5 +158,61 @@ + .align 2 + _ffi_call_AIX: + blr +-//END(_ffi_call_AIX) ++/* END(_ffi_call_AIX) */ + ++.data ++.section __TEXT,__eh_frame ++Lframe1: ++ .set L$set$0,LECIE1-LSCIE1 ++ .long L$set$0 ; Length of Common Information Entry ++LSCIE1: ++ .long 0x0 ; CIE Identifier Tag ++ .byte 0x1 ; CIE Version ++ .ascii "zR\0" ; CIE Augmentation ++ .byte 0x1 ; uleb128 0x1; CIE Code Alignment Factor ++ .byte 0x7c ; sleb128 -4; CIE Data Alignment Factor ++ .byte 0x41 ; CIE RA Column ++ .byte 0x1 ; uleb128 0x1; Augmentation size ++ .byte 0x10 ; FDE Encoding (pcrel) ++ .byte 0xc ; DW_CFA_def_cfa ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x0 ; uleb128 0x0 ++ .align 2 ++LECIE1: ++LSFDE1: ++ .set L$set$1,LEFDE1-LASFDE1 ++ .long L$set$1 ; FDE Length ++LASFDE1: ++ .set L$set$2,LASFDE1-Lframe1 ++ .long L$set$2 ; FDE CIE offset ++ .long LFB0-. ; FDE initial location ++ .set L$set$3,LFE1-LFB0 ++ .long L$set$3 ; FDE address range ++ .byte 0x0 ; uleb128 0x0; Augmentation size ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$4,LCFI0-LFB1 ++ .long L$set$4 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x08 ; uleb128 0x08 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$5,LCFI1-LCFI0 ++ .long L$set$5 ++ .byte 0x11 ; DW_CFA_offset_extended_sf ++ .byte 0x41 ; uleb128 0x41 ++ .byte 0x7e ; sleb128 -2 ++ .byte 0x9f ; DW_CFA_offset, column 0x1f ++ .byte 0x1 ; uleb128 0x1 ++ .byte 0x9e ; DW_CFA_offset, column 0x1e ++ .byte 0x2 ; uleb128 0x2 ++ .byte 0x9d ; DW_CFA_offset, column 0x1d ++ .byte 0x3 ; uleb128 0x3 ++ .byte 0x9c ; DW_CFA_offset, column 0x1c ++ .byte 0x4 ; uleb128 0x4 ++ .byte 0x4 ; DW_CFA_advance_loc4 ++ .set L$set$6,LCFI2-LCFI1 ++ .long L$set$6 ++ .byte 0xd ; DW_CFA_def_cfa_register ++ .byte 0x1c ; uleb128 0x1c ++ .align 2 ++LEFDE1: ++ +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/prep_cif.c gcc/libffi/src/prep_cif.c +--- gcc-3.2.2.orig/libffi/src/prep_cif.c Sat Mar 3 07:21:22 2001 ++++ gcc/libffi/src/prep_cif.c Mon Sep 30 20:59:42 2002 +@@ -103,7 +103,8 @@ + /* Perform a sanity check on the return type */ + FFI_ASSERT(ffi_type_test(cif->rtype)); + +-#ifndef M68K ++ /* x86-64 and s390 stack space allocation is handled in prep_machdep. */ ++#if !defined M68K && !defined __x86_64__ && !defined S390 + /* Make space for the return structure pointer */ + if (cif->rtype->type == FFI_TYPE_STRUCT + #ifdef SPARC +@@ -122,6 +123,7 @@ + if (((*ptr)->size == 0) && (initialize_aggregate((*ptr)) != FFI_OK)) + return FFI_BAD_TYPEDEF; + ++#if !defined __x86_64__ && !defined S390 + #ifdef SPARC + if (((*ptr)->type == FFI_TYPE_STRUCT + && ((*ptr)->size > 16 || cif->abi != FFI_V9)) +@@ -137,6 +139,7 @@ + + bytes += STACK_ARG_SIZE((*ptr)->size); + } ++#endif + } + + cif->bytes = bytes; +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/ffi.c gcc/libffi/src/s390/ffi.c +--- gcc-3.2.2.orig/libffi/src/s390/ffi.c Thu Jan 1 09:00:00 1970 ++++ gcc/libffi/src/s390/ffi.c Thu Feb 6 08:58:57 2003 +@@ -0,0 +1,753 @@ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 2000 Software AG ++ ++ S390 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++/*====================================================================*/ ++/* Includes */ ++/* -------- */ ++/*====================================================================*/ ++ ++#include <ffi.h> ++#include <ffi_common.h> ++ ++#include <stdlib.h> ++#include <stdio.h> ++ ++/*====================== End of Includes =============================*/ ++ ++/*====================================================================*/ ++/* Defines */ ++/* ------- */ ++/*====================================================================*/ ++ ++/* Maximum number of GPRs available for argument passing. */ ++#define MAX_GPRARGS 5 ++ ++/* Maximum number of FPRs available for argument passing. */ ++#ifdef __s390x__ ++#define MAX_FPRARGS 4 ++#else ++#define MAX_FPRARGS 2 ++#endif ++ ++/* Round to multiple of 16. */ ++#define ROUND_SIZE(size) (((size) + 15) & ~15) ++ ++/* If these values change, sysv.S must be adapted! */ ++#define FFI390_RET_VOID 0 ++#define FFI390_RET_STRUCT 1 ++#define FFI390_RET_FLOAT 2 ++#define FFI390_RET_DOUBLE 3 ++#define FFI390_RET_INT32 4 ++#define FFI390_RET_INT64 5 ++ ++/*===================== End of Defines ===============================*/ ++ ++/*====================================================================*/ ++/* Prototypes */ ++/* ---------- */ ++/*====================================================================*/ ++ ++static void ffi_prep_args (unsigned char *, extended_cif *); ++static int ffi_check_float_struct (ffi_type *); ++void ++#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2) ++__attribute__ ((visibility ("hidden"))) ++#endif ++ffi_closure_helper_SYSV (ffi_closure *, unsigned long *, ++ unsigned long long *, unsigned long *); ++ ++/*====================== End of Prototypes ===========================*/ ++ ++/*====================================================================*/ ++/* Externals */ ++/* --------- */ ++/*====================================================================*/ ++ ++extern void ffi_call_SYSV(unsigned, ++ extended_cif *, ++ void (*)(unsigned char *, extended_cif *), ++ unsigned, ++ void *, ++ void (*fn)()); ++ ++extern void ffi_closure_SYSV(void); ++ ++/*====================== End of Externals ============================*/ ++ ++/*====================================================================*/ ++/* */ ++/* Name - ffi_check_struct_type. */ ++/* */ ++/* Function - Determine if a structure can be passed within a */ ++/* general purpose or floating point register. */ ++/* */ ++/*====================================================================*/ ++ ++static int ++ffi_check_struct_type (ffi_type *arg) ++{ ++ size_t size = arg->size; ++ ++ /* If the struct has just one element, look at that element ++ to find out whether to consider the struct as floating point. */ ++ while (arg->type == FFI_TYPE_STRUCT ++ && arg->elements[0] && !arg->elements[1]) ++ arg = arg->elements[0]; ++ ++ /* Structs of size 1, 2, 4, and 8 are passed in registers, ++ just like the corresponding int/float types. */ ++ switch (size) ++ { ++ case 1: ++ return FFI_TYPE_UINT8; ++ ++ case 2: ++ return FFI_TYPE_UINT16; ++ ++ case 4: ++ if (arg->type == FFI_TYPE_FLOAT) ++ return FFI_TYPE_FLOAT; ++ else ++ return FFI_TYPE_UINT32; ++ ++ case 8: ++ if (arg->type == FFI_TYPE_DOUBLE) ++ return FFI_TYPE_DOUBLE; ++ else ++ return FFI_TYPE_UINT64; ++ ++ default: ++ break; ++ } ++ ++ /* Other structs are passed via a pointer to the data. */ ++ return FFI_TYPE_POINTER; ++} ++ ++/*======================== End of Routine ============================*/ ++ ++/*====================================================================*/ ++/* */ ++/* Name - ffi_prep_args. */ ++/* */ ++/* Function - Prepare parameters for call to function. */ ++/* */ ++/* ffi_prep_args is called by the assembly routine once stack space */ ++/* has been allocated for the function's arguments. */ ++/* */ ++/*====================================================================*/ ++ ++static void ++ffi_prep_args (unsigned char *stack, extended_cif *ecif) ++{ ++ /* The stack space will be filled with those areas: ++ ++ FPR argument register save area (highest addresses) ++ GPR argument register save area ++ temporary struct copies ++ overflow argument area (lowest addresses) ++ ++ We set up the following pointers: ++ ++ p_fpr: bottom of the FPR area (growing upwards) ++ p_gpr: bottom of the GPR area (growing upwards) ++ p_ov: bottom of the overflow area (growing upwards) ++ p_struct: top of the struct copy area (growing downwards) ++ ++ All areas are kept aligned to twice the word size. */ ++ ++ int gpr_off = ecif->cif->bytes; ++ int fpr_off = gpr_off + ROUND_SIZE (MAX_GPRARGS * sizeof (long)); ++ ++ unsigned long long *p_fpr = (unsigned long long *)(stack + fpr_off); ++ unsigned long *p_gpr = (unsigned long *)(stack + gpr_off); ++ unsigned char *p_struct = (unsigned char *)p_gpr; ++ unsigned long *p_ov = (unsigned long *)stack; ++ ++ int n_fpr = 0; ++ int n_gpr = 0; ++ int n_ov = 0; ++ ++ ffi_type **ptr; ++ void **p_argv = ecif->avalue; ++ int i; ++ ++ /* If we returning a structure then we set the first parameter register ++ to the address of where we are returning this structure. */ ++ ++ if (ecif->cif->flags == FFI390_RET_STRUCT) ++ p_gpr[n_gpr++] = (unsigned long) ecif->rvalue; ++ ++ /* Now for the arguments. */ ++ ++ for (ptr = ecif->cif->arg_types, i = ecif->cif->nargs; ++ i > 0; ++ i--, ptr++, p_argv++) ++ { ++ void *arg = *p_argv; ++ int type = (*ptr)->type; ++ ++ /* Check how a structure type is passed. */ ++ if (type == FFI_TYPE_STRUCT) ++ { ++ type = ffi_check_struct_type (*ptr); ++ ++ /* If we pass the struct via pointer, copy the data. */ ++ if (type == FFI_TYPE_POINTER) ++ { ++ p_struct -= ROUND_SIZE ((*ptr)->size); ++ memcpy (p_struct, (char *)arg, (*ptr)->size); ++ arg = &p_struct; ++ } ++ } ++ ++ /* Pointers are passed like UINTs of the same size. */ ++ if (type == FFI_TYPE_POINTER) ++#ifdef __s390x__ ++ type = FFI_TYPE_UINT64; ++#else ++ type = FFI_TYPE_UINT32; ++#endif ++ ++ /* Now handle all primitive int/float data types. */ ++ switch (type) ++ { ++ case FFI_TYPE_DOUBLE: ++ if (n_fpr < MAX_FPRARGS) ++ p_fpr[n_fpr++] = *(unsigned long long *) arg; ++ else ++#ifdef __s390x__ ++ p_ov[n_ov++] = *(unsigned long *) arg; ++#else ++ p_ov[n_ov++] = ((unsigned long *) arg)[0], ++ p_ov[n_ov++] = ((unsigned long *) arg)[1]; ++#endif ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ if (n_fpr < MAX_FPRARGS) ++ p_fpr[n_fpr++] = (long long) *(unsigned int *) arg << 32; ++ else ++ p_ov[n_ov++] = *(unsigned int *) arg; ++ break; ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++#ifdef __s390x__ ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = *(unsigned long *) arg; ++ else ++ p_ov[n_ov++] = *(unsigned long *) arg; ++#else ++ if (n_gpr == MAX_GPRARGS-1) ++ n_gpr = MAX_GPRARGS; ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = ((unsigned long *) arg)[0], ++ p_gpr[n_gpr++] = ((unsigned long *) arg)[1]; ++ else ++ p_ov[n_ov++] = ((unsigned long *) arg)[0], ++ p_ov[n_ov++] = ((unsigned long *) arg)[1]; ++#endif ++ break; ++ ++ case FFI_TYPE_UINT32: ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = *(unsigned int *) arg; ++ else ++ p_ov[n_ov++] = *(unsigned int *) arg; ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_SINT32: ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = *(signed int *) arg; ++ else ++ p_ov[n_ov++] = *(signed int *) arg; ++ break; ++ ++ case FFI_TYPE_UINT16: ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = *(unsigned short *) arg; ++ else ++ p_ov[n_ov++] = *(unsigned short *) arg; ++ break; ++ ++ case FFI_TYPE_SINT16: ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = *(signed short *) arg; ++ else ++ p_ov[n_ov++] = *(signed short *) arg; ++ break; ++ ++ case FFI_TYPE_UINT8: ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = *(unsigned char *) arg; ++ else ++ p_ov[n_ov++] = *(unsigned char *) arg; ++ break; ++ ++ case FFI_TYPE_SINT8: ++ if (n_gpr < MAX_GPRARGS) ++ p_gpr[n_gpr++] = *(signed char *) arg; ++ else ++ p_ov[n_ov++] = *(signed char *) arg; ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++ } ++} ++ ++/*======================== End of Routine ============================*/ ++ ++/*====================================================================*/ ++/* */ ++/* Name - ffi_prep_cif_machdep. */ ++/* */ ++/* Function - Perform machine dependent CIF processing. */ ++/* */ ++/*====================================================================*/ ++ ++ffi_status ++ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ size_t struct_size = 0; ++ int n_gpr = 0; ++ int n_fpr = 0; ++ int n_ov = 0; ++ ++ ffi_type **ptr; ++ int i; ++ ++ /* Determine return value handling. */ ++ ++ switch (cif->rtype->type) ++ { ++ /* Void is easy. */ ++ case FFI_TYPE_VOID: ++ cif->flags = FFI390_RET_VOID; ++ break; ++ ++ /* Structures are returned via a hidden pointer. */ ++ case FFI_TYPE_STRUCT: ++ cif->flags = FFI390_RET_STRUCT; ++ n_gpr++; /* We need one GPR to pass the pointer. */ ++ break; ++ ++ /* Floating point values are returned in fpr 0. */ ++ case FFI_TYPE_FLOAT: ++ cif->flags = FFI390_RET_FLOAT; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ cif->flags = FFI390_RET_DOUBLE; ++ break; ++ ++ /* Integer values are returned in gpr 2 (and gpr 3 ++ for 64-bit values on 31-bit machines). */ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ cif->flags = FFI390_RET_INT64; ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ /* These are to be extended to word size. */ ++#ifdef __s390x__ ++ cif->flags = FFI390_RET_INT64; ++#else ++ cif->flags = FFI390_RET_INT32; ++#endif ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++ ++ /* Now for the arguments. */ ++ ++ for (ptr = cif->arg_types, i = cif->nargs; ++ i > 0; ++ i--, ptr++) ++ { ++ int type = (*ptr)->type; ++ ++ /* Check how a structure type is passed. */ ++ if (type == FFI_TYPE_STRUCT) ++ { ++ type = ffi_check_struct_type (*ptr); ++ ++ /* If we pass the struct via pointer, we must reserve space ++ to copy its data for proper call-by-value semantics. */ ++ if (type == FFI_TYPE_POINTER) ++ struct_size += ROUND_SIZE ((*ptr)->size); ++ } ++ ++ /* Now handle all primitive int/float data types. */ ++ switch (type) ++ { ++ /* The first MAX_FPRARGS floating point arguments ++ go in FPRs, the rest overflow to the stack. */ ++ ++ case FFI_TYPE_DOUBLE: ++ if (n_fpr < MAX_FPRARGS) ++ n_fpr++; ++ else ++ n_ov += sizeof (double) / sizeof (long); ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ if (n_fpr < MAX_FPRARGS) ++ n_fpr++; ++ else ++ n_ov++; ++ break; ++ ++ /* On 31-bit machines, 64-bit integers are passed in GPR pairs, ++ if one is still available, or else on the stack. If only one ++ register is free, skip the register (it won't be used for any ++ subsequent argument either). */ ++ ++#ifndef __s390x__ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ if (n_gpr == MAX_GPRARGS-1) ++ n_gpr = MAX_GPRARGS; ++ if (n_gpr < MAX_GPRARGS) ++ n_gpr += 2; ++ else ++ n_ov += 2; ++ break; ++#endif ++ ++ /* Everything else is passed in GPRs (until MAX_GPRARGS ++ have been used) or overflows to the stack. */ ++ ++ default: ++ if (n_gpr < MAX_GPRARGS) ++ n_gpr++; ++ else ++ n_ov++; ++ break; ++ } ++ } ++ ++ /* Total stack space as required for overflow arguments ++ and temporary structure copies. */ ++ ++ cif->bytes = ROUND_SIZE (n_ov * sizeof (long)) + struct_size; ++ ++ return FFI_OK; ++} ++ ++/*======================== End of Routine ============================*/ ++ ++/*====================================================================*/ ++/* */ ++/* Name - ffi_call. */ ++/* */ ++/* Function - Call the FFI routine. */ ++/* */ ++/*====================================================================*/ ++ ++void ++ffi_call(ffi_cif *cif, ++ void (*fn)(), ++ void *rvalue, ++ void **avalue) ++{ ++ int ret_type = cif->flags; ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ecif.rvalue = rvalue; ++ ++ /* If we don't have a return value, we need to fake one. */ ++ if (rvalue == NULL) ++ { ++ if (ret_type == FFI390_RET_STRUCT) ++ ecif.rvalue = alloca (cif->rtype->size); ++ else ++ ret_type = FFI390_RET_VOID; ++ } ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ ffi_call_SYSV (cif->bytes, &ecif, ffi_prep_args, ++ ret_type, ecif.rvalue, fn); ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++} ++ ++/*======================== End of Routine ============================*/ ++ ++/*====================================================================*/ ++/* */ ++/* Name - ffi_closure_helper_SYSV. */ ++/* */ ++/* Function - Call a FFI closure target function. */ ++/* */ ++/*====================================================================*/ ++ ++void ++ffi_closure_helper_SYSV (ffi_closure *closure, ++ unsigned long *p_gpr, ++ unsigned long long *p_fpr, ++ unsigned long *p_ov) ++{ ++ unsigned long long ret_buffer; ++ ++ void *rvalue = &ret_buffer; ++ void **avalue; ++ void **p_arg; ++ ++ int n_gpr = 0; ++ int n_fpr = 0; ++ int n_ov = 0; ++ ++ ffi_type **ptr; ++ int i; ++ ++ /* Allocate buffer for argument list pointers. */ ++ ++ p_arg = avalue = alloca (closure->cif->nargs * sizeof (void *)); ++ ++ /* If we returning a structure, pass the structure address ++ directly to the target function. Otherwise, have the target ++ function store the return value to the GPR save area. */ ++ ++ if (closure->cif->flags == FFI390_RET_STRUCT) ++ rvalue = (void *) p_gpr[n_gpr++]; ++ ++ /* Now for the arguments. */ ++ ++ for (ptr = closure->cif->arg_types, i = closure->cif->nargs; ++ i > 0; ++ i--, p_arg++, ptr++) ++ { ++ int deref_struct_pointer = 0; ++ int type = (*ptr)->type; ++ ++ /* Check how a structure type is passed. */ ++ if (type == FFI_TYPE_STRUCT) ++ { ++ type = ffi_check_struct_type (*ptr); ++ ++ /* If we pass the struct via pointer, remember to ++ retrieve the pointer later. */ ++ if (type == FFI_TYPE_POINTER) ++ deref_struct_pointer = 1; ++ } ++ ++ /* Pointers are passed like UINTs of the same size. */ ++ if (type == FFI_TYPE_POINTER) ++#ifdef __s390x__ ++ type = FFI_TYPE_UINT64; ++#else ++ type = FFI_TYPE_UINT32; ++#endif ++ ++ /* Now handle all primitive int/float data types. */ ++ switch (type) ++ { ++ case FFI_TYPE_DOUBLE: ++ if (n_fpr < MAX_FPRARGS) ++ *p_arg = &p_fpr[n_fpr++]; ++ else ++ *p_arg = &p_ov[n_ov], ++ n_ov += sizeof (double) / sizeof (long); ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ if (n_fpr < MAX_FPRARGS) ++ *p_arg = &p_fpr[n_fpr++]; ++ else ++ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; ++ break; ++ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++#ifdef __s390x__ ++ if (n_gpr < MAX_GPRARGS) ++ *p_arg = &p_gpr[n_gpr++]; ++ else ++ *p_arg = &p_ov[n_ov++]; ++#else ++ if (n_gpr == MAX_GPRARGS-1) ++ n_gpr = MAX_GPRARGS; ++ if (n_gpr < MAX_GPRARGS) ++ *p_arg = &p_gpr[n_gpr], n_gpr += 2; ++ else ++ *p_arg = &p_ov[n_ov], n_ov += 2; ++#endif ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ if (n_gpr < MAX_GPRARGS) ++ *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 4; ++ else ++ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 4; ++ break; ++ ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ if (n_gpr < MAX_GPRARGS) ++ *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 2; ++ else ++ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 2; ++ break; ++ ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ if (n_gpr < MAX_GPRARGS) ++ *p_arg = (char *)&p_gpr[n_gpr++] + sizeof (long) - 1; ++ else ++ *p_arg = (char *)&p_ov[n_ov++] + sizeof (long) - 1; ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++ ++ /* If this is a struct passed via pointer, we need to ++ actually retrieve that pointer. */ ++ if (deref_struct_pointer) ++ *p_arg = *(void **)*p_arg; ++ } ++ ++ ++ /* Call the target function. */ ++ (closure->fun) (closure->cif, rvalue, avalue, closure->user_data); ++ ++ /* Convert the return value. */ ++ switch (closure->cif->rtype->type) ++ { ++ /* Void is easy, and so is struct. */ ++ case FFI_TYPE_VOID: ++ case FFI_TYPE_STRUCT: ++ break; ++ ++ /* Floating point values are returned in fpr 0. */ ++ case FFI_TYPE_FLOAT: ++ p_fpr[0] = (long long) *(unsigned int *) rvalue << 32; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ p_fpr[0] = *(unsigned long long *) rvalue; ++ break; ++ ++ /* Integer values are returned in gpr 2 (and gpr 3 ++ for 64-bit values on 31-bit machines). */ ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++#ifdef __s390x__ ++ p_gpr[0] = *(unsigned long *) rvalue; ++#else ++ p_gpr[0] = ((unsigned long *) rvalue)[0], ++ p_gpr[1] = ((unsigned long *) rvalue)[1]; ++#endif ++ break; ++ ++ case FFI_TYPE_POINTER: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_UINT8: ++ p_gpr[0] = *(unsigned long *) rvalue; ++ break; ++ ++ case FFI_TYPE_INT: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_SINT8: ++ p_gpr[0] = *(signed long *) rvalue; ++ break; ++ ++ default: ++ FFI_ASSERT (0); ++ break; ++ } ++} ++ ++/*======================== End of Routine ============================*/ ++ ++/*====================================================================*/ ++/* */ ++/* Name - ffi_prep_closure. */ ++/* */ ++/* Function - Prepare a FFI closure. */ ++/* */ ++/*====================================================================*/ ++ ++ffi_status ++ffi_prep_closure (ffi_closure *closure, ++ ffi_cif *cif, ++ void (*fun) (ffi_cif *, void *, void **, void *), ++ void *user_data) ++{ ++ FFI_ASSERT (cif->abi == FFI_SYSV); ++ ++#ifndef __s390x__ ++ *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */ ++ *(short *)&closure->tramp [2] = 0x9801; /* lm %r0,%r1,6(%r1) */ ++ *(short *)&closure->tramp [4] = 0x1006; ++ *(short *)&closure->tramp [6] = 0x07f1; /* br %r1 */ ++ *(long *)&closure->tramp [8] = (long)closure; ++ *(long *)&closure->tramp[12] = (long)&ffi_closure_SYSV; ++#else ++ *(short *)&closure->tramp [0] = 0x0d10; /* basr %r1,0 */ ++ *(short *)&closure->tramp [2] = 0xeb01; /* lmg %r0,%r1,14(%r1) */ ++ *(short *)&closure->tramp [4] = 0x100e; ++ *(short *)&closure->tramp [6] = 0x0004; ++ *(short *)&closure->tramp [8] = 0x07f1; /* br %r1 */ ++ *(long *)&closure->tramp[16] = (long)closure; ++ *(long *)&closure->tramp[24] = (long)&ffi_closure_SYSV; ++#endif ++ ++ closure->cif = cif; ++ closure->user_data = user_data; ++ closure->fun = fun; ++ ++ return FFI_OK; ++} ++ ++/*======================== End of Routine ============================*/ ++ +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/s390/sysv.S gcc/libffi/src/s390/sysv.S +--- gcc-3.2.2.orig/libffi/src/s390/sysv.S Thu Jan 1 09:00:00 1970 ++++ gcc/libffi/src/s390/sysv.S Thu Nov 28 01:44:35 2002 +@@ -0,0 +1,425 @@ ++/* ----------------------------------------------------------------------- ++ sysv.S - Copyright (c) 2000 Software AG ++ ++ S390 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifndef __s390x__ ++ ++.text ++ ++ # r2: cif->bytes ++ # r3: &ecif ++ # r4: ffi_prep_args ++ # r5: ret_type ++ # r6: ecif.rvalue ++ # ov: fn ++ ++ # This assumes we are using gas. ++ .globl ffi_call_SYSV ++ .type ffi_call_SYSV,%function ++ffi_call_SYSV: ++.LFB1: ++ stm %r6,%r15,24(%r15) # Save registers ++.LCFI0: ++ basr %r13,0 # Set up base register ++.Lbase: ++ lr %r11,%r15 # Set up frame pointer ++.LCFI1: ++ sr %r15,%r2 ++ ahi %r15,-96-48 # Allocate stack ++ lr %r8,%r6 # Save ecif.rvalue ++ sr %r9,%r9 ++ ic %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address ++ l %r7,96(%r11) # Load function address ++ st %r11,0(%r15) # Set up back chain ++ ahi %r11,-48 # Register save area ++.LCFI2: ++ ++ la %r2,96(%r15) # Save area ++ # r3 already holds &ecif ++ basr %r14,%r4 # Call ffi_prep_args ++ ++ lm %r2,%r6,0(%r11) # Load arguments ++ ld %f0,32(%r11) ++ ld %f2,40(%r11) ++ la %r14,0(%r13,%r9) # Set return address ++ br %r7 # ... and call function ++ ++.LretNone: # Return void ++ l %r4,48+56(%r11) ++ lm %r6,%r15,48+24(%r11) ++ br %r4 ++ ++.LretFloat: ++ l %r4,48+56(%r11) ++ ste %f0,0(%r8) # Return float ++ lm %r6,%r15,48+24(%r11) ++ br %r4 ++ ++.LretDouble: ++ l %r4,48+56(%r11) ++ std %f0,0(%r8) # Return double ++ lm %r6,%r15,48+24(%r11) ++ br %r4 ++ ++.LretInt32: ++ l %r4,48+56(%r11) ++ st %r2,0(%r8) # Return int ++ lm %r6,%r15,48+24(%r11) ++ br %r4 ++ ++.LretInt64: ++ l %r4,48+56(%r11) ++ stm %r2,%r3,0(%r8) # Return long long ++ lm %r6,%r15,48+24(%r11) ++ br %r4 ++ ++.Ltable: ++ .byte .LretNone-.Lbase # FFI390_RET_VOID ++ .byte .LretNone-.Lbase # FFI390_RET_STRUCT ++ .byte .LretFloat-.Lbase # FFI390_RET_FLOAT ++ .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE ++ .byte .LretInt32-.Lbase # FFI390_RET_INT32 ++ .byte .LretInt64-.Lbase # FFI390_RET_INT64 ++ ++.LFE1: ++.ffi_call_SYSV_end: ++ .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV ++ ++ ++ .globl ffi_closure_SYSV ++ .type ffi_closure_SYSV,%function ++ffi_closure_SYSV: ++.LFB2: ++ stm %r12,%r15,48(%r15) # Save registers ++.LCFI10: ++ basr %r13,0 # Set up base register ++.Lcbase: ++ stm %r2,%r6,8(%r15) # Save arguments ++ std %f0,64(%r15) ++ std %f2,72(%r15) ++ lr %r1,%r15 # Set up stack frame ++ ahi %r15,-96 ++.LCFI11: ++ l %r12,.Lchelper-.Lcbase(%r13) # Get helper function ++ lr %r2,%r0 # Closure ++ la %r3,8(%r1) # GPRs ++ la %r4,64(%r1) # FPRs ++ la %r5,96(%r1) # Overflow ++ st %r1,0(%r15) # Set up back chain ++ ++ bas %r14,0(%r12,%r13) # Call helper ++ ++ l %r4,96+56(%r15) ++ ld %f0,96+64(%r15) # Load return registers ++ lm %r2,%r3,96+8(%r15) ++ lm %r12,%r15,96+48(%r15) ++ br %r4 ++ ++ .align 4 ++.Lchelper: ++ .long ffi_closure_helper_SYSV-.Lcbase ++ ++.LFE2: ++ ++.ffi_closure_SYSV_end: ++ .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV ++ ++ ++ .section .eh_frame,"a",@progbits ++.Lframe1: ++ .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry ++.LSCIE1: ++ .4byte 0x0 # CIE Identifier Tag ++ .byte 0x1 # CIE Version ++ .ascii "zR\0" # CIE Augmentation ++ .uleb128 0x1 # CIE Code Alignment Factor ++ .sleb128 -4 # CIE Data Alignment Factor ++ .byte 0xe # CIE RA Column ++ .uleb128 0x1 # Augmentation size ++ .byte 0x1b # FDE Encoding (pcrel sdata4) ++ .byte 0xc # DW_CFA_def_cfa ++ .uleb128 0xf ++ .uleb128 0x60 ++ .align 4 ++.LECIE1: ++.LSFDE1: ++ .4byte .LEFDE1-.LASFDE1 # FDE Length ++.LASFDE1: ++ .4byte .LASFDE1-.Lframe1 # FDE CIE offset ++ .4byte .LFB1-. # FDE initial location ++ .4byte .LFE1-.LFB1 # FDE address range ++ .uleb128 0x0 # Augmentation size ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI0-.LFB1 ++ .byte 0x8f # DW_CFA_offset, column 0xf ++ .uleb128 0x9 ++ .byte 0x8e # DW_CFA_offset, column 0xe ++ .uleb128 0xa ++ .byte 0x8d # DW_CFA_offset, column 0xd ++ .uleb128 0xb ++ .byte 0x8c # DW_CFA_offset, column 0xc ++ .uleb128 0xc ++ .byte 0x8b # DW_CFA_offset, column 0xb ++ .uleb128 0xd ++ .byte 0x8a # DW_CFA_offset, column 0xa ++ .uleb128 0xe ++ .byte 0x89 # DW_CFA_offset, column 0x9 ++ .uleb128 0xf ++ .byte 0x88 # DW_CFA_offset, column 0x8 ++ .uleb128 0x10 ++ .byte 0x87 # DW_CFA_offset, column 0x7 ++ .uleb128 0x11 ++ .byte 0x86 # DW_CFA_offset, column 0x6 ++ .uleb128 0x12 ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI1-.LCFI0 ++ .byte 0xd # DW_CFA_def_cfa_register ++ .uleb128 0xb ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI2-.LCFI1 ++ .byte 0xe # DW_CFA_def_cfa_offset ++ .uleb128 0x90 ++ .align 4 ++.LEFDE1: ++.LSFDE2: ++ .4byte .LEFDE2-.LASFDE2 # FDE Length ++.LASFDE2: ++ .4byte .LASFDE2-.Lframe1 # FDE CIE offset ++ .4byte .LFB2-. # FDE initial location ++ .4byte .LFE2-.LFB2 # FDE address range ++ .uleb128 0x0 # Augmentation size ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI10-.LFB2 ++ .byte 0x8f # DW_CFA_offset, column 0xf ++ .uleb128 0x9 ++ .byte 0x8e # DW_CFA_offset, column 0xe ++ .uleb128 0xa ++ .byte 0x8d # DW_CFA_offset, column 0xd ++ .uleb128 0xb ++ .byte 0x8c # DW_CFA_offset, column 0xc ++ .uleb128 0xc ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI11-.LCFI10 ++ .byte 0xe # DW_CFA_def_cfa_offset ++ .uleb128 0xc0 ++ .align 4 ++.LEFDE2: ++ ++#else ++ ++.text ++ ++ # r2: cif->bytes ++ # r3: &ecif ++ # r4: ffi_prep_args ++ # r5: ret_type ++ # r6: ecif.rvalue ++ # ov: fn ++ ++ # This assumes we are using gas. ++ .globl ffi_call_SYSV ++ .type ffi_call_SYSV,%function ++ffi_call_SYSV: ++.LFB1: ++ stmg %r6,%r15,48(%r15) # Save registers ++.LCFI0: ++ larl %r13,.Lbase # Set up base register ++ lgr %r11,%r15 # Set up frame pointer ++.LCFI1: ++ sgr %r15,%r2 ++ aghi %r15,-160-80 # Allocate stack ++ lgr %r8,%r6 # Save ecif.rvalue ++ llgc %r9,.Ltable-.Lbase(%r13,%r5) # Load epilog address ++ lg %r7,160(%r11) # Load function address ++ stg %r11,0(%r15) # Set up back chain ++ aghi %r11,-80 # Register save area ++.LCFI2: ++ ++ la %r2,160(%r15) # Save area ++ # r3 already holds &ecif ++ basr %r14,%r4 # Call ffi_prep_args ++ ++ lmg %r2,%r6,0(%r11) # Load arguments ++ ld %f0,48(%r11) ++ ld %f2,56(%r11) ++ ld %f4,64(%r11) ++ ld %f6,72(%r11) ++ la %r14,0(%r13,%r9) # Set return address ++ br %r7 # ... and call function ++ ++.Lbase: ++.LretNone: # Return void ++ lg %r4,80+112(%r11) ++ lmg %r6,%r15,80+48(%r11) ++ br %r4 ++ ++.LretFloat: ++ lg %r4,80+112(%r11) ++ ste %f0,0(%r8) # Return float ++ lmg %r6,%r15,80+48(%r11) ++ br %r4 ++ ++.LretDouble: ++ lg %r4,80+112(%r11) ++ std %f0,0(%r8) # Return double ++ lmg %r6,%r15,80+48(%r11) ++ br %r4 ++ ++.LretInt32: ++ lg %r4,80+112(%r11) ++ st %r2,0(%r8) # Return int ++ lmg %r6,%r15,80+48(%r11) ++ br %r4 ++ ++.LretInt64: ++ lg %r4,80+112(%r11) ++ stg %r2,0(%r8) # Return long ++ lmg %r6,%r15,80+48(%r11) ++ br %r4 ++ ++.Ltable: ++ .byte .LretNone-.Lbase # FFI390_RET_VOID ++ .byte .LretNone-.Lbase # FFI390_RET_STRUCT ++ .byte .LretFloat-.Lbase # FFI390_RET_FLOAT ++ .byte .LretDouble-.Lbase # FFI390_RET_DOUBLE ++ .byte .LretInt32-.Lbase # FFI390_RET_INT32 ++ .byte .LretInt64-.Lbase # FFI390_RET_INT64 ++ ++.LFE1: ++.ffi_call_SYSV_end: ++ .size ffi_call_SYSV,.ffi_call_SYSV_end-ffi_call_SYSV ++ ++ ++ .globl ffi_closure_SYSV ++ .type ffi_closure_SYSV,%function ++ffi_closure_SYSV: ++.LFB2: ++ stmg %r14,%r15,112(%r15) # Save registers ++.LCFI10: ++ stmg %r2,%r6,16(%r15) # Save arguments ++ std %f0,128(%r15) ++ std %f2,136(%r15) ++ std %f4,144(%r15) ++ std %f6,152(%r15) ++ lgr %r1,%r15 # Set up stack frame ++ aghi %r15,-160 ++.LCFI11: ++ lgr %r2,%r0 # Closure ++ la %r3,16(%r1) # GPRs ++ la %r4,128(%r1) # FPRs ++ la %r5,160(%r1) # Overflow ++ stg %r1,0(%r15) # Set up back chain ++ ++ brasl %r14,ffi_closure_helper_SYSV # Call helper ++ ++ lg %r14,160+112(%r15) ++ ld %f0,160+128(%r15) # Load return registers ++ lg %r2,160+16(%r15) ++ la %r15,160(%r15) ++ br %r14 ++.LFE2: ++ ++.ffi_closure_SYSV_end: ++ .size ffi_closure_SYSV,.ffi_closure_SYSV_end-ffi_closure_SYSV ++ ++ ++ ++ .section .eh_frame,"a",@progbits ++.Lframe1: ++ .4byte .LECIE1-.LSCIE1 # Length of Common Information Entry ++.LSCIE1: ++ .4byte 0x0 # CIE Identifier Tag ++ .byte 0x1 # CIE Version ++ .ascii "zR\0" # CIE Augmentation ++ .uleb128 0x1 # CIE Code Alignment Factor ++ .sleb128 -8 # CIE Data Alignment Factor ++ .byte 0xe # CIE RA Column ++ .uleb128 0x1 # Augmentation size ++ .byte 0x1b # FDE Encoding (pcrel sdata4) ++ .byte 0xc # DW_CFA_def_cfa ++ .uleb128 0xf ++ .uleb128 0xa0 ++ .align 8 ++.LECIE1: ++.LSFDE1: ++ .4byte .LEFDE1-.LASFDE1 # FDE Length ++.LASFDE1: ++ .4byte .LASFDE1-.Lframe1 # FDE CIE offset ++ .4byte .LFB1-. # FDE initial location ++ .4byte .LFE1-.LFB1 # FDE address range ++ .uleb128 0x0 # Augmentation size ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI0-.LFB1 ++ .byte 0x8f # DW_CFA_offset, column 0xf ++ .uleb128 0x5 ++ .byte 0x8e # DW_CFA_offset, column 0xe ++ .uleb128 0x6 ++ .byte 0x8d # DW_CFA_offset, column 0xd ++ .uleb128 0x7 ++ .byte 0x8c # DW_CFA_offset, column 0xc ++ .uleb128 0x8 ++ .byte 0x8b # DW_CFA_offset, column 0xb ++ .uleb128 0x9 ++ .byte 0x8a # DW_CFA_offset, column 0xa ++ .uleb128 0xa ++ .byte 0x89 # DW_CFA_offset, column 0x9 ++ .uleb128 0xb ++ .byte 0x88 # DW_CFA_offset, column 0x8 ++ .uleb128 0xc ++ .byte 0x87 # DW_CFA_offset, column 0x7 ++ .uleb128 0xd ++ .byte 0x86 # DW_CFA_offset, column 0x6 ++ .uleb128 0xe ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI1-.LCFI0 ++ .byte 0xd # DW_CFA_def_cfa_register ++ .uleb128 0xb ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI2-.LCFI1 ++ .byte 0xe # DW_CFA_def_cfa_offset ++ .uleb128 0xf0 ++ .align 8 ++.LEFDE1: ++.LSFDE2: ++ .4byte .LEFDE2-.LASFDE2 # FDE Length ++.LASFDE2: ++ .4byte .LASFDE2-.Lframe1 # FDE CIE offset ++ .4byte .LFB2-. # FDE initial location ++ .4byte .LFE2-.LFB2 # FDE address range ++ .uleb128 0x0 # Augmentation size ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI10-.LFB2 ++ .byte 0x8f # DW_CFA_offset, column 0xf ++ .uleb128 0x5 ++ .byte 0x8e # DW_CFA_offset, column 0xe ++ .uleb128 0x6 ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .4byte .LCFI11-.LCFI10 ++ .byte 0xe # DW_CFA_def_cfa_offset ++ .uleb128 0x140 ++ .align 8 ++.LEFDE2: ++ ++#endif ++ +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/ffi.c gcc/libffi/src/sh/ffi.c +--- gcc-3.2.2.orig/libffi/src/sh/ffi.c Thu Jan 1 09:00:00 1970 ++++ gcc/libffi/src/sh/ffi.c Fri Jul 19 10:08:43 2002 +@@ -0,0 +1,722 @@ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 2002 Kaz Kojima ++ ++ SuperH Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include <ffi.h> ++#include <ffi_common.h> ++ ++#include <stdlib.h> ++ ++#define NGREGARG 4 ++#if defined(__SH4__) ++#define NFREGARG 8 ++#endif ++ ++#if defined(__HITACHI__) ++#define STRUCT_VALUE_ADDRESS_WITH_ARG 1 ++#else ++#define STRUCT_VALUE_ADDRESS_WITH_ARG 0 ++#endif ++ ++/* If the structure has essentialy an unique element, return its type. */ ++static int ++simple_type (ffi_type *arg) ++{ ++ if (arg->type != FFI_TYPE_STRUCT) ++ return arg->type; ++ else if (arg->elements[1]) ++ return FFI_TYPE_STRUCT; ++ ++ return simple_type (arg->elements[0]); ++} ++ ++static int ++return_type (ffi_type *arg) ++{ ++ unsigned short type; ++ ++ if (arg->type != FFI_TYPE_STRUCT) ++ return arg->type; ++ ++ type = simple_type (arg->elements[0]); ++ if (! arg->elements[1]) ++ { ++ switch (type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ return FFI_TYPE_INT; ++ ++ default: ++ return type; ++ } ++ } ++ ++ /* gcc uses r0/r1 pair for some kind of structures. */ ++ if (arg->size <= 2 * sizeof (int)) ++ { ++ int i = 0; ++ ffi_type *e; ++ ++ while ((e = arg->elements[i++])) ++ { ++ type = simple_type (e); ++ switch (type) ++ { ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_INT: ++ case FFI_TYPE_FLOAT: ++ return FFI_TYPE_UINT64; ++ ++ default: ++ break; ++ } ++ } ++ } ++ ++ return FFI_TYPE_STRUCT; ++} ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments */ ++ ++/*@-exportheader@*/ ++void ffi_prep_args(char *stack, extended_cif *ecif) ++/*@=exportheader@*/ ++{ ++ register unsigned int i; ++ register int tmp; ++ register unsigned int avn; ++ register void **p_argv; ++ register char *argp; ++ register ffi_type **p_arg; ++ int greg, ireg; ++#if defined(__SH4__) ++ int freg = 0; ++#endif ++ ++ tmp = 0; ++ argp = stack; ++ ++ if (return_type (ecif->cif->rtype) == FFI_TYPE_STRUCT) ++ { ++ *(void **) argp = ecif->rvalue; ++ argp += 4; ++ ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0; ++ } ++ else ++ ireg = 0; ++ ++ /* Set arguments for registers. */ ++ greg = ireg; ++ avn = ecif->cif->nargs; ++ p_argv = ecif->avalue; ++ ++ for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) ++ { ++ size_t z; ++ ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ if (greg++ >= NGREGARG) ++ continue; ++ ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ argp += z; ++ } ++ else if (z == sizeof(int)) ++ { ++#if defined(__SH4__) ++ if ((*p_arg)->type == FFI_TYPE_FLOAT) ++ { ++ if (freg++ >= NFREGARG) ++ continue; ++ } ++ else ++#endif ++ { ++ if (greg++ >= NGREGARG) ++ continue; ++ } ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ argp += z; ++ } ++#if defined(__SH4__) ++ else if ((*p_arg)->type == FFI_TYPE_DOUBLE) ++ { ++ if (freg + 1 >= NFREGARG) ++ continue; ++ freg = (freg + 1) & ~1; ++ freg += 2; ++ memcpy (argp, *p_argv, z); ++ argp += z; ++ } ++#endif ++ else ++ { ++ int n = (z + sizeof (int) - 1) / sizeof (int); ++#if defined(__SH4__) ++ if (greg + n - 1 >= NGREGARG) ++ continue; ++ greg += n; ++#else ++ if (greg >= NGREGARG) ++ continue; ++ else if (greg + n - 1 >= NGREGARG) ++ greg = NGREGARG; ++ else ++ greg += n; ++#endif ++ memcpy (argp, *p_argv, z); ++ argp += z; ++ } ++ } ++ ++ /* Set arguments on stack. */ ++ greg = ireg; ++#if defined(__SH4__) ++ freg = 0; ++#endif ++ p_argv = ecif->avalue; ++ ++ for (i = 0, p_arg = ecif->cif->arg_types; i < avn; i++, p_arg++, p_argv++) ++ { ++ size_t z; ++ ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ if (greg++ < NGREGARG) ++ continue; ++ ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ *(signed int *) argp = (signed int)*(SINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT8: ++ *(unsigned int *) argp = (unsigned int)*(UINT8 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ *(signed int *) argp = (signed int)*(SINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_UINT16: ++ *(unsigned int *) argp = (unsigned int)*(UINT16 *)(* p_argv); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ argp += z; ++ } ++ else if (z == sizeof(int)) ++ { ++#if defined(__SH4__) ++ if ((*p_arg)->type == FFI_TYPE_FLOAT) ++ { ++ if (freg++ < NFREGARG) ++ continue; ++ } ++ else ++#endif ++ { ++ if (greg++ < NGREGARG) ++ continue; ++ } ++ *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv); ++ argp += z; ++ } ++#if defined(__SH4__) ++ else if ((*p_arg)->type == FFI_TYPE_DOUBLE) ++ { ++ if (freg + 1 < NFREGARG) ++ { ++ freg = (freg + 1) & ~1; ++ freg += 2; ++ continue; ++ } ++ memcpy (argp, *p_argv, z); ++ argp += z; ++ } ++#endif ++ else ++ { ++ int n = (z + sizeof (int) - 1) / sizeof (int); ++ if (greg + n - 1 < NGREGARG) ++ { ++ greg += n; ++ continue; ++ } ++#if (! defined(__SH4__)) ++ else if (greg < NGREGARG) ++ { ++ greg = NGREGARG; ++ continue; ++ } ++#endif ++ memcpy (argp, *p_argv, z); ++ argp += z; ++ } ++ } ++ ++ return; ++} ++ ++/* Perform machine dependent cif processing */ ++ffi_status ffi_prep_cif_machdep(ffi_cif *cif) ++{ ++ int i, j; ++ int size, type; ++ int n, m; ++ int greg; ++#if defined(__SH4__) ++ int freg = 0; ++#endif ++ ++ cif->flags = 0; ++ ++ greg = ((return_type (cif->rtype) == FFI_TYPE_STRUCT) && ++ STRUCT_VALUE_ADDRESS_WITH_ARG) ? 1 : 0; ++ ++#if defined(__SH4__) ++ for (i = j = 0; i < cif->nargs && j < 12; i++) ++ { ++ type = (cif->arg_types)[i]->type; ++ switch (type) ++ { ++ case FFI_TYPE_FLOAT: ++ if (freg >= NFREGARG) ++ continue; ++ freg++; ++ cif->flags += ((cif->arg_types)[i]->type) << (2 * j); ++ j++; ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ if ((freg + 1) >= NFREGARG) ++ continue; ++ freg = (freg + 1) & ~1; ++ freg += 2; ++ cif->flags += ((cif->arg_types)[i]->type) << (2 * j); ++ j++; ++ break; ++ ++ default: ++ size = (cif->arg_types)[i]->size; ++ n = (size + sizeof (int) - 1) / sizeof (int); ++ if (greg + n - 1 >= NGREGARG) ++ continue; ++ greg += n; ++ for (m = 0; m < n; m++) ++ cif->flags += FFI_TYPE_INT << (2 * j++); ++ break; ++ } ++ } ++#else ++ for (i = j = 0; i < cif->nargs && j < 4; i++) ++ { ++ size = (cif->arg_types)[i]->size; ++ n = (size + sizeof (int) - 1) / sizeof (int); ++ if (greg >= NGREGARG) ++ continue; ++ else if (greg + n - 1 >= NGREGARG) ++ greg = NGREGARG; ++ else ++ greg += n; ++ for (m = 0; m < n; m++) ++ cif->flags += FFI_TYPE_INT << (2 * j++); ++ } ++#endif ++ ++ /* Set the return type flag */ ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_STRUCT: ++ cif->flags += (unsigned) (return_type (cif->rtype)) << 24; ++ break; ++ ++ case FFI_TYPE_VOID: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ cif->flags += (unsigned) cif->rtype->type << 24; ++ break; ++ ++ default: ++ cif->flags += FFI_TYPE_INT << 24; ++ break; ++ } ++ ++ return FFI_OK; ++} ++ ++/*@-declundef@*/ ++/*@-exportheader@*/ ++extern void ffi_call_SYSV(void (*)(char *, extended_cif *), ++ /*@out@*/ extended_cif *, ++ unsigned, unsigned, ++ /*@out@*/ unsigned *, ++ void (*fn)()); ++/*@=declundef@*/ ++/*@=exportheader@*/ ++ ++void ffi_call(/*@dependent@*/ ffi_cif *cif, ++ void (*fn)(), ++ /*@out@*/ void *rvalue, ++ /*@dependent@*/ void **avalue) ++{ ++ extended_cif ecif; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (cif->rtype->type == FFI_TYPE_STRUCT)) ++ { ++ /*@-sysunrecog@*/ ++ ecif.rvalue = alloca(cif->rtype->size); ++ /*@=sysunrecog@*/ ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ /*@-usedef@*/ ++ ffi_call_SYSV(ffi_prep_args, &ecif, cif->bytes, ++ cif->flags, ecif.rvalue, fn); ++ /*@=usedef@*/ ++ break; ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++extern void ffi_closure_SYSV (void); ++#if defined(__SH4__) ++extern void __ic_invalidate (void *line); ++#endif ++ ++ffi_status ++ffi_prep_closure (ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void *user_data) ++{ ++ unsigned int *tramp; ++ ++ FFI_ASSERT (cif->abi == FFI_GCC_SYSV); ++ ++ tramp = (unsigned int *) &closure->tramp[0]; ++#ifdef __LITTLE_ENDIAN__ ++ tramp[0] = 0xd301d202; ++ tramp[1] = 0x0009422b; ++#else ++ tramp[0] = 0xd202d301; ++ tramp[1] = 0x422b0009; ++#endif ++ *(void **) &tramp[2] = (void *)closure; /* ctx */ ++ *(void **) &tramp[3] = (void *)ffi_closure_SYSV; /* funaddr */ ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++#if defined(__SH4__) ++ /* Flush the icache. */ ++ __ic_invalidate(&closure->tramp[0]); ++#endif ++ ++ return FFI_OK; ++} ++ ++/* Basically the trampoline invokes ffi_closure_SYSV, and on ++ * entry, r3 holds the address of the closure. ++ * After storing the registers that could possibly contain ++ * parameters to be passed into the stack frame and setting ++ * up space for a return value, ffi_closure_SYSV invokes the ++ * following helper function to do most of the work. ++ */ ++ ++#ifdef __LITTLE_ENDIAN__ ++#define OFS_INT8 0 ++#define OFS_INT16 2 ++#else ++#define OFS_INT8 3 ++#define OFS_INT16 2 ++#endif ++ ++int ++ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue, ++ unsigned long *pgr, unsigned long *pfr, ++ unsigned long *pst) ++{ ++ void **avalue; ++ ffi_type **p_arg; ++ int i, avn; ++ int ireg, greg = 0; ++#if defined(__SH4__) ++ int freg = 0; ++#endif ++ ffi_cif *cif; ++ double temp; ++ ++ cif = closure->cif; ++ avalue = alloca(cif->nargs * sizeof(void *)); ++ ++ /* Copy the caller's structure return value address so that the closure ++ returns the data directly to the caller. */ ++ if (cif->rtype->type == FFI_TYPE_STRUCT) ++ { ++ rvalue = *pgr++; ++ ireg = STRUCT_VALUE_ADDRESS_WITH_ARG ? 1 : 0; ++ } ++ else ++ ireg = 0; ++ ++ cif = closure->cif; ++ greg = ireg; ++ avn = cif->nargs; ++ ++ /* Grab the addresses of the arguments from the stack frame. */ ++ for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) ++ { ++ size_t z; ++ ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ if (greg++ >= NGREGARG) ++ continue; ++ ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ avalue[i] = (((char *)pgr) + OFS_INT8); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ avalue[i] = (((char *)pgr) + OFS_INT16); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ avalue[i] = pgr; ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ pgr++; ++ } ++ else if (z == sizeof(int)) ++ { ++#if defined(__SH4__) ++ if ((*p_arg)->type == FFI_TYPE_FLOAT) ++ { ++ if (freg++ >= NFREGARG) ++ continue; ++ avalue[i] = pfr; ++ pfr++; ++ } ++ else ++#endif ++ { ++ if (greg++ >= NGREGARG) ++ continue; ++ avalue[i] = pgr; ++ pgr++; ++ } ++ } ++#if defined(__SH4__) ++ else if ((*p_arg)->type == FFI_TYPE_DOUBLE) ++ { ++ if (freg + 1 >= NFREGARG) ++ continue; ++ freg = (freg + 1) & ~1; ++ freg += 2; ++ avalue[i] = pfr; ++ pfr += 2; ++ } ++#endif ++ else ++ { ++ int n = (z + sizeof (int) - 1) / sizeof (int); ++#if defined(__SH4__) ++ if (greg + n - 1 >= NGREGARG) ++ continue; ++ greg += n; ++#else ++ if (greg >= NGREGARG) ++ continue; ++ else if (greg + n - 1 >= NGREGARG) ++ greg = NGREGARG; ++ else ++ greg += n; ++#endif ++ avalue[i] = pgr; ++ pgr += n; ++ } ++ } ++ ++ greg = ireg; ++#if defined(__SH4__) ++ freg = 0; ++#endif ++ ++ for (i = 0, p_arg = cif->arg_types; i < avn; i++, p_arg++) ++ { ++ size_t z; ++ ++ z = (*p_arg)->size; ++ if (z < sizeof(int)) ++ { ++ if (greg++ < NGREGARG) ++ continue; ++ ++ z = sizeof(int); ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ avalue[i] = (((char *)pst) + OFS_INT8); ++ break; ++ ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ avalue[i] = (((char *)pst) + OFS_INT16); ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ avalue[i] = pst; ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ pst++; ++ } ++ else if (z == sizeof(int)) ++ { ++#if defined(__SH4__) ++ if ((*p_arg)->type == FFI_TYPE_FLOAT) ++ { ++ if (freg++ < NFREGARG) ++ continue; ++ } ++ else ++#endif ++ { ++ if (greg++ < NGREGARG) ++ continue; ++ } ++ avalue[i] = pst; ++ pst++; ++ } ++#if defined(__SH4__) ++ else if ((*p_arg)->type == FFI_TYPE_DOUBLE) ++ { ++ if (freg + 1 < NFREGARG) ++ { ++ freg = (freg + 1) & ~1; ++ freg += 2; ++ continue; ++ } ++ avalue[i] = pst; ++ pst += 2; ++ } ++#endif ++ else ++ { ++ int n = (z + sizeof (int) - 1) / sizeof (int); ++ if (greg + n - 1 < NGREGARG) ++ { ++ greg += n; ++ continue; ++ } ++#if (! defined(__SH4__)) ++ else if (greg < NGREGARG) ++ { ++ greg = NGREGARG; ++ continue; ++ } ++#endif ++ avalue[i] = pst; ++ pst += n; ++ } ++ } ++ ++ (closure->fun) (cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell ffi_closure_osf how to perform return type promotions. */ ++ return cif->rtype->type; ++} +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sh/sysv.S gcc/libffi/src/sh/sysv.S +--- gcc-3.2.2.orig/libffi/src/sh/sysv.S Thu Jan 1 09:00:00 1970 ++++ gcc/libffi/src/sh/sysv.S Tue Dec 17 03:22:48 2002 +@@ -0,0 +1,773 @@ ++/* ----------------------------------------------------------------------- ++ sysv.S - Copyright (c) 2002 Kaz Kojima ++ ++ SuperH Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#define LIBFFI_ASM ++#include <ffi.h> ++#ifdef HAVE_MACHINE_ASM_H ++#include <machine/asm.h> ++#else ++/* XXX these lose for some platforms, I'm sure. */ ++#define CNAME(x) x ++#define ENTRY(x) .globl CNAME(x); .type CNAME(x),%function; CNAME(x): ++#endif ++ ++#if defined(__HITACHI__) ++#define STRUCT_VALUE_ADDRESS_WITH_ARG 1 ++#else ++#define STRUCT_VALUE_ADDRESS_WITH_ARG 0 ++#endif ++ ++.text ++ ++ # r4: ffi_prep_args ++ # r5: &ecif ++ # r6: bytes ++ # r7: flags ++ # sp+0: rvalue ++ # sp+4: fn ++ ++ # This assumes we are using gas. ++ENTRY(ffi_call_SYSV) ++ # Save registers ++.LFB1: ++ mov.l r8,@-r15 ++.LCFI0: ++ mov.l r9,@-r15 ++.LCFI1: ++ mov.l r10,@-r15 ++.LCFI2: ++ mov.l r12,@-r15 ++.LCFI3: ++ mov.l r14,@-r15 ++.LCFI4: ++ sts.l pr,@-r15 ++.LCFI5: ++ mov r15,r14 ++.LCFI6: ++#if defined(__SH4__) ++ mov r6,r8 ++ mov r7,r9 ++ ++ sub r6,r15 ++ add #-16,r15 ++ mov #~7,r0 ++ and r0,r15 ++ ++ mov r4,r0 ++ jsr @r0 ++ mov r15,r4 ++ ++ mov r9,r1 ++ shlr8 r9 ++ shlr8 r9 ++ shlr8 r9 ++ ++ mov #FFI_TYPE_STRUCT,r2 ++ cmp/eq r2,r9 ++ bf 1f ++#if STRUCT_VALUE_ADDRESS_WITH_ARG ++ mov.l @r15+,r4 ++ bra 2f ++ mov #5,r2 ++#else ++ mov.l @r15+,r10 ++#endif ++1: ++ mov #4,r2 ++2: ++ mov #4,r3 ++ ++L_pass: ++ cmp/pl r8 ++ bf L_call_it ++ ++ mov r1,r0 ++ and #3,r0 ++ ++L_pass_d: ++ cmp/eq #FFI_TYPE_DOUBLE,r0 ++ bf L_pass_f ++ ++ mov r3,r0 ++ and #1,r0 ++ tst r0,r0 ++ bt 1f ++ add #1,r3 ++1: ++ mov r15,r0 ++ and #7,r0 ++ tst r0,r0 ++ bt 2f ++ add #4,r15 ++2: ++ mov #12,r0 ++ cmp/hs r0,r3 ++ bt/s 3f ++ shlr2 r1 ++ bsr L_pop_d ++ nop ++3: ++ add #2,r3 ++ bra L_pass ++ add #-8,r8 ++ ++L_pop_d: ++ mov r3,r0 ++ add r0,r0 ++ add r3,r0 ++ add #-12,r0 ++ braf r0 ++ nop ++#ifdef __LITTLE_ENDIAN__ ++ fmov.s @r15+,fr5 ++ rts ++ fmov.s @r15+,fr4 ++ fmov.s @r15+,fr7 ++ rts ++ fmov.s @r15+,fr6 ++ fmov.s @r15+,fr9 ++ rts ++ fmov.s @r15+,fr8 ++ fmov.s @r15+,fr11 ++ rts ++ fmov.s @r15+,fr10 ++#else ++ fmov.s @r15+,fr4 ++ rts ++ fmov.s @r15+,fr5 ++ fmov.s @r15+,fr6 ++ rts ++ fmov.s @r15+,fr7 ++ fmov.s @r15+,fr8 ++ rts ++ fmov.s @r15+,fr9 ++ fmov.s @r15+,fr10 ++ rts ++ fmov.s @r15+,fr11 ++#endif ++ ++L_pass_f: ++ cmp/eq #FFI_TYPE_FLOAT,r0 ++ bf L_pass_i ++ ++ mov #12,r0 ++ cmp/hs r0,r3 ++ bt/s 2f ++ shlr2 r1 ++ bsr L_pop_f ++ nop ++2: ++ add #1,r3 ++ bra L_pass ++ add #-4,r8 ++ ++L_pop_f: ++ mov r3,r0 ++ shll2 r0 ++ add #-16,r0 ++ braf r0 ++ nop ++#ifdef __LITTLE_ENDIAN__ ++ rts ++ fmov.s @r15+,fr5 ++ rts ++ fmov.s @r15+,fr4 ++ rts ++ fmov.s @r15+,fr7 ++ rts ++ fmov.s @r15+,fr6 ++ rts ++ fmov.s @r15+,fr9 ++ rts ++ fmov.s @r15+,fr8 ++ rts ++ fmov.s @r15+,fr11 ++ rts ++ fmov.s @r15+,fr10 ++#else ++ rts ++ fmov.s @r15+,fr4 ++ rts ++ fmov.s @r15+,fr5 ++ rts ++ fmov.s @r15+,fr6 ++ rts ++ fmov.s @r15+,fr7 ++ rts ++ fmov.s @r15+,fr8 ++ rts ++ fmov.s @r15+,fr9 ++ rts ++ fmov.s @r15+,fr10 ++ rts ++ fmov.s @r15+,fr11 ++#endif ++ ++L_pass_i: ++ cmp/eq #FFI_TYPE_INT,r0 ++ bf L_call_it ++ ++ mov #8,r0 ++ cmp/hs r0,r2 ++ bt/s 2f ++ shlr2 r1 ++ bsr L_pop_i ++ nop ++2: ++ add #1,r2 ++ bra L_pass ++ add #-4,r8 ++ ++L_pop_i: ++ mov r2,r0 ++ shll2 r0 ++ add #-16,r0 ++ braf r0 ++ nop ++ rts ++ mov.l @r15+,r4 ++ rts ++ mov.l @r15+,r5 ++ rts ++ mov.l @r15+,r6 ++ rts ++ mov.l @r15+,r7 ++ ++L_call_it: ++ # call function ++#if (! STRUCT_VALUE_ADDRESS_WITH_ARG) ++ mov r10, r2 ++#endif ++ mov.l @(28,r14),r1 ++ jsr @r1 ++ nop ++ ++L_ret_d: ++ mov #FFI_TYPE_DOUBLE,r2 ++ cmp/eq r2,r9 ++ bf L_ret_ll ++ ++ mov.l @(24,r14),r1 ++#ifdef __LITTLE_ENDIAN__ ++ fmov.s fr1,@r1 ++ add #4,r1 ++ bra L_epilogue ++ fmov.s fr0,@r1 ++#else ++ fmov.s fr0,@r1 ++ add #4,r1 ++ bra L_epilogue ++ fmov.s fr1,@r1 ++#endif ++ ++L_ret_ll: ++ mov #FFI_TYPE_SINT64,r2 ++ cmp/eq r2,r9 ++ bt/s 1f ++ mov #FFI_TYPE_UINT64,r2 ++ cmp/eq r2,r9 ++ bf L_ret_f ++ ++1: ++ mov.l @(24,r14),r2 ++ mov.l r0,@r2 ++ bra L_epilogue ++ mov.l r1,@(4,r2) ++ ++L_ret_f: ++ mov #FFI_TYPE_FLOAT,r2 ++ cmp/eq r2,r9 ++ bf L_ret_i ++ ++ mov.l @(24,r14),r1 ++ bra L_epilogue ++ fmov.s fr0,@r1 ++ ++L_ret_i: ++ mov #FFI_TYPE_INT,r2 ++ cmp/eq r2,r9 ++ bf L_epilogue ++ ++ mov.l @(24,r14),r1 ++ bra L_epilogue ++ mov.l r0,@r1 ++ ++L_epilogue: ++ # Remove the space we pushed for the args ++ mov r14,r15 ++ ++ lds.l @r15+,pr ++ mov.l @r15+,r14 ++ mov.l @r15+,r12 ++ mov.l @r15+,r10 ++ mov.l @r15+,r9 ++ rts ++ mov.l @r15+,r8 ++#else ++ mov r6,r8 ++ mov r7,r9 ++ ++ sub r6,r15 ++ add #-16,r15 ++ mov #~7,r0 ++ and r0,r15 ++ ++ mov r4,r0 ++ jsr @r0 ++ mov r15,r4 ++ ++ mov r9,r3 ++ shlr8 r9 ++ shlr8 r9 ++ shlr8 r9 ++ ++ mov #FFI_TYPE_STRUCT,r2 ++ cmp/eq r2,r9 ++ bf 1f ++#if STRUCT_VALUE_ADDRESS_WITH_ARG ++ mov.l @r15+,r4 ++ bra 2f ++ mov #5,r2 ++#else ++ mov.l @r15+,r10 ++#endif ++1: ++ mov #4,r2 ++2: ++ ++L_pass: ++ cmp/pl r8 ++ bf L_call_it ++ ++ mov r3,r0 ++ and #3,r0 ++ ++L_pass_d: ++ cmp/eq #FFI_TYPE_DOUBLE,r0 ++ bf L_pass_i ++ ++ mov r15,r0 ++ and #7,r0 ++ tst r0,r0 ++ bt 1f ++ add #4,r15 ++1: ++ mov #8,r0 ++ cmp/hs r0,r2 ++ bt/s 2f ++ shlr2 r3 ++ bsr L_pop_d ++ nop ++2: ++ add #2,r2 ++ bra L_pass ++ add #-8,r8 ++ ++L_pop_d: ++ mov r2,r0 ++ add r0,r0 ++ add r2,r0 ++ add #-12,r0 ++ add r0,r0 ++ braf r0 ++ nop ++ mov.l @r15+,r4 ++ rts ++ mov.l @r15+,r5 ++ mov.l @r15+,r5 ++ rts ++ mov.l @r15+,r6 ++ mov.l @r15+,r6 ++ rts ++ mov.l @r15+,r7 ++ rts ++ mov.l @r15+,r7 ++ ++L_pass_i: ++ mov #8,r0 ++ cmp/hs r0,r2 ++ bt/s 2f ++ shlr2 r3 ++ bsr L_pop_i ++ nop ++2: ++ add #1,r2 ++ bra L_pass ++ add #-4,r8 ++ ++L_pop_i: ++ mov r2,r0 ++ shll2 r0 ++ add #-16,r0 ++ braf r0 ++ nop ++ rts ++ mov.l @r15+,r4 ++ rts ++ mov.l @r15+,r5 ++ rts ++ mov.l @r15+,r6 ++ rts ++ mov.l @r15+,r7 ++ ++L_call_it: ++ # call function ++#if (! STRUCT_VALUE_ADDRESS_WITH_ARG) ++ mov r10, r2 ++#endif ++ mov.l @(28,r14),r1 ++ jsr @r1 ++ nop ++ ++L_ret_d: ++ mov #FFI_TYPE_DOUBLE,r2 ++ cmp/eq r2,r9 ++ bf L_ret_ll ++ ++ mov.l @(24,r14),r2 ++ mov.l r0,@r2 ++ bra L_epilogue ++ mov.l r1,@(4,r2) ++ ++L_ret_ll: ++ mov #FFI_TYPE_SINT64,r2 ++ cmp/eq r2,r9 ++ bt/s 1f ++ mov #FFI_TYPE_UINT64,r2 ++ cmp/eq r2,r9 ++ bf L_ret_i ++ ++1: ++ mov.l @(24,r14),r2 ++ mov.l r0,@r2 ++ bra L_epilogue ++ mov.l r1,@(4,r2) ++ ++L_ret_i: ++ mov #FFI_TYPE_FLOAT,r2 ++ cmp/eq r2,r9 ++ bt 1f ++ mov #FFI_TYPE_INT,r2 ++ cmp/eq r2,r9 ++ bf L_epilogue ++1: ++ mov.l @(24,r14),r1 ++ bra L_epilogue ++ mov.l r0,@r1 ++ ++L_epilogue: ++ # Remove the space we pushed for the args ++ mov r14,r15 ++ ++ lds.l @r15+,pr ++ mov.l @r15+,r14 ++ mov.l @r15+,r12 ++ mov.l @r15+,r10 ++ mov.l @r15+,r9 ++ rts ++ mov.l @r15+,r8 ++#endif ++.LFE1: ++.ffi_call_SYSV_end: ++ .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) ++ ++.globl ffi_closure_helper_SYSV ++ ++ENTRY(ffi_closure_SYSV) ++.LFB2: ++ mov.l r14,@-r15 ++.LCFI7: ++ sts.l pr,@-r15 ++ ++ /* Stack layout: ++ ... ++ 32 bytes (floating register parameters, SH-4 only) ++ 16 bytes (register parameters) ++ 4 bytes (result) ++ 4 bytes (5th arg) ++ <- new stack pointer ++ */ ++.LCFI8: ++#if defined(__SH4__) ++ add #-56,r15 ++#else ++ add #-24,r15 ++#endif ++.LCFI9: ++ mov r15,r14 ++.LCFIA: ++ mov r14,r1 ++ add #24,r1 ++ mov.l r7,@-r1 ++ mov.l r6,@-r1 ++ mov.l r5,@-r1 ++ mov.l r4,@-r1 ++ mov r1,r6 ++ ++#if defined(__SH4__) ++ mov r14,r1 ++ add #56,r1 ++#ifdef __LITTLE_ENDIAN__ ++ fmov.s fr10,@-r1 ++ fmov.s fr11,@-r1 ++ fmov.s fr8,@-r1 ++ fmov.s fr9,@-r1 ++ fmov.s fr6,@-r1 ++ fmov.s fr7,@-r1 ++ fmov.s fr4,@-r1 ++ fmov.s fr5,@-r1 ++#else ++ fmov.s fr11,@-r1 ++ fmov.s fr10,@-r1 ++ fmov.s fr9,@-r1 ++ fmov.s fr8,@-r1 ++ fmov.s fr7,@-r1 ++ fmov.s fr6,@-r1 ++ fmov.s fr5,@-r1 ++ fmov.s fr4,@-r1 ++#endif ++ mov r1,r7 ++#endif ++ ++ mov r14,r1 ++ add #4,r1 ++ mov r1,r5 ++ ++ mov r14,r1 ++#if defined(__SH4__) ++ add #64,r1 ++#else ++ add #32,r1 ++#endif ++ mov.l r1,@r14 ++ ++ mov.l L_helper,r0 ++ jsr @r0 ++ mov r3,r4 ++ ++ shll r0 ++ mov r0,r1 ++ mova L_table,r0 ++ add r1,r0 ++ mov.w @r0,r0 ++ mov r14,r2 ++ braf r0 ++ add #4,r2 ++0: ++ .align 2 ++L_helper: ++ .long ffi_closure_helper_SYSV ++L_table: ++ .short L_case_v - 0b /* FFI_TYPE_VOID */ ++ .short L_case_i - 0b /* FFI_TYPE_INT */ ++#if defined(__SH4__) ++ .short L_case_f - 0b /* FFI_TYPE_FLOAT */ ++ .short L_case_d - 0b /* FFI_TYPE_DOUBLE */ ++ .short L_case_d - 0b /* FFI_TYPE_LONGDOUBLE */ ++#else ++ .short L_case_i - 0b /* FFI_TYPE_FLOAT */ ++ .short L_case_ll - 0b /* FFI_TYPE_DOUBLE */ ++ .short L_case_ll - 0b /* FFI_TYPE_LONGDOUBLE */ ++#endif ++ .short L_case_uq - 0b /* FFI_TYPE_UINT8 */ ++ .short L_case_q - 0b /* FFI_TYPE_SINT8 */ ++ .short L_case_uh - 0b /* FFI_TYPE_UINT16 */ ++ .short L_case_h - 0b /* FFI_TYPE_SINT16 */ ++ .short L_case_i - 0b /* FFI_TYPE_UINT32 */ ++ .short L_case_i - 0b /* FFI_TYPE_SINT32 */ ++ .short L_case_ll - 0b /* FFI_TYPE_UINT64 */ ++ .short L_case_ll - 0b /* FFI_TYPE_SINT64 */ ++ .short L_case_v - 0b /* FFI_TYPE_STRUCT */ ++ .short L_case_i - 0b /* FFI_TYPE_POINTER */ ++ ++#if defined(__SH4__) ++L_case_d: ++#ifdef __LITTLE_ENDIAN__ ++ fmov.s @r2+,fr1 ++ bra L_case_v ++ fmov.s @r2,fr0 ++#else ++ fmov.s @r2+,fr0 ++ bra L_case_v ++ fmov.s @r2,fr1 ++#endif ++ ++L_case_f: ++ bra L_case_v ++ fmov.s @r2,fr0 ++#endif ++ ++L_case_ll: ++ mov.l @r2+,r0 ++ bra L_case_v ++ mov.l @r2,r1 ++ ++L_case_i: ++ bra L_case_v ++ mov.l @r2,r0 ++ ++L_case_q: ++#ifdef __LITTLE_ENDIAN__ ++#else ++ add #3,r2 ++#endif ++ bra L_case_v ++ mov.b @r2,r0 ++ ++L_case_uq: ++#ifdef __LITTLE_ENDIAN__ ++#else ++ add #3,r2 ++#endif ++ mov.b @r2,r0 ++ bra L_case_v ++ extu.b r0,r0 ++ ++L_case_h: ++#ifdef __LITTLE_ENDIAN__ ++#else ++ add #2,r2 ++#endif ++ bra L_case_v ++ mov.w @r2,r0 ++ ++L_case_uh: ++#ifdef __LITTLE_ENDIAN__ ++#else ++ add #2,r2 ++#endif ++ mov.w @r2,r0 ++ extu.w r0,r0 ++ /* fall through */ ++ ++L_case_v: ++#if defined(__SH4__) ++ add #56,r15 ++#else ++ add #24,r15 ++#endif ++ lds.l @r15+,pr ++ rts ++ mov.l @r15+,r14 ++.LFE2: ++.ffi_closure_SYSV_end: ++ .size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) ++ ++ .section ".eh_frame","aw",@progbits ++__FRAME_BEGIN__: ++ .4byte .LECIE1-.LSCIE1 /* Length of Common Information Entry */ ++.LSCIE1: ++ .4byte 0x0 /* CIE Identifier Tag */ ++ .byte 0x1 /* CIE Version */ ++ .byte 0x0 /* CIE Augmentation */ ++ .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ ++ .byte 0x7c /* sleb128 -4; CIE Data Alignment Factor */ ++ .byte 0x11 /* CIE RA Column */ ++ .byte 0xc /* DW_CFA_def_cfa */ ++ .byte 0xf /* uleb128 0xf */ ++ .byte 0x0 /* uleb128 0x0 */ ++ .align 2 ++.LECIE1: ++.LSFDE1: ++ .4byte .LEFDE1-.LASFDE1 /* FDE Length */ ++.LASFDE1: ++ .4byte .LASFDE1-__FRAME_BEGIN__ /* FDE CIE offset */ ++ .4byte .LFB1 /* FDE initial location */ ++ .4byte .LFE1-.LFB1 /* FDE address range */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .4byte .LCFI0-.LFB1 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 0x4 /* uleb128 0x4 */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .4byte .LCFI1-.LCFI0 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 0x8 /* uleb128 0x4 */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .4byte .LCFI2-.LCFI1 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 0xc /* uleb128 0x4 */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .4byte .LCFI3-.LCFI2 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 0x10 /* uleb128 0x4 */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .4byte .LCFI4-.LCFI3 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 0x14 /* uleb128 0x4 */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .4byte .LCFI5-.LCFI4 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 0x18 /* uleb128 0x4 */ ++ .byte 0x91 /* DW_CFA_offset, column 0x11 */ ++ .byte 0x6 /* uleb128 0x6 */ ++ .byte 0x8e /* DW_CFA_offset, column 0xe */ ++ .byte 0x5 /* uleb128 0x5 */ ++ .byte 0x8c /* DW_CFA_offset, column 0xc */ ++ .byte 0x4 /* uleb128 0x4 */ ++ .byte 0x8a /* DW_CFA_offset, column 0xa */ ++ .byte 0x3 /* uleb128 0x3 */ ++ .byte 0x89 /* DW_CFA_offset, column 0x9 */ ++ .byte 0x2 /* uleb128 0x2 */ ++ .byte 0x88 /* DW_CFA_offset, column 0x8 */ ++ .byte 0x1 /* uleb128 0x1 */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .4byte .LCFI6-.LCFI5 ++ .byte 0xd /* DW_CFA_def_cfa_register */ ++ .byte 0xe /* uleb128 0xe */ ++ .align 2 ++.LEFDE1: ++ ++.LSFDE3: ++ .4byte .LEFDE3-.LASFDE3 /* FDE Length */ ++.LASFDE3: ++ .4byte .LASFDE3-__FRAME_BEGIN__ /* FDE CIE offset */ ++ .4byte .LFB2 /* FDE initial location */ ++ .4byte .LFE2-.LFB2 /* FDE address range */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .4byte .LCFI7-.LFB2 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 0x4 /* uleb128 0x4 */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .4byte .LCFI8-.LCFI7 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++ .byte 0x8 /* uleb128 0x8 */ ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .4byte .LCFI9-.LCFI8 ++ .byte 0xe /* DW_CFA_def_cfa_offset */ ++#if defined(__SH4__) ++ .byte 8+56 /* uleb128 8+56 */ ++#else ++ .byte 8+24 /* uleb128 8+24 */ ++#endif ++ .byte 0x91 /* DW_CFA_offset, column 0x11 */ ++ .byte 0x2 ++ .byte 0x8e /* DW_CFA_offset, column 0xe */ ++ .byte 0x1 ++ .byte 0x4 /* DW_CFA_advance_loc4 */ ++ .4byte .LCFIA-.LCFI9 ++ .byte 0xd /* DW_CFA_def_cfa_register */ ++ .byte 0xe /* uleb128 0xe */ ++ .align 2 ++.LEFDE3: +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/ffi.c gcc/libffi/src/sparc/ffi.c +--- gcc-3.2.2.orig/libffi/src/sparc/ffi.c Sat Mar 3 07:21:23 2001 ++++ gcc/libffi/src/sparc/ffi.c Sat Jan 4 08:08:56 2003 +@@ -1,5 +1,5 @@ + /* ----------------------------------------------------------------------- +- ffi.c - Copyright (c) 1996 Cygnus Solutions ++ ffi.c - Copyright (c) 1996, 2003 Cygnus Solutions + + Sparc Foreign Function Interface + +@@ -28,20 +28,22 @@ + + #include <stdlib.h> + ++#ifdef SPARC64 ++extern void ffi_closure_v9(void); ++#else ++extern void ffi_closure_v8(void); ++#endif ++ + /* ffi_prep_args is called by the assembly routine once stack space + has been allocated for the function's arguments */ + + void ffi_prep_args_v8(char *stack, extended_cif *ecif) + { + int i; +- int tmp; +- int avn; + void **p_argv; + char *argp; + ffi_type **p_arg; + +- tmp = 0; +- + /* Skip 16 words for the window save area */ + argp = stack + 16*sizeof(int); + +@@ -66,18 +68,12 @@ + ((int*)argp)[5] = 0; + #endif + +- avn = ecif->cif->nargs; + p_argv = ecif->avalue; + +- for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; +- i && avn; +- i--, p_arg++) ++ for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; i; i--, p_arg++) + { + size_t z; + +- if (avn) +- { +- avn--; + if ((*p_arg)->type == FFI_TYPE_STRUCT + #if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE + || (*p_arg)->type == FFI_TYPE_LONGDOUBLE +@@ -122,7 +118,6 @@ + } + p_argv++; + argp += z; +- } + } + + return; +@@ -420,3 +415,101 @@ + } + + } ++ ++ffi_status ++ffi_prep_closure (ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void *user_data) ++{ ++ unsigned int *tramp = (unsigned int *) &closure->tramp[0]; ++ unsigned long fn; ++ unsigned long ctx = (unsigned long) closure; ++ ++#ifdef SPARC64 ++ /* Trampoline address is equal to the closure address. We take advantage ++ of that to reduce the trampoline size by 8 bytes. */ ++ FFI_ASSERT (cif->abi == FFI_V9); ++ fn = (unsigned long) ffi_closure_v9; ++ tramp[0] = 0x83414000; /* rd %pc, %g1 */ ++ tramp[1] = 0xca586010; /* ldx [%g1+16], %g5 */ ++ tramp[2] = 0x81c14000; /* jmp %g5 */ ++ tramp[3] = 0x01000000; /* nop */ ++ *((unsigned long *) &tramp[4]) = fn; ++#else ++ FFI_ASSERT (cif->abi == FFI_V8); ++ fn = (unsigned long) ffi_closure_v8; ++ tramp[0] = 0x03000000 | fn >> 10; /* sethi %hi(fn), %g1 */ ++ tramp[1] = 0x05000000 | ctx >> 10; /* sethi %hi(ctx), %g2 */ ++ tramp[2] = 0x81c06000 | (fn & 0x3ff); /* jmp %g1+%lo(fn) */ ++ tramp[3] = 0x8410a000 | (ctx & 0x3ff);/* or %g2, %lo(ctx) */ ++#endif ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ /* Flush the Icache. FIXME: alignment isn't certain, assume 8 bytes */ ++#ifdef SPARC64 ++ asm volatile ("flush %0" : : "r" (closure) : "memory"); ++ asm volatile ("flush %0" : : "r" (((char *) closure) + 8) : "memory"); ++#else ++ asm volatile ("iflush %0" : : "r" (closure) : "memory"); ++ asm volatile ("iflush %0" : : "r" (((char *) closure) + 8) : "memory"); ++#endif ++ ++ return FFI_OK; ++} ++ ++int ++ffi_closure_sparc_inner(ffi_closure *closure, ++ void *rvalue, unsigned long *gpr, double *fpr) ++{ ++ ffi_cif *cif; ++ void **avalue; ++ ffi_type **arg_types; ++ int i, avn, argn; ++ ++ cif = closure->cif; ++ avalue = alloca(cif->nargs * sizeof(void *)); ++ ++ argn = 0; ++ ++ /* Copy the caller's structure return address to that the closure ++ returns the data directly to the caller. */ ++ if (cif->flags == FFI_TYPE_STRUCT) ++ { ++ rvalue = (void *) gpr[0]; ++ argn = 1; ++ } ++ ++ i = 0; ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ /* Grab the addresses of the arguments from the stack frame. */ ++ while (i < avn) ++ { ++ /* Assume big-endian. FIXME */ ++ argn += ALIGN(arg_types[i]->size, SIZEOF_ARG) / SIZEOF_ARG; ++ ++#ifdef SPARC64 ++ if (i < 6 && (arg_types[i]->type == FFI_TYPE_FLOAT ++ || arg_types[i]->type == FFI_TYPE_DOUBLE ++#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE ++ || arg_types[i]->type == FFI_TYPE_LONGDOUBLE ++#endif ++ )) ++ avalue[i] = ((char *) &fpr[argn]) - arg_types[i]->size; ++ else ++#endif ++ avalue[i] = ((char *) &gpr[argn]) - arg_types[i]->size; ++ i++; ++ } ++ ++ /* Invoke the closure. */ ++ (closure->fun) (cif, rvalue, avalue, closure->user_data); ++ ++ /* Tell ffi_closure_sparc how to perform return type promotions. */ ++ return cif->rtype->type; ++} +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/v8.S gcc/libffi/src/sparc/v8.S +--- gcc-3.2.2.orig/libffi/src/sparc/v8.S Mon Apr 29 05:12:04 2002 ++++ gcc/libffi/src/sparc/v8.S Sat Jan 4 08:08:56 2003 +@@ -1,5 +1,5 @@ + /* ----------------------------------------------------------------------- +- v8.S - Copyright (c) 1996, 1997 Cygnus Solutions ++ v8.S - Copyright (c) 1996, 1997, 2003 Cygnus Solutions + + Sparc Foreign Function Interface + +@@ -94,6 +94,72 @@ + .ffi_call_V8_end: + .size ffi_call_V8,.ffi_call_V8_end-ffi_call_V8 + ++ ++#define STACKFRAME 104 /* 16*4 register window + ++ 1*4 struct return + ++ 6*4 args backing store + ++ 3*4 locals */ ++ ++/* ffi_closure_v8(...) ++ ++ Receives the closure argument in %g2. */ ++ ++ .text ++ .align 8 ++ .globl ffi_closure_v8 ++ ++ffi_closure_v8: ++ .register %g2, #scratch ++.LLFB2: ++ save %sp, -STACKFRAME, %sp ++.LLCFI1: ++ ++ ! Store all of the potential argument registers in va_list format. ++ st %i0, [%fp+68+0] ++ st %i1, [%fp+68+4] ++ st %i2, [%fp+68+8] ++ st %i3, [%fp+68+12] ++ st %i4, [%fp+68+16] ++ st %i5, [%fp+68+20] ++ ++ ! Call ffi_closure_sparc_inner to do the bulk of the work. ++ mov %g2, %o0 ++ add %fp, -8, %o1 ++ add %fp, 68, %o2 ++ call ffi_closure_sparc_inner ++ mov 0, %o3 ++ ++ ! Load up the return value in the proper type. ++ cmp %o0, FFI_TYPE_VOID ++ be done1 ++ ++ cmp %o0, FFI_TYPE_FLOAT ++ be,a done1 ++ ld [%fp-8], %f0 ++ ++ cmp %o0, FFI_TYPE_DOUBLE ++ be,a done1 ++ ldd [%fp-8], %f0 ++ ++ cmp %o0, FFI_TYPE_SINT64 ++ be,a integer ++ ld [%fp-4], %i1 ++ ++ cmp %o0, FFI_TYPE_UINT64 ++ be,a integer ++ ld [%fp-4], %i1 ++ ++integer: ++ ld [%fp-8], %i0 ++ ++done1: ++ ret ++ restore ++.LLFE2: ++ ++.ffi_closure_v8_end: ++ .size ffi_closure_v8,.ffi_closure_v8_end-ffi_closure_v8 ++ + #ifdef SPARC64 + #define WS 8 + #define nword xword +@@ -148,3 +214,26 @@ + .byte 0x1f ! uleb128 0x1f + .align WS + .LLEFDE1: ++.LLSFDE2: ++ .uaword .LLEFDE2-.LLASFDE2 ! FDE Length ++.LLASFDE2: ++ .uaword .LLASFDE2-.LLframe1 ! FDE CIE offset ++#ifdef HAVE_AS_SPARC_UA_PCREL ++ .uaword %r_disp32(.LLFB2) ++ .uaword .LLFE2-.LLFB2 ! FDE address range ++#else ++ .align WS ++ .nword .LLFB2 ++ .uanword .LLFE2-.LLFB2 ! FDE address range ++#endif ++ .byte 0x0 ! uleb128 0x0; Augmentation size ++ .byte 0x4 ! DW_CFA_advance_loc4 ++ .uaword .LLCFI1-.LLFB2 ++ .byte 0xd ! DW_CFA_def_cfa_register ++ .byte 0x1e ! uleb128 0x1e ++ .byte 0x2d ! DW_CFA_GNU_window_save ++ .byte 0x9 ! DW_CFA_register ++ .byte 0xf ! uleb128 0xf ++ .byte 0x1f ! uleb128 0x1f ++ .align WS ++.LLEFDE2: +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/sparc/v9.S gcc/libffi/src/sparc/v9.S +--- gcc-3.2.2.orig/libffi/src/sparc/v9.S Mon Apr 29 05:12:04 2002 ++++ gcc/libffi/src/sparc/v9.S Sat Jan 4 08:08:56 2003 +@@ -1,5 +1,5 @@ + /* ----------------------------------------------------------------------- +- v9.S - Copyright (c) 2000 Cygnus Solutions ++ v9.S - Copyright (c) 2000, 2003 Cygnus Solutions + + Sparc 64bit Foreign Function Interface + +@@ -99,7 +99,7 @@ + cmp %i3, FFI_TYPE_STRUCT + be,pn %icc, dostruct + +- cmp %i3, FFI_TYPE_LONGDOUBLE ++ cmp %i3, FFI_TYPE_LONGDOUBLE + bne,pt %icc, done + nop + std %f0, [%i4+0] +@@ -125,6 +125,88 @@ + .ffi_call_V9_end: + .size ffi_call_V9,.ffi_call_V9_end-ffi_call_V9 + ++ ++#define STACKFRAME 240 /* 16*8 register window + ++ 6*8 args backing store + ++ 8*8 locals */ ++#define FP %fp+STACK_BIAS ++ ++/* ffi_closure_v9(...) ++ ++ Receives the closure argument in %g1. */ ++ ++ .text ++ .align 8 ++ .globl ffi_closure_v9 ++ ++ffi_closure_v9: ++.LLFB2: ++ save %sp, -STACKFRAME, %sp ++.LLCFI1: ++ ++ ! Store all of the potential argument registers in va_list format. ++ stx %i0, [FP+128+0] ++ stx %i1, [FP+128+8] ++ stx %i2, [FP+128+16] ++ stx %i3, [FP+128+24] ++ stx %i4, [FP+128+32] ++ stx %i5, [FP+128+40] ++ ++ ! Store possible floating point argument registers too. ++ std %f0, [FP-48] ++ std %f2, [FP-40] ++ std %f4, [FP-32] ++ std %f6, [FP-24] ++ std %f8, [FP-16] ++ std %f10, [FP-8] ++ ++ ! Call ffi_closure_sparc_inner to do the bulk of the work. ++ mov %g1, %o0 ++ add %fp, STACK_BIAS-64, %o1 ++ add %fp, STACK_BIAS+128, %o2 ++ call ffi_closure_sparc_inner ++ add %fp, STACK_BIAS-48, %o3 ++ ++ ! Load up the return value in the proper type. ++ cmp %o0, FFI_TYPE_VOID ++ be,pn %icc, done1 ++ ++ cmp %o0, FFI_TYPE_FLOAT ++ be,a,pn %icc, done1 ++ ld [FP-64], %f0 ++ ++ cmp %o0, FFI_TYPE_DOUBLE ++ be,a,pn %icc, done1 ++ ldd [FP-64], %f0 ++ ++ cmp %o0, FFI_TYPE_LONGDOUBLE ++ be,a,pn %icc, longdouble1 ++ ldd [FP-64], %f0 ++ ++ cmp %o0, FFI_TYPE_STRUCT ++ be,pn %icc, struct1 ++ ++ ! FFI_TYPE_UINT64 | FFI_TYPE_SINT64 | FFI_TYPE_POINTER ++ ldx [FP-64], %i0 ++ ++done1: ++ ret ++ restore ++ ++struct1: ++ ldx [FP-56], %i2 ++ ret ++ restore ++ ++longdouble1: ++ ldd [FP-56], %f2 ++ ret ++ restore ++.LLFE2: ++ ++.ffi_closure_v9_end: ++ .size ffi_closure_v9,.ffi_closure_v9_end-ffi_closure_v9 ++ + .section ".eh_frame",#alloc,#write + .LLframe1: + .uaword .LLECIE1-.LLSCIE1 ! Length of Common Information Entry +@@ -169,5 +251,27 @@ + .byte 0x1f ! uleb128 0x1f + .align 8 + .LLEFDE1: +- ++.LLSFDE2: ++ .uaword .LLEFDE2-.LLASFDE2 ! FDE Length ++.LLASFDE2: ++ .uaword .LLASFDE2-.LLframe1 ! FDE CIE offset ++#ifdef HAVE_AS_SPARC_UA_PCREL ++ .uaword %r_disp32(.LLFB2) ++ .uaword .LLFE2-.LLFB2 ! FDE address range ++#else ++ .align 8 ++ .xword .LLFB2 ++ .uaxword .LLFE2-.LLFB2 ! FDE address range ++#endif ++ .byte 0x0 ! uleb128 0x0; Augmentation size ++ .byte 0x4 ! DW_CFA_advance_loc4 ++ .uaword .LLCFI1-.LLFB2 ++ .byte 0xd ! DW_CFA_def_cfa_register ++ .byte 0x1e ! uleb128 0x1e ++ .byte 0x2d ! DW_CFA_GNU_window_save ++ .byte 0x9 ! DW_CFA_register ++ .byte 0xf ! uleb128 0xf ++ .byte 0x1f ! uleb128 0x1f ++ .align 8 ++.LLEFDE2: + #endif +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/types.c gcc/libffi/src/types.c +--- gcc-3.2.2.orig/libffi/src/types.c Tue Mar 27 11:39:16 2001 ++++ gcc/libffi/src/types.c Wed Nov 27 07:24:05 2002 +@@ -42,7 +42,8 @@ + FFI_INTEGRAL_TYPEDEF(sint32, 4, 4, FFI_TYPE_SINT32); + FFI_INTEGRAL_TYPEDEF(float, 4, 4, FFI_TYPE_FLOAT); + +-#if defined ALPHA || defined SPARC64 ++#if defined ALPHA || defined SPARC64 || defined X86_64 || defined S390X \ ++ || defined IA64 + + FFI_INTEGRAL_TYPEDEF(pointer, 8, 8, FFI_TYPE_POINTER); + +@@ -52,22 +53,12 @@ + + #endif + +-#ifdef X86 ++#if defined X86 || defined X86_WIN32 || defined ARM || defined M68K + + FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); + +-#elif defined X86_WIN32 +- +-FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); +-FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +- +-#elif defined ARM +- +-FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); +-FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +- +-#elif defined M68K ++#elif defined SH + + FFI_INTEGRAL_TYPEDEF(uint64, 8, 4, FFI_TYPE_UINT64); + FFI_INTEGRAL_TYPEDEF(sint64, 8, 4, FFI_TYPE_SINT64); +@@ -80,12 +71,7 @@ + #endif + + +-#ifdef X86 +- +-FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +-FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); +- +-#elif defined X86_WIN32 ++#if defined X86 || defined X86_WIN32 || defined M68K + + FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); + FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); +@@ -95,25 +81,25 @@ + FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); + FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); + +-#elif defined M68K ++#elif defined SH + + FFI_INTEGRAL_TYPEDEF(double, 8, 4, FFI_TYPE_DOUBLE); +-FFI_INTEGRAL_TYPEDEF(longdouble, 12, 4, FFI_TYPE_LONGDOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 8, 4, FFI_TYPE_LONGDOUBLE); + + #elif defined SPARC + + FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +- + #ifdef SPARC64 +- + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); +- + #else +- + FFI_INTEGRAL_TYPEDEF(longdouble, 16, 8, FFI_TYPE_LONGDOUBLE); +- + #endif + ++#elif defined X86_64 ++ ++FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); ++FFI_INTEGRAL_TYPEDEF(longdouble, 16, 16, FFI_TYPE_LONGDOUBLE); ++ + #else + + FFI_INTEGRAL_TYPEDEF(double, 8, 8, FFI_TYPE_DOUBLE); +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/ffi.c gcc/libffi/src/x86/ffi.c +--- gcc-3.2.2.orig/libffi/src/x86/ffi.c Tue May 28 18:22:08 2002 ++++ gcc/libffi/src/x86/ffi.c Fri Dec 6 10:16:45 2002 +@@ -1,5 +1,8 @@ + /* ----------------------------------------------------------------------- +- ffi.c - Copyright (c) 1996, 1998, 1999 Cygnus Solutions ++ ffi.c - Copyright (c) 1996, 1998, 1999, 2001 Red Hat, Inc. ++ Copyright (c) 2002 Ranjit Mathew ++ Copyright (c) 2002 Bo Thorsen ++ Copyright (c) 2002 Roger Sayle + + x86 Foreign Function Interface + +@@ -23,6 +26,8 @@ + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + ++#ifndef __x86_64__ ++ + #include <ffi.h> + #include <ffi_common.h> + +@@ -36,12 +41,10 @@ + /*@=exportheader@*/ + { + register unsigned int i; +- register int tmp; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + +- tmp = 0; + argp = stack; + + if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) +@@ -148,6 +151,18 @@ + /*@=declundef@*/ + /*@=exportheader@*/ + ++#ifdef X86_WIN32 ++/*@-declundef@*/ ++/*@-exportheader@*/ ++extern void ffi_call_STDCALL(void (*)(char *, extended_cif *), ++ /*@out@*/ extended_cif *, ++ unsigned, unsigned, ++ /*@out@*/ unsigned *, ++ void (*fn)()); ++/*@=declundef@*/ ++/*@=exportheader@*/ ++#endif /* X86_WIN32 */ ++ + void ffi_call(/*@dependent@*/ ffi_cif *cif, + void (*fn)(), + /*@out@*/ void *rvalue, +@@ -180,6 +195,14 @@ + cif->flags, ecif.rvalue, fn); + /*@=usedef@*/ + break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ /*@-usedef@*/ ++ ffi_call_STDCALL(ffi_prep_args, &ecif, cif->bytes, ++ cif->flags, ecif.rvalue, fn); ++ /*@=usedef@*/ ++ break; ++#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; +@@ -266,12 +289,10 @@ + /*@=exportheader@*/ + { + register unsigned int i; +- register int tmp; + register void **p_argv; + register char *argp; + register ffi_type **p_arg; + +- tmp = 0; + argp = stack; + + if ( cif->rtype->type == FFI_TYPE_STRUCT ) { +@@ -281,13 +302,14 @@ + + p_argv = avalue; + +- for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++) ++ for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) + { + size_t z; + + /* Align if necessary */ +- if (((*p_arg)->alignment - 1) & (unsigned) argp) ++ if (((*p_arg)->alignment - 1) & (unsigned) argp) { + argp = (char *) ALIGN(argp, (*p_arg)->alignment); ++ } + + z = (*p_arg)->size; + +@@ -298,7 +320,7 @@ + p_argv++; + argp += z; + } +- ++ + return; + } + +@@ -449,6 +471,15 @@ + /*@out@*/ unsigned *, + void (*fn)()); + ++#ifdef X86_WIN32 ++extern void ++ffi_call_STDCALL(void (*)(char *, extended_cif *), ++ /*@out@*/ extended_cif *, ++ unsigned, unsigned, ++ /*@out@*/ unsigned *, ++ void (*fn)()); ++#endif /* X86_WIN32 */ ++ + void + ffi_raw_call(/*@dependent@*/ ffi_cif *cif, + void (*fn)(), +@@ -483,6 +514,14 @@ + cif->flags, ecif.rvalue, fn); + /*@=usedef@*/ + break; ++#ifdef X86_WIN32 ++ case FFI_STDCALL: ++ /*@-usedef@*/ ++ ffi_call_STDCALL(ffi_prep_args_raw, &ecif, cif->bytes, ++ cif->flags, ecif.rvalue, fn); ++ /*@=usedef@*/ ++ break; ++#endif /* X86_WIN32 */ + default: + FFI_ASSERT(0); + break; +@@ -490,3 +529,5 @@ + } + + #endif ++ ++#endif /* __x86_64__ */ +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/ffi64.c gcc/libffi/src/x86/ffi64.c +--- gcc-3.2.2.orig/libffi/src/x86/ffi64.c Thu Jan 1 09:00:00 1970 ++++ gcc/libffi/src/x86/ffi64.c Wed Jan 29 00:54:28 2003 +@@ -0,0 +1,706 @@ ++/* ----------------------------------------------------------------------- ++ ffi.c - Copyright (c) 2002 Bo Thorsen <bo@suse.de> ++ ++ x86-64 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#include <ffi.h> ++#include <ffi_common.h> ++ ++#include <stdlib.h> ++#include <stdarg.h> ++ ++/* ffi_prep_args is called by the assembly routine once stack space ++ has been allocated for the function's arguments */ ++ ++#ifdef __x86_64__ ++ ++#define MAX_GPR_REGS 6 ++#define MAX_SSE_REGS 8 ++typedef struct ++{ ++ /* Registers for argument passing. */ ++ long gpr[MAX_GPR_REGS]; ++ __int128_t sse[MAX_SSE_REGS]; ++ ++ /* Stack space for arguments. */ ++ char argspace[0]; ++} stackLayout; ++ ++/* All reference to register classes here is identical to the code in ++ gcc/config/i386/i386.c. Do *not* change one without the other. */ ++ ++/* Register class used for passing given 64bit part of the argument. ++ These represent classes as documented by the PS ABI, with the exception ++ of SSESF, SSEDF classes, that are basically SSE class, just gcc will ++ use SF or DFmode move instead of DImode to avoid reformating penalties. ++ ++ Similary we play games with INTEGERSI_CLASS to use cheaper SImode moves ++ whenever possible (upper half does contain padding). ++ */ ++enum x86_64_reg_class ++ { ++ X86_64_NO_CLASS, ++ X86_64_INTEGER_CLASS, ++ X86_64_INTEGERSI_CLASS, ++ X86_64_SSE_CLASS, ++ X86_64_SSESF_CLASS, ++ X86_64_SSEDF_CLASS, ++ X86_64_SSEUP_CLASS, ++ X86_64_X87_CLASS, ++ X86_64_X87UP_CLASS, ++ X86_64_MEMORY_CLASS ++ }; ++ ++#define MAX_CLASSES 4 ++ ++/* x86-64 register passing implementation. See x86-64 ABI for details. Goal ++ of this code is to classify each 8bytes of incoming argument by the register ++ class and assign registers accordingly. */ ++ ++/* Return the union class of CLASS1 and CLASS2. ++ See the x86-64 PS ABI for details. */ ++ ++static enum x86_64_reg_class ++merge_classes (enum x86_64_reg_class class1, enum x86_64_reg_class class2) ++{ ++ /* Rule #1: If both classes are equal, this is the resulting class. */ ++ if (class1 == class2) ++ return class1; ++ ++ /* Rule #2: If one of the classes is NO_CLASS, the resulting class is ++ the other class. */ ++ if (class1 == X86_64_NO_CLASS) ++ return class2; ++ if (class2 == X86_64_NO_CLASS) ++ return class1; ++ ++ /* Rule #3: If one of the classes is MEMORY, the result is MEMORY. */ ++ if (class1 == X86_64_MEMORY_CLASS || class2 == X86_64_MEMORY_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #4: If one of the classes is INTEGER, the result is INTEGER. */ ++ if ((class1 == X86_64_INTEGERSI_CLASS && class2 == X86_64_SSESF_CLASS) ++ || (class2 == X86_64_INTEGERSI_CLASS && class1 == X86_64_SSESF_CLASS)) ++ return X86_64_INTEGERSI_CLASS; ++ if (class1 == X86_64_INTEGER_CLASS || class1 == X86_64_INTEGERSI_CLASS ++ || class2 == X86_64_INTEGER_CLASS || class2 == X86_64_INTEGERSI_CLASS) ++ return X86_64_INTEGER_CLASS; ++ ++ /* Rule #5: If one of the classes is X87 or X87UP class, MEMORY is used. */ ++ if (class1 == X86_64_X87_CLASS || class1 == X86_64_X87UP_CLASS ++ || class2 == X86_64_X87_CLASS || class2 == X86_64_X87UP_CLASS) ++ return X86_64_MEMORY_CLASS; ++ ++ /* Rule #6: Otherwise class SSE is used. */ ++ return X86_64_SSE_CLASS; ++} ++ ++/* Classify the argument of type TYPE and mode MODE. ++ CLASSES will be filled by the register class used to pass each word ++ of the operand. The number of words is returned. In case the parameter ++ should be passed in memory, 0 is returned. As a special case for zero ++ sized containers, classes[0] will be NO_CLASS and 1 is returned. ++ ++ See the x86-64 PS ABI for details. ++*/ ++static int ++classify_argument (ffi_type *type, enum x86_64_reg_class classes[], ++ int *byte_offset) ++{ ++ /* First, align to the right place. */ ++ *byte_offset = ALIGN(*byte_offset, type->alignment); ++ ++ switch (type->type) ++ { ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_POINTER: ++ if (((*byte_offset) % 8 + type->size) <= 4) ++ classes[0] = X86_64_INTEGERSI_CLASS; ++ else ++ classes[0] = X86_64_INTEGER_CLASS; ++ return 1; ++ case FFI_TYPE_FLOAT: ++ if (((*byte_offset) % 8) == 0) ++ classes[0] = X86_64_SSESF_CLASS; ++ else ++ classes[0] = X86_64_SSE_CLASS; ++ return 1; ++ case FFI_TYPE_DOUBLE: ++ classes[0] = X86_64_SSEDF_CLASS; ++ return 1; ++ case FFI_TYPE_LONGDOUBLE: ++ classes[0] = X86_64_X87_CLASS; ++ classes[1] = X86_64_X87UP_CLASS; ++ return 2; ++ case FFI_TYPE_STRUCT: ++ { ++ const int UNITS_PER_WORD = 8; ++ int words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; ++ ffi_type **ptr; ++ int i; ++ enum x86_64_reg_class subclasses[MAX_CLASSES]; ++ ++ /* If the struct is larger than 16 bytes, pass it on the stack. */ ++ if (type->size > 16) ++ return 0; ++ ++ for (i = 0; i < words; i++) ++ classes[i] = X86_64_NO_CLASS; ++ ++ /* Merge the fields of structure. */ ++ for (ptr=type->elements; (*ptr)!=NULL; ptr++) ++ { ++ int num; ++ ++ num = classify_argument (*ptr, subclasses, byte_offset); ++ if (num == 0) ++ return 0; ++ for (i = 0; i < num; i++) ++ { ++ int pos = *byte_offset / 8; ++ classes[i + pos] = ++ merge_classes (subclasses[i], classes[i + pos]); ++ } ++ ++ if ((*ptr)->type != FFI_TYPE_STRUCT) ++ *byte_offset += (*ptr)->size; ++ } ++ ++ /* Final merger cleanup. */ ++ for (i = 0; i < words; i++) ++ { ++ /* If one class is MEMORY, everything should be passed in ++ memory. */ ++ if (classes[i] == X86_64_MEMORY_CLASS) ++ return 0; ++ ++ /* The X86_64_SSEUP_CLASS should be always preceded by ++ X86_64_SSE_CLASS. */ ++ if (classes[i] == X86_64_SSEUP_CLASS ++ && (i == 0 || classes[i - 1] != X86_64_SSE_CLASS)) ++ classes[i] = X86_64_SSE_CLASS; ++ ++ /* X86_64_X87UP_CLASS should be preceded by X86_64_X87_CLASS. */ ++ if (classes[i] == X86_64_X87UP_CLASS ++ && (i == 0 || classes[i - 1] != X86_64_X87_CLASS)) ++ classes[i] = X86_64_SSE_CLASS; ++ } ++ return words; ++ } ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ return 0; /* Never reached. */ ++} ++ ++/* Examine the argument and return set number of register required in each ++ class. Return 0 iff parameter should be passed in memory. */ ++static int ++examine_argument (ffi_type *type, int in_return, int *int_nregs,int *sse_nregs) ++{ ++ enum x86_64_reg_class class[MAX_CLASSES]; ++ int offset = 0; ++ int n; ++ ++ n = classify_argument (type, class, &offset); ++ ++ if (n == 0) ++ return 0; ++ ++ *int_nregs = 0; ++ *sse_nregs = 0; ++ for (n--; n>=0; n--) ++ switch (class[n]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ (*int_nregs)++; ++ break; ++ case X86_64_SSE_CLASS: ++ case X86_64_SSESF_CLASS: ++ case X86_64_SSEDF_CLASS: ++ (*sse_nregs)++; ++ break; ++ case X86_64_NO_CLASS: ++ case X86_64_SSEUP_CLASS: ++ break; ++ case X86_64_X87_CLASS: ++ case X86_64_X87UP_CLASS: ++ if (!in_return) ++ return 0; ++ break; ++ default: ++ abort (); ++ } ++ return 1; ++} ++ ++/* Functions to load floats and double to an SSE register placeholder. */ ++extern void float2sse (float, __int128_t *); ++extern void double2sse (double, __int128_t *); ++extern void floatfloat2sse (void *, __int128_t *); ++ ++/* Functions to put the floats and doubles back. */ ++extern float sse2float (__int128_t *); ++extern double sse2double (__int128_t *); ++extern void sse2floatfloat(__int128_t *, void *); ++ ++/*@-exportheader@*/ ++void ++ffi_prep_args (stackLayout *stack, extended_cif *ecif) ++/*@=exportheader@*/ ++{ ++ int gprcount, ssecount, i, g, s; ++ void **p_argv; ++ void *argp = &stack->argspace; ++ ffi_type **p_arg; ++ ++ /* First check if the return value should be passed in memory. If so, ++ pass the pointer as the first argument. */ ++ gprcount = ssecount = 0; ++ if (ecif->cif->rtype->type != FFI_TYPE_VOID ++ && examine_argument (ecif->cif->rtype, 1, &g, &s) == 0) ++ (void *)stack->gpr[gprcount++] = ecif->rvalue; ++ ++ for (i=ecif->cif->nargs, p_arg=ecif->cif->arg_types, p_argv = ecif->avalue; ++ i!=0; i--, p_arg++, p_argv++) ++ { ++ int in_register = 0; ++ ++ switch ((*p_arg)->type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_POINTER: ++ if (gprcount < MAX_GPR_REGS) ++ { ++ stack->gpr[gprcount] = 0; ++ stack->gpr[gprcount++] = *(long long *)(*p_argv); ++ in_register = 1; ++ } ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ if (ssecount < MAX_SSE_REGS) ++ { ++ float2sse (*(float *)(*p_argv), &stack->sse[ssecount++]); ++ in_register = 1; ++ } ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ if (ssecount < MAX_SSE_REGS) ++ { ++ double2sse (*(double *)(*p_argv), &stack->sse[ssecount++]); ++ in_register = 1; ++ } ++ break; ++ } ++ ++ if (in_register) ++ continue; ++ ++ /* Either all places in registers where filled, or this is a ++ type that potentially goes into a memory slot. */ ++ if (examine_argument (*p_arg, 0, &g, &s) == 0 ++ || gprcount + g > MAX_GPR_REGS || ssecount + s > MAX_SSE_REGS) ++ { ++ /* Pass this argument in memory. */ ++ argp = (void *)ALIGN(argp, (*p_arg)->alignment); ++ memcpy (argp, *p_argv, (*p_arg)->size); ++ argp += (*p_arg)->size; ++ } ++ else ++ { ++ /* All easy cases are eliminated. Now fire the big guns. */ ++ ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int offset = 0, j, num; ++ void *a; ++ ++ num = classify_argument (*p_arg, classes, &offset); ++ for (j=0, a=*p_argv; j<num; j++, a+=8) ++ { ++ switch (classes[j]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ stack->gpr[gprcount++] = *(long long *)a; ++ break; ++ case X86_64_SSE_CLASS: ++ floatfloat2sse (a, &stack->sse[ssecount++]); ++ break; ++ case X86_64_SSESF_CLASS: ++ float2sse (*(float *)a, &stack->sse[ssecount++]); ++ break; ++ case X86_64_SSEDF_CLASS: ++ double2sse (*(double *)a, &stack->sse[ssecount++]); ++ break; ++ default: ++ abort(); ++ } ++ } ++ } ++ } ++} ++ ++/* Perform machine dependent cif processing. */ ++ffi_status ++ffi_prep_cif_machdep (ffi_cif *cif) ++{ ++ int gprcount, ssecount, i, g, s; ++ ++ gprcount = ssecount = 0; ++ ++ /* Reset the byte count. We handle this size estimation here. */ ++ cif->bytes = 0; ++ ++ /* If the return value should be passed in memory, pass the pointer ++ as the first argument. The actual memory isn't allocated here. */ ++ if (cif->rtype->type != FFI_TYPE_VOID ++ && examine_argument (cif->rtype, 1, &g, &s) == 0) ++ gprcount = 1; ++ ++ /* Go over all arguments and determine the way they should be passed. ++ If it's in a register and there is space for it, let that be so. If ++ not, add it's size to the stack byte count. */ ++ for (i=0; i<cif->nargs; i++) ++ { ++ if (examine_argument (cif->arg_types[i], 0, &g, &s) == 0 ++ || gprcount + g > MAX_GPR_REGS || ssecount + s > MAX_SSE_REGS) ++ { ++ /* This is passed in memory. First align to the basic type. */ ++ cif->bytes = ALIGN(cif->bytes, cif->arg_types[i]->alignment); ++ ++ /* Stack arguments are *always* at least 8 byte aligned. */ ++ cif->bytes = ALIGN(cif->bytes, 8); ++ ++ /* Now add the size of this argument. */ ++ cif->bytes += cif->arg_types[i]->size; ++ } ++ else ++ { ++ gprcount += g; ++ ssecount += s; ++ } ++ } ++ ++ /* Set the flag for the closures return. */ ++ switch (cif->rtype->type) ++ { ++ case FFI_TYPE_VOID: ++ case FFI_TYPE_STRUCT: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_FLOAT: ++ case FFI_TYPE_DOUBLE: ++ case FFI_TYPE_LONGDOUBLE: ++ cif->flags = (unsigned) cif->rtype->type; ++ break; ++ ++ case FFI_TYPE_UINT64: ++ cif->flags = FFI_TYPE_SINT64; ++ break; ++ ++ default: ++ cif->flags = FFI_TYPE_INT; ++ break; ++ } ++ ++ return FFI_OK; ++} ++ ++typedef struct ++{ ++ long gpr[2]; ++ __int128_t sse[2]; ++ long double st0; ++} return_value; ++ ++void ++ffi_fill_return_value (return_value *rv, extended_cif *ecif) ++{ ++ enum x86_64_reg_class classes[MAX_CLASSES]; ++ int i = 0, num; ++ long *gpr = rv->gpr; ++ __int128_t *sse = rv->sse; ++ signed char sc; ++ signed short ss; ++ ++ /* This is needed because of the way x86-64 handles signed short ++ integers. */ ++ switch (ecif->cif->rtype->type) ++ { ++ case FFI_TYPE_SINT8: ++ sc = *(signed char *)gpr; ++ *(long long *)ecif->rvalue = (long long)sc; ++ return; ++ case FFI_TYPE_SINT16: ++ ss = *(signed short *)gpr; ++ *(long long *)ecif->rvalue = (long long)ss; ++ return; ++ default: ++ /* Just continue. */ ++ ; ++ } ++ ++ num = classify_argument (ecif->cif->rtype, classes, &i); ++ ++ if (num == 0) ++ /* Return in memory. */ ++ ecif->rvalue = (void *) rv->gpr[0]; ++ else if (num == 2 && classes[0] == X86_64_X87_CLASS && ++ classes[1] == X86_64_X87UP_CLASS) ++ /* This is a long double (this is easiest to handle this way instead ++ of an eightbyte at a time as in the loop below. */ ++ *((long double *)ecif->rvalue) = rv->st0; ++ else ++ { ++ void *a; ++ ++ for (i=0, a=ecif->rvalue; i<num; i++, a+=8) ++ { ++ switch (classes[i]) ++ { ++ case X86_64_INTEGER_CLASS: ++ case X86_64_INTEGERSI_CLASS: ++ *(long long *)a = *gpr; ++ gpr++; ++ break; ++ case X86_64_SSE_CLASS: ++ sse2floatfloat (sse++, a); ++ break; ++ case X86_64_SSESF_CLASS: ++ *(float *)a = sse2float (sse++); ++ break; ++ case X86_64_SSEDF_CLASS: ++ *(double *)a = sse2double (sse++); ++ break; ++ default: ++ abort(); ++ } ++ } ++ } ++} ++ ++/*@-declundef@*/ ++/*@-exportheader@*/ ++extern void ffi_call_UNIX64(void (*)(stackLayout *, extended_cif *), ++ void (*) (return_value *, extended_cif *), ++ /*@out@*/ extended_cif *, ++ unsigned, /*@out@*/ unsigned *, void (*fn)()); ++/*@=declundef@*/ ++/*@=exportheader@*/ ++ ++void ffi_call(/*@dependent@*/ ffi_cif *cif, ++ void (*fn)(), ++ /*@out@*/ void *rvalue, ++ /*@dependent@*/ void **avalue) ++{ ++ extended_cif ecif; ++ int dummy; ++ ++ ecif.cif = cif; ++ ecif.avalue = avalue; ++ ++ /* If the return value is a struct and we don't have a return */ ++ /* value address then we need to make one */ ++ ++ if ((rvalue == NULL) && ++ (examine_argument (cif->rtype, 1, &dummy, &dummy) == 0)) ++ { ++ /*@-sysunrecog@*/ ++ ecif.rvalue = alloca(cif->rtype->size); ++ /*@=sysunrecog@*/ ++ } ++ else ++ ecif.rvalue = rvalue; ++ ++ /* Stack must always be 16byte aligned. Make it so. */ ++ cif->bytes = ALIGN(cif->bytes, 16); ++ ++ switch (cif->abi) ++ { ++ case FFI_SYSV: ++ /* Calling 32bit code from 64bit is not possible */ ++ FFI_ASSERT(0); ++ break; ++ ++ case FFI_UNIX64: ++ /*@-usedef@*/ ++ ffi_call_UNIX64 (ffi_prep_args, ffi_fill_return_value, &ecif, ++ cif->bytes, ecif.rvalue, fn); ++ /*@=usedef@*/ ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ break; ++ } ++} ++ ++extern void ffi_closure_UNIX64(void); ++ ++ffi_status ++ffi_prep_closure (ffi_closure* closure, ++ ffi_cif* cif, ++ void (*fun)(ffi_cif*, void*, void**, void*), ++ void *user_data) ++{ ++ volatile unsigned short *tramp; ++ ++ /* FFI_ASSERT (cif->abi == FFI_OSF); */ ++ ++ tramp = (volatile unsigned short *) &closure->tramp[0]; ++ tramp[0] = 0xbb49; /* mov <code>, %r11 */ ++ tramp[5] = 0xba49; /* mov <data>, %r10 */ ++ tramp[10] = 0xff49; /* jmp *%r11 */ ++ tramp[11] = 0x00e3; ++ *(void * volatile *) &tramp[1] = ffi_closure_UNIX64; ++ *(void * volatile *) &tramp[6] = closure; ++ ++ closure->cif = cif; ++ closure->fun = fun; ++ closure->user_data = user_data; ++ ++ return FFI_OK; ++} ++ ++int ++ffi_closure_UNIX64_inner(ffi_closure *closure, va_list l, void *rp) ++{ ++ ffi_cif *cif; ++ void **avalue; ++ ffi_type **arg_types; ++ long i, avn, argn; ++ ++ cif = closure->cif; ++ avalue = alloca(cif->nargs * sizeof(void *)); ++ ++ argn = 0; ++ ++ i = 0; ++ avn = cif->nargs; ++ arg_types = cif->arg_types; ++ ++ /* Grab the addresses of the arguments from the stack frame. */ ++ while (i < avn) ++ { ++ switch (arg_types[i]->type) ++ { ++ case FFI_TYPE_SINT8: ++ case FFI_TYPE_UINT8: ++ case FFI_TYPE_SINT16: ++ case FFI_TYPE_UINT16: ++ case FFI_TYPE_SINT32: ++ case FFI_TYPE_UINT32: ++ case FFI_TYPE_SINT64: ++ case FFI_TYPE_UINT64: ++ case FFI_TYPE_POINTER: ++ { ++ if (l->gp_offset > 48-8) ++ { ++ avalue[i] = l->overflow_arg_area; ++ l->overflow_arg_area = (char *)l->overflow_arg_area + 8; ++ } ++ else ++ { ++ avalue[i] = (char *)l->reg_save_area + l->gp_offset; ++ l->gp_offset += 8; ++ } ++ } ++ break; ++ ++ case FFI_TYPE_STRUCT: ++ /* FIXME */ ++ FFI_ASSERT(0); ++ break; ++ ++ case FFI_TYPE_DOUBLE: ++ { ++ if (l->fp_offset > 176-16) ++ { ++ avalue[i] = l->overflow_arg_area; ++ l->overflow_arg_area = (char *)l->overflow_arg_area + 8; ++ } ++ else ++ { ++ avalue[i] = (char *)l->reg_save_area + l->fp_offset; ++ l->fp_offset += 16; ++ } ++ } ++#if DEBUG_FFI ++ fprintf (stderr, "double arg %d = %g\n", i, *(double *)avalue[i]); ++#endif ++ break; ++ ++ case FFI_TYPE_FLOAT: ++ { ++ if (l->fp_offset > 176-16) ++ { ++ avalue[i] = l->overflow_arg_area; ++ l->overflow_arg_area = (char *)l->overflow_arg_area + 8; ++ } ++ else ++ { ++ avalue[i] = (char *)l->reg_save_area + l->fp_offset; ++ l->fp_offset += 16; ++ } ++ } ++#if DEBUG_FFI ++ fprintf (stderr, "float arg %d = %g\n", i, *(float *)avalue[i]); ++#endif ++ break; ++ ++ default: ++ FFI_ASSERT(0); ++ } ++ ++ argn += ALIGN(arg_types[i]->size, SIZEOF_ARG) / SIZEOF_ARG; ++ i++; ++ } ++ ++ /* Invoke the closure. */ ++ (closure->fun) (cif, rp, avalue, closure->user_data); ++ ++ /* FIXME: Structs not supported. */ ++ FFI_ASSERT(cif->rtype->type != FFI_TYPE_STRUCT); ++ ++ /* Tell ffi_closure_UNIX64 how to perform return type promotions. */ ++ ++ return cif->rtype->type; ++} ++#endif /* ifndef __x86_64__ */ +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/sysv.S gcc/libffi/src/x86/sysv.S +--- gcc-3.2.2.orig/libffi/src/x86/sysv.S Tue Jul 17 02:10:53 2001 ++++ gcc/libffi/src/x86/sysv.S Fri Jul 19 08:08:31 2002 +@@ -1,5 +1,5 @@ + /* ----------------------------------------------------------------------- +- sysv.S - Copyright (c) 1996, 1998, 2001 Cygnus Solutions ++ sysv.S - Copyright (c) 1996, 1998, 2001, 2002 Cygnus Solutions + + X86 Foreign Function Interface + +@@ -23,6 +23,8 @@ + OTHER DEALINGS IN THE SOFTWARE. + ----------------------------------------------------------------------- */ + ++#ifndef __x86_64__ ++ + #define LIBFFI_ASM + #include <ffi.h> + +@@ -163,3 +165,5 @@ + .align 4 + .LEFDE1: + .set .LLFDE1,.LEFDE1-.LSFDE1 ++ ++#endif /* ifndef __x86_64__ */ +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/unix64.S gcc/libffi/src/x86/unix64.S +--- gcc-3.2.2.orig/libffi/src/x86/unix64.S Thu Jan 1 09:00:00 1970 ++++ gcc/libffi/src/x86/unix64.S Wed Jan 29 00:54:28 2003 +@@ -0,0 +1,302 @@ ++/* ----------------------------------------------------------------------- ++ unix64.S - Copyright (c) 2002 Bo Thorsen <bo@suse.de> ++ ++ x86-64 Foreign Function Interface ++ ++ Permission is hereby granted, free of charge, to any person obtaining ++ a copy of this software and associated documentation files (the ++ ``Software''), to deal in the Software without restriction, including ++ without limitation the rights to use, copy, modify, merge, publish, ++ distribute, sublicense, and/or sell copies of the Software, and to ++ permit persons to whom the Software is furnished to do so, subject to ++ the following conditions: ++ ++ The above copyright notice and this permission notice shall be included ++ in all copies or substantial portions of the Software. ++ ++ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND, EXPRESS ++ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ++ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ++ IN NO EVENT SHALL CYGNUS SOLUTIONS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ OTHER DEALINGS IN THE SOFTWARE. ++ ----------------------------------------------------------------------- */ ++ ++#ifdef __x86_64__ ++#define LIBFFI_ASM ++#include <ffi.h> ++ ++ .section .rodata ++.LC0: ++ .string "asm in progress %lld\n" ++.LC1: ++ .string "asm in progress\n" ++.text ++ .align 2 ++.globl ffi_call_UNIX64 ++ .type ffi_call_UNIX64,@function ++ ++ffi_call_UNIX64: ++.LFB1: ++ pushq %rbp ++.LCFI0: ++ movq %rsp, %rbp ++.LCFI1: ++ /* Save all arguments */ ++ subq $48, %rsp ++.LCFI2: ++ movq %rdi, -8(%rbp) /* ffi_prep_args */ ++ movq %rsi, -16(%rbp) /* ffi_fill_return_value */ ++ movq %rdx, -24(%rbp) /* ecif */ ++ movq %rcx, -32(%rbp) /* cif->bytes */ ++ movq %r8, -40(%rbp) /* ecif.rvalue */ ++ movq %r9, -48(%rbp) /* fn */ ++ ++ /* Make room for all of the new args and the register args */ ++ addl $176, %ecx ++.LCFI3: ++ subq %rcx, %rsp ++.LCFI4: ++ /* Setup the call to ffi_prep_args. */ ++ movq %rdi, %rax /* &ffi_prep_args */ ++ movq %rsp, %rdi /* stackLayout */ ++ movq %rdx, %rsi /* ecif */ ++ call *%rax /* ffi_prep_args(stackLayout, ecif);*/ ++ ++ /* ffi_prep_args have put all the register contents into the */ ++ /* stackLayout struct. Now put the register values in place. */ ++ movq (%rsp), %rdi ++ movq 8(%rsp), %rsi ++ movq 16(%rsp), %rdx ++ movq 24(%rsp), %rcx ++ movq 32(%rsp), %r8 ++ movq 40(%rsp), %r9 ++ movaps 48(%rsp), %xmm0 ++ movaps 64(%rsp), %xmm1 ++ movaps 80(%rsp), %xmm2 ++ movaps 96(%rsp), %xmm3 ++ movaps 112(%rsp), %xmm4 ++ movaps 128(%rsp), %xmm5 ++ movaps 144(%rsp), %xmm6 ++ movaps 160(%rsp), %xmm7 ++ ++ /* Remove space for stackLayout so stack arguments are placed ++ correctly for the call. */ ++.LCFI5: ++ addq $176, %rsp ++.LCFI6: ++ /* Call the user function. */ ++ call *-48(%rbp) ++ ++ /* Make stack space for the return_value struct. */ ++ subq $64, %rsp ++ ++ /* Fill in all potential return values to this struct. */ ++ movq %rax, (%rsp) ++ movq %rdx, 8(%rsp) ++ movaps %xmm0, 16(%rsp) ++ movaps %xmm1, 32(%rsp) ++ fstpt 48(%rsp) ++ ++ /* Now call ffi_fill_return_value. */ ++ movq %rsp, %rdi /* struct return_value */ ++ movq -24(%rbp), %rsi /* ecif */ ++ movq -16(%rbp), %rax /* &ffi_fill_return_value */ ++ call *%rax /* call it */ ++ ++ /* And the work is done. */ ++ leave ++ ret ++.LFE1: ++.ffi_call_UNIX64_end: ++ .size ffi_call_UNIX64,.ffi_call_UNIX64_end-ffi_call_UNIX64 ++ ++.text ++ .align 2 ++.globl float2sse ++ .type float2sse,@function ++float2sse: ++ /* Save the contents of this sse-float in a pointer. */ ++ movaps %xmm0, (%rdi) ++ ret ++ ++ .align 2 ++.globl floatfloat2sse ++ .type floatfloat2sse,@function ++floatfloat2sse: ++ /* Save the contents of these two sse-floats in a pointer. */ ++ movq (%rdi), %xmm0 ++ movaps %xmm0, (%rsi) ++ ret ++ ++ .align 2 ++.globl double2sse ++ .type double2sse,@function ++double2sse: ++ /* Save the contents of this sse-double in a pointer. */ ++ movaps %xmm0, (%rdi) ++ ret ++ ++ .align 2 ++.globl sse2float ++ .type sse2float,@function ++sse2float: ++ /* Save the contents of this sse-float in a pointer. */ ++ movaps (%rdi), %xmm0 ++ ret ++ ++ .align 2 ++.globl sse2double ++ .type sse2double,@function ++sse2double: ++ /* Save the contents of this pointer in a sse-double. */ ++ movaps (%rdi), %xmm0 ++ ret ++ ++ .align 2 ++.globl sse2floatfloat ++ .type sse2floatfloat,@function ++sse2floatfloat: ++ /* Save the contents of this pointer in two sse-floats. */ ++ movaps (%rdi), %xmm0 ++ movq %xmm0, (%rsi) ++ ret ++ ++ .align 2 ++.globl ffi_closure_UNIX64 ++ .type ffi_closure_UNIX64,@function ++ ++ffi_closure_UNIX64: ++.LFB2: ++ pushq %rbp ++.LCFI10: ++ movq %rsp, %rbp ++.LCFI11: ++ subq $240, %rsp ++.LCFI12: ++ movq %rdi, -176(%rbp) ++ movq %rsi, -168(%rbp) ++ movq %rdx, -160(%rbp) ++ movq %rcx, -152(%rbp) ++ movq %r8, -144(%rbp) ++ movq %r9, -136(%rbp) ++ /* FIXME: We can avoid all this stashing of XMM registers by ++ (in ffi_prep_closure) computing the number of ++ floating-point args and moving it into %rax before calling ++ this function. Once this is done, uncomment the next few ++ lines and only the essential XMM registers will be written ++ to memory. This is a significant saving. */ ++/* movzbl %al, %eax */ ++/* movq %rax, %rdx */ ++/* leaq 0(,%rdx,4), %rax */ ++/* leaq 2f(%rip), %rdx */ ++/* subq %rax, %rdx */ ++ leaq -1(%rbp), %rax ++/* jmp *%rdx */ ++ movaps %xmm7, -15(%rax) ++ movaps %xmm6, -31(%rax) ++ movaps %xmm5, -47(%rax) ++ movaps %xmm4, -63(%rax) ++ movaps %xmm3, -79(%rax) ++ movaps %xmm2, -95(%rax) ++ movaps %xmm1, -111(%rax) ++ movaps %xmm0, -127(%rax) ++2: ++ movl %edi, -180(%rbp) ++ movl $0, -224(%rbp) ++ movl $48, -220(%rbp) ++ leaq 16(%rbp), %rax ++ movq %rax, -216(%rbp) ++ leaq -176(%rbp), %rdx ++ movq %rdx, -208(%rbp) ++ leaq -224(%rbp), %rsi ++ movq %r10, %rdi ++ movq %rsp, %rdx ++ call ffi_closure_UNIX64_inner@PLT ++ ++ cmpl $FFI_TYPE_FLOAT, %eax ++ je 1f ++ cmpl $FFI_TYPE_DOUBLE, %eax ++ je 2f ++ cmpl $FFI_TYPE_LONGDOUBLE, %eax ++ je 3f ++ cmpl $FFI_TYPE_STRUCT, %eax ++ je 4f ++ popq %rax ++ leave ++ ret ++1: ++2: ++3: ++ movaps -240(%rbp), %xmm0 ++ leave ++ ret ++4: ++ leave ++ ret ++.LFE2: ++ ++ .section .eh_frame,"a",@progbits ++.Lframe0: ++ .long .LECIE1-.LSCIE1 ++.LSCIE1: ++ .long 0x0 ++ .byte 0x1 ++ .string "zR" ++ .uleb128 0x1 ++ .sleb128 -8 ++ .byte 0x10 ++ .uleb128 0x1 ++ .byte 0x1b ++ .byte 0xc ++ .uleb128 0x7 ++ .uleb128 0x8 ++ .byte 0x90 ++ .uleb128 0x1 ++ .align 8 ++.LECIE1: ++.LSFDE1: ++ .long .LEFDE1-.LASFDE1 ++.LASFDE1: ++ .long .LASFDE1-.Lframe0 ++ ++ .long .LFB1-. ++ .long .LFE1-.LFB1 ++ .uleb128 0x0 ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .long .LCFI0-.LFB1 ++ .byte 0xe # DW_CFA_def_cfa_offset ++ .uleb128 0x10 ++ .byte 0x86 # DW_CFA_offset: r6 at cfa-16 ++ .uleb128 0x2 ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .long .LCFI1-.LCFI0 ++ .byte 0x86 # DW_CFA_offset: r6 at cfa-16 ++ .uleb128 0x2 ++ .byte 0xd # DW_CFA_def_cfa_reg: r6 ++ .uleb128 0x6 ++ .align 8 ++.LEFDE1: ++.LSFDE3: ++ .long .LEFDE3-.LASFDE3 # FDE Length ++.LASFDE3: ++ .long .LASFDE3-.Lframe0 # FDE CIE offset ++ ++ .long .LFB2-. # FDE initial location ++ .long .LFE2-.LFB2 # FDE address range ++ .uleb128 0x0 # Augmentation size ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .long .LCFI10-.LFB2 ++ .byte 0xe # DW_CFA_def_cfa_offset ++ .uleb128 0x10 ++ .byte 0x86 # DW_CFA_offset, column 0x6 ++ .uleb128 0x2 ++ .byte 0x4 # DW_CFA_advance_loc4 ++ .long .LCFI11-.LCFI10 ++ .byte 0xd # DW_CFA_def_cfa_register ++ .uleb128 0x6 ++ .align 8 ++.LEFDE3: ++ ++#endif /* __x86_64__ */ +diff -ruN --exclude=CVS gcc-3.2.2.orig/libffi/src/x86/win32.S gcc/libffi/src/x86/win32.S +--- gcc-3.2.2.orig/libffi/src/x86/win32.S Tue Mar 27 11:39:16 2001 ++++ gcc/libffi/src/x86/win32.S Fri Dec 6 10:16:45 2002 +@@ -1,5 +1,8 @@ + /* ----------------------------------------------------------------------- +- win32.S - Copyright (c) 1996, 1998, 2001 Cygnus Solutions ++ win32.S - Copyright (c) 1996, 1998, 2001, 2002 Red Hat, Inc. ++ Copyright (c) 2001 John Beniton ++ Copyright (c) 2002 Ranjit Mathew ++ + + X86 Foreign Function Interface + +@@ -52,7 +55,10 @@ + # Return stack to previous state and call the function + addl $8,%esp + +- call *28(%ebp) ++ # FIXME: Align the stack to a 128-bit boundary to avoid ++ # potential performance hits. ++ ++ call *28(%ebp) + + # Remove the space we pushed for the args + movl 16(%ebp),%ecx +@@ -123,3 +129,98 @@ + ret + + .ffi_call_SYSV_end: ++ ++ # This assumes we are using gas. ++ .balign 16 ++.globl _ffi_call_STDCALL ++ ++_ffi_call_STDCALL: ++ pushl %ebp ++ movl %esp,%ebp ++ ++ # Make room for all of the new args. ++ movl 16(%ebp),%ecx ++ subl %ecx,%esp ++ ++ movl %esp,%eax ++ ++ # Place all of the ffi_prep_args in position ++ pushl 12(%ebp) ++ pushl %eax ++ call *8(%ebp) ++ ++ # Return stack to previous state and call the function ++ addl $8,%esp ++ ++ # FIXME: Align the stack to a 128-bit boundary to avoid ++ # potential performance hits. ++ ++ call *28(%ebp) ++ ++ # stdcall functions pop arguments off the stack themselves ++ ++ # Load %ecx with the return type code ++ movl 20(%ebp),%ecx ++ ++ # If the return value pointer is NULL, assume no return value. ++ cmpl $0,24(%ebp) ++ jne sc_retint ++ ++ # Even if there is no space for the return value, we are ++ # obliged to handle floating-point values. ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne sc_noretval ++ fstp %st(0) ++ ++ jmp sc_epilogue ++ ++sc_retint: ++ cmpl $FFI_TYPE_INT,%ecx ++ jne sc_retfloat ++ # Load %ecx with the pointer to storage for the return value ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ jmp sc_epilogue ++ ++sc_retfloat: ++ cmpl $FFI_TYPE_FLOAT,%ecx ++ jne sc_retdouble ++ # Load %ecx with the pointer to storage for the return value ++ movl 24(%ebp),%ecx ++ fstps (%ecx) ++ jmp sc_epilogue ++ ++sc_retdouble: ++ cmpl $FFI_TYPE_DOUBLE,%ecx ++ jne sc_retlongdouble ++ # Load %ecx with the pointer to storage for the return value ++ movl 24(%ebp),%ecx ++ fstpl (%ecx) ++ jmp sc_epilogue ++ ++sc_retlongdouble: ++ cmpl $FFI_TYPE_LONGDOUBLE,%ecx ++ jne sc_retint64 ++ # Load %ecx with the pointer to storage for the return value ++ movl 24(%ebp),%ecx ++ fstpt (%ecx) ++ jmp sc_epilogue ++ ++sc_retint64: ++ cmpl $FFI_TYPE_SINT64,%ecx ++ jne sc_retstruct ++ # Load %ecx with the pointer to storage for the return value ++ movl 24(%ebp),%ecx ++ movl %eax,0(%ecx) ++ movl %edx,4(%ecx) ++ ++sc_retstruct: ++ # Nothing to do! ++ ++sc_noretval: ++sc_epilogue: ++ movl %ebp,%esp ++ popl %ebp ++ ret ++ ++.ffi_call_STDCALL_end: +--- gcc-3.2.2.orig/libjava/configure.host Mon Jun 10 13:15:26 2002 ++++ gcc-3.2.2/libjava/configure.host Sat Feb 15 19:57:25 2003 +@@ -115,6 +115,12 @@ + enable_getenv_properties_default=no + enable_main_args_default=no + ;; ++ sh-* | sh[34]*-*) ++ sysdeps_dir=sh ++ libgcj_flags="${libgcj_flags} -mieee" ++ libgcj_interpreter=yes ++ enable_hash_synchronization_default=yes ++ ;; + esac + + # This case statement supports generic port properties and may refine +@@ -126,7 +132,8 @@ + powerpc*-linux* | \ + alpha*-linux* | \ + sparc*-linux* | \ +- ia64-*) ++ ia64-* | \ ++ sh-linux* | sh[34]*-linux*) + can_unwind_signal=yes + ;; + *-*-darwin*) diff --git a/patches/gcc/3.2.3/gcc-3.2.3-ppc-asm-spec.patch b/patches/gcc/3.2.3/gcc-3.2.3-ppc-asm-spec.patch new file mode 100644 index 00000000..e0ccd9f1 --- /dev/null +++ b/patches/gcc/3.2.3/gcc-3.2.3-ppc-asm-spec.patch @@ -0,0 +1,54 @@ +Based on gcc-3.4.0/gcc-3.3.3h-ppc-asm-spec.patch + +Fixes the following errors when building gcc for ppc7450: + +/tmp/ccYph3gd.s: Assembler messages: +/tmp/ccYph3gd.s:3823: Error: Unrecognized opcode: `mfvrsave' +/tmp/ccYph3gd.s:3857: Error: Unrecognized opcode: `stvx' +/tmp/ccYph3gd.s:4026: Error: Unrecognized opcode: `lvx' +/tmp/ccYph3gd.s:4027: Error: Unrecognized opcode: `mtvrsave' +make[2]: *** [libgcc/./unwind-dw2.o] Error 1 +make[2]: Leaving directory `/opt/crosstool-0.28-rc35/build/powerpc-7450-linux-gnu/gcc-3.2.3-glibc-2.3.2/build-gcc-core/gcc' +make[1]: *** [stmp-multilib] Error 2 +make[1]: Leaving directory `/opt/crosstool-0.28-rc35/build/powerpc-7450-linux-gnu/gcc-3.2.3-glibc-2.3.2/build-gcc-core/gcc' +make: *** [all-gcc] Error 2 + +Note that the "-mcpu=7450" option must appear on the "gcc" command line in +order for "-maltivec" to be passed to the assembler. Or, "-maltivec" itself +may be passed to the "gcc" command. + +Contributed by Tom Warzeka <waz@quahog.npt.nuwc.navy.mil> + +=================================================================== +--- gcc-3.2.3/gcc/config/rs6000/rs6000.h~ 2003-03-29 07:39:20.000000000 -0500 ++++ gcc-3.2.3/gcc/config/rs6000/rs6000.h 2004-08-23 16:33:21.000000000 -0400 +@@ -77,8 +77,8 @@ + %{mcpu=604e: -D_ARCH_PPC} \ + %{mcpu=620: -D_ARCH_PPC} \ + %{mcpu=740: -D_ARCH_PPC} \ +-%{mcpu=7400: -D_ARCH_PPC} \ +-%{mcpu=7450: -D_ARCH_PPC} \ ++%{mcpu=7400: -D_ARCH_PPC -D__ALTIVEC__} \ ++%{mcpu=7450: -D_ARCH_PPC -D__ALTIVEC__} \ + %{mcpu=750: -D_ARCH_PPC} \ + %{mcpu=801: -D_ARCH_PPC} \ + %{mcpu=821: -D_ARCH_PPC} \ +@@ -117,14 +117,15 @@ + %{mcpu=604e: -mppc} \ + %{mcpu=620: -mppc} \ + %{mcpu=740: -mppc} \ +-%{mcpu=7400: -mppc} \ +-%{mcpu=7450: -mppc} \ ++%{mcpu=7400: -mppc -maltivec} \ ++%{mcpu=7450: -mppc -maltivec} \ + %{mcpu=750: -mppc} \ + %{mcpu=801: -mppc} \ + %{mcpu=821: -mppc} \ + %{mcpu=823: -mppc} \ + %{mcpu=860: -mppc} \ +-%{maltivec: -maltivec}" ++%{maltivec: -maltivec} \ ++-many" + + #define CPP_DEFAULT_SPEC "" + diff --git a/patches/gcc/3.2.3/gcc-3.2.3-trap-posix.patch b/patches/gcc/3.2.3/gcc-3.2.3-trap-posix.patch new file mode 100644 index 00000000..4751e9da --- /dev/null +++ b/patches/gcc/3.2.3/gcc-3.2.3-trap-posix.patch @@ -0,0 +1,45 @@ +# +# Submitted-By: Marc Kleine-Budde <mkl@pengutronix.de>, 2005-04-20 +# +# Error: +# +# creating libintl.h +# Configuring etc... +# loading cache ../config.cache +# checking for a BSD compatible install... (cached) /usr/bin/install -c +# creating ./config.status +# creating Makefile +# trap: usage: trap [-lp] [[arg] signal_spec ...] +# +# Description: +# +# non-posix conform usage of trap causes bash >= 3.0 to fail +# +# e.g.: http://sourceware.org/ml/crossgcc/2004-12/msg00132.html +# +# Status: +# +# fixed in gcc >= 3.3.5 +# backport of gcc-3.3.5 fix +# +diff -ruN gcc-3.2.3-orig/configure gcc-3.2.3/configure +--- gcc-3.2.3-orig/configure 2002-06-24 18:14:28.000000000 +0200 ++++ gcc-3.2.3/configure 2005-04-20 18:42:49.000000000 +0200 +@@ -697,7 +697,7 @@ + if test -f skip-this-dir; then + # Perform the same cleanup as the trap handler, minus the "exit 1" of course, + # and reset the trap handler. +- trap 0 ++ trap '' 0 + rm -rf Makefile* ${tmpdir} + # Execute the final clean-up actions + ${config_shell} skip-this-dir +@@ -1615,7 +1615,7 @@ + # Perform the same cleanup as the trap handler, minus the "exit 1" of course, + # and reset the trap handler. + rm -rf ${tmpdir} +-trap 0 ++trap '' 0 + + exit 0 + diff --git a/patches/gcc/3.2.3/gcc-3.3-libstdc++-v3-dg.exp.patch b/patches/gcc/3.2.3/gcc-3.3-libstdc++-v3-dg.exp.patch new file mode 100644 index 00000000..aafc1306 --- /dev/null +++ b/patches/gcc/3.2.3/gcc-3.3-libstdc++-v3-dg.exp.patch @@ -0,0 +1,54 @@ +Without this patch, the command + +RUNTESTFLAGS=--target=powerpc-750-linux-gnu -v -v -v -v make check-target-libstdc++-v3 + +fails in two ways: +1. the -L option meant to locate the testsuite directory is incorrect, and +2. the wrong compiler is invoked, causing all sorts of havoc, not least of which +is the native compiler is invoked when we really wanted to invoke the cross-compiler +we just built. + +Here's an example log of the problem in action. Every testcase fails, this shows just one: +------------- +Invoking the compiler as g++ -ggdb3 -DDEBUG_ASSERT -I/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite /home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc -g -O2 -DDEBUG_ASSERT -L/testsuite -lv3test -lm -o ./binders.exe +compiler exited with status 1 +output is: +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h: In method `void binder2nd<mem_fun1_ref_t<void,Elem,int> >::operator ()(const Elem &) const':^M +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_algo.h:83: instantiated from `for_each<Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> > >(Elem *, Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> >)'^M +/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc:43: instantiated from here^M +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:224: conversion from `const Elem' to `Elem &' discards qualifiers^M +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:622: in passing argument 1 of `mem_fun1_ref_t<void,Elem,int>::operator ()(Elem &, int) const'^M +... +FAIL: 20_util/binders.cc (test for excess errors) +WARNING: 20_util/binders.cc compilation failed to produce executable +------------- + +And here's the patch. I'm not happy with it, and it probably gets some cases wrong, +but it seems to work for the common native case and for my cross-compiler case. + +--- gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp.old Sun Jul 13 10:42:01 2003 ++++ gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp Sun Jul 13 11:39:54 2003 +@@ -46,8 +46,23 @@ + global gluefile wrap_flags + global ld_library_path + global tool_root_dir ++ global target_triplet + + set blddir [lookfor_file [get_multilibs] libstdc++-v3] ++ if { $blddir == "" } { ++ set multilibs [get_multilibs] ++ # FIXME: assume multilib only one level deep ++ set multisub [file tail $multilibs] ++ verbose "libstdc++-v3-init: couldn't find libstdc++-v3 in $multilibs, trying $objdir" ++ set blddir [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"] ++ } ++ if { $blddir == "" } { ++ verbose "libstdc++-v3-init: couldn't find libstdc++-v3, trying $objdir without multilibs" ++ set blddir [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"] ++ } ++ if { $blddir == "" } { ++ error "Can't find libstdc++-v3" ++ } + + # By default, we assume we want to run program images. + global dg-do-what-default diff --git a/patches/gcc/3.2.3/gcc-sh-linux.spec b/patches/gcc/3.2.3/gcc-sh-linux.spec new file mode 100644 index 00000000..d647bb27 --- /dev/null +++ b/patches/gcc/3.2.3/gcc-sh-linux.spec @@ -0,0 +1,739 @@ +Summary: The GNU Compiler Collection for SuperH. +%define GCC_VERSION 3.2.3 +%define arch_list sh3-linux sh3eb-linux sh4-linux sh4eb-linux +%define TARGET_LIBSTDC 1 +%define TARGET_JAVA 1 + +Name: gcc +Version: 3.2.3 +Release: 3 + +Copyright: GPL +Group: Development/Languages +Source0: gcc-%{GCC_VERSION}.tar.bz2 +Patch1: gcc-20030210-sh-linux-1.patch +Patch2: gcc-3.2.3-libffi-1.patch +Patch3: gcc-3.2.3-sh-linux-dwarf2-1.patch +Buildroot: /var/tmp/gcc-%{_target}-root +ExclusiveArch: i386 sh3 sh3eb sh4 sh4eb + +%description +This package contains the GNU Compiler Collection: gcc and g++. +You'll need this package in order to compile C/C++ code. + +%ifarch i386 + +# ==================== Cross Compiler =============================== + +%package sh-linux +Summary: The GNU Compiler Collection for sh-linux. +Group: Development/Languages +Requires: binutils-sh-linux >= 2.13.2 +Provides: gcc-sh-linux +Obsoletes: gcc-sh3-linux gcc-sh3eb-linux gcc-sh4-linux gcc-sh4eb-linux +Obsoletes: gcc-sh3-linux-c++ gcc-sh3eb-linux-c++ gcc-sh4-linux-c++ gcc-sh4eb-linux-c++ +Obsoletes: libstdc++-sh3-linux libstdc++-sh3eb-linux libstdc++-sh4-linux libstdc++-sh4eb-linux +AutoReqProv: no + +%description sh-linux +The gcc-sh-linux package contains GNU Compiler Collection: gcc g++ and libstdc++-v3. + +It includes support for most of the current C++ specification, including templates and +exception handling. It does also include the standard C++ library and C++ header files. +You'll need this package in order to cross compile C/C++ code for sh-linux. + +%package -n libgcj-sh-linux +Summary: Header files and libraries for sh-linux Java development. +Group: Development/Libraries +Requires: gcc-sh-linux = %{version}-%{release} +AutoReqProv: no + +%description -n libgcj-sh-linux +The Java static libraries and C header files. You will need this +package to compile your Java programs for sh-linux using the gcc Java compiler (gcj). + +%else +# =========================== Native Compiler ================================= +%package libgcc +Summary: runtime libraries for the GNU Compiler Collection. +Group: System Environment/Libraries + +%description libgcc +This package contains libgcc shared libraries for the GNU C Compiler Collection. +You'll need this package in order to execute C,C++,JAVA code +that uses shared libgcc. + +%package c++ +Summary: C++ support for gcc +Group: Development/Languages +Requires: gcc = %{version}-%{release} + +%description c++ +This package adds C++ support to the GNU Compiler Collection. It includes +support for most of the current C++ specification, including templates and +exception handling. It does include the static standard C++ +library and C++ header files; the library for dynamically linking +programs is available separately. + +%package -n libstdc++ +Summary: GNU c++ library. +Group: System Environment/Libraries + +%description -n libstdc++ +The libstdc++ package contains a snapshot of the GCC Standard C++ +Library v3, an ongoing project to implement the ISO 14882 Standard C++ +library. + +%package -n libstdc++-devel +Summary: Header files and libraries for C++ development +Group: Development/Libraries +Requires: libstdc++ = %{version}-%{release}, gcc-c++ = %{version}-%{release} + +%description -n libstdc++-devel +This is the GNU implementation of the standard C++ libraries. This +package includes the header files and libraries needed for C++ +development. This includes SGI's implementation of the STL. + +%package java +Summary: Java support for gcc +Group: Development/Languages +Requires: gcc = %{version}-%{release}, libgcj = %{version}-%{release}, libgcj-devel = %{version}-%{release} + +%description java +This package adds experimental support for compiling Java(tm) programs and +bytecode into native code. To use this you will also need the libgcj and +libgcj-devel packages. + +%package -n libgcj +Summary: Java runtime library for gcc. +Group: System Environment/Libraries + +%description -n libgcj +The Java runtime library. You will need this package to run your Java +programs compiled using the gcc Java compiler (gcj). + +%package -n libgcj-devel +Summary: Header files and libraries for Java development. +Group: Development/Libraries +Requires: libgcj = %{version}-%{release} + +%description -n libgcj-devel +The Java static libraries and C header files. You will need this +package to compile your Java programs using the gcc Java compiler (gcj). + +%endif + +%prep +%setup -q -n gcc-%{GCC_VERSION} +%patch1 -p1 +%patch2 -p1 +##%patch3 -p1 + +%build +%ifarch i386 +# build cross compiler for i386-linux host +for arch in sh-linux; do + rm -rf ${arch} + mkdir ${arch} + + CONFIG_ARGS="\ + --prefix=%{_prefix} \ + --mandir=%{_mandir} \ + --infodir=%{_infodir} \ + --target=${arch} \ + --host=%{_host} \ + --build=%{_build} \ + --enable-languages=c,c++,java \ + --with-system-zlib \ + --with-gxx-include-dir=%{_prefix}/${arch}/include/g++-v3 \ + --includedir=%{_prefix}/${arch}/include \ + --disable-checking \ + --disable-shared \ + --enable-__cxa_atexit \ + --enable-c99 \ + --enable-threads=posix \ + --enable-long-long" + if [ %{TARGET_JAVA} -ne 0 ]; then + CONFIG_ARGS="$CONFIG_ARGS --enable-libgcj" + fi + ( cd $arch + ../configure ${CONFIG_ARGS} + ) + if [ %{TARGET_LIBSTDC} -ne 0 -o %{TARGET_JAVA} -ne 0 ]; then + sed -e s:-Dinhibit_libc::g ${arch}/gcc/Makefile >${arch}/gcc/Makefile.$$$ + mv -f ${arch}/gcc/Makefile.$$$ ${arch}/gcc/Makefile + fi + make all-gcc -C ${arch} + + if [ %{TARGET_LIBSTDC} -ne 0 ]; then + CONFIG_ARGS="`echo $CONFIG_ARGS | sed -e s/--disable-shared/--enable-shared/`" + make TARGET_CONFIGARGS="${CONFIG_ARGS} --with-cross-host" all-target-libstdc++-v3 -C ${arch} + fi + + if [ %{TARGET_JAVA} -ne 0 ]; then + make all-fastjar -C ${arch} + CONFIG_ARGS="`echo $CONFIG_ARGS | sed -e s/--host=%{_host}/--host=${arch}/`" + dir=`pwd` + + ac_cv_file__proc_self_exe=yes \ + ac_cv_prog_GCJ="$dir/$arch/gcc/gcj -B$dir/$arch/$arch/libjava/ -B$dir/$arch/gcc/ -B%{_prefix}/$arch/bin/ -B%{_prefix}/$arch/lib/ -isystem %{_prefix}/$arch/include" \ + make TARGET_CONFIGARGS="${CONFIG_ARGS} --with-cross-host --enable-multilib --with-target-subdir=${arch} --with-x=no" \ + all-target-libjava -C ${arch} + fi + +%else +# Canadian cross (build native compiler) +for arch in %{_target}; do + rm -rf ${arch} + mkdir -p ${arch} + CONFIG_ARGS="\ + --prefix=%{_prefix} \ + --mandir=%{_mandir} \ + --infodir=%{_infodir} \ + --target=${arch} \ + --host=${arch} \ + --build=%{_build} \ + --enable-languages=c,c++,java \ + --with-system-zlib \ + --with-gxx-include-dir=%{_prefix}/include/g++-v3 \ + --disable-checking \ + --disable-shared \ + --enable-__cxa_atexit \ + --enable-c99 \ + --enable-threads=posix \ + --enable-long-long" + + if [ %{TARGET_JAVA} -ne 0 ]; then + CONFIG_ARGS="$CONFIG_ARGS --enable-libgcj" + fi + + ( cd ${arch} + CC=${arch}-gcc AR=${arch}-ar RANLIB=${arch}-ranlib CXX=${arch}-g++ \ + ../configure $CONFIG_ARGS + ) + + if [ %{TARGET_LIBSTDC} -ne 0 -o %{TARGET_JAVA} -ne 0 ]; then + sed -e s:-Dinhibit_libc::g ${arch}/gcc/Makefile >${arch}/gcc/Makefile.$$$ + mv -f ${arch}/gcc/Makefile.$$$ ${arch}/gcc/Makefile + fi + + make all-build-libiberty all-gcc -C ${arch} + + if [ %{TARGET_LIBSTDC} -ne 0 ]; then + CONFIG_ARGS="`echo $CONFIG_ARGS | sed -e s/--disable-shared/--enable-shared/`" + make TARGET_CONFIGARGS="${CONFIG_ARGS}" all-target-libstdc++-v3 -C ${arch} + if [ %{TARGET_JAVA} -ne 0 ]; then + ( mkdir -p ${arch}/fastjar; cd ${arch}/fastjar; rm *; ../../fastjar/configure --with-system-zlib; make ) + ac_cv_file__proc_self_exe=yes \ + CC=${arch}-gcc AR=${arch}-ar RANLIB=${arch}-ranlib CXX=${arch}-g++ GCJ=${arch}-gcj \ + make TARGET_CONFIGARGS="${CONFIG_ARGS} --with-x=no" configure-target-libjava -C ${arch} + + make -C ${arch}/${arch}/libffi + make -C ${arch}/${arch}/boehm-gc + make -C ${arch}/${arch}/zlib + make GCJ=${arch}-gcj GCJH=${arch}-gcjh ZIP=${arch}-jar -C ${arch}/${arch}/libjava + ( + rm -rf ${arch}/${arch}/fastjar + mkdir -p ${arch}/${arch}/fastjar + cd ${arch}/${arch}/fastjar + + ac_cv_sizeof_char=1 \ + ac_cv_sizeof_short=2 \ + ac_cv_sizeof_int=4 \ + ac_cv_sizeof_long=4 \ + ac_cv_sizeof_long_long=8 \ + ac_cv_sizeof_float=4 \ + ac_cv_sizeof_double=8 \ + ac_cv_sizeof_long_double=8 \ + ac_cv_sizeof_void_p=4 \ + ac_cv_file__proc_self_exe=yes \ + ac_cv_header_langinfo_h=yes \ + CC=${arch}-gcc ../../../fastjar/configure $CONFIG_ARGS + + make + ) + + fi + fi +%endif +done + +%install +rm -rf $RPM_BUILD_ROOT +mkdir -p ${RPM_BUILD_ROOT}/{%{_prefix}/bin,lib} + +%ifarch i386 + ARCH_STRTIP=strip + EXESUFFIX="" + arch=sh-linux + TOOLPREFIX=${arch}- + mkdir -p ${RPM_BUILD_ROOT}%{_prefix}/${arch}/{bin,include,lib,share} + mkdir -p ${RPM_BUILD_ROOT}%{_prefix}/${arch}/lib/{m4,mb/m4} + make DESTDIR=${RPM_BUILD_ROOT} \ + install-gcc \ + install-fastjar \ + -C ${arch} +%if 0 + ( cd ${RPM_BUILD_ROOT}%{_prefix}/sh-linux/lib + rm -f libgcc_s_*.so + mv libgcc_s_mb.so.1 mb/libgcc_s.so.1 + mv libgcc_s_m4.so.1 m4/libgcc_s.so.1 + mv libgcc_s_mb_m4.so.1 mb/m4/libgcc_s.so.1 + ln -s libgcc_s.so.1 mb/libgcc_s.so + ln -s libgcc_s.so.1 m4/libgcc_s.so + ln -s libgcc_s.so.1 mb/m4/libgcc_s.so + ) +%endif + + if [ %{TARGET_LIBSTDC} -ne 0 ]; then + make DESTDIR=${RPM_BUILD_ROOT} \ + install-target-libstdc++-v3 \ + -C ${arch} + fi + if [ %{TARGET_JAVA} -ne 0 ]; then + make DESTDIR=${RPM_BUILD_ROOT} \ + install-target-libjava \ + install-target-boehm-gc \ + install-target-zlib \ + -C ${arch} + make DESTDIR=${RPM_BUILD_ROOT} prefix=%{_prefix}/${arch} \ + install -C ${arch}/${arch}/libffi + mv -f $RPM_BUILD_ROOT%{_prefix}/share/java $RPM_BUILD_ROOT%{_prefix}/sh-linux/share/ + fi + rm -f $RPM_BUILD_ROOT%{_prefix}/bin/{gcov,gccbug} + rm -f $RPM_BUILD_ROOT%{_prefix}/${arch}/bin/{gij,jv-convert} + sed -e 's/@@VERSION@@/%{GCC_VERSION}/g' debian/shCPU-linux-GCC >$RPM_BUILD_ROOT%{_prefix}/bin/shCPU-linux-GCC + chmod 0755 $RPM_BUILD_ROOT%{_prefix}/bin/shCPU-linux-GCC + + LIBSTDC=`cd $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib; echo libstdc++.so*` + LIBGCJ=`cd $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib; echo libgcj.so*` + LIBFFI=`cd $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib; echo libffi*.so*` + # literally (binary-ly) same + PROGS="cpp c++ g++ g77 gcc gcj" + DRIVERS="cc1 cc1obj cc1plus collect2 cpp0 f771 jc1 tradcpp0 jvgenmain" + OBJS="crtbegin.o crtbeginS.o crtend.o crtendS.o crtbeginT.o" + LIBS="libgcc.a libgcc_eh.a libobjc.a" + LIBS_1="$LIBSTDC \ + $LIBGCJ libgcj.spec \ + $LIBFFI " + LIBS_2="libstdc++.a libstdc++.la \ + libsupc++.a libsupc++.la \ + libgcj.a libgcj.la \ + libffi.a libffi.la" + INCLUDE="include" + + for CPU in sh3 sh3eb sh4 sh4eb; do + mkdir -p ${RPM_BUILD_ROOT}%{_prefix}/lib/gcc-lib/${CPU}-linux/%{GCC_VERSION} + mkdir -p ${RPM_BUILD_ROOT}%{_prefix}/${CPU}-linux/{lib,share/java} + # Make symbolic links for include dir. + ln -s ../sh-linux/include $RPM_BUILD_ROOT%{_prefix}/${CPU}-linux/include + + # Make symbolic links for libgcj.jar + ln -s ../../sh-linux/share/java/libgcj-%{GCC_VERSION}.jar $RPM_BUILD_ROOT%{_prefix}/${CPU}-linux/share/java/libgcj-%{GCC_VERSION}.jar + + # Make symbolic links for executables. + for p in ${PROGS}; do + ln -s shCPU-linux-GCC $RPM_BUILD_ROOT%{_prefix}/bin/${CPU}-linux-$p + done + ln -s sh-linux-gcjh $RPM_BUILD_ROOT%{_prefix}/bin/${CPU}-linux-gcjh + + case "${CPU}" in + sh3) + MULTILIBDIR= + MULTIPARENTDIR= + AS_ENDIAN_FLAG="-little" + CPP_ENDIAN_DEF="-D__LITTLE_ENDIAN__" + CPP_CPU_DEFS='-D__SH3__ -D__sh3__' + CC1_CPU_ENDIAN_FLAGS="-ml -m3" + CC1PLUS_CPU_ENDIAN_FLAGS="-ml -m3" + LINKER_CPU_ENDIAN_FLAGS="-m shlelf_linux -EL --architecture sh3" + LINKER_RPATH_LINK_FLAG="-rpath-link %{_prefix}/sh3-linux/lib" + ;; + sh3eb) + MULTILIBDIR=/mb + MULTIPARENTDIR=../ + AS_ENDIAN_FLAG="-big" + CPP_ENDIAN_DEF="-D__BIG_ENDIAN__" + CPP_CPU_DEFS='-D__SH3__ -D__sh3__' + CC1_CPU_ENDIAN_FLAGS="-mb -m3" + CC1PLUS_CPU_ENDIAN_FLAGS="-mb -m3" + LINKER_CPU_ENDIAN_FLAGS="-m shelf_linux -EB --architecture sh3" + LINKER_RPATH_LINK_FLAG="-rpath-link %{_prefix}/sh3eb-linux/lib" + ;; + sh4) + MULTILIBDIR=/m4 + MULTIPARENTDIR=../ + AS_ENDIAN_FLAG="-little" + CPP_ENDIAN_DEF="-D__LITTLE_ENDIAN__" + CPP_CPU_DEFS="-D__SH4__" + CC1_CPU_ENDIAN_FLAGS="-ml -m4" + CC1PLUS_CPU_ENDIAN_FLAGS="-ml -m4" + LINKER_CPU_ENDIAN_FLAGS="-m shlelf_linux -EL --architecture sh4" + LINKER_RPATH_LINK_FLAG="-rpath-link %{_prefix}/sh4-linux/lib" + ;; + sh4eb) + MULTILIBDIR=/mb/m4 + MULTIPARENTDIR=../../ + AS_ENDIAN_FLAG="-big" + CPP_ENDIAN_DEF="-D__BIG_ENDIAN__" + CPP_CPU_DEFS="-D__SH4__" + CC1_CPU_ENDIAN_FLAGS="-mb -m4" + CC1PLUS_CPU_ENDIAN_FLAGS="-mb -m4" + LINKER_CPU_ENDIAN_FLAGS="-m shelf_linux -EB --architecture sh4" + LINKER_RPATH_LINK_FLAG="-rpath-link %{_prefix}/sh4eb-linux/lib" + ;; + esac + + # Make symbolic links for GCC drivers, objects, libraries, and include dir. + for f in ${DRIVERS} ${INCLUDE}; do + if [ -a $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/$f ]; then + ln -s ../../sh-linux/%{GCC_VERSION}/$f $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/${CPU}-linux/%{GCC_VERSION}/$f + fi + done + for f in ${OBJS} ${LIBS}; do + if [ -a $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}${MULTILIBDIR}/$f ]; then + ln -s ../../sh-linux/%{GCC_VERSION}${MULTILIBDIR}/$f $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/${CPU}-linux/%{GCC_VERSION}/$f + fi + done + + for f in ${LIBS_1} ${LIBS_2}; do + if [ -e $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib${MULTILIBDIR}/$f ]; then + mv -f $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib${MULTILIBDIR}/$f $RPM_BUILD_ROOT%{_prefix}/${CPU}-linux/lib + ln -s ${MULTIPARENTDIR}../../${CPU}-linux/lib/$f $RPM_BUILD_ROOT%{_prefix}/sh-linux/lib${MULTILIBDIR}/$f + fi + done + + sed -e "s+@AS_ENDIAN_FLAG@+${AS_ENDIAN_FLAG}+" \ + -e "s+@CPP_ENDIAN_DEF@+${CPP_ENDIAN_DEF}+" \ + -e "s+@CPP_CPU_DEFS@+${CPP_CPU_DEFS}+" \ + -e "s+@CC1_CPU_ENDIAN_FLAGS@+${CC1_CPU_ENDIAN_FLAGS}+" \ + -e "s+@CC1PLUS_CPU_ENDIAN_FLAGS@+${CC1PLUS_CPU_ENDIAN_FLAGS}+" \ + -e "s+@LINKER_CPU_ENDIAN_FLAGS@+${LINKER_CPU_ENDIAN_FLAGS}+" \ + -e "s+@LINKER_RPATH_LINK_FLAG@+${LINKER_RPATH_LINK_FLAG}+" \ + debian/edit-specs.in >${arch}/edit-specs-${CPU}.sed + + sed -f ${arch}/edit-specs-${CPU}.sed \ + $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/specs \ + > $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/${CPU}-linux/%{GCC_VERSION}/specs + + done + +%else + ARCH_STRTIP=%{_target}-strip + EXESUFFIX="" + TOOLPREFIX="" + ln -s ..%{_prefix}/bin/cpp ${RPM_BUILD_ROOT}/lib/cpp + ln -s gcc ${RPM_BUILD_ROOT}%{_prefix}/bin/cc + arch=%{_target} + make DESTDIR=${RPM_BUILD_ROOT} \ + install -C ${arch} + if [ %{TARGET_JAVA} -ne 0 ]; then + make DESTDIR=${RPM_BUILD_ROOT} install -C ${arch}/${arch}/libffi + make DESTDIR=${RPM_BUILD_ROOT} install -C ${arch}/${arch}/fastjar + mv -f ${RPM_BUILD_ROOT}/%{_prefix}/%{_lib}/libgcj.spec \ + ${RPM_BUILD_ROOT}/%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/ + fi + $ARCH_STRTIP $RPM_BUILD_ROOT%{_prefix}/bin/gcov$EXESUFFIX || : + +cat >${arch}/edit-specs <<EOF +/^*cross_compile:$/ { +n +c\\ +0 +} +EOF + sed -f ${arch}/edit-specs -e 's#-rpath-link.*/usr/%{_target}/lib##' \ + ${RPM_BUILD_ROOT}%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/specs \ + >${RPM_BUILD_ROOT}%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/specs.$$ + mv -f ${RPM_BUILD_ROOT}%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/specs.$$ \ + ${RPM_BUILD_ROOT}%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/specs + + sed -e "s/dependency_libs=.*/dependency_libs='-lm -lgcc -lc -lgcc'/" \ + ${RPM_BUILD_ROOT}%{_prefix}/lib/libstdc++.la \ + >${RPM_BUILD_ROOT}%{_prefix}/lib/libstdc++.la.$$ + mv -f ${RPM_BUILD_ROOT}%{_prefix}/lib/libstdc++.la.$$ \ + ${RPM_BUILD_ROOT}%{_prefix}/lib/libstdc++.la + + sed -e "s/dependency_libs=.*/dependency_libs='-lpthread -ldl -lz -lm -lgcc -lc -lgcc'/" \ + ${RPM_BUILD_ROOT}%{_prefix}/lib/libgcj.la \ + >${RPM_BUILD_ROOT}%{_prefix}/lib/libgcj.la.$$ + mv -f ${RPM_BUILD_ROOT}%{_prefix}/lib/libgcj.la.$$ \ + ${RPM_BUILD_ROOT}%{_prefix}/lib/libgcj.la + +cat >$RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/syslimits.h <<EOF +#define _GCC_NEXT_LIMITS_H /* tell gcc's limits.h to recurse */ +#include_next <limits.h> +#undef _GCC_NEXT_LIMITS_H +EOF + +%endif + + $ARCH_STRTIP $RPM_BUILD_ROOT%{_prefix}/bin/${TOOLPREFIX}{gcc,cpp,c++,c++filt,gcj,gcjh,gij,jar,grepjar,jcf-dump,jv-convert,jv-scan}$EXESUFFIX || : + FULLPATH=$(dirname $RPM_BUILD_ROOT%{_prefix}/lib/gcc-lib/${arch}/%{GCC_VERSION}/cc1${EXESUFFIX}) + $ARCH_STRTIP $FULLPATH/{cc1${EXESUFFIX},cc1plus${EXESUFFIX},cpp0${EXESUFFIX},tradcpp0${EXESUFFIX},collect2${EXESUFFIX},jc1${EXESUFFIX},jvgenmain${EXESUFFIX}} || : + + # Strip static libraries + sh-linux-strip -S -R .comment `find $RPM_BUILD_ROOT -type f -name "*.a"` || : + + # Strip ELF shared objects + for f in `find $RPM_BUILD_ROOT -type f \( -perm -0100 -or -perm -0010 -or -perm -0001 \) `; do + if file $f | grep -q "shared object.*not stripped"; then + sh-linux-strip --strip-unneeded -R .comment $f + fi + done + +%clean +rm -rf $RPM_BUILD_ROOT + +# ==================== Cross Compiler =============================== +%ifarch i386 + +%files sh-linux +%defattr(-,root,root) +%{_prefix}/bin/sh* +%dir %{_prefix}/lib/gcc-lib/sh-linux +%dir %{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION} +%dir %{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include +%dir %{_prefix}/lib/gcc-lib/sh3-linux +%dir %{_prefix}/lib/gcc-lib/sh3-linux/%{GCC_VERSION} +%dir %{_prefix}/lib/gcc-lib/sh3eb-linux +%dir %{_prefix}/lib/gcc-lib/sh3eb-linux/%{GCC_VERSION} +%dir %{_prefix}/lib/gcc-lib/sh4-linux +%dir %{_prefix}/lib/gcc-lib/sh4-linux/%{GCC_VERSION} +%dir %{_prefix}/lib/gcc-lib/sh4eb-linux +%dir %{_prefix}/lib/gcc-lib/sh4eb-linux/%{GCC_VERSION} +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/cc1 +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/cc1plus +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/collect2 +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/cpp0 +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/*.o +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/libgcc*.a +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/specs +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/tradcpp0 +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/jc1 +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/jvgenmain +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/m4 +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/mb +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/stddef.h +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/stdarg.h +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/varargs.h +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/float.h +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/limits.h +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/stdbool.h +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/iso646.h +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/syslimits.h +%{_prefix}/lib/gcc-lib/sh-linux/%{GCC_VERSION}/include/README +%{_prefix}/lib/gcc-lib/sh3-linux/%{GCC_VERSION}/* +%{_prefix}/lib/gcc-lib/sh3eb-linux/%{GCC_VERSION}/* +%{_prefix}/lib/gcc-lib/sh4-linux/%{GCC_VERSION}/* +%{_prefix}/lib/gcc-lib/sh4eb-linux/%{GCC_VERSION}/* +%{_mandir}/man1/sh-linux-* +%dir %{_prefix}/sh-linux/include +%{_prefix}/sh3-linux/include +%{_prefix}/sh3eb-linux/include +%{_prefix}/sh4-linux/include +%{_prefix}/sh4eb-linux/include +%endif + +%if %{TARGET_LIBSTDC} +%ifarch i386 +%{_prefix}/sh-linux/include/g++-v3 +%{_prefix}/sh-linux/lib/libs* +%{_prefix}/sh-linux/lib/m4/libs* +%{_prefix}/sh-linux/lib/mb/libs* +%{_prefix}/sh-linux/lib/mb/m4/libs* +%{_prefix}/sh3-linux/lib/libs* +%{_prefix}/sh4-linux/lib/libs* +%{_prefix}/sh3eb-linux/lib/libs* +%{_prefix}/sh4eb-linux/lib/libs* +%endif +%endif + +%if %{TARGET_JAVA} +%ifarch i386 +%files -n libgcj-sh-linux +%defattr(-,root,root) +%{_prefix}/sh-linux/include/*.h +%{_prefix}/sh-linux/include/gcj +%{_prefix}/sh-linux/include/gnu/* +%{_prefix}/sh-linux/include/java +%{_prefix}/sh-linux/lib/lib*gcj* +%{_prefix}/sh-linux/lib/m4/lib*gcj* +%{_prefix}/sh-linux/lib/mb/lib*gcj* +%{_prefix}/sh-linux/lib/mb/m4/lib*gcj* +%{_prefix}/sh-linux/lib/libffi* +%{_prefix}/sh-linux/lib/m4/libffi* +%{_prefix}/sh-linux/lib/mb/libffi* +%{_prefix}/sh-linux/lib/mb/m4/libffi* +%{_prefix}/sh-linux/share/java/libgcj-%{GCC_VERSION}.jar +%{_prefix}/sh3-linux/lib/lib*gcj* +%{_prefix}/sh3-linux/lib/libffi* +%{_prefix}/sh3-linux/share/java/libgcj-%{GCC_VERSION}.jar +%{_prefix}/sh4-linux/lib/lib*gcj* +%{_prefix}/sh4-linux/lib/libffi* +%{_prefix}/sh4-linux/share/java/libgcj-%{GCC_VERSION}.jar +%{_prefix}/sh3eb-linux/lib/lib*gcj* +%{_prefix}/sh3eb-linux/lib/libffi* +%{_prefix}/sh3eb-linux/share/java/libgcj-%{GCC_VERSION}.jar +%{_prefix}/sh4eb-linux/lib/lib*gcj* +%{_prefix}/sh4eb-linux/lib/libffi* +%{_prefix}/sh4eb-linux/share/java/libgcj-%{GCC_VERSION}.jar +%endif +%endif + +%ifarch sh3 sh3eb sh4 sh4eb +# =========================== Native Compiler ================================= +%files +%defattr(-,root,root) +%dir %{_prefix}/lib/gcc-lib/%{_target} +%dir %{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION} +%dir %{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/cc1 +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/collect2 +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/cpp0 +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/crt*.o +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/libgcc*.a +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/specs +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/tradcpp0 +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/stddef.h +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/stdarg.h +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/varargs.h +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/float.h +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/limits.h +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/stdbool.h +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/iso646.h +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/syslimits.h +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/include/README +%{_prefix}/bin/gcc +%{_prefix}/bin/%{_target}-gcc +%{_prefix}/bin/cpp +%{_prefix}/bin/gccbug +%{_prefix}/bin/gcov +%{_prefix}/bin/cc +/lib/cpp +%{_infodir}/cpp* +%{_infodir}/gcc* + +%if 0 +%files libgcc +%defattr(-,root,root) +/lib/libgcc_s.so* +%endif + +%files c++ +%defattr(-,root,root) +%{_prefix}/bin/c++ +%{_prefix}/bin/g++ +%{_prefix}/bin/c++filt +%{_prefix}/bin/%{_target}-c++ +%{_prefix}/bin/%{_target}-g++ +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/cc1plus +%endif + +%if %{TARGET_LIBSTDC} +%ifarch sh3 sh3eb sh4 sh4eb +%files -n libstdc++ +%defattr(-,root,root) +%{_prefix}/lib/libstdc++.so* + +%files -n libstdc++-devel +%defattr(-,root,root) +%{_prefix}/include/g++-v3 +%{_prefix}/lib/libstdc++.*a +%endif +%endif + +%if %{TARGET_JAVA} +%ifarch sh3 sh3eb sh4 sh4eb +%files java +%defattr(-,root,root) +%{_prefix}/bin/addr2name.awk +%{_prefix}/bin/gcj +%{_prefix}/bin/gcjh +%{_prefix}/bin/gij +%{_prefix}/bin/jar +%{_prefix}/bin/grepjar +%{_prefix}/bin/jcf-dump +%{_prefix}/bin/jv-convert +%{_prefix}/bin/jv-scan +%dir %{_prefix}/lib/gcc-lib +%dir %{_prefix}/lib/gcc-lib/%{_target} +%dir %{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION} +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/jc1 +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/jvgenmain +%{_infodir}/gcj* + +%files -n libgcj +%defattr(-,root,root) +%{_prefix}/%{_lib}/libgcj.so* +%{_prefix}/%{_lib}/libffi*.so* +%{_prefix}/lib/gcc-lib/%{_target}/%{GCC_VERSION}/libgcj.spec +%{_prefix}/share/java/libgcj-%{GCC_VERSION}.jar + +%files -n libgcj-devel +%defattr(-,root,root) +%{_prefix}/include/*.h +%{_prefix}/include/gcj +%{_prefix}/include/gnu/* +%{_prefix}/include/java +%{_prefix}/lib/libgcj.*a +%{_prefix}/lib/libffi.*a +%endif +%endif + +%changelog +* Wed Feb 19 2003 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- version 3.2.2. + +* Tue Feb 19 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- version 3.0.4. + +* Tue Feb 12 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- add java support. + +* Thu Feb 7 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- follow debian/SH update. + +* Tue Feb 5 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- follow debian/SH update. + +* Thu Jan 24 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- rebuild with new binutils. + +* Tue Jan 22 2002 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- leaf function optimization fixed. + +* Thu Dec 06 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- add gcc-ice-rml patch. + +* Tue Nov 13 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- add configure option. + +* Thu Nov 01 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- tablejump fix by gniibe. + +* Mon Oct 22 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- updated gcc patch. + +* Wed Oct 17 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- updated gcc patch. + +* Tue Oct 02 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- gcc/config/sh/sh.c bug fix. + +* Fri Aug 24 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- gcc version 3.0.1. + +* Thu Jun 28 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- gcc version 3.0. +- Add libstdc++ package. + +* Mon Apr 23 2001 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- Add cygwin host. + +* Sat Dec 23 2000 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- fix file attribute. +- add asmspecs patch. + +* Sat Nov 11 2000 SUGIOKA Toshinobu <sugioka@itonet.co.jp> +- initial version. diff --git a/patches/gcc/3.3.1/compat.exp.patch b/patches/gcc/3.3.1/compat.exp.patch new file mode 100644 index 00000000..763b8a18 --- /dev/null +++ b/patches/gcc/3.3.1/compat.exp.patch @@ -0,0 +1,37 @@ +Fixes the following problem when testing a cross-compiler: + +============================================ +Testing g++.dg/compat/abi/bitfield1, +... +Invoking the compiler as /crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/build-gcc/gcc/testsuite/../g++ ... +/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C +pid is 16028 -16028 +compiler exited with status 1 +output is: +sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/powerpc-750-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian +/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/build-gcc/gcc/testsuite/../g++: error while loading shared libraries: /opt/cegl-2.0/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/powerpc-750-linux-gnu/./lib/libc.so.6: ELF file data encoding not little-endian + +FAIL: g++.dg/compat/abi/bitfield1 main_tst.o compile +============================================ + +--- gcc-3.3/gcc/testsuite/g++.dg/compat/compat.exp.old Thu Oct 17 17:22:57 2002 ++++ gcc-3.3/gcc/testsuite/g++.dg/compat/compat.exp Mon Jul 14 10:59:19 2003 +@@ -42,11 +42,13 @@ + proc compat-fix-library-path { } { + global ld_library_path + +- # See comments in lib/g++.exp for why this is needed. +- setenv LD_LIBRARY_PATH $ld_library_path +- setenv SHLIB_PATH $ld_library_path +- setenv LD_LIBRARYN32_PATH $ld_library_path +- setenv LD_LIBRARY64_PATH $ld_library_path ++ if {![is_remote target]} { ++ # See comments in lib/g++.exp for why this is needed. ++ setenv LD_LIBRARY_PATH $ld_library_path ++ setenv SHLIB_PATH $ld_library_path ++ setenv LD_LIBRARYN32_PATH $ld_library_path ++ setenv LD_LIBRARY64_PATH $ld_library_path ++ } + } + + # diff --git a/patches/gcc/3.3.1/config.sub.patch b/patches/gcc/3.3.1/config.sub.patch new file mode 100644 index 00000000..928f9115 --- /dev/null +++ b/patches/gcc/3.3.1/config.sub.patch @@ -0,0 +1,72 @@ +When configuring a s390->s390 or cris->cris crosscompiler +(ok, I haven't hit this yet, but one of these days I'll get me an account +on an s390, and then I'll need this patch :-), you'll get the +following error: + ++ /build/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/gcc-3.3/configure +--target=s390-unknown-linux-gnu --host=s390-host_unknown-linux-gnu +--prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2 +--enable-languages=c +--with-local-prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/s390- +unknown-linux-gnu --enable-threads=no --without-headers --with-newlib +--disable-shared +... +*** --with-headers is only supported when cross compiling + +This error pops up only when you're using Daniel Jacobowitz's technique +of slightly changing the target and host tuples to make them different +enough to force gcc's build system to not try to pull in system libraries +or headers. This technique is needed e.g. to build an x86 -> x86 +cross-compiler. +(The LFS developers ran into the same bug that prompted me to use +this technique; they point people who run into it to +http://linuxfromscratch.org/~greg/pure_lfs.txt, which is a different +way of avoiding this problem. I think the tuple tweak is the way to go, though.) + +config-patches@gnu.org rejected this patch, on the grounds that there +is only one vendor of each of those two architectures, so the +canonicalization is by definition correct. When I pointed out the +difficulty this causes for people building s390 -> s390 or +cris -> cris compilers that are incompatible with the system +libraries and thus must be built like cross-compilers, he grumped and said +"autoconf should let you specify a cross-compiler in some other way than +comparing tuple strings". + + + +--- gcc-3.3/config.sub.old Sun Jun 8 20:38:47 2003 ++++ gcc-3.3/config.sub Sun Jun 8 20:40:34 2003 +@@ -433,9 +433,12 @@ + crds | unos) + basic_machine=m68k-crds + ;; +- cris | cris-* | etrax*) ++ cris | etrax*) + basic_machine=cris-axis + ;; ++ cris-*) ++ basic_machine=cris-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; +@@ -820,11 +823,17 @@ + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; +- s390 | s390-*) ++ s390) + basic_machine=s390-ibm + ;; +- s390x | s390x-*) ++ s390-*) ++ basic_machine=s390-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ s390x) + basic_machine=s390x-ibm ++ ;; ++ s390x-*) ++ basic_machine=s390x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sa29200) + basic_machine=a29k-amd diff --git a/patches/gcc/3.3.1/empty6.patch b/patches/gcc/3.3.1/empty6.patch new file mode 100644 index 00000000..1b0715ce --- /dev/null +++ b/patches/gcc/3.3.1/empty6.patch @@ -0,0 +1,21 @@ +From 3.4 branch. Fixes test failure +FAIL: g++.dg/abi/empty6.C (test for warnings, line 6) + +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/testsuite/g++.dg/abi/empty6.C,v +retrieving revision 1.1 +retrieving revision 1.2 +diff -u -r1.1 -r1.2 +--- gcc/gcc/testsuite/g++.dg/abi/empty6.C 2002/09/25 19:07:35 1.1 ++++ gcc/gcc/testsuite/g++.dg/abi/empty6.C 2003/06/03 19:10:09 1.2 +@@ -5,4 +5,9 @@ + struct B { + A a; // { dg-warning "empty" } + virtual void f () {} +-}; ++} __attribute__((aligned(8))); ++/* The preceding attribute is necessary on targets with ++ BIGGEST_ALIGNMENT <= 32 to trigger the warning, as otherwise a 32 bit ++ offset is split into DECL_FIELD_OFFSET 4 and DECL_FIELD_BIT_OFFSET 0, ++ and then there is no discrepancy between DECL_FIELD_OFFSET and ++ byte_position to warn about. */ diff --git a/patches/gcc/3.3.1/gcc-3.2.3-g++.exp.patch b/patches/gcc/3.3.1/gcc-3.2.3-g++.exp.patch new file mode 100644 index 00000000..fb8e4f08 --- /dev/null +++ b/patches/gcc/3.3.1/gcc-3.2.3-g++.exp.patch @@ -0,0 +1,100 @@ +See http://gcc.gnu.org/PR12010 + +g++ testsuite fixes for cross-compilers, Dan Kegel, Ixia Communications, 12 July 2003 + +The first hunk fixes the error + +/testsuite_flags: /testsuite_flags: No such file or directory + while executing +"exec sh ${odir_v3}/testsuite_flags --build-includes" + (procedure "g++_include_flags" line 21) + invoked from within +"g++_include_flags [get_multilibs] " + (procedure "g++_init" line 63) + invoked from within +"${tool}_init $test_file_name" + (procedure "runtest" line 19) + invoked from within +"runtest $test_name" + ("foreach" body line 42) + invoked from within +... +make[1]: [check-g++] Error 1 (ignored) + +The fix isn't especially pretty, but it worked for me, and can't hurt the +more common native compiler case. Maybe someone who knows the code better +can come up with a better fix. + +The second hunk fixes the error + +sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-405-linux-gnu/gcc-3.2.3-glibc-2.2.5/powerpc-405-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian + +when trying to compile g++ testcases (!); setting up +the shared library environment when running crosstests of g++ +should either be done by a special board file, or by +setting up a remote chroot environment (see http://kegel.com/crosstool), +not by blithely setting LD_LIBRARY_PATH on the local system. + +--- gcc-3.2.3/gcc/testsuite/lib/g++.exp.old Fri Jul 11 15:42:47 2003 ++++ gcc-3.2.3/gcc/testsuite/lib/g++.exp Sat Jul 12 12:57:07 2003 +@@ -72,6 +72,8 @@ + # + proc g++_include_flags { paths } { + global srcdir ++ global objdir ++ global target_triplet + global HAVE_LIBSTDCXX_V3 + global TESTING_IN_BUILD_TREE + +@@ -90,6 +92,20 @@ + + if { ${HAVE_LIBSTDCXX_V3} } { + set odir_v3 [lookfor_file ${gccpath} libstdc++-v3] ++ if { $odir_v3 == "" } { ++ verbose "g++_include_flags: couldn't find libstdc++-v3 on first try, now looking in build directory $objdir" ++ # first assume no multilibs ++ set odir_v3 [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"] ++ } ++ if { $odir_v3 == "" } { ++ verbose "g++_include_flags: couldn't find libstdc++-v3 on second try, trying multilib" ++ # assume multilib only one level deep ++ set multisub [file tail $gccpath] ++ set odir_v3 [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"] ++ } ++ if { $odir_v3 == "" } { ++ error "Can't find libstdc++-v3" ++ } + append flags [exec sh ${odir_v3}/testsuite_flags --build-includes] + } else { + set odir_v2 [lookfor_file ${gccpath} libstdc++] +@@ -192,16 +192,20 @@ + } + } + +- # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but +- # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH +- # (for the 64-bit ABI). The right way to do this would be to modify +- # unix.exp -- but that's not an option since it's part of DejaGNU +- # proper, so we do it here. We really only need to do +- # this on IRIX, but it shouldn't hurt to do it anywhere else. +- setenv LD_LIBRARY_PATH $ld_library_path +- setenv SHLIB_PATH $ld_library_path +- setenv LD_LIBRARYN32_PATH $ld_library_path +- setenv LD_LIBRARY64_PATH $ld_library_path ++ if {![is_remote target]} { ++ # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but ++ # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH ++ # (for the 64-bit ABI). The right way to do this would be to modify ++ # unix.exp -- but that's not an option since it's part of DejaGNU ++ # proper, so we do it here. We really only need to do ++ # this on IRIX, but it shouldn't hurt to do it anywhere else. ++ ++ # Doing this causes us to be unable to run cross-compilers. ++ setenv LD_LIBRARY_PATH $ld_library_path ++ setenv SHLIB_PATH $ld_library_path ++ setenv LD_LIBRARYN32_PATH $ld_library_path ++ setenv LD_LIBRARY64_PATH $ld_library_path ++ } + + return "$flags" + } diff --git a/patches/gcc/3.3.1/gcc-3.3-libstdc++-v3-dg.exp.patch b/patches/gcc/3.3.1/gcc-3.3-libstdc++-v3-dg.exp.patch new file mode 100644 index 00000000..aafc1306 --- /dev/null +++ b/patches/gcc/3.3.1/gcc-3.3-libstdc++-v3-dg.exp.patch @@ -0,0 +1,54 @@ +Without this patch, the command + +RUNTESTFLAGS=--target=powerpc-750-linux-gnu -v -v -v -v make check-target-libstdc++-v3 + +fails in two ways: +1. the -L option meant to locate the testsuite directory is incorrect, and +2. the wrong compiler is invoked, causing all sorts of havoc, not least of which +is the native compiler is invoked when we really wanted to invoke the cross-compiler +we just built. + +Here's an example log of the problem in action. Every testcase fails, this shows just one: +------------- +Invoking the compiler as g++ -ggdb3 -DDEBUG_ASSERT -I/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite /home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc -g -O2 -DDEBUG_ASSERT -L/testsuite -lv3test -lm -o ./binders.exe +compiler exited with status 1 +output is: +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h: In method `void binder2nd<mem_fun1_ref_t<void,Elem,int> >::operator ()(const Elem &) const':^M +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_algo.h:83: instantiated from `for_each<Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> > >(Elem *, Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> >)'^M +/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc:43: instantiated from here^M +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:224: conversion from `const Elem' to `Elem &' discards qualifiers^M +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:622: in passing argument 1 of `mem_fun1_ref_t<void,Elem,int>::operator ()(Elem &, int) const'^M +... +FAIL: 20_util/binders.cc (test for excess errors) +WARNING: 20_util/binders.cc compilation failed to produce executable +------------- + +And here's the patch. I'm not happy with it, and it probably gets some cases wrong, +but it seems to work for the common native case and for my cross-compiler case. + +--- gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp.old Sun Jul 13 10:42:01 2003 ++++ gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp Sun Jul 13 11:39:54 2003 +@@ -46,8 +46,23 @@ + global gluefile wrap_flags + global ld_library_path + global tool_root_dir ++ global target_triplet + + set blddir [lookfor_file [get_multilibs] libstdc++-v3] ++ if { $blddir == "" } { ++ set multilibs [get_multilibs] ++ # FIXME: assume multilib only one level deep ++ set multisub [file tail $multilibs] ++ verbose "libstdc++-v3-init: couldn't find libstdc++-v3 in $multilibs, trying $objdir" ++ set blddir [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"] ++ } ++ if { $blddir == "" } { ++ verbose "libstdc++-v3-init: couldn't find libstdc++-v3, trying $objdir without multilibs" ++ set blddir [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"] ++ } ++ if { $blddir == "" } { ++ error "Can't find libstdc++-v3" ++ } + + # By default, we assume we want to run program images. + global dg-do-what-default diff --git a/patches/gcc/3.3.1/gcc-3.3.1-trap-posix.patch b/patches/gcc/3.3.1/gcc-3.3.1-trap-posix.patch new file mode 100644 index 00000000..ce2baf37 --- /dev/null +++ b/patches/gcc/3.3.1/gcc-3.3.1-trap-posix.patch @@ -0,0 +1,44 @@ +# +# Submitted-By: Marc Kleine-Budde <mkl@pengutronix.de>, 2005-04-20 +# +# Error: +# +# creating libintl.h +# Configuring etc... +# loading cache ../config.cache +# checking for a BSD compatible install... (cached) /usr/bin/install -c +# creating ./config.status +# creating Makefile +# trap: usage: trap [-lp] [[arg] signal_spec ...] +# +# Description: +# +# non-posix conform usage of trap causes bash >= 3.0 to fail +# e.g.: http://sourceware.org/ml/crossgcc/2004-12/msg00132.html +# +# Status: +# +# fixed in gcc >= 3.3.5 +# backport of gcc-3.3.5 fix +# +diff -ruN gcc-3.3.1-orig/configure gcc-3.3.1/configure +--- gcc-3.3.1-orig/configure 2002-09-29 18:11:24.000000000 +0200 ++++ gcc-3.3.1/configure 2005-04-20 18:49:20.223220401 +0200 +@@ -697,7 +697,7 @@ + if test -f skip-this-dir; then + # Perform the same cleanup as the trap handler, minus the "exit 1" of course, + # and reset the trap handler. +- trap 0 ++ trap '' 0 + rm -rf Makefile* ${tmpdir} + # Execute the final clean-up actions + ${config_shell} skip-this-dir +@@ -1596,7 +1596,7 @@ + # Perform the same cleanup as the trap handler, minus the "exit 1" of course, + # and reset the trap handler. + rm -rf ${tmpdir} +-trap 0 ++trap '' 0 + + exit 0 + diff --git a/patches/gcc/3.3.1/pr10392-1-test.patch b/patches/gcc/3.3.1/pr10392-1-test.patch new file mode 100644 index 00000000..e94c8b9b --- /dev/null +++ b/patches/gcc/3.3.1/pr10392-1-test.patch @@ -0,0 +1,65 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr10392-1.c Sun Sep 14 14:28:24 2003 +@@ -0,0 +1,62 @@ ++/* PR optimization/10392 ++ * Reporter: marcus@mc.pp.se ++ * Summary: [3.3/3.4 regression] [SH] optimizer generates faulty array indexing ++ * Description: ++ * The address calculation of an index operation on an array on the stack ++ * can _under some conditions_ get messed up completely ++ * ++ * Testcase tweaked by dank@kegel.com ++ * Problem only happens with -O2 -m4, so it should only happen on sh4, ++ * but what the heck, let's test other architectures, too. ++ * Not marked as xfail since it's a regression. ++*/ ++/* { dg-do run } */ ++/* { dg-options "-O2" } */ ++/* { dg-options "-O2 -m4" { target sh4-*-* } } */ ++const char *dont_optimize_function_away; ++ ++const char *use(const char *str) ++{ ++ dont_optimize_function_away = str; ++ if (str[0] != 'v') ++ abort(); ++ if (str[1] < '1' || str[1] > '6') ++ abort(); ++ if (str[2]) ++ abort(); ++ return str[2] ? "notused" : "v6"; ++} ++ ++const char *func(char *a, char *b) ++{ ++ char buf[128]; ++ unsigned char i; ++ const char *result; ++ ++ char *item[] = { ++ "v1", ++ "v2", ++ }; ++ ++ buf[0] = 'v'; ++ buf[1] = '3'; ++ buf[2] = 0; ++ ++ for (i = 0; i < 2; i++) { ++ /* bug is: following line passes wild pointer to use() on sh4 -O2 */ ++ result = use(item[i]); ++ ++ use(buf); ++ use(a); ++ use(b); ++ result = use(result); ++ } ++ return result; ++} ++ ++int main() ++{ ++ func("v4", "v5"); ++ return 0; ++} ++ diff --git a/patches/gcc/3.3.1/pr10412-1-test.patch b/patches/gcc/3.3.1/pr10412-1-test.patch new file mode 100644 index 00000000..6ca05258 --- /dev/null +++ b/patches/gcc/3.3.1/pr10412-1-test.patch @@ -0,0 +1,46 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr10412-1.c Sun Sep 14 16:15:21 2003 +@@ -0,0 +1,43 @@ ++/* PR target/10412 ++ * Reporter: shrinivasa@kpitcummins.com ++ * Summary: Renesas SH - Incorrect code generation ++ * Description: ++ * When following code is compiled with ++ * sh-elf-gcc -S -mhitachi -m2 -O2 bug1.c ++ * generates an incorrect code. ++ * ++ * Testcase tweaked by dank@kegel.com ++ * Problem only happens with -mhitachi -m2. Not sure if I can give those ++ * options for all sh targets. They work on sh4, though. ++ * Not marked as xfail as it's a regression relative to hardhat 2.0 gcc-2.97. ++*/ ++/* { dg-do run } */ ++/* { dg-options "-O2" } */ ++int global_val; ++ ++int func0(int x) ++{ ++ global_val += x; ++ return (x != 99); ++} ++ ++int func1(unsigned long addr) ++{ ++ int err; ++ ++ err = func0(addr); ++ if (err) ++ return (err); ++ ++ err = func0(addr * 7); /* address of func0 is lost during multiplication -> probable SIGSEGV */ ++ return (err); ++} ++ ++int main(int argc, char **argv) ++{ ++ global_val = 0; ++ global_val += func1(99); ++ if (global_val != 99 * 8 + 1) ++ abort(); ++ return 0; ++} diff --git a/patches/gcc/3.3.1/pr10589-1-test.patch b/patches/gcc/3.3.1/pr10589-1-test.patch new file mode 100644 index 00000000..04882e51 --- /dev/null +++ b/patches/gcc/3.3.1/pr10589-1-test.patch @@ -0,0 +1,17 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr10589-1.c Mon Sep 15 08:57:58 2003 +@@ -0,0 +1,14 @@ ++/* PR target/10589 ++ * Reporter: mathieu@thenesis.com ++ * Summary: For Hitachi SH target, GCC crashes when both -fomit-frame-pointer and -mdalign options are specified ++ * Keywords: ice-on-valid-code ++ * Testcase by Kazu Hirata, tweaked by dank@kegel.com ++ * Did not fail in Hard Hat 2.0 gcc-2.97, nor in dodes gcc-3.0.2, so this is a regression, so I'm not marking it xfail ++ */ ++/* { dg-do compile { target sh*-*-* } } */ ++/* { dg-options "-fomit-frame-pointer -mdalign" } */ ++ ++int foo(int a, int b) ++{ ++ return a / b; ++} diff --git a/patches/gcc/3.3.1/pr11162-1-test.patch b/patches/gcc/3.3.1/pr11162-1-test.patch new file mode 100644 index 00000000..9ab0d324 --- /dev/null +++ b/patches/gcc/3.3.1/pr11162-1-test.patch @@ -0,0 +1,25 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11162-1.c Sun Sep 14 16:24:41 2003 +@@ -0,0 +1,22 @@ ++/* ++ * PR optimization/11162 ++ * Reporter: Toshiyasu Morita <tm@kloo.net> ++ * Summary: [3.4 Regression] [-fnew-ra] ICE compiling channel.i on sh ++ * Keywords: ice-on-valid-code ++ * Description: ++ * [ICE] when channel.i from stress-1.17 is compiled with options: ++ * -O2 -m4 -fnew-ra ++ * ... ++ * The CFG code gets confused by the addition of a USE insn after a sibcall. ++ * Sibcalls are supposed to end the block (and the function!), so the fact ++ * that we have an instruction following one (even if its fake) is confusing. ++ * ++ * testcase tweaked by dank@kegel.com ++ */ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fnew-ra" } */ ++ ++int foo(char *p1) ++{ ++ return bar(p1); ++} diff --git a/patches/gcc/3.3.1/pr11587-1-test.patch b/patches/gcc/3.3.1/pr11587-1-test.patch new file mode 100644 index 00000000..f6dedde0 --- /dev/null +++ b/patches/gcc/3.3.1/pr11587-1-test.patch @@ -0,0 +1,39 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11587-1.c Mon Sep 15 08:46:00 2003 +@@ -0,0 +1,36 @@ ++/* PR optimization/11587 ++ * Reporter: Michael Eager <eager@mvista.com> ++ * Summary: [3.3/3.4 Regression] SH ICE in reload_cse_simplify_operand, postreload.c ++ * Keywords: ice-on-valid-code ++ * ++ * Note: a fix exists; see bugzilla ++ * ++ * Testcase tweaked by dank@kegel.com ++ * Not marked as xfail since it's a regression. ++ */ ++ ++/* { dg-do compile } */ ++/* { dg-options "-O1" } */ ++int foo1(void); ++int foo2(); ++int foo3(); ++ ++static int goo() ++{ ++ int i; ++ ++ if (i <= 0) ++ return i; ++ ++ if (foo1() > 1) { ++ i = foo2(); ++ if (i < 0) ++ return i; ++ if (i) { ++ if (foo3()) ++ return 1; ++ return 0; ++ } ++ } ++ ++} diff --git a/patches/gcc/3.3.1/pr11736-1-test.patch b/patches/gcc/3.3.1/pr11736-1-test.patch new file mode 100644 index 00000000..ea544b12 --- /dev/null +++ b/patches/gcc/3.3.1/pr11736-1-test.patch @@ -0,0 +1,48 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11736-1.c Sun Sep 14 14:26:33 2003 +@@ -0,0 +1,45 @@ ++/* PR optimization/11736 ++ * Reporter: marcus@mc.pp.se ++ * Summary: Stackpointer messed up on SuperH ++ * Keywords: wrong-code ++ * Description: ++ * When a function with 5 arguments is called in both branches of a ++ * conditional, and only the last argument differs, the code to push that ++ * last argument on the stack gets confused. ++ * Space for the fifth argument is reserved on the stack by the ++ * instruction I have marked as "A". However, if the else-branch is ++ * taken the stackpointer is decremented _again_ at "B". This ++ * decrementation is never restored, and it is only due to the ++ * restoration of r15 from r14 that the function works at all. With ++ * -fomit-frame-pointer it will crash. ++ * ++ * Testcase tweaked by dank@kegel.com ++ * Not marked as xfail since it's a regression from hardhat 2.0 gcc-2.97 ++ * and dodes gcc-3.0.2 ++ */ ++ ++/* { dg-do run } */ ++/* { dg-options "-O1 -fomit-frame-pointer" } */ ++ ++int expected_e; ++ ++void bar(int a, int b, int c, int d, int e) ++{ ++ if (e != expected_e) ++ abort(); ++} ++ ++void foo(int a) ++{ ++ if (a) ++ bar(0, 0, 0, 0, 1); ++ else ++ bar(0, 0, 0, 0, 0); /* stack pointer decremented extra time here, causing segfault */ ++} ++ ++int main(int argc, char **argv) ++{ ++ for (expected_e = 0; expected_e < 2; expected_e++) ++ foo(expected_e); ++ return 0; ++} diff --git a/patches/gcc/3.3.1/pr11864-1-test.patch b/patches/gcc/3.3.1/pr11864-1-test.patch new file mode 100644 index 00000000..f5b0d175 --- /dev/null +++ b/patches/gcc/3.3.1/pr11864-1-test.patch @@ -0,0 +1,45 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11864-1.c Sun Sep 14 14:32:24 2003 +@@ -0,0 +1,42 @@ ++/* PR optimization/11864 ++ * Reporter: Kazumoto Kojima <kkojima@gcc.gnu.org> ++ * Summary: [3.3/3.4 regression] miscompiles zero extension and test ++ * Description: ++ * gcc-3.3/3.4 -O2 for sh target may miscompile the combination of zero extension ++ * and test if it's zero. ++ * ++ * Testcase tweaked by dank@kegel.com. Not marked as xfail because it's a regression. ++ */ ++/* { dg-do run } */ ++/* { dg-options "-O2" } */ ++ ++extern void abort(void); ++ ++int val = 0xff00; ++ ++int f(void) ++{ ++ return val; ++} ++ ++unsigned char a[1]; ++ ++void foo(void) ++{ ++ a[0] = f() & 255; ++ ++ if (!a[0]) ++ a[0] = f() & 255; ++ ++ if (!a[0]) ++ a[0] = 1 + (f() & 127); ++} ++ ++int main(int argc, char **argv) ++{ ++ foo(); ++ if (!a[0]) ++ abort(); ++ ++ return 0; ++} diff --git a/patches/gcc/3.3.1/pr11949-fix.patch b/patches/gcc/3.3.1/pr11949-fix.patch new file mode 100644 index 00000000..7f60b954 --- /dev/null +++ b/patches/gcc/3.3.1/pr11949-fix.patch @@ -0,0 +1,61 @@ +Message-Id: 20030822160024.GA305@ftbfs.org +From: Matt Kraai kraai at alumni dot cmu dot edu +To: gcc-patches at gcc dot gnu dot org +Date: Fri, 22 Aug 2003 09:00:24 -0700 +Subject: PR 11949 + +Howdy, + +I've backported the following patch from the mainline to the 3.3 +branch to fix PR 11949. + +Bootstrapped and regression tested on powerpc-unknown-linux-gnu. + +OK to commit? + + PR c/11949 + Backport from mainline: + + 2003-05-05 Aldy Hernandez aldyh@redhat.com + + * testsuite/gcc.c-torture/compile/simd-6.c: New. + + * c-typeck.c (digest_init): Handle arrays of vector constants. + +Index: gcc/c-typeck.c +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/c-typeck.c,v +retrieving revision 1.213.2.8 +diff -3 -c -p -r1.213.2.8 c-typeck.c +*** gcc/gcc/c-typeck.c 19 Aug 2003 01:42:35 -0000 1.213.2.8 +--- gcc/gcc/c-typeck.c 22 Aug 2003 09:24:03 -0000 +*************** digest_init (type, init, require_constan +*** 4765,4772 **** + if (code == VECTOR_TYPE + && comptypes (TREE_TYPE (inside_init), type) + && TREE_CONSTANT (inside_init)) +! return build_vector (type, TREE_OPERAND (inside_init, 1)); +! + + /* Any type can be initialized + from an expression of the same type, optionally with braces. */ +--- 4765,4778 ---- + if (code == VECTOR_TYPE + && comptypes (TREE_TYPE (inside_init), type) + && TREE_CONSTANT (inside_init)) +! { +! if (TREE_CODE (inside_init) == VECTOR_CST +! && comptypes (TYPE_MAIN_VARIANT (TREE_TYPE (inside_init)), +! TYPE_MAIN_VARIANT (type))) +! return inside_init; +! else +! return build_vector (type, CONSTRUCTOR_ELTS (inside_init)); +! } + + /* Any type can be initialized + from an expression of the same type, optionally with braces. */ + +typedef int __attribute__((mode(V2SI))) vec; + +vec a[] = {(vec) {1, 2}, {3, 4}}; + diff --git a/patches/gcc/3.3.1/pr9365-1-test.patch b/patches/gcc/3.3.1/pr9365-1-test.patch new file mode 100644 index 00000000..ee7dfa7c --- /dev/null +++ b/patches/gcc/3.3.1/pr9365-1-test.patch @@ -0,0 +1,43 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr9365-1.c Sun Sep 14 09:34:37 2003 +@@ -0,0 +1,40 @@ ++/* PR target/9365 ++ * Origin: marcus@mc.pp.se ++ * Testcase tweaked by dank@kegel.com ++ * [3.3 regression] [SH] segfault in gen_far_branch (config/sh/sh.c) ++ * ice-on-valid-code ++ * Not marked as xfail since it's a regression ++*/ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fomit-frame-pointer" } */ ++ ++ ++void foo(int n, int *p) ++{ ++ switch(n) { ++ case 100: case 110: case 120: case 130: case 140: ++ case 200: case 210: case 220: case 230: case 240: ++ case 300: case 310: case 320: case 330: case 340: ++ case 400: case 410: case 420: case 430: case 440: ++ case 500: case 510: case 520: case 530: case 540: ++ case 600: case 610: case 620: case 630: case 640: ++ case 700: case 710: case 720: case 730: case 740: ++ case 800: case 810: case 820: case 830: case 840: ++ case 900: case 910: case 920: case 930: case 940: ++ break; ++ default: ++ *p = n; ++ break; ++ } ++} ++ ++int main(int argc, char **argv) ++{ ++ int p; ++ ++ (void) argv; ++ ++ foo(argc, &p); ++ ++ return p; ++} diff --git a/patches/gcc/3.3.1/sh-pic-set_fpscr.patch b/patches/gcc/3.3.1/sh-pic-set_fpscr.patch new file mode 100644 index 00000000..e83f7283 --- /dev/null +++ b/patches/gcc/3.3.1/sh-pic-set_fpscr.patch @@ -0,0 +1,61 @@ +See http://gcc.gnu.org/PR11901 +Should fix +make[2]: *** [/gcc-3.3-glibc-2.3.2/build-glibc/elf/check-textrel.out] Error 1 +in glibc's "make tests". + +------------- + +Message-Id: <200307300255.h6U2tB906928@r-rr.iij4u.or.jp> +To: dank@kegel.com +Cc: linux-sh@m17n.org +Subject: Re: Writing PIC version of __udivsi3_i4? (was: Re: "make tests" fails + with "libc.so: text relocations used" in glibc-2.3.2 for sh4) +In-Reply-To: Your message of "Wed, 30 Jul 2003 11:20:49 +0900" + <200307300212.h6U2CH901209@r-rr.iij4u.or.jp> +References: <200307300212.h6U2CH901209@r-rr.iij4u.or.jp> +Date: Wed, 30 Jul 2003 12:03:01 +0900 +From: kaz Kojima <kkojima@rr.iij4u.or.jp> + +> I'll try to write the PIC version of it, + +Dan, does the attached patch work for you? + +[dank: original patch deleted; here's same thing rediffed against gcc-3.3 instead of HEAD] + +--- gcc-3.3/gcc/config/sh/lib1funcs.asm.old Tue Jul 29 21:37:29 2003 ++++ gcc-3.3/gcc/config/sh/lib1funcs.asm Tue Jul 29 21:40:58 2003 +@@ -1792,7 +1792,17 @@ + .global GLOBAL(set_fpscr) + GLOBAL(set_fpscr): + lds r4,fpscr ++#ifdef __PIC__ ++ mov.l r12,@-r15 ++ mova LOCAL(set_fpscr_L0),r0 ++ mov.l LOCAL(set_fpscr_L0),r12 ++ add r0,r12 ++ mov.l LOCAL(set_fpscr_L1),r0 ++ mov.l @(r0,r12),r1 ++ mov.l @r15+,r12 ++#else + mov.l LOCAL(set_fpscr_L1),r1 ++#endif + swap.w r4,r0 + or #24,r0 + #ifndef FMOVD_WORKS +@@ -1820,8 +1830,16 @@ + mov.l r3,@(4,r1) + #endif + .align 2 ++#ifdef __PIC__ ++LOCAL(set_fpscr_L0): ++ .long _GLOBAL_OFFSET_TABLE_ ++LOCAL(set_fpscr_L1): ++ .long GLOBAL(fpscr_values@GOT) ++#else + LOCAL(set_fpscr_L1): + .long GLOBAL(fpscr_values) ++#endif ++ + #ifdef __ELF__ + .comm GLOBAL(fpscr_values),8,4 + #else diff --git a/patches/gcc/3.3.1/sh-spec.patch b/patches/gcc/3.3.1/sh-spec.patch new file mode 100644 index 00000000..efd4243c --- /dev/null +++ b/patches/gcc/3.3.1/sh-spec.patch @@ -0,0 +1,52 @@ +See http://gcc.gnu.org/PR11902 + +Part of fix for abort on line + assert (info[DT_RPATH] == NULL); +in glibc-2.3.2's ld.so, which makes all dynamically-linked +programs crash. + +Message-Id: <200308020452.h724q0n01509@r-rr.iij4u.or.jp> +To: dank@kegel.com +Cc: kkojima@rr.iij4u.or.jp +Subject: Re: Writing PIC version of __udivsi3_i4? +In-Reply-To: Your message of "Fri, 01 Aug 2003 21:15:27 -0700" + <3F2B3ADF.6030206@kegel.com> +References: <3F2B3ADF.6030206@kegel.com> +Date: Sat, 02 Aug 2003 13:58:05 +0900 +From: kaz Kojima <kkojima@rr.iij4u.or.jp> + +Dan Kegel <dank@kegel.com> wrote: +> It seems it might be from gcc's spec file: +> +> *subtarget_link_spec: +> %{shared:-shared} %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} %{!rpath:-rpath /lib}} %{static:-static} +> +> as the only place -rpath showed up was in the output of gcc -v as it +> was linking libc.so. +> +> Well, that's a clue, anyway! Guess I'll dig through the spec files +> tomorrow to see if I can figure it out some more. + +I've grepped gcc/config/*/*.h and found only SH and old libc1 stuffs +of i386/alpha include %{!rpath:-rpath ... in 3.3 release and the +current CVS. And my sh-gcc's specs doesn't have this :-( +It would be the Right Thing to remove this stuff simply. How about +the gcc patch below? + +Regards, + kaz +-- +--- gcc-3.3/gcc/config/sh/linux.h.orig Sat Aug 2 13:20:57 2003 ++++ gcc-3.3/gcc/config/sh/linux.h Sat Aug 2 13:22:42 2003 +@@ -48,8 +48,7 @@ do { \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ +- %{!rpath:-rpath /lib}} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" + + /* The GNU C++ standard library requires that these macros be defined. */ + + diff --git a/patches/gcc/3.3.1/sh4-pthread.patch b/patches/gcc/3.3.1/sh4-pthread.patch new file mode 100644 index 00000000..95e1057b --- /dev/null +++ b/patches/gcc/3.3.1/sh4-pthread.patch @@ -0,0 +1,44 @@ +See http://gcc.gnu.org/PR11903 + +Patch to fix following test case failure: + + === libstdc++-v3 tests === +FAIL: thread/pthread1.cc (test for excess errors) +Excess errors: +/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/sh4-unknown-linux-gnu/bin/ld: cannot find -lthread +collect2: ld returned 1 exit status + +Note that *any* program compiled with -pthread fails: + +/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/bin/sh4-unknown-linux-gnu-gcc hello.c -pthread +/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/lib/gcc-lib/sh4-unknown-linux-gnu/3.3.1/../../../../sh4-unknown-linux-gnu/bin/ld: cannot find -lthread +collect2: ld returned 1 exit status + +Compiling with -lpthread on the other hand works fine: +/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/bin/sh4-unknown-linux-gnu-gcc hello.c -lpthread + +So -pthread is broken in some trivial way; it should invoke -lpthread, not -lthread, +at least when targeting Linux. + +http://www.sh-linux.org/rpm-2003/SRPMS/gcc-3.2.3-3.src.rpm contains a jumbo patch, +gcc-20030210-sh-linux-1.patch, that includes a fix for this. Here's the +appropriate hunk (brings in a fix for the documented -mieee option). +No idea if this fix is completely right, but it works for me... +- dank@kegel.com 20 Jul 2003 + +Index: linux.h +=================================================================== +RCS file: /cvsroot/gcc/gcc/gcc/config/sh/linux.h,v +retrieving revision 1.9.20.1 +diff -u -d -u -r1.9.20.1 linux.h +--- gcc-ss-3_3-20030714/gcc/config/sh/linux.h.old 6 Jun 2003 02:30:59 -0000 1.9.20.1 ++++ gcc-ss-3_3-20030714/gcc/config/sh/linux.h 20 Jul 2003 23:36:50 -0000 +@@ -59,7 +59,7 @@ + #undef LIB_SPEC + #define LIB_SPEC \ + "%{shared: -lc} \ +- %{!shared: %{pthread:-lthread} \ ++ %{!shared: %{mieee:-lieee} %{pthread:-lpthread} \ + %{profile:-lc_p} %{!profile: -lc}}" + + #undef STARTFILE_SPEC diff --git a/patches/gcc/3.3.1/thunk3.patch b/patches/gcc/3.3.1/thunk3.patch new file mode 100644 index 00000000..7974a0c0 --- /dev/null +++ b/patches/gcc/3.3.1/thunk3.patch @@ -0,0 +1,23 @@ +Fixes +FAIL: g++.jason/thunk3.C (test for excess errors) +on sh4-unknown-linux-gnu. + +Does any sh variant *not* use the generic thunk support? If so, the patch should be +more cautious. As it is, it excludes all sh processors from this test. + +Index: thunk3.C +=================================================================== +RCS file: /cvsroot/gcc/gcc/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C,v +retrieving revision 1.13 +diff -u -d -u -r1.13 thunk3.C +--- gcc-ss-3_3-20030714/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C.old 25 Mar 2002 17:57:03 -0000 1.13 ++++ gcc-ss-3_3-20030714/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C 20 Jul 2003 16:57:38 -0000 +@@ -2,7 +2,7 @@ + // Note that this will break on any target that uses the generic thunk + // support, because it doesn't support variadic functions. + +-// excess errors test - XFAIL mips*-*-* rs6000-*-* powerpc-*-eabi m68k-*-coff m68k-motorola-sysv m88k-motorola-sysv3 mn10300-*-* mn10200-*-* v850-*-* sh-*-* sh64-*-* h8*-*-* xtensa-*-* ++// excess errors test - XFAIL mips*-*-* rs6000-*-* powerpc-*-eabi m68k-*-coff m68k-motorola-sysv m88k-motorola-sysv3 mn10300-*-* mn10200-*-* v850-*-* sh*-*-* h8*-*-* xtensa-*-* + + #include <stdarg.h> + diff --git a/patches/gcc/3.3.2/empty6.patch b/patches/gcc/3.3.2/empty6.patch new file mode 100644 index 00000000..1b0715ce --- /dev/null +++ b/patches/gcc/3.3.2/empty6.patch @@ -0,0 +1,21 @@ +From 3.4 branch. Fixes test failure +FAIL: g++.dg/abi/empty6.C (test for warnings, line 6) + +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/testsuite/g++.dg/abi/empty6.C,v +retrieving revision 1.1 +retrieving revision 1.2 +diff -u -r1.1 -r1.2 +--- gcc/gcc/testsuite/g++.dg/abi/empty6.C 2002/09/25 19:07:35 1.1 ++++ gcc/gcc/testsuite/g++.dg/abi/empty6.C 2003/06/03 19:10:09 1.2 +@@ -5,4 +5,9 @@ + struct B { + A a; // { dg-warning "empty" } + virtual void f () {} +-}; ++} __attribute__((aligned(8))); ++/* The preceding attribute is necessary on targets with ++ BIGGEST_ALIGNMENT <= 32 to trigger the warning, as otherwise a 32 bit ++ offset is split into DECL_FIELD_OFFSET 4 and DECL_FIELD_BIT_OFFSET 0, ++ and then there is no discrepancy between DECL_FIELD_OFFSET and ++ byte_position to warn about. */ diff --git a/patches/gcc/3.3.2/gcc-3.2.3-g++.exp.patch b/patches/gcc/3.3.2/gcc-3.2.3-g++.exp.patch new file mode 100644 index 00000000..fb8e4f08 --- /dev/null +++ b/patches/gcc/3.3.2/gcc-3.2.3-g++.exp.patch @@ -0,0 +1,100 @@ +See http://gcc.gnu.org/PR12010 + +g++ testsuite fixes for cross-compilers, Dan Kegel, Ixia Communications, 12 July 2003 + +The first hunk fixes the error + +/testsuite_flags: /testsuite_flags: No such file or directory + while executing +"exec sh ${odir_v3}/testsuite_flags --build-includes" + (procedure "g++_include_flags" line 21) + invoked from within +"g++_include_flags [get_multilibs] " + (procedure "g++_init" line 63) + invoked from within +"${tool}_init $test_file_name" + (procedure "runtest" line 19) + invoked from within +"runtest $test_name" + ("foreach" body line 42) + invoked from within +... +make[1]: [check-g++] Error 1 (ignored) + +The fix isn't especially pretty, but it worked for me, and can't hurt the +more common native compiler case. Maybe someone who knows the code better +can come up with a better fix. + +The second hunk fixes the error + +sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-405-linux-gnu/gcc-3.2.3-glibc-2.2.5/powerpc-405-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian + +when trying to compile g++ testcases (!); setting up +the shared library environment when running crosstests of g++ +should either be done by a special board file, or by +setting up a remote chroot environment (see http://kegel.com/crosstool), +not by blithely setting LD_LIBRARY_PATH on the local system. + +--- gcc-3.2.3/gcc/testsuite/lib/g++.exp.old Fri Jul 11 15:42:47 2003 ++++ gcc-3.2.3/gcc/testsuite/lib/g++.exp Sat Jul 12 12:57:07 2003 +@@ -72,6 +72,8 @@ + # + proc g++_include_flags { paths } { + global srcdir ++ global objdir ++ global target_triplet + global HAVE_LIBSTDCXX_V3 + global TESTING_IN_BUILD_TREE + +@@ -90,6 +92,20 @@ + + if { ${HAVE_LIBSTDCXX_V3} } { + set odir_v3 [lookfor_file ${gccpath} libstdc++-v3] ++ if { $odir_v3 == "" } { ++ verbose "g++_include_flags: couldn't find libstdc++-v3 on first try, now looking in build directory $objdir" ++ # first assume no multilibs ++ set odir_v3 [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"] ++ } ++ if { $odir_v3 == "" } { ++ verbose "g++_include_flags: couldn't find libstdc++-v3 on second try, trying multilib" ++ # assume multilib only one level deep ++ set multisub [file tail $gccpath] ++ set odir_v3 [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"] ++ } ++ if { $odir_v3 == "" } { ++ error "Can't find libstdc++-v3" ++ } + append flags [exec sh ${odir_v3}/testsuite_flags --build-includes] + } else { + set odir_v2 [lookfor_file ${gccpath} libstdc++] +@@ -192,16 +192,20 @@ + } + } + +- # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but +- # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH +- # (for the 64-bit ABI). The right way to do this would be to modify +- # unix.exp -- but that's not an option since it's part of DejaGNU +- # proper, so we do it here. We really only need to do +- # this on IRIX, but it shouldn't hurt to do it anywhere else. +- setenv LD_LIBRARY_PATH $ld_library_path +- setenv SHLIB_PATH $ld_library_path +- setenv LD_LIBRARYN32_PATH $ld_library_path +- setenv LD_LIBRARY64_PATH $ld_library_path ++ if {![is_remote target]} { ++ # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but ++ # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH ++ # (for the 64-bit ABI). The right way to do this would be to modify ++ # unix.exp -- but that's not an option since it's part of DejaGNU ++ # proper, so we do it here. We really only need to do ++ # this on IRIX, but it shouldn't hurt to do it anywhere else. ++ ++ # Doing this causes us to be unable to run cross-compilers. ++ setenv LD_LIBRARY_PATH $ld_library_path ++ setenv SHLIB_PATH $ld_library_path ++ setenv LD_LIBRARYN32_PATH $ld_library_path ++ setenv LD_LIBRARY64_PATH $ld_library_path ++ } + + return "$flags" + } diff --git a/patches/gcc/3.3.2/gcc-3.3-libstdc++-v3-dg.exp.patch b/patches/gcc/3.3.2/gcc-3.3-libstdc++-v3-dg.exp.patch new file mode 100644 index 00000000..aafc1306 --- /dev/null +++ b/patches/gcc/3.3.2/gcc-3.3-libstdc++-v3-dg.exp.patch @@ -0,0 +1,54 @@ +Without this patch, the command + +RUNTESTFLAGS=--target=powerpc-750-linux-gnu -v -v -v -v make check-target-libstdc++-v3 + +fails in two ways: +1. the -L option meant to locate the testsuite directory is incorrect, and +2. the wrong compiler is invoked, causing all sorts of havoc, not least of which +is the native compiler is invoked when we really wanted to invoke the cross-compiler +we just built. + +Here's an example log of the problem in action. Every testcase fails, this shows just one: +------------- +Invoking the compiler as g++ -ggdb3 -DDEBUG_ASSERT -I/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite /home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc -g -O2 -DDEBUG_ASSERT -L/testsuite -lv3test -lm -o ./binders.exe +compiler exited with status 1 +output is: +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h: In method `void binder2nd<mem_fun1_ref_t<void,Elem,int> >::operator ()(const Elem &) const':^M +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_algo.h:83: instantiated from `for_each<Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> > >(Elem *, Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> >)'^M +/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc:43: instantiated from here^M +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:224: conversion from `const Elem' to `Elem &' discards qualifiers^M +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:622: in passing argument 1 of `mem_fun1_ref_t<void,Elem,int>::operator ()(Elem &, int) const'^M +... +FAIL: 20_util/binders.cc (test for excess errors) +WARNING: 20_util/binders.cc compilation failed to produce executable +------------- + +And here's the patch. I'm not happy with it, and it probably gets some cases wrong, +but it seems to work for the common native case and for my cross-compiler case. + +--- gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp.old Sun Jul 13 10:42:01 2003 ++++ gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp Sun Jul 13 11:39:54 2003 +@@ -46,8 +46,23 @@ + global gluefile wrap_flags + global ld_library_path + global tool_root_dir ++ global target_triplet + + set blddir [lookfor_file [get_multilibs] libstdc++-v3] ++ if { $blddir == "" } { ++ set multilibs [get_multilibs] ++ # FIXME: assume multilib only one level deep ++ set multisub [file tail $multilibs] ++ verbose "libstdc++-v3-init: couldn't find libstdc++-v3 in $multilibs, trying $objdir" ++ set blddir [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"] ++ } ++ if { $blddir == "" } { ++ verbose "libstdc++-v3-init: couldn't find libstdc++-v3, trying $objdir without multilibs" ++ set blddir [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"] ++ } ++ if { $blddir == "" } { ++ error "Can't find libstdc++-v3" ++ } + + # By default, we assume we want to run program images. + global dg-do-what-default diff --git a/patches/gcc/3.3.2/gcc-3.3.2-arm-bigendian.patch b/patches/gcc/3.3.2/gcc-3.3.2-arm-bigendian.patch new file mode 100644 index 00000000..9ec6c53c --- /dev/null +++ b/patches/gcc/3.3.2/gcc-3.3.2-arm-bigendian.patch @@ -0,0 +1,65 @@ +By Lennert Buytenhek <buytenh@wantstofly.org> +Adds support for arm*b-linux* big-endian ARM targets + +See http://gcc.gnu.org/PR16350 + +diff -urN gcc-3.3.2.orig/gcc/config/arm/linux-elf.h gcc-3.3.2/gcc/config/arm/linux-elf.h +--- gcc-3.3.2.orig/gcc/config/arm/linux-elf.h 2003-09-16 17:39:23.000000000 +0200 ++++ gcc-3.3.2/gcc/config/arm/linux-elf.h 2004-07-07 14:03:54.329839922 +0200 +@@ -30,15 +30,29 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS | TARGET_ENDIAN_DEFAULT) + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -86,7 +100,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #define TARGET_OS_CPP_BUILTINS() \ +diff -urN gcc-3.3.2.orig/gcc/config.gcc gcc-3.3.2/gcc/config.gcc +--- gcc-3.3.2.orig/gcc/config.gcc 2003-10-01 21:07:01.000000000 +0200 ++++ gcc-3.3.2/gcc/config.gcc 2004-07-07 14:04:59.046716638 +0200 +@@ -699,6 +699,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" ++ case $machine in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/patches/gcc/3.3.2/gcc-3.3.2-trap-posix.patch b/patches/gcc/3.3.2/gcc-3.3.2-trap-posix.patch new file mode 100644 index 00000000..c8bc2eae --- /dev/null +++ b/patches/gcc/3.3.2/gcc-3.3.2-trap-posix.patch @@ -0,0 +1,44 @@ +# +# Submitted-By: Marc Kleine-Budde <mkl@pengutronix.de>, 2005-04-20 +# +# Error: +# +# creating libintl.h +# Configuring etc... +# loading cache ../config.cache +# checking for a BSD compatible install... (cached) /usr/bin/install -c +# creating ./config.status +# creating Makefile +# trap: usage: trap [-lp] [[arg] signal_spec ...] +# +# Description: +# +# non-posix conform usage of trap causes bash >= 3.0 to fail +# e.g.: http://sourceware.org/ml/crossgcc/2004-12/msg00132.html +# +# Status: +# +# fixed in gcc >= 3.3.5 +# backport of gcc-3.3.5 fix +# +diff -ruN gcc-3.3.2-orig/configure gcc-3.3.2/configure +--- gcc-3.3.2-orig/configure 2002-09-29 18:11:24.000000000 +0200 ++++ gcc-3.3.2/configure 2005-04-20 20:55:51.000000000 +0200 +@@ -697,7 +697,7 @@ + if test -f skip-this-dir; then + # Perform the same cleanup as the trap handler, minus the "exit 1" of course, + # and reset the trap handler. +- trap 0 ++ trap '' 0 + rm -rf Makefile* ${tmpdir} + # Execute the final clean-up actions + ${config_shell} skip-this-dir +@@ -1596,7 +1596,7 @@ + # Perform the same cleanup as the trap handler, minus the "exit 1" of course, + # and reset the trap handler. + rm -rf ${tmpdir} +-trap 0 ++trap '' 0 + + exit 0 + diff --git a/patches/gcc/3.3.2/pr10392-1-test.patch b/patches/gcc/3.3.2/pr10392-1-test.patch new file mode 120000 index 00000000..f02b235f --- /dev/null +++ b/patches/gcc/3.3.2/pr10392-1-test.patch @@ -0,0 +1 @@ +../3.3.1/pr10392-1-test.patch \ No newline at end of file diff --git a/patches/gcc/3.3.2/pr10412-1-test.patch b/patches/gcc/3.3.2/pr10412-1-test.patch new file mode 120000 index 00000000..195d7f51 --- /dev/null +++ b/patches/gcc/3.3.2/pr10412-1-test.patch @@ -0,0 +1 @@ +../3.3.1/pr10412-1-test.patch \ No newline at end of file diff --git a/patches/gcc/3.3.2/pr10589-1-test.patch b/patches/gcc/3.3.2/pr10589-1-test.patch new file mode 120000 index 00000000..b7e0a6b1 --- /dev/null +++ b/patches/gcc/3.3.2/pr10589-1-test.patch @@ -0,0 +1 @@ +../3.3.1/pr10589-1-test.patch \ No newline at end of file diff --git a/patches/gcc/3.3.2/pr11162-1-test.patch b/patches/gcc/3.3.2/pr11162-1-test.patch new file mode 120000 index 00000000..9f17500b --- /dev/null +++ b/patches/gcc/3.3.2/pr11162-1-test.patch @@ -0,0 +1 @@ +../3.3.1/pr11162-1-test.patch \ No newline at end of file diff --git a/patches/gcc/3.3.2/pr11587-1-test.patch b/patches/gcc/3.3.2/pr11587-1-test.patch new file mode 120000 index 00000000..cdb9d8ed --- /dev/null +++ b/patches/gcc/3.3.2/pr11587-1-test.patch @@ -0,0 +1 @@ +../3.3.1/pr11587-1-test.patch \ No newline at end of file diff --git a/patches/gcc/3.3.2/pr11608-fix.patch b/patches/gcc/3.3.2/pr11608-fix.patch new file mode 100644 index 00000000..b435126b --- /dev/null +++ b/patches/gcc/3.3.2/pr11608-fix.patch @@ -0,0 +1,31 @@ +pr11608 + +------------ +I'm building and testing an x86->sh4 crosscompiler with http://kegel.com/crosstool +With either gcc-3.3 or gcc-ss-3_3-20030714 I get: + +Testing debug/20020327-1.c, -gstabs1 +... +FAIL: gcc.dg/debug/20020327-1.c (test for excess errors) +Excess errors: +/tmp/cc8dFF7Y.s: Assembler messages: +/tmp/cc8dFF7Y.s:66: Error: symbol `Letext' is already defined + +------------ + +Index: elf.h +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/config/sh/elf.h,v +retrieving revision 1.32 +diff -u -p -r1.32 elf.h +--- gcc-orig/gcc/config/sh/elf.h 27 Sep 2003 04:48:28 -0000 1.32 ++++ gcc-new/gcc/config/sh/elf.h 2 Jan 2004 07:23:23 -0000 +@@ -95,7 +95,7 @@ while (0) + #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \ + do { \ + text_section (); \ +- fprintf ((FILE), "\t.stabs \"\",%d,0,0,Letext\nLetext:\n", N_SO); \ ++ asm_fprintf ((FILE), "\t.stabs \"\",%d,0,0,%LLetext\n%LLetext:\n", N_SO); \ + } while (0) + + #undef STARTFILE_SPEC diff --git a/patches/gcc/3.3.2/pr11736-1-test.patch b/patches/gcc/3.3.2/pr11736-1-test.patch new file mode 120000 index 00000000..04a0841c --- /dev/null +++ b/patches/gcc/3.3.2/pr11736-1-test.patch @@ -0,0 +1 @@ +../3.3.1/pr11736-1-test.patch \ No newline at end of file diff --git a/patches/gcc/3.3.2/pr11864-1-test.patch b/patches/gcc/3.3.2/pr11864-1-test.patch new file mode 120000 index 00000000..b40aaa0a --- /dev/null +++ b/patches/gcc/3.3.2/pr11864-1-test.patch @@ -0,0 +1 @@ +../3.3.1/pr11864-1-test.patch \ No newline at end of file diff --git a/patches/gcc/3.3.2/pr13260-test.patch b/patches/gcc/3.3.2/pr13260-test.patch new file mode 100644 index 00000000..d9cc3e45 --- /dev/null +++ b/patches/gcc/3.3.2/pr13260-test.patch @@ -0,0 +1,56 @@ +See http://gcc.gnu.org/PR13260 + +/cvs/gcc/gcc/gcc/testsuite/gcc.c-torture/execute/20031204-1.c,v --> standard output +revision 1.1 +--- - 1970-01-01 00:00:00.000000000 +0000 ++++ gcc/gcc/testsuite/gcc.c-torture/execute/20031204-1.c +@@ -0,0 +1,49 @@ ++/* PR optimization/13260 */ ++ ++#include <string.h> ++ ++typedef unsigned long u32; ++ ++u32 in_aton(const char* x) ++{ ++ return 0x0a0b0c0d; ++} ++ ++u32 root_nfs_parse_addr(char *name) ++{ ++ u32 addr; ++ int octets = 0; ++ char *cp, *cq; ++ ++ cp = cq = name; ++ while (octets < 4) { ++ while (*cp >= '0' && *cp <= '9') ++ cp++; ++ if (cp == cq || cp - cq > 3) ++ break; ++ if (*cp == '.' || octets == 3) ++ octets++; ++ if (octets < 4) ++ cp++; ++ cq = cp; ++ } ++ ++ if (octets == 4 && (*cp == ':' || *cp == '\0')) { ++ if (*cp == ':') ++ *cp++ = '\0'; ++ addr = in_aton(name); ++ strcpy(name, cp); ++ } else ++ addr = (-1); ++ ++ return addr; ++} ++ ++int ++main() ++{ ++ static char addr[] = "10.11.12.13:/hello"; ++ u32 result = root_nfs_parse_addr(addr); ++ if (result != 0x0a0b0c0d) { abort(); } ++ return 0; ++} diff --git a/patches/gcc/3.3.2/pr9365-1-test.patch b/patches/gcc/3.3.2/pr9365-1-test.patch new file mode 120000 index 00000000..a8eee166 --- /dev/null +++ b/patches/gcc/3.3.2/pr9365-1-test.patch @@ -0,0 +1 @@ +../3.3.1/pr9365-1-test.patch \ No newline at end of file diff --git a/patches/gcc/3.3.2/sh-lib1funcs_sizeAndType.patch b/patches/gcc/3.3.2/sh-lib1funcs_sizeAndType.patch new file mode 100644 index 00000000..5c1895a4 --- /dev/null +++ b/patches/gcc/3.3.2/sh-lib1funcs_sizeAndType.patch @@ -0,0 +1,610 @@ +Fixes the problem + [ libdemo.so and main.o both use assignment on structures ] + $ sh4-unknown-linux-gnu-gcc libdemo.so main.o + sh4-unknown-linux-gnu/bin/ld: warning: type and size of dynamic symbol `__movstr_i4_even' are not defined + [ resulting app links, but crashes at runtime ] +See testcase at http://tsukuba.m17n.org/linux-sh/ml/linux-sh/2003-11/msg00016.html + +Patch was posted as http://gcc.gnu.org/ml/gcc-patches/2002-11/msg01641.html +and is in cvs as http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/sh/lib1funcs.asm.diff?r1=1.29.4.1&r2=1.29.4.2 + +but see also sh-libgcc-hidden.patch + +=================================================================== + +--- gcc/gcc/config/sh/lib1funcs.asm 2002/09/20 01:29:21 1.29.4.1 ++++ gcc/gcc/config/sh/lib1funcs.asm 2003/11/18 12:27:31 +@@ -38,9 +38,14 @@ + amylaar@cygnus.com */ + + #ifdef __ELF__ +-#define LOCAL(X) .L_##X +-#else +-#define LOCAL(X) L_##X ++#define LOCAL(X) .L_##X ++#define FUNC(X) .type X,@function ++#define ENDFUNC0(X) .Lfe_##X: .size X,.Lfe_##X-X ++#define ENDFUNC(X) ENDFUNC0(X) ++#else ++#define LOCAL(X) L_##X ++#define FUNC(X) ++#define ENDFUNC(X) + #endif + + #define CONCAT(A,B) A##B +@@ -87,6 +92,40 @@ + .global GLOBAL(ashiftrt_r4_31) + .global GLOBAL(ashiftrt_r4_32) + ++ FUNC(GLOBAL(ashiftrt_r4_0)) ++ FUNC(GLOBAL(ashiftrt_r4_1)) ++ FUNC(GLOBAL(ashiftrt_r4_2)) ++ FUNC(GLOBAL(ashiftrt_r4_3)) ++ FUNC(GLOBAL(ashiftrt_r4_4)) ++ FUNC(GLOBAL(ashiftrt_r4_5)) ++ FUNC(GLOBAL(ashiftrt_r4_6)) ++ FUNC(GLOBAL(ashiftrt_r4_7)) ++ FUNC(GLOBAL(ashiftrt_r4_8)) ++ FUNC(GLOBAL(ashiftrt_r4_9)) ++ FUNC(GLOBAL(ashiftrt_r4_10)) ++ FUNC(GLOBAL(ashiftrt_r4_11)) ++ FUNC(GLOBAL(ashiftrt_r4_12)) ++ FUNC(GLOBAL(ashiftrt_r4_13)) ++ FUNC(GLOBAL(ashiftrt_r4_14)) ++ FUNC(GLOBAL(ashiftrt_r4_15)) ++ FUNC(GLOBAL(ashiftrt_r4_16)) ++ FUNC(GLOBAL(ashiftrt_r4_17)) ++ FUNC(GLOBAL(ashiftrt_r4_18)) ++ FUNC(GLOBAL(ashiftrt_r4_19)) ++ FUNC(GLOBAL(ashiftrt_r4_20)) ++ FUNC(GLOBAL(ashiftrt_r4_21)) ++ FUNC(GLOBAL(ashiftrt_r4_22)) ++ FUNC(GLOBAL(ashiftrt_r4_23)) ++ FUNC(GLOBAL(ashiftrt_r4_24)) ++ FUNC(GLOBAL(ashiftrt_r4_25)) ++ FUNC(GLOBAL(ashiftrt_r4_26)) ++ FUNC(GLOBAL(ashiftrt_r4_27)) ++ FUNC(GLOBAL(ashiftrt_r4_28)) ++ FUNC(GLOBAL(ashiftrt_r4_29)) ++ FUNC(GLOBAL(ashiftrt_r4_30)) ++ FUNC(GLOBAL(ashiftrt_r4_31)) ++ FUNC(GLOBAL(ashiftrt_r4_32)) ++ + .align 1 + GLOBAL(ashiftrt_r4_32): + GLOBAL(ashiftrt_r4_31): +@@ -166,6 +205,40 @@ + GLOBAL(ashiftrt_r4_0): + rts + nop ++ ++ ENDFUNC(GLOBAL(ashiftrt_r4_0)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_1)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_2)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_3)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_4)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_5)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_6)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_7)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_8)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_9)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_10)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_11)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_12)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_13)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_14)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_15)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_16)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_17)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_18)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_19)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_20)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_21)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_22)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_23)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_24)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_25)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_26)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_27)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_28)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_29)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_30)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_31)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_32)) + #endif + + #ifdef L_ashiftrt_n +@@ -188,6 +261,7 @@ + ! + + .global GLOBAL(ashrsi3) ++ FUNC(GLOBAL(ashrsi3)) + .align 2 + GLOBAL(ashrsi3): + mov #31,r0 +@@ -315,6 +389,7 @@ + rts + nop + ++ ENDFUNC(GLOBAL(ashrsi3)) + #endif + + #ifdef L_ashiftlt +@@ -336,6 +411,7 @@ + ! (none) + ! + .global GLOBAL(ashlsi3) ++ FUNC(GLOBAL(ashlsi3)) + .align 2 + GLOBAL(ashlsi3): + mov #31,r0 +@@ -472,6 +548,7 @@ + rts + nop + ++ ENDFUNC(GLOBAL(ashlsi3)) + #endif + + #ifdef L_lshiftrt +@@ -493,6 +570,7 @@ + ! (none) + ! + .global GLOBAL(lshrsi3) ++ FUNC(GLOBAL(lshrsi3)) + .align 2 + GLOBAL(lshrsi3): + mov #31,r0 +@@ -629,6 +707,7 @@ + rts + nop + ++ ENDFUNC(GLOBAL(lshrsi3)) + #endif + + #ifdef L_movstr +@@ -645,76 +724,113 @@ + add #64,r4 + .align 4 + .global GLOBAL(movstrSI64) ++ FUNC(GLOBAL(movstrSI64)) + GLOBAL(movstrSI64): + mov.l @(60,r5),r0 + mov.l r0,@(60,r4) + .global GLOBAL(movstrSI60) ++ FUNC(GLOBAL(movstrSI60)) + GLOBAL(movstrSI60): + mov.l @(56,r5),r0 + mov.l r0,@(56,r4) + .global GLOBAL(movstrSI56) ++ FUNC(GLOBAL(movstrSI56)) + GLOBAL(movstrSI56): + mov.l @(52,r5),r0 + mov.l r0,@(52,r4) + .global GLOBAL(movstrSI52) ++ FUNC(GLOBAL(movstrSI52)) + GLOBAL(movstrSI52): + mov.l @(48,r5),r0 + mov.l r0,@(48,r4) + .global GLOBAL(movstrSI48) ++ FUNC(GLOBAL(movstrSI48)) + GLOBAL(movstrSI48): + mov.l @(44,r5),r0 + mov.l r0,@(44,r4) + .global GLOBAL(movstrSI44) ++ FUNC(GLOBAL(movstrSI44)) + GLOBAL(movstrSI44): + mov.l @(40,r5),r0 + mov.l r0,@(40,r4) + .global GLOBAL(movstrSI40) ++ FUNC(GLOBAL(movstrSI40)) + GLOBAL(movstrSI40): + mov.l @(36,r5),r0 + mov.l r0,@(36,r4) + .global GLOBAL(movstrSI36) ++ FUNC(GLOBAL(movstrSI36)) + GLOBAL(movstrSI36): + mov.l @(32,r5),r0 + mov.l r0,@(32,r4) + .global GLOBAL(movstrSI32) ++ FUNC(GLOBAL(movstrSI32)) + GLOBAL(movstrSI32): + mov.l @(28,r5),r0 + mov.l r0,@(28,r4) + .global GLOBAL(movstrSI28) ++ FUNC(GLOBAL(movstrSI28)) + GLOBAL(movstrSI28): + mov.l @(24,r5),r0 + mov.l r0,@(24,r4) + .global GLOBAL(movstrSI24) ++ FUNC(GLOBAL(movstrSI24)) + GLOBAL(movstrSI24): + mov.l @(20,r5),r0 + mov.l r0,@(20,r4) + .global GLOBAL(movstrSI20) ++ FUNC(GLOBAL(movstrSI20)) + GLOBAL(movstrSI20): + mov.l @(16,r5),r0 + mov.l r0,@(16,r4) + .global GLOBAL(movstrSI16) ++ FUNC(GLOBAL(movstrSI16)) + GLOBAL(movstrSI16): + mov.l @(12,r5),r0 + mov.l r0,@(12,r4) + .global GLOBAL(movstrSI12) ++ FUNC(GLOBAL(movstrSI12)) + GLOBAL(movstrSI12): + mov.l @(8,r5),r0 + mov.l r0,@(8,r4) + .global GLOBAL(movstrSI8) ++ FUNC(GLOBAL(movstrSI8)) + GLOBAL(movstrSI8): + mov.l @(4,r5),r0 + mov.l r0,@(4,r4) + .global GLOBAL(movstrSI4) ++ FUNC(GLOBAL(movstrSI4)) + GLOBAL(movstrSI4): + mov.l @(0,r5),r0 + mov.l r0,@(0,r4) ++ .global GLOBAL(movstrSI0) ++ FUNC(GLOBAL(movstrSI0)) + GLOBAL(movstrSI0): + rts + nop + ++ ENDFUNC(GLOBAL(movstrSI64)) ++ ENDFUNC(GLOBAL(movstrSI60)) ++ ENDFUNC(GLOBAL(movstrSI56)) ++ ENDFUNC(GLOBAL(movstrSI52)) ++ ENDFUNC(GLOBAL(movstrSI48)) ++ ENDFUNC(GLOBAL(movstrSI44)) ++ ENDFUNC(GLOBAL(movstrSI40)) ++ ENDFUNC(GLOBAL(movstrSI36)) ++ ENDFUNC(GLOBAL(movstrSI32)) ++ ENDFUNC(GLOBAL(movstrSI28)) ++ ENDFUNC(GLOBAL(movstrSI24)) ++ ENDFUNC(GLOBAL(movstrSI20)) ++ ENDFUNC(GLOBAL(movstrSI16)) ++ ENDFUNC(GLOBAL(movstrSI12)) ++ ENDFUNC(GLOBAL(movstrSI8)) ++ ENDFUNC(GLOBAL(movstrSI4)) ++ ENDFUNC(GLOBAL(movstrSI0)) ++ + .align 4 + + .global GLOBAL(movstr) ++ FUNC(GLOBAL(movstr)) + GLOBAL(movstr): + mov.l @(60,r5),r0 + mov.l r0,@(60,r4) +@@ -771,6 +887,8 @@ + add #64,r5 + bra GLOBAL(movstr) + add #64,r4 ++ ++ FUNC(GLOBAL(movstr)) + #endif + + #ifdef L_movstr_i4 +@@ -779,6 +897,10 @@ + .global GLOBAL(movstr_i4_odd) + .global GLOBAL(movstrSI12_i4) + ++ FUNC(GLOBAL(movstr_i4_even)) ++ FUNC(GLOBAL(movstr_i4_odd)) ++ FUNC(GLOBAL(movstrSI12_i4)) ++ + .p2align 5 + L_movstr_2mod4_end: + mov.l r0,@(16,r4) +@@ -787,6 +909,11 @@ + + .p2align 2 + ++GLOBAL(movstr_i4_even): ++ mov.l @r5+,r0 ++ bra L_movstr_start_even ++ mov.l @r5+,r1 ++ + GLOBAL(movstr_i4_odd): + mov.l @r5+,r1 + add #-4,r4 +@@ -813,10 +940,8 @@ + rts + mov.l r3,@(12,r4) + +-GLOBAL(movstr_i4_even): +- mov.l @r5+,r0 +- bra L_movstr_start_even +- mov.l @r5+,r1 ++ ENDFUNC(GLOBAL(movstr_i4_even)) ++ ENDFUNC(GLOBAL(movstr_i4_odd)) + + .p2align 4 + GLOBAL(movstrSI12_i4): +@@ -827,12 +952,15 @@ + mov.l r1,@(4,r4) + rts + mov.l r2,@(8,r4) ++ ++ ENDFUNC(GLOBAL(movstrSI12_i4)) + #endif + + #ifdef L_mulsi3 + + + .global GLOBAL(mulsi3) ++ FUNC(GLOBAL(mulsi3)) + + ! r4 = aabb + ! r5 = ccdd +@@ -865,7 +993,7 @@ + rts + add r2,r0 + +- ++ FUNC(GLOBAL(mulsi3)) + #endif + #endif /* ! __SH5__ */ + #ifdef L_sdivsi3_i4 +@@ -875,6 +1003,7 @@ + !! args in r4 and r5, result in fpul, clobber dr0, dr2 + + .global GLOBAL(sdivsi3_i4) ++ FUNC(GLOBAL(sdivsi3_i4)) + GLOBAL(sdivsi3_i4): + lds r4,fpul + float fpul,dr0 +@@ -884,6 +1013,7 @@ + rts + ftrc dr0,fpul + ++ ENDFUNC(GLOBAL(sdivsi3_i4)) + #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__) + !! args in r4 and r5, result in fpul, clobber r2, dr0, dr2 + +@@ -892,6 +1022,7 @@ + .mode SHcompact + #endif + .global GLOBAL(sdivsi3_i4) ++ FUNC(GLOBAL(sdivsi3_i4)) + GLOBAL(sdivsi3_i4): + sts.l fpscr,@-r15 + mov #8,r2 +@@ -906,6 +1037,7 @@ + rts + lds.l @r15+,fpscr + ++ ENDFUNC(GLOBAL(sdivsi3_i4)) + #endif /* ! __SH5__ || __SH5__ == 32 */ + #endif /* ! __SH4__ */ + #endif +@@ -920,9 +1052,10 @@ + !! + !! + +-!! args in r4 and r5, result in r0 clobber r1,r2,r3 ++!! args in r4 and r5, result in r0 clobber r1, r2, r3, and t bit + + .global GLOBAL(sdivsi3) ++ FUNC(GLOBAL(sdivsi3)) + #if __SHMEDIA__ + #if __SH5__ == 32 + .section .text..SHmedia32,"ax" +@@ -1166,6 +1299,7 @@ + div0: rts + mov #0,r0 + ++ ENDFUNC(GLOBAL(sdivsi3)) + #endif /* ! __SHMEDIA__ */ + #endif /* ! __SH4__ */ + #endif +@@ -1174,9 +1308,11 @@ + .title "SH DIVIDE" + !! 4 byte integer Divide code for the Hitachi SH + #ifdef __SH4__ +-!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4 ++!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4, ++!! and t bit + + .global GLOBAL(udivsi3_i4) ++ FUNC(GLOBAL(udivsi3_i4)) + GLOBAL(udivsi3_i4): + mov #1,r1 + cmp/hi r1,r5 +@@ -1217,11 +1353,13 @@ + L1: + .double 2147483648 + ++ ENDFUNC(GLOBAL(udivsi3_i4)) + #elif defined (__SH5__) && ! defined (__SH4_NOFPU__) + #if ! __SH5__ || __SH5__ == 32 + !! args in r4 and r5, result in fpul, clobber r20, r21, dr0, fr33 + .mode SHmedia + .global GLOBAL(udivsi3_i4) ++ FUNC(GLOBAL(udivsi3_i4)) + GLOBAL(udivsi3_i4): + addz.l r4,r63,r20 + addz.l r5,r63,r21 +@@ -1234,6 +1372,8 @@ + ftrc.dq dr0,dr32 + fmov.s fr33,fr32 + blink tr0,r63 ++ ++ ENDFUNC(GLOBAL(udivsi3_i4)) + #endif /* ! __SH5__ || __SH5__ == 32 */ + #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) + !! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4 +@@ -1287,6 +1427,7 @@ + #endif + .double 2147483648 + ++ ENDFUNC(GLOBAL(udivsi3_i4)) + #endif /* ! __SH4__ */ + #endif + +@@ -1297,6 +1438,7 @@ + + !! args in r4 and r5, result in r0, clobbers r4, pr, and t bit + .global GLOBAL(udivsi3) ++ FUNC(GLOBAL(udivsi3)) + + #if __SHMEDIA__ + #if __SH5__ == 32 +@@ -1485,6 +1627,7 @@ + rts + rotcl r0 + ++ ENDFUNC(GLOBAL(udivsi3)) + #endif /* ! __SHMEDIA__ */ + #endif /* __SH4__ */ + #endif /* L_udivsi3 */ +@@ -1790,6 +1933,7 @@ + .mode SHcompact + #endif + .global GLOBAL(set_fpscr) ++ FUNC(GLOBAL(set_fpscr)) + GLOBAL(set_fpscr): + lds r4,fpscr + mov.l LOCAL(set_fpscr_L1),r1 +@@ -1822,6 +1966,8 @@ + .align 2 + LOCAL(set_fpscr_L1): + .long GLOBAL(fpscr_values) ++ ++ ENDFUNC(GLOBAL(set_fpscr)) + #ifdef __ELF__ + .comm GLOBAL(fpscr_values),8,4 + #else +@@ -1860,6 +2006,7 @@ + blink tr0, r63 + #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) + .global GLOBAL(ic_invalidate) ++ FUNC(GLOBAL(ic_invalidate)) + GLOBAL(ic_invalidate): + ocbwb @r4 + mova 0f,r0 +@@ -1882,6 +2029,8 @@ + nop + .endr + .endr ++ ++ ENDFUNC(GLOBAL(ic_invalidate)) + #endif /* SH4 */ + #endif /* L_ic_invalidate */ + +@@ -1940,6 +2089,7 @@ + will be expanded into r2/r3 upon return. */ + + .global GLOBAL(GCC_shcompact_call_trampoline) ++ FUNC(GLOBAL(GCC_shcompact_call_trampoline)) + GLOBAL(GCC_shcompact_call_trampoline): + ptabs/l r0, tr0 /* Prepare to call the actual function. */ + movi ((datalabel LOCAL(ct_main_table) - 31 * 2) >> 16) & 65535, r0 +@@ -2290,6 +2440,8 @@ + shari r2, 32, r2 + #endif + blink tr0, r63 ++ ++ ENDFUNC(GLOBAL(GCC_shcompact_call_trampoline)) + #endif /* L_shcompact_call_trampoline */ + + #ifdef L_shcompact_return_trampoline +@@ -2302,6 +2454,7 @@ + .section .text..SHmedia32, "ax" + .align 2 + .global GLOBAL(GCC_shcompact_return_trampoline) ++ FUNC(GLOBAL(GCC_shcompact_return_trampoline)) + GLOBAL(GCC_shcompact_return_trampoline): + ptabs/l r18, tr0 + #if __LITTLE_ENDIAN__ +@@ -2313,6 +2466,8 @@ + #endif + or r3, r2, r2 + blink tr0, r63 ++ ++ ENDFUNC(GLOBAL(GCC_shcompact_return_trampoline)) + #endif /* L_shcompact_return_trampoline */ + + #ifdef L_shcompact_incoming_args +@@ -2367,6 +2522,7 @@ + actual bit pattern. */ + + .global GLOBAL(GCC_shcompact_incoming_args) ++ FUNC(GLOBAL(GCC_shcompact_incoming_args)) + GLOBAL(GCC_shcompact_incoming_args): + ptabs/l r18, tr0 /* Prepare to return. */ + shlri r17, 32, r0 /* Load the cookie. */ +@@ -2519,6 +2675,7 @@ + LOCAL(ia_return): /* Return. */ + blink tr0, r63 + LOCAL(ia_end_of_push_seq): /* Label used to compute the first push instruction. */ ++ ENDFUNC(GLOBAL(GCC_shcompact_incoming_args)) + #endif /* L_shcompact_incoming_args */ + #endif + #if __SH5__ +@@ -2530,6 +2687,7 @@ + #endif + .align 3 /* It is copied in units of 8 bytes in SHmedia mode. */ + .global GLOBAL(GCC_nested_trampoline) ++ FUNC(GLOBAL(GCC_nested_trampoline)) + GLOBAL(GCC_nested_trampoline): + .mode SHmedia + ptrel/u r63, tr0 +@@ -2546,6 +2704,8 @@ + ld.l r0, 28, r1 + #endif + blink tr1, r63 ++ ++ ENDFUNC(GLOBAL(GCC_nested_trampoline)) + #endif /* L_nested_trampoline */ + #endif /* __SH5__ */ + #if __SH5__ == 32 +@@ -2555,6 +2715,7 @@ + .align 2 + #ifndef __SH4_NOFPU__ + .global GLOBAL(GCC_push_shmedia_regs) ++ FUNC(GLOBAL(GCC_push_shmedia_regs)) + GLOBAL(GCC_push_shmedia_regs): + addi.l r15, -14*8, r15 + fst.d r15, 13*8, dr62 +@@ -2573,6 +2734,7 @@ + fst.d r15, 0*8, dr36 + #endif + .global GLOBAL(GCC_push_shmedia_regs_nofpu) ++ FUNC(GLOBAL(GCC_push_shmedia_regs_nofpu)) + GLOBAL(GCC_push_shmedia_regs_nofpu): + ptabs/l r18, tr0 + addi.l r15, -27*8, r15 +@@ -2608,8 +2770,13 @@ + st.q r15, 0*8, r28 + blink tr0, r63 + ++#ifndef __SH4_NOFPU__ ++ ENDFUNC(GLOBAL(GCC_push_shmedia_regs)) ++#endif ++ ENDFUNC(GLOBAL(GCC_push_shmedia_regs_nofpu)) + #ifndef __SH4_NOFPU__ + .global GLOBAL(GCC_pop_shmedia_regs) ++ FUNC(GLOBAL(GCC_pop_shmedia_regs)) + GLOBAL(GCC_pop_shmedia_regs): + pt .L0, tr1 + movi 41*8, r0 +@@ -2630,6 +2797,7 @@ + blink tr1, r63 + #endif + .global GLOBAL(GCC_pop_shmedia_regs_nofpu) ++ FUNC(GLOBAL(GCC_pop_shmedia_regs_nofpu)) + GLOBAL(GCC_pop_shmedia_regs_nofpu): + movi 27*8, r0 + .L0: +@@ -2666,5 +2834,10 @@ + ld.q r15, 0*8, r28 + add.l r15, r0, r15 + blink tr0, r63 ++ ++#ifndef __SH4_NOFPU__ ++ ENDFUNC(GLOBAL(GCC_pop_shmedia_regs)) ++#endif ++ ENDFUNC(GLOBAL(GCC_pop_shmedia_regs_nofpu)) + #endif /* __SH5__ == 32 */ + #endif /* L_push_pop_shmedia_regs */ diff --git a/patches/gcc/3.3.2/sh-libgcc-hidden.patch b/patches/gcc/3.3.2/sh-libgcc-hidden.patch new file mode 100644 index 00000000..adccc0e2 --- /dev/null +++ b/patches/gcc/3.3.2/sh-libgcc-hidden.patch @@ -0,0 +1,122 @@ +[adjusted very slightly to apply to gcc-3.3.2 - dank] + +From: kaz Kojima <kkojima@rr.iij4u.or.jp> + +I've noticed one more problem about this issue. In the testcase given +by ZhouChang, libdemo.so exports __movstr_i4_even which is a function +in libgcc.a. This itself is not a problem but it means that some functions +in libgcc.a which should not be exported from shared objects might be +exported from shared libs + +Date: Wed, 19 Nov 2003 09:04:12 +0900 (JST) +From: kaz Kojima <kkojima@rr.iij4u.or.jp> +Subject: [linux-sh:03096] Re: [linux] Re: About tool chain in + http://kegel.com/crosstool/ +To: dank@kegel.com +Cc: zjuzhou@yahoo.com.cn, linux-sh@m17n.org, zhan_sh@yahoo.com.cn, + crossgcc@sources.redhat.com +Message-Id: <20031119.090412.85413542.kkojima@rr.iij4u.or.jp> + +Hi, + +Dan Kegel <dank@kegel.com> wrote: +> I'll try that, thanks. I notice that the '.hidden' isn't in cvs yet. +> I also notice you've been trying to get that into CVS for two years +> now (http://gcc.gnu.org/ml/gcc-patches/2001-10/msg00053.html). +> Time for another try? It'd be nice if gcc-3.4 (and maybe even gcc-3.3.3) +> didn't need a patch for this. + +The situation is a bit complicated. sh-linux target doesn't make +shared libgcc in gcc-3.3.x. +OTOH, I withdrew that .hidden patch because gcc-3.3 has a general +mechanism to make all libgcc functions .hidden. But I missed that +that mechanism was conditionalized later so that it's done only +when the target creates the shared libgcc. +In 3.4, sh-linux target becomes to use the shared libgcc like as +all other linux targets, so there is no problem. + +I inclined to backport 3.4 shared libgcc stuff to 3.3.3 rather +than the old .hidden patch. How do you think about it? +I'm happy if you or ZhouChang create a PR on gcc bugzilla about +this issue. + +Regards, + kaz +-- + This is a backport of 3.4 shared libgcc stuff to 3.3 branch. + * config.gcc (sh*-*-linux*): Add t-slibgcc-elf-ver and t-linux. + to tmake_file. * config/sh/libgcc-glibc.ver: New file. + * config/sh/t-linux (SHLIB_LINK): Override to use a linker script + libgcc_s.so. + (SHLIB_INSTALL): Likewise. + +diff -u3prN ORIG/gcc-3.3/gcc/config/sh/libgcc-glibc.ver gcc-3.3/gcc/config/sh/libgcc-glibc.ver +--- ORIG/gcc-3.3/gcc/config/sh/libgcc-glibc.ver Thu Jan 1 09:00:00 1970 ++++ gcc-3.3/gcc/config/sh/libgcc-glibc.ver Wed Nov 19 08:15:16 2003 +@@ -0,0 +1,21 @@ ++# In order to work around the very problems that force us to now generally ++# create a libgcc.so, glibc reexported a number of routines from libgcc.a. ++# By now choosing the same version tags for these specific routines, we ++# maintain enough binary compatibility to allow future versions of glibc ++# to defer implementation of these routines to libgcc.so via DT_AUXILIARY. ++ ++# Note that we cannot use the default libgcc-glibc.ver file on sh, ++# because GLIBC_2.0 does not exist on this architecture, as the first ++# ever glibc release on the platform was GLIBC_2.2. ++ ++%inherit GCC_3.0 GLIBC_2.2 ++GLIBC_2.2 { ++ __register_frame ++ __register_frame_table ++ __deregister_frame ++ __register_frame_info ++ __deregister_frame_info ++ __frame_state_for ++ __register_frame_info_table ++} ++ +diff -u3prN ORIG/gcc-3.3/gcc/config/sh/t-linux gcc-3.3/gcc/config/sh/t-linux +--- ORIG/gcc-3.3/gcc/config/sh/t-linux Fri Jun 6 11:07:14 2003 ++++ gcc-3.3/gcc/config/sh/t-linux Wed Nov 19 08:09:26 2003 +@@ -12,3 +12,27 @@ MULTILIB_MATCHES = + MULTILIB_EXCEPTIONS= + + EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o ++ ++# Override t-slibgcc-elf-ver to export some libgcc symbols with ++# the symbol versions that glibc used. ++SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver $(srcdir)/config/sh/libgcc-glibc.ver ++ ++# Override SHLIB_LINK and SHLIB_INSTALL to use linker script ++# libgcc_s.so. ++SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -shared -nodefaultlibs \ ++ -Wl,--soname=$(SHLIB_SONAME) \ ++ -Wl,--version-script=$(SHLIB_MAP) \ ++ -o $(SHLIB_NAME) @multilib_flags@ $(SHLIB_OBJS) $(SHLIB_LC) && \ ++ rm -f $(SHLIB_SOLINK) && \ ++ (echo "/* GNU ld script"; \ ++ echo " Use the shared library, but some functions are only in"; \ ++ echo " the static library. */"; \ ++ echo "GROUP ( $(SHLIB_SONAME) libgcc.a )" \ ++ ) > $(SHLIB_SOLINK) ++SHLIB_INSTALL = \ ++ $$(SHELL) $$(srcdir)/mkinstalldirs $$(slibdir)$(SHLIB_SLIBDIR_QUAL); \ ++ $(INSTALL_DATA) $(SHLIB_NAME) \ ++ $$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SONAME); \ ++ rm -f $$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK); \ ++ $(INSTALL_DATA) $(SHLIB_SOLINK) \ ++ $$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK) +diff -u3prN ORIG/gcc-3.3/gcc/config.gcc gcc-3.3/gcc/config.gcc +--- ORIG/gcc-3.3/gcc/config.gcc Sat Aug 9 07:19:07 2003 ++++ gcc-3.3/gcc/config.gcc Wed Nov 19 08:07:53 2003 +@@ -2308,7 +2308,7 @@ sh-*-rtems*) + fi + ;; + sh-*-linux* | sh[2346lbe]*-*-linux*) +- tmake_file="sh/t-sh sh/t-elf" ++ tmake_file="sh/t-sh sh/t-elf t-slibgcc-elf-ver t-linux" + case $machine in + sh*be-*-* | sh*eb-*-*) ;; + *) + + diff --git a/patches/gcc/3.3.2/sh-pic-set_fpscr-gcc-3.3.2.patch b/patches/gcc/3.3.2/sh-pic-set_fpscr-gcc-3.3.2.patch new file mode 100644 index 00000000..2a9d592b --- /dev/null +++ b/patches/gcc/3.3.2/sh-pic-set_fpscr-gcc-3.3.2.patch @@ -0,0 +1,67 @@ +See http://gcc.gnu.org/PR11901 +Should fix +make[2]: *** [/gcc-3.3-glibc-2.3.2/build-glibc/elf/check-textrel.out] Error 1 +in glibc's "make tests". + +Note: this patch is named +sh-pic-set_fpscr-gcc-3.3.2.patch +and must be applied after +sh-lib1funcs_sizeAndType.patch +but that'll happen naturally if you apply them in alphabetical order. + +------------- + +Date: Wed, 30 Jul 2003 12:03:01 +0900 +From: kaz Kojima <kkojima@rr.iij4u.or.jp> +Subject: [linux-sh:02916] Re: Writing PIC version of __udivsi3_i4? (was: Re: "make tests" fails + with "libc.so: text relocations used" in glibc-2.3.2 for sh4) +To: dank@kegel.com +Cc: linux-sh@m17n.org +Message-Id: <200307300255.h6U2tB906928@r-rr.iij4u.or.jp> + +> I'll try to write the PIC version of it, + +Dan, does the attached patch work for you? + +Regards, + kaz +-- +diff -u3prN ORIG/gcc/gcc/config/sh/lib1funcs.asm LOCAL/gcc/gcc/config/sh/lib1funcs.asm +--- ORIG/gcc/gcc/config/sh/lib1funcs.asm Thu Jun 19 07:38:59 2003 ++++ gcc-3.3.2/gcc/config/sh/lib1funcs.asm Wed Jul 30 11:08:49 2003 +@@ -1936,7 +1944,17 @@ GLOBAL(moddi3): + FUNC(GLOBAL(set_fpscr)) + GLOBAL(set_fpscr): + lds r4,fpscr ++#ifdef __PIC__ ++ mov.l r12,@-r15 ++ mova LOCAL(set_fpscr_L0),r0 ++ mov.l LOCAL(set_fpscr_L0),r12 ++ add r0,r12 ++ mov.l LOCAL(set_fpscr_L1),r0 ++ mov.l @(r0,r12),r1 ++ mov.l @r15+,r12 ++#else + mov.l LOCAL(set_fpscr_L1),r1 ++#endif + swap.w r4,r0 + or #24,r0 + #ifndef FMOVD_WORKS +@@ -1964,8 +1982,15 @@ GLOBAL(set_fpscr): + mov.l r3,@(4,r1) + #endif + .align 2 ++#ifdef __PIC__ ++LOCAL(set_fpscr_L0): ++ .long _GLOBAL_OFFSET_TABLE_ ++LOCAL(set_fpscr_L1): ++ .long GLOBAL(fpscr_values@GOT) ++#else + LOCAL(set_fpscr_L1): + .long GLOBAL(fpscr_values) ++#endif + + ENDFUNC(GLOBAL(set_fpscr)) + #ifndef NO_FPSCR_VALUES + + diff --git a/patches/gcc/3.3.2/thunk3.patch b/patches/gcc/3.3.2/thunk3.patch new file mode 100644 index 00000000..7974a0c0 --- /dev/null +++ b/patches/gcc/3.3.2/thunk3.patch @@ -0,0 +1,23 @@ +Fixes +FAIL: g++.jason/thunk3.C (test for excess errors) +on sh4-unknown-linux-gnu. + +Does any sh variant *not* use the generic thunk support? If so, the patch should be +more cautious. As it is, it excludes all sh processors from this test. + +Index: thunk3.C +=================================================================== +RCS file: /cvsroot/gcc/gcc/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C,v +retrieving revision 1.13 +diff -u -d -u -r1.13 thunk3.C +--- gcc-ss-3_3-20030714/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C.old 25 Mar 2002 17:57:03 -0000 1.13 ++++ gcc-ss-3_3-20030714/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C 20 Jul 2003 16:57:38 -0000 +@@ -2,7 +2,7 @@ + // Note that this will break on any target that uses the generic thunk + // support, because it doesn't support variadic functions. + +-// excess errors test - XFAIL mips*-*-* rs6000-*-* powerpc-*-eabi m68k-*-coff m68k-motorola-sysv m88k-motorola-sysv3 mn10300-*-* mn10200-*-* v850-*-* sh-*-* sh64-*-* h8*-*-* xtensa-*-* ++// excess errors test - XFAIL mips*-*-* rs6000-*-* powerpc-*-eabi m68k-*-coff m68k-motorola-sysv m88k-motorola-sysv3 mn10300-*-* mn10200-*-* v850-*-* sh*-*-* h8*-*-* xtensa-*-* + + #include <stdarg.h> + diff --git a/patches/gcc/3.3.3/config.sub.patch b/patches/gcc/3.3.3/config.sub.patch new file mode 100644 index 00000000..928f9115 --- /dev/null +++ b/patches/gcc/3.3.3/config.sub.patch @@ -0,0 +1,72 @@ +When configuring a s390->s390 or cris->cris crosscompiler +(ok, I haven't hit this yet, but one of these days I'll get me an account +on an s390, and then I'll need this patch :-), you'll get the +following error: + ++ /build/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/gcc-3.3/configure +--target=s390-unknown-linux-gnu --host=s390-host_unknown-linux-gnu +--prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2 +--enable-languages=c +--with-local-prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/s390- +unknown-linux-gnu --enable-threads=no --without-headers --with-newlib +--disable-shared +... +*** --with-headers is only supported when cross compiling + +This error pops up only when you're using Daniel Jacobowitz's technique +of slightly changing the target and host tuples to make them different +enough to force gcc's build system to not try to pull in system libraries +or headers. This technique is needed e.g. to build an x86 -> x86 +cross-compiler. +(The LFS developers ran into the same bug that prompted me to use +this technique; they point people who run into it to +http://linuxfromscratch.org/~greg/pure_lfs.txt, which is a different +way of avoiding this problem. I think the tuple tweak is the way to go, though.) + +config-patches@gnu.org rejected this patch, on the grounds that there +is only one vendor of each of those two architectures, so the +canonicalization is by definition correct. When I pointed out the +difficulty this causes for people building s390 -> s390 or +cris -> cris compilers that are incompatible with the system +libraries and thus must be built like cross-compilers, he grumped and said +"autoconf should let you specify a cross-compiler in some other way than +comparing tuple strings". + + + +--- gcc-3.3/config.sub.old Sun Jun 8 20:38:47 2003 ++++ gcc-3.3/config.sub Sun Jun 8 20:40:34 2003 +@@ -433,9 +433,12 @@ + crds | unos) + basic_machine=m68k-crds + ;; +- cris | cris-* | etrax*) ++ cris | etrax*) + basic_machine=cris-axis + ;; ++ cris-*) ++ basic_machine=cris-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; +@@ -820,11 +823,17 @@ + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; +- s390 | s390-*) ++ s390) + basic_machine=s390-ibm + ;; +- s390x | s390x-*) ++ s390-*) ++ basic_machine=s390-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ s390x) + basic_machine=s390x-ibm ++ ;; ++ s390x-*) ++ basic_machine=s390x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sa29200) + basic_machine=a29k-amd diff --git a/patches/gcc/3.3.3/empty6.patch b/patches/gcc/3.3.3/empty6.patch new file mode 100644 index 00000000..1b0715ce --- /dev/null +++ b/patches/gcc/3.3.3/empty6.patch @@ -0,0 +1,21 @@ +From 3.4 branch. Fixes test failure +FAIL: g++.dg/abi/empty6.C (test for warnings, line 6) + +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/testsuite/g++.dg/abi/empty6.C,v +retrieving revision 1.1 +retrieving revision 1.2 +diff -u -r1.1 -r1.2 +--- gcc/gcc/testsuite/g++.dg/abi/empty6.C 2002/09/25 19:07:35 1.1 ++++ gcc/gcc/testsuite/g++.dg/abi/empty6.C 2003/06/03 19:10:09 1.2 +@@ -5,4 +5,9 @@ + struct B { + A a; // { dg-warning "empty" } + virtual void f () {} +-}; ++} __attribute__((aligned(8))); ++/* The preceding attribute is necessary on targets with ++ BIGGEST_ALIGNMENT <= 32 to trigger the warning, as otherwise a 32 bit ++ offset is split into DECL_FIELD_OFFSET 4 and DECL_FIELD_BIT_OFFSET 0, ++ and then there is no discrepancy between DECL_FIELD_OFFSET and ++ byte_position to warn about. */ diff --git a/patches/gcc/3.3.3/gcc-3.3.2-arm-bigendian.patch b/patches/gcc/3.3.3/gcc-3.3.2-arm-bigendian.patch new file mode 100644 index 00000000..9ec6c53c --- /dev/null +++ b/patches/gcc/3.3.3/gcc-3.3.2-arm-bigendian.patch @@ -0,0 +1,65 @@ +By Lennert Buytenhek <buytenh@wantstofly.org> +Adds support for arm*b-linux* big-endian ARM targets + +See http://gcc.gnu.org/PR16350 + +diff -urN gcc-3.3.2.orig/gcc/config/arm/linux-elf.h gcc-3.3.2/gcc/config/arm/linux-elf.h +--- gcc-3.3.2.orig/gcc/config/arm/linux-elf.h 2003-09-16 17:39:23.000000000 +0200 ++++ gcc-3.3.2/gcc/config/arm/linux-elf.h 2004-07-07 14:03:54.329839922 +0200 +@@ -30,15 +30,29 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS | TARGET_ENDIAN_DEFAULT) + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -86,7 +100,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #define TARGET_OS_CPP_BUILTINS() \ +diff -urN gcc-3.3.2.orig/gcc/config.gcc gcc-3.3.2/gcc/config.gcc +--- gcc-3.3.2.orig/gcc/config.gcc 2003-10-01 21:07:01.000000000 +0200 ++++ gcc-3.3.2/gcc/config.gcc 2004-07-07 14:04:59.046716638 +0200 +@@ -699,6 +699,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h arm/unknown-elf.h arm/elf.h arm/aout.h arm/arm.h arm/linux-gas.h arm/linux-elf.h" ++ case $machine in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/patches/gcc/3.3.3/gcc-3.3.3-trap-posix.patch b/patches/gcc/3.3.3/gcc-3.3.3-trap-posix.patch new file mode 100644 index 00000000..437c2a1e --- /dev/null +++ b/patches/gcc/3.3.3/gcc-3.3.3-trap-posix.patch @@ -0,0 +1,44 @@ +# +# Submitted-By: Marc Kleine-Budde <mkl@pengutronix.de>, 2005-04-20 +# +# Error: +# +# creating libintl.h +# Configuring etc... +# loading cache ../config.cache +# checking for a BSD compatible install... (cached) /usr/bin/install -c +# creating ./config.status +# creating Makefile +# trap: usage: trap [-lp] [[arg] signal_spec ...] +# +# Description: +# +# non-posix conform usage of trap causes bash >= 3.0 to fail +# e.g.: http://sourceware.org/ml/crossgcc/2004-12/msg00132.html +# +# Status: +# +# fixed in gcc >= 3.3.5 +# backport of gcc-3.3.5 fix +# +diff -ruN gcc-3.3.3-orig/configure gcc-3.3.3/configure +--- gcc-3.3.3-orig/configure 2002-09-29 18:11:24.000000000 +0200 ++++ gcc-3.3.3/configure 2005-04-20 21:03:51.000000000 +0200 +@@ -697,7 +697,7 @@ + if test -f skip-this-dir; then + # Perform the same cleanup as the trap handler, minus the "exit 1" of course, + # and reset the trap handler. +- trap 0 ++ trap '' 0 + rm -rf Makefile* ${tmpdir} + # Execute the final clean-up actions + ${config_shell} skip-this-dir +@@ -1596,7 +1596,7 @@ + # Perform the same cleanup as the trap handler, minus the "exit 1" of course, + # and reset the trap handler. + rm -rf ${tmpdir} +-trap 0 ++trap '' 0 + + exit 0 + diff --git a/patches/gcc/3.3.3/pr10392-1-test.patch b/patches/gcc/3.3.3/pr10392-1-test.patch new file mode 100644 index 00000000..e94c8b9b --- /dev/null +++ b/patches/gcc/3.3.3/pr10392-1-test.patch @@ -0,0 +1,65 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr10392-1.c Sun Sep 14 14:28:24 2003 +@@ -0,0 +1,62 @@ ++/* PR optimization/10392 ++ * Reporter: marcus@mc.pp.se ++ * Summary: [3.3/3.4 regression] [SH] optimizer generates faulty array indexing ++ * Description: ++ * The address calculation of an index operation on an array on the stack ++ * can _under some conditions_ get messed up completely ++ * ++ * Testcase tweaked by dank@kegel.com ++ * Problem only happens with -O2 -m4, so it should only happen on sh4, ++ * but what the heck, let's test other architectures, too. ++ * Not marked as xfail since it's a regression. ++*/ ++/* { dg-do run } */ ++/* { dg-options "-O2" } */ ++/* { dg-options "-O2 -m4" { target sh4-*-* } } */ ++const char *dont_optimize_function_away; ++ ++const char *use(const char *str) ++{ ++ dont_optimize_function_away = str; ++ if (str[0] != 'v') ++ abort(); ++ if (str[1] < '1' || str[1] > '6') ++ abort(); ++ if (str[2]) ++ abort(); ++ return str[2] ? "notused" : "v6"; ++} ++ ++const char *func(char *a, char *b) ++{ ++ char buf[128]; ++ unsigned char i; ++ const char *result; ++ ++ char *item[] = { ++ "v1", ++ "v2", ++ }; ++ ++ buf[0] = 'v'; ++ buf[1] = '3'; ++ buf[2] = 0; ++ ++ for (i = 0; i < 2; i++) { ++ /* bug is: following line passes wild pointer to use() on sh4 -O2 */ ++ result = use(item[i]); ++ ++ use(buf); ++ use(a); ++ use(b); ++ result = use(result); ++ } ++ return result; ++} ++ ++int main() ++{ ++ func("v4", "v5"); ++ return 0; ++} ++ diff --git a/patches/gcc/3.3.3/pr10412-1-test.patch b/patches/gcc/3.3.3/pr10412-1-test.patch new file mode 100644 index 00000000..6ca05258 --- /dev/null +++ b/patches/gcc/3.3.3/pr10412-1-test.patch @@ -0,0 +1,46 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr10412-1.c Sun Sep 14 16:15:21 2003 +@@ -0,0 +1,43 @@ ++/* PR target/10412 ++ * Reporter: shrinivasa@kpitcummins.com ++ * Summary: Renesas SH - Incorrect code generation ++ * Description: ++ * When following code is compiled with ++ * sh-elf-gcc -S -mhitachi -m2 -O2 bug1.c ++ * generates an incorrect code. ++ * ++ * Testcase tweaked by dank@kegel.com ++ * Problem only happens with -mhitachi -m2. Not sure if I can give those ++ * options for all sh targets. They work on sh4, though. ++ * Not marked as xfail as it's a regression relative to hardhat 2.0 gcc-2.97. ++*/ ++/* { dg-do run } */ ++/* { dg-options "-O2" } */ ++int global_val; ++ ++int func0(int x) ++{ ++ global_val += x; ++ return (x != 99); ++} ++ ++int func1(unsigned long addr) ++{ ++ int err; ++ ++ err = func0(addr); ++ if (err) ++ return (err); ++ ++ err = func0(addr * 7); /* address of func0 is lost during multiplication -> probable SIGSEGV */ ++ return (err); ++} ++ ++int main(int argc, char **argv) ++{ ++ global_val = 0; ++ global_val += func1(99); ++ if (global_val != 99 * 8 + 1) ++ abort(); ++ return 0; ++} diff --git a/patches/gcc/3.3.3/pr10589-1-test.patch b/patches/gcc/3.3.3/pr10589-1-test.patch new file mode 100644 index 00000000..04882e51 --- /dev/null +++ b/patches/gcc/3.3.3/pr10589-1-test.patch @@ -0,0 +1,17 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr10589-1.c Mon Sep 15 08:57:58 2003 +@@ -0,0 +1,14 @@ ++/* PR target/10589 ++ * Reporter: mathieu@thenesis.com ++ * Summary: For Hitachi SH target, GCC crashes when both -fomit-frame-pointer and -mdalign options are specified ++ * Keywords: ice-on-valid-code ++ * Testcase by Kazu Hirata, tweaked by dank@kegel.com ++ * Did not fail in Hard Hat 2.0 gcc-2.97, nor in dodes gcc-3.0.2, so this is a regression, so I'm not marking it xfail ++ */ ++/* { dg-do compile { target sh*-*-* } } */ ++/* { dg-options "-fomit-frame-pointer -mdalign" } */ ++ ++int foo(int a, int b) ++{ ++ return a / b; ++} diff --git a/patches/gcc/3.3.3/pr11162-1-test.patch b/patches/gcc/3.3.3/pr11162-1-test.patch new file mode 100644 index 00000000..9ab0d324 --- /dev/null +++ b/patches/gcc/3.3.3/pr11162-1-test.patch @@ -0,0 +1,25 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11162-1.c Sun Sep 14 16:24:41 2003 +@@ -0,0 +1,22 @@ ++/* ++ * PR optimization/11162 ++ * Reporter: Toshiyasu Morita <tm@kloo.net> ++ * Summary: [3.4 Regression] [-fnew-ra] ICE compiling channel.i on sh ++ * Keywords: ice-on-valid-code ++ * Description: ++ * [ICE] when channel.i from stress-1.17 is compiled with options: ++ * -O2 -m4 -fnew-ra ++ * ... ++ * The CFG code gets confused by the addition of a USE insn after a sibcall. ++ * Sibcalls are supposed to end the block (and the function!), so the fact ++ * that we have an instruction following one (even if its fake) is confusing. ++ * ++ * testcase tweaked by dank@kegel.com ++ */ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fnew-ra" } */ ++ ++int foo(char *p1) ++{ ++ return bar(p1); ++} diff --git a/patches/gcc/3.3.3/pr11587-1-test.patch b/patches/gcc/3.3.3/pr11587-1-test.patch new file mode 100644 index 00000000..f6dedde0 --- /dev/null +++ b/patches/gcc/3.3.3/pr11587-1-test.patch @@ -0,0 +1,39 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11587-1.c Mon Sep 15 08:46:00 2003 +@@ -0,0 +1,36 @@ ++/* PR optimization/11587 ++ * Reporter: Michael Eager <eager@mvista.com> ++ * Summary: [3.3/3.4 Regression] SH ICE in reload_cse_simplify_operand, postreload.c ++ * Keywords: ice-on-valid-code ++ * ++ * Note: a fix exists; see bugzilla ++ * ++ * Testcase tweaked by dank@kegel.com ++ * Not marked as xfail since it's a regression. ++ */ ++ ++/* { dg-do compile } */ ++/* { dg-options "-O1" } */ ++int foo1(void); ++int foo2(); ++int foo3(); ++ ++static int goo() ++{ ++ int i; ++ ++ if (i <= 0) ++ return i; ++ ++ if (foo1() > 1) { ++ i = foo2(); ++ if (i < 0) ++ return i; ++ if (i) { ++ if (foo3()) ++ return 1; ++ return 0; ++ } ++ } ++ ++} diff --git a/patches/gcc/3.3.3/pr11608.patch b/patches/gcc/3.3.3/pr11608.patch new file mode 100644 index 00000000..b45959c3 --- /dev/null +++ b/patches/gcc/3.3.3/pr11608.patch @@ -0,0 +1,26 @@ +# See http://gcc.gnu.org/PR11608 +# Fixes following error when testing sh4 toolchain: +# +# Testing debug/20020327-1.c, -gstabs1 +# ... +# FAIL: gcc.dg/debug/20020327-1.c (test for excess errors) +# Excess errors: +# /tmp/cc8dFF7Y.s: Assembler messages: +# /tmp/cc8dFF7Y.s:66: Error: symbol `Letext' is already defined + +Index: elf.h +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/config/sh/elf.h,v +retrieving revision 1.32 +diff -u -p -r1.32 elf.h +--- gcc/gcc/config/sh/elf.h.old 27 Sep 2003 04:48:28 -0000 1.32 ++++ gcc/gcc/config/sh/elf.h 2 Jan 2004 07:23:23 -0000 +@@ -95,7 +95,7 @@ while (0) + #define DBX_OUTPUT_MAIN_SOURCE_FILE_END(FILE, FILENAME) \ + do { \ + text_section (); \ +- fprintf ((FILE), "\t.stabs \"\",%d,0,0,Letext\nLetext:\n", N_SO); \ ++ asm_fprintf ((FILE), "\t.stabs \"\",%d,0,0,%LLetext\n%LLetext:\n", N_SO); \ + } while (0) + + #undef STARTFILE_SPEC diff --git a/patches/gcc/3.3.3/pr11736-1-test.patch b/patches/gcc/3.3.3/pr11736-1-test.patch new file mode 100644 index 00000000..ea544b12 --- /dev/null +++ b/patches/gcc/3.3.3/pr11736-1-test.patch @@ -0,0 +1,48 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11736-1.c Sun Sep 14 14:26:33 2003 +@@ -0,0 +1,45 @@ ++/* PR optimization/11736 ++ * Reporter: marcus@mc.pp.se ++ * Summary: Stackpointer messed up on SuperH ++ * Keywords: wrong-code ++ * Description: ++ * When a function with 5 arguments is called in both branches of a ++ * conditional, and only the last argument differs, the code to push that ++ * last argument on the stack gets confused. ++ * Space for the fifth argument is reserved on the stack by the ++ * instruction I have marked as "A". However, if the else-branch is ++ * taken the stackpointer is decremented _again_ at "B". This ++ * decrementation is never restored, and it is only due to the ++ * restoration of r15 from r14 that the function works at all. With ++ * -fomit-frame-pointer it will crash. ++ * ++ * Testcase tweaked by dank@kegel.com ++ * Not marked as xfail since it's a regression from hardhat 2.0 gcc-2.97 ++ * and dodes gcc-3.0.2 ++ */ ++ ++/* { dg-do run } */ ++/* { dg-options "-O1 -fomit-frame-pointer" } */ ++ ++int expected_e; ++ ++void bar(int a, int b, int c, int d, int e) ++{ ++ if (e != expected_e) ++ abort(); ++} ++ ++void foo(int a) ++{ ++ if (a) ++ bar(0, 0, 0, 0, 1); ++ else ++ bar(0, 0, 0, 0, 0); /* stack pointer decremented extra time here, causing segfault */ ++} ++ ++int main(int argc, char **argv) ++{ ++ for (expected_e = 0; expected_e < 2; expected_e++) ++ foo(expected_e); ++ return 0; ++} diff --git a/patches/gcc/3.3.3/pr11864-1-test.patch b/patches/gcc/3.3.3/pr11864-1-test.patch new file mode 100644 index 00000000..f5b0d175 --- /dev/null +++ b/patches/gcc/3.3.3/pr11864-1-test.patch @@ -0,0 +1,45 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr11864-1.c Sun Sep 14 14:32:24 2003 +@@ -0,0 +1,42 @@ ++/* PR optimization/11864 ++ * Reporter: Kazumoto Kojima <kkojima@gcc.gnu.org> ++ * Summary: [3.3/3.4 regression] miscompiles zero extension and test ++ * Description: ++ * gcc-3.3/3.4 -O2 for sh target may miscompile the combination of zero extension ++ * and test if it's zero. ++ * ++ * Testcase tweaked by dank@kegel.com. Not marked as xfail because it's a regression. ++ */ ++/* { dg-do run } */ ++/* { dg-options "-O2" } */ ++ ++extern void abort(void); ++ ++int val = 0xff00; ++ ++int f(void) ++{ ++ return val; ++} ++ ++unsigned char a[1]; ++ ++void foo(void) ++{ ++ a[0] = f() & 255; ++ ++ if (!a[0]) ++ a[0] = f() & 255; ++ ++ if (!a[0]) ++ a[0] = 1 + (f() & 127); ++} ++ ++int main(int argc, char **argv) ++{ ++ foo(); ++ if (!a[0]) ++ abort(); ++ ++ return 0; ++} diff --git a/patches/gcc/3.3.3/pr12009.patch b/patches/gcc/3.3.3/pr12009.patch new file mode 100644 index 00000000..cb294d57 --- /dev/null +++ b/patches/gcc/3.3.3/pr12009.patch @@ -0,0 +1,85 @@ +See http://gcc.gnu.org/PR12009 + +Fixes the following problems when testing a cross-compiler: + +============================================ +Testing g++.dg/compat/abi/bitfield1, +... +Invoking the compiler as /crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-gli +bc-2.2.5/build-gcc/gcc/testsuite/../g++ ... +/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/gcc/test +suite/g++.dg/compat/abi/bitfield1_main.C +pid is 16028 -16028 +compiler exited with status 1 +output is: +sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-750-linux-gnu/gc +c-3.3-glibc-2.2.5/powerpc-750-linux-gnu/./lib/libdl.so.2: ELF file data encoding + not little-endian +/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/build-gcc/gcc/te +stsuite/../g++: error while loading shared libraries: /opt/cegl-2.0/powerpc-750- +linux-gnu/gcc-3.3-glibc-2.2.5/powerpc-750-linux-gnu/./lib/libc.so.6: ELF file da +ta encoding not little-endian + +FAIL: g++.dg/compat/abi/bitfield1 main_tst.o compile +============================================ + +and + +sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-405-linux-gnu/gcc-3.2.3-glibc-2.2.5/powerpc-405-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian + + + +--- gcc-3.3/gcc/testsuite/g++.dg/compat/compat.exp.old Thu Oct 17 17:22:57 2002 ++++ gcc-3.3/gcc/testsuite/g++.dg/compat/compat.exp Mon Jul 14 10:59:19 2003 +@@ -42,11 +42,13 @@ + proc compat-fix-library-path { } { + global ld_library_path + +- # See comments in lib/g++.exp for why this is needed. +- setenv LD_LIBRARY_PATH $ld_library_path +- setenv SHLIB_PATH $ld_library_path +- setenv LD_LIBRARYN32_PATH $ld_library_path +- setenv LD_LIBRARY64_PATH $ld_library_path ++ if {![is_remote target]} { ++ # See comments in lib/g++.exp for why this is needed. ++ setenv LD_LIBRARY_PATH $ld_library_path ++ setenv SHLIB_PATH $ld_library_path ++ setenv LD_LIBRARYN32_PATH $ld_library_path ++ setenv LD_LIBRARY64_PATH $ld_library_path ++ } + } + + # +--- gcc-3.4-20030813/gcc/testsuite/lib/g++.exp.orig Tue Jun 17 18:56:45 2003 ++++ gcc-3.4-20030813/gcc/testsuite/lib/g++.exp Sun Aug 17 18:35:38 2003 +@@ -166,16 +182,20 @@ + } + } + +- # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but +- # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH +- # (for the 64-bit ABI). The right way to do this would be to modify +- # unix.exp -- but that's not an option since it's part of DejaGNU +- # proper, so we do it here. We really only need to do +- # this on IRIX, but it shouldn't hurt to do it anywhere else. +- setenv LD_LIBRARY_PATH $ld_library_path +- setenv SHLIB_PATH $ld_library_path +- setenv LD_LIBRARYN32_PATH $ld_library_path +- setenv LD_LIBRARY64_PATH $ld_library_path ++ if {![is_remote target]} { ++ # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but ++ # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH ++ # (for the 64-bit ABI). The right way to do this would be to modify ++ # unix.exp -- but that's not an option since it's part of DejaGNU ++ # proper, so we do it here. We really only need to do ++ # this on IRIX, but it shouldn't hurt to do it anywhere else. ++ ++ # Doing this causes us to be unable to run cross-compilers. ++ setenv LD_LIBRARY_PATH $ld_library_path ++ setenv SHLIB_PATH $ld_library_path ++ setenv LD_LIBRARYN32_PATH $ld_library_path ++ setenv LD_LIBRARY64_PATH $ld_library_path ++ } + + return "$flags" + } diff --git a/patches/gcc/3.3.3/pr12010.patch b/patches/gcc/3.3.3/pr12010.patch new file mode 100644 index 00000000..bb7f171e --- /dev/null +++ b/patches/gcc/3.3.3/pr12010.patch @@ -0,0 +1,81 @@ +Adjusted for gcc-3.3-20040119 + +See http://gcc.gnu.org/PR12010 + +Without this patch, one gets both compile and link time errors in +'make check' when configured for cross-compiling. + +In particular, 'make check' on a cross-compiler fails with + +/testsuite_flags: /testsuite_flags: No such file or directory + while executing +"exec sh ${odir_v3}/testsuite_flags --build-includes" + (procedure "g++_include_flags" line 21) + invoked from within +"g++_include_flags [get_multilibs] " + (procedure "g++_init" line 63) + invoked from within +"${tool}_init $test_file_name" + (procedure "runtest" line 19) +... +make[1]: [check-g++] Error 1 (ignored) + +--- gcc-3.3-20040119/gcc/testsuite/lib/g++.exp.orig 2004-01-25 17:56:24.000000000 -0800 ++++ gcc-3.3-20040119/gcc/testsuite/lib/g++.exp 2004-01-25 18:29:44.000000000 -0800 +@@ -72,6 +72,8 @@ proc g++_version { } { + # + proc g++_include_flags { paths } { + global srcdir ++ global objdir ++ global target_triplet + global HAVE_LIBSTDCXX_V3 + global TESTING_IN_BUILD_TREE + +@@ -90,6 +92,20 @@ proc g++_include_flags { paths } { + + if { ${HAVE_LIBSTDCXX_V3} } { + set odir_v3 [lookfor_file ${gccpath} libstdc++-v3] ++ if { $odir_v3 == "" } { ++ verbose "g++_include_flags: couldn't find libstdc++-v3 on first try, now looking in build directory $objdir" ++ # first assume no multilibs ++ set odir_v3 [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"] ++ } ++ if { $odir_v3 == "" } { ++ verbose "g++_include_flags: couldn't find libstdc++-v3 on second try, trying multilib" ++ # assume multilib only one level deep ++ set multisub [file tail $gccpath] ++ set odir_v3 [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"] ++ } ++ if { $odir_v3 == "" } { ++ error "Can't find libstdc++-v3" ++ } + append flags [exec sh ${odir_v3}/testsuite_flags --build-includes] + } else { + set odir_v2 [lookfor_file ${gccpath} libstdc++] + +--- gcc-3.3-20040119/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp.old Sun Jul 13 10:42:01 2003 ++++ gcc-3.3-20040119/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp Sun Jul 13 11:39:54 2003 +@@ -48,8 +48,23 @@ + global ld_library_path + global original_ld_library_path + global tool_root_dir ++ global target_triplet + + set blddir [lookfor_file [get_multilibs] libstdc++-v3] ++ if { $blddir == "" } { ++ set multilibs [get_multilibs] ++ # FIXME: assume multilib only one level deep ++ set multisub [file tail $multilibs] ++ verbose "libstdc++-v3-init: couldn't find libstdc++-v3 in $multilibs, trying $objdir" ++ set blddir [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"] ++ } ++ if { $blddir == "" } { ++ verbose "libstdc++-v3-init: couldn't find libstdc++-v3, trying $objdir without multilibs" ++ set blddir [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"] ++ } ++ if { $blddir == "" } { ++ error "Can't find libstdc++-v3" ++ } + + # By default, we assume we want to run program images. + global dg-do-what-default diff --git a/patches/gcc/3.3.3/pr13250-fix.patch b/patches/gcc/3.3.3/pr13250-fix.patch new file mode 100644 index 00000000..ce68bb1b --- /dev/null +++ b/patches/gcc/3.3.3/pr13250-fix.patch @@ -0,0 +1,19 @@ +See http://gcc.gnu.org/PR13250 +Fixes bad code generated when compiling SHA256 for SH processor + +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/config/sh/sh.md,v +retrieving revision 1.171 +retrieving revision 1.172 +diff -u -r1.171 -r1.172 +--- gcc/gcc/config/sh/sh.md 2004/05/10 23:25:13 1.171 ++++ gcc/gcc/config/sh/sh.md 2004/05/28 05:47:36 1.172 +@@ -2194,7 +2194,7 @@ + parts[0] = gen_reg_rtx (SImode); + parts[1] = gen_reg_rtx (SImode); + emit_insn (gen_rotlsi3_16 (parts[2-choice], operands[1])); +- parts[choice-1] = operands[1]; ++ emit_move_insn (parts[choice-1], operands[1]); + emit_insn (gen_ashlsi3 (parts[0], parts[0], GEN_INT (8))); + emit_insn (gen_lshrsi3 (parts[1], parts[1], GEN_INT (8))); + emit_insn (gen_iorsi3 (operands[0], parts[0], parts[1])); diff --git a/patches/gcc/3.3.3/pr13260-fix-3.3.3.patch b/patches/gcc/3.3.3/pr13260-fix-3.3.3.patch new file mode 100644 index 00000000..7587ad81 --- /dev/null +++ b/patches/gcc/3.3.3/pr13260-fix-3.3.3.patch @@ -0,0 +1,246 @@ +Date: Fri, 06 Feb 2004 12:35:58 +0900 +From: SUGIOKA Toshinobu <sugioka@itonet.co.jp> +Subject: [linux-sh:03150] Re: gcc 3.3 optimisation problem +To: linux-sh@m17n.org +Message-Id: <4.2.0.58.J.20040206122503.04fe3058@router.itonet.co.jp> +List-Help: <mailto:linux-sh-ctl@m17n.org?body=help> +List-Id: linux-sh.m17n.org + +At 19:40 03/12/01 +0000, Stuart Menefy <stuart.menefy@st.com> wrote: +>On Sat, 29 Nov 2003 20:19:08 +0900 kkojima@rr.iij4u.or.jp wrote: +> +>> Dan Kegel <dank@kegel.com> wrote: +>> > Stuart Menefy wrote: +>> >> I've just been trying to put together a gcc 3.3.2 based toolchain, and +>> >> appear to be hitting a gcc optimisation bug. I was just wondering if +>> >> anyone else had seen anything similar. +>> >> +>> >> The problem is seen when building the kernel, in the function +>> >> root_nfs_parse_addr(). I've extracted this into a small stand alone +>> >> program which demonstrates the problem. +>> > +>> > Excellent work. I haven't seen anything like this (doesn't mean much) +>> > and the sh-specific optimization bugs in the gcc bug database don't look +>> > similar. I think you should submit this as a bug report at +>> > http://gcc.gnu.org/bugzilla/ +>> > It would be good if you could make your test case call abort() if +>> > the problem is present, so the test case can be automated. +>> +>> Indeed. It'd be very nice to create a gcc PR for this issue. +> +>OK, I've done that. PR 13260. + +PR 13260 was fixed by amylaar@gcc.gnu.org at 2003-12-04 20:10:29 on mainline(gcc-3.4). +I have back-ported that patch to gcc-3.3.3 and seems fine for me. + + * sh-protos.h (sh_expand_t_scc): Declare. + * sh.h (PREDICATE_CODES): Add cmpsi_operand. + * sh.c (cmpsi_operand, sh_expand_t_scc): New functions. + * sh.md (cmpsi): Use cmpsi_operand. If T_REG is compared to + something that is not a CONST_INT, copy it into a pseudo register. + (subc): Fix description of new T value. + (slt, sgt, sge, sgtu): Don't clobber T after rtl generation is over. + (sltu, sleu, sgeu): Likewise. + (seq, sne): Likewise. Use sh_expand_t_scc. + +diff -ru gcc-3.3-20040126-1/gcc/config/sh/sh-protos.h gcc-3.3-20040126/gcc/config/sh/sh-protos.h +--- gcc-3.3-20040126-1/gcc/config/sh/sh-protos.h Tue Jan 13 02:03:24 2004 ++++ gcc-3.3-20040126/gcc/config/sh/sh-protos.h Fri Jan 30 17:54:04 2004 +@@ -102,6 +102,7 @@ + extern int sh_can_redirect_branch PARAMS ((rtx, rtx)); + extern void sh_expand_unop_v2sf PARAMS ((enum rtx_code, rtx, rtx)); + extern void sh_expand_binop_v2sf PARAMS ((enum rtx_code, rtx, rtx, rtx)); ++extern int sh_expand_t_scc (enum rtx_code code, rtx target); + #ifdef TREE_CODE + extern void sh_va_start PARAMS ((tree, rtx)); + extern rtx sh_va_arg PARAMS ((tree, tree)); +diff -ru gcc-3.3-20040126-1/gcc/config/sh/sh.c gcc-3.3-20040126/gcc/config/sh/sh.c +--- gcc-3.3-20040126-1/gcc/config/sh/sh.c Thu Jan 15 03:11:36 2004 ++++ gcc-3.3-20040126/gcc/config/sh/sh.c Fri Jan 30 17:53:58 2004 +@@ -7870,6 +7870,15 @@ + return register_operand (op, mode); + } + ++int ++cmpsi_operand (rtx op, enum machine_mode mode) ++{ ++ if (GET_CODE (op) == REG && REGNO (op) == T_REG ++ && GET_MODE (op) == SImode) ++ return 1; ++ return arith_operand (op, mode); ++} ++ + /* INSN is an sfunc; return the rtx that describes the address used. */ + static rtx + extract_sfunc_addr (rtx insn) +@@ -7917,4 +7926,33 @@ + abort (); + } + ++int ++sh_expand_t_scc (enum rtx_code code, rtx target) ++{ ++ rtx result = target; ++ HOST_WIDE_INT val; ++ ++ if (GET_CODE (sh_compare_op0) != REG || REGNO (sh_compare_op0) != T_REG ++ || GET_CODE (sh_compare_op1) != CONST_INT) ++ return 0; ++ if (GET_CODE (result) != REG) ++ result = gen_reg_rtx (SImode); ++ val = INTVAL (sh_compare_op1); ++ if ((code == EQ && val == 1) || (code == NE && val == 0)) ++ emit_insn (gen_movt (result)); ++ else if ((code == EQ && val == 0) || (code == NE && val == 1)) ++ { ++ emit_insn (gen_rtx_CLOBBER (VOIDmode, result)); ++ emit_insn (gen_subc (result, result, result)); ++ emit_insn (gen_addsi3 (result, result, GEN_INT (1))); ++ } ++ else if (code == EQ || code == NE) ++ emit_insn (gen_move_insn (result, GEN_INT (code == NE))); ++ else ++ return 0; ++ if (result != target) ++ emit_move_insn (target, result); ++ return 1; ++} ++ + #include "gt-sh.h" +diff -ru gcc-3.3-20040126-1/gcc/config/sh/sh.h gcc-3.3-20040126/gcc/config/sh/sh.h +--- gcc-3.3-20040126-1/gcc/config/sh/sh.h Wed Apr 16 02:06:09 2003 ++++ gcc-3.3-20040126/gcc/config/sh/sh.h Fri Jan 30 17:53:51 2004 +@@ -3231,6 +3231,7 @@ + {"arith_reg_or_0_operand", {SUBREG, REG, CONST_INT, CONST_VECTOR}}, \ + {"binary_float_operator", {PLUS, MINUS, MULT, DIV}}, \ + {"binary_logical_operator", {AND, IOR, XOR}}, \ ++ {"cmpsi_operand", {SUBREG, REG, CONST_INT}}, \ + {"commutative_float_operator", {PLUS, MULT}}, \ + {"equality_comparison_operator", {EQ,NE}}, \ + {"extend_reg_operand", {SUBREG, REG, TRUNCATE}}, \ +diff -ru gcc-3.3-20040126-1/gcc/config/sh/sh.md gcc-3.3-20040126/gcc/config/sh/sh.md +--- gcc-3.3-20040126-1/gcc/config/sh/sh.md Tue Jan 13 02:03:25 2004 ++++ gcc-3.3-20040126/gcc/config/sh/sh.md Fri Jan 30 17:54:20 2004 +@@ -685,11 +685,14 @@ + + (define_expand "cmpsi" + [(set (reg:SI T_REG) +- (compare (match_operand:SI 0 "arith_operand" "") ++ (compare (match_operand:SI 0 "cmpsi_operand" "") + (match_operand:SI 1 "arith_operand" "")))] + "TARGET_SH1" + " + { ++ if (GET_CODE (operands[0]) == REG && REGNO (operands[0]) == T_REG ++ && GET_CODE (operands[1]) != CONST_INT) ++ operands[0] = copy_to_mode_reg (SImode, operands[0]); + sh_compare_op0 = operands[0]; + sh_compare_op1 = operands[1]; + DONE; +@@ -1147,7 +1150,9 @@ + (match_operand:SI 2 "arith_reg_operand" "r")) + (reg:SI T_REG))) + (set (reg:SI T_REG) +- (gtu:SI (minus:SI (match_dup 1) (match_dup 2)) (match_dup 1)))] ++ (gtu:SI (minus:SI (minus:SI (match_dup 1) (match_dup 2)) ++ (reg:SI T_REG)) ++ (match_dup 1)))] + "TARGET_SH1" + "subc %2,%0" + [(set_attr "type" "arith")]) +@@ -7223,6 +7228,10 @@ + } + DONE; + } ++ if (sh_expand_t_scc (EQ, operands[0])) ++ DONE; ++ if (! rtx_equal_function_value_matters) ++ FAIL; + operands[1] = prepare_scc_operands (EQ); + }") + +@@ -7269,6 +7278,8 @@ + } + DONE; + } ++ if (! rtx_equal_function_value_matters) ++ FAIL; + operands[1] = prepare_scc_operands (LT); + }") + +@@ -7371,6 +7382,8 @@ + } + DONE; + } ++ if (! rtx_equal_function_value_matters) ++ FAIL; + operands[1] = prepare_scc_operands (GT); + }") + +@@ -7423,6 +7436,8 @@ + DONE; + } + ++ if (! rtx_equal_function_value_matters) ++ FAIL; + if (GET_MODE_CLASS (GET_MODE (sh_compare_op0)) == MODE_FLOAT) + { + if (TARGET_IEEE) +@@ -7462,6 +7477,8 @@ + sh_compare_op0, sh_compare_op1)); + DONE; + } ++ if (! rtx_equal_function_value_matters) ++ FAIL; + operands[1] = prepare_scc_operands (GTU); + }") + +@@ -7486,6 +7503,8 @@ + sh_compare_op1, sh_compare_op0)); + DONE; + } ++ if (! rtx_equal_function_value_matters) ++ FAIL; + operands[1] = prepare_scc_operands (LTU); + }") + +@@ -7515,6 +7534,8 @@ + + DONE; + } ++ if (! rtx_equal_function_value_matters) ++ FAIL; + operands[1] = prepare_scc_operands (LEU); + }") + +@@ -7545,6 +7566,8 @@ + DONE; + } + ++ if (! rtx_equal_function_value_matters) ++ FAIL; + operands[1] = prepare_scc_operands (GEU); + }") + +@@ -7592,8 +7615,12 @@ + DONE; + } + +- operands[1] = prepare_scc_operands (EQ); +- operands[2] = gen_reg_rtx (SImode); ++ if (sh_expand_t_scc (NE, operands[0])) ++ DONE; ++ if (! rtx_equal_function_value_matters) ++ FAIL; ++ operands[1] = prepare_scc_operands (EQ); ++ operands[2] = gen_reg_rtx (SImode); + }") + + (define_expand "sunordered" + +---- +SUGIOKA Toshinobu + + + + diff --git a/patches/gcc/3.3.3/pr13260-test.patch b/patches/gcc/3.3.3/pr13260-test.patch new file mode 100644 index 00000000..d9cc3e45 --- /dev/null +++ b/patches/gcc/3.3.3/pr13260-test.patch @@ -0,0 +1,56 @@ +See http://gcc.gnu.org/PR13260 + +/cvs/gcc/gcc/gcc/testsuite/gcc.c-torture/execute/20031204-1.c,v --> standard output +revision 1.1 +--- - 1970-01-01 00:00:00.000000000 +0000 ++++ gcc/gcc/testsuite/gcc.c-torture/execute/20031204-1.c +@@ -0,0 +1,49 @@ ++/* PR optimization/13260 */ ++ ++#include <string.h> ++ ++typedef unsigned long u32; ++ ++u32 in_aton(const char* x) ++{ ++ return 0x0a0b0c0d; ++} ++ ++u32 root_nfs_parse_addr(char *name) ++{ ++ u32 addr; ++ int octets = 0; ++ char *cp, *cq; ++ ++ cp = cq = name; ++ while (octets < 4) { ++ while (*cp >= '0' && *cp <= '9') ++ cp++; ++ if (cp == cq || cp - cq > 3) ++ break; ++ if (*cp == '.' || octets == 3) ++ octets++; ++ if (octets < 4) ++ cp++; ++ cq = cp; ++ } ++ ++ if (octets == 4 && (*cp == ':' || *cp == '\0')) { ++ if (*cp == ':') ++ *cp++ = '\0'; ++ addr = in_aton(name); ++ strcpy(name, cp); ++ } else ++ addr = (-1); ++ ++ return addr; ++} ++ ++int ++main() ++{ ++ static char addr[] = "10.11.12.13:/hello"; ++ u32 result = root_nfs_parse_addr(addr); ++ if (result != 0x0a0b0c0d) { abort(); } ++ return 0; ++} diff --git a/patches/gcc/3.3.3/pr15089-fix.patch b/patches/gcc/3.3.3/pr15089-fix.patch new file mode 100644 index 00000000..ceaf9577 --- /dev/null +++ b/patches/gcc/3.3.3/pr15089-fix.patch @@ -0,0 +1,25 @@ +See http://gcc.gnu.org/PR15089 +"In some cases the specified register for a local variable meant to be +used with inline assembly code is not respected. This breaks code +relying on this feature to implement non-standard calling convension." + +This fix is probably needed to properly implement linux syscalls in some architectures. + +First added to crosstool by Jamie Hicks, see +http://www.handhelds.org/hypermail/kernel-discuss/current/0066.html + +Index: gcc/loop.c +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/loop.c,v +retrieving revision 1.488.2.3 +diff -u -r1.488.2.3 loop.c +--- gcc-old/gcc/loop.c 14 Feb 2004 14:46:03 -0000 1.488.2.3 ++++ gcc-new/gcc/loop.c 28 Apr 2004 22:02:53 -0000 +@@ -929,6 +929,7 @@ + || (! (GET_CODE (SET_SRC (set)) == REG + && (REGNO (SET_SRC (set)) + < FIRST_PSEUDO_REGISTER)))) ++ && regno >= FIRST_PSEUDO_REGISTER + /* This test is not redundant; SET_SRC (set) might be + a call-clobbered register and the life of REGNO + might span a call. */ diff --git a/patches/gcc/3.3.3/pr9365-1-test.patch b/patches/gcc/3.3.3/pr9365-1-test.patch new file mode 100644 index 00000000..ee7dfa7c --- /dev/null +++ b/patches/gcc/3.3.3/pr9365-1-test.patch @@ -0,0 +1,43 @@ +--- /dev/null Sat Dec 14 13:56:51 2002 ++++ gcc-3.3.1/gcc/testsuite/gcc.dg/pr9365-1.c Sun Sep 14 09:34:37 2003 +@@ -0,0 +1,40 @@ ++/* PR target/9365 ++ * Origin: marcus@mc.pp.se ++ * Testcase tweaked by dank@kegel.com ++ * [3.3 regression] [SH] segfault in gen_far_branch (config/sh/sh.c) ++ * ice-on-valid-code ++ * Not marked as xfail since it's a regression ++*/ ++/* { dg-do compile } */ ++/* { dg-options "-O2 -fomit-frame-pointer" } */ ++ ++ ++void foo(int n, int *p) ++{ ++ switch(n) { ++ case 100: case 110: case 120: case 130: case 140: ++ case 200: case 210: case 220: case 230: case 240: ++ case 300: case 310: case 320: case 330: case 340: ++ case 400: case 410: case 420: case 430: case 440: ++ case 500: case 510: case 520: case 530: case 540: ++ case 600: case 610: case 620: case 630: case 640: ++ case 700: case 710: case 720: case 730: case 740: ++ case 800: case 810: case 820: case 830: case 840: ++ case 900: case 910: case 920: case 930: case 940: ++ break; ++ default: ++ *p = n; ++ break; ++ } ++} ++ ++int main(int argc, char **argv) ++{ ++ int p; ++ ++ (void) argv; ++ ++ foo(argc, &p); ++ ++ return p; ++} diff --git a/patches/gcc/3.3.3/sh-lib1funcs_sizeAndType.patch b/patches/gcc/3.3.3/sh-lib1funcs_sizeAndType.patch new file mode 100644 index 00000000..64d4fc4b --- /dev/null +++ b/patches/gcc/3.3.3/sh-lib1funcs_sizeAndType.patch @@ -0,0 +1,610 @@ +Fixes the problem + [ libdemo.so and main.o both use assignment on structures ] + $ sh4-unknown-linux-gnu-gcc libdemo.so main.o + sh4-unknown-linux-gnu/bin/ld: warning: type and size of dynamic symbol `__movstr_i4_even' are not defined + [ resulting app links, but crashes at runtime ] +See testcase at http://tsukuba.m17n.org/linux-sh/ml/linux-sh/2003-11/msg00016.html + +Patch was posted as http://gcc.gnu.org/ml/gcc-patches/2002-11/msg01641.html +and is in cvs as http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/sh/lib1funcs.asm.diff?r1=1.29.4.1&r2=1.29.4.2 + +but see also sh-libgcc-hidden.patch (part of gcc-3.3.3 as of 20040119 or so) + +=================================================================== + +--- gcc/gcc/config/sh/lib1funcs.asm 2002/09/20 01:29:21 1.29.4.1 ++++ gcc/gcc/config/sh/lib1funcs.asm 2003/11/18 12:27:31 +@@ -38,9 +38,14 @@ + amylaar@cygnus.com */ + + #ifdef __ELF__ +-#define LOCAL(X) .L_##X +-#else +-#define LOCAL(X) L_##X ++#define LOCAL(X) .L_##X ++#define FUNC(X) .type X,@function ++#define ENDFUNC0(X) .Lfe_##X: .size X,.Lfe_##X-X ++#define ENDFUNC(X) ENDFUNC0(X) ++#else ++#define LOCAL(X) L_##X ++#define FUNC(X) ++#define ENDFUNC(X) + #endif + + #define CONCAT(A,B) A##B +@@ -87,6 +92,40 @@ + .global GLOBAL(ashiftrt_r4_31) + .global GLOBAL(ashiftrt_r4_32) + ++ FUNC(GLOBAL(ashiftrt_r4_0)) ++ FUNC(GLOBAL(ashiftrt_r4_1)) ++ FUNC(GLOBAL(ashiftrt_r4_2)) ++ FUNC(GLOBAL(ashiftrt_r4_3)) ++ FUNC(GLOBAL(ashiftrt_r4_4)) ++ FUNC(GLOBAL(ashiftrt_r4_5)) ++ FUNC(GLOBAL(ashiftrt_r4_6)) ++ FUNC(GLOBAL(ashiftrt_r4_7)) ++ FUNC(GLOBAL(ashiftrt_r4_8)) ++ FUNC(GLOBAL(ashiftrt_r4_9)) ++ FUNC(GLOBAL(ashiftrt_r4_10)) ++ FUNC(GLOBAL(ashiftrt_r4_11)) ++ FUNC(GLOBAL(ashiftrt_r4_12)) ++ FUNC(GLOBAL(ashiftrt_r4_13)) ++ FUNC(GLOBAL(ashiftrt_r4_14)) ++ FUNC(GLOBAL(ashiftrt_r4_15)) ++ FUNC(GLOBAL(ashiftrt_r4_16)) ++ FUNC(GLOBAL(ashiftrt_r4_17)) ++ FUNC(GLOBAL(ashiftrt_r4_18)) ++ FUNC(GLOBAL(ashiftrt_r4_19)) ++ FUNC(GLOBAL(ashiftrt_r4_20)) ++ FUNC(GLOBAL(ashiftrt_r4_21)) ++ FUNC(GLOBAL(ashiftrt_r4_22)) ++ FUNC(GLOBAL(ashiftrt_r4_23)) ++ FUNC(GLOBAL(ashiftrt_r4_24)) ++ FUNC(GLOBAL(ashiftrt_r4_25)) ++ FUNC(GLOBAL(ashiftrt_r4_26)) ++ FUNC(GLOBAL(ashiftrt_r4_27)) ++ FUNC(GLOBAL(ashiftrt_r4_28)) ++ FUNC(GLOBAL(ashiftrt_r4_29)) ++ FUNC(GLOBAL(ashiftrt_r4_30)) ++ FUNC(GLOBAL(ashiftrt_r4_31)) ++ FUNC(GLOBAL(ashiftrt_r4_32)) ++ + .align 1 + GLOBAL(ashiftrt_r4_32): + GLOBAL(ashiftrt_r4_31): +@@ -166,6 +205,40 @@ + GLOBAL(ashiftrt_r4_0): + rts + nop ++ ++ ENDFUNC(GLOBAL(ashiftrt_r4_0)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_1)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_2)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_3)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_4)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_5)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_6)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_7)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_8)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_9)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_10)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_11)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_12)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_13)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_14)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_15)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_16)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_17)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_18)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_19)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_20)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_21)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_22)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_23)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_24)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_25)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_26)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_27)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_28)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_29)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_30)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_31)) ++ ENDFUNC(GLOBAL(ashiftrt_r4_32)) + #endif + + #ifdef L_ashiftrt_n +@@ -188,6 +261,7 @@ + ! + + .global GLOBAL(ashrsi3) ++ FUNC(GLOBAL(ashrsi3)) + .align 2 + GLOBAL(ashrsi3): + mov #31,r0 +@@ -315,6 +389,7 @@ + rts + nop + ++ ENDFUNC(GLOBAL(ashrsi3)) + #endif + + #ifdef L_ashiftlt +@@ -336,6 +411,7 @@ + ! (none) + ! + .global GLOBAL(ashlsi3) ++ FUNC(GLOBAL(ashlsi3)) + .align 2 + GLOBAL(ashlsi3): + mov #31,r0 +@@ -472,6 +548,7 @@ + rts + nop + ++ ENDFUNC(GLOBAL(ashlsi3)) + #endif + + #ifdef L_lshiftrt +@@ -493,6 +570,7 @@ + ! (none) + ! + .global GLOBAL(lshrsi3) ++ FUNC(GLOBAL(lshrsi3)) + .align 2 + GLOBAL(lshrsi3): + mov #31,r0 +@@ -629,6 +707,7 @@ + rts + nop + ++ ENDFUNC(GLOBAL(lshrsi3)) + #endif + + #ifdef L_movstr +@@ -645,76 +724,113 @@ + add #64,r4 + .align 4 + .global GLOBAL(movstrSI64) ++ FUNC(GLOBAL(movstrSI64)) + GLOBAL(movstrSI64): + mov.l @(60,r5),r0 + mov.l r0,@(60,r4) + .global GLOBAL(movstrSI60) ++ FUNC(GLOBAL(movstrSI60)) + GLOBAL(movstrSI60): + mov.l @(56,r5),r0 + mov.l r0,@(56,r4) + .global GLOBAL(movstrSI56) ++ FUNC(GLOBAL(movstrSI56)) + GLOBAL(movstrSI56): + mov.l @(52,r5),r0 + mov.l r0,@(52,r4) + .global GLOBAL(movstrSI52) ++ FUNC(GLOBAL(movstrSI52)) + GLOBAL(movstrSI52): + mov.l @(48,r5),r0 + mov.l r0,@(48,r4) + .global GLOBAL(movstrSI48) ++ FUNC(GLOBAL(movstrSI48)) + GLOBAL(movstrSI48): + mov.l @(44,r5),r0 + mov.l r0,@(44,r4) + .global GLOBAL(movstrSI44) ++ FUNC(GLOBAL(movstrSI44)) + GLOBAL(movstrSI44): + mov.l @(40,r5),r0 + mov.l r0,@(40,r4) + .global GLOBAL(movstrSI40) ++ FUNC(GLOBAL(movstrSI40)) + GLOBAL(movstrSI40): + mov.l @(36,r5),r0 + mov.l r0,@(36,r4) + .global GLOBAL(movstrSI36) ++ FUNC(GLOBAL(movstrSI36)) + GLOBAL(movstrSI36): + mov.l @(32,r5),r0 + mov.l r0,@(32,r4) + .global GLOBAL(movstrSI32) ++ FUNC(GLOBAL(movstrSI32)) + GLOBAL(movstrSI32): + mov.l @(28,r5),r0 + mov.l r0,@(28,r4) + .global GLOBAL(movstrSI28) ++ FUNC(GLOBAL(movstrSI28)) + GLOBAL(movstrSI28): + mov.l @(24,r5),r0 + mov.l r0,@(24,r4) + .global GLOBAL(movstrSI24) ++ FUNC(GLOBAL(movstrSI24)) + GLOBAL(movstrSI24): + mov.l @(20,r5),r0 + mov.l r0,@(20,r4) + .global GLOBAL(movstrSI20) ++ FUNC(GLOBAL(movstrSI20)) + GLOBAL(movstrSI20): + mov.l @(16,r5),r0 + mov.l r0,@(16,r4) + .global GLOBAL(movstrSI16) ++ FUNC(GLOBAL(movstrSI16)) + GLOBAL(movstrSI16): + mov.l @(12,r5),r0 + mov.l r0,@(12,r4) + .global GLOBAL(movstrSI12) ++ FUNC(GLOBAL(movstrSI12)) + GLOBAL(movstrSI12): + mov.l @(8,r5),r0 + mov.l r0,@(8,r4) + .global GLOBAL(movstrSI8) ++ FUNC(GLOBAL(movstrSI8)) + GLOBAL(movstrSI8): + mov.l @(4,r5),r0 + mov.l r0,@(4,r4) + .global GLOBAL(movstrSI4) ++ FUNC(GLOBAL(movstrSI4)) + GLOBAL(movstrSI4): + mov.l @(0,r5),r0 + mov.l r0,@(0,r4) ++ .global GLOBAL(movstrSI0) ++ FUNC(GLOBAL(movstrSI0)) + GLOBAL(movstrSI0): + rts + nop + ++ ENDFUNC(GLOBAL(movstrSI64)) ++ ENDFUNC(GLOBAL(movstrSI60)) ++ ENDFUNC(GLOBAL(movstrSI56)) ++ ENDFUNC(GLOBAL(movstrSI52)) ++ ENDFUNC(GLOBAL(movstrSI48)) ++ ENDFUNC(GLOBAL(movstrSI44)) ++ ENDFUNC(GLOBAL(movstrSI40)) ++ ENDFUNC(GLOBAL(movstrSI36)) ++ ENDFUNC(GLOBAL(movstrSI32)) ++ ENDFUNC(GLOBAL(movstrSI28)) ++ ENDFUNC(GLOBAL(movstrSI24)) ++ ENDFUNC(GLOBAL(movstrSI20)) ++ ENDFUNC(GLOBAL(movstrSI16)) ++ ENDFUNC(GLOBAL(movstrSI12)) ++ ENDFUNC(GLOBAL(movstrSI8)) ++ ENDFUNC(GLOBAL(movstrSI4)) ++ ENDFUNC(GLOBAL(movstrSI0)) ++ + .align 4 + + .global GLOBAL(movstr) ++ FUNC(GLOBAL(movstr)) + GLOBAL(movstr): + mov.l @(60,r5),r0 + mov.l r0,@(60,r4) +@@ -771,6 +887,8 @@ + add #64,r5 + bra GLOBAL(movstr) + add #64,r4 ++ ++ FUNC(GLOBAL(movstr)) + #endif + + #ifdef L_movstr_i4 +@@ -779,6 +897,10 @@ + .global GLOBAL(movstr_i4_odd) + .global GLOBAL(movstrSI12_i4) + ++ FUNC(GLOBAL(movstr_i4_even)) ++ FUNC(GLOBAL(movstr_i4_odd)) ++ FUNC(GLOBAL(movstrSI12_i4)) ++ + .p2align 5 + L_movstr_2mod4_end: + mov.l r0,@(16,r4) +@@ -787,6 +909,11 @@ + + .p2align 2 + ++GLOBAL(movstr_i4_even): ++ mov.l @r5+,r0 ++ bra L_movstr_start_even ++ mov.l @r5+,r1 ++ + GLOBAL(movstr_i4_odd): + mov.l @r5+,r1 + add #-4,r4 +@@ -813,10 +940,8 @@ + rts + mov.l r3,@(12,r4) + +-GLOBAL(movstr_i4_even): +- mov.l @r5+,r0 +- bra L_movstr_start_even +- mov.l @r5+,r1 ++ ENDFUNC(GLOBAL(movstr_i4_even)) ++ ENDFUNC(GLOBAL(movstr_i4_odd)) + + .p2align 4 + GLOBAL(movstrSI12_i4): +@@ -827,12 +952,15 @@ + mov.l r1,@(4,r4) + rts + mov.l r2,@(8,r4) ++ ++ ENDFUNC(GLOBAL(movstrSI12_i4)) + #endif + + #ifdef L_mulsi3 + + + .global GLOBAL(mulsi3) ++ FUNC(GLOBAL(mulsi3)) + + ! r4 = aabb + ! r5 = ccdd +@@ -865,7 +993,7 @@ + rts + add r2,r0 + +- ++ FUNC(GLOBAL(mulsi3)) + #endif + #endif /* ! __SH5__ */ + #ifdef L_sdivsi3_i4 +@@ -875,6 +1003,7 @@ + !! args in r4 and r5, result in fpul, clobber dr0, dr2 + + .global GLOBAL(sdivsi3_i4) ++ FUNC(GLOBAL(sdivsi3_i4)) + GLOBAL(sdivsi3_i4): + lds r4,fpul + float fpul,dr0 +@@ -884,6 +1013,7 @@ + rts + ftrc dr0,fpul + ++ ENDFUNC(GLOBAL(sdivsi3_i4)) + #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) || (defined (__SH5__) && ! defined __SH4_NOFPU__) + !! args in r4 and r5, result in fpul, clobber r2, dr0, dr2 + +@@ -892,6 +1022,7 @@ + .mode SHcompact + #endif + .global GLOBAL(sdivsi3_i4) ++ FUNC(GLOBAL(sdivsi3_i4)) + GLOBAL(sdivsi3_i4): + sts.l fpscr,@-r15 + mov #8,r2 +@@ -906,6 +1037,7 @@ + rts + lds.l @r15+,fpscr + ++ ENDFUNC(GLOBAL(sdivsi3_i4)) + #endif /* ! __SH5__ || __SH5__ == 32 */ + #endif /* ! __SH4__ */ + #endif +@@ -920,9 +1052,10 @@ + !! + !! + +-!! args in r4 and r5, result in r0 clobber r1,r2,r3 ++!! args in r4 and r5, result in r0 clobber r1, r2, r3, and t bit + + .global GLOBAL(sdivsi3) ++ FUNC(GLOBAL(sdivsi3)) + #if __SHMEDIA__ + #if __SH5__ == 32 + .section .text..SHmedia32,"ax" +@@ -1166,6 +1299,7 @@ + div0: rts + mov #0,r0 + ++ ENDFUNC(GLOBAL(sdivsi3)) + #endif /* ! __SHMEDIA__ */ + #endif /* ! __SH4__ */ + #endif +@@ -1174,9 +1308,11 @@ + .title "SH DIVIDE" + !! 4 byte integer Divide code for the Hitachi SH + #ifdef __SH4__ +-!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4 ++!! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4, ++!! and t bit + + .global GLOBAL(udivsi3_i4) ++ FUNC(GLOBAL(udivsi3_i4)) + GLOBAL(udivsi3_i4): + mov #1,r1 + cmp/hi r1,r5 +@@ -1217,11 +1353,13 @@ + L1: + .double 2147483648 + ++ ENDFUNC(GLOBAL(udivsi3_i4)) + #elif defined (__SH5__) && ! defined (__SH4_NOFPU__) + #if ! __SH5__ || __SH5__ == 32 + !! args in r4 and r5, result in fpul, clobber r20, r21, dr0, fr33 + .mode SHmedia + .global GLOBAL(udivsi3_i4) ++ FUNC(GLOBAL(udivsi3_i4)) + GLOBAL(udivsi3_i4): + addz.l r4,r63,r20 + addz.l r5,r63,r21 +@@ -1234,6 +1372,8 @@ + ftrc.dq dr0,dr32 + fmov.s fr33,fr32 + blink tr0,r63 ++ ++ ENDFUNC(GLOBAL(udivsi3_i4)) + #endif /* ! __SH5__ || __SH5__ == 32 */ + #elif defined(__SH4_SINGLE__) || defined(__SH4_SINGLE_ONLY__) + !! args in r4 and r5, result in fpul, clobber r0, r1, r4, r5, dr0, dr2, dr4 +@@ -1287,6 +1427,7 @@ + #endif + .double 2147483648 + ++ ENDFUNC(GLOBAL(udivsi3_i4)) + #endif /* ! __SH4__ */ + #endif + +@@ -1297,6 +1438,7 @@ + + !! args in r4 and r5, result in r0, clobbers r4, pr, and t bit + .global GLOBAL(udivsi3) ++ FUNC(GLOBAL(udivsi3)) + + #if __SHMEDIA__ + #if __SH5__ == 32 +@@ -1485,6 +1627,7 @@ + rts + rotcl r0 + ++ ENDFUNC(GLOBAL(udivsi3)) + #endif /* ! __SHMEDIA__ */ + #endif /* __SH4__ */ + #endif /* L_udivsi3 */ +@@ -1790,6 +1933,7 @@ + .mode SHcompact + #endif + .global GLOBAL(set_fpscr) ++ FUNC(GLOBAL(set_fpscr)) + GLOBAL(set_fpscr): + lds r4,fpscr + mov.l LOCAL(set_fpscr_L1),r1 +@@ -1822,6 +1966,8 @@ + .align 2 + LOCAL(set_fpscr_L1): + .long GLOBAL(fpscr_values) ++ ++ ENDFUNC(GLOBAL(set_fpscr)) + #ifdef __ELF__ + .comm GLOBAL(fpscr_values),8,4 + #else +@@ -1860,6 +2006,7 @@ + blink tr0, r63 + #elif defined(__SH4_SINGLE__) || defined(__SH4__) || defined(__SH4_SINGLE_ONLY__) + .global GLOBAL(ic_invalidate) ++ FUNC(GLOBAL(ic_invalidate)) + GLOBAL(ic_invalidate): + ocbwb @r4 + mova 0f,r0 +@@ -1882,6 +2029,8 @@ + nop + .endr + .endr ++ ++ ENDFUNC(GLOBAL(ic_invalidate)) + #endif /* SH4 */ + #endif /* L_ic_invalidate */ + +@@ -1940,6 +2089,7 @@ + will be expanded into r2/r3 upon return. */ + + .global GLOBAL(GCC_shcompact_call_trampoline) ++ FUNC(GLOBAL(GCC_shcompact_call_trampoline)) + GLOBAL(GCC_shcompact_call_trampoline): + ptabs/l r0, tr0 /* Prepare to call the actual function. */ + movi ((datalabel LOCAL(ct_main_table) - 31 * 2) >> 16) & 65535, r0 +@@ -2290,6 +2440,8 @@ + shari r2, 32, r2 + #endif + blink tr0, r63 ++ ++ ENDFUNC(GLOBAL(GCC_shcompact_call_trampoline)) + #endif /* L_shcompact_call_trampoline */ + + #ifdef L_shcompact_return_trampoline +@@ -2302,6 +2454,7 @@ + .section .text..SHmedia32, "ax" + .align 2 + .global GLOBAL(GCC_shcompact_return_trampoline) ++ FUNC(GLOBAL(GCC_shcompact_return_trampoline)) + GLOBAL(GCC_shcompact_return_trampoline): + ptabs/l r18, tr0 + #if __LITTLE_ENDIAN__ +@@ -2313,6 +2466,8 @@ + #endif + or r3, r2, r2 + blink tr0, r63 ++ ++ ENDFUNC(GLOBAL(GCC_shcompact_return_trampoline)) + #endif /* L_shcompact_return_trampoline */ + + #ifdef L_shcompact_incoming_args +@@ -2367,6 +2522,7 @@ + actual bit pattern. */ + + .global GLOBAL(GCC_shcompact_incoming_args) ++ FUNC(GLOBAL(GCC_shcompact_incoming_args)) + GLOBAL(GCC_shcompact_incoming_args): + ptabs/l r18, tr0 /* Prepare to return. */ + shlri r17, 32, r0 /* Load the cookie. */ +@@ -2519,6 +2675,7 @@ + LOCAL(ia_return): /* Return. */ + blink tr0, r63 + LOCAL(ia_end_of_push_seq): /* Label used to compute the first push instruction. */ ++ ENDFUNC(GLOBAL(GCC_shcompact_incoming_args)) + #endif /* L_shcompact_incoming_args */ + #endif + #if __SH5__ +@@ -2530,6 +2687,7 @@ + #endif + .align 3 /* It is copied in units of 8 bytes in SHmedia mode. */ + .global GLOBAL(GCC_nested_trampoline) ++ FUNC(GLOBAL(GCC_nested_trampoline)) + GLOBAL(GCC_nested_trampoline): + .mode SHmedia + ptrel/u r63, tr0 +@@ -2546,6 +2704,8 @@ + ld.l r0, 28, r1 + #endif + blink tr1, r63 ++ ++ ENDFUNC(GLOBAL(GCC_nested_trampoline)) + #endif /* L_nested_trampoline */ + #endif /* __SH5__ */ + #if __SH5__ == 32 +@@ -2555,6 +2715,7 @@ + .align 2 + #ifndef __SH4_NOFPU__ + .global GLOBAL(GCC_push_shmedia_regs) ++ FUNC(GLOBAL(GCC_push_shmedia_regs)) + GLOBAL(GCC_push_shmedia_regs): + addi.l r15, -14*8, r15 + fst.d r15, 13*8, dr62 +@@ -2573,6 +2734,7 @@ + fst.d r15, 0*8, dr36 + #endif + .global GLOBAL(GCC_push_shmedia_regs_nofpu) ++ FUNC(GLOBAL(GCC_push_shmedia_regs_nofpu)) + GLOBAL(GCC_push_shmedia_regs_nofpu): + ptabs/l r18, tr0 + addi.l r15, -27*8, r15 +@@ -2608,8 +2770,13 @@ + st.q r15, 0*8, r28 + blink tr0, r63 + ++#ifndef __SH4_NOFPU__ ++ ENDFUNC(GLOBAL(GCC_push_shmedia_regs)) ++#endif ++ ENDFUNC(GLOBAL(GCC_push_shmedia_regs_nofpu)) + #ifndef __SH4_NOFPU__ + .global GLOBAL(GCC_pop_shmedia_regs) ++ FUNC(GLOBAL(GCC_pop_shmedia_regs)) + GLOBAL(GCC_pop_shmedia_regs): + pt .L0, tr1 + movi 41*8, r0 +@@ -2630,6 +2797,7 @@ + blink tr1, r63 + #endif + .global GLOBAL(GCC_pop_shmedia_regs_nofpu) ++ FUNC(GLOBAL(GCC_pop_shmedia_regs_nofpu)) + GLOBAL(GCC_pop_shmedia_regs_nofpu): + movi 27*8, r0 + .L0: +@@ -2666,5 +2834,10 @@ + ld.q r15, 0*8, r28 + add.l r15, r0, r15 + blink tr0, r63 ++ ++#ifndef __SH4_NOFPU__ ++ ENDFUNC(GLOBAL(GCC_pop_shmedia_regs)) ++#endif ++ ENDFUNC(GLOBAL(GCC_pop_shmedia_regs_nofpu)) + #endif /* __SH5__ == 32 */ + #endif /* L_push_pop_shmedia_regs */ diff --git a/patches/gcc/3.3.3/sh-pic-set_fpscr-gcc-3.3.2.patch b/patches/gcc/3.3.3/sh-pic-set_fpscr-gcc-3.3.2.patch new file mode 100644 index 00000000..2a9d592b --- /dev/null +++ b/patches/gcc/3.3.3/sh-pic-set_fpscr-gcc-3.3.2.patch @@ -0,0 +1,67 @@ +See http://gcc.gnu.org/PR11901 +Should fix +make[2]: *** [/gcc-3.3-glibc-2.3.2/build-glibc/elf/check-textrel.out] Error 1 +in glibc's "make tests". + +Note: this patch is named +sh-pic-set_fpscr-gcc-3.3.2.patch +and must be applied after +sh-lib1funcs_sizeAndType.patch +but that'll happen naturally if you apply them in alphabetical order. + +------------- + +Date: Wed, 30 Jul 2003 12:03:01 +0900 +From: kaz Kojima <kkojima@rr.iij4u.or.jp> +Subject: [linux-sh:02916] Re: Writing PIC version of __udivsi3_i4? (was: Re: "make tests" fails + with "libc.so: text relocations used" in glibc-2.3.2 for sh4) +To: dank@kegel.com +Cc: linux-sh@m17n.org +Message-Id: <200307300255.h6U2tB906928@r-rr.iij4u.or.jp> + +> I'll try to write the PIC version of it, + +Dan, does the attached patch work for you? + +Regards, + kaz +-- +diff -u3prN ORIG/gcc/gcc/config/sh/lib1funcs.asm LOCAL/gcc/gcc/config/sh/lib1funcs.asm +--- ORIG/gcc/gcc/config/sh/lib1funcs.asm Thu Jun 19 07:38:59 2003 ++++ gcc-3.3.2/gcc/config/sh/lib1funcs.asm Wed Jul 30 11:08:49 2003 +@@ -1936,7 +1944,17 @@ GLOBAL(moddi3): + FUNC(GLOBAL(set_fpscr)) + GLOBAL(set_fpscr): + lds r4,fpscr ++#ifdef __PIC__ ++ mov.l r12,@-r15 ++ mova LOCAL(set_fpscr_L0),r0 ++ mov.l LOCAL(set_fpscr_L0),r12 ++ add r0,r12 ++ mov.l LOCAL(set_fpscr_L1),r0 ++ mov.l @(r0,r12),r1 ++ mov.l @r15+,r12 ++#else + mov.l LOCAL(set_fpscr_L1),r1 ++#endif + swap.w r4,r0 + or #24,r0 + #ifndef FMOVD_WORKS +@@ -1964,8 +1982,15 @@ GLOBAL(set_fpscr): + mov.l r3,@(4,r1) + #endif + .align 2 ++#ifdef __PIC__ ++LOCAL(set_fpscr_L0): ++ .long _GLOBAL_OFFSET_TABLE_ ++LOCAL(set_fpscr_L1): ++ .long GLOBAL(fpscr_values@GOT) ++#else + LOCAL(set_fpscr_L1): + .long GLOBAL(fpscr_values) ++#endif + + ENDFUNC(GLOBAL(set_fpscr)) + #ifndef NO_FPSCR_VALUES + + diff --git a/patches/gcc/3.3.3/thunk3.patch b/patches/gcc/3.3.3/thunk3.patch new file mode 100644 index 00000000..7974a0c0 --- /dev/null +++ b/patches/gcc/3.3.3/thunk3.patch @@ -0,0 +1,23 @@ +Fixes +FAIL: g++.jason/thunk3.C (test for excess errors) +on sh4-unknown-linux-gnu. + +Does any sh variant *not* use the generic thunk support? If so, the patch should be +more cautious. As it is, it excludes all sh processors from this test. + +Index: thunk3.C +=================================================================== +RCS file: /cvsroot/gcc/gcc/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C,v +retrieving revision 1.13 +diff -u -d -u -r1.13 thunk3.C +--- gcc-ss-3_3-20030714/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C.old 25 Mar 2002 17:57:03 -0000 1.13 ++++ gcc-ss-3_3-20030714/gcc/testsuite/g++.old-deja/g++.jason/thunk3.C 20 Jul 2003 16:57:38 -0000 +@@ -2,7 +2,7 @@ + // Note that this will break on any target that uses the generic thunk + // support, because it doesn't support variadic functions. + +-// excess errors test - XFAIL mips*-*-* rs6000-*-* powerpc-*-eabi m68k-*-coff m68k-motorola-sysv m88k-motorola-sysv3 mn10300-*-* mn10200-*-* v850-*-* sh-*-* sh64-*-* h8*-*-* xtensa-*-* ++// excess errors test - XFAIL mips*-*-* rs6000-*-* powerpc-*-eabi m68k-*-coff m68k-motorola-sysv m88k-motorola-sysv3 mn10300-*-* mn10200-*-* v850-*-* sh*-*-* h8*-*-* xtensa-*-* + + #include <stdarg.h> + diff --git a/patches/gcc/3.3.4/gcc-3.3.4-arm-bigendian.patch b/patches/gcc/3.3.4/gcc-3.3.4-arm-bigendian.patch new file mode 100644 index 00000000..0816b83e --- /dev/null +++ b/patches/gcc/3.3.4/gcc-3.3.4-arm-bigendian.patch @@ -0,0 +1,62 @@ +diff -urN gcc-3.3.4.orig/gcc/config/arm/linux-elf.h gcc-3.3.4/gcc/config/arm/linux-elf.h +--- gcc-3.3.4.orig/gcc/config/arm/linux-elf.h 2004-03-30 22:43:45.000000000 +0200 ++++ gcc-3.3.4/gcc/config/arm/linux-elf.h 2004-08-20 02:13:02.969084177 +0200 +@@ -30,17 +30,31 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS | TARGET_ENDIAN_DEFAULT) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -88,7 +102,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #define TARGET_OS_CPP_BUILTINS() \ +diff -urN gcc-3.3.4.orig/gcc/config.gcc gcc-3.3.4/gcc/config.gcc +--- gcc-3.3.4.orig/gcc/config.gcc 2004-04-29 06:42:47.000000000 +0200 ++++ gcc-3.3.4/gcc/config.gcc 2004-08-20 02:11:04.326143343 +0200 +@@ -699,6 +699,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $machine in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/patches/gcc/3.3.4/gcc-3.3.4-arm-pr22528.patch b/patches/gcc/3.3.4/gcc-3.3.4-arm-pr22528.patch new file mode 100644 index 00000000..0611e2c3 --- /dev/null +++ b/patches/gcc/3.3.4/gcc-3.3.4-arm-pr22528.patch @@ -0,0 +1,71 @@ +From http://gcc.gnu.org/ml/gcc-patches/2003-11/msg00832.html, by +Richard Earnshaw. Fixes http://gcc.gnu.org/PR22528 + +--- gcc-3.3.4/gcc/config/arm/arm.md.orig 2004-03-30 22:43:44.000000000 +0200 ++++ gcc-3.3.4/gcc/config/arm/arm.md 2005-08-15 12:21:55.000000000 +0200 +@@ -4275,7 +4275,7 @@ + (set (match_dup 2) + (ashiftrt:SI (match_operand 0 "" "") (const_int 8))) + ;; store the high byte +- (set (match_dup 4) (subreg:QI (match_dup 2) 0))] ;explicit subreg safe ++ (set (match_dup 4) (match_dup 5))] + "TARGET_ARM" + " + { +@@ -4291,7 +4291,8 @@ + operands[1] = adjust_address (operands[1], QImode, 0); + operands[3] = gen_lowpart (QImode, operands[0]); + operands[0] = gen_lowpart (SImode, operands[0]); +- operands[2] = gen_reg_rtx (SImode); ++ operands[2] = gen_reg_rtx (SImode); ++ operands[5] = gen_lowpart (QImode, operands[2]); + }" + ) + +@@ -4299,7 +4300,7 @@ + [(set (match_dup 4) (match_dup 3)) + (set (match_dup 2) + (ashiftrt:SI (match_operand 0 "" "") (const_int 8))) +- (set (match_operand 1 "" "") (subreg:QI (match_dup 2) 3))] ++ (set (match_operand 1 "" "") (match_dup 5))] + "TARGET_ARM" + " + { +@@ -4316,13 +4317,14 @@ + operands[3] = gen_lowpart (QImode, operands[0]); + operands[0] = gen_lowpart (SImode, operands[0]); + operands[2] = gen_reg_rtx (SImode); ++ operands[5] = gen_lowpart (QImode, operands[2]); + }" + ) + + ;; Subroutine to store a half word integer constant into memory. + (define_expand "storeinthi" + [(set (match_operand 0 "" "") +- (subreg:QI (match_operand 1 "" "") 0)) ++ (match_operand 1 "" "")) + (set (match_dup 3) (match_dup 2))] + "TARGET_ARM" + " +@@ -4363,6 +4365,7 @@ + operands[3] = adjust_address (op0, QImode, 1); + operands[0] = adjust_address (operands[0], QImode, 0); + operands[2] = gen_lowpart (QImode, operands[2]); ++ operands[1] = gen_lowpart (QImode, operands[1]); + }" + ) + +@@ -4682,11 +4685,12 @@ + (set (match_dup 3) + (ashiftrt:SI (match_dup 2) (const_int 16))) + (set (match_operand:HI 0 "s_register_operand" "") +- (subreg:HI (match_dup 3) 0))] ++ (match_dup 4))] + "TARGET_ARM" + " + operands[2] = gen_reg_rtx (SImode); + operands[3] = gen_reg_rtx (SImode); ++ operands[4] = gen_lowpart (HImode, operands[3]); + " + ) + diff --git a/patches/gcc/3.3.4/gcc-3.3.4-libstdcxx-sh.patch b/patches/gcc/3.3.4/gcc-3.3.4-libstdcxx-sh.patch new file mode 100644 index 00000000..4f21be33 --- /dev/null +++ b/patches/gcc/3.3.4/gcc-3.3.4-libstdcxx-sh.patch @@ -0,0 +1,38 @@ +Date: Tue, 06 Jul 2004 10:40:57 +0900 (JST) +Message-Id: <20040706.104057.48529182.kkojima@rr.iij4u.or.jp> +To: dank@kegel.com +Cc: linux-sh@m17n.org, linuxsh-dev@lists.sourceforge.net +Subject: gcc-3.4.1 (Was: The current kernel for a Jornada 680 SH3) +From: Kaz Kojima <kkojima@rr.iij4u.or.jp> +In-Reply-To: <20040529.175014.48668611.kkojima@rr.iij4u.or.jp> +References: <20040528.125858.50336810.kkojima@rr.iij4u.or.jp> + <40B8205D.8030200@kegel.com> + <20040529.175014.48668611.kkojima@rr.iij4u.or.jp> + +Hi, + +... + +BTW, gcc-3.3.4 was also released and there is a bad news :-( Someone +reverted wrongly a configury patch against libstdc++ for sh-linux at +the last moment. We have to regenerate gcc-3.3.4/libstdc++-v3/configure +with autoconf 2.13 or apply the one-line patch below manually: + +--- gcc-3.3.4-orig/libstdc++-v3/configure 2004-06-01 09:45:44.000000000 +0900 ++++ gcc-3.3.4/libstdc++-v3/configure 2004-06-29 22:38:05.000000000 +0900 +@@ -2009,7 +2009,7 @@ irix5* | irix6*) + # This must be Linux ELF. + linux-gnu*) + case $host_cpu in +- alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* ) ++ alpha* | hppa* | i*86 | powerpc* | sparc* | ia64* | sh* ) + lt_cv_deplibs_check_method=pass_all ;; + *) + # glibc up to 2.1.1 does not perform some relocations on ARM + + +Regards, + kaz + + + diff --git a/patches/gcc/3.3.4/gcc-3.3.4-ppc-asm-spec.patch b/patches/gcc/3.3.4/gcc-3.3.4-ppc-asm-spec.patch new file mode 100644 index 00000000..9e459432 --- /dev/null +++ b/patches/gcc/3.3.4/gcc-3.3.4-ppc-asm-spec.patch @@ -0,0 +1,86 @@ +Based on gcc-3.4.0/gcc-3.3.3h-ppc-asm-spec.patch + +Fixes the following errors when building gcc for ppc7450: + +/tmp/ccj38uQs.s: Assembler messages: +/tmp/ccj38uQs.s:4370: Error: Unrecognized opcode: `mfvrsave' +/tmp/ccj38uQs.s:4404: Error: Unrecognized opcode: `stvx' +/tmp/ccj38uQs.s:4571: Error: Unrecognized opcode: `lvx' +/tmp/ccj38uQs.s:4572: Error: Unrecognized opcode: `mtvrsave' +make[2]: *** [libgcc/./unwind-dw2.o] Error 1 +make[2]: Leaving directory `/opt/crosstool-0.28-rc35/build/powerpc-7450-linux-gnu/gcc-3.3.4-glibc-2.3.2/build-gcc-core/gcc' +make[1]: *** [stmp-multilib] Error 2 +make[1]: Leaving directory `/opt/crosstool-0.28-rc35/build/powerpc-7450-linux-gnu/gcc-3.3.4-glibc-2.3.2/build-gcc-core/gcc' +make: *** [all-gcc] Error 2 + +Note that the "-mcpu=7450" option must appear on the "gcc" command line in +order for "-maltivec" to be passed to the assembler. Or, "-maltivec" itself +may be passed to the "gcc" command. + +Contributed by Tom Warzeka <waz@quahog.npt.nuwc.navy.mil> + +=================================================================== +--- gcc-3.3.4/gcc/config/rs6000/rs6000.h~ 2004-02-01 23:40:49.000000000 -0500 ++++ gcc-3.3.4/gcc/config/rs6000/rs6000.h 2004-08-18 14:15:57.000000000 -0400 +@@ -52,23 +52,29 @@ + "%{!mcpu*: \ + %{mpower: %{!mpower2: -mpwr}} \ + %{mpower2: -mpwrx} \ +- %{mpowerpc*: -mppc} \ ++ %{mpowerpc64*: -mppc64} \ ++ %{!mpowerpc64*: %{mpowerpc*: -mppc}} \ + %{mno-power: %{!mpowerpc*: -mcom}} \ +- %{!mno-power: %{!mpower2: %(asm_default)}}} \ ++ %{!mno-power: %{!mpower*: %(asm_default)}}} \ + %{mcpu=common: -mcom} \ + %{mcpu=power: -mpwr} \ + %{mcpu=power2: -mpwrx} \ +-%{mcpu=power3: -m604} \ ++%{mcpu=power3: -mppc64} \ + %{mcpu=power4: -mpower4} \ ++%{mcpu=power5: -mpower4} \ + %{mcpu=powerpc: -mppc} \ + %{mcpu=rios: -mpwr} \ + %{mcpu=rios1: -mpwr} \ + %{mcpu=rios2: -mpwrx} \ + %{mcpu=rsc: -mpwr} \ + %{mcpu=rsc1: -mpwr} \ ++%{mcpu=rs64a: -mppc64} \ + %{mcpu=401: -mppc} \ + %{mcpu=403: -m403} \ + %{mcpu=405: -m405} \ ++%{mcpu=405fp: -m405} \ ++%{mcpu=440: -m440} \ ++%{mcpu=440fp: -m440} \ + %{mcpu=505: -mppc} \ + %{mcpu=601: -m601} \ + %{mcpu=602: -mppc} \ +@@ -77,18 +83,23 @@ + %{mcpu=ec603e: -mppc} \ + %{mcpu=604: -mppc} \ + %{mcpu=604e: -mppc} \ +-%{mcpu=620: -mppc} \ +-%{mcpu=630: -m604} \ ++%{mcpu=620: -mppc64} \ ++%{mcpu=630: -mppc64} \ + %{mcpu=740: -mppc} \ +-%{mcpu=7400: -mppc} \ +-%{mcpu=7450: -mppc} \ + %{mcpu=750: -mppc} \ ++%{mcpu=G3: -mppc} \ ++%{mcpu=7400: -mppc -maltivec} \ ++%{mcpu=7450: -mppc -maltivec} \ ++%{mcpu=G4: -mppc -maltivec} \ + %{mcpu=801: -mppc} \ + %{mcpu=821: -mppc} \ + %{mcpu=823: -mppc} \ + %{mcpu=860: -mppc} \ ++%{mcpu=970: -mpower4 -maltivec} \ ++%{mcpu=G5: -mpower4 -maltivec} \ + %{mcpu=8540: -me500} \ +-%{maltivec: -maltivec}" ++%{maltivec: -maltivec} \ ++-many" + + #define CPP_DEFAULT_SPEC "" + diff --git a/patches/gcc/3.3.4/gcc-3.3.4-trap-posix.patch b/patches/gcc/3.3.4/gcc-3.3.4-trap-posix.patch new file mode 100644 index 00000000..eef35b5a --- /dev/null +++ b/patches/gcc/3.3.4/gcc-3.3.4-trap-posix.patch @@ -0,0 +1,44 @@ +# +# Submitted-By: Marc Kleine-Budde <mkl@pengutronix.de>, 2005-04-20 +# +# Error: +# +# creating libintl.h +# Configuring etc... +# loading cache ../config.cache +# checking for a BSD compatible install... (cached) /usr/bin/install -c +# creating ./config.status +# creating Makefile +# trap: usage: trap [-lp] [[arg] signal_spec ...] +# +# Description: +# +# non-posix conform usage of trap causes bash >= 3.0 to fail +# e.g.: http://sourceware.org/ml/crossgcc/2004-12/msg00132.html +# +# Status: +# +# fixed in gcc >= 3.3.5 +# backport of gcc-3.3.5 fix +# +diff -ruN gcc-3.3.4-orig/configure gcc-3.3.4/configure +--- gcc-3.3.4-orig/configure 2002-09-29 18:11:24.000000000 +0200 ++++ gcc-3.3.4/configure 2005-04-20 21:11:30.000000000 +0200 +@@ -697,7 +697,7 @@ + if test -f skip-this-dir; then + # Perform the same cleanup as the trap handler, minus the "exit 1" of course, + # and reset the trap handler. +- trap 0 ++ trap '' 0 + rm -rf Makefile* ${tmpdir} + # Execute the final clean-up actions + ${config_shell} skip-this-dir +@@ -1596,7 +1596,7 @@ + # Perform the same cleanup as the trap handler, minus the "exit 1" of course, + # and reset the trap handler. + rm -rf ${tmpdir} +-trap 0 ++trap '' 0 + + exit 0 + diff --git a/patches/gcc/3.3.5/gcc-3.3.4-arm-bigendian.patch b/patches/gcc/3.3.5/gcc-3.3.4-arm-bigendian.patch new file mode 100644 index 00000000..0816b83e --- /dev/null +++ b/patches/gcc/3.3.5/gcc-3.3.4-arm-bigendian.patch @@ -0,0 +1,62 @@ +diff -urN gcc-3.3.4.orig/gcc/config/arm/linux-elf.h gcc-3.3.4/gcc/config/arm/linux-elf.h +--- gcc-3.3.4.orig/gcc/config/arm/linux-elf.h 2004-03-30 22:43:45.000000000 +0200 ++++ gcc-3.3.4/gcc/config/arm/linux-elf.h 2004-08-20 02:13:02.969084177 +0200 +@@ -30,17 +30,31 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS | TARGET_ENDIAN_DEFAULT) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -88,7 +102,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #define TARGET_OS_CPP_BUILTINS() \ +diff -urN gcc-3.3.4.orig/gcc/config.gcc gcc-3.3.4/gcc/config.gcc +--- gcc-3.3.4.orig/gcc/config.gcc 2004-04-29 06:42:47.000000000 +0200 ++++ gcc-3.3.4/gcc/config.gcc 2004-08-20 02:11:04.326143343 +0200 +@@ -699,6 +699,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $machine in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/patches/gcc/3.3.5/gcc-3.3.4-arm-pr22528.patch b/patches/gcc/3.3.5/gcc-3.3.4-arm-pr22528.patch new file mode 100644 index 00000000..0611e2c3 --- /dev/null +++ b/patches/gcc/3.3.5/gcc-3.3.4-arm-pr22528.patch @@ -0,0 +1,71 @@ +From http://gcc.gnu.org/ml/gcc-patches/2003-11/msg00832.html, by +Richard Earnshaw. Fixes http://gcc.gnu.org/PR22528 + +--- gcc-3.3.4/gcc/config/arm/arm.md.orig 2004-03-30 22:43:44.000000000 +0200 ++++ gcc-3.3.4/gcc/config/arm/arm.md 2005-08-15 12:21:55.000000000 +0200 +@@ -4275,7 +4275,7 @@ + (set (match_dup 2) + (ashiftrt:SI (match_operand 0 "" "") (const_int 8))) + ;; store the high byte +- (set (match_dup 4) (subreg:QI (match_dup 2) 0))] ;explicit subreg safe ++ (set (match_dup 4) (match_dup 5))] + "TARGET_ARM" + " + { +@@ -4291,7 +4291,8 @@ + operands[1] = adjust_address (operands[1], QImode, 0); + operands[3] = gen_lowpart (QImode, operands[0]); + operands[0] = gen_lowpart (SImode, operands[0]); +- operands[2] = gen_reg_rtx (SImode); ++ operands[2] = gen_reg_rtx (SImode); ++ operands[5] = gen_lowpart (QImode, operands[2]); + }" + ) + +@@ -4299,7 +4300,7 @@ + [(set (match_dup 4) (match_dup 3)) + (set (match_dup 2) + (ashiftrt:SI (match_operand 0 "" "") (const_int 8))) +- (set (match_operand 1 "" "") (subreg:QI (match_dup 2) 3))] ++ (set (match_operand 1 "" "") (match_dup 5))] + "TARGET_ARM" + " + { +@@ -4316,13 +4317,14 @@ + operands[3] = gen_lowpart (QImode, operands[0]); + operands[0] = gen_lowpart (SImode, operands[0]); + operands[2] = gen_reg_rtx (SImode); ++ operands[5] = gen_lowpart (QImode, operands[2]); + }" + ) + + ;; Subroutine to store a half word integer constant into memory. + (define_expand "storeinthi" + [(set (match_operand 0 "" "") +- (subreg:QI (match_operand 1 "" "") 0)) ++ (match_operand 1 "" "")) + (set (match_dup 3) (match_dup 2))] + "TARGET_ARM" + " +@@ -4363,6 +4365,7 @@ + operands[3] = adjust_address (op0, QImode, 1); + operands[0] = adjust_address (operands[0], QImode, 0); + operands[2] = gen_lowpart (QImode, operands[2]); ++ operands[1] = gen_lowpart (QImode, operands[1]); + }" + ) + +@@ -4682,11 +4685,12 @@ + (set (match_dup 3) + (ashiftrt:SI (match_dup 2) (const_int 16))) + (set (match_operand:HI 0 "s_register_operand" "") +- (subreg:HI (match_dup 3) 0))] ++ (match_dup 4))] + "TARGET_ARM" + " + operands[2] = gen_reg_rtx (SImode); + operands[3] = gen_reg_rtx (SImode); ++ operands[4] = gen_lowpart (HImode, operands[3]); + " + ) + diff --git a/patches/gcc/3.3.6/fix-fixincl.patch b/patches/gcc/3.3.6/fix-fixincl.patch new file mode 100644 index 00000000..7936b19b --- /dev/null +++ b/patches/gcc/3.3.6/fix-fixincl.patch @@ -0,0 +1,70 @@ +See http://gcc.gnu.org/PR22541 + +From: Dan Kegel + +When building gcc-3.4.3 or gcc-4.0.0 as a cross into a clean $PREFIX +(the only two I've tried like this), the configure script happily copies +the glibc include files from include to sys-include; here's the line +from the log file (with $PREFIX instead of the real prefix): + +Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include + +But later, when running fixincludes, it gives the error message + The directory that should contain system headers does not exist: + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include + +Nevertheless, it continues building; the header files it installs in + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include +do not include the boilerplate that would cause it to #include_next the +glibc headers in the system header directory. +Thus the resulting toolchain can't compile the following program: +#include <limits.h> +int x = PATH_MAX; +because its limits.h doesn't include the glibc header. + +That's not nice. I suspect the problem is that gcc/Makefile.in assumes that +it can refer to $PREFIX/i686-unknown-linux-gnu with the path + $PREFIX/lib/../i686-unknown-linux-gnu, but +that fails because the directory $PREFIX/lib doesn't exist during 'make all'; +it is only created later, during 'make install'. (Which makes this problem +confusing, since one only notices the breakage well after 'make install', +at which point the path configure complained about does exist, and has the +right stuff in it.) + +A possible fix is to replace the line in gcc/Makefile.in that says + SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ +with a version that gets rid of extra ..'s, e.g. + SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"` +(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq +for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.) + + +--- gcc-3.4.3/gcc/Makefile.in.foo 2005-05-20 11:41:39.000000000 -0700 ++++ gcc-3.4.3/gcc/Makefile.in 2005-05-20 12:08:46.000000000 -0700 +@@ -350,7 +350,10 @@ + CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@ + + # autoconf sets SYSTEM_HEADER_DIR to one of the above. +-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ ++# Purge it of unneccessary internal relative paths ++# to directories that might not exist yet. ++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta. ++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta` + + # Control whether to run fixproto and fixincludes. + STMP_FIXPROTO = @STMP_FIXPROTO@ +@@ -2532,11 +2535,13 @@ + $(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(gcc_tooldir) + + # Build fixed copies of system files. ++# Abort if no system headers available, unless building a crosscompiler. ++# FIXME: abort unless building --without-headers would be more accurate and less ugly + stmp-fixinc: fixinc.sh gsyslimits.h + @if test ! -d ${SYSTEM_HEADER_DIR}; then \ + echo The directory that should contain system headers does not exist: >&2 ; \ + echo " ${SYSTEM_HEADER_DIR}" >&2 ; \ +- if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \ ++ if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \ + then sleep 1; else exit 1; fi; \ + fi + rm -rf include; mkdir include diff --git a/patches/gcc/3.3.6/gcc-3.3.4-arm-bigendian.patch b/patches/gcc/3.3.6/gcc-3.3.4-arm-bigendian.patch new file mode 100644 index 00000000..0816b83e --- /dev/null +++ b/patches/gcc/3.3.6/gcc-3.3.4-arm-bigendian.patch @@ -0,0 +1,62 @@ +diff -urN gcc-3.3.4.orig/gcc/config/arm/linux-elf.h gcc-3.3.4/gcc/config/arm/linux-elf.h +--- gcc-3.3.4.orig/gcc/config/arm/linux-elf.h 2004-03-30 22:43:45.000000000 +0200 ++++ gcc-3.3.4/gcc/config/arm/linux-elf.h 2004-08-20 02:13:02.969084177 +0200 +@@ -30,17 +30,31 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS | TARGET_ENDIAN_DEFAULT) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -88,7 +102,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #define TARGET_OS_CPP_BUILTINS() \ +diff -urN gcc-3.3.4.orig/gcc/config.gcc gcc-3.3.4/gcc/config.gcc +--- gcc-3.3.4.orig/gcc/config.gcc 2004-04-29 06:42:47.000000000 +0200 ++++ gcc-3.3.4/gcc/config.gcc 2004-08-20 02:11:04.326143343 +0200 +@@ -699,6 +699,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $machine in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/patches/gcc/3.3.6/gcc-3.3.4-arm-pr22528.patch b/patches/gcc/3.3.6/gcc-3.3.4-arm-pr22528.patch new file mode 100644 index 00000000..0611e2c3 --- /dev/null +++ b/patches/gcc/3.3.6/gcc-3.3.4-arm-pr22528.patch @@ -0,0 +1,71 @@ +From http://gcc.gnu.org/ml/gcc-patches/2003-11/msg00832.html, by +Richard Earnshaw. Fixes http://gcc.gnu.org/PR22528 + +--- gcc-3.3.4/gcc/config/arm/arm.md.orig 2004-03-30 22:43:44.000000000 +0200 ++++ gcc-3.3.4/gcc/config/arm/arm.md 2005-08-15 12:21:55.000000000 +0200 +@@ -4275,7 +4275,7 @@ + (set (match_dup 2) + (ashiftrt:SI (match_operand 0 "" "") (const_int 8))) + ;; store the high byte +- (set (match_dup 4) (subreg:QI (match_dup 2) 0))] ;explicit subreg safe ++ (set (match_dup 4) (match_dup 5))] + "TARGET_ARM" + " + { +@@ -4291,7 +4291,8 @@ + operands[1] = adjust_address (operands[1], QImode, 0); + operands[3] = gen_lowpart (QImode, operands[0]); + operands[0] = gen_lowpart (SImode, operands[0]); +- operands[2] = gen_reg_rtx (SImode); ++ operands[2] = gen_reg_rtx (SImode); ++ operands[5] = gen_lowpart (QImode, operands[2]); + }" + ) + +@@ -4299,7 +4300,7 @@ + [(set (match_dup 4) (match_dup 3)) + (set (match_dup 2) + (ashiftrt:SI (match_operand 0 "" "") (const_int 8))) +- (set (match_operand 1 "" "") (subreg:QI (match_dup 2) 3))] ++ (set (match_operand 1 "" "") (match_dup 5))] + "TARGET_ARM" + " + { +@@ -4316,13 +4317,14 @@ + operands[3] = gen_lowpart (QImode, operands[0]); + operands[0] = gen_lowpart (SImode, operands[0]); + operands[2] = gen_reg_rtx (SImode); ++ operands[5] = gen_lowpart (QImode, operands[2]); + }" + ) + + ;; Subroutine to store a half word integer constant into memory. + (define_expand "storeinthi" + [(set (match_operand 0 "" "") +- (subreg:QI (match_operand 1 "" "") 0)) ++ (match_operand 1 "" "")) + (set (match_dup 3) (match_dup 2))] + "TARGET_ARM" + " +@@ -4363,6 +4365,7 @@ + operands[3] = adjust_address (op0, QImode, 1); + operands[0] = adjust_address (operands[0], QImode, 0); + operands[2] = gen_lowpart (QImode, operands[2]); ++ operands[1] = gen_lowpart (QImode, operands[1]); + }" + ) + +@@ -4682,11 +4685,12 @@ + (set (match_dup 3) + (ashiftrt:SI (match_dup 2) (const_int 16))) + (set (match_operand:HI 0 "s_register_operand" "") +- (subreg:HI (match_dup 3) 0))] ++ (match_dup 4))] + "TARGET_ARM" + " + operands[2] = gen_reg_rtx (SImode); + operands[3] = gen_reg_rtx (SImode); ++ operands[4] = gen_lowpart (HImode, operands[3]); + " + ) + diff --git a/patches/gcc/3.3/compat.exp.patch b/patches/gcc/3.3/compat.exp.patch new file mode 100644 index 00000000..763b8a18 --- /dev/null +++ b/patches/gcc/3.3/compat.exp.patch @@ -0,0 +1,37 @@ +Fixes the following problem when testing a cross-compiler: + +============================================ +Testing g++.dg/compat/abi/bitfield1, +... +Invoking the compiler as /crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/build-gcc/gcc/testsuite/../g++ ... +/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/gcc/testsuite/g++.dg/compat/abi/bitfield1_main.C +pid is 16028 -16028 +compiler exited with status 1 +output is: +sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/powerpc-750-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian +/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/build-gcc/gcc/testsuite/../g++: error while loading shared libraries: /opt/cegl-2.0/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/powerpc-750-linux-gnu/./lib/libc.so.6: ELF file data encoding not little-endian + +FAIL: g++.dg/compat/abi/bitfield1 main_tst.o compile +============================================ + +--- gcc-3.3/gcc/testsuite/g++.dg/compat/compat.exp.old Thu Oct 17 17:22:57 2002 ++++ gcc-3.3/gcc/testsuite/g++.dg/compat/compat.exp Mon Jul 14 10:59:19 2003 +@@ -42,11 +42,13 @@ + proc compat-fix-library-path { } { + global ld_library_path + +- # See comments in lib/g++.exp for why this is needed. +- setenv LD_LIBRARY_PATH $ld_library_path +- setenv SHLIB_PATH $ld_library_path +- setenv LD_LIBRARYN32_PATH $ld_library_path +- setenv LD_LIBRARY64_PATH $ld_library_path ++ if {![is_remote target]} { ++ # See comments in lib/g++.exp for why this is needed. ++ setenv LD_LIBRARY_PATH $ld_library_path ++ setenv SHLIB_PATH $ld_library_path ++ setenv LD_LIBRARYN32_PATH $ld_library_path ++ setenv LD_LIBRARY64_PATH $ld_library_path ++ } + } + + # diff --git a/patches/gcc/3.3/config.sub.patch b/patches/gcc/3.3/config.sub.patch new file mode 100644 index 00000000..928f9115 --- /dev/null +++ b/patches/gcc/3.3/config.sub.patch @@ -0,0 +1,72 @@ +When configuring a s390->s390 or cris->cris crosscompiler +(ok, I haven't hit this yet, but one of these days I'll get me an account +on an s390, and then I'll need this patch :-), you'll get the +following error: + ++ /build/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/gcc-3.3/configure +--target=s390-unknown-linux-gnu --host=s390-host_unknown-linux-gnu +--prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2 +--enable-languages=c +--with-local-prefix=/result/s390-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/s390- +unknown-linux-gnu --enable-threads=no --without-headers --with-newlib +--disable-shared +... +*** --with-headers is only supported when cross compiling + +This error pops up only when you're using Daniel Jacobowitz's technique +of slightly changing the target and host tuples to make them different +enough to force gcc's build system to not try to pull in system libraries +or headers. This technique is needed e.g. to build an x86 -> x86 +cross-compiler. +(The LFS developers ran into the same bug that prompted me to use +this technique; they point people who run into it to +http://linuxfromscratch.org/~greg/pure_lfs.txt, which is a different +way of avoiding this problem. I think the tuple tweak is the way to go, though.) + +config-patches@gnu.org rejected this patch, on the grounds that there +is only one vendor of each of those two architectures, so the +canonicalization is by definition correct. When I pointed out the +difficulty this causes for people building s390 -> s390 or +cris -> cris compilers that are incompatible with the system +libraries and thus must be built like cross-compilers, he grumped and said +"autoconf should let you specify a cross-compiler in some other way than +comparing tuple strings". + + + +--- gcc-3.3/config.sub.old Sun Jun 8 20:38:47 2003 ++++ gcc-3.3/config.sub Sun Jun 8 20:40:34 2003 +@@ -433,9 +433,12 @@ + crds | unos) + basic_machine=m68k-crds + ;; +- cris | cris-* | etrax*) ++ cris | etrax*) + basic_machine=cris-axis + ;; ++ cris-*) ++ basic_machine=cris-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; +@@ -820,11 +823,17 @@ + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; +- s390 | s390-*) ++ s390) + basic_machine=s390-ibm + ;; +- s390x | s390x-*) ++ s390-*) ++ basic_machine=s390-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ s390x) + basic_machine=s390x-ibm ++ ;; ++ s390x-*) ++ basic_machine=s390x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sa29200) + basic_machine=a29k-amd diff --git a/patches/gcc/3.3/gcc-3.2.3-g++.exp.patch b/patches/gcc/3.3/gcc-3.2.3-g++.exp.patch new file mode 100644 index 00000000..0de46fc4 --- /dev/null +++ b/patches/gcc/3.3/gcc-3.2.3-g++.exp.patch @@ -0,0 +1,98 @@ +g++ testsuite fixes for cross-compilers, Dan Kegel, Ixia Communications, 12 July 2003 + +The first hunk fixes the error + +/testsuite_flags: /testsuite_flags: No such file or directory + while executing +"exec sh ${odir_v3}/testsuite_flags --build-includes" + (procedure "g++_include_flags" line 21) + invoked from within +"g++_include_flags [get_multilibs] " + (procedure "g++_init" line 63) + invoked from within +"${tool}_init $test_file_name" + (procedure "runtest" line 19) + invoked from within +"runtest $test_name" + ("foreach" body line 42) + invoked from within +... +make[1]: [check-g++] Error 1 (ignored) + +The fix isn't especially pretty, but it worked for me, and can't hurt the +more common native compiler case. Maybe someone who knows the code better +can come up with a better fix. + +The second hunk fixes the error + +sh: error while loading shared libraries: /opt/cegl-2.0/powerpc-405-linux-gnu/gcc-3.2.3-glibc-2.2.5/powerpc-405-linux-gnu/./lib/libdl.so.2: ELF file data encoding not little-endian + +when trying to compile g++ testcases (!); setting up +the shared library environment when running crosstests of g++ +should either be done by a special board file, or by +setting up a remote chroot environment (see http://kegel.com/crosstool), +not by blithely setting LD_LIBRARY_PATH on the local system. + +--- gcc-3.2.3/gcc/testsuite/lib/g++.exp.old Fri Jul 11 15:42:47 2003 ++++ gcc-3.2.3/gcc/testsuite/lib/g++.exp Sat Jul 12 12:57:07 2003 +@@ -72,6 +72,8 @@ + # + proc g++_include_flags { paths } { + global srcdir ++ global objdir ++ global target_triplet + global HAVE_LIBSTDCXX_V3 + global TESTING_IN_BUILD_TREE + +@@ -90,6 +92,20 @@ + + if { ${HAVE_LIBSTDCXX_V3} } { + set odir_v3 [lookfor_file ${gccpath} libstdc++-v3] ++ if { $odir_v3 == "" } { ++ verbose "g++_include_flags: couldn't find libstdc++-v3 on first try, now looking in build directory $objdir" ++ # first assume no multilibs ++ set odir_v3 [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"] ++ } ++ if { $odir_v3 == "" } { ++ verbose "g++_include_flags: couldn't find libstdc++-v3 on second try, trying multilib" ++ # assume multilib only one level deep ++ set multisub [file tail $gccpath] ++ set odir_v3 [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"] ++ } ++ if { $odir_v3 == "" } { ++ error "Can't find libstdc++-v3" ++ } + append flags [exec sh ${odir_v3}/testsuite_flags --build-includes] + } else { + set odir_v2 [lookfor_file ${gccpath} libstdc++] +@@ -192,16 +192,20 @@ + } + } + +- # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but +- # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH +- # (for the 64-bit ABI). The right way to do this would be to modify +- # unix.exp -- but that's not an option since it's part of DejaGNU +- # proper, so we do it here. We really only need to do +- # this on IRIX, but it shouldn't hurt to do it anywhere else. +- setenv LD_LIBRARY_PATH $ld_library_path +- setenv SHLIB_PATH $ld_library_path +- setenv LD_LIBRARYN32_PATH $ld_library_path +- setenv LD_LIBRARY64_PATH $ld_library_path ++ if {![is_remote target]} { ++ # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but ++ # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH ++ # (for the 64-bit ABI). The right way to do this would be to modify ++ # unix.exp -- but that's not an option since it's part of DejaGNU ++ # proper, so we do it here. We really only need to do ++ # this on IRIX, but it shouldn't hurt to do it anywhere else. ++ ++ # Doing this causes us to be unable to run cross-compilers. ++ setenv LD_LIBRARY_PATH $ld_library_path ++ setenv SHLIB_PATH $ld_library_path ++ setenv LD_LIBRARYN32_PATH $ld_library_path ++ setenv LD_LIBRARY64_PATH $ld_library_path ++ } + + return "$flags" + } diff --git a/patches/gcc/3.3/gcc-3.3-libstdc++-v3-dg.exp.patch b/patches/gcc/3.3/gcc-3.3-libstdc++-v3-dg.exp.patch new file mode 100644 index 00000000..aafc1306 --- /dev/null +++ b/patches/gcc/3.3/gcc-3.3-libstdc++-v3-dg.exp.patch @@ -0,0 +1,54 @@ +Without this patch, the command + +RUNTESTFLAGS=--target=powerpc-750-linux-gnu -v -v -v -v make check-target-libstdc++-v3 + +fails in two ways: +1. the -L option meant to locate the testsuite directory is incorrect, and +2. the wrong compiler is invoked, causing all sorts of havoc, not least of which +is the native compiler is invoked when we really wanted to invoke the cross-compiler +we just built. + +Here's an example log of the problem in action. Every testcase fails, this shows just one: +------------- +Invoking the compiler as g++ -ggdb3 -DDEBUG_ASSERT -I/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite /home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc -g -O2 -DDEBUG_ASSERT -L/testsuite -lv3test -lm -o ./binders.exe +compiler exited with status 1 +output is: +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h: In method `void binder2nd<mem_fun1_ref_t<void,Elem,int> >::operator ()(const Elem &) const':^M +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_algo.h:83: instantiated from `for_each<Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> > >(Elem *, Elem *, binder2nd<mem_fun1_ref_t<void,Elem,int> >)'^M +/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.12/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.2.5/gcc-3.3/libstdc++-v3/testsuite/20_util/binders.cc:43: instantiated from here^M +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:224: conversion from `const Elem' to `Elem &' discards qualifiers^M +/usr/lib/gcc-lib/i386-linux/2.95.4/../../../../include/g++-3/stl_function.h:622: in passing argument 1 of `mem_fun1_ref_t<void,Elem,int>::operator ()(Elem &, int) const'^M +... +FAIL: 20_util/binders.cc (test for excess errors) +WARNING: 20_util/binders.cc compilation failed to produce executable +------------- + +And here's the patch. I'm not happy with it, and it probably gets some cases wrong, +but it seems to work for the common native case and for my cross-compiler case. + +--- gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp.old Sun Jul 13 10:42:01 2003 ++++ gcc-3.3/libstdc++-v3/testsuite/lib/libstdc++-v3-dg.exp Sun Jul 13 11:39:54 2003 +@@ -46,8 +46,23 @@ + global gluefile wrap_flags + global ld_library_path + global tool_root_dir ++ global target_triplet + + set blddir [lookfor_file [get_multilibs] libstdc++-v3] ++ if { $blddir == "" } { ++ set multilibs [get_multilibs] ++ # FIXME: assume multilib only one level deep ++ set multisub [file tail $multilibs] ++ verbose "libstdc++-v3-init: couldn't find libstdc++-v3 in $multilibs, trying $objdir" ++ set blddir [lookfor_file ${objdir} "$target_triplet/$multisub/libstdc++-v3"] ++ } ++ if { $blddir == "" } { ++ verbose "libstdc++-v3-init: couldn't find libstdc++-v3, trying $objdir without multilibs" ++ set blddir [lookfor_file ${objdir} "$target_triplet/libstdc++-v3"] ++ } ++ if { $blddir == "" } { ++ error "Can't find libstdc++-v3" ++ } + + # By default, we assume we want to run program images. + global dg-do-what-default diff --git a/patches/gcc/3.3/sh-pic-set_fpscr.patch b/patches/gcc/3.3/sh-pic-set_fpscr.patch new file mode 100644 index 00000000..00cfb4cf --- /dev/null +++ b/patches/gcc/3.3/sh-pic-set_fpscr.patch @@ -0,0 +1,60 @@ +Should fix +make[2]: *** [/gcc-3.3-glibc-2.3.2/build-glibc/elf/check-textrel.out] Error 1 +in glibc's "make tests". + +------------- + +Message-Id: <200307300255.h6U2tB906928@r-rr.iij4u.or.jp> +To: dank@kegel.com +Cc: linux-sh@m17n.org +Subject: Re: Writing PIC version of __udivsi3_i4? (was: Re: "make tests" fails + with "libc.so: text relocations used" in glibc-2.3.2 for sh4) +In-Reply-To: Your message of "Wed, 30 Jul 2003 11:20:49 +0900" + <200307300212.h6U2CH901209@r-rr.iij4u.or.jp> +References: <200307300212.h6U2CH901209@r-rr.iij4u.or.jp> +Date: Wed, 30 Jul 2003 12:03:01 +0900 +From: kaz Kojima <kkojima@rr.iij4u.or.jp> + +> I'll try to write the PIC version of it, + +Dan, does the attached patch work for you? + +[dank: original patch deleted; here's same thing rediffed against gcc-3.3 instead of HEAD] + +--- gcc-3.3/gcc/config/sh/lib1funcs.asm.old Tue Jul 29 21:37:29 2003 ++++ gcc-3.3/gcc/config/sh/lib1funcs.asm Tue Jul 29 21:40:58 2003 +@@ -1792,7 +1792,17 @@ + .global GLOBAL(set_fpscr) + GLOBAL(set_fpscr): + lds r4,fpscr ++#ifdef __PIC__ ++ mov.l r12,@-r15 ++ mova LOCAL(set_fpscr_L0),r0 ++ mov.l LOCAL(set_fpscr_L0),r12 ++ add r0,r12 ++ mov.l LOCAL(set_fpscr_L1),r0 ++ mov.l @(r0,r12),r1 ++ mov.l @r15+,r12 ++#else + mov.l LOCAL(set_fpscr_L1),r1 ++#endif + swap.w r4,r0 + or #24,r0 + #ifndef FMOVD_WORKS +@@ -1820,8 +1830,16 @@ + mov.l r3,@(4,r1) + #endif + .align 2 ++#ifdef __PIC__ ++LOCAL(set_fpscr_L0): ++ .long _GLOBAL_OFFSET_TABLE_ ++LOCAL(set_fpscr_L1): ++ .long GLOBAL(fpscr_values@GOT) ++#else + LOCAL(set_fpscr_L1): + .long GLOBAL(fpscr_values) ++#endif ++ + #ifdef __ELF__ + .comm GLOBAL(fpscr_values),8,4 + #else diff --git a/patches/gcc/3.3/sh-predef-gnu_source.patch b/patches/gcc/3.3/sh-predef-gnu_source.patch new file mode 100644 index 00000000..dc94f4c2 --- /dev/null +++ b/patches/gcc/3.3/sh-predef-gnu_source.patch @@ -0,0 +1,15 @@ +See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11096 +and http://gcc.gnu.org/ml/gcc-patches/2003-06/msg00424.html + +--- gcc-3.3/gcc/config/sh/linux.h.old Wed Jun 4 17:37:40 2003 ++++ gcc-3.3/gcc/config/sh/linux.h Wed Jun 4 17:38:16 2003 +@@ -53,5 +53,9 @@ + %{static:-static}" + ++/* The GNU C++ standard library requires that these macros be defined. */ ++#undef CPLUSPLUS_CPP_SPEC ++#define CPLUSPLUS_CPP_SPEC "-D_GNU_SOURCE %(cpp)" ++ + #undef LIB_SPEC + #define LIB_SPEC \ + "%{shared: -lc} \ diff --git a/patches/gcc/3.3/sh-spec.patch b/patches/gcc/3.3/sh-spec.patch new file mode 100644 index 00000000..6266c1f5 --- /dev/null +++ b/patches/gcc/3.3/sh-spec.patch @@ -0,0 +1,45 @@ +Message-Id: <200308020452.h724q0n01509@r-rr.iij4u.or.jp> +To: dank@kegel.com +Cc: kkojima@rr.iij4u.or.jp +Subject: Re: Writing PIC version of __udivsi3_i4? +In-Reply-To: Your message of "Fri, 01 Aug 2003 21:15:27 -0700" + <3F2B3ADF.6030206@kegel.com> +References: <3F2B3ADF.6030206@kegel.com> +Date: Sat, 02 Aug 2003 13:58:05 +0900 +From: kaz Kojima <kkojima@rr.iij4u.or.jp> + +Dan Kegel <dank@kegel.com> wrote: +> It seems it might be from gcc's spec file: +> +> *subtarget_link_spec: +> %{shared:-shared} %{!static: %{rdynamic:-export-dynamic} %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} %{!rpath:-rpath /lib}} %{static:-static} +> +> as the only place -rpath showed up was in the output of gcc -v as it +> was linking libc.so. +> +> Well, that's a clue, anyway! Guess I'll dig through the spec files +> tomorrow to see if I can figure it out some more. + +I've grepped gcc/config/*/*.h and found only SH and old libc1 stuffs +of i386/alpha include %{!rpath:-rpath ... in 3.3 release and the +current CVS. And my sh-gcc's specs doesn't have this :-( +It would be the Right Thing to remove this stuff simply. How about +the gcc patch below? + +Regards, + kaz +-- +--- gcc-3.3/gcc/config/sh/linux.h.orig Sat Aug 2 13:20:57 2003 ++++ gcc-3.3/gcc/config/sh/linux.h Sat Aug 2 13:22:42 2003 +@@ -48,8 +48,7 @@ do { \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ +- %{!rpath:-rpath /lib}} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" + + /* The GNU C++ standard library requires that these macros be defined. */ + + diff --git a/patches/gcc/3.3/sh4-kaz-workaround.patch b/patches/gcc/3.3/sh4-kaz-workaround.patch new file mode 100644 index 00000000..189b1323 --- /dev/null +++ b/patches/gcc/3.3/sh4-kaz-workaround.patch @@ -0,0 +1,145 @@ +[lightly edited to fit my patch directory - dank] + +From: kaz Kojima <kkojima@rr.iij4u.or.jp> +Date: Sat, 09 Aug 2003 09:46:21 +0900 +To: dank@kegel.com + +Hi Dan, + +I've come back from the vacation and looked glibc string test +failures on sh4. This looks a gcc problem. gcc-3.3/3.4 doesn't +compile these tests correctly. The attached testcase aborts on +gcc-3.3/3.4 -O2 but exits normally gcc-3.2 and gcc-3.0. +The option -O2 is not essential but it makes the testcase small. +The failed string tests include the same pattern of the code with +f=random to generate ramdom strings but they get strings with +embedded NULL characters :-( + +... +I've got a workaround below for this bug, though it might merely +paper over the real bug. Anyway, I'd like to send a PR for this. + +Regards, + kaz +-- +int val = 0xff00; + +int f (void) { return val; } + +unsigned char a[1]; + +void +foo (void) +{ + a[0] = f () & 255; + + if (!a[0]) + a[0] = f () & 255; + + if (!a[0]) + a[0] = 1 + (f () & 127); +} + +int +main (int argc, char **argv) +{ + foo (); + if (!a[0]) + abort (); + + return 0; +} + +-- + +diff -u3prN ORIG/gcc/gcc/config/sh/sh.c LOCAL/gcc/gcc/config/sh/sh.c +--- gcc/gcc/config/sh/sh.c.old Fri Aug 8 18:39:02 2003 ++++ gcc/gcc/config/sh/sh.c Fri Aug 8 22:31:02 2003 +@@ -6657,6 +6657,19 @@ arith_reg_dest (op, mode) + return arith_reg_operand (op, mode); + } + ++/* Like above, but for SImode compare destinations: forbid paradoxical ++ subregs, because it would get the combiner confused. */ ++int ++arith_reg_cmp_dest (op, mode) ++ rtx op; ++ enum machine_mode mode; ++{ ++ if (mode == SImode && GET_CODE (op) == SUBREG ++ && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) < 4) ++ return 0; ++ return arith_reg_operand (op, mode); ++} ++ + int + int_gpr_dest (op, mode) + rtx op; +diff -u3prN ORIG/gcc/gcc/config/sh/sh.h LOCAL/gcc/gcc/config/sh/sh.h +--- gcc/gcc/config/sh/sh.h.old Fri Aug 8 18:39:02 2003 ++++ gcc/gcc/config/sh/sh.h Fri Aug 8 22:31:02 2003 +@@ -3365,6 +3365,7 @@ extern int rtx_equal_function_value_matt + {"and_operand", {SUBREG, REG, CONST_INT}}, \ + {"any_register_operand", {SUBREG, REG}}, \ + {"arith_operand", {SUBREG, REG, CONST_INT}}, \ ++ {"arith_reg_cmp_dest", {SUBREG, REG}}, \ + {"arith_reg_dest", {SUBREG, REG}}, \ + {"arith_reg_operand", {SUBREG, REG}}, \ + {"arith_reg_or_0_operand", {SUBREG, REG, CONST_INT, CONST_VECTOR}}, \ + +--- gcc-3.3/gcc/config/sh/sh.md.orig Tue Apr 15 10:06:10 2003 ++++ gcc-3.3/gcc/config/sh/sh.md Sat Aug 9 22:31:13 2003 +@@ -616,7 +616,7 @@ + + (define_insn "" + [(set (reg:SI T_REG) +- (eq:SI (and:SI (match_operand:SI 0 "arith_reg_operand" "z,r") ++ (eq:SI (and:SI (match_operand:SI 0 "arith_reg_cmp_dest" "z,r") + (match_operand:SI 1 "arith_operand" "L,r")) + (const_int 0)))] + "TARGET_SH1" +@@ -631,7 +631,7 @@ + + (define_insn "cmpeqsi_t" + [(set (reg:SI T_REG) +- (eq:SI (match_operand:SI 0 "arith_reg_operand" "r,z,r") ++ (eq:SI (match_operand:SI 0 "arith_reg_cmp_dest" "r,z,r") + (match_operand:SI 1 "arith_operand" "N,rI,r")))] + "TARGET_SH1" + "@ +@@ -642,7 +642,7 @@ + + (define_insn "cmpgtsi_t" + [(set (reg:SI T_REG) +- (gt:SI (match_operand:SI 0 "arith_reg_operand" "r,r") ++ (gt:SI (match_operand:SI 0 "arith_reg_cmp_dest" "r,r") + (match_operand:SI 1 "arith_reg_or_0_operand" "r,N")))] + "TARGET_SH1" + "@ +@@ -652,7 +652,7 @@ + + (define_insn "cmpgesi_t" + [(set (reg:SI T_REG) +- (ge:SI (match_operand:SI 0 "arith_reg_operand" "r,r") ++ (ge:SI (match_operand:SI 0 "arith_reg_cmp_dest" "r,r") + (match_operand:SI 1 "arith_reg_or_0_operand" "r,N")))] + "TARGET_SH1" + "@ +@@ -666,7 +666,7 @@ + + (define_insn "cmpgeusi_t" + [(set (reg:SI T_REG) +- (geu:SI (match_operand:SI 0 "arith_reg_operand" "r") ++ (geu:SI (match_operand:SI 0 "arith_reg_cmp_dest" "r") + (match_operand:SI 1 "arith_reg_operand" "r")))] + "TARGET_SH1" + "cmp/hs %1,%0" +@@ -674,7 +674,7 @@ + + (define_insn "cmpgtusi_t" + [(set (reg:SI T_REG) +- (gtu:SI (match_operand:SI 0 "arith_reg_operand" "r") ++ (gtu:SI (match_operand:SI 0 "arith_reg_cmp_dest" "r") + (match_operand:SI 1 "arith_reg_operand" "r")))] + "TARGET_SH1" + "cmp/hi %1,%0" diff --git a/patches/gcc/3.3/sh4-no-fix-protos.patch b/patches/gcc/3.3/sh4-no-fix-protos.patch new file mode 100644 index 00000000..c3c478f2 --- /dev/null +++ b/patches/gcc/3.3/sh4-no-fix-protos.patch @@ -0,0 +1,12 @@ +See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=10331 +and http://gcc.gnu.org/ml/gcc-patches/2003-06/msg00423.html + +--- gcc-3.3/gcc/config/sh/t-linux.old Wed Jun 4 13:01:39 2003 ++++ gcc-3.3/gcc/config/sh/t-linux Wed Jun 4 13:02:12 2003 +@@ -1,3 +1,6 @@ ++# Don't run fixproto ++STMP_FIXPROTO = ++ + TARGET_LIBGCC2_CFLAGS = -fpic + LIB1ASMFUNCS_CACHE = _ic_invalidate + diff --git a/patches/gcc/3.3/sh4-pthread.patch b/patches/gcc/3.3/sh4-pthread.patch new file mode 100644 index 00000000..a0c9233b --- /dev/null +++ b/patches/gcc/3.3/sh4-pthread.patch @@ -0,0 +1,42 @@ +Patch to fix following test case failure: + + === libstdc++-v3 tests === +FAIL: thread/pthread1.cc (test for excess errors) +Excess errors: +/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/sh4-unknown-linux-gnu/bin/ld: cannot find -lthread +collect2: ld returned 1 exit status + +Note that *any* program compiled with -pthread fails: + +/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/bin/sh4-unknown-linux-gnu-gcc hello.c -pthread +/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/lib/gcc-lib/sh4-unknown-linux-gnu/3.3.1/../../../../sh4-unknown-linux-gnu/bin/ld: cannot find -lthread +collect2: ld returned 1 exit status + +Compiling with -lpthread on the other hand works fine: +/opt/cegl-2.0/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/bin/sh4-unknown-linux-gnu-gcc hello.c -lpthread + +So -pthread is broken in some trivial way; it should invoke -lpthread, not -lthread, +at least when targeting Linux. + +http://www.sh-linux.org/rpm-2003/SRPMS/gcc-3.2.3-3.src.rpm contains a jumbo patch, +gcc-20030210-sh-linux-1.patch, that includes a fix for this. Here's the +appropriate hunk (brings in a fix for the documented -mieee option). +No idea if this fix is completely right, but it works for me... +- dank@kegel.com 20 Jul 2003 + +Index: linux.h +=================================================================== +RCS file: /cvsroot/gcc/gcc/gcc/config/sh/linux.h,v +retrieving revision 1.9.20.1 +diff -u -d -u -r1.9.20.1 linux.h +--- gcc-ss-3_3-20030714/gcc/config/sh/linux.h.old 6 Jun 2003 02:30:59 -0000 1.9.20.1 ++++ gcc-ss-3_3-20030714/gcc/config/sh/linux.h 20 Jul 2003 23:36:50 -0000 +@@ -59,7 +59,7 @@ + #undef LIB_SPEC + #define LIB_SPEC \ + "%{shared: -lc} \ +- %{!shared: %{pthread:-lthread} \ ++ %{!shared: %{mieee:-lieee} %{pthread:-lpthread} \ + %{profile:-lc_p} %{!profile: -lc}}" + + #undef STARTFILE_SPEC diff --git a/patches/gcc/3.4.0/gcc-3.3.3h-ppc-asm-spec.patch b/patches/gcc/3.4.0/gcc-3.3.3h-ppc-asm-spec.patch new file mode 100644 index 00000000..870024da --- /dev/null +++ b/patches/gcc/3.4.0/gcc-3.3.3h-ppc-asm-spec.patch @@ -0,0 +1,88 @@ +Retrieved from http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/rs6000/rs6000.h.diff?r1=1.234.2.28&r2=1.234.2.29 + +Should fix following error building gcc for ppc7450: + +/tmp/ccmfQBT9.s:5197: Error: Unrecognized opcode: `lvx' +make[2]: *** [libgcc/./unwind-dw2.o] Error 1 +make[2]: Leaving directory `build-gcc-core/gcc' +make[1]: *** [stmp-multilib] Error 2 +make[1]: Leaving directory `build-gcc-core/gcc' +make: *** [all-gcc] Error 2 + +(I'm not so sure about the unconditional -many it sends to binutils; +that seems redundant?) + +Revision 1.234.2.29, Tue May 25 06:08:57 2004 UTC (6 days, 11 hours ago) by amodra +Branch: hammer-3_3-branch +Changes since 1.234.2.28: +15 -11 lines + + * config/rs6000/rs6000.h (ASM_CPU_SPEC): Handle -mpowerpc64 and -mcpu + for power5 and rs64a. Correct condition for default. Correct power3, + 620, 630, 7400, 7450, G4, 970 and G5 -mcpu entries. Add -many. + +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.h,v +retrieving revision 1.234.2.28 +retrieving revision 1.234.2.29 +diff -u -r1.234.2.28 -r1.234.2.29 +--- gcc/gcc/config/rs6000/rs6000.h 2004/05/18 14:26:57 1.234.2.28 ++++ gcc/gcc/config/rs6000/rs6000.h 2004/05/25 06:08:57 1.234.2.29 +@@ -51,20 +51,23 @@ + "%{!mcpu*: \ + %{mpower: %{!mpower2: -mpwr}} \ + %{mpower2: -mpwrx} \ +- %{mpowerpc*: -mppc} \ ++ %{mpowerpc64*: -mppc64} \ ++ %{!mpowerpc64*: %{mpowerpc*: -mppc}} \ + %{mno-power: %{!mpowerpc*: -mcom}} \ +- %{!mno-power: %{!mpower2: %(asm_default)}}} \ ++ %{!mno-power: %{!mpower*: %(asm_default)}}} \ + %{mcpu=common: -mcom} \ + %{mcpu=power: -mpwr} \ + %{mcpu=power2: -mpwrx} \ +-%{mcpu=power3: -m604} \ ++%{mcpu=power3: -mppc64} \ + %{mcpu=power4: -mpower4} \ ++%{mcpu=power5: -mpower4} \ + %{mcpu=powerpc: -mppc} \ + %{mcpu=rios: -mpwr} \ + %{mcpu=rios1: -mpwr} \ + %{mcpu=rios2: -mpwrx} \ + %{mcpu=rsc: -mpwr} \ + %{mcpu=rsc1: -mpwr} \ ++%{mcpu=rs64a: -mppc64} \ + %{mcpu=401: -mppc} \ + %{mcpu=403: -m403} \ + %{mcpu=405: -m405} \ +@@ -79,22 +82,23 @@ + %{mcpu=ec603e: -mppc} \ + %{mcpu=604: -mppc} \ + %{mcpu=604e: -mppc} \ +-%{mcpu=620: -mppc} \ +-%{mcpu=630: -m604} \ ++%{mcpu=620: -mppc64} \ ++%{mcpu=630: -mppc64} \ + %{mcpu=740: -mppc} \ +-%{mcpu=7400: -mppc} \ +-%{mcpu=7450: -mppc} \ +-%{mcpu=G4: -mppc} \ + %{mcpu=750: -mppc} \ + %{mcpu=G3: -mppc} \ ++%{mcpu=7400: -mppc -maltivec} \ ++%{mcpu=7450: -mppc -maltivec} \ ++%{mcpu=G4: -mppc -maltivec} \ + %{mcpu=801: -mppc} \ + %{mcpu=821: -mppc} \ + %{mcpu=823: -mppc} \ + %{mcpu=860: -mppc} \ +-%{mcpu=970: -mpower4} \ +-%{mcpu=G5: -mpower4} \ ++%{mcpu=970: -mpower4 -maltivec} \ ++%{mcpu=G5: -mpower4 -maltivec} \ + %{mcpu=8540: -me500} \ +-%{maltivec: -maltivec}" ++%{maltivec: -maltivec} \ ++-many" + + #define CPP_DEFAULT_SPEC "" + diff --git a/patches/gcc/3.4.0/gcc-3.4.0-arm-bigendian.patch b/patches/gcc/3.4.0/gcc-3.4.0-arm-bigendian.patch new file mode 100644 index 00000000..c9288c6c --- /dev/null +++ b/patches/gcc/3.4.0/gcc-3.4.0-arm-bigendian.patch @@ -0,0 +1,70 @@ +By Lennert Buytenhek <buytenh@wantstofly.org> +Adds support for arm*b-linux* big-endian ARM targets + +See http://gcc.gnu.org/PR16350 + +diff -urN gcc-3.4.0.orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h +--- gcc-3.4.0.orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-07-02 14:46:29.225443757 +0200 +@@ -30,17 +30,34 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 | \ ++ ARM_FLAG_MMU_TRAPS | \ ++ TARGET_ENDIAN_DEFAULT ) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -89,7 +106,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() +diff -urN gcc-3.4.0.orig/gcc/config.gcc gcc-3.4.0/gcc/config.gcc +--- gcc-3.4.0.orig/gcc/config.gcc 2004-04-17 04:28:24.000000000 +0200 ++++ gcc-3.4.0/gcc/config.gcc 2004-07-02 14:44:40.045822542 +0200 +@@ -666,6 +666,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/patches/gcc/3.4.0/gcc-3.4.0-arm-lib1asm.patch b/patches/gcc/3.4.0/gcc-3.4.0-arm-lib1asm.patch new file mode 100644 index 00000000..69a79d5d --- /dev/null +++ b/patches/gcc/3.4.0/gcc-3.4.0-arm-lib1asm.patch @@ -0,0 +1,27 @@ +# Origin: from a patch by Dimitry Andric <dimitry@andric.com>, 2004-05-01 +# See http://gcc.gnu.org/PR14352 and http://gcc.gnu.org/PR16314 +# See also http://gcc.gnu.org/ml/gcc-patches/2004-08/msg02568.html et seq for why this isn't in mainline +# Fixes errors like the following when building glibc (or any other executable +# or shared library) when using gcc 3.4.0 for ARM with softfloat: +# +# .../libc_pic.os(.text+0x15834): In function `__modf': undefined reference to `__subdf3' +# .../libc_pic.os(.text+0x158b8): In function `__modf': undefined reference to `__subdf3' +# .../libc_pic.os(.text+0x1590c): In function `scalbn': undefined reference to `__muldf3' +# .../libc_pic.os(.text+0x15e94): In function `__ldexpf': undefined reference to `__eqsf2' +# .../libc_pic.os(.text+0xcee4c): In function `monstartup': undefined reference to `__fixsfsi' + +diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux +--- gcc-3.4.0-orig/gcc/config/arm/t-linux 2003-09-20 23:09:07.000000000 +0200 ++++ gcc-3.4.0/gcc/config/arm/t-linux 2004-05-01 20:31:59.102846400 +0200 +@@ -4,7 +4,10 @@ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float diff --git a/patches/gcc/3.4.0/gcc-3.4.0-arm-nolibfloat.patch b/patches/gcc/3.4.0/gcc-3.4.0-arm-nolibfloat.patch new file mode 100644 index 00000000..43eed3ef --- /dev/null +++ b/patches/gcc/3.4.0/gcc-3.4.0-arm-nolibfloat.patch @@ -0,0 +1,24 @@ +# Dimitry Andric <dimitry@andric.com>, 2004-05-01 +# +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed +# anymore. (The required functions are now in libgcc.) +# +# Fixes errors like +# arm-softfloat-linux-gnu/3.4.0/../../../../arm-softfloat-linux-gnu/bin/ld: cannot find -lfloat +# collect2: ld returned 1 exit status +# make[2]: *** [arm-softfloat-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/iconvdata/ISO8859-1.so] Error 1 +# when building glibc-2.3.3 with gcc-3.4.0 for arm-softfloat + +diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h +--- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-05-01 19:19:06.935979200 +0200 +@@ -55,7 +73,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which + diff --git a/patches/gcc/3.4.0/gcc-3.4.0-pr14808-refix.patch b/patches/gcc/3.4.0/gcc-3.4.0-pr14808-refix.patch new file mode 100644 index 00000000..2a48c99c --- /dev/null +++ b/patches/gcc/3.4.0/gcc-3.4.0-pr14808-refix.patch @@ -0,0 +1,46 @@ +See http://gcc.gnu.org/ml/gcc/2004-06/msg00394.html +This might fix the error + +strstream.s: Assembler messages: +strstream.s:8390: Error: junk `(%ecx)' after expression +strstream.s:8402: Error: junk `(%ecx)' after expression +strstream.s:8551: Error: junk `(%ecx)' after expression +strstream.s:8563: Error: junk `(%ecx)' after expression +make[3]: *** [strstream.lo] Error 1 +make[3]: Leaving directory `i686-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-gcc/i686-unknown-linux-gnu/libstdc++-v3/src' + +when building a cygwin->linux cross-compiler with gcc-3.4.0, +probably caused by patch to fix http://gcc.gnu.org/PR14808 + + +--- gcc-3.4.0/gcc/cp/method.c.old Sun Jun 6 22:46:04 2004 ++++ gcc-3.4.0/gcc/cp/method.c Sun Jun 6 22:48:13 2004 +@@ -286,7 +286,7 @@ + tree alias; + char buf[256]; + +-#if defined (__CYGWIN__) || defined (__MINGW32__) ++#if defined (TARGET_IS_PE_COFF) + if (DECL_ONE_ONLY (function)) + return function; + #endif +@@ -404,7 +404,7 @@ + push_to_top_level (); + + #if defined (ASM_OUTPUT_DEF) \ +- && !(defined (__CYGWIN__) || defined (__MINGW32__)) ++ && !defined (TARGET_IS_PE_COFF) + if (targetm.have_named_sections) + { + resolve_unique_section (function, 0, flag_function_sections); +--- gcc-3.4.0/gcc/config/i386/cygming.h.old Sun Jun 6 22:50:46 2004 ++++ gcc-3.4.0/gcc/config/i386/cygming.h Sun Jun 6 22:52:10 2004 +@@ -27,6 +27,8 @@ + + #define TARGET_EXECUTABLE_SUFFIX ".exe" + ++#define TARGET_IS_PE_COFF 1 ++ + #include <stdio.h> + + /* Masks for subtarget switches used by other files. */ diff --git a/patches/gcc/3.4.0/gcc-3.4.0-ultrasparc3-default64.patch b/patches/gcc/3.4.0/gcc-3.4.0-ultrasparc3-default64.patch new file mode 100644 index 00000000..6357f568 --- /dev/null +++ b/patches/gcc/3.4.0/gcc-3.4.0-ultrasparc3-default64.patch @@ -0,0 +1,52 @@ +Date: Sat, 1 May 2004 21:08:10 +0200 +From: Jakub Jelinek <jakub@redhat.com> +To: Dan Kegel <dank@kegel.com>, mark@codesourcery.com +Cc: gcc-patches@gcc.gnu.org +Subject: [PATCH] sparc64-linux --with-cpu=ultrasparc fix +Message-ID: <20040501190810.GD5191@sunsite.ms.mff.cuni.cz> +Reply-To: Jakub Jelinek <jakub@redhat.com> +References: <40940B11.9080907@kegel.com> +In-Reply-To: <40940B11.9080907@kegel.com> + +On Sat, May 01, 2004 at 01:39:45PM -0700, Dan Kegel wrote: +> I'm having a bit of trouble configuring gcc-3.4.0 for sparc64-linux. +> The resulting compiler defaults to sparc32, which is a problem +> because it means having to figure out how to add +> -mcpu=ultrasparc3 -Wa,-Av9a -m64 to CFLAGS for everything I build. +> The worst part is that this even affects libgcc.a, which makes it +> pretty hard to link any sparc64 executables. I could figure out +> how mklibgcc and multilibbing work, and maybe thereby get a good 64 bit +> libgcc.a, +> but I'd kind of like to avoid that for the moment, and just really get +> gcc to default to 64 bit output. +> +> What's the right way to get gcc to default to building 64 bit executables +> when targeting sparc64-linux? + +There was TARGET_CPU_ultrasparc3 missing in linux64.h. +I've commited the following fix to the trunk, but as it is not a regression, +I'm not sure if Mark is ok with this for gcc-3_4-branch. + +2004-05-01 Jakub Jelinek <jakub@redhat.com> + + * config/sparc/linux64.h (TARGET_DEFAULT): Make 64-bit by default + also for TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc3. + +--- gcc-3.4.0/gcc/config/sparc/linux64.h.jj 2004-05-01 22:59:52.000000000 +0200 ++++ gcc-3.4.0/gcc/config/sparc/linux64.h 2004-05-01 23:00:41.126176529 +0200 +@@ -39,7 +39,9 @@ Boston, MA 02111-1307, USA. */ + #undef MD_EXEC_PREFIX + #undef MD_STARTFILE_PREFIX + +-#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc ++#if TARGET_CPU_DEFAULT == TARGET_CPU_v9 \ ++ || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc \ ++ || TARGET_CPU_DEFAULT == TARGET_CPU_ultrasparc3 + /* A 64 bit v9 compiler with stack-bias, + in a Medium/Low code model environment. */ + + + Jakub + + + diff --git a/patches/gcc/3.4.0/pr13250-fix.patch b/patches/gcc/3.4.0/pr13250-fix.patch new file mode 100644 index 00000000..ce68bb1b --- /dev/null +++ b/patches/gcc/3.4.0/pr13250-fix.patch @@ -0,0 +1,19 @@ +See http://gcc.gnu.org/PR13250 +Fixes bad code generated when compiling SHA256 for SH processor + +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/config/sh/sh.md,v +retrieving revision 1.171 +retrieving revision 1.172 +diff -u -r1.171 -r1.172 +--- gcc/gcc/config/sh/sh.md 2004/05/10 23:25:13 1.171 ++++ gcc/gcc/config/sh/sh.md 2004/05/28 05:47:36 1.172 +@@ -2194,7 +2194,7 @@ + parts[0] = gen_reg_rtx (SImode); + parts[1] = gen_reg_rtx (SImode); + emit_insn (gen_rotlsi3_16 (parts[2-choice], operands[1])); +- parts[choice-1] = operands[1]; ++ emit_move_insn (parts[choice-1], operands[1]); + emit_insn (gen_ashlsi3 (parts[0], parts[0], GEN_INT (8))); + emit_insn (gen_lshrsi3 (parts[1], parts[1], GEN_INT (8))); + emit_insn (gen_iorsi3 (operands[0], parts[0], parts[1])); diff --git a/patches/gcc/3.4.0/pr15647-fix.patch b/patches/gcc/3.4.0/pr15647-fix.patch new file mode 100644 index 00000000..6a4265d6 --- /dev/null +++ b/patches/gcc/3.4.0/pr15647-fix.patch @@ -0,0 +1,288 @@ +Received: (qmail 11693 invoked from network); 26 May 2004 03:17:41 -0000 +Received: from unknown (HELO r-rr.iij4u.or.jp) (210.130.0.76) + by sourceware dot org with SMTP; 26 May 2004 03:17:41 -0000 +Received: from localhost (frgw.3in.ne.jp [210.251.121.226]) + by r-rr dot iij4u dot or dot jp (8 dot 11 dot 6+IIJ/8 dot 11 dot 6) with ESMTP id i4Q3HbJ21421; + Wed, 26 May 2004 12:17:37 +0900 (JST) +Date: Wed, 26 May 2004 12:13:58 +0900 (JST) +Message-Id: <20040526.121358.39460214.kkojima@rr.iij4u.or.jp> +To: gcc-patches at gcc dot gnu dot org +Cc: Mark Mitchell <mark at codesourcery dot com> +Subject: [PATCH] Fix PR target/15647 for sh-linux +From: Kaz Kojima <kkojima at rr dot iij4u dot or dot jp> +Mime-Version: 1.0 +Content-Type: Text/Plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +Hi, + +The appended patch is to fix PR target/15647 + http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15647 +for linux. +__udivsi3 is exported from libgcc_s.so.1 and gcc generates the code +which assumes r1 will be not clobbered when calling __udivsi3 in SH3 +case. This is bad because r1 is clobbered by PLT. +The another functions listed in the standard libgcc-std.ver which +possively have similar problem are __ashlsi3, __ashrsi3 and __lshrsi3, +though these are used only by SH1/2. +The patch below simply uses an SH specific libgcc-std.ver which drops +these functions. SH linux uses a linker script libgcc_s.so having +libgcc.a as a suppementary library, so these functions given by +libgcc.a when needed in the link time. +Although mainline has one failure in bulding zlib which can be avoided +with -fno-reorder-blocks for sh3-unknown-linux-gnu target, x86 cross +to sh3-unknown-linux-gnu can be build successfully on mainline with +this patch except the above failure. 3.4-branch successfully bootstraps +with it and there are no new failures on the native sh4-unknown-linux-gnu. +The patch is highly sh-linux specific and seems to be safe. I'll check +it into mainline. +The original PR is also for sh3 netbsd. I'd like to leave it for the +netbsd experts. + +I think that it's too late for 3.3.4. Mark, is it also late for +3.4.1? + +Regards, + kaz +-- +2004-05-26 Kaz Kojima <kkojima@gcc.gnu.org> + + * config/sh/t-linux (SHLIB_MAPFILES): Use sh specific + libgcc-std.ver. + * config/sh/libgcc-std.ver: New file. + +diff -u3prN ORIG-gcc/gcc/config/sh/t-linux LOCAL-gcc/gcc/config/sh/t-linux +--- ORIG-gcc/gcc/config/sh/t-linux Mon Feb 16 20:13:25 2004 ++++ LOCAL-gcc/gcc/config/sh/t-linux Tue May 25 18:25:48 2004 +@@ -11,8 +11,11 @@ MULTILIB_EXCEPTIONS= + EXTRA_MULTILIB_PARTS= crtbegin.o crtend.o crtbeginS.o crtendS.o crtbeginT.o + + # Override t-slibgcc-elf-ver to export some libgcc symbols with +-# the symbol versions that glibc used. +-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver $(srcdir)/config/sh/libgcc-glibc.ver ++# the symbol versions that glibc used. Also use an sh specific ++# libgcc-std.ver to avoid to export some lib1func routines which ++# should not be called via PLT. ++SHLIB_MAPFILES = $(srcdir)/config/sh/libgcc-std.ver \ ++ $(srcdir)/config/sh/libgcc-glibc.ver + + # Override SHLIB_LINK and SHLIB_INSTALL to use linker script + # libgcc_s.so. +diff -u3prN ORIG-gcc/gcc/config/sh/libgcc-std.ver LOCAL-gcc/gcc/config/sh/libgcc-std.ver +--- ORIG-gcc/gcc/config/sh/libgcc-std.ver Thu Jan 1 09:00:00 1970 ++++ LOCAL-gcc/gcc/config/sh/libgcc-std.ver Tue May 25 18:50:54 2004 +@@ -0,0 +1,213 @@ ++GCC_3.0 { ++ # libgcc1 integer symbols ++ __absvsi2 ++ __addvsi3 ++ # __ashlsi3 ++ # __ashrsi3 ++ __divsi3 ++ # __lshrsi3 ++ __modsi3 ++ __mulsi3 ++ __mulvsi3 ++ __negvsi2 ++ __subvsi3 ++ # __udivsi3 ++ __umodsi3 ++ ++ # libgcc1 floating point symbols ++ __addsf3 ++ __adddf3 ++ __addxf3 ++ __addtf3 ++ __divsf3 ++ __divdf3 ++ __divxf3 ++ __divtf3 ++ __eqsf2 ++ __eqdf2 ++ __eqxf2 ++ __eqtf2 ++ __extenddfxf2 ++ __extenddftf2 ++ __extendsfdf2 ++ __extendsfxf2 ++ __extendsftf2 ++ __fixsfsi ++ __fixdfsi ++ __fixxfsi ++ __fixtfsi ++ __floatsisf ++ __floatsidf ++ __floatsixf ++ __floatsitf ++ __gesf2 ++ __gedf2 ++ __gexf2 ++ __getf2 ++ __gtsf2 ++ __gtdf2 ++ __gtxf2 ++ __gttf2 ++ __lesf2 ++ __ledf2 ++ __lexf2 ++ __letf2 ++ __ltsf2 ++ __ltdf2 ++ __ltxf2 ++ __lttf2 ++ __mulsf3 ++ __muldf3 ++ __mulxf3 ++ __multf3 ++ __negsf2 ++ __negdf2 ++ __negxf2 ++ __negtf2 ++ __nesf2 ++ __nedf2 ++ __nexf2 ++ __netf2 ++ __subsf3 ++ __subdf3 ++ __subxf3 ++ __subtf3 ++ __truncdfsf2 ++ __truncxfsf2 ++ __trunctfsf2 ++ __truncxfdf2 ++ __trunctfdf2 ++ ++ # libgcc2 DImode arithmetic (for 32-bit targets). ++ __absvdi2 ++ __addvdi3 ++ __ashldi3 ++ __ashrdi3 ++ __cmpdi2 ++ __divdi3 ++ __ffsdi2 ++ __fixdfdi ++ __fixsfdi ++ __fixtfdi ++ __fixxfdi ++ __fixunsdfdi ++ __fixunsdfsi ++ __fixunssfsi ++ __fixunssfdi ++ __fixunstfdi ++ __fixunstfsi ++ __fixunsxfdi ++ __fixunsxfsi ++ __floatdidf ++ __floatdisf ++ __floatdixf ++ __floatditf ++ __lshrdi3 ++ __moddi3 ++ __muldi3 ++ __mulvdi3 ++ __negdi2 ++ __negvdi2 ++ __subvdi3 ++ __ucmpdi2 ++ __udivdi3 ++ __udivmoddi4 ++ __umoddi3 ++ ++ # libgcc2 TImode arithmetic (for 64-bit targets). ++ __ashlti3 ++ __ashrti3 ++ __cmpti2 ++ __divti3 ++ __ffsti2 ++ __fixdfti ++ __fixsfti ++ __fixtfti ++ __fixxfti ++ __lshrti3 ++ __modti3 ++ __multi3 ++ __negti2 ++ __ucmpti2 ++ __udivmodti4 ++ __udivti3 ++ __umodti3 ++ __fixunsdfti ++ __fixunssfti ++ __fixunstfti ++ __fixunsxfti ++ __floattidf ++ __floattisf ++ __floattixf ++ __floattitf ++ ++ # Used to deal with trampoline initialization on some platforms ++ __clear_cache ++ ++ # EH symbols ++ _Unwind_DeleteException ++ _Unwind_Find_FDE ++ _Unwind_ForcedUnwind ++ _Unwind_GetGR ++ _Unwind_GetIP ++ _Unwind_GetLanguageSpecificData ++ _Unwind_GetRegionStart ++ _Unwind_GetTextRelBase ++ _Unwind_GetDataRelBase ++ _Unwind_RaiseException ++ _Unwind_Resume ++ _Unwind_SetGR ++ _Unwind_SetIP ++ __deregister_frame ++ __deregister_frame_info ++ __deregister_frame_info_bases ++ __register_frame ++ __register_frame_info ++ __register_frame_info_bases ++ __register_frame_info_table ++ __register_frame_info_table_bases ++ __register_frame_table ++ ++ # SjLj EH symbols ++ _Unwind_SjLj_Register ++ _Unwind_SjLj_Unregister ++ _Unwind_SjLj_RaiseException ++ _Unwind_SjLj_ForcedUnwind ++ _Unwind_SjLj_Resume ++} ++ ++%inherit GCC_3.3 GCC_3.0 ++GCC_3.3 { ++ _Unwind_FindEnclosingFunction ++ _Unwind_GetCFA ++ _Unwind_Backtrace ++ _Unwind_Resume_or_Rethrow ++ _Unwind_SjLj_Resume_or_Rethrow ++} ++ ++%inherit GCC_3.3.1 GCC_3.3 ++GCC_3.3.1 { ++ __gcc_personality_sj0 ++ __gcc_personality_v0 ++} ++ ++%inherit GCC_3.3.2 GCC_3.3.1 ++GCC_3.3.2 { ++} ++ ++%inherit GCC_3.4 GCC_3.3.2 ++GCC_3.4 { ++ # bit scanning and counting built-ins ++ __clzsi2 ++ __clzdi2 ++ __clzti2 ++ __ctzsi2 ++ __ctzdi2 ++ __ctzti2 ++ __popcountsi2 ++ __popcountdi2 ++ __popcountti2 ++ __paritysi2 ++ __paritydi2 ++ __parityti2 ++} + diff --git a/patches/gcc/3.4.1/fix-fixincl.patch b/patches/gcc/3.4.1/fix-fixincl.patch new file mode 100644 index 00000000..7936b19b --- /dev/null +++ b/patches/gcc/3.4.1/fix-fixincl.patch @@ -0,0 +1,70 @@ +See http://gcc.gnu.org/PR22541 + +From: Dan Kegel + +When building gcc-3.4.3 or gcc-4.0.0 as a cross into a clean $PREFIX +(the only two I've tried like this), the configure script happily copies +the glibc include files from include to sys-include; here's the line +from the log file (with $PREFIX instead of the real prefix): + +Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include + +But later, when running fixincludes, it gives the error message + The directory that should contain system headers does not exist: + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include + +Nevertheless, it continues building; the header files it installs in + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include +do not include the boilerplate that would cause it to #include_next the +glibc headers in the system header directory. +Thus the resulting toolchain can't compile the following program: +#include <limits.h> +int x = PATH_MAX; +because its limits.h doesn't include the glibc header. + +That's not nice. I suspect the problem is that gcc/Makefile.in assumes that +it can refer to $PREFIX/i686-unknown-linux-gnu with the path + $PREFIX/lib/../i686-unknown-linux-gnu, but +that fails because the directory $PREFIX/lib doesn't exist during 'make all'; +it is only created later, during 'make install'. (Which makes this problem +confusing, since one only notices the breakage well after 'make install', +at which point the path configure complained about does exist, and has the +right stuff in it.) + +A possible fix is to replace the line in gcc/Makefile.in that says + SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ +with a version that gets rid of extra ..'s, e.g. + SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"` +(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq +for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.) + + +--- gcc-3.4.3/gcc/Makefile.in.foo 2005-05-20 11:41:39.000000000 -0700 ++++ gcc-3.4.3/gcc/Makefile.in 2005-05-20 12:08:46.000000000 -0700 +@@ -350,7 +350,10 @@ + CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@ + + # autoconf sets SYSTEM_HEADER_DIR to one of the above. +-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ ++# Purge it of unneccessary internal relative paths ++# to directories that might not exist yet. ++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta. ++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta` + + # Control whether to run fixproto and fixincludes. + STMP_FIXPROTO = @STMP_FIXPROTO@ +@@ -2532,11 +2535,13 @@ + $(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(gcc_tooldir) + + # Build fixed copies of system files. ++# Abort if no system headers available, unless building a crosscompiler. ++# FIXME: abort unless building --without-headers would be more accurate and less ugly + stmp-fixinc: fixinc.sh gsyslimits.h + @if test ! -d ${SYSTEM_HEADER_DIR}; then \ + echo The directory that should contain system headers does not exist: >&2 ; \ + echo " ${SYSTEM_HEADER_DIR}" >&2 ; \ +- if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \ ++ if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \ + then sleep 1; else exit 1; fi; \ + fi + rm -rf include; mkdir include diff --git a/patches/gcc/3.4.1/gcc-3.4-sparc-pr16430-fix.patch b/patches/gcc/3.4.1/gcc-3.4-sparc-pr16430-fix.patch new file mode 100644 index 00000000..2fc805b6 --- /dev/null +++ b/patches/gcc/3.4.1/gcc-3.4-sparc-pr16430-fix.patch @@ -0,0 +1,42 @@ +Message-ID: <33159.207.230.144.240.1093980498.squirrel@207.230.144.240> +Date: Tue, 31 Aug 2004 14:28:18 -0500 (CDT) +Subject: Crosstool 0.28-rc35 +From: "Jason Rothstein" <fdragon@fdragon.org> +To: dank@kegel.com + +Could you please add the patches in GCC PR 16430 to GCC 3.4.1? + +http://gcc.gnu.org/PR16430 + +These fix one of 2 current ICE conditions when building a sparc64 ada +compilers. + + +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/sparc/sparc.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.271.4.16&r2=1.271.4.17 + +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/config/sparc/sparc.c,v +retrieving revision 1.271.4.16 +retrieving revision 1.271.4.17 +diff -u -r1.271.4.16 -r1.271.4.17 +--- gcc/gcc/config/sparc/sparc.c 2004/07/08 13:00:56 1.271.4.16 ++++ gcc/gcc/config/sparc/sparc.c 2004/07/08 14:36:51 1.271.4.17 +@@ -5808,6 +5808,18 @@ + abort (); + + mode = mode_for_size (bytes * BITS_PER_UNIT, MODE_INT, 0); ++ ++ /* ??? We probably should have made the same ABI change in ++ 3.4.0 as the one we made for unions. The latter was ++ required by the SCD though, while the former is not ++ specified, so we favored compatibility and efficiency. ++ ++ Now we're stuck for aggregates larger than 16 bytes, ++ because OImode vanished in the meantime. Let's not ++ try to be unduly clever, and simply follow the ABI ++ for unions in that case. */ ++ if (mode == BLKmode) ++ return function_arg_union_value (bytes, mode, regbase); + } + else if (GET_MODE_CLASS (mode) == MODE_INT + && GET_MODE_SIZE (mode) < UNITS_PER_WORD) diff --git a/patches/gcc/3.4.1/gcc-3.4.0-arm-bigendian.patch b/patches/gcc/3.4.1/gcc-3.4.0-arm-bigendian.patch new file mode 100644 index 00000000..c9288c6c --- /dev/null +++ b/patches/gcc/3.4.1/gcc-3.4.0-arm-bigendian.patch @@ -0,0 +1,70 @@ +By Lennert Buytenhek <buytenh@wantstofly.org> +Adds support for arm*b-linux* big-endian ARM targets + +See http://gcc.gnu.org/PR16350 + +diff -urN gcc-3.4.0.orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h +--- gcc-3.4.0.orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-07-02 14:46:29.225443757 +0200 +@@ -30,17 +30,34 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 | \ ++ ARM_FLAG_MMU_TRAPS | \ ++ TARGET_ENDIAN_DEFAULT ) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -89,7 +106,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() +diff -urN gcc-3.4.0.orig/gcc/config.gcc gcc-3.4.0/gcc/config.gcc +--- gcc-3.4.0.orig/gcc/config.gcc 2004-04-17 04:28:24.000000000 +0200 ++++ gcc-3.4.0/gcc/config.gcc 2004-07-02 14:44:40.045822542 +0200 +@@ -666,6 +666,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/patches/gcc/3.4.1/gcc-3.4.0-arm-lib1asm.patch b/patches/gcc/3.4.1/gcc-3.4.0-arm-lib1asm.patch new file mode 100644 index 00000000..69a79d5d --- /dev/null +++ b/patches/gcc/3.4.1/gcc-3.4.0-arm-lib1asm.patch @@ -0,0 +1,27 @@ +# Origin: from a patch by Dimitry Andric <dimitry@andric.com>, 2004-05-01 +# See http://gcc.gnu.org/PR14352 and http://gcc.gnu.org/PR16314 +# See also http://gcc.gnu.org/ml/gcc-patches/2004-08/msg02568.html et seq for why this isn't in mainline +# Fixes errors like the following when building glibc (or any other executable +# or shared library) when using gcc 3.4.0 for ARM with softfloat: +# +# .../libc_pic.os(.text+0x15834): In function `__modf': undefined reference to `__subdf3' +# .../libc_pic.os(.text+0x158b8): In function `__modf': undefined reference to `__subdf3' +# .../libc_pic.os(.text+0x1590c): In function `scalbn': undefined reference to `__muldf3' +# .../libc_pic.os(.text+0x15e94): In function `__ldexpf': undefined reference to `__eqsf2' +# .../libc_pic.os(.text+0xcee4c): In function `monstartup': undefined reference to `__fixsfsi' + +diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux +--- gcc-3.4.0-orig/gcc/config/arm/t-linux 2003-09-20 23:09:07.000000000 +0200 ++++ gcc-3.4.0/gcc/config/arm/t-linux 2004-05-01 20:31:59.102846400 +0200 +@@ -4,7 +4,10 @@ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float diff --git a/patches/gcc/3.4.1/gcc-3.4.0-arm-nolibfloat.patch b/patches/gcc/3.4.1/gcc-3.4.0-arm-nolibfloat.patch new file mode 100644 index 00000000..43eed3ef --- /dev/null +++ b/patches/gcc/3.4.1/gcc-3.4.0-arm-nolibfloat.patch @@ -0,0 +1,24 @@ +# Dimitry Andric <dimitry@andric.com>, 2004-05-01 +# +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed +# anymore. (The required functions are now in libgcc.) +# +# Fixes errors like +# arm-softfloat-linux-gnu/3.4.0/../../../../arm-softfloat-linux-gnu/bin/ld: cannot find -lfloat +# collect2: ld returned 1 exit status +# make[2]: *** [arm-softfloat-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/iconvdata/ISO8859-1.so] Error 1 +# when building glibc-2.3.3 with gcc-3.4.0 for arm-softfloat + +diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h +--- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-05-01 19:19:06.935979200 +0200 +@@ -55,7 +73,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which + diff --git a/patches/gcc/3.4.1/pr15068-fix.patch b/patches/gcc/3.4.1/pr15068-fix.patch new file mode 100644 index 00000000..2977765c --- /dev/null +++ b/patches/gcc/3.4.1/pr15068-fix.patch @@ -0,0 +1,44 @@ +See http://gcc.gnu.org/PR15068 + +Fixes error + +../sysdeps/generic/s_fmax.c: In function `__fmax': +../sysdeps/generic/s_fmax.c:28: internal compiler error: in elim_reg_cond, at flow.c:3257 +Please submit a full bug report, +with preprocessed source if appropriate. +See <URL:http://gcc.gnu.org/bugs.html> for instructions. +make[2]: *** [/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/math/s_fmax.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822/math' +make[1]: *** [math/others] Error 2 +make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822' +make: *** [all] Error 2 + +[ rediffed against gcc-3.4.1, with elbow grease, ending up with same thing as +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-arm-branch&r1=1.563.4.2&r2=1.563.4.3 ] + +--- gcc-3.4.1/gcc/flow.c.old 2004-02-27 19:39:19.000000000 -0800 ++++ gcc-3.4.1/gcc/flow.c 2004-08-26 07:29:46.000000000 -0700 +@@ -1878,6 +1878,7 @@ + rtx set_src = SET_SRC (pc_set (BB_END (bb))); + rtx cond_true = XEXP (set_src, 0); + rtx reg = XEXP (cond_true, 0); ++ enum rtx_code inv_cond; + + if (GET_CODE (reg) == SUBREG) + reg = SUBREG_REG (reg); +@@ -1886,11 +1887,13 @@ + in the form of a comparison of a register against zero. + If the condition is more complex than that, then it is safe + not to record any information. */ +- if (GET_CODE (reg) == REG ++ inv_cond = reversed_comparison_code (cond_true, BB_END (bb)); ++ if (inv_cond != UNKNOWN ++ && GET_CODE (reg) == REG + && XEXP (cond_true, 1) == const0_rtx) + { + rtx cond_false +- = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)), ++ = gen_rtx_fmt_ee (inv_cond, + GET_MODE (cond_true), XEXP (cond_true, 0), + XEXP (cond_true, 1)); + if (GET_CODE (XEXP (set_src, 1)) == PC) diff --git a/patches/gcc/3.4.2/gcc-3.4.0-arm-bigendian.patch b/patches/gcc/3.4.2/gcc-3.4.0-arm-bigendian.patch new file mode 100644 index 00000000..f7178c19 --- /dev/null +++ b/patches/gcc/3.4.2/gcc-3.4.0-arm-bigendian.patch @@ -0,0 +1,82 @@ +By Lennert Buytenhek <buytenh@wantstofly.org> +Adds support for arm*b-linux* big-endian ARM targets + +Fixes build error + +/opt/crosstool/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/armeb-unknown-linux-gnu/bin/ld: unrecognised emulation mode: armelf_linux +Supported emulations: armelfb_linux armelfb +collect2: ld returned 1 exit status +make[2]: *** [/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/build-glibc/csu/crt1.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/glibc-2.3.3/csu' +make[1]: *** [csu/subdir_lib] Error 2 +make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/glibc-2.3.3' +make: *** [all] Error 2 + + +See http://gcc.gnu.org/PR16350 + +diff -urN gcc-3.4.0.orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h +--- gcc-3.4.0.orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-07-02 14:46:29.225443757 +0200 +@@ -30,17 +30,34 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 | \ ++ ARM_FLAG_MMU_TRAPS | \ ++ TARGET_ENDIAN_DEFAULT ) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -89,7 +106,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() +diff -urN gcc-3.4.0.orig/gcc/config.gcc gcc-3.4.0/gcc/config.gcc +--- gcc-3.4.0.orig/gcc/config.gcc 2004-04-17 04:28:24.000000000 +0200 ++++ gcc-3.4.0/gcc/config.gcc 2004-07-02 14:44:40.045822542 +0200 +@@ -666,6 +666,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/patches/gcc/3.4.2/gcc-3.4.0-arm-lib1asm.patch b/patches/gcc/3.4.2/gcc-3.4.0-arm-lib1asm.patch new file mode 100644 index 00000000..69a79d5d --- /dev/null +++ b/patches/gcc/3.4.2/gcc-3.4.0-arm-lib1asm.patch @@ -0,0 +1,27 @@ +# Origin: from a patch by Dimitry Andric <dimitry@andric.com>, 2004-05-01 +# See http://gcc.gnu.org/PR14352 and http://gcc.gnu.org/PR16314 +# See also http://gcc.gnu.org/ml/gcc-patches/2004-08/msg02568.html et seq for why this isn't in mainline +# Fixes errors like the following when building glibc (or any other executable +# or shared library) when using gcc 3.4.0 for ARM with softfloat: +# +# .../libc_pic.os(.text+0x15834): In function `__modf': undefined reference to `__subdf3' +# .../libc_pic.os(.text+0x158b8): In function `__modf': undefined reference to `__subdf3' +# .../libc_pic.os(.text+0x1590c): In function `scalbn': undefined reference to `__muldf3' +# .../libc_pic.os(.text+0x15e94): In function `__ldexpf': undefined reference to `__eqsf2' +# .../libc_pic.os(.text+0xcee4c): In function `monstartup': undefined reference to `__fixsfsi' + +diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux +--- gcc-3.4.0-orig/gcc/config/arm/t-linux 2003-09-20 23:09:07.000000000 +0200 ++++ gcc-3.4.0/gcc/config/arm/t-linux 2004-05-01 20:31:59.102846400 +0200 +@@ -4,7 +4,10 @@ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float diff --git a/patches/gcc/3.4.2/gcc-3.4.0-arm-nolibfloat.patch b/patches/gcc/3.4.2/gcc-3.4.0-arm-nolibfloat.patch new file mode 100644 index 00000000..43eed3ef --- /dev/null +++ b/patches/gcc/3.4.2/gcc-3.4.0-arm-nolibfloat.patch @@ -0,0 +1,24 @@ +# Dimitry Andric <dimitry@andric.com>, 2004-05-01 +# +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed +# anymore. (The required functions are now in libgcc.) +# +# Fixes errors like +# arm-softfloat-linux-gnu/3.4.0/../../../../arm-softfloat-linux-gnu/bin/ld: cannot find -lfloat +# collect2: ld returned 1 exit status +# make[2]: *** [arm-softfloat-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/iconvdata/ISO8859-1.so] Error 1 +# when building glibc-2.3.3 with gcc-3.4.0 for arm-softfloat + +diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h +--- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-05-01 19:19:06.935979200 +0200 +@@ -55,7 +73,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which + diff --git a/patches/gcc/3.4.3/fix-fixincl.patch b/patches/gcc/3.4.3/fix-fixincl.patch new file mode 100644 index 00000000..7936b19b --- /dev/null +++ b/patches/gcc/3.4.3/fix-fixincl.patch @@ -0,0 +1,70 @@ +See http://gcc.gnu.org/PR22541 + +From: Dan Kegel + +When building gcc-3.4.3 or gcc-4.0.0 as a cross into a clean $PREFIX +(the only two I've tried like this), the configure script happily copies +the glibc include files from include to sys-include; here's the line +from the log file (with $PREFIX instead of the real prefix): + +Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include + +But later, when running fixincludes, it gives the error message + The directory that should contain system headers does not exist: + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include + +Nevertheless, it continues building; the header files it installs in + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include +do not include the boilerplate that would cause it to #include_next the +glibc headers in the system header directory. +Thus the resulting toolchain can't compile the following program: +#include <limits.h> +int x = PATH_MAX; +because its limits.h doesn't include the glibc header. + +That's not nice. I suspect the problem is that gcc/Makefile.in assumes that +it can refer to $PREFIX/i686-unknown-linux-gnu with the path + $PREFIX/lib/../i686-unknown-linux-gnu, but +that fails because the directory $PREFIX/lib doesn't exist during 'make all'; +it is only created later, during 'make install'. (Which makes this problem +confusing, since one only notices the breakage well after 'make install', +at which point the path configure complained about does exist, and has the +right stuff in it.) + +A possible fix is to replace the line in gcc/Makefile.in that says + SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ +with a version that gets rid of extra ..'s, e.g. + SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"` +(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq +for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.) + + +--- gcc-3.4.3/gcc/Makefile.in.foo 2005-05-20 11:41:39.000000000 -0700 ++++ gcc-3.4.3/gcc/Makefile.in 2005-05-20 12:08:46.000000000 -0700 +@@ -350,7 +350,10 @@ + CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@ + + # autoconf sets SYSTEM_HEADER_DIR to one of the above. +-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ ++# Purge it of unneccessary internal relative paths ++# to directories that might not exist yet. ++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta. ++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta` + + # Control whether to run fixproto and fixincludes. + STMP_FIXPROTO = @STMP_FIXPROTO@ +@@ -2532,11 +2535,13 @@ + $(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(gcc_tooldir) + + # Build fixed copies of system files. ++# Abort if no system headers available, unless building a crosscompiler. ++# FIXME: abort unless building --without-headers would be more accurate and less ugly + stmp-fixinc: fixinc.sh gsyslimits.h + @if test ! -d ${SYSTEM_HEADER_DIR}; then \ + echo The directory that should contain system headers does not exist: >&2 ; \ + echo " ${SYSTEM_HEADER_DIR}" >&2 ; \ +- if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \ ++ if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \ + then sleep 1; else exit 1; fi; \ + fi + rm -rf include; mkdir include diff --git a/patches/gcc/3.4.3/gcc-3.4.0-arm-bigendian.patch b/patches/gcc/3.4.3/gcc-3.4.0-arm-bigendian.patch new file mode 100644 index 00000000..f7178c19 --- /dev/null +++ b/patches/gcc/3.4.3/gcc-3.4.0-arm-bigendian.patch @@ -0,0 +1,82 @@ +By Lennert Buytenhek <buytenh@wantstofly.org> +Adds support for arm*b-linux* big-endian ARM targets + +Fixes build error + +/opt/crosstool/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/armeb-unknown-linux-gnu/bin/ld: unrecognised emulation mode: armelf_linux +Supported emulations: armelfb_linux armelfb +collect2: ld returned 1 exit status +make[2]: *** [/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/build-glibc/csu/crt1.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/glibc-2.3.3/csu' +make[1]: *** [csu/subdir_lib] Error 2 +make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/glibc-2.3.3' +make: *** [all] Error 2 + + +See http://gcc.gnu.org/PR16350 + +diff -urN gcc-3.4.0.orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h +--- gcc-3.4.0.orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-07-02 14:46:29.225443757 +0200 +@@ -30,17 +30,34 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 | \ ++ ARM_FLAG_MMU_TRAPS | \ ++ TARGET_ENDIAN_DEFAULT ) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -89,7 +106,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() +diff -urN gcc-3.4.0.orig/gcc/config.gcc gcc-3.4.0/gcc/config.gcc +--- gcc-3.4.0.orig/gcc/config.gcc 2004-04-17 04:28:24.000000000 +0200 ++++ gcc-3.4.0/gcc/config.gcc 2004-07-02 14:44:40.045822542 +0200 +@@ -666,6 +666,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/patches/gcc/3.4.3/gcc-3.4.0-arm-lib1asm.patch b/patches/gcc/3.4.3/gcc-3.4.0-arm-lib1asm.patch new file mode 100644 index 00000000..69a79d5d --- /dev/null +++ b/patches/gcc/3.4.3/gcc-3.4.0-arm-lib1asm.patch @@ -0,0 +1,27 @@ +# Origin: from a patch by Dimitry Andric <dimitry@andric.com>, 2004-05-01 +# See http://gcc.gnu.org/PR14352 and http://gcc.gnu.org/PR16314 +# See also http://gcc.gnu.org/ml/gcc-patches/2004-08/msg02568.html et seq for why this isn't in mainline +# Fixes errors like the following when building glibc (or any other executable +# or shared library) when using gcc 3.4.0 for ARM with softfloat: +# +# .../libc_pic.os(.text+0x15834): In function `__modf': undefined reference to `__subdf3' +# .../libc_pic.os(.text+0x158b8): In function `__modf': undefined reference to `__subdf3' +# .../libc_pic.os(.text+0x1590c): In function `scalbn': undefined reference to `__muldf3' +# .../libc_pic.os(.text+0x15e94): In function `__ldexpf': undefined reference to `__eqsf2' +# .../libc_pic.os(.text+0xcee4c): In function `monstartup': undefined reference to `__fixsfsi' + +diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux +--- gcc-3.4.0-orig/gcc/config/arm/t-linux 2003-09-20 23:09:07.000000000 +0200 ++++ gcc-3.4.0/gcc/config/arm/t-linux 2004-05-01 20:31:59.102846400 +0200 +@@ -4,7 +4,10 @@ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float diff --git a/patches/gcc/3.4.3/gcc-3.4.0-arm-nolibfloat.patch b/patches/gcc/3.4.3/gcc-3.4.0-arm-nolibfloat.patch new file mode 100644 index 00000000..43eed3ef --- /dev/null +++ b/patches/gcc/3.4.3/gcc-3.4.0-arm-nolibfloat.patch @@ -0,0 +1,24 @@ +# Dimitry Andric <dimitry@andric.com>, 2004-05-01 +# +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed +# anymore. (The required functions are now in libgcc.) +# +# Fixes errors like +# arm-softfloat-linux-gnu/3.4.0/../../../../arm-softfloat-linux-gnu/bin/ld: cannot find -lfloat +# collect2: ld returned 1 exit status +# make[2]: *** [arm-softfloat-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/iconvdata/ISO8859-1.so] Error 1 +# when building glibc-2.3.3 with gcc-3.4.0 for arm-softfloat + +diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h +--- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-05-01 19:19:06.935979200 +0200 +@@ -55,7 +73,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which + diff --git a/patches/gcc/3.4.3/pr15068-fix.patch b/patches/gcc/3.4.3/pr15068-fix.patch new file mode 100644 index 00000000..2977765c --- /dev/null +++ b/patches/gcc/3.4.3/pr15068-fix.patch @@ -0,0 +1,44 @@ +See http://gcc.gnu.org/PR15068 + +Fixes error + +../sysdeps/generic/s_fmax.c: In function `__fmax': +../sysdeps/generic/s_fmax.c:28: internal compiler error: in elim_reg_cond, at flow.c:3257 +Please submit a full bug report, +with preprocessed source if appropriate. +See <URL:http://gcc.gnu.org/bugs.html> for instructions. +make[2]: *** [/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/math/s_fmax.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822/math' +make[1]: *** [math/others] Error 2 +make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822' +make: *** [all] Error 2 + +[ rediffed against gcc-3.4.1, with elbow grease, ending up with same thing as +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-arm-branch&r1=1.563.4.2&r2=1.563.4.3 ] + +--- gcc-3.4.1/gcc/flow.c.old 2004-02-27 19:39:19.000000000 -0800 ++++ gcc-3.4.1/gcc/flow.c 2004-08-26 07:29:46.000000000 -0700 +@@ -1878,6 +1878,7 @@ + rtx set_src = SET_SRC (pc_set (BB_END (bb))); + rtx cond_true = XEXP (set_src, 0); + rtx reg = XEXP (cond_true, 0); ++ enum rtx_code inv_cond; + + if (GET_CODE (reg) == SUBREG) + reg = SUBREG_REG (reg); +@@ -1886,11 +1887,13 @@ + in the form of a comparison of a register against zero. + If the condition is more complex than that, then it is safe + not to record any information. */ +- if (GET_CODE (reg) == REG ++ inv_cond = reversed_comparison_code (cond_true, BB_END (bb)); ++ if (inv_cond != UNKNOWN ++ && GET_CODE (reg) == REG + && XEXP (cond_true, 1) == const0_rtx) + { + rtx cond_false +- = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)), ++ = gen_rtx_fmt_ee (inv_cond, + GET_MODE (cond_true), XEXP (cond_true, 0), + XEXP (cond_true, 1)); + if (GET_CODE (XEXP (set_src, 1)) == PC) diff --git a/patches/gcc/3.4.3/pr16201-fix.patch b/patches/gcc/3.4.3/pr16201-fix.patch new file mode 100644 index 00000000..be3fec97 --- /dev/null +++ b/patches/gcc/3.4.3/pr16201-fix.patch @@ -0,0 +1,149 @@ +See http://gcc.gnu.org/PR16201 + +Should fix "bad immediate value for offset" errors for several flavors of arm, e.g. + +/tmp/ccmdoQyg.s: Assembler messages: +/tmp/ccmdoQyg.s:6235: Error: bad immediate value for offset (4096) +make[2]: *** [crosstool-0.32/build/arm-xscale-linux-gnu/gcc-3.4.3-glibc-2.3.3/build-glibc/locale/ld-collate.o] Error 1 + +/tmp/cc0c7qop.s: Assembler messages: +/tmp/cc0c7qop.s:6234: Error: bad immediate value for offset (4104) +make[2]: *** [crosstool-0.32/build/armv5b-softfloat-linux/gcc-3.4.3-glibc-2.3.3/build-glibc/locale/ld-collate.o] Error 1 + + +CVSROOT: /cvs/gcc +Module name: gcc +Branch: gcc-3_4-branch +Changes by: rearnsha@gcc.gnu.org 2005-02-01 15:07:05 + +Modified files: + gcc : ChangeLog + gcc/config/arm : arm-protos.h arm.c + +Log message: + PR target/16201 + * arm.c (arm_eliminable_register): New function. + (adjacent_mem_locations): Don't allow eliminable registers. Use + HOST_WIDE_INT for address offsets. + * arm-protos.h (arm_eliminable_register): Add prototype. + +Patches: +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=2.2326.2.790&r2=2.2326.2.791 +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/arm/arm-protos.h.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.61&r2=1.61.4.1 +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/arm/arm.c.diff?cvsroot=gcc&only_with_tag=gcc-3_4-branch&r1=1.317.4.8&r2=1.317.4.9 + +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/config/arm/arm-protos.h,v +retrieving revision 1.61 +retrieving revision 1.61.4.1 +diff -u -r1.61 -r1.61.4.1 +--- gcc/gcc/config/arm/arm-protos.h 2003/11/20 11:44:18 1.61 ++++ gcc/gcc/config/arm/arm-protos.h 2005/02/01 15:07:02 1.61.4.1 +@@ -1,5 +1,6 @@ + /* Prototypes for exported functions defined in arm.c and pe.c +- Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2001, 2002, 2003, 2005 ++ Free Software Foundation, Inc. + Contributed by Richard Earnshaw (rearnsha@arm.com) + Minor hacks by Nick Clifton (nickc@cygnus.com) + +@@ -138,6 +139,7 @@ + extern int arm_is_longcall_p (rtx, int, int); + extern int arm_emit_vector_const (FILE *, rtx); + extern const char * arm_output_load_gr (rtx *); ++extern int arm_eliminable_register (rtx); + + #if defined TREE_CODE + extern rtx arm_function_arg (CUMULATIVE_ARGS *, enum machine_mode, tree, int); +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/config/arm/arm.c,v +retrieving revision 1.317.4.8 +retrieving revision 1.317.4.9 +diff -u -r1.317.4.8 -r1.317.4.9 +--- gcc/gcc/config/arm/arm.c 2004/04/29 19:52:41 1.317.4.8 ++++ gcc/gcc/config/arm/arm.c 2005/02/01 15:07:02 1.317.4.9 +@@ -1,6 +1,6 @@ + /* Output routines for GCC for ARM. + Copyright (C) 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, +- 2002, 2003, 2004 Free Software Foundation, Inc. ++ 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + Contributed by Pieter `Tiggr' Schoenmakers (rcpieter@win.tue.nl) + and Martin Simmons (@harleqn.co.uk). + More major hacks by Richard Earnshaw (rearnsha@arm.com). +@@ -4056,6 +4056,16 @@ + && INTVAL (op) < 64); + } + ++/* Return true if X is a register that will be eliminated later on. */ ++int ++arm_eliminable_register (rtx x) ++{ ++ return REG_P (x) && (REGNO (x) == FRAME_POINTER_REGNUM ++ || REGNO (x) == ARG_POINTER_REGNUM ++ || (REGNO (x) >= FIRST_VIRTUAL_REGISTER ++ && REGNO (x) <= LAST_VIRTUAL_REGISTER)); ++} ++ + /* Returns TRUE if INSN is an "LDR REG, ADDR" instruction. + Use by the Cirrus Maverick code which has to workaround + a hardware bug triggered by such instructions. */ +@@ -4569,33 +4579,42 @@ + || (GET_CODE (XEXP (b, 0)) == PLUS + && GET_CODE (XEXP (XEXP (b, 0), 1)) == CONST_INT))) + { +- int val0 = 0, val1 = 0; +- int reg0, reg1; +- ++ HOST_WIDE_INT val0 = 0, val1 = 0; ++ rtx reg0, reg1; ++ int val_diff; ++ + if (GET_CODE (XEXP (a, 0)) == PLUS) + { +- reg0 = REGNO (XEXP (XEXP (a, 0), 0)); ++ reg0 = XEXP (XEXP (a, 0), 0); + val0 = INTVAL (XEXP (XEXP (a, 0), 1)); + } + else +- reg0 = REGNO (XEXP (a, 0)); ++ reg0 = XEXP (a, 0); + + if (GET_CODE (XEXP (b, 0)) == PLUS) + { +- reg1 = REGNO (XEXP (XEXP (b, 0), 0)); ++ reg1 = XEXP (XEXP (b, 0), 0); + val1 = INTVAL (XEXP (XEXP (b, 0), 1)); + } + else +- reg1 = REGNO (XEXP (b, 0)); ++ reg1 = XEXP (b, 0); + + /* Don't accept any offset that will require multiple + instructions to handle, since this would cause the + arith_adjacentmem pattern to output an overlong sequence. */ + if (!const_ok_for_op (PLUS, val0) || !const_ok_for_op (PLUS, val1)) + return 0; +- +- return (reg0 == reg1) && ((val1 - val0) == 4 || (val0 - val1) == 4); ++ ++ /* Don't allow an eliminable register: register elimination can make ++ the offset too large. */ ++ if (arm_eliminable_register (reg0)) ++ return 0; ++ ++ val_diff = val1 - val0; ++ return ((REGNO (reg0) == REGNO (reg1)) ++ && (val_diff == 4 || val_diff == -4)); + } ++ + return 0; + } + +@@ -7301,7 +7320,6 @@ + return ""; + } + +- + /* Output a move from arm registers to an fpa registers. + OPERANDS[0] is an fpa register. + OPERANDS[1] is the first registers of an arm register pair. */ diff --git a/patches/gcc/3.4.3/pr18508-fix.patch b/patches/gcc/3.4.3/pr18508-fix.patch new file mode 100644 index 00000000..a438fee8 --- /dev/null +++ b/patches/gcc/3.4.3/pr18508-fix.patch @@ -0,0 +1,143 @@ +See http://gcc.gnu.org/PR18508 + +This should fix cygwin errors like: + +basename: missing operand +Try `basename --help' for more information. +mv: `libgcc_s_nof.so.1' and `libgcc_s_nof.so.1.' are the same file +make[2]: *** [nof/libgcc_s_nof.so] Error 1 +make[2]: Leaving directory `/home/cvachoucek/crosstool-0.32/build/powerpc-750-linux-gnu/gcc-3.4.3-glibc-2.3.5/build-gcc/gcc' +make[1]: *** [stmp-multilib] Error 2 +make[1]: Leaving directory `/home/cvachoucek/crosstool-0.32/build/powerpc-750-linux-gnu/gcc-3.4.3-glibc-2.3.5/build-gcc/gcc' +make: *** [install-gcc] Error 2 + +From gcc-patches-return-133821-listarch-gcc-patches=gcc dot gnu dot org at gcc dot gnu dot org Wed Nov 17 00:15:28 2004 +Return-Path: <gcc-patches-return-133821-listarch-gcc-patches=gcc dot gnu dot org at gcc dot gnu dot org> +Delivered-To: listarch-gcc-patches at gcc dot gnu dot org +Received: (qmail 12823 invoked by alias); 17 Nov 2004 00:15:19 -0000 +Mailing-List: contact gcc-patches-help at gcc dot gnu dot org; run by ezmlm +List-Archive: <http://gcc.gnu.org/ml/gcc-patches/> +List-Post: <mailto:gcc-patches at gcc dot gnu dot org> +List-Help: <mailto:gcc-patches-help at gcc dot gnu dot org> +Sender: gcc-patches-owner at gcc dot gnu dot org +Date: Tue, 16 Nov 2004 16:14:57 -0800 +From: "H dot J dot Lu" <hjl at lucon dot org> +To: gcc-patches at gcc dot gnu dot org +Subject: PATCH: PR other/18508: "basename: too few arguments" when building without bootstrap +Message-ID: <20041117001457.GA13610@lucon.org> + +I think it is safe to use `.backup' to backup the existing shared +library. No processes should be using the old shared library when +we get there. + + +H.J. +--- +2004-11-16 H.J. Lu <hongjiu.lu@intel.com> + + PR other/18508 + * config/alpha/t-osf4 (SHLIB_LINK): Use `.backup' as the suffix + to back up the existing shared library. + * config/arm/t-netbsd (SHLIB_LINK): Likewise. + * config/i386/t-nwld (SHLIB_LINK): Likewise. [deleted] + * config/mips/t-slibgcc-irix (SHLIB_LINK): Likewise. [deleted] + * config/pa/t-hpux-shlib (SHLIB_LINK): Likewise. + * config/sh/t-linux (SHLIB_LINK): Likewise. + * config/t-libunwind-elf (SHLIBUNWIND_LINK): Likewise. + * config/t-slibgcc-darwin (SHLIB_LINK): Likewise. + * config/t-slibgcc-elf-ver (SHLIB_LINK): Likewise. + * config/t-slibgcc-sld (SHLIB_LINK): Likewise. + +[ paths adjusted for patch -p1, rediffed agaainst gcc-3.4.3. + Looks like the t-iris5-6 hunk in cvs is missing here; this must + have been the mainline patch. ] + +--- gcc-3.4.3/gcc/config/alpha/t-osf4.stage 2004-10-18 09:14:39.000000000 -0700 ++++ gcc-3.4.3/gcc/config/alpha/t-osf4 2004-11-16 16:06:41.686905479 -0800 +@@ -19,7 +19,7 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2 + -o $(SHLIB_NAME).tmp @multilib_flags@ $(SHLIB_OBJS) -lc && \ + rm -f $(SHLIB_SONAME) && \ + if [ -f $(SHLIB_NAME) ]; then \ +- mv -f $(SHLIB_NAME) $(SHLIB_NAME).`basename $(STAGE_PREFIX)`; \ ++ mv -f $(SHLIB_NAME) $(SHLIB_NAME).backup; \ + else true; fi && \ + mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \ + $(LN_S) $(SHLIB_NAME) $(SHLIB_SONAME) +--- gcc-3.4.3/gcc/config/arm/t-netbsd.stage 2004-10-18 09:14:40.000000000 -0700 ++++ gcc-3.4.3/gcc/config/arm/t-netbsd 2004-11-16 16:06:46.016348194 -0800 +@@ -14,7 +14,7 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2 + -o $(SHLIB_NAME).tmp @multilib_flags@ $(SHLIB_OBJS) -lc && \ + rm -f $(SHLIB_SONAME) && \ + if [ -f $(SHLIB_NAME) ]; then \ +- mv -f $(SHLIB_NAME) $(SHLIB_NAME).`basename $(STAGE_PREFIX)`; \ ++ mv -f $(SHLIB_NAME) $(SHLIB_NAME).backup; \ + else true; fi && \ + mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \ + $(LN_S) $(SHLIB_NAME) $(SHLIB_SONAME) +--- gcc-3.4.3/gcc/config/pa/t-hpux-shlib.stage 2004-10-18 09:14:46.000000000 -0700 ++++ gcc-3.4.3/gcc/config/pa/t-hpux-shlib 2004-11-16 16:06:57.982807875 -0800 +@@ -8,7 +8,7 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2 + -o $(SHLIB_NAME).tmp @multilib_flags@ $(SHLIB_OBJS) -lc && \ + rm -f $(SHLIB_SONAME) && \ + if [ -f $(SHLIB_NAME) ]; then \ +- mv -f $(SHLIB_NAME) $(SHLIB_NAME).`basename $(STAGE_PREFIX)`; \ ++ mv -f $(SHLIB_NAME) $(SHLIB_NAME).backup; \ + else true; fi && \ + mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \ + $(LN_S) $(SHLIB_NAME) $(SHLIB_SONAME) +--- gcc-3.4.3/gcc/config/sh/t-linux.stage 2004-10-18 09:14:48.000000000 -0700 ++++ gcc-3.4.3/gcc/config/sh/t-linux 2004-11-16 16:07:00.787446863 -0800 +@@ -24,7 +24,7 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2 + -o $(SHLIB_NAME).tmp @multilib_flags@ $(SHLIB_OBJS) $(SHLIB_LC) && \ + rm -f $(SHLIB_SOLINK) && \ + if [ -f $(SHLIB_NAME) ]; then \ +- mv -f $(SHLIB_NAME) $(SHLIB_NAME).`basename $(STAGE_PREFIX)`; \ ++ mv -f $(SHLIB_NAME) $(SHLIB_NAME).backup; \ + else true; fi && \ + mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \ + (echo "/* GNU ld script"; \ +--- gcc-3.4.3/gcc/config/t-libunwind-elf.stage 2004-10-18 09:14:39.000000000 -0700 ++++ gcc-3.4.3/gcc/config/t-libunwind-elf 2004-11-16 16:07:08.133501281 -0800 +@@ -14,8 +14,7 @@ SHLIBUNWIND_LINK = $(GCC_FOR_TARGET) $(L + @multilib_flags@ $(SHLIB_OBJS) -lc && \ + rm -f $(SHLIB_SOLINK) && \ + if [ -f $(SHLIBUNWIND_NAME) ]; then \ +- mv -f $(SHLIBUNWIND_NAME) \ +- $(SHLIBUNWIND_NAME).`basename $(STAGE_PREFIX)`; \ ++ mv -f $(SHLIBUNWIND_NAME) $(SHLIBUNWIND_NAME).backup; \ + else true; fi && \ + mv $(SHLIBUNWIND_NAME).tmp $(SHLIBUNWIND_NAME) && \ + $(LN_S) $(SHLIBUNWIND_NAME) $(SHLIB_SOLINK) +--- gcc-3.4.3/gcc/config/t-slibgcc-darwin.stage 2004-10-18 09:14:39.000000000 -0700 ++++ gcc-3.4.3/gcc/config/t-slibgcc-darwin 2004-11-16 16:07:13.777774752 -0800 +@@ -17,7 +17,7 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2 + @multilib_flags@ $(SHLIB_OBJS) -lc && \ + rm -f $(SHLIB_SOLINK) && \ + if [ -f $(SHLIB_NAME) ]; then \ +- mv -f $(SHLIB_NAME) $(SHLIB_NAME).`basename $(STAGE_PREFIX)`; \ ++ mv -f $(SHLIB_NAME) $(SHLIB_NAME).backup; \ + else true; fi && \ + mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \ + $(LN_S) $(SHLIB_NAME) $(SHLIB_SOLINK) +--- gcc-3.4.3/gcc/config/t-slibgcc-elf-ver.stage 2004-10-18 09:14:39.000000000 -0700 ++++ gcc-3.4.3/gcc/config/t-slibgcc-elf-ver 2004-11-16 16:04:40.961445223 -0800 +@@ -17,7 +17,7 @@ SHLIB_LINK = $(GCC_FOR_TARGET) $(LIBGCC2 + -o $(SHLIB_NAME).tmp @multilib_flags@ $(SHLIB_OBJS) $(SHLIB_LC) && \ + rm -f $(SHLIB_SOLINK) && \ + if [ -f $(SHLIB_NAME) ]; then \ +- mv -f $(SHLIB_NAME) $(SHLIB_NAME).`basename $(STAGE_PREFIX)`; \ ++ mv -f $(SHLIB_NAME) $(SHLIB_NAME).backup; \ + else true; fi && \ + mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \ + $(LN_S) $(SHLIB_NAME) $(SHLIB_SOLINK) +--- gcc-3.4.3/gcc/config/t-slibgcc-sld.old 2004-10-18 09:00:47.000000000 -0700 ++++ gcc-3.4.3/gcc/config/t-slibgcc-sld 2005-05-14 13:44:48.000000000 -0700 +@@ -14,7 +14,7 @@ + @multilib_flags@ $(SHLIB_OBJS) -lc && \ + rm -f $(SHLIB_SOLINK) && \ + if [ -f $(SHLIB_NAME) ]; then \ +- mv -f $(SHLIB_NAME) $(SHLIB_NAME).`basename $(STAGE_PREFIX)`; \ ++ mv -f $(SHLIB_NAME) $(SHLIB_NAME).backup; \ + else true; fi && \ + mv $(SHLIB_NAME).tmp $(SHLIB_NAME) && \ + $(LN_S) $(SHLIB_NAME) $(SHLIB_SOLINK) diff --git a/patches/gcc/3.4.4/100-uclibc-conf.patch b/patches/gcc/3.4.4/100-uclibc-conf.patch new file mode 100644 index 00000000..00ea4eeb --- /dev/null +++ b/patches/gcc/3.4.4/100-uclibc-conf.patch @@ -0,0 +1,470 @@ +--- gcc-3.4.1/gcc/config/t-linux-uclibc ++++ gcc-3.4.1/gcc/config/t-linux-uclibc +@@ -0,0 +1,5 @@ ++# Remove glibc specific files added in t-linux ++SHLIB_MAPFILES := $(filter-out $(srcdir)/config/libgcc-glibc.ver, $(SHLIB_MAPFILES)) ++ ++# Use unwind-dw2-fde instead of unwind-dw2-fde-glibc ++LIB2ADDEH := $(subst unwind-dw2-fde-glibc.c,unwind-dw2-fde.c,$(LIB2ADDEH)) +--- gcc-3.4.1/gcc/config.gcc ++++ gcc-3.4.1/gcc/config.gcc +@@ -2310,10 +2310,16 @@ + *) + echo "*** Configuration ${target} not supported" 1>&2 + exit 1 + ;; + esac ++ ++# Rather than hook into each target, just do it after all the linux ++# targets have been processed ++case ${target} in ++*-linux-uclibc*) tm_defines="${tm_defines} USE_UCLIBC" ; tmake_file="${tmake_file} t-linux-uclibc" ++esac + + # Support for --with-cpu and related options (and a few unrelated options, + # too). + case ${with_cpu} in + yes | no) +--- gcc-3.4.4/gcc/config/alpha/linux-elf.h ++++ gcc-3.4.4/gcc/config/alpha/linux-elf.h +@@ -27,7 +27,11 @@ + #define SUBTARGET_EXTRA_SPECS \ + { "elf_dynamic_linker", ELF_DYNAMIC_LINKER }, + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else + #define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + + #define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \ + %{O*:-O3} %{!O*:-O1} \ +--- gcc-3.4.1-dist/gcc/config/arm/linux-elf.h 2004-01-31 00:18:11.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-08-12 15:54:42.000000000 -0500 +@@ -80,14 +80,19 @@ + #define ENDFILE_SPEC \ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ + %{shared:-shared} \ + %{symbolic:-Bsymbolic} \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "} \ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC +--- gcc-3.4.1-dist/gcc/config/cris/linux.h 2003-11-28 21:08:09.000000000 -0600 ++++ gcc-3.4.1/gcc/config/cris/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -79,6 +79,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -93,6 +112,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +--- gcc-3.4.1-dist/gcc/config/i386/linux.h 2003-11-28 21:08:10.000000000 -0600 ++++ gcc-3.4.1/gcc/config/i386/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -110,22 +110,21 @@ + + #undef LINK_SPEC + #ifdef USE_GNULIBC_1 +-#define LINK_SPEC "-m elf_i386 %{shared:-shared} \ +- %{!shared: \ +- %{!ibcs: \ +- %{!static: \ +- %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \ +- %{static:-static}}}" ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.1" ++#else ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" + #else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif ++#endif + #define LINK_SPEC "-m elf_i386 %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}}" +-#endif + + /* A C statement (sans semicolon) to output to the stdio stream + FILE the assembler definition of uninitialized global DECL named +--- gcc-3.4.4/gcc/config/i386/linux64.h ++++ gcc-3.4.4/gcc/config/i386/linux64.h +@@ -54,14 +54,21 @@ + When the -shared link option is used a final link is not being + done. */ + ++#ifdef USE_UCLIBC ++#define ELF32_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0" ++#else ++#define ELF32_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#define ELF64_DYNAMIC_LINKER "/lib64/ld-linux-x86-64.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "%{!m32:-m elf_x86_64} %{m32:-m elf_i386} \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{m32:%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ +- %{!m32:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} \ ++ %{m32:%{!dynamic-linker:-dynamic-linker " ELF32_DYNAMIC_LINKER "}} \ ++ %{!m32:%{!dynamic-linker:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}} \ + %{static:-static}}" + + #define MULTILIB_DEFAULTS { "m64" } +--- gcc-3.4.4/gcc/config/ia64/linux.h ++++ gcc-3.4.4/gcc/config/ia64/linux.h +@@ -37,13 +37,18 @@ + /* Define this for shared library support because it isn't in the main + linux.h file. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "\ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux-ia64.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}" + + +--- gcc-3.4.4/gcc/config/m68k/linux.h ++++ gcc-3.4.4/gcc/config/m68k/linux.h +@@ -131,12 +131,17 @@ + + /* If ELF is the default format, we should not use /lib/elf. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "-m m68kelf %{shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker*:-dynamic-linker /lib/ld.so.1}} \ ++ %{!dynamic-linker*:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static}}" + + /* For compatibility with linux/a.out */ +--- gcc-3.4.1-dist/gcc/config/mips/linux.h 2004-06-15 20:42:24.000000000 -0500 ++++ gcc-3.4.1/gcc/config/mips/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -109,14 +109,19 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" ++#endif + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}}" + + #undef SUBTARGET_ASM_SPEC +--- gcc-3.4.4/gcc/config/pa/pa-linux.h ++++ gcc-3.4.4/gcc/config/pa/pa-linux.h +@@ -77,13 +77,18 @@ + /* Define this for shared library support because it isn't in the main + linux.h file. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "\ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}" + + /* glibc's profiling functions don't need gcc to allocate counters. */ +--- gcc-3.4.1-dist/gcc/config/rs6000/linux.h 2004-02-25 09:11:19.000000000 -0600 ++++ gcc-3.4.1/gcc/config/rs6000/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -69,7 +69,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #define LINK_GCC_C_SEQUENCE_SPEC \ + "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" +--- gcc-3.4.1-dist/gcc/config/rs6000/sysv4.h 2004-06-10 01:39:50.000000000 -0500 ++++ gcc-3.4.1/gcc/config/rs6000/sysv4.h 2004-08-12 15:54:43.000000000 -0500 +@@ -947,6 +947,7 @@ + mcall-linux : %(link_os_linux) ; \ + mcall-gnu : %(link_os_gnu) ; \ + mcall-netbsd : %(link_os_netbsd) ; \ ++ mcall-linux-uclibc : %(link_os_linux_uclibc); \ + mcall-openbsd: %(link_os_openbsd) ; \ + : %(link_os_default) }" + +@@ -1125,6 +1126,10 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}" + ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + #if defined(HAVE_LD_EH_FRAME_HDR) + # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " + #endif +@@ -1291,6 +1296,7 @@ + { "link_os_sim", LINK_OS_SIM_SPEC }, \ + { "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \ + { "link_os_linux", LINK_OS_LINUX_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_gnu", LINK_OS_GNU_SPEC }, \ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \ +--- gcc-3.4.4/gcc/config/s390/linux.h ++++ gcc-3.4.4/gcc/config/s390/linux.h +@@ -77,6 +77,13 @@ + #define MULTILIB_DEFAULTS { "m31" } + #endif + ++#ifdef USE_UCLIBC ++#define ELF31_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0" ++#else ++#define ELF31_DYNAMIC_LINKER "/lib/ld.so.1" ++#define ELF64_DYNAMIC_LINKER "/lib/ld64.so.1" ++#endif + #undef LINK_SPEC + #define LINK_SPEC \ + "%{m31:-m elf_s390}%{m64:-m elf64_s390} \ +@@ -86,8 +93,8 @@ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker: \ +- %{m31:-dynamic-linker /lib/ld.so.1} \ +- %{m64:-dynamic-linker /lib/ld64.so.1}}}}" ++ %{m31:-dynamic-linker " ELF31_DYNAMIC_LINKER "} \ ++ %{m64:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}}}" + + + #define TARGET_ASM_FILE_END file_end_indicate_exec_stack +--- gcc-3.4.1-dist/gcc/config/sh/linux.h 2004-01-11 20:29:13.000000000 -0600 ++++ gcc-3.4.1/gcc/config/sh/linux.h 2004-08-12 15:54:43.000000000 -0500 +@@ -73,11 +73,16 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}" + + #undef LIB_SPEC +--- gcc-3.4.4/gcc/config/sparc/linux.h ++++ gcc-3.4.4/gcc/config/sparc/linux.h +@@ -162,13 +162,18 @@ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.1}} \ + %{static:-static}}}" + #else ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #define LINK_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ + %{!mno-relax:%{!r:-relax}} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}}" + #endif + +--- gcc-3.4.4/gcc/config/sparc/linux64.h ++++ gcc-3.4.4/gcc/config/sparc/linux64.h +@@ -167,12 +166,17 @@ + { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ + { "link_arch", LINK_ARCH_SPEC }, + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}} \ + " + +--- gcc-3.4.1-dist/libtool.m4 2004-05-18 04:08:37.000000000 -0500 ++++ gcc-3.4.1/libtool.m4 2004-08-12 15:54:43.000000000 -0500 +@@ -689,6 +689,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +--- gcc-3.4.1-dist/ltconfig 2004-03-05 15:05:41.000000000 -0600 ++++ gcc-3.4.1/ltconfig 2004-08-12 15:55:48.000000000 -0500 +@@ -602,6 +602,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1262,6 +1263,24 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ # Note: copied from linux-gnu, and may not be appropriate. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +--- gcc-3.4.1-dist/boehm-gc/configure 2004-07-01 14:14:03.000000000 -0500 ++++ gcc-3.4.1/boehm-gc/configure 2004-08-12 16:22:57.000000000 -0500 +@@ -1947,6 +1947,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-3.4.1-dist/boehm-gc/ltconfig 2002-11-20 09:59:06.000000000 -0600 ++++ gcc-3.4.1/boehm-gc/ltconfig 2004-08-12 15:54:42.000000000 -0500 +@@ -1981,6 +1981,23 @@ + fi + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ++ file_magic_cmd=/usr/bin/file ++ file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then diff --git a/patches/gcc/3.4.4/200-uclibc-locale.patch b/patches/gcc/3.4.4/200-uclibc-locale.patch new file mode 100644 index 00000000..a97f22b4 --- /dev/null +++ b/patches/gcc/3.4.4/200-uclibc-locale.patch @@ -0,0 +1,3255 @@ +diff -urN gcc-3.4.2-dist/libstdc++-v3/acinclude.m4 gcc-3.4.2/libstdc++-v3/acinclude.m4 +--- gcc-3.4.2-dist/libstdc++-v3/acinclude.m4 2004-07-15 12:42:45.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/acinclude.m4 2004-09-10 10:47:40.000000000 -0500 +@@ -996,7 +996,7 @@ + AC_MSG_CHECKING([for C locale to use]) + GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], + [use MODEL for target locale package], +- [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) ++ [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) + + # If they didn't use this option switch, or if they specified --enable + # with no specific model, we'll have to look for one. If they +@@ -1012,6 +1012,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include <features.h> +@@ -1138,6 +1141,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.2-dist/libstdc++-v3/aclocal.m4 gcc-3.4.2/libstdc++-v3/aclocal.m4 +--- gcc-3.4.2-dist/libstdc++-v3/aclocal.m4 2004-08-13 15:44:03.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/aclocal.m4 2004-09-10 10:47:40.000000000 -0500 +@@ -1025,6 +1025,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ x*-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include <features.h> +@@ -1151,6 +1154,41 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,59 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek <jakub@redhat.com> ++ ++#include <clocale> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,160 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <cerrno> // For errno ++#include <locale> ++#include <stdexcept> ++#include <langinfo.h> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#warning should dummy __newlocale check for C|POSIX ? ++#define __newlocale(a, b, c) NULL ++#define __freelocale(a) ((void)0) ++#define __duplocale(a) __c_locale() ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale " ++ "name not valid")); ++ } ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++ if (_S_get_c_locale() != __cloc) ++ __freelocale(__cloc); ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++ { return __duplocale(__cloc); } ++} // namespace std ++ ++namespace __gnu_cxx ++{ ++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES", ++#if _GLIBCXX_NUM_CATEGORIES != 0 ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} ++ ++namespace std ++{ ++ const char* const* const locale::_S_categories = __gnu_cxx::category_names; ++} // namespace std +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/c_locale.h 2004-09-10 10:48:08.000000000 -0500 +@@ -0,0 +1,115 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include <cstring> // get std::strlen ++#include <cstdio> // get std::snprintf or std::sprintf ++#include <clocale> ++#include <langinfo.h> // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include <iconv.h> // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include <libintl.h> // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCXX_C_LOCALE_GNU for ++#endif ++#define _GLIBCXX_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCXX_NUM_CATEGORIES 6 ++#define _GLIBCXX_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template<typename _Tv> ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = std::setlocale(LC_ALL, NULL); ++ char* __sav = new char[std::strlen(__old) + 1]; ++ std::strcpy(__sav, __old); ++ std::setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ std::setlocale(LC_ALL, __sav); ++ delete [] __sav; ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,306 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // wcsnrtombs is *very* fast but stops if encounters NUL characters: ++ // in case we fall back to wcrtomb and then continue, in a loop. ++ // NB: wcsnrtombs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', ++ __from_end - __from_next); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ const size_t __conv = wcsnrtombs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // wcrtomb. ++ for (; __from < __from_next; ++__from) ++ __to_next += wcrtomb(__to_next, *__from, &__tmp_state); ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ extern_type __buf[MB_LEN_MAX]; ++ __tmp_state = __state; ++ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); ++ if (__conv > static_cast<size_t>(__to_end - __to_next)) ++ __ret = partial; ++ else ++ { ++ memcpy(__to_next, __buf, __conv); ++ __state = __tmp_state; ++ __to_next += __conv; ++ ++__from_next; ++ } ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we store a L'\0' and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0', ++ __from_end ++ - __from_next)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ size_t __conv = mbsnrtowcs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (;; ++__to_next, __from += __conv) ++ { ++ __conv = mbrtowc(__to_next, __from, __from_end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __from_next = __from; ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ // It is unclear what to return in this case (see DR 382). ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ if (__to_next < __to_end) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from_next; ++ *__to_next++ = L'\0'; ++ } ++ else ++ __ret = partial; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_encoding() const throw() ++ { ++ // XXX This implementation assumes that the encoding is ++ // stateless and is either single-byte or variable-width. ++ int __ret = 0; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ if (MB_CUR_MAX == 1) ++ __ret = 1; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_max_length() const throw() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ // XXX Probably wrong for stateful encodings. ++ int __ret = MB_CUR_MAX; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_length(state_type& __state, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { ++ int __ret = 0; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we advance past it and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ ++ // A dummy internal buffer is needed in order for mbsnrtocws to consider ++ // its fourth parameter (it wouldn't with NULL as first parameter). ++ wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0', ++ __end ++ - __from)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __end; ++ ++ const extern_type* __tmp_from = __from; ++ size_t __conv = mbsnrtowcs(__to, &__from, ++ __from_chunk_end - __from, ++ __max, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (__from = __tmp_from;; __from += __conv) ++ { ++ __conv = mbrtowc(NULL, __from, __end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __state = __tmp_state; ++ __ret += __from - __tmp_from; ++ break; ++ } ++ if (!__from) ++ __from = __from_chunk_end; ++ ++ __ret += __from - __tmp_from; ++ __max -= __conv; ++ ++ if (__from < __end && __max) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from; ++ ++__ret; ++ --__max; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/collate_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate<char>::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<char>::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ int ++ collate<wchar_t>::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,300 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype<char> specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) ++ : ctype<char>(0, false, __refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_ctype); ++ this->_S_create_c_locale(this->_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; ++ this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; ++ this->_M_table = this->_M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ ctype<wchar_t>::__wmask_type ++ ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = 0; ++ } ++ return __ret; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype<wchar_t>:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur] ++ && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (; __lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ __m |= _M_bit[__bitcur]; ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype<wchar_t>:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<wchar_t>:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast<unsigned char>(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype<wchar_t>:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok) ++ return _M_narrow[__wc]; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ const int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ if (_M_narrow_ok) ++ while (__lo < __hi) ++ { ++ if (*__lo >= 0 && *__lo < 128) ++ *__dest = _M_narrow[*__lo]; ++ else ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype<wchar_t>::_M_initialize_ctype() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wint_t __i; ++ for (__i = 0; __i < 128; ++__i) ++ { ++ const int __c = wctob(__i); ++ if (__c == EOF) ++ break; ++ else ++ _M_narrow[__i] = static_cast<char>(__c); ++ } ++ if (__i == 128) ++ _M_narrow_ok = true; ++ else ++ _M_narrow_ok = false; ++ for (size_t __j = 0; ++ __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) ++ _M_widen[__j] = btowc(__j); ++ ++ for (size_t __k = 0; __k <= 11; ++__k) ++ { ++ _M_bit[__k] = static_cast<mask>(_ISbit(__k)); ++ _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++#endif // _GLIBCXX_USE_WCHAR_T ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages<char>::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ wstring ++ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++# elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/messages_members.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,118 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template<typename _CharT> ++ messages<_CharT>::messages(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)), ++ _M_name_messages(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_messages = __tmp; ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::~messages() ++ { ++ if (_M_name_messages != _S_get_c_name()) ++ delete [] _M_name_messages; ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string<char>& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template<typename _CharT> ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template<typename _CharT> ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++ if (this->_M_name_messages != locale::facet::_S_get_c_name()) ++ delete [] this->_M_name_messages; ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ this->_M_name_messages = __tmp; ++ ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_messages); ++ this->_S_create_c_locale(this->_M_c_locale_messages, __s); ++ } ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,698 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ __ret.field[0] = sign; ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[2] = space; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[1] = space; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ else ++ { ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ default: ++ ; ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == true ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == false ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct<char, true>::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct<char, false>::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast<unsigned char>(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ { ++ uc = static_cast<unsigned char>(money_base::_S_atoms[__i]); ++ _M_data->_M_atoms[__i] = btowc(uc); ++ } ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct<wchar_t, true>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++ ++ template<> ++ moneypunct<wchar_t, false>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,183 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, ++ __cloc)); ++ ++ // Check for NULL, which implies no grouping. ++ if (_M_data->_M_thousands_sep == '\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = "true"; ++ _M_data->_M_truename_size = strlen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = "false"; ++ _M_data->_M_falsename_size = strlen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct<char>::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<wchar_t>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_S_get_c_locale()); ++#endif ++ // Use ctype::widen code without the facet... ++ unsigned char uc; ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ { ++ uc = static_cast<unsigned char>(__num_base::_S_atoms_out[__i]); ++ _M_data->_M_atoms_out[__i] = btowc(uc); ++ } ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ { ++ uc = static_cast<unsigned char>(__num_base::_S_atoms_in[__j]); ++ _M_data->_M_atoms_in[__j] = btowc(uc); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union __s_and_w { const char *__s; unsigned int __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = static_cast<wchar_t>(__u.__w); ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = static_cast<wchar_t>(__u.__w); ++#endif ++ ++ if (_M_data->_M_thousands_sep == L'\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = L"true"; ++ _M_data->_M_truename_size = wcslen(_M_data->_M_truename); ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = L"false"; ++ _M_data->_M_falsename_size = wcslen(_M_data->_M_falsename); ++ } ++ ++ template<> ++ numpunct<wchar_t>::~numpunct() ++ { delete _M_data; } ++ #endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.cc 2004-09-10 10:48:00.000000000 -0500 +@@ -0,0 +1,356 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct<char>:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const size_t __len = __strftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = '\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = "%m/%d/%y"; ++ _M_data->_M_date_era_format = "%m/%d/%y"; ++ _M_data->_M_time_format = "%H:%M:%S"; ++ _M_data->_M_time_era_format = "%H:%M:%S"; ++ _M_data->_M_date_time_format = ""; ++ _M_data->_M_date_time_era_format = ""; ++ _M_data->_M_am = "AM"; ++ _M_data->_M_pm = "PM"; ++ _M_data->_M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = "Sunday"; ++ _M_data->_M_day2 = "Monday"; ++ _M_data->_M_day3 = "Tuesday"; ++ _M_data->_M_day4 = "Wednesday"; ++ _M_data->_M_day5 = "Thursday"; ++ _M_data->_M_day6 = "Friday"; ++ _M_data->_M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = "Sun"; ++ _M_data->_M_aday2 = "Mon"; ++ _M_data->_M_aday3 = "Tue"; ++ _M_data->_M_aday4 = "Wed"; ++ _M_data->_M_aday5 = "Thu"; ++ _M_data->_M_aday6 = "Fri"; ++ _M_data->_M_aday7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = "January"; ++ _M_data->_M_month02 = "February"; ++ _M_data->_M_month03 = "March"; ++ _M_data->_M_month04 = "April"; ++ _M_data->_M_month05 = "May"; ++ _M_data->_M_month06 = "June"; ++ _M_data->_M_month07 = "July"; ++ _M_data->_M_month08 = "August"; ++ _M_data->_M_month09 = "September"; ++ _M_data->_M_month10 = "October"; ++ _M_data->_M_month11 = "November"; ++ _M_data->_M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = "Jan"; ++ _M_data->_M_amonth02 = "Feb"; ++ _M_data->_M_amonth03 = "Mar"; ++ _M_data->_M_amonth04 = "Apr"; ++ _M_data->_M_amonth05 = "May"; ++ _M_data->_M_amonth06 = "Jun"; ++ _M_data->_M_amonth07 = "Jul"; ++ _M_data->_M_amonth08 = "Aug"; ++ _M_data->_M_amonth09 = "Sep"; ++ _M_data->_M_amonth10 = "Oct"; ++ _M_data->_M_amonth11 = "Nov"; ++ _M_data->_M_amonth12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, __cloc); ++ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ __timepunct<wchar_t>:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++ const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = L'\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<wchar_t>; ++ ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = L"%m/%d/%y"; ++ _M_data->_M_date_era_format = L"%m/%d/%y"; ++ _M_data->_M_time_format = L"%H:%M:%S"; ++ _M_data->_M_time_era_format = L"%H:%M:%S"; ++ _M_data->_M_date_time_format = L""; ++ _M_data->_M_date_time_era_format = L""; ++ _M_data->_M_am = L"AM"; ++ _M_data->_M_pm = L"PM"; ++ _M_data->_M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = L"Sunday"; ++ _M_data->_M_day2 = L"Monday"; ++ _M_data->_M_day3 = L"Tuesday"; ++ _M_data->_M_day4 = L"Wednesday"; ++ _M_data->_M_day5 = L"Thursday"; ++ _M_data->_M_day6 = L"Friday"; ++ _M_data->_M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = L"Sun"; ++ _M_data->_M_aday2 = L"Mon"; ++ _M_data->_M_aday3 = L"Tue"; ++ _M_data->_M_aday4 = L"Wed"; ++ _M_data->_M_aday5 = L"Thu"; ++ _M_data->_M_aday6 = L"Fri"; ++ _M_data->_M_aday7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = L"January"; ++ _M_data->_M_month02 = L"February"; ++ _M_data->_M_month03 = L"March"; ++ _M_data->_M_month04 = L"April"; ++ _M_data->_M_month05 = L"May"; ++ _M_data->_M_month06 = L"June"; ++ _M_data->_M_month07 = L"July"; ++ _M_data->_M_month08 = L"August"; ++ _M_data->_M_month09 = L"September"; ++ _M_data->_M_month10 = L"October"; ++ _M_data->_M_month11 = L"November"; ++ _M_data->_M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = L"Jan"; ++ _M_data->_M_amonth02 = L"Feb"; ++ _M_data->_M_amonth03 = L"Mar"; ++ _M_data->_M_amonth04 = L"Apr"; ++ _M_data->_M_amonth05 = L"May"; ++ _M_data->_M_amonth06 = L"Jun"; ++ _M_data->_M_amonth07 = L"Jul"; ++ _M_data->_M_amonth08 = L"Aug"; ++ _M_data->_M_amonth09 = L"Sep"; ++ _M_data->_M_amonth10 = L"Oct"; ++ _M_data->_M_amonth11 = L"Nov"; ++ _M_data->_M_amonth12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_FMT, __cloc)); ++ _M_data->_M_date_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_FMT, __cloc)); ++ _M_data->_M_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT, __cloc)); ++ _M_data->_M_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_T_FMT, __cloc)); ++ _M_data->_M_date_time_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WD_T_FMT, __cloc)); ++ _M_data->_M_date_time_era_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc)); ++ _M_data->_M_am = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WAM_STR, __cloc)); ++ _M_data->_M_pm = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WPM_STR, __cloc)); ++ _M_data->_M_am_pm_format = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc)); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_1, __cloc)); ++ _M_data->_M_day2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_2, __cloc)); ++ _M_data->_M_day3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_3, __cloc)); ++ _M_data->_M_day4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_4, __cloc)); ++ _M_data->_M_day5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_5, __cloc)); ++ _M_data->_M_day6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_6, __cloc)); ++ _M_data->_M_day7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WDAY_7, __cloc)); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_1, __cloc)); ++ _M_data->_M_aday2 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_2, __cloc)); ++ _M_data->_M_aday3 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_3, __cloc)); ++ _M_data->_M_aday4 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_4, __cloc)); ++ _M_data->_M_aday5 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_5, __cloc)); ++ _M_data->_M_aday6 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_6, __cloc)); ++ _M_data->_M_aday7 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABDAY_7, __cloc)); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_1, __cloc)); ++ _M_data->_M_month02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_2, __cloc)); ++ _M_data->_M_month03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_3, __cloc)); ++ _M_data->_M_month04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_4, __cloc)); ++ _M_data->_M_month05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_5, __cloc)); ++ _M_data->_M_month06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_6, __cloc)); ++ _M_data->_M_month07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_7, __cloc)); ++ _M_data->_M_month08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_8, __cloc)); ++ _M_data->_M_month09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_9, __cloc)); ++ _M_data->_M_month10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_10, __cloc)); ++ _M_data->_M_month11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_11, __cloc)); ++ _M_data->_M_month12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WMON_12, __cloc)); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_1, __cloc)); ++ _M_data->_M_amonth02 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_2, __cloc)); ++ _M_data->_M_amonth03 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_3, __cloc)); ++ _M_data->_M_amonth04 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_4, __cloc)); ++ _M_data->_M_amonth05 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_5, __cloc)); ++ _M_data->_M_amonth06 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_6, __cloc)); ++ _M_data->_M_amonth07 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_7, __cloc)); ++ _M_data->_M_amonth08 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_8, __cloc)); ++ _M_data->_M_amonth09 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_9, __cloc)); ++ _M_data->_M_amonth10 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_10, __cloc)); ++ _M_data->_M_amonth11 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_11, __cloc)); ++ _M_data->_M_amonth12 = reinterpret_cast<wchar_t*>(__nl_langinfo_l(_NL_WABMON_12, __cloc)); ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.h gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-3.4.2-dist/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/locale/uclibc/time_members.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) ++ : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_timepunct = __tmp; ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::~__timepunct() ++ { ++ if (_M_name_timepunct != _S_get_c_name()) ++ delete [] _M_name_timepunct; ++ delete _M_data; ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_base.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,58 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ ++ // NB: Offsets into ctype<char>::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISalpha | _ISdigit | _ISpunct; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalpha | _ISdigit; ++ }; +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_inline.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype<char>:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast<unsigned char>(__c)] & __m; } ++ ++ const char* ++ ctype<char>:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,92 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype<char>::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype<char>::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ char ++ ctype<char>::do_toupper(char __c) const ++ { return _M_toupper[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype<char>::do_tolower(char __c) const ++ { return _M_tolower[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/os_defines.h gcc-3.4.2/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-3.4.2-dist/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/config/os/uclibc/os_defines.h 2004-09-10 10:47:40.000000000 -0500 +@@ -0,0 +1,44 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCXX_OS_DEFINES ++#define _GLIBCXX_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include <features.h> ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif +diff -urN gcc-3.4.2-dist/libstdc++-v3/configure gcc-3.4.2/libstdc++-v3/configure +--- gcc-3.4.2-dist/libstdc++-v3/configure 2004-08-13 15:44:04.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/configure 2004-09-10 10:47:40.000000000 -0500 +@@ -3878,6 +3878,11 @@ + lt_cv_file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5479,7 +5479,7 @@ + enableval="$enable_clocale" + + case "$enableval" in +- generic|gnu|ieee_1003.1-2001|yes|no|auto) ;; ++ generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto) ;; + *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable clocale" >&5 + echo "$as_me: error: Unknown argument to enable/disable clocale" >&2;} + { (exit 1); exit 1; }; } ;; +@@ -5545,6 +5550,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case x${target_os} in ++ xlinux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + xlinux* | xgnu* | xkfreebsd*-gnu | xknetbsd*-gnu) + cat >conftest.$ac_ext <<_ACEOF + #line $LINENO "configure" +@@ -5759,6 +5767,77 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ echo "$as_me:$LINENO: result: uclibc" >&5 ++echo "${ECHO_T}uclibc" >&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; 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_check_msgfmt+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_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_check_msgfmt="yes" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt=$ac_cv_prog_check_msgfmt ++if test -n "$check_msgfmt"; then ++ echo "$as_me:$LINENO: result: $check_msgfmt" >&5 ++echo "${ECHO_T}$check_msgfmt" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_H=config/locale/ieee_1003.1-2001/codecvt_specializations.h ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-3.4.2-dist/libstdc++-v3/configure.host gcc-3.4.2/libstdc++-v3/configure.host +--- gcc-3.4.2-dist/libstdc++-v3/configure.host 2004-08-27 14:52:30.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/configure.host 2004-09-10 10:47:40.000000000 -0500 +@@ -217,6 +217,12 @@ + ;; + esac + ++# Override for uClibc since linux-uclibc gets mishandled above. ++case "${host_os}" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; ++esac + + # Set any OS-dependent and CPU-dependent bits. + # THIS TABLE IS SORTED. KEEP IT THAT WAY. +diff -urN gcc-3.4.2-dist/libstdc++-v3/crossconfig.m4 gcc-3.4.2/libstdc++-v3/crossconfig.m4 +--- gcc-3.4.2-dist/libstdc++-v3/crossconfig.m4 2004-07-06 20:23:49.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/crossconfig.m4 2004-09-10 10:47:40.000000000 -0500 +@@ -138,6 +138,99 @@ + ;; + esac + ;; ++ *-uclibc*) ++# Temporary hack until we implement the float versions of the libm funcs ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCXX_CHECK_LINKER_FEATURES ++ GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCXX_CHECK_WCHAR_T_SUPPORT ++ ++ # For LFS. ++ AC_DEFINE(HAVE_INT64_T) ++ case "$target" in ++ *-uclinux*) ++ # Don't enable LFS with uClinux ++ ;; ++ *) ++ AC_DEFINE(_GLIBCXX_USE_LFS) ++ esac ++ ++ # For showmanyc_helper(). ++ AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h) ++ GLIBCXX_CHECK_POLL ++ GLIBCXX_CHECK_S_ISREG_OR_S_IFREG ++ ++ # For xsputn_2(). ++ AC_CHECK_HEADERS(sys/uio.h) ++ GLIBCXX_CHECK_WRITEV ++ ++# AC_DEFINE(HAVE_ACOSF) ++# AC_DEFINE(HAVE_ASINF) ++# AC_DEFINE(HAVE_ATANF) ++# AC_DEFINE(HAVE_ATAN2F) ++ AC_DEFINE(HAVE_CEILF) ++ AC_DEFINE(HAVE_COPYSIGN) ++# AC_DEFINE(HAVE_COPYSIGNF) ++# AC_DEFINE(HAVE_COSF) ++# AC_DEFINE(HAVE_COSHF) ++# AC_DEFINE(HAVE_EXPF) ++# AC_DEFINE(HAVE_FABSF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ AC_DEFINE(HAVE_FLOORF) ++# AC_DEFINE(HAVE_FMODF) ++# AC_DEFINE(HAVE_FREXPF) ++ AC_DEFINE(HAVE_HYPOT) ++# AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++# AC_DEFINE(HAVE_LOGF) ++# AC_DEFINE(HAVE_LOG10F) ++# AC_DEFINE(HAVE_MODFF) ++# AC_DEFINE(HAVE_SINF) ++# AC_DEFINE(HAVE_SINHF) ++# AC_DEFINE(HAVE_SINCOS) ++# AC_DEFINE(HAVE_SINCOSF) ++ AC_DEFINE(HAVE_SQRTF) ++# AC_DEFINE(HAVE_TANF) ++# AC_DEFINE(HAVE_TANHF) ++ if test x"long_double_math_on_this_cpu" = x"yes"; then ++ AC_MSG_ERROR([long_double_math_on_this_cpu is yes!]) ++# AC_DEFINE(HAVE_ACOSL) ++# AC_DEFINE(HAVE_ASINL) ++# AC_DEFINE(HAVE_ATANL) ++# AC_DEFINE(HAVE_ATAN2L) ++# AC_DEFINE(HAVE_CEILL) ++# AC_DEFINE(HAVE_COPYSIGNL) ++# AC_DEFINE(HAVE_COSL) ++# AC_DEFINE(HAVE_COSHL) ++# AC_DEFINE(HAVE_EXPL) ++# AC_DEFINE(HAVE_FABSL) ++# AC_DEFINE(HAVE_FINITEL) ++# AC_DEFINE(HAVE_FLOORL) ++# AC_DEFINE(HAVE_FMODL) ++# AC_DEFINE(HAVE_FREXPL) ++# AC_DEFINE(HAVE_HYPOTL) ++# AC_DEFINE(HAVE_ISINFL) ++# AC_DEFINE(HAVE_ISNANL) ++# AC_DEFINE(HAVE_LOGL) ++# AC_DEFINE(HAVE_LOG10L) ++# AC_DEFINE(HAVE_MODFL) ++# AC_DEFINE(HAVE_POWL) ++# AC_DEFINE(HAVE_SINL) ++# AC_DEFINE(HAVE_SINHL) ++# AC_DEFINE(HAVE_SINCOSL) ++# AC_DEFINE(HAVE_SQRTL) ++# AC_DEFINE(HAVE_TANL) ++# AC_DEFINE(HAVE_TANHL) ++ fi ++ ;; + *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu) + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ + machine/endian.h machine/param.h sys/machine.h sys/types.h \ +@@ -152,7 +245,7 @@ + AC_DEFINE(HAVE_INT64_T) + case "$target" in + *-uclinux*) +- # Don't enable LFS with uClibc ++ # Don't enable LFS with uClinux + ;; + *) + AC_DEFINE(_GLIBCXX_USE_LFS) +diff -urN gcc-3.4.2-dist/libstdc++-v3/include/c_compatibility/wchar.h gcc-3.4.2/libstdc++-v3/include/c_compatibility/wchar.h +--- gcc-3.4.2-dist/libstdc++-v3/include/c_compatibility/wchar.h 2003-12-08 21:51:45.000000000 -0600 ++++ gcc-3.4.2/libstdc++-v3/include/c_compatibility/wchar.h 2004-09-10 10:47:40.000000000 -0500 +@@ -101,7 +101,9 @@ + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; ++#if _GLIBCXX_HAVE_WCSFTIME + using std::wcsftime; ++#endif + + #if _GLIBCXX_USE_C99 + using std::wcstold; +diff -urN gcc-3.4.2-dist/libstdc++-v3/include/c_std/std_cwchar.h gcc-3.4.2/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-3.4.2-dist/libstdc++-v3/include/c_std/std_cwchar.h 2004-07-20 03:52:12.000000000 -0500 ++++ gcc-3.4.2/libstdc++-v3/include/c_std/std_cwchar.h 2004-09-10 10:47:40.000000000 -0500 +@@ -179,7 +179,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#if _GLIBCXX_HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; diff --git a/patches/gcc/3.4.4/300-libstdc++-pic.patch b/patches/gcc/3.4.4/300-libstdc++-pic.patch new file mode 100644 index 00000000..0c41db91 --- /dev/null +++ b/patches/gcc/3.4.4/300-libstdc++-pic.patch @@ -0,0 +1,46 @@ +diff -dur gcc-3.4.4.orig/libstdc++-v3/src/Makefile.am gcc-3.4.4/libstdc++-v3/src/Makefile.am +--- gcc-3.4.4.orig/libstdc++-v3/src/Makefile.am 2004-04-16 21:08:35.000000000 +0200 ++++ gcc-3.4.4/libstdc++-v3/src/Makefile.am 2007-02-14 17:24:53.000000000 +0100 +@@ -209,6 +209,9 @@ + CXXLINK = $(LIBTOOL) --tag CXX --mode=link $(CXX) \ + $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LDFLAGS) -o $@ + ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) + + # Added bits to build debug library. + if GLIBCXX_BUILD_DEBUG +diff -dur gcc-3.4.4.orig/libstdc++-v3/src/Makefile.in gcc-3.4.4/libstdc++-v3/src/Makefile.in +--- gcc-3.4.4.orig/libstdc++-v3/src/Makefile.in 2004-04-16 21:08:35.000000000 +0200 ++++ gcc-3.4.4/libstdc++-v3/src/Makefile.in 2007-02-14 17:25:18.000000000 +0100 +@@ -592,7 +592,7 @@ + + install-data-am: install-data-local + +-install-exec-am: install-toolexeclibLTLIBRARIES ++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local + + install-info: install-info-am + +@@ -625,6 +625,7 @@ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-data install-data-am install-data-local \ + install-exec install-exec-am install-info install-info-am \ ++ install-exec-local \ + install-man install-strip install-toolexeclibLTLIBRARIES \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ +@@ -709,6 +710,11 @@ + install_debug: + (cd ${debugdir} && $(MAKE) \ + toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install) ++ ++install-exec-local: ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: +Only in gcc-3.4.4/libstdc++-v3/src: Makefile.in.orig diff --git a/patches/gcc/3.4.4/600-gcc34-arm-ldm-peephole.patch b/patches/gcc/3.4.4/600-gcc34-arm-ldm-peephole.patch new file mode 100644 index 00000000..0c370502 --- /dev/null +++ b/patches/gcc/3.4.4/600-gcc34-arm-ldm-peephole.patch @@ -0,0 +1,65 @@ +--- gcc-3.4.0/gcc/config/arm/arm.md.arm-ldm-peephole 2004-01-13 08:24:37.000000000 -0500 ++++ gcc-3.4.0/gcc/config/arm/arm.md 2004-04-24 18:18:04.000000000 -0400 +@@ -8810,13 +8810,16 @@ + (set_attr "length" "4,8,8")] + ) + ++; Try to convert LDR+LDR+arith into [add+]LDM+arith ++; On XScale, LDM is always slower than two LDRs, so only do this if ++; optimising for size. + (define_insn "*arith_adjacentmem" + [(set (match_operand:SI 0 "s_register_operand" "=r") + (match_operator:SI 1 "shiftable_operator" + [(match_operand:SI 2 "memory_operand" "m") + (match_operand:SI 3 "memory_operand" "m")])) + (clobber (match_scratch:SI 4 "=r"))] +- "TARGET_ARM && adjacent_mem_locations (operands[2], operands[3])" ++ "TARGET_ARM && (!arm_tune_xscale || optimize_size) && adjacent_mem_locations (operands[2], operands[3])" + "* + { + rtx ldm[3]; +@@ -8851,6 +8854,8 @@ + } + if (val1 && val2) + { ++ /* This would be a loss on a Harvard core, but adjacent_mem_locations() ++ will prevent it from happening. */ + rtx ops[3]; + ldm[0] = ops[0] = operands[4]; + ops[1] = XEXP (XEXP (operands[2], 0), 0); +--- gcc-3.4.0/gcc/config/arm/arm.c.arm-ldm-peephole 2004-04-24 18:16:25.000000000 -0400 ++++ gcc-3.4.0/gcc/config/arm/arm.c 2004-04-24 18:18:04.000000000 -0400 +@@ -4838,6 +4841,11 @@ + *load_offset = unsorted_offsets[order[0]]; + } + ++ /* For XScale a two-word LDM is a performance loss, so only do this if ++ size is more important. See comments in arm_gen_load_multiple. */ ++ if (nops == 2 && arm_tune_xscale && !optimize_size) ++ return 0; ++ + if (unsorted_offsets[order[0]] == 0) + return 1; /* ldmia */ + +@@ -5064,6 +5072,11 @@ + *load_offset = unsorted_offsets[order[0]]; + } + ++ /* For XScale a two-word LDM is a performance loss, so only do this if ++ size is more important. See comments in arm_gen_load_multiple. */ ++ if (nops == 2 && arm_tune_xscale && !optimize_size) ++ return 0; ++ + if (unsorted_offsets[order[0]] == 0) + return 1; /* stmia */ + +--- gcc-3.4.0/gcc/genpeep.c.arm-ldm-peephole 2003-07-05 01:27:22.000000000 -0400 ++++ gcc-3.4.0/gcc/genpeep.c 2004-04-24 18:18:04.000000000 -0400 +@@ -381,6 +381,7 @@ + printf ("#include \"recog.h\"\n"); + printf ("#include \"except.h\"\n\n"); + printf ("#include \"function.h\"\n\n"); ++ printf ("#include \"flags.h\"\n\n"); + + printf ("#ifdef HAVE_peephole\n"); + printf ("extern rtx peep_operand[];\n\n"); diff --git a/patches/gcc/3.4.4/601-gcc34-arm-ldm-peephole2.patch b/patches/gcc/3.4.4/601-gcc34-arm-ldm-peephole2.patch new file mode 100644 index 00000000..27f7c07d --- /dev/null +++ b/patches/gcc/3.4.4/601-gcc34-arm-ldm-peephole2.patch @@ -0,0 +1,42 @@ +The 30_all_gcc34-arm-ldm-peephole.patch from Debian was conflicting +with the newer 36_all_pr16201-fix.patch, so i cut out the hunk from +it that was causing problems and grabbed an updated version from +upstream cvs. + +Index: gcc/config/arm/arm.c +=================================================================== +RCS file: /cvsroot/gcc/gcc/gcc/config/arm/arm.c,v +retrieving revision 1.432 +retrieving revision 1.433 +diff -u -r1.432 -r1.433 +--- gcc-3.4.4/gcc/config/arm/arm.c 29 Mar 2005 03:00:23 -0000 1.432 ++++ gcc-3.4.4/gcc/config/arm/arm.c 1 Apr 2005 11:02:22 -0000 1.433 +@@ -5139,6 +5139,10 @@ + int + adjacent_mem_locations (rtx a, rtx b) + { ++ /* We don't guarantee to preserve the order of these memory refs. */ ++ if (volatile_refs_p (a) || volatile_refs_p (b)) ++ return 0; ++ + if ((GET_CODE (XEXP (a, 0)) == REG + || (GET_CODE (XEXP (a, 0)) == PLUS + && GET_CODE (XEXP (XEXP (a, 0), 1)) == CONST_INT)) +@@ -5178,6 +5182,17 @@ + return 0; + + val_diff = val1 - val0; ++ ++ if (arm_ld_sched) ++ { ++ /* If the target has load delay slots, then there's no benefit ++ to using an ldm instruction unless the offset is zero and ++ we are optimizing for size. */ ++ return (optimize_size && (REGNO (reg0) == REGNO (reg1)) ++ && (val0 == 0 || val1 == 0 || val0 == 4 || val1 == 4) ++ && (val_diff == 4 || val_diff == -4)); ++ } ++ + return ((REGNO (reg0) == REGNO (reg1)) + && (val_diff == 4 || val_diff == -4)); + } diff --git a/patches/gcc/3.4.4/601-gcc34-arm-ldm.patch b/patches/gcc/3.4.4/601-gcc34-arm-ldm.patch new file mode 100644 index 00000000..142052fd --- /dev/null +++ b/patches/gcc/3.4.4/601-gcc34-arm-ldm.patch @@ -0,0 +1,119 @@ +--- gcc-3.4.0/gcc/config/arm/arm.c.arm-ldm 2004-02-27 09:51:05.000000000 -0500 ++++ gcc-3.4.0/gcc/config/arm/arm.c 2004-04-24 18:16:25.000000000 -0400 +@@ -8520,6 +8520,26 @@ + return_used_this_function = 0; + } + ++/* Return the number (counting from 0) of ++ the least significant set bit in MASK. */ ++ ++#ifdef __GNUC__ ++inline ++#endif ++static int ++number_of_first_bit_set (mask) ++ int mask; ++{ ++ int bit; ++ ++ for (bit = 0; ++ (mask & (1 << bit)) == 0; ++ ++bit) ++ continue; ++ ++ return bit; ++} ++ + const char * + arm_output_epilogue (rtx sibling) + { +@@ -8753,27 +8773,47 @@ + saved_regs_mask |= (1 << PC_REGNUM); + } + +- /* Load the registers off the stack. If we only have one register +- to load use the LDR instruction - it is faster. */ +- if (saved_regs_mask == (1 << LR_REGNUM)) +- { +- /* The exception handler ignores the LR, so we do +- not really need to load it off the stack. */ +- if (eh_ofs) +- asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM); +- else +- asm_fprintf (f, "\tldr\t%r, [%r], #4\n", LR_REGNUM, SP_REGNUM); +- } +- else if (saved_regs_mask) ++ if (saved_regs_mask) + { +- if (saved_regs_mask & (1 << SP_REGNUM)) +- /* Note - write back to the stack register is not enabled +- (ie "ldmfd sp!..."). We know that the stack pointer is +- in the list of registers and if we add writeback the +- instruction becomes UNPREDICTABLE. */ +- print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask); ++ /* Load the registers off the stack. If we only have one register ++ to load use the LDR instruction - it is faster. */ ++ if (bit_count (saved_regs_mask) == 1) ++ { ++ int reg = number_of_first_bit_set (saved_regs_mask); ++ ++ switch (reg) ++ { ++ case SP_REGNUM: ++ /* Mustn't use base writeback when loading SP. */ ++ asm_fprintf (f, "\tldr\t%r, [%r]\n", SP_REGNUM, SP_REGNUM); ++ break; ++ ++ case LR_REGNUM: ++ if (eh_ofs) ++ { ++ /* The exception handler ignores the LR, so we do ++ not really need to load it off the stack. */ ++ asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM); ++ break; ++ } ++ /* else fall through */ ++ ++ default: ++ asm_fprintf (f, "\tldr\t%r, [%r], #4\n", reg, SP_REGNUM); ++ break; ++ } ++ } + else +- print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask); ++ { ++ if (saved_regs_mask & (1 << SP_REGNUM)) ++ /* Note - write back to the stack register is not enabled ++ (ie "ldmfd sp!..."). We know that the stack pointer is ++ in the list of registers and if we add writeback the ++ instruction becomes UNPREDICTABLE. */ ++ print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask); ++ else ++ print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask); ++ } + } + + if (current_function_pretend_args_size) +@@ -11401,22 +11441,6 @@ + } + } + +-/* Return the number (counting from 0) of +- the least significant set bit in MASK. */ +- +-inline static int +-number_of_first_bit_set (int mask) +-{ +- int bit; +- +- for (bit = 0; +- (mask & (1 << bit)) == 0; +- ++bit) +- continue; +- +- return bit; +-} +- + /* Generate code to return from a thumb function. + If 'reg_containing_return_addr' is -1, then the return address is + actually on the stack, at the stack pointer. */ diff --git a/patches/gcc/3.4.4/602-sdk-libstdc++-includes.patch b/patches/gcc/3.4.4/602-sdk-libstdc++-includes.patch new file mode 100644 index 00000000..4377c214 --- /dev/null +++ b/patches/gcc/3.4.4/602-sdk-libstdc++-includes.patch @@ -0,0 +1,22 @@ +--- gcc-3.4.1/libstdc++-v3/libmath/Makefile.am~ 2003-08-27 22:29:42.000000000 +0100 ++++ gcc-3.4.1/libstdc++-v3/libmath/Makefile.am 2004-07-22 16:41:45.152130128 +0100 +@@ -32,7 +32,7 @@ + + libmath_la_SOURCES = stubs.c + +-AM_CPPFLAGS = $(CANADIAN_INCLUDES) ++AM_CPPFLAGS = $(CANADIAN_INCLUDES) -I$(toplevel_srcdir)/include + + # Only compiling "C" sources in this directory. + LIBTOOL = @LIBTOOL@ --tag CC +--- gcc-3.4.1/libstdc++-v3/fragment.am.old 2004-07-22 18:24:58.024083656 +0100 ++++ gcc-3.4.1/libstdc++-v3/fragment.am 2004-07-22 18:24:59.019932264 +0100 +@@ -18,7 +18,7 @@ + $(WARN_FLAGS) $(WERROR) -fdiagnostics-show-location=once + + # -I/-D flags to pass when compiling. +-AM_CPPFLAGS = $(GLIBCXX_INCLUDES) ++AM_CPPFLAGS = $(GLIBCXX_INCLUDES) -I$(toplevel_srcdir)/include + + + diff --git a/patches/gcc/3.4.4/700-pr15068-fix.patch b/patches/gcc/3.4.4/700-pr15068-fix.patch new file mode 100644 index 00000000..2977765c --- /dev/null +++ b/patches/gcc/3.4.4/700-pr15068-fix.patch @@ -0,0 +1,44 @@ +See http://gcc.gnu.org/PR15068 + +Fixes error + +../sysdeps/generic/s_fmax.c: In function `__fmax': +../sysdeps/generic/s_fmax.c:28: internal compiler error: in elim_reg_cond, at flow.c:3257 +Please submit a full bug report, +with preprocessed source if appropriate. +See <URL:http://gcc.gnu.org/bugs.html> for instructions. +make[2]: *** [/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/math/s_fmax.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822/math' +make[1]: *** [math/others] Error 2 +make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822' +make: *** [all] Error 2 + +[ rediffed against gcc-3.4.1, with elbow grease, ending up with same thing as +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-arm-branch&r1=1.563.4.2&r2=1.563.4.3 ] + +--- gcc-3.4.1/gcc/flow.c.old 2004-02-27 19:39:19.000000000 -0800 ++++ gcc-3.4.1/gcc/flow.c 2004-08-26 07:29:46.000000000 -0700 +@@ -1878,6 +1878,7 @@ + rtx set_src = SET_SRC (pc_set (BB_END (bb))); + rtx cond_true = XEXP (set_src, 0); + rtx reg = XEXP (cond_true, 0); ++ enum rtx_code inv_cond; + + if (GET_CODE (reg) == SUBREG) + reg = SUBREG_REG (reg); +@@ -1886,11 +1887,13 @@ + in the form of a comparison of a register against zero. + If the condition is more complex than that, then it is safe + not to record any information. */ +- if (GET_CODE (reg) == REG ++ inv_cond = reversed_comparison_code (cond_true, BB_END (bb)); ++ if (inv_cond != UNKNOWN ++ && GET_CODE (reg) == REG + && XEXP (cond_true, 1) == const0_rtx) + { + rtx cond_false +- = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)), ++ = gen_rtx_fmt_ee (inv_cond, + GET_MODE (cond_true), XEXP (cond_true, 0), + XEXP (cond_true, 1)); + if (GET_CODE (XEXP (set_src, 1)) == PC) diff --git a/patches/gcc/3.4.4/71_all_sh-pr16665-fix.patch b/patches/gcc/3.4.4/71_all_sh-pr16665-fix.patch new file mode 100644 index 00000000..680bb397 --- /dev/null +++ b/patches/gcc/3.4.4/71_all_sh-pr16665-fix.patch @@ -0,0 +1,43 @@ +--- gcc/gcc/config/sh/sh.c ++++ gcc/gcc/config/sh/sh.c +@@ -9106,6 +9106,15 @@ sh_output_mi_thunk (FILE *file, tree thu + } + this = FUNCTION_ARG (cum, Pmode, ptr_type_node, 1); + ++ /* In PIC case, we set PIC register to compute the target address. We ++ can use a scratch register to save and restore the original value ++ except for SHcompact. For SHcompact, use stack. */ ++ if (flag_pic && TARGET_SHCOMPACT) ++ { ++ push (PIC_OFFSET_TABLE_REGNUM); ++ emit_insn (gen_GOTaddr2picreg ()); ++ } ++ + /* For SHcompact, we only have r0 for a scratch register: r1 is the + static chain pointer (even if you can't have nested virtual functions + right now, someone might implement them sometime), and the rest of the +@@ -9188,8 +9197,24 @@ sh_output_mi_thunk (FILE *file, tree thu + assemble_external (function); + TREE_USED (function) = 1; + } ++ /* We can use scratch1 to save and restore the original value of ++ PIC register except for SHcompact. */ ++ if (flag_pic && ! TARGET_SHCOMPACT) ++ { ++ emit_move_insn (scratch1, ++ gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM)); ++ emit_insn (gen_GOTaddr2picreg ()); ++ } + funexp = XEXP (DECL_RTL (function), 0); + emit_move_insn (scratch2, funexp); ++ if (flag_pic) ++ { ++ if (! TARGET_SHCOMPACT) ++ emit_move_insn (gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM), ++ scratch1); ++ else ++ pop (PIC_OFFSET_TABLE_REGNUM); ++ } + funexp = gen_rtx_MEM (FUNCTION_MODE, scratch2); + sibcall = emit_call_insn (gen_sibcall (funexp, const0_rtx, NULL_RTX)); + SIBLING_CALL_P (sibcall) = 1; diff --git a/patches/gcc/3.4.4/72_all_sh-no-reorder-blocks.patch b/patches/gcc/3.4.4/72_all_sh-no-reorder-blocks.patch new file mode 100644 index 00000000..8b982683 --- /dev/null +++ b/patches/gcc/3.4.4/72_all_sh-no-reorder-blocks.patch @@ -0,0 +1,13 @@ +--- g/gcc/config/sh/sh.h ++++ g/gcc/config/sh/sh.h +@@ -422,6 +422,10 @@ + do { \ + if (LEVEL) \ + flag_omit_frame_pointer = -1; \ ++ if (LEVEL <= 2) \ ++ { \ ++ flag_reorder_blocks = 0; \ ++ } \ + if (SIZE) \ + target_flags |= SPACE_BIT; \ + if (TARGET_SHMEDIA && LEVEL > 1) \ diff --git a/patches/gcc/3.4.4/73_all_sh-pr20617.patch b/patches/gcc/3.4.4/73_all_sh-pr20617.patch new file mode 100644 index 00000000..6d8021cc --- /dev/null +++ b/patches/gcc/3.4.4/73_all_sh-pr20617.patch @@ -0,0 +1,28 @@ +2005-03-24 J"orn Rennecke <joern.rennecke@st.com> + + Band aid for PR target/20617: + * config/sh/lib1funcs.asm (FUNC, ALIAS): Add .hidden directive. + +--- g/gcc/config/sh/lib1funcs.asm ++++ g/gcc/config/sh/lib1funcs.asm +@@ -37,9 +37,19 @@ Boston, MA 02111-1307, USA. */ + ELF local label prefixes by J"orn Rennecke + amylaar@cygnus.com */ + ++#define ALIAS(X,Y) .global GLOBAL(X); .set GLOBAL(X),GLOBAL(Y) ++ + #ifdef __ELF__ + #define LOCAL(X) .L_##X +-#define FUNC(X) .type X,@function ++ ++#if 1 /* ??? The export list mechanism is broken, everything that is not ++ hidden is exported. */ ++#undef FUNC ++#define FUNC(X) .type X,@function; .hidden X ++#undef ALIAS ++#define ALIAS(X,Y) .global GLOBAL(X); .set GLOBAL(X),GLOBAL(Y); .hidden GLOBAL(X) ++#endif ++ + #define ENDFUNC0(X) .Lfe_##X: .size X,.Lfe_##X-X + #define ENDFUNC(X) ENDFUNC0(X) + #else diff --git a/patches/gcc/3.4.4/800-arm-bigendian.patch b/patches/gcc/3.4.4/800-arm-bigendian.patch new file mode 100644 index 00000000..625e3357 --- /dev/null +++ b/patches/gcc/3.4.4/800-arm-bigendian.patch @@ -0,0 +1,66 @@ +diff -dur gcc-3.4.4.orig/gcc/config/arm/linux-elf.h gcc-3.4.4/gcc/config/arm/linux-elf.h +--- gcc-3.4.4.orig/gcc/config/arm/linux-elf.h 2007-02-14 17:44:27.000000000 +0100 ++++ gcc-3.4.4/gcc/config/arm/linux-elf.h 2007-02-14 17:47:32.000000000 +0100 +@@ -30,17 +30,34 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 | \ ++ ARM_FLAG_MMU_TRAPS | \ ++ TARGET_ENDIAN_DEFAULT ) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -94,7 +111,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() +Only in gcc-3.4.4/gcc/config/arm: linux-elf.h.orig +diff -dur gcc-3.4.4.orig/gcc/config.gcc gcc-3.4.4/gcc/config.gcc +--- gcc-3.4.4.orig/gcc/config.gcc 2007-02-14 17:44:27.000000000 +0100 ++++ gcc-3.4.4/gcc/config.gcc 2007-02-14 17:47:32.000000000 +0100 +@@ -672,6 +672,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/patches/gcc/3.4.4/800-powerpc-libc_stack_end-uclibc.patch b/patches/gcc/3.4.4/800-powerpc-libc_stack_end-uclibc.patch new file mode 100644 index 00000000..a209470f --- /dev/null +++ b/patches/gcc/3.4.4/800-powerpc-libc_stack_end-uclibc.patch @@ -0,0 +1,15 @@ +--- gcc-3.4.4/gcc/config/rs6000/linux-unwind.h.org 2005-06-23 17:50:34.000000000 -0600 ++++ gcc-3.4.4/gcc/config/rs6000/linux-unwind.h 2005-06-23 17:52:02.000000000 -0600 +@@ -32,6 +32,7 @@ + these structs elsewhere; Many fields are missing, particularly + from the end of the structures. */ + ++#ifndef inhibit_libc + struct gcc_vregs + { + __attribute__ ((vector_size (16))) int vr[32]; +@@ -320,3 +321,4 @@ + \ + goto SUCCESS; \ + } while (0) ++#endif diff --git a/patches/gcc/3.4.4/830-gcc-bug-num-22167.patch b/patches/gcc/3.4.4/830-gcc-bug-num-22167.patch new file mode 100644 index 00000000..c7419af9 --- /dev/null +++ b/patches/gcc/3.4.4/830-gcc-bug-num-22167.patch @@ -0,0 +1,16 @@ +Index: gcc/gcse.c +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/gcse.c,v +retrieving revision 1.288.2.9 +diff -u -p -F^\([(a-zA-Z0-9_]\|#define\) -r1.288.2.9 gcse.c +--- gcc/gcc/gcse.c 30 Oct 2004 18:02:53 -0000 1.288.2.9 ++++ gcc/gcc/gcse.c 14 Jul 2005 13:19:57 -0000 +@@ -6445,7 +6445,7 @@ hoist_code (void) + insn_inserted_p = 0; + + /* These tests should be the same as the tests above. */ +- if (TEST_BIT (hoist_vbeout[bb->index], i)) ++ if (TEST_BIT (hoist_exprs[bb->index], i)) + { + /* We've found a potentially hoistable expression, now + we look at every block BB dominates to see if it diff --git a/patches/gcc/3.4.4/900-nios2.patch b/patches/gcc/3.4.4/900-nios2.patch new file mode 100644 index 00000000..bfa06a21 --- /dev/null +++ b/patches/gcc/3.4.4/900-nios2.patch @@ -0,0 +1,10211 @@ +--- gcc-3.4.3/gcc/Makefile.in ++++ gcc-3.4.3-nios2/gcc/Makefile.in +@@ -3085,7 +3085,7 @@ install-mkheaders: stmp-int-hdrs $(STMP_ + $(INSTALL_DATA) $(srcdir)/README-fixinc \ + $(DESTDIR)$(itoolsdatadir)/include/README ; \ + $(INSTALL_SCRIPT) fixinc.sh $(DESTDIR)$(itoolsdir)/fixinc.sh ; \ +- $(INSTALL_PROGRAM) fixinc/fixincl $(DESTDIR)$(itoolsdir)/fixincl ; \ ++ $(INSTALL_PROGRAM) fixinc/fixincl$(build_exeext) $(DESTDIR)$(itoolsdir)/fixincl$(build_exeext) ; \ + $(INSTALL_DATA) $(srcdir)/gsyslimits.h \ + $(DESTDIR)$(itoolsdatadir)/gsyslimits.h ; \ + else :; fi +--- gcc-3.4.3/gcc/combine.c ++++ gcc-3.4.3-nios2/gcc/combine.c +@@ -4380,6 +4380,14 @@ combine_simplify_rtx (rtx x, enum machin + mode); + } + ++#ifndef __nios2__ ++/* This screws up Nios II in this test case: ++ ++if (x & 1) ++ return 2; ++else ++ return 3; ++*/ + else if (STORE_FLAG_VALUE == 1 + && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT + && op1 == const0_rtx +@@ -4391,6 +4399,7 @@ combine_simplify_rtx (rtx x, enum machin + gen_lowpart_for_combine (mode, op0), + const1_rtx); + } ++#endif + + else if (STORE_FLAG_VALUE == 1 + && new_code == EQ && GET_MODE_CLASS (mode) == MODE_INT +--- gcc-3.4.3/gcc/config/nios2/crti.asm ++++ gcc-3.4.3-nios2/gcc/config/nios2/crti.asm +@@ -0,0 +1,88 @@ ++/* ++ Copyright (C) 2003 ++ by Jonah Graham (jgraham@altera.com) ++ ++This file is free software; you can redistribute it and/or modify it ++under the terms of the GNU General Public License as published by the ++Free Software Foundation; either version 2, or (at your option) any ++later version. ++ ++In addition to the permissions in the GNU General Public License, the ++Free Software Foundation gives you unlimited permission to link the ++compiled version of this file with other programs, and to distribute ++those programs without any restriction coming from the use of this ++file. (The General Public License restrictions do apply in other ++respects; for example, they cover modification of the file, and ++distribution when not linked into another program.) ++ ++This file 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 ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. ++ ++ As a special exception, if you link this library with files ++ compiled with GCC to produce an executable, this does not cause ++ the resulting executable to be covered by the GNU General Public License. ++ This exception does not however invalidate any other reasons why ++ the executable file might be covered by the GNU General Public License. ++ ++ ++This file just make a stack frame for the contents of the .fini and ++.init sections. Users may put any desired instructions in those ++sections. ++ ++ ++While technically any code can be put in the init and fini sections ++most stuff will not work other than stuff which obeys the call frame ++and ABI. All the call-preserved registers are saved, the call clobbered ++registers should have been saved by the code calling init and fini. ++ ++See crtstuff.c for an example of code that inserts itself in the ++init and fini sections. ++ ++See crt0.s for the code that calls init and fini. ++*/ ++ ++ .file "crti.asm" ++ ++ .section ".init" ++ .align 2 ++ .global _init ++_init: ++ addi sp, sp, -48 ++ stw ra, 44(sp) ++ stw r23, 40(sp) ++ stw r22, 36(sp) ++ stw r21, 32(sp) ++ stw r20, 28(sp) ++ stw r19, 24(sp) ++ stw r18, 20(sp) ++ stw r17, 16(sp) ++ stw r16, 12(sp) ++ stw fp, 8(sp) ++ mov fp, sp ++ ++ ++ .section ".fini" ++ .align 2 ++ .global _fini ++_fini: ++ addi sp, sp, -48 ++ stw ra, 44(sp) ++ stw r23, 40(sp) ++ stw r22, 36(sp) ++ stw r21, 32(sp) ++ stw r20, 28(sp) ++ stw r19, 24(sp) ++ stw r18, 20(sp) ++ stw r17, 16(sp) ++ stw r16, 12(sp) ++ stw fp, 8(sp) ++ mov fp, sp ++ ++ +--- gcc-3.4.3/gcc/config/nios2/crtn.asm ++++ gcc-3.4.3-nios2/gcc/config/nios2/crtn.asm +@@ -0,0 +1,70 @@ ++/* ++ Copyright (C) 2003 ++ by Jonah Graham (jgraham@altera.com) ++ ++This file is free software; you can redistribute it and/or modify it ++under the terms of the GNU General Public License as published by the ++Free Software Foundation; either version 2, or (at your option) any ++later version. ++ ++In addition to the permissions in the GNU General Public License, the ++Free Software Foundation gives you unlimited permission to link the ++compiled version of this file with other programs, and to distribute ++those programs without any restriction coming from the use of this ++file. (The General Public License restrictions do apply in other ++respects; for example, they cover modification of the file, and ++distribution when not linked into another program.) ++ ++This file 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 ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. ++ ++ As a special exception, if you link this library with files ++ compiled with GCC to produce an executable, this does not cause ++ the resulting executable to be covered by the GNU General Public License. ++ This exception does not however invalidate any other reasons why ++ the executable file might be covered by the GNU General Public License. ++ ++ ++This file just makes sure that the .fini and .init sections do in ++fact return. Users may put any desired instructions in those sections. ++This file is the last thing linked into any executable. ++*/ ++ .file "crtn.asm" ++ ++ ++ ++ .section ".init" ++ ldw ra, 44(sp) ++ ldw r23, 40(sp) ++ ldw r22, 36(sp) ++ ldw r21, 32(sp) ++ ldw r20, 28(sp) ++ ldw r19, 24(sp) ++ ldw r18, 20(sp) ++ ldw r17, 16(sp) ++ ldw r16, 12(sp) ++ ldw fp, 8(sp) ++ addi sp, sp, -48 ++ ret ++ ++ .section ".fini" ++ ldw ra, 44(sp) ++ ldw r23, 40(sp) ++ ldw r22, 36(sp) ++ ldw r21, 32(sp) ++ ldw r20, 28(sp) ++ ldw r19, 24(sp) ++ ldw r18, 20(sp) ++ ldw r17, 16(sp) ++ ldw r16, 12(sp) ++ ldw fp, 8(sp) ++ addi sp, sp, -48 ++ ret ++ +--- gcc-3.4.3/gcc/config/nios2/lib2-divmod-hi.c ++++ gcc-3.4.3-nios2/gcc/config/nios2/lib2-divmod-hi.c +@@ -0,0 +1,123 @@ ++ ++/* We include auto-host.h here to get HAVE_GAS_HIDDEN. This is ++ supposedly valid even though this is a "target" file. */ ++#include "auto-host.h" ++ ++ ++#include "tconfig.h" ++#include "tsystem.h" ++#include "coretypes.h" ++#include "tm.h" ++ ++ ++/* Don't use `fancy_abort' here even if config.h says to use it. */ ++#ifdef abort ++#undef abort ++#endif ++ ++ ++#ifdef HAVE_GAS_HIDDEN ++#define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden"))) ++#else ++#define ATTRIBUTE_HIDDEN ++#endif ++ ++#include "libgcc2.h" ++ ++extern HItype __modhi3 (HItype, HItype); ++extern HItype __divhi3 (HItype, HItype); ++extern HItype __umodhi3 (HItype, HItype); ++extern HItype __udivhi3 (HItype, HItype); ++ ++static UHItype udivmodhi4(UHItype, UHItype, word_type); ++ ++static UHItype ++udivmodhi4(UHItype num, UHItype den, word_type modwanted) ++{ ++ UHItype bit = 1; ++ UHItype res = 0; ++ ++ while (den < num && bit && !(den & (1L<<15))) ++ { ++ den <<=1; ++ bit <<=1; ++ } ++ while (bit) ++ { ++ if (num >= den) ++ { ++ num -= den; ++ res |= bit; ++ } ++ bit >>=1; ++ den >>=1; ++ } ++ if (modwanted) return num; ++ return res; ++} ++ ++ ++HItype ++__divhi3 (HItype a, HItype b) ++{ ++ word_type neg = 0; ++ HItype res; ++ ++ if (a < 0) ++ { ++ a = -a; ++ neg = !neg; ++ } ++ ++ if (b < 0) ++ { ++ b = -b; ++ neg = !neg; ++ } ++ ++ res = udivmodhi4 (a, b, 0); ++ ++ if (neg) ++ res = -res; ++ ++ return res; ++} ++ ++ ++HItype ++__modhi3 (HItype a, HItype b) ++{ ++ word_type neg = 0; ++ HItype res; ++ ++ if (a < 0) ++ { ++ a = -a; ++ neg = 1; ++ } ++ ++ if (b < 0) ++ b = -b; ++ ++ res = udivmodhi4 (a, b, 1); ++ ++ if (neg) ++ res = -res; ++ ++ return res; ++} ++ ++ ++HItype ++__udivhi3 (HItype a, HItype b) ++{ ++ return udivmodhi4 (a, b, 0); ++} ++ ++ ++HItype ++__umodhi3 (HItype a, HItype b) ++{ ++ return udivmodhi4 (a, b, 1); ++} ++ +--- gcc-3.4.3/gcc/config/nios2/lib2-divmod.c ++++ gcc-3.4.3-nios2/gcc/config/nios2/lib2-divmod.c +@@ -0,0 +1,126 @@ ++ ++/* We include auto-host.h here to get HAVE_GAS_HIDDEN. This is ++ supposedly valid even though this is a "target" file. */ ++#include "auto-host.h" ++ ++ ++#include "tconfig.h" ++#include "tsystem.h" ++#include "coretypes.h" ++#include "tm.h" ++ ++ ++/* Don't use `fancy_abort' here even if config.h says to use it. */ ++#ifdef abort ++#undef abort ++#endif ++ ++ ++#ifdef HAVE_GAS_HIDDEN ++#define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden"))) ++#else ++#define ATTRIBUTE_HIDDEN ++#endif ++ ++#include "libgcc2.h" ++ ++extern SItype __modsi3 (SItype, SItype); ++extern SItype __divsi3 (SItype, SItype); ++extern SItype __umodsi3 (SItype, SItype); ++extern SItype __udivsi3 (SItype, SItype); ++ ++static USItype udivmodsi4(USItype, USItype, word_type); ++ ++/* 16-bit SI divide and modulo as used in NIOS */ ++ ++ ++static USItype ++udivmodsi4(USItype num, USItype den, word_type modwanted) ++{ ++ USItype bit = 1; ++ USItype res = 0; ++ ++ while (den < num && bit && !(den & (1L<<31))) ++ { ++ den <<=1; ++ bit <<=1; ++ } ++ while (bit) ++ { ++ if (num >= den) ++ { ++ num -= den; ++ res |= bit; ++ } ++ bit >>=1; ++ den >>=1; ++ } ++ if (modwanted) return num; ++ return res; ++} ++ ++ ++SItype ++__divsi3 (SItype a, SItype b) ++{ ++ word_type neg = 0; ++ SItype res; ++ ++ if (a < 0) ++ { ++ a = -a; ++ neg = !neg; ++ } ++ ++ if (b < 0) ++ { ++ b = -b; ++ neg = !neg; ++ } ++ ++ res = udivmodsi4 (a, b, 0); ++ ++ if (neg) ++ res = -res; ++ ++ return res; ++} ++ ++ ++SItype ++__modsi3 (SItype a, SItype b) ++{ ++ word_type neg = 0; ++ SItype res; ++ ++ if (a < 0) ++ { ++ a = -a; ++ neg = 1; ++ } ++ ++ if (b < 0) ++ b = -b; ++ ++ res = udivmodsi4 (a, b, 1); ++ ++ if (neg) ++ res = -res; ++ ++ return res; ++} ++ ++ ++SItype ++__udivsi3 (SItype a, SItype b) ++{ ++ return udivmodsi4 (a, b, 0); ++} ++ ++ ++SItype ++__umodsi3 (SItype a, SItype b) ++{ ++ return udivmodsi4 (a, b, 1); ++} ++ +--- gcc-3.4.3/gcc/config/nios2/lib2-divtable.c ++++ gcc-3.4.3-nios2/gcc/config/nios2/lib2-divtable.c +@@ -0,0 +1,46 @@ ++ ++/* We include auto-host.h here to get HAVE_GAS_HIDDEN. This is ++ supposedly valid even though this is a "target" file. */ ++#include "auto-host.h" ++ ++ ++#include "tconfig.h" ++#include "tsystem.h" ++#include "coretypes.h" ++#include "tm.h" ++ ++ ++/* Don't use `fancy_abort' here even if config.h says to use it. */ ++#ifdef abort ++#undef abort ++#endif ++ ++ ++#ifdef HAVE_GAS_HIDDEN ++#define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden"))) ++#else ++#define ATTRIBUTE_HIDDEN ++#endif ++ ++#include "libgcc2.h" ++ ++UQItype __divsi3_table[] = ++{ ++ 0, 0/1, 0/2, 0/3, 0/4, 0/5, 0/6, 0/7, 0/8, 0/9, 0/10, 0/11, 0/12, 0/13, 0/14, 0/15, ++ 0, 1/1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 1/10, 1/11, 1/12, 1/13, 1/14, 1/15, ++ 0, 2/1, 2/2, 2/3, 2/4, 2/5, 2/6, 2/7, 2/8, 2/9, 2/10, 2/11, 2/12, 2/13, 2/14, 2/15, ++ 0, 3/1, 3/2, 3/3, 3/4, 3/5, 3/6, 3/7, 3/8, 3/9, 3/10, 3/11, 3/12, 3/13, 3/14, 3/15, ++ 0, 4/1, 4/2, 4/3, 4/4, 4/5, 4/6, 4/7, 4/8, 4/9, 4/10, 4/11, 4/12, 4/13, 4/14, 4/15, ++ 0, 5/1, 5/2, 5/3, 5/4, 5/5, 5/6, 5/7, 5/8, 5/9, 5/10, 5/11, 5/12, 5/13, 5/14, 5/15, ++ 0, 6/1, 6/2, 6/3, 6/4, 6/5, 6/6, 6/7, 6/8, 6/9, 6/10, 6/11, 6/12, 6/13, 6/14, 6/15, ++ 0, 7/1, 7/2, 7/3, 7/4, 7/5, 7/6, 7/7, 7/8, 7/9, 7/10, 7/11, 7/12, 7/13, 7/14, 7/15, ++ 0, 8/1, 8/2, 8/3, 8/4, 8/5, 8/6, 8/7, 8/8, 8/9, 8/10, 8/11, 8/12, 8/13, 8/14, 8/15, ++ 0, 9/1, 9/2, 9/3, 9/4, 9/5, 9/6, 9/7, 9/8, 9/9, 9/10, 9/11, 9/12, 9/13, 9/14, 9/15, ++ 0, 10/1, 10/2, 10/3, 10/4, 10/5, 10/6, 10/7, 10/8, 10/9, 10/10, 10/11, 10/12, 10/13, 10/14, 10/15, ++ 0, 11/1, 11/2, 11/3, 11/4, 11/5, 11/6, 11/7, 11/8, 11/9, 11/10, 11/11, 11/12, 11/13, 11/14, 11/15, ++ 0, 12/1, 12/2, 12/3, 12/4, 12/5, 12/6, 12/7, 12/8, 12/9, 12/10, 12/11, 12/12, 12/13, 12/14, 12/15, ++ 0, 13/1, 13/2, 13/3, 13/4, 13/5, 13/6, 13/7, 13/8, 13/9, 13/10, 13/11, 13/12, 13/13, 13/14, 13/15, ++ 0, 14/1, 14/2, 14/3, 14/4, 14/5, 14/6, 14/7, 14/8, 14/9, 14/10, 14/11, 14/12, 14/13, 14/14, 14/15, ++ 0, 15/1, 15/2, 15/3, 15/4, 15/5, 15/6, 15/7, 15/8, 15/9, 15/10, 15/11, 15/12, 15/13, 15/14, 15/15, ++}; ++ +--- gcc-3.4.3/gcc/config/nios2/lib2-mul.c ++++ gcc-3.4.3-nios2/gcc/config/nios2/lib2-mul.c +@@ -0,0 +1,103 @@ ++/* while we are debugging (ie compile outside of gcc build) ++ disable gcc specific headers */ ++#ifndef DEBUG_MULSI3 ++ ++ ++/* We include auto-host.h here to get HAVE_GAS_HIDDEN. This is ++ supposedly valid even though this is a "target" file. */ ++#include "auto-host.h" ++ ++ ++#include "tconfig.h" ++#include "tsystem.h" ++#include "coretypes.h" ++#include "tm.h" ++ ++ ++/* Don't use `fancy_abort' here even if config.h says to use it. */ ++#ifdef abort ++#undef abort ++#endif ++ ++ ++#ifdef HAVE_GAS_HIDDEN ++#define ATTRIBUTE_HIDDEN __attribute__ ((__visibility__ ("hidden"))) ++#else ++#define ATTRIBUTE_HIDDEN ++#endif ++ ++#include "libgcc2.h" ++ ++#else ++#define SItype int ++#define USItype unsigned int ++#endif ++ ++ ++extern SItype __mulsi3 (SItype, SItype); ++ ++SItype ++__mulsi3 (SItype a, SItype b) ++{ ++ SItype res = 0; ++ USItype cnt = a; ++ ++ while (cnt) ++ { ++ if (cnt & 1) ++ { ++ res += b; ++ } ++ b <<= 1; ++ cnt >>= 1; ++ } ++ ++ return res; ++} ++/* ++TODO: Choose best alternative implementation. ++ ++SItype ++__divsi3 (SItype a, SItype b) ++{ ++ SItype res = 0; ++ USItype cnt = 0; ++ ++ while (cnt < 32) ++ { ++ if (a & (1L << cnt)) ++ { ++ res += b; ++ } ++ b <<= 1; ++ cnt++; ++ } ++ ++ return res; ++} ++*/ ++ ++ ++#ifdef DEBUG_MULSI3 ++ ++int ++main () ++{ ++ int i, j; ++ int error = 0; ++ ++ for (i = -1000; i < 1000; i++) ++ for (j = -1000; j < 1000; j++) ++ { ++ int expect = i * j; ++ int actual = A__divsi3 (i, j); ++ if (expect != actual) ++ { ++ printf ("error: %d * %d = %d not %d\n", i, j, expect, actual); ++ error = 1; ++ } ++ } ++ ++ return error; ++} ++#endif +--- gcc-3.4.3/gcc/config/nios2/nios2-dp-bit.c ++++ gcc-3.4.3-nios2/gcc/config/nios2/nios2-dp-bit.c +@@ -0,0 +1,1652 @@ ++ ++/* This is a software floating point library which can be used ++ for targets without hardware floating point. ++ Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004 ++ Free Software Foundation, Inc. ++ ++This file is free software; you can redistribute it and/or modify it ++under the terms of the GNU General Public License as published by the ++Free Software Foundation; either version 2, or (at your option) any ++later version. ++ ++In addition to the permissions in the GNU General Public License, the ++Free Software Foundation gives you unlimited permission to link the ++compiled version of this file with other programs, and to distribute ++those programs without any restriction coming from the use of this ++file. (The General Public License restrictions do apply in other ++respects; for example, they cover modification of the file, and ++distribution when not linked into another program.) ++ ++This file 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 ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++/* As a special exception, if you link this library with other files, ++ some of which are compiled with GCC, to produce an executable, ++ this library does not by itself cause the resulting executable ++ to be covered by the GNU General Public License. ++ This exception does not however invalidate any other reasons why ++ the executable file might be covered by the GNU General Public License. */ ++ ++/* This implements IEEE 754 format arithmetic, but does not provide a ++ mechanism for setting the rounding mode, or for generating or handling ++ exceptions. ++ ++ The original code by Steve Chamberlain, hacked by Mark Eichin and Jim ++ Wilson, all of Cygnus Support. */ ++ ++/* The intended way to use this file is to make two copies, add `#define FLOAT' ++ to one copy, then compile both copies and add them to libgcc.a. */ ++ ++#include "tconfig.h" ++#include "coretypes.h" ++#include "tm.h" ++#include "config/fp-bit.h" ++ ++/* The following macros can be defined to change the behavior of this file: ++ FLOAT: Implement a `float', aka SFmode, fp library. If this is not ++ defined, then this file implements a `double', aka DFmode, fp library. ++ FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e. ++ don't include float->double conversion which requires the double library. ++ This is useful only for machines which can't support doubles, e.g. some ++ 8-bit processors. ++ CMPtype: Specify the type that floating point compares should return. ++ This defaults to SItype, aka int. ++ US_SOFTWARE_GOFAST: This makes all entry points use the same names as the ++ US Software goFast library. ++ _DEBUG_BITFLOAT: This makes debugging the code a little easier, by adding ++ two integers to the FLO_union_type. ++ NO_DENORMALS: Disable handling of denormals. ++ NO_NANS: Disable nan and infinity handling ++ SMALL_MACHINE: Useful when operations on QIs and HIs are faster ++ than on an SI */ ++ ++/* We don't currently support extended floats (long doubles) on machines ++ without hardware to deal with them. ++ ++ These stubs are just to keep the linker from complaining about unresolved ++ references which can be pulled in from libio & libstdc++, even if the ++ user isn't using long doubles. However, they may generate an unresolved ++ external to abort if abort is not used by the function, and the stubs ++ are referenced from within libc, since libgcc goes before and after the ++ system library. */ ++ ++#ifdef DECLARE_LIBRARY_RENAMES ++ DECLARE_LIBRARY_RENAMES ++#endif ++ ++#ifdef EXTENDED_FLOAT_STUBS ++extern void abort (void); ++void __extendsfxf2 (void) { abort(); } ++void __extenddfxf2 (void) { abort(); } ++void __truncxfdf2 (void) { abort(); } ++void __truncxfsf2 (void) { abort(); } ++void __fixxfsi (void) { abort(); } ++void __floatsixf (void) { abort(); } ++void __addxf3 (void) { abort(); } ++void __subxf3 (void) { abort(); } ++void __mulxf3 (void) { abort(); } ++void __divxf3 (void) { abort(); } ++void __negxf2 (void) { abort(); } ++void __eqxf2 (void) { abort(); } ++void __nexf2 (void) { abort(); } ++void __gtxf2 (void) { abort(); } ++void __gexf2 (void) { abort(); } ++void __lexf2 (void) { abort(); } ++void __ltxf2 (void) { abort(); } ++ ++void __extendsftf2 (void) { abort(); } ++void __extenddftf2 (void) { abort(); } ++void __trunctfdf2 (void) { abort(); } ++void __trunctfsf2 (void) { abort(); } ++void __fixtfsi (void) { abort(); } ++void __floatsitf (void) { abort(); } ++void __addtf3 (void) { abort(); } ++void __subtf3 (void) { abort(); } ++void __multf3 (void) { abort(); } ++void __divtf3 (void) { abort(); } ++void __negtf2 (void) { abort(); } ++void __eqtf2 (void) { abort(); } ++void __netf2 (void) { abort(); } ++void __gttf2 (void) { abort(); } ++void __getf2 (void) { abort(); } ++void __letf2 (void) { abort(); } ++void __lttf2 (void) { abort(); } ++#else /* !EXTENDED_FLOAT_STUBS, rest of file */ ++ ++/* IEEE "special" number predicates */ ++ ++#ifdef NO_NANS ++ ++#define nan() 0 ++#define isnan(x) 0 ++#define isinf(x) 0 ++#else ++ ++#if defined L_thenan_sf ++const fp_number_type __thenan_sf = { CLASS_SNAN, 0, 0, {(fractype) 0} }; ++#elif defined L_thenan_df ++const fp_number_type __thenan_df = { CLASS_SNAN, 0, 0, {(fractype) 0} }; ++#elif defined L_thenan_tf ++const fp_number_type __thenan_tf = { CLASS_SNAN, 0, 0, {(fractype) 0} }; ++#elif defined TFLOAT ++extern const fp_number_type __thenan_tf; ++#elif defined FLOAT ++extern const fp_number_type __thenan_sf; ++#else ++extern const fp_number_type __thenan_df; ++#endif ++ ++INLINE ++static fp_number_type * ++nan (void) ++{ ++ /* Discard the const qualifier... */ ++#ifdef TFLOAT ++ return (fp_number_type *) (& __thenan_tf); ++#elif defined FLOAT ++ return (fp_number_type *) (& __thenan_sf); ++#else ++ return (fp_number_type *) (& __thenan_df); ++#endif ++} ++ ++INLINE ++static int ++isnan ( fp_number_type * x) ++{ ++ return x->class == CLASS_SNAN || x->class == CLASS_QNAN; ++} ++ ++INLINE ++static int ++isinf ( fp_number_type * x) ++{ ++ return x->class == CLASS_INFINITY; ++} ++ ++#endif /* NO_NANS */ ++ ++INLINE ++static int ++iszero ( fp_number_type * x) ++{ ++ return x->class == CLASS_ZERO; ++} ++ ++INLINE ++static void ++flip_sign ( fp_number_type * x) ++{ ++ x->sign = !x->sign; ++} ++ ++extern FLO_type pack_d ( fp_number_type * ); ++ ++#if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf) ++FLO_type ++pack_d ( fp_number_type * src) ++{ ++ FLO_union_type dst; ++ fractype fraction = src->fraction.ll; /* wasn't unsigned before? */ ++ int sign = src->sign; ++ int exp = 0; ++ ++ if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && (isnan (src) || isinf (src))) ++ { ++ /* We can't represent these values accurately. By using the ++ largest possible magnitude, we guarantee that the conversion ++ of infinity is at least as big as any finite number. */ ++ exp = EXPMAX; ++ fraction = ((fractype) 1 << FRACBITS) - 1; ++ } ++ else if (isnan (src)) ++ { ++ exp = EXPMAX; ++ if (src->class == CLASS_QNAN || 1) ++ { ++#ifdef QUIET_NAN_NEGATED ++ fraction |= QUIET_NAN - 1; ++#else ++ fraction |= QUIET_NAN; ++#endif ++ } ++ } ++ else if (isinf (src)) ++ { ++ exp = EXPMAX; ++ fraction = 0; ++ } ++ else if (iszero (src)) ++ { ++ exp = 0; ++ fraction = 0; ++ } ++ else if (fraction == 0) ++ { ++ exp = 0; ++ } ++ else ++ { ++ if (src->normal_exp < NORMAL_EXPMIN) ++ { ++#ifdef NO_DENORMALS ++ /* Go straight to a zero representation if denormals are not ++ supported. The denormal handling would be harmless but ++ isn't unnecessary. */ ++ exp = 0; ++ fraction = 0; ++#else /* NO_DENORMALS */ ++ /* This number's exponent is too low to fit into the bits ++ available in the number, so we'll store 0 in the exponent and ++ shift the fraction to the right to make up for it. */ ++ ++ int shift = NORMAL_EXPMIN - src->normal_exp; ++ ++ exp = 0; ++ ++ if (shift > FRAC_NBITS - NGARDS) ++ { ++ /* No point shifting, since it's more that 64 out. */ ++ fraction = 0; ++ } ++ else ++ { ++ int lowbit = (fraction & (((fractype)1 << shift) - 1)) ? 1 : 0; ++ fraction = (fraction >> shift) | lowbit; ++ } ++ if ((fraction & GARDMASK) == GARDMSB) ++ { ++ if ((fraction & (1 << NGARDS))) ++ fraction += GARDROUND + 1; ++ } ++ else ++ { ++ /* Add to the guards to round up. */ ++ fraction += GARDROUND; ++ } ++ /* Perhaps the rounding means we now need to change the ++ exponent, because the fraction is no longer denormal. */ ++ if (fraction >= IMPLICIT_1) ++ { ++ exp += 1; ++ } ++ fraction >>= NGARDS; ++#endif /* NO_DENORMALS */ ++ } ++ else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) ++ && src->normal_exp > EXPBIAS) ++ { ++ exp = EXPMAX; ++ fraction = 0; ++ } ++ else ++ { ++ exp = src->normal_exp + EXPBIAS; ++ if (!ROUND_TOWARDS_ZERO) ++ { ++ /* IF the gard bits are the all zero, but the first, then we're ++ half way between two numbers, choose the one which makes the ++ lsb of the answer 0. */ ++ if ((fraction & GARDMASK) == GARDMSB) ++ { ++ if (fraction & (1 << NGARDS)) ++ fraction += GARDROUND + 1; ++ } ++ else ++ { ++ /* Add a one to the guards to round up */ ++ fraction += GARDROUND; ++ } ++ if (fraction >= IMPLICIT_2) ++ { ++ fraction >>= 1; ++ exp += 1; ++ } ++ } ++ fraction >>= NGARDS; ++ ++ if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp > EXPMAX) ++ { ++ /* Saturate on overflow. */ ++ exp = EXPMAX; ++ fraction = ((fractype) 1 << FRACBITS) - 1; ++ } ++ } ++ } ++ ++ /* We previously used bitfields to store the number, but this doesn't ++ handle little/big endian systems conveniently, so use shifts and ++ masks */ ++#ifdef FLOAT_BIT_ORDER_MISMATCH ++ dst.bits.fraction = fraction; ++ dst.bits.exp = exp; ++ dst.bits.sign = sign; ++#else ++# if defined TFLOAT && defined HALFFRACBITS ++ { ++ halffractype high, low, unity; ++ int lowsign, lowexp; ++ ++ unity = (halffractype) 1 << HALFFRACBITS; ++ ++ /* Set HIGH to the high double's significand, masking out the implicit 1. ++ Set LOW to the low double's full significand. */ ++ high = (fraction >> (FRACBITS - HALFFRACBITS)) & (unity - 1); ++ low = fraction & (unity * 2 - 1); ++ ++ /* Get the initial sign and exponent of the low double. */ ++ lowexp = exp - HALFFRACBITS - 1; ++ lowsign = sign; ++ ++ /* HIGH should be rounded like a normal double, making |LOW| <= ++ 0.5 ULP of HIGH. Assume round-to-nearest. */ ++ if (exp < EXPMAX) ++ if (low > unity || (low == unity && (high & 1) == 1)) ++ { ++ /* Round HIGH up and adjust LOW to match. */ ++ high++; ++ if (high == unity) ++ { ++ /* May make it infinite, but that's OK. */ ++ high = 0; ++ exp++; ++ } ++ low = unity * 2 - low; ++ lowsign ^= 1; ++ } ++ ++ high |= (halffractype) exp << HALFFRACBITS; ++ high |= (halffractype) sign << (HALFFRACBITS + EXPBITS); ++ ++ if (exp == EXPMAX || exp == 0 || low == 0) ++ low = 0; ++ else ++ { ++ while (lowexp > 0 && low < unity) ++ { ++ low <<= 1; ++ lowexp--; ++ } ++ ++ if (lowexp <= 0) ++ { ++ halffractype roundmsb, round; ++ int shift; ++ ++ shift = 1 - lowexp; ++ roundmsb = (1 << (shift - 1)); ++ round = low & ((roundmsb << 1) - 1); ++ ++ low >>= shift; ++ lowexp = 0; ++ ++ if (round > roundmsb || (round == roundmsb && (low & 1) == 1)) ++ { ++ low++; ++ if (low == unity) ++ /* LOW rounds up to the smallest normal number. */ ++ lowexp++; ++ } ++ } ++ ++ low &= unity - 1; ++ low |= (halffractype) lowexp << HALFFRACBITS; ++ low |= (halffractype) lowsign << (HALFFRACBITS + EXPBITS); ++ } ++ dst.value_raw = ((fractype) high << HALFSHIFT) | low; ++ } ++# else ++ dst.value_raw = fraction & ((((fractype)1) << FRACBITS) - (fractype)1); ++ dst.value_raw |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << FRACBITS; ++ dst.value_raw |= ((fractype) (sign & 1)) << (FRACBITS | EXPBITS); ++# endif ++#endif ++ ++#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT) ++#ifdef TFLOAT ++ { ++ qrtrfractype tmp1 = dst.words[0]; ++ qrtrfractype tmp2 = dst.words[1]; ++ dst.words[0] = dst.words[3]; ++ dst.words[1] = dst.words[2]; ++ dst.words[2] = tmp2; ++ dst.words[3] = tmp1; ++ } ++#else ++ { ++ halffractype tmp = dst.words[0]; ++ dst.words[0] = dst.words[1]; ++ dst.words[1] = tmp; ++ } ++#endif ++#endif ++ ++ return dst.value; ++} ++#endif ++ ++#if defined(L_unpack_df) || defined(L_unpack_sf) || defined(L_unpack_tf) ++void ++unpack_d (FLO_union_type * src, fp_number_type * dst) ++{ ++ /* We previously used bitfields to store the number, but this doesn't ++ handle little/big endian systems conveniently, so use shifts and ++ masks */ ++ fractype fraction; ++ int exp; ++ int sign; ++ ++#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT) ++ FLO_union_type swapped; ++ ++#ifdef TFLOAT ++ swapped.words[0] = src->words[3]; ++ swapped.words[1] = src->words[2]; ++ swapped.words[2] = src->words[1]; ++ swapped.words[3] = src->words[0]; ++#else ++ swapped.words[0] = src->words[1]; ++ swapped.words[1] = src->words[0]; ++#endif ++ src = &swapped; ++#endif ++ ++#ifdef FLOAT_BIT_ORDER_MISMATCH ++ fraction = src->bits.fraction; ++ exp = src->bits.exp; ++ sign = src->bits.sign; ++#else ++# if defined TFLOAT && defined HALFFRACBITS ++ { ++ halffractype high, low; ++ ++ high = src->value_raw >> HALFSHIFT; ++ low = src->value_raw & (((fractype)1 << HALFSHIFT) - 1); ++ ++ fraction = high & ((((fractype)1) << HALFFRACBITS) - 1); ++ fraction <<= FRACBITS - HALFFRACBITS; ++ exp = ((int)(high >> HALFFRACBITS)) & ((1 << EXPBITS) - 1); ++ sign = ((int)(high >> (((HALFFRACBITS + EXPBITS))))) & 1; ++ ++ if (exp != EXPMAX && exp != 0 && low != 0) ++ { ++ int lowexp = ((int)(low >> HALFFRACBITS)) & ((1 << EXPBITS) - 1); ++ int lowsign = ((int)(low >> (((HALFFRACBITS + EXPBITS))))) & 1; ++ int shift; ++ fractype xlow; ++ ++ xlow = low & ((((fractype)1) << HALFFRACBITS) - 1); ++ if (lowexp) ++ xlow |= (((halffractype)1) << HALFFRACBITS); ++ else ++ lowexp = 1; ++ shift = (FRACBITS - HALFFRACBITS) - (exp - lowexp); ++ if (shift > 0) ++ xlow <<= shift; ++ else if (shift < 0) ++ xlow >>= -shift; ++ if (sign == lowsign) ++ fraction += xlow; ++ else if (fraction >= xlow) ++ fraction -= xlow; ++ else ++ { ++ /* The high part is a power of two but the full number is lower. ++ This code will leave the implicit 1 in FRACTION, but we'd ++ have added that below anyway. */ ++ fraction = (((fractype) 1 << FRACBITS) - xlow) << 1; ++ exp--; ++ } ++ } ++ } ++# else ++ fraction = src->value_raw & ((((fractype)1) << FRACBITS) - 1); ++ exp = ((int)(src->value_raw >> FRACBITS)) & ((1 << EXPBITS) - 1); ++ sign = ((int)(src->value_raw >> (FRACBITS + EXPBITS))) & 1; ++# endif ++#endif ++ ++ dst->sign = sign; ++ if (exp == 0) ++ { ++ /* Hmm. Looks like 0 */ ++ if (fraction == 0 ++#ifdef NO_DENORMALS ++ || 1 ++#endif ++ ) ++ { ++ /* tastes like zero */ ++ dst->class = CLASS_ZERO; ++ } ++ else ++ { ++ /* Zero exponent with nonzero fraction - it's denormalized, ++ so there isn't a leading implicit one - we'll shift it so ++ it gets one. */ ++ dst->normal_exp = exp - EXPBIAS + 1; ++ fraction <<= NGARDS; ++ ++ dst->class = CLASS_NUMBER; ++#if 1 ++ while (fraction < IMPLICIT_1) ++ { ++ fraction <<= 1; ++ dst->normal_exp--; ++ } ++#endif ++ dst->fraction.ll = fraction; ++ } ++ } ++ else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp == EXPMAX) ++ { ++ /* Huge exponent*/ ++ if (fraction == 0) ++ { ++ /* Attached to a zero fraction - means infinity */ ++ dst->class = CLASS_INFINITY; ++ } ++ else ++ { ++ /* Nonzero fraction, means nan */ ++#ifdef QUIET_NAN_NEGATED ++ if ((fraction & QUIET_NAN) == 0) ++#else ++ if (fraction & QUIET_NAN) ++#endif ++ { ++ dst->class = CLASS_QNAN; ++ } ++ else ++ { ++ dst->class = CLASS_SNAN; ++ } ++ /* Keep the fraction part as the nan number */ ++ dst->fraction.ll = fraction; ++ } ++ } ++ else ++ { ++ /* Nothing strange about this number */ ++ dst->normal_exp = exp - EXPBIAS; ++ dst->class = CLASS_NUMBER; ++ dst->fraction.ll = (fraction << NGARDS) | IMPLICIT_1; ++ } ++} ++#endif /* L_unpack_df || L_unpack_sf */ ++ ++#if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf) ++static fp_number_type * ++_fpadd_parts (fp_number_type * a, ++ fp_number_type * b, ++ fp_number_type * tmp) ++{ ++ intfrac tfraction; ++ ++ /* Put commonly used fields in local variables. */ ++ int a_normal_exp; ++ int b_normal_exp; ++ fractype a_fraction; ++ fractype b_fraction; ++ ++ if (isnan (a)) ++ { ++ return a; ++ } ++ if (isnan (b)) ++ { ++ return b; ++ } ++ if (isinf (a)) ++ { ++ /* Adding infinities with opposite signs yields a NaN. */ ++ if (isinf (b) && a->sign != b->sign) ++ return nan (); ++ return a; ++ } ++ if (isinf (b)) ++ { ++ return b; ++ } ++ if (iszero (b)) ++ { ++ if (iszero (a)) ++ { ++ *tmp = *a; ++ tmp->sign = a->sign & b->sign; ++ return tmp; ++ } ++ return a; ++ } ++ if (iszero (a)) ++ { ++ return b; ++ } ++ ++ /* Got two numbers. shift the smaller and increment the exponent till ++ they're the same */ ++ { ++ int diff; ++ ++ a_normal_exp = a->normal_exp; ++ b_normal_exp = b->normal_exp; ++ a_fraction = a->fraction.ll; ++ b_fraction = b->fraction.ll; ++ ++ diff = a_normal_exp - b_normal_exp; ++ ++ if (diff < 0) ++ diff = -diff; ++ if (diff < FRAC_NBITS) ++ { ++ /* ??? This does shifts one bit at a time. Optimize. */ ++ while (a_normal_exp > b_normal_exp) ++ { ++ b_normal_exp++; ++ LSHIFT (b_fraction); ++ } ++ while (b_normal_exp > a_normal_exp) ++ { ++ a_normal_exp++; ++ LSHIFT (a_fraction); ++ } ++ } ++ else ++ { ++ /* Somethings's up.. choose the biggest */ ++ if (a_normal_exp > b_normal_exp) ++ { ++ b_normal_exp = a_normal_exp; ++ b_fraction = 0; ++ } ++ else ++ { ++ a_normal_exp = b_normal_exp; ++ a_fraction = 0; ++ } ++ } ++ } ++ ++ if (a->sign != b->sign) ++ { ++ if (a->sign) ++ { ++ tfraction = -a_fraction + b_fraction; ++ } ++ else ++ { ++ tfraction = a_fraction - b_fraction; ++ } ++ if (tfraction >= 0) ++ { ++ tmp->sign = 0; ++ tmp->normal_exp = a_normal_exp; ++ tmp->fraction.ll = tfraction; ++ } ++ else ++ { ++ tmp->sign = 1; ++ tmp->normal_exp = a_normal_exp; ++ tmp->fraction.ll = -tfraction; ++ } ++ /* and renormalize it */ ++ ++ while (tmp->fraction.ll < IMPLICIT_1 && tmp->fraction.ll) ++ { ++ tmp->fraction.ll <<= 1; ++ tmp->normal_exp--; ++ } ++ } ++ else ++ { ++ tmp->sign = a->sign; ++ tmp->normal_exp = a_normal_exp; ++ tmp->fraction.ll = a_fraction + b_fraction; ++ } ++ tmp->class = CLASS_NUMBER; ++ /* Now the fraction is added, we have to shift down to renormalize the ++ number */ ++ ++ if (tmp->fraction.ll >= IMPLICIT_2) ++ { ++ LSHIFT (tmp->fraction.ll); ++ tmp->normal_exp++; ++ } ++ return tmp; ++ ++} ++ ++FLO_type ++add (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ fp_number_type tmp; ++ fp_number_type *res; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ res = _fpadd_parts (&a, &b, &tmp); ++ ++ return pack_d (res); ++} ++ ++FLO_type ++sub (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ fp_number_type tmp; ++ fp_number_type *res; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ b.sign ^= 1; ++ ++ res = _fpadd_parts (&a, &b, &tmp); ++ ++ return pack_d (res); ++} ++#endif /* L_addsub_sf || L_addsub_df */ ++ ++#if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf) ++static inline __attribute__ ((__always_inline__)) fp_number_type * ++_fpmul_parts ( fp_number_type * a, ++ fp_number_type * b, ++ fp_number_type * tmp) ++{ ++ fractype low = 0; ++ fractype high = 0; ++ ++ if (isnan (a)) ++ { ++ a->sign = a->sign != b->sign; ++ return a; ++ } ++ if (isnan (b)) ++ { ++ b->sign = a->sign != b->sign; ++ return b; ++ } ++ if (isinf (a)) ++ { ++ if (iszero (b)) ++ return nan (); ++ a->sign = a->sign != b->sign; ++ return a; ++ } ++ if (isinf (b)) ++ { ++ if (iszero (a)) ++ { ++ return nan (); ++ } ++ b->sign = a->sign != b->sign; ++ return b; ++ } ++ if (iszero (a)) ++ { ++ a->sign = a->sign != b->sign; ++ return a; ++ } ++ if (iszero (b)) ++ { ++ b->sign = a->sign != b->sign; ++ return b; ++ } ++ ++ /* Calculate the mantissa by multiplying both numbers to get a ++ twice-as-wide number. */ ++ { ++#if defined(NO_DI_MODE) || defined(TFLOAT) ++ { ++ fractype x = a->fraction.ll; ++ fractype ylow = b->fraction.ll; ++ fractype yhigh = 0; ++ int bit; ++ ++ /* ??? This does multiplies one bit at a time. Optimize. */ ++ for (bit = 0; bit < FRAC_NBITS; bit++) ++ { ++ int carry; ++ ++ if (x & 1) ++ { ++ carry = (low += ylow) < ylow; ++ high += yhigh + carry; ++ } ++ yhigh <<= 1; ++ if (ylow & FRACHIGH) ++ { ++ yhigh |= 1; ++ } ++ ylow <<= 1; ++ x >>= 1; ++ } ++ } ++#elif defined(FLOAT) ++ /* Multiplying two USIs to get a UDI, we're safe. */ ++ { ++ UDItype answer = (UDItype)a->fraction.ll * (UDItype)b->fraction.ll; ++ ++ high = answer >> BITS_PER_SI; ++ low = answer; ++ } ++#else ++ /* fractype is DImode, but we need the result to be twice as wide. ++ Assuming a widening multiply from DImode to TImode is not ++ available, build one by hand. */ ++ { ++ USItype nl = a->fraction.ll; ++ USItype nh = a->fraction.ll >> BITS_PER_SI; ++ USItype ml = b->fraction.ll; ++ USItype mh = b->fraction.ll >> BITS_PER_SI; ++ UDItype pp_ll = (UDItype) ml * nl; ++ UDItype pp_hl = (UDItype) mh * nl; ++ UDItype pp_lh = (UDItype) ml * nh; ++ UDItype pp_hh = (UDItype) mh * nh; ++ UDItype res2 = 0; ++ UDItype res0 = 0; ++ UDItype ps_hh__ = pp_hl + pp_lh; ++ if (ps_hh__ < pp_hl) ++ res2 += (UDItype)1 << BITS_PER_SI; ++ pp_hl = (UDItype)(USItype)ps_hh__ << BITS_PER_SI; ++ res0 = pp_ll + pp_hl; ++ if (res0 < pp_ll) ++ res2++; ++ res2 += (ps_hh__ >> BITS_PER_SI) + pp_hh; ++ high = res2; ++ low = res0; ++ } ++#endif ++ } ++ ++ tmp->normal_exp = a->normal_exp + b->normal_exp ++ + FRAC_NBITS - (FRACBITS + NGARDS); ++ tmp->sign = a->sign != b->sign; ++ while (high >= IMPLICIT_2) ++ { ++ tmp->normal_exp++; ++ if (high & 1) ++ { ++ low >>= 1; ++ low |= FRACHIGH; ++ } ++ high >>= 1; ++ } ++ while (high < IMPLICIT_1) ++ { ++ tmp->normal_exp--; ++ ++ high <<= 1; ++ if (low & FRACHIGH) ++ high |= 1; ++ low <<= 1; ++ } ++ /* rounding is tricky. if we only round if it won't make us round later. */ ++#if 0 ++ if (low & FRACHIGH2) ++ { ++ if (((high & GARDMASK) != GARDMSB) ++ && (((high + 1) & GARDMASK) == GARDMSB)) ++ { ++ /* don't round, it gets done again later. */ ++ } ++ else ++ { ++ high++; ++ } ++ } ++#endif ++ if (!ROUND_TOWARDS_ZERO && (high & GARDMASK) == GARDMSB) ++ { ++ if (high & (1 << NGARDS)) ++ { ++ /* half way, so round to even */ ++ high += GARDROUND + 1; ++ } ++ else if (low) ++ { ++ /* but we really weren't half way */ ++ high += GARDROUND + 1; ++ } ++ } ++ tmp->fraction.ll = high; ++ tmp->class = CLASS_NUMBER; ++ return tmp; ++} ++ ++FLO_type ++multiply (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ fp_number_type tmp; ++ fp_number_type *res; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ res = _fpmul_parts (&a, &b, &tmp); ++ ++ return pack_d (res); ++} ++#endif /* L_mul_sf || L_mul_df */ ++ ++#if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf) ++static inline __attribute__ ((__always_inline__)) fp_number_type * ++_fpdiv_parts (fp_number_type * a, ++ fp_number_type * b) ++{ ++ fractype bit; ++ fractype numerator; ++ fractype denominator; ++ fractype quotient; ++ ++ if (isnan (a)) ++ { ++ return a; ++ } ++ if (isnan (b)) ++ { ++ return b; ++ } ++ ++ a->sign = a->sign ^ b->sign; ++ ++ if (isinf (a) || iszero (a)) ++ { ++ if (a->class == b->class) ++ return nan (); ++ return a; ++ } ++ ++ if (isinf (b)) ++ { ++ a->fraction.ll = 0; ++ a->normal_exp = 0; ++ return a; ++ } ++ if (iszero (b)) ++ { ++ a->class = CLASS_INFINITY; ++ return a; ++ } ++ ++ /* Calculate the mantissa by multiplying both 64bit numbers to get a ++ 128 bit number */ ++ { ++ /* quotient = ++ ( numerator / denominator) * 2^(numerator exponent - denominator exponent) ++ */ ++ ++ a->normal_exp = a->normal_exp - b->normal_exp; ++ numerator = a->fraction.ll; ++ denominator = b->fraction.ll; ++ ++ if (numerator < denominator) ++ { ++ /* Fraction will be less than 1.0 */ ++ numerator *= 2; ++ a->normal_exp--; ++ } ++ bit = IMPLICIT_1; ++ quotient = 0; ++ /* ??? Does divide one bit at a time. Optimize. */ ++ while (bit) ++ { ++ if (numerator >= denominator) ++ { ++ quotient |= bit; ++ numerator -= denominator; ++ } ++ bit >>= 1; ++ numerator *= 2; ++ } ++ ++ if (!ROUND_TOWARDS_ZERO && (quotient & GARDMASK) == GARDMSB) ++ { ++ if (quotient & (1 << NGARDS)) ++ { ++ /* half way, so round to even */ ++ quotient += GARDROUND + 1; ++ } ++ else if (numerator) ++ { ++ /* but we really weren't half way, more bits exist */ ++ quotient += GARDROUND + 1; ++ } ++ } ++ ++ a->fraction.ll = quotient; ++ return (a); ++ } ++} ++ ++FLO_type ++divide (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ fp_number_type *res; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ res = _fpdiv_parts (&a, &b); ++ ++ return pack_d (res); ++} ++#endif /* L_div_sf || L_div_df */ ++ ++#if defined(L_fpcmp_parts_sf) || defined(L_fpcmp_parts_df) \ ++ || defined(L_fpcmp_parts_tf) ++/* according to the demo, fpcmp returns a comparison with 0... thus ++ a<b -> -1 ++ a==b -> 0 ++ a>b -> +1 ++ */ ++ ++int ++__fpcmp_parts (fp_number_type * a, fp_number_type * b) ++{ ++#if 0 ++ /* either nan -> unordered. Must be checked outside of this routine. */ ++ if (isnan (a) && isnan (b)) ++ { ++ return 1; /* still unordered! */ ++ } ++#endif ++ ++ if (isnan (a) || isnan (b)) ++ { ++ return 1; /* how to indicate unordered compare? */ ++ } ++ if (isinf (a) && isinf (b)) ++ { ++ /* +inf > -inf, but +inf != +inf */ ++ /* b \a| +inf(0)| -inf(1) ++ ______\+--------+-------- ++ +inf(0)| a==b(0)| a<b(-1) ++ -------+--------+-------- ++ -inf(1)| a>b(1) | a==b(0) ++ -------+--------+-------- ++ So since unordered must be nonzero, just line up the columns... ++ */ ++ return b->sign - a->sign; ++ } ++ /* but not both... */ ++ if (isinf (a)) ++ { ++ return a->sign ? -1 : 1; ++ } ++ if (isinf (b)) ++ { ++ return b->sign ? 1 : -1; ++ } ++ if (iszero (a) && iszero (b)) ++ { ++ return 0; ++ } ++ if (iszero (a)) ++ { ++ return b->sign ? 1 : -1; ++ } ++ if (iszero (b)) ++ { ++ return a->sign ? -1 : 1; ++ } ++ /* now both are "normal". */ ++ if (a->sign != b->sign) ++ { ++ /* opposite signs */ ++ return a->sign ? -1 : 1; ++ } ++ /* same sign; exponents? */ ++ if (a->normal_exp > b->normal_exp) ++ { ++ return a->sign ? -1 : 1; ++ } ++ if (a->normal_exp < b->normal_exp) ++ { ++ return a->sign ? 1 : -1; ++ } ++ /* same exponents; check size. */ ++ if (a->fraction.ll > b->fraction.ll) ++ { ++ return a->sign ? -1 : 1; ++ } ++ if (a->fraction.ll < b->fraction.ll) ++ { ++ return a->sign ? 1 : -1; ++ } ++ /* after all that, they're equal. */ ++ return 0; ++} ++#endif ++ ++#if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compoare_tf) ++CMPtype ++compare (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ return __fpcmp_parts (&a, &b); ++} ++#endif /* L_compare_sf || L_compare_df */ ++ ++#ifndef US_SOFTWARE_GOFAST ++ ++/* These should be optimized for their specific tasks someday. */ ++ ++#if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf) ++CMPtype ++_eq_f2 (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ if (isnan (&a) || isnan (&b)) ++ return 1; /* false, truth == 0 */ ++ ++ return __fpcmp_parts (&a, &b) ; ++} ++#endif /* L_eq_sf || L_eq_df */ ++ ++#if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf) ++CMPtype ++_ne_f2 (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ if (isnan (&a) || isnan (&b)) ++ return 1; /* true, truth != 0 */ ++ ++ return __fpcmp_parts (&a, &b) ; ++} ++#endif /* L_ne_sf || L_ne_df */ ++ ++#if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf) ++CMPtype ++_gt_f2 (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ if (isnan (&a) || isnan (&b)) ++ return -1; /* false, truth > 0 */ ++ ++ return __fpcmp_parts (&a, &b); ++} ++#endif /* L_gt_sf || L_gt_df */ ++ ++#if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf) ++CMPtype ++_ge_f2 (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ if (isnan (&a) || isnan (&b)) ++ return -1; /* false, truth >= 0 */ ++ return __fpcmp_parts (&a, &b) ; ++} ++#endif /* L_ge_sf || L_ge_df */ ++ ++#if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf) ++CMPtype ++_lt_f2 (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ if (isnan (&a) || isnan (&b)) ++ return 1; /* false, truth < 0 */ ++ ++ return __fpcmp_parts (&a, &b); ++} ++#endif /* L_lt_sf || L_lt_df */ ++ ++#if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf) ++CMPtype ++_le_f2 (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ if (isnan (&a) || isnan (&b)) ++ return 1; /* false, truth <= 0 */ ++ ++ return __fpcmp_parts (&a, &b) ; ++} ++#endif /* L_le_sf || L_le_df */ ++ ++#endif /* ! US_SOFTWARE_GOFAST */ ++ ++#if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf) ++CMPtype ++_unord_f2 (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ return (isnan (&a) || isnan (&b)); ++} ++#endif /* L_unord_sf || L_unord_df */ ++ ++#if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf) ++FLO_type ++si_to_float (SItype arg_a) ++{ ++ fp_number_type in; ++ ++ in.class = CLASS_NUMBER; ++ in.sign = arg_a < 0; ++ if (!arg_a) ++ { ++ in.class = CLASS_ZERO; ++ } ++ else ++ { ++ in.normal_exp = FRACBITS + NGARDS; ++ if (in.sign) ++ { ++ /* Special case for minint, since there is no +ve integer ++ representation for it */ ++ if (arg_a == (- MAX_SI_INT - 1)) ++ { ++ return (FLO_type)(- MAX_SI_INT - 1); ++ } ++ in.fraction.ll = (-arg_a); ++ } ++ else ++ in.fraction.ll = arg_a; ++ ++ while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS))) ++ { ++ in.fraction.ll <<= 1; ++ in.normal_exp -= 1; ++ } ++ } ++ return pack_d (&in); ++} ++#endif /* L_si_to_sf || L_si_to_df */ ++ ++#if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf) ++FLO_type ++usi_to_float (USItype arg_a) ++{ ++ fp_number_type in; ++ ++ in.sign = 0; ++ if (!arg_a) ++ { ++ in.class = CLASS_ZERO; ++ } ++ else ++ { ++ in.class = CLASS_NUMBER; ++ in.normal_exp = FRACBITS + NGARDS; ++ in.fraction.ll = arg_a; ++ ++ while (in.fraction.ll > ((fractype)1 << (FRACBITS + NGARDS))) ++ { ++ in.fraction.ll >>= 1; ++ in.normal_exp += 1; ++ } ++ while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS))) ++ { ++ in.fraction.ll <<= 1; ++ in.normal_exp -= 1; ++ } ++ } ++ return pack_d (&in); ++} ++#endif ++ ++#if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si) ++SItype ++float_to_si (FLO_type arg_a) ++{ ++ fp_number_type a; ++ SItype tmp; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &a); ++ ++ if (iszero (&a)) ++ return 0; ++ if (isnan (&a)) ++ return 0; ++ /* get reasonable MAX_SI_INT... */ ++ if (isinf (&a)) ++ return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT; ++ /* it is a number, but a small one */ ++ if (a.normal_exp < 0) ++ return 0; ++ if (a.normal_exp > BITS_PER_SI - 2) ++ return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT; ++ tmp = a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp); ++ return a.sign ? (-tmp) : (tmp); ++} ++#endif /* L_sf_to_si || L_df_to_si */ ++ ++#if defined(L_sf_to_usi) || defined(L_df_to_usi) || defined(L_tf_to_usi) ++#if defined US_SOFTWARE_GOFAST || defined(L_tf_to_usi) ++/* While libgcc2.c defines its own __fixunssfsi and __fixunsdfsi routines, ++ we also define them for GOFAST because the ones in libgcc2.c have the ++ wrong names and I'd rather define these here and keep GOFAST CYG-LOC's ++ out of libgcc2.c. We can't define these here if not GOFAST because then ++ there'd be duplicate copies. */ ++ ++USItype ++float_to_usi (FLO_type arg_a) ++{ ++ fp_number_type a; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &a); ++ ++ if (iszero (&a)) ++ return 0; ++ if (isnan (&a)) ++ return 0; ++ /* it is a negative number */ ++ if (a.sign) ++ return 0; ++ /* get reasonable MAX_USI_INT... */ ++ if (isinf (&a)) ++ return MAX_USI_INT; ++ /* it is a number, but a small one */ ++ if (a.normal_exp < 0) ++ return 0; ++ if (a.normal_exp > BITS_PER_SI - 1) ++ return MAX_USI_INT; ++ else if (a.normal_exp > (FRACBITS + NGARDS)) ++ return a.fraction.ll << (a.normal_exp - (FRACBITS + NGARDS)); ++ else ++ return a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp); ++} ++#endif /* US_SOFTWARE_GOFAST */ ++#endif /* L_sf_to_usi || L_df_to_usi */ ++ ++#if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf) ++FLO_type ++negate (FLO_type arg_a) ++{ ++ fp_number_type a; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &a); ++ ++ flip_sign (&a); ++ return pack_d (&a); ++} ++#endif /* L_negate_sf || L_negate_df */ ++ ++#ifdef FLOAT ++ ++#if defined(L_make_sf) ++SFtype ++__make_fp(fp_class_type class, ++ unsigned int sign, ++ int exp, ++ USItype frac) ++{ ++ fp_number_type in; ++ ++ in.class = class; ++ in.sign = sign; ++ in.normal_exp = exp; ++ in.fraction.ll = frac; ++ return pack_d (&in); ++} ++#endif /* L_make_sf */ ++ ++#ifndef FLOAT_ONLY ++ ++/* This enables one to build an fp library that supports float but not double. ++ Otherwise, we would get an undefined reference to __make_dp. ++ This is needed for some 8-bit ports that can't handle well values that ++ are 8-bytes in size, so we just don't support double for them at all. */ ++ ++#if defined(L_sf_to_df) ++DFtype ++sf_to_df (SFtype arg_a) ++{ ++ fp_number_type in; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &in); ++ ++ return __make_dp (in.class, in.sign, in.normal_exp, ++ ((UDItype) in.fraction.ll) << F_D_BITOFF); ++} ++#endif /* L_sf_to_df */ ++ ++#if defined(L_sf_to_tf) && defined(TMODES) ++TFtype ++sf_to_tf (SFtype arg_a) ++{ ++ fp_number_type in; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &in); ++ ++ return __make_tp (in.class, in.sign, in.normal_exp, ++ ((UTItype) in.fraction.ll) << F_T_BITOFF); ++} ++#endif /* L_sf_to_df */ ++ ++#endif /* ! FLOAT_ONLY */ ++#endif /* FLOAT */ ++ ++#ifndef FLOAT ++ ++extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype); ++ ++#if defined(L_make_df) ++DFtype ++__make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac) ++{ ++ fp_number_type in; ++ ++ in.class = class; ++ in.sign = sign; ++ in.normal_exp = exp; ++ in.fraction.ll = frac; ++ return pack_d (&in); ++} ++#endif /* L_make_df */ ++ ++#if defined(L_df_to_sf) ++SFtype ++df_to_sf (DFtype arg_a) ++{ ++ fp_number_type in; ++ USItype sffrac; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &in); ++ ++ sffrac = in.fraction.ll >> F_D_BITOFF; ++ ++ /* We set the lowest guard bit in SFFRAC if we discarded any non ++ zero bits. */ ++ if ((in.fraction.ll & (((USItype) 1 << F_D_BITOFF) - 1)) != 0) ++ sffrac |= 1; ++ ++ return __make_fp (in.class, in.sign, in.normal_exp, sffrac); ++} ++#endif /* L_df_to_sf */ ++ ++#if defined(L_df_to_tf) && defined(TMODES) \ ++ && !defined(FLOAT) && !defined(TFLOAT) ++TFtype ++df_to_tf (DFtype arg_a) ++{ ++ fp_number_type in; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &in); ++ ++ return __make_tp (in.class, in.sign, in.normal_exp, ++ ((UTItype) in.fraction.ll) << D_T_BITOFF); ++} ++#endif /* L_sf_to_df */ ++ ++#ifdef TFLOAT ++#if defined(L_make_tf) ++TFtype ++__make_tp(fp_class_type class, ++ unsigned int sign, ++ int exp, ++ UTItype frac) ++{ ++ fp_number_type in; ++ ++ in.class = class; ++ in.sign = sign; ++ in.normal_exp = exp; ++ in.fraction.ll = frac; ++ return pack_d (&in); ++} ++#endif /* L_make_tf */ ++ ++#if defined(L_tf_to_df) ++DFtype ++tf_to_df (TFtype arg_a) ++{ ++ fp_number_type in; ++ UDItype sffrac; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &in); ++ ++ sffrac = in.fraction.ll >> D_T_BITOFF; ++ ++ /* We set the lowest guard bit in SFFRAC if we discarded any non ++ zero bits. */ ++ if ((in.fraction.ll & (((UTItype) 1 << D_T_BITOFF) - 1)) != 0) ++ sffrac |= 1; ++ ++ return __make_dp (in.class, in.sign, in.normal_exp, sffrac); ++} ++#endif /* L_tf_to_df */ ++ ++#if defined(L_tf_to_sf) ++SFtype ++tf_to_sf (TFtype arg_a) ++{ ++ fp_number_type in; ++ USItype sffrac; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &in); ++ ++ sffrac = in.fraction.ll >> F_T_BITOFF; ++ ++ /* We set the lowest guard bit in SFFRAC if we discarded any non ++ zero bits. */ ++ if ((in.fraction.ll & (((UTItype) 1 << F_T_BITOFF) - 1)) != 0) ++ sffrac |= 1; ++ ++ return __make_fp (in.class, in.sign, in.normal_exp, sffrac); ++} ++#endif /* L_tf_to_sf */ ++#endif /* TFLOAT */ ++ ++#endif /* ! FLOAT */ ++#endif /* !EXTENDED_FLOAT_STUBS */ +--- gcc-3.4.3/gcc/config/nios2/nios2-fp-bit.c ++++ gcc-3.4.3-nios2/gcc/config/nios2/nios2-fp-bit.c +@@ -0,0 +1,1652 @@ ++#define FLOAT ++/* This is a software floating point library which can be used ++ for targets without hardware floating point. ++ Copyright (C) 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004 ++ Free Software Foundation, Inc. ++ ++This file is free software; you can redistribute it and/or modify it ++under the terms of the GNU General Public License as published by the ++Free Software Foundation; either version 2, or (at your option) any ++later version. ++ ++In addition to the permissions in the GNU General Public License, the ++Free Software Foundation gives you unlimited permission to link the ++compiled version of this file with other programs, and to distribute ++those programs without any restriction coming from the use of this ++file. (The General Public License restrictions do apply in other ++respects; for example, they cover modification of the file, and ++distribution when not linked into another program.) ++ ++This file 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 ++General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++/* As a special exception, if you link this library with other files, ++ some of which are compiled with GCC, to produce an executable, ++ this library does not by itself cause the resulting executable ++ to be covered by the GNU General Public License. ++ This exception does not however invalidate any other reasons why ++ the executable file might be covered by the GNU General Public License. */ ++ ++/* This implements IEEE 754 format arithmetic, but does not provide a ++ mechanism for setting the rounding mode, or for generating or handling ++ exceptions. ++ ++ The original code by Steve Chamberlain, hacked by Mark Eichin and Jim ++ Wilson, all of Cygnus Support. */ ++ ++/* The intended way to use this file is to make two copies, add `#define FLOAT' ++ to one copy, then compile both copies and add them to libgcc.a. */ ++ ++#include "tconfig.h" ++#include "coretypes.h" ++#include "tm.h" ++#include "config/fp-bit.h" ++ ++/* The following macros can be defined to change the behavior of this file: ++ FLOAT: Implement a `float', aka SFmode, fp library. If this is not ++ defined, then this file implements a `double', aka DFmode, fp library. ++ FLOAT_ONLY: Used with FLOAT, to implement a `float' only library, i.e. ++ don't include float->double conversion which requires the double library. ++ This is useful only for machines which can't support doubles, e.g. some ++ 8-bit processors. ++ CMPtype: Specify the type that floating point compares should return. ++ This defaults to SItype, aka int. ++ US_SOFTWARE_GOFAST: This makes all entry points use the same names as the ++ US Software goFast library. ++ _DEBUG_BITFLOAT: This makes debugging the code a little easier, by adding ++ two integers to the FLO_union_type. ++ NO_DENORMALS: Disable handling of denormals. ++ NO_NANS: Disable nan and infinity handling ++ SMALL_MACHINE: Useful when operations on QIs and HIs are faster ++ than on an SI */ ++ ++/* We don't currently support extended floats (long doubles) on machines ++ without hardware to deal with them. ++ ++ These stubs are just to keep the linker from complaining about unresolved ++ references which can be pulled in from libio & libstdc++, even if the ++ user isn't using long doubles. However, they may generate an unresolved ++ external to abort if abort is not used by the function, and the stubs ++ are referenced from within libc, since libgcc goes before and after the ++ system library. */ ++ ++#ifdef DECLARE_LIBRARY_RENAMES ++ DECLARE_LIBRARY_RENAMES ++#endif ++ ++#ifdef EXTENDED_FLOAT_STUBS ++extern void abort (void); ++void __extendsfxf2 (void) { abort(); } ++void __extenddfxf2 (void) { abort(); } ++void __truncxfdf2 (void) { abort(); } ++void __truncxfsf2 (void) { abort(); } ++void __fixxfsi (void) { abort(); } ++void __floatsixf (void) { abort(); } ++void __addxf3 (void) { abort(); } ++void __subxf3 (void) { abort(); } ++void __mulxf3 (void) { abort(); } ++void __divxf3 (void) { abort(); } ++void __negxf2 (void) { abort(); } ++void __eqxf2 (void) { abort(); } ++void __nexf2 (void) { abort(); } ++void __gtxf2 (void) { abort(); } ++void __gexf2 (void) { abort(); } ++void __lexf2 (void) { abort(); } ++void __ltxf2 (void) { abort(); } ++ ++void __extendsftf2 (void) { abort(); } ++void __extenddftf2 (void) { abort(); } ++void __trunctfdf2 (void) { abort(); } ++void __trunctfsf2 (void) { abort(); } ++void __fixtfsi (void) { abort(); } ++void __floatsitf (void) { abort(); } ++void __addtf3 (void) { abort(); } ++void __subtf3 (void) { abort(); } ++void __multf3 (void) { abort(); } ++void __divtf3 (void) { abort(); } ++void __negtf2 (void) { abort(); } ++void __eqtf2 (void) { abort(); } ++void __netf2 (void) { abort(); } ++void __gttf2 (void) { abort(); } ++void __getf2 (void) { abort(); } ++void __letf2 (void) { abort(); } ++void __lttf2 (void) { abort(); } ++#else /* !EXTENDED_FLOAT_STUBS, rest of file */ ++ ++/* IEEE "special" number predicates */ ++ ++#ifdef NO_NANS ++ ++#define nan() 0 ++#define isnan(x) 0 ++#define isinf(x) 0 ++#else ++ ++#if defined L_thenan_sf ++const fp_number_type __thenan_sf = { CLASS_SNAN, 0, 0, {(fractype) 0} }; ++#elif defined L_thenan_df ++const fp_number_type __thenan_df = { CLASS_SNAN, 0, 0, {(fractype) 0} }; ++#elif defined L_thenan_tf ++const fp_number_type __thenan_tf = { CLASS_SNAN, 0, 0, {(fractype) 0} }; ++#elif defined TFLOAT ++extern const fp_number_type __thenan_tf; ++#elif defined FLOAT ++extern const fp_number_type __thenan_sf; ++#else ++extern const fp_number_type __thenan_df; ++#endif ++ ++INLINE ++static fp_number_type * ++nan (void) ++{ ++ /* Discard the const qualifier... */ ++#ifdef TFLOAT ++ return (fp_number_type *) (& __thenan_tf); ++#elif defined FLOAT ++ return (fp_number_type *) (& __thenan_sf); ++#else ++ return (fp_number_type *) (& __thenan_df); ++#endif ++} ++ ++INLINE ++static int ++isnan ( fp_number_type * x) ++{ ++ return x->class == CLASS_SNAN || x->class == CLASS_QNAN; ++} ++ ++INLINE ++static int ++isinf ( fp_number_type * x) ++{ ++ return x->class == CLASS_INFINITY; ++} ++ ++#endif /* NO_NANS */ ++ ++INLINE ++static int ++iszero ( fp_number_type * x) ++{ ++ return x->class == CLASS_ZERO; ++} ++ ++INLINE ++static void ++flip_sign ( fp_number_type * x) ++{ ++ x->sign = !x->sign; ++} ++ ++extern FLO_type pack_d ( fp_number_type * ); ++ ++#if defined(L_pack_df) || defined(L_pack_sf) || defined(L_pack_tf) ++FLO_type ++pack_d ( fp_number_type * src) ++{ ++ FLO_union_type dst; ++ fractype fraction = src->fraction.ll; /* wasn't unsigned before? */ ++ int sign = src->sign; ++ int exp = 0; ++ ++ if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && (isnan (src) || isinf (src))) ++ { ++ /* We can't represent these values accurately. By using the ++ largest possible magnitude, we guarantee that the conversion ++ of infinity is at least as big as any finite number. */ ++ exp = EXPMAX; ++ fraction = ((fractype) 1 << FRACBITS) - 1; ++ } ++ else if (isnan (src)) ++ { ++ exp = EXPMAX; ++ if (src->class == CLASS_QNAN || 1) ++ { ++#ifdef QUIET_NAN_NEGATED ++ fraction |= QUIET_NAN - 1; ++#else ++ fraction |= QUIET_NAN; ++#endif ++ } ++ } ++ else if (isinf (src)) ++ { ++ exp = EXPMAX; ++ fraction = 0; ++ } ++ else if (iszero (src)) ++ { ++ exp = 0; ++ fraction = 0; ++ } ++ else if (fraction == 0) ++ { ++ exp = 0; ++ } ++ else ++ { ++ if (src->normal_exp < NORMAL_EXPMIN) ++ { ++#ifdef NO_DENORMALS ++ /* Go straight to a zero representation if denormals are not ++ supported. The denormal handling would be harmless but ++ isn't unnecessary. */ ++ exp = 0; ++ fraction = 0; ++#else /* NO_DENORMALS */ ++ /* This number's exponent is too low to fit into the bits ++ available in the number, so we'll store 0 in the exponent and ++ shift the fraction to the right to make up for it. */ ++ ++ int shift = NORMAL_EXPMIN - src->normal_exp; ++ ++ exp = 0; ++ ++ if (shift > FRAC_NBITS - NGARDS) ++ { ++ /* No point shifting, since it's more that 64 out. */ ++ fraction = 0; ++ } ++ else ++ { ++ int lowbit = (fraction & (((fractype)1 << shift) - 1)) ? 1 : 0; ++ fraction = (fraction >> shift) | lowbit; ++ } ++ if ((fraction & GARDMASK) == GARDMSB) ++ { ++ if ((fraction & (1 << NGARDS))) ++ fraction += GARDROUND + 1; ++ } ++ else ++ { ++ /* Add to the guards to round up. */ ++ fraction += GARDROUND; ++ } ++ /* Perhaps the rounding means we now need to change the ++ exponent, because the fraction is no longer denormal. */ ++ if (fraction >= IMPLICIT_1) ++ { ++ exp += 1; ++ } ++ fraction >>= NGARDS; ++#endif /* NO_DENORMALS */ ++ } ++ else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) ++ && src->normal_exp > EXPBIAS) ++ { ++ exp = EXPMAX; ++ fraction = 0; ++ } ++ else ++ { ++ exp = src->normal_exp + EXPBIAS; ++ if (!ROUND_TOWARDS_ZERO) ++ { ++ /* IF the gard bits are the all zero, but the first, then we're ++ half way between two numbers, choose the one which makes the ++ lsb of the answer 0. */ ++ if ((fraction & GARDMASK) == GARDMSB) ++ { ++ if (fraction & (1 << NGARDS)) ++ fraction += GARDROUND + 1; ++ } ++ else ++ { ++ /* Add a one to the guards to round up */ ++ fraction += GARDROUND; ++ } ++ if (fraction >= IMPLICIT_2) ++ { ++ fraction >>= 1; ++ exp += 1; ++ } ++ } ++ fraction >>= NGARDS; ++ ++ if (LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp > EXPMAX) ++ { ++ /* Saturate on overflow. */ ++ exp = EXPMAX; ++ fraction = ((fractype) 1 << FRACBITS) - 1; ++ } ++ } ++ } ++ ++ /* We previously used bitfields to store the number, but this doesn't ++ handle little/big endian systems conveniently, so use shifts and ++ masks */ ++#ifdef FLOAT_BIT_ORDER_MISMATCH ++ dst.bits.fraction = fraction; ++ dst.bits.exp = exp; ++ dst.bits.sign = sign; ++#else ++# if defined TFLOAT && defined HALFFRACBITS ++ { ++ halffractype high, low, unity; ++ int lowsign, lowexp; ++ ++ unity = (halffractype) 1 << HALFFRACBITS; ++ ++ /* Set HIGH to the high double's significand, masking out the implicit 1. ++ Set LOW to the low double's full significand. */ ++ high = (fraction >> (FRACBITS - HALFFRACBITS)) & (unity - 1); ++ low = fraction & (unity * 2 - 1); ++ ++ /* Get the initial sign and exponent of the low double. */ ++ lowexp = exp - HALFFRACBITS - 1; ++ lowsign = sign; ++ ++ /* HIGH should be rounded like a normal double, making |LOW| <= ++ 0.5 ULP of HIGH. Assume round-to-nearest. */ ++ if (exp < EXPMAX) ++ if (low > unity || (low == unity && (high & 1) == 1)) ++ { ++ /* Round HIGH up and adjust LOW to match. */ ++ high++; ++ if (high == unity) ++ { ++ /* May make it infinite, but that's OK. */ ++ high = 0; ++ exp++; ++ } ++ low = unity * 2 - low; ++ lowsign ^= 1; ++ } ++ ++ high |= (halffractype) exp << HALFFRACBITS; ++ high |= (halffractype) sign << (HALFFRACBITS + EXPBITS); ++ ++ if (exp == EXPMAX || exp == 0 || low == 0) ++ low = 0; ++ else ++ { ++ while (lowexp > 0 && low < unity) ++ { ++ low <<= 1; ++ lowexp--; ++ } ++ ++ if (lowexp <= 0) ++ { ++ halffractype roundmsb, round; ++ int shift; ++ ++ shift = 1 - lowexp; ++ roundmsb = (1 << (shift - 1)); ++ round = low & ((roundmsb << 1) - 1); ++ ++ low >>= shift; ++ lowexp = 0; ++ ++ if (round > roundmsb || (round == roundmsb && (low & 1) == 1)) ++ { ++ low++; ++ if (low == unity) ++ /* LOW rounds up to the smallest normal number. */ ++ lowexp++; ++ } ++ } ++ ++ low &= unity - 1; ++ low |= (halffractype) lowexp << HALFFRACBITS; ++ low |= (halffractype) lowsign << (HALFFRACBITS + EXPBITS); ++ } ++ dst.value_raw = ((fractype) high << HALFSHIFT) | low; ++ } ++# else ++ dst.value_raw = fraction & ((((fractype)1) << FRACBITS) - (fractype)1); ++ dst.value_raw |= ((fractype) (exp & ((1 << EXPBITS) - 1))) << FRACBITS; ++ dst.value_raw |= ((fractype) (sign & 1)) << (FRACBITS | EXPBITS); ++# endif ++#endif ++ ++#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT) ++#ifdef TFLOAT ++ { ++ qrtrfractype tmp1 = dst.words[0]; ++ qrtrfractype tmp2 = dst.words[1]; ++ dst.words[0] = dst.words[3]; ++ dst.words[1] = dst.words[2]; ++ dst.words[2] = tmp2; ++ dst.words[3] = tmp1; ++ } ++#else ++ { ++ halffractype tmp = dst.words[0]; ++ dst.words[0] = dst.words[1]; ++ dst.words[1] = tmp; ++ } ++#endif ++#endif ++ ++ return dst.value; ++} ++#endif ++ ++#if defined(L_unpack_df) || defined(L_unpack_sf) || defined(L_unpack_tf) ++void ++unpack_d (FLO_union_type * src, fp_number_type * dst) ++{ ++ /* We previously used bitfields to store the number, but this doesn't ++ handle little/big endian systems conveniently, so use shifts and ++ masks */ ++ fractype fraction; ++ int exp; ++ int sign; ++ ++#if defined(FLOAT_WORD_ORDER_MISMATCH) && !defined(FLOAT) ++ FLO_union_type swapped; ++ ++#ifdef TFLOAT ++ swapped.words[0] = src->words[3]; ++ swapped.words[1] = src->words[2]; ++ swapped.words[2] = src->words[1]; ++ swapped.words[3] = src->words[0]; ++#else ++ swapped.words[0] = src->words[1]; ++ swapped.words[1] = src->words[0]; ++#endif ++ src = &swapped; ++#endif ++ ++#ifdef FLOAT_BIT_ORDER_MISMATCH ++ fraction = src->bits.fraction; ++ exp = src->bits.exp; ++ sign = src->bits.sign; ++#else ++# if defined TFLOAT && defined HALFFRACBITS ++ { ++ halffractype high, low; ++ ++ high = src->value_raw >> HALFSHIFT; ++ low = src->value_raw & (((fractype)1 << HALFSHIFT) - 1); ++ ++ fraction = high & ((((fractype)1) << HALFFRACBITS) - 1); ++ fraction <<= FRACBITS - HALFFRACBITS; ++ exp = ((int)(high >> HALFFRACBITS)) & ((1 << EXPBITS) - 1); ++ sign = ((int)(high >> (((HALFFRACBITS + EXPBITS))))) & 1; ++ ++ if (exp != EXPMAX && exp != 0 && low != 0) ++ { ++ int lowexp = ((int)(low >> HALFFRACBITS)) & ((1 << EXPBITS) - 1); ++ int lowsign = ((int)(low >> (((HALFFRACBITS + EXPBITS))))) & 1; ++ int shift; ++ fractype xlow; ++ ++ xlow = low & ((((fractype)1) << HALFFRACBITS) - 1); ++ if (lowexp) ++ xlow |= (((halffractype)1) << HALFFRACBITS); ++ else ++ lowexp = 1; ++ shift = (FRACBITS - HALFFRACBITS) - (exp - lowexp); ++ if (shift > 0) ++ xlow <<= shift; ++ else if (shift < 0) ++ xlow >>= -shift; ++ if (sign == lowsign) ++ fraction += xlow; ++ else if (fraction >= xlow) ++ fraction -= xlow; ++ else ++ { ++ /* The high part is a power of two but the full number is lower. ++ This code will leave the implicit 1 in FRACTION, but we'd ++ have added that below anyway. */ ++ fraction = (((fractype) 1 << FRACBITS) - xlow) << 1; ++ exp--; ++ } ++ } ++ } ++# else ++ fraction = src->value_raw & ((((fractype)1) << FRACBITS) - 1); ++ exp = ((int)(src->value_raw >> FRACBITS)) & ((1 << EXPBITS) - 1); ++ sign = ((int)(src->value_raw >> (FRACBITS + EXPBITS))) & 1; ++# endif ++#endif ++ ++ dst->sign = sign; ++ if (exp == 0) ++ { ++ /* Hmm. Looks like 0 */ ++ if (fraction == 0 ++#ifdef NO_DENORMALS ++ || 1 ++#endif ++ ) ++ { ++ /* tastes like zero */ ++ dst->class = CLASS_ZERO; ++ } ++ else ++ { ++ /* Zero exponent with nonzero fraction - it's denormalized, ++ so there isn't a leading implicit one - we'll shift it so ++ it gets one. */ ++ dst->normal_exp = exp - EXPBIAS + 1; ++ fraction <<= NGARDS; ++ ++ dst->class = CLASS_NUMBER; ++#if 1 ++ while (fraction < IMPLICIT_1) ++ { ++ fraction <<= 1; ++ dst->normal_exp--; ++ } ++#endif ++ dst->fraction.ll = fraction; ++ } ++ } ++ else if (!LARGEST_EXPONENT_IS_NORMAL (FRAC_NBITS) && exp == EXPMAX) ++ { ++ /* Huge exponent*/ ++ if (fraction == 0) ++ { ++ /* Attached to a zero fraction - means infinity */ ++ dst->class = CLASS_INFINITY; ++ } ++ else ++ { ++ /* Nonzero fraction, means nan */ ++#ifdef QUIET_NAN_NEGATED ++ if ((fraction & QUIET_NAN) == 0) ++#else ++ if (fraction & QUIET_NAN) ++#endif ++ { ++ dst->class = CLASS_QNAN; ++ } ++ else ++ { ++ dst->class = CLASS_SNAN; ++ } ++ /* Keep the fraction part as the nan number */ ++ dst->fraction.ll = fraction; ++ } ++ } ++ else ++ { ++ /* Nothing strange about this number */ ++ dst->normal_exp = exp - EXPBIAS; ++ dst->class = CLASS_NUMBER; ++ dst->fraction.ll = (fraction << NGARDS) | IMPLICIT_1; ++ } ++} ++#endif /* L_unpack_df || L_unpack_sf */ ++ ++#if defined(L_addsub_sf) || defined(L_addsub_df) || defined(L_addsub_tf) ++static fp_number_type * ++_fpadd_parts (fp_number_type * a, ++ fp_number_type * b, ++ fp_number_type * tmp) ++{ ++ intfrac tfraction; ++ ++ /* Put commonly used fields in local variables. */ ++ int a_normal_exp; ++ int b_normal_exp; ++ fractype a_fraction; ++ fractype b_fraction; ++ ++ if (isnan (a)) ++ { ++ return a; ++ } ++ if (isnan (b)) ++ { ++ return b; ++ } ++ if (isinf (a)) ++ { ++ /* Adding infinities with opposite signs yields a NaN. */ ++ if (isinf (b) && a->sign != b->sign) ++ return nan (); ++ return a; ++ } ++ if (isinf (b)) ++ { ++ return b; ++ } ++ if (iszero (b)) ++ { ++ if (iszero (a)) ++ { ++ *tmp = *a; ++ tmp->sign = a->sign & b->sign; ++ return tmp; ++ } ++ return a; ++ } ++ if (iszero (a)) ++ { ++ return b; ++ } ++ ++ /* Got two numbers. shift the smaller and increment the exponent till ++ they're the same */ ++ { ++ int diff; ++ ++ a_normal_exp = a->normal_exp; ++ b_normal_exp = b->normal_exp; ++ a_fraction = a->fraction.ll; ++ b_fraction = b->fraction.ll; ++ ++ diff = a_normal_exp - b_normal_exp; ++ ++ if (diff < 0) ++ diff = -diff; ++ if (diff < FRAC_NBITS) ++ { ++ /* ??? This does shifts one bit at a time. Optimize. */ ++ while (a_normal_exp > b_normal_exp) ++ { ++ b_normal_exp++; ++ LSHIFT (b_fraction); ++ } ++ while (b_normal_exp > a_normal_exp) ++ { ++ a_normal_exp++; ++ LSHIFT (a_fraction); ++ } ++ } ++ else ++ { ++ /* Somethings's up.. choose the biggest */ ++ if (a_normal_exp > b_normal_exp) ++ { ++ b_normal_exp = a_normal_exp; ++ b_fraction = 0; ++ } ++ else ++ { ++ a_normal_exp = b_normal_exp; ++ a_fraction = 0; ++ } ++ } ++ } ++ ++ if (a->sign != b->sign) ++ { ++ if (a->sign) ++ { ++ tfraction = -a_fraction + b_fraction; ++ } ++ else ++ { ++ tfraction = a_fraction - b_fraction; ++ } ++ if (tfraction >= 0) ++ { ++ tmp->sign = 0; ++ tmp->normal_exp = a_normal_exp; ++ tmp->fraction.ll = tfraction; ++ } ++ else ++ { ++ tmp->sign = 1; ++ tmp->normal_exp = a_normal_exp; ++ tmp->fraction.ll = -tfraction; ++ } ++ /* and renormalize it */ ++ ++ while (tmp->fraction.ll < IMPLICIT_1 && tmp->fraction.ll) ++ { ++ tmp->fraction.ll <<= 1; ++ tmp->normal_exp--; ++ } ++ } ++ else ++ { ++ tmp->sign = a->sign; ++ tmp->normal_exp = a_normal_exp; ++ tmp->fraction.ll = a_fraction + b_fraction; ++ } ++ tmp->class = CLASS_NUMBER; ++ /* Now the fraction is added, we have to shift down to renormalize the ++ number */ ++ ++ if (tmp->fraction.ll >= IMPLICIT_2) ++ { ++ LSHIFT (tmp->fraction.ll); ++ tmp->normal_exp++; ++ } ++ return tmp; ++ ++} ++ ++FLO_type ++add (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ fp_number_type tmp; ++ fp_number_type *res; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ res = _fpadd_parts (&a, &b, &tmp); ++ ++ return pack_d (res); ++} ++ ++FLO_type ++sub (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ fp_number_type tmp; ++ fp_number_type *res; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ b.sign ^= 1; ++ ++ res = _fpadd_parts (&a, &b, &tmp); ++ ++ return pack_d (res); ++} ++#endif /* L_addsub_sf || L_addsub_df */ ++ ++#if defined(L_mul_sf) || defined(L_mul_df) || defined(L_mul_tf) ++static inline __attribute__ ((__always_inline__)) fp_number_type * ++_fpmul_parts ( fp_number_type * a, ++ fp_number_type * b, ++ fp_number_type * tmp) ++{ ++ fractype low = 0; ++ fractype high = 0; ++ ++ if (isnan (a)) ++ { ++ a->sign = a->sign != b->sign; ++ return a; ++ } ++ if (isnan (b)) ++ { ++ b->sign = a->sign != b->sign; ++ return b; ++ } ++ if (isinf (a)) ++ { ++ if (iszero (b)) ++ return nan (); ++ a->sign = a->sign != b->sign; ++ return a; ++ } ++ if (isinf (b)) ++ { ++ if (iszero (a)) ++ { ++ return nan (); ++ } ++ b->sign = a->sign != b->sign; ++ return b; ++ } ++ if (iszero (a)) ++ { ++ a->sign = a->sign != b->sign; ++ return a; ++ } ++ if (iszero (b)) ++ { ++ b->sign = a->sign != b->sign; ++ return b; ++ } ++ ++ /* Calculate the mantissa by multiplying both numbers to get a ++ twice-as-wide number. */ ++ { ++#if defined(NO_DI_MODE) || defined(TFLOAT) ++ { ++ fractype x = a->fraction.ll; ++ fractype ylow = b->fraction.ll; ++ fractype yhigh = 0; ++ int bit; ++ ++ /* ??? This does multiplies one bit at a time. Optimize. */ ++ for (bit = 0; bit < FRAC_NBITS; bit++) ++ { ++ int carry; ++ ++ if (x & 1) ++ { ++ carry = (low += ylow) < ylow; ++ high += yhigh + carry; ++ } ++ yhigh <<= 1; ++ if (ylow & FRACHIGH) ++ { ++ yhigh |= 1; ++ } ++ ylow <<= 1; ++ x >>= 1; ++ } ++ } ++#elif defined(FLOAT) ++ /* Multiplying two USIs to get a UDI, we're safe. */ ++ { ++ UDItype answer = (UDItype)a->fraction.ll * (UDItype)b->fraction.ll; ++ ++ high = answer >> BITS_PER_SI; ++ low = answer; ++ } ++#else ++ /* fractype is DImode, but we need the result to be twice as wide. ++ Assuming a widening multiply from DImode to TImode is not ++ available, build one by hand. */ ++ { ++ USItype nl = a->fraction.ll; ++ USItype nh = a->fraction.ll >> BITS_PER_SI; ++ USItype ml = b->fraction.ll; ++ USItype mh = b->fraction.ll >> BITS_PER_SI; ++ UDItype pp_ll = (UDItype) ml * nl; ++ UDItype pp_hl = (UDItype) mh * nl; ++ UDItype pp_lh = (UDItype) ml * nh; ++ UDItype pp_hh = (UDItype) mh * nh; ++ UDItype res2 = 0; ++ UDItype res0 = 0; ++ UDItype ps_hh__ = pp_hl + pp_lh; ++ if (ps_hh__ < pp_hl) ++ res2 += (UDItype)1 << BITS_PER_SI; ++ pp_hl = (UDItype)(USItype)ps_hh__ << BITS_PER_SI; ++ res0 = pp_ll + pp_hl; ++ if (res0 < pp_ll) ++ res2++; ++ res2 += (ps_hh__ >> BITS_PER_SI) + pp_hh; ++ high = res2; ++ low = res0; ++ } ++#endif ++ } ++ ++ tmp->normal_exp = a->normal_exp + b->normal_exp ++ + FRAC_NBITS - (FRACBITS + NGARDS); ++ tmp->sign = a->sign != b->sign; ++ while (high >= IMPLICIT_2) ++ { ++ tmp->normal_exp++; ++ if (high & 1) ++ { ++ low >>= 1; ++ low |= FRACHIGH; ++ } ++ high >>= 1; ++ } ++ while (high < IMPLICIT_1) ++ { ++ tmp->normal_exp--; ++ ++ high <<= 1; ++ if (low & FRACHIGH) ++ high |= 1; ++ low <<= 1; ++ } ++ /* rounding is tricky. if we only round if it won't make us round later. */ ++#if 0 ++ if (low & FRACHIGH2) ++ { ++ if (((high & GARDMASK) != GARDMSB) ++ && (((high + 1) & GARDMASK) == GARDMSB)) ++ { ++ /* don't round, it gets done again later. */ ++ } ++ else ++ { ++ high++; ++ } ++ } ++#endif ++ if (!ROUND_TOWARDS_ZERO && (high & GARDMASK) == GARDMSB) ++ { ++ if (high & (1 << NGARDS)) ++ { ++ /* half way, so round to even */ ++ high += GARDROUND + 1; ++ } ++ else if (low) ++ { ++ /* but we really weren't half way */ ++ high += GARDROUND + 1; ++ } ++ } ++ tmp->fraction.ll = high; ++ tmp->class = CLASS_NUMBER; ++ return tmp; ++} ++ ++FLO_type ++multiply (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ fp_number_type tmp; ++ fp_number_type *res; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ res = _fpmul_parts (&a, &b, &tmp); ++ ++ return pack_d (res); ++} ++#endif /* L_mul_sf || L_mul_df */ ++ ++#if defined(L_div_sf) || defined(L_div_df) || defined(L_div_tf) ++static inline __attribute__ ((__always_inline__)) fp_number_type * ++_fpdiv_parts (fp_number_type * a, ++ fp_number_type * b) ++{ ++ fractype bit; ++ fractype numerator; ++ fractype denominator; ++ fractype quotient; ++ ++ if (isnan (a)) ++ { ++ return a; ++ } ++ if (isnan (b)) ++ { ++ return b; ++ } ++ ++ a->sign = a->sign ^ b->sign; ++ ++ if (isinf (a) || iszero (a)) ++ { ++ if (a->class == b->class) ++ return nan (); ++ return a; ++ } ++ ++ if (isinf (b)) ++ { ++ a->fraction.ll = 0; ++ a->normal_exp = 0; ++ return a; ++ } ++ if (iszero (b)) ++ { ++ a->class = CLASS_INFINITY; ++ return a; ++ } ++ ++ /* Calculate the mantissa by multiplying both 64bit numbers to get a ++ 128 bit number */ ++ { ++ /* quotient = ++ ( numerator / denominator) * 2^(numerator exponent - denominator exponent) ++ */ ++ ++ a->normal_exp = a->normal_exp - b->normal_exp; ++ numerator = a->fraction.ll; ++ denominator = b->fraction.ll; ++ ++ if (numerator < denominator) ++ { ++ /* Fraction will be less than 1.0 */ ++ numerator *= 2; ++ a->normal_exp--; ++ } ++ bit = IMPLICIT_1; ++ quotient = 0; ++ /* ??? Does divide one bit at a time. Optimize. */ ++ while (bit) ++ { ++ if (numerator >= denominator) ++ { ++ quotient |= bit; ++ numerator -= denominator; ++ } ++ bit >>= 1; ++ numerator *= 2; ++ } ++ ++ if (!ROUND_TOWARDS_ZERO && (quotient & GARDMASK) == GARDMSB) ++ { ++ if (quotient & (1 << NGARDS)) ++ { ++ /* half way, so round to even */ ++ quotient += GARDROUND + 1; ++ } ++ else if (numerator) ++ { ++ /* but we really weren't half way, more bits exist */ ++ quotient += GARDROUND + 1; ++ } ++ } ++ ++ a->fraction.ll = quotient; ++ return (a); ++ } ++} ++ ++FLO_type ++divide (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ fp_number_type *res; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ res = _fpdiv_parts (&a, &b); ++ ++ return pack_d (res); ++} ++#endif /* L_div_sf || L_div_df */ ++ ++#if defined(L_fpcmp_parts_sf) || defined(L_fpcmp_parts_df) \ ++ || defined(L_fpcmp_parts_tf) ++/* according to the demo, fpcmp returns a comparison with 0... thus ++ a<b -> -1 ++ a==b -> 0 ++ a>b -> +1 ++ */ ++ ++int ++__fpcmp_parts (fp_number_type * a, fp_number_type * b) ++{ ++#if 0 ++ /* either nan -> unordered. Must be checked outside of this routine. */ ++ if (isnan (a) && isnan (b)) ++ { ++ return 1; /* still unordered! */ ++ } ++#endif ++ ++ if (isnan (a) || isnan (b)) ++ { ++ return 1; /* how to indicate unordered compare? */ ++ } ++ if (isinf (a) && isinf (b)) ++ { ++ /* +inf > -inf, but +inf != +inf */ ++ /* b \a| +inf(0)| -inf(1) ++ ______\+--------+-------- ++ +inf(0)| a==b(0)| a<b(-1) ++ -------+--------+-------- ++ -inf(1)| a>b(1) | a==b(0) ++ -------+--------+-------- ++ So since unordered must be nonzero, just line up the columns... ++ */ ++ return b->sign - a->sign; ++ } ++ /* but not both... */ ++ if (isinf (a)) ++ { ++ return a->sign ? -1 : 1; ++ } ++ if (isinf (b)) ++ { ++ return b->sign ? 1 : -1; ++ } ++ if (iszero (a) && iszero (b)) ++ { ++ return 0; ++ } ++ if (iszero (a)) ++ { ++ return b->sign ? 1 : -1; ++ } ++ if (iszero (b)) ++ { ++ return a->sign ? -1 : 1; ++ } ++ /* now both are "normal". */ ++ if (a->sign != b->sign) ++ { ++ /* opposite signs */ ++ return a->sign ? -1 : 1; ++ } ++ /* same sign; exponents? */ ++ if (a->normal_exp > b->normal_exp) ++ { ++ return a->sign ? -1 : 1; ++ } ++ if (a->normal_exp < b->normal_exp) ++ { ++ return a->sign ? 1 : -1; ++ } ++ /* same exponents; check size. */ ++ if (a->fraction.ll > b->fraction.ll) ++ { ++ return a->sign ? -1 : 1; ++ } ++ if (a->fraction.ll < b->fraction.ll) ++ { ++ return a->sign ? 1 : -1; ++ } ++ /* after all that, they're equal. */ ++ return 0; ++} ++#endif ++ ++#if defined(L_compare_sf) || defined(L_compare_df) || defined(L_compoare_tf) ++CMPtype ++compare (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ return __fpcmp_parts (&a, &b); ++} ++#endif /* L_compare_sf || L_compare_df */ ++ ++#ifndef US_SOFTWARE_GOFAST ++ ++/* These should be optimized for their specific tasks someday. */ ++ ++#if defined(L_eq_sf) || defined(L_eq_df) || defined(L_eq_tf) ++CMPtype ++_eq_f2 (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ if (isnan (&a) || isnan (&b)) ++ return 1; /* false, truth == 0 */ ++ ++ return __fpcmp_parts (&a, &b) ; ++} ++#endif /* L_eq_sf || L_eq_df */ ++ ++#if defined(L_ne_sf) || defined(L_ne_df) || defined(L_ne_tf) ++CMPtype ++_ne_f2 (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ if (isnan (&a) || isnan (&b)) ++ return 1; /* true, truth != 0 */ ++ ++ return __fpcmp_parts (&a, &b) ; ++} ++#endif /* L_ne_sf || L_ne_df */ ++ ++#if defined(L_gt_sf) || defined(L_gt_df) || defined(L_gt_tf) ++CMPtype ++_gt_f2 (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ if (isnan (&a) || isnan (&b)) ++ return -1; /* false, truth > 0 */ ++ ++ return __fpcmp_parts (&a, &b); ++} ++#endif /* L_gt_sf || L_gt_df */ ++ ++#if defined(L_ge_sf) || defined(L_ge_df) || defined(L_ge_tf) ++CMPtype ++_ge_f2 (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ if (isnan (&a) || isnan (&b)) ++ return -1; /* false, truth >= 0 */ ++ return __fpcmp_parts (&a, &b) ; ++} ++#endif /* L_ge_sf || L_ge_df */ ++ ++#if defined(L_lt_sf) || defined(L_lt_df) || defined(L_lt_tf) ++CMPtype ++_lt_f2 (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ if (isnan (&a) || isnan (&b)) ++ return 1; /* false, truth < 0 */ ++ ++ return __fpcmp_parts (&a, &b); ++} ++#endif /* L_lt_sf || L_lt_df */ ++ ++#if defined(L_le_sf) || defined(L_le_df) || defined(L_le_tf) ++CMPtype ++_le_f2 (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ if (isnan (&a) || isnan (&b)) ++ return 1; /* false, truth <= 0 */ ++ ++ return __fpcmp_parts (&a, &b) ; ++} ++#endif /* L_le_sf || L_le_df */ ++ ++#endif /* ! US_SOFTWARE_GOFAST */ ++ ++#if defined(L_unord_sf) || defined(L_unord_df) || defined(L_unord_tf) ++CMPtype ++_unord_f2 (FLO_type arg_a, FLO_type arg_b) ++{ ++ fp_number_type a; ++ fp_number_type b; ++ FLO_union_type au, bu; ++ ++ au.value = arg_a; ++ bu.value = arg_b; ++ ++ unpack_d (&au, &a); ++ unpack_d (&bu, &b); ++ ++ return (isnan (&a) || isnan (&b)); ++} ++#endif /* L_unord_sf || L_unord_df */ ++ ++#if defined(L_si_to_sf) || defined(L_si_to_df) || defined(L_si_to_tf) ++FLO_type ++si_to_float (SItype arg_a) ++{ ++ fp_number_type in; ++ ++ in.class = CLASS_NUMBER; ++ in.sign = arg_a < 0; ++ if (!arg_a) ++ { ++ in.class = CLASS_ZERO; ++ } ++ else ++ { ++ in.normal_exp = FRACBITS + NGARDS; ++ if (in.sign) ++ { ++ /* Special case for minint, since there is no +ve integer ++ representation for it */ ++ if (arg_a == (- MAX_SI_INT - 1)) ++ { ++ return (FLO_type)(- MAX_SI_INT - 1); ++ } ++ in.fraction.ll = (-arg_a); ++ } ++ else ++ in.fraction.ll = arg_a; ++ ++ while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS))) ++ { ++ in.fraction.ll <<= 1; ++ in.normal_exp -= 1; ++ } ++ } ++ return pack_d (&in); ++} ++#endif /* L_si_to_sf || L_si_to_df */ ++ ++#if defined(L_usi_to_sf) || defined(L_usi_to_df) || defined(L_usi_to_tf) ++FLO_type ++usi_to_float (USItype arg_a) ++{ ++ fp_number_type in; ++ ++ in.sign = 0; ++ if (!arg_a) ++ { ++ in.class = CLASS_ZERO; ++ } ++ else ++ { ++ in.class = CLASS_NUMBER; ++ in.normal_exp = FRACBITS + NGARDS; ++ in.fraction.ll = arg_a; ++ ++ while (in.fraction.ll > ((fractype)1 << (FRACBITS + NGARDS))) ++ { ++ in.fraction.ll >>= 1; ++ in.normal_exp += 1; ++ } ++ while (in.fraction.ll < ((fractype)1 << (FRACBITS + NGARDS))) ++ { ++ in.fraction.ll <<= 1; ++ in.normal_exp -= 1; ++ } ++ } ++ return pack_d (&in); ++} ++#endif ++ ++#if defined(L_sf_to_si) || defined(L_df_to_si) || defined(L_tf_to_si) ++SItype ++float_to_si (FLO_type arg_a) ++{ ++ fp_number_type a; ++ SItype tmp; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &a); ++ ++ if (iszero (&a)) ++ return 0; ++ if (isnan (&a)) ++ return 0; ++ /* get reasonable MAX_SI_INT... */ ++ if (isinf (&a)) ++ return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT; ++ /* it is a number, but a small one */ ++ if (a.normal_exp < 0) ++ return 0; ++ if (a.normal_exp > BITS_PER_SI - 2) ++ return a.sign ? (-MAX_SI_INT)-1 : MAX_SI_INT; ++ tmp = a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp); ++ return a.sign ? (-tmp) : (tmp); ++} ++#endif /* L_sf_to_si || L_df_to_si */ ++ ++#if defined(L_sf_to_usi) || defined(L_df_to_usi) || defined(L_tf_to_usi) ++#if defined US_SOFTWARE_GOFAST || defined(L_tf_to_usi) ++/* While libgcc2.c defines its own __fixunssfsi and __fixunsdfsi routines, ++ we also define them for GOFAST because the ones in libgcc2.c have the ++ wrong names and I'd rather define these here and keep GOFAST CYG-LOC's ++ out of libgcc2.c. We can't define these here if not GOFAST because then ++ there'd be duplicate copies. */ ++ ++USItype ++float_to_usi (FLO_type arg_a) ++{ ++ fp_number_type a; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &a); ++ ++ if (iszero (&a)) ++ return 0; ++ if (isnan (&a)) ++ return 0; ++ /* it is a negative number */ ++ if (a.sign) ++ return 0; ++ /* get reasonable MAX_USI_INT... */ ++ if (isinf (&a)) ++ return MAX_USI_INT; ++ /* it is a number, but a small one */ ++ if (a.normal_exp < 0) ++ return 0; ++ if (a.normal_exp > BITS_PER_SI - 1) ++ return MAX_USI_INT; ++ else if (a.normal_exp > (FRACBITS + NGARDS)) ++ return a.fraction.ll << (a.normal_exp - (FRACBITS + NGARDS)); ++ else ++ return a.fraction.ll >> ((FRACBITS + NGARDS) - a.normal_exp); ++} ++#endif /* US_SOFTWARE_GOFAST */ ++#endif /* L_sf_to_usi || L_df_to_usi */ ++ ++#if defined(L_negate_sf) || defined(L_negate_df) || defined(L_negate_tf) ++FLO_type ++negate (FLO_type arg_a) ++{ ++ fp_number_type a; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &a); ++ ++ flip_sign (&a); ++ return pack_d (&a); ++} ++#endif /* L_negate_sf || L_negate_df */ ++ ++#ifdef FLOAT ++ ++#if defined(L_make_sf) ++SFtype ++__make_fp(fp_class_type class, ++ unsigned int sign, ++ int exp, ++ USItype frac) ++{ ++ fp_number_type in; ++ ++ in.class = class; ++ in.sign = sign; ++ in.normal_exp = exp; ++ in.fraction.ll = frac; ++ return pack_d (&in); ++} ++#endif /* L_make_sf */ ++ ++#ifndef FLOAT_ONLY ++ ++/* This enables one to build an fp library that supports float but not double. ++ Otherwise, we would get an undefined reference to __make_dp. ++ This is needed for some 8-bit ports that can't handle well values that ++ are 8-bytes in size, so we just don't support double for them at all. */ ++ ++#if defined(L_sf_to_df) ++DFtype ++sf_to_df (SFtype arg_a) ++{ ++ fp_number_type in; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &in); ++ ++ return __make_dp (in.class, in.sign, in.normal_exp, ++ ((UDItype) in.fraction.ll) << F_D_BITOFF); ++} ++#endif /* L_sf_to_df */ ++ ++#if defined(L_sf_to_tf) && defined(TMODES) ++TFtype ++sf_to_tf (SFtype arg_a) ++{ ++ fp_number_type in; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &in); ++ ++ return __make_tp (in.class, in.sign, in.normal_exp, ++ ((UTItype) in.fraction.ll) << F_T_BITOFF); ++} ++#endif /* L_sf_to_df */ ++ ++#endif /* ! FLOAT_ONLY */ ++#endif /* FLOAT */ ++ ++#ifndef FLOAT ++ ++extern SFtype __make_fp (fp_class_type, unsigned int, int, USItype); ++ ++#if defined(L_make_df) ++DFtype ++__make_dp (fp_class_type class, unsigned int sign, int exp, UDItype frac) ++{ ++ fp_number_type in; ++ ++ in.class = class; ++ in.sign = sign; ++ in.normal_exp = exp; ++ in.fraction.ll = frac; ++ return pack_d (&in); ++} ++#endif /* L_make_df */ ++ ++#if defined(L_df_to_sf) ++SFtype ++df_to_sf (DFtype arg_a) ++{ ++ fp_number_type in; ++ USItype sffrac; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &in); ++ ++ sffrac = in.fraction.ll >> F_D_BITOFF; ++ ++ /* We set the lowest guard bit in SFFRAC if we discarded any non ++ zero bits. */ ++ if ((in.fraction.ll & (((USItype) 1 << F_D_BITOFF) - 1)) != 0) ++ sffrac |= 1; ++ ++ return __make_fp (in.class, in.sign, in.normal_exp, sffrac); ++} ++#endif /* L_df_to_sf */ ++ ++#if defined(L_df_to_tf) && defined(TMODES) \ ++ && !defined(FLOAT) && !defined(TFLOAT) ++TFtype ++df_to_tf (DFtype arg_a) ++{ ++ fp_number_type in; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &in); ++ ++ return __make_tp (in.class, in.sign, in.normal_exp, ++ ((UTItype) in.fraction.ll) << D_T_BITOFF); ++} ++#endif /* L_sf_to_df */ ++ ++#ifdef TFLOAT ++#if defined(L_make_tf) ++TFtype ++__make_tp(fp_class_type class, ++ unsigned int sign, ++ int exp, ++ UTItype frac) ++{ ++ fp_number_type in; ++ ++ in.class = class; ++ in.sign = sign; ++ in.normal_exp = exp; ++ in.fraction.ll = frac; ++ return pack_d (&in); ++} ++#endif /* L_make_tf */ ++ ++#if defined(L_tf_to_df) ++DFtype ++tf_to_df (TFtype arg_a) ++{ ++ fp_number_type in; ++ UDItype sffrac; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &in); ++ ++ sffrac = in.fraction.ll >> D_T_BITOFF; ++ ++ /* We set the lowest guard bit in SFFRAC if we discarded any non ++ zero bits. */ ++ if ((in.fraction.ll & (((UTItype) 1 << D_T_BITOFF) - 1)) != 0) ++ sffrac |= 1; ++ ++ return __make_dp (in.class, in.sign, in.normal_exp, sffrac); ++} ++#endif /* L_tf_to_df */ ++ ++#if defined(L_tf_to_sf) ++SFtype ++tf_to_sf (TFtype arg_a) ++{ ++ fp_number_type in; ++ USItype sffrac; ++ FLO_union_type au; ++ ++ au.value = arg_a; ++ unpack_d (&au, &in); ++ ++ sffrac = in.fraction.ll >> F_T_BITOFF; ++ ++ /* We set the lowest guard bit in SFFRAC if we discarded any non ++ zero bits. */ ++ if ((in.fraction.ll & (((UTItype) 1 << F_T_BITOFF) - 1)) != 0) ++ sffrac |= 1; ++ ++ return __make_fp (in.class, in.sign, in.normal_exp, sffrac); ++} ++#endif /* L_tf_to_sf */ ++#endif /* TFLOAT */ ++ ++#endif /* ! FLOAT */ ++#endif /* !EXTENDED_FLOAT_STUBS */ +--- gcc-3.4.3/gcc/config/nios2/nios2-protos.h ++++ gcc-3.4.3-nios2/gcc/config/nios2/nios2-protos.h +@@ -0,0 +1,70 @@ ++/* Subroutines for assembler code output for Altera NIOS 2G NIOS2 version. ++ Copyright (C) 2003 Altera ++ Contributed by Jonah Graham (jgraham@altera.com). ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU CC 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 General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++extern void dump_frame_size (FILE *); ++extern HOST_WIDE_INT compute_frame_size (void); ++extern int nios2_initial_elimination_offset (int, int); ++extern void override_options (void); ++extern void optimization_options (int, int); ++extern int nios2_can_use_return_insn (void); ++extern void expand_prologue (void); ++extern void expand_epilogue (bool); ++extern void function_profiler (FILE *, int); ++ ++ ++#ifdef RTX_CODE ++extern int nios2_legitimate_address (rtx, enum machine_mode, int); ++extern void nios2_print_operand (FILE *, rtx, int); ++extern void nios2_print_operand_address (FILE *, rtx); ++ ++extern int nios2_emit_move_sequence (rtx *, enum machine_mode); ++extern int nios2_emit_expensive_div (rtx *, enum machine_mode); ++ ++extern void gen_int_relational (enum rtx_code, rtx, rtx, rtx, rtx); ++extern void gen_conditional_move (rtx *, enum machine_mode); ++extern const char *asm_output_opcode (FILE *, const char *); ++ ++/* predicates */ ++extern int arith_operand (rtx, enum machine_mode); ++extern int uns_arith_operand (rtx, enum machine_mode); ++extern int logical_operand (rtx, enum machine_mode); ++extern int shift_operand (rtx, enum machine_mode); ++extern int reg_or_0_operand (rtx, enum machine_mode); ++extern int equality_op (rtx, enum machine_mode); ++extern int custom_insn_opcode (rtx, enum machine_mode); ++extern int rdwrctl_operand (rtx, enum machine_mode); ++ ++# ifdef HAVE_MACHINE_MODES ++# if defined TREE_CODE ++extern void function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode, tree, int); ++extern rtx function_arg (const CUMULATIVE_ARGS *, enum machine_mode, tree, int); ++extern int function_arg_partial_nregs (const CUMULATIVE_ARGS *, enum machine_mode, tree, int); ++extern void init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree, int); ++extern int nios2_setup_incoming_varargs (const CUMULATIVE_ARGS *, enum machine_mode, tree, int); ++ ++# endif /* TREE_CODE */ ++# endif /* HAVE_MACHINE_MODES */ ++#endif ++ ++#ifdef TREE_CODE ++extern int nios2_return_in_memory (tree); ++ ++#endif /* TREE_CODE */ +--- gcc-3.4.3/gcc/config/nios2/nios2.c ++++ gcc-3.4.3-nios2/gcc/config/nios2/nios2.c +@@ -0,0 +1,2853 @@ ++/* Subroutines for assembler code output for Altera NIOS 2G NIOS2 version. ++ Copyright (C) 2003 Altera ++ Contributed by Jonah Graham (jgraham@altera.com). ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU CC 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 General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++ ++#include <stdio.h> ++#include "config.h" ++#include "system.h" ++#include "coretypes.h" ++#include "tm.h" ++#include "rtl.h" ++#include "tree.h" ++#include "tm_p.h" ++#include "regs.h" ++#include "hard-reg-set.h" ++#include "real.h" ++#include "insn-config.h" ++#include "conditions.h" ++#include "output.h" ++#include "insn-attr.h" ++#include "flags.h" ++#include "recog.h" ++#include "expr.h" ++#include "toplev.h" ++#include "basic-block.h" ++#include "function.h" ++#include "ggc.h" ++#include "reload.h" ++#include "debug.h" ++#include "optabs.h" ++#include "target.h" ++#include "target-def.h" ++ ++/* local prototypes */ ++static bool nios2_rtx_costs (rtx, int, int, int *); ++ ++static void nios2_asm_function_prologue (FILE *, HOST_WIDE_INT); ++static int nios2_use_dfa_pipeline_interface (void); ++static int nios2_issue_rate (void); ++static struct machine_function *nios2_init_machine_status (void); ++static bool nios2_in_small_data_p (tree); ++static rtx save_reg (int, HOST_WIDE_INT, rtx); ++static rtx restore_reg (int, HOST_WIDE_INT); ++static unsigned int nios2_section_type_flags (tree, const char *, int); ++static void nios2_init_builtins (void); ++static rtx nios2_expand_builtin (tree, rtx, rtx, enum machine_mode, int); ++static bool nios2_function_ok_for_sibcall (tree, tree); ++static void nios2_encode_section_info (tree, rtx, int); ++ ++/* Initialize the GCC target structure. */ ++#undef TARGET_ASM_FUNCTION_PROLOGUE ++#define TARGET_ASM_FUNCTION_PROLOGUE nios2_asm_function_prologue ++ ++#undef TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE ++#define TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE \ ++ nios2_use_dfa_pipeline_interface ++#undef TARGET_SCHED_ISSUE_RATE ++#define TARGET_SCHED_ISSUE_RATE nios2_issue_rate ++#undef TARGET_IN_SMALL_DATA_P ++#define TARGET_IN_SMALL_DATA_P nios2_in_small_data_p ++#undef TARGET_ENCODE_SECTION_INFO ++#define TARGET_ENCODE_SECTION_INFO nios2_encode_section_info ++#undef TARGET_SECTION_TYPE_FLAGS ++#define TARGET_SECTION_TYPE_FLAGS nios2_section_type_flags ++ ++#undef TARGET_INIT_BUILTINS ++#define TARGET_INIT_BUILTINS nios2_init_builtins ++#undef TARGET_EXPAND_BUILTIN ++#define TARGET_EXPAND_BUILTIN nios2_expand_builtin ++ ++#undef TARGET_FUNCTION_OK_FOR_SIBCALL ++#define TARGET_FUNCTION_OK_FOR_SIBCALL nios2_function_ok_for_sibcall ++ ++#undef TARGET_RTX_COSTS ++#define TARGET_RTX_COSTS nios2_rtx_costs ++ ++ ++struct gcc_target targetm = TARGET_INITIALIZER; ++ ++ ++ ++/* Threshold for data being put into the small data/bss area, instead ++ of the normal data area (references to the small data/bss area take ++ 1 instruction, and use the global pointer, references to the normal ++ data area takes 2 instructions). */ ++unsigned HOST_WIDE_INT nios2_section_threshold = NIOS2_DEFAULT_GVALUE; ++ ++ ++/* Structure to be filled in by compute_frame_size with register ++ save masks, and offsets for the current function. */ ++ ++struct nios2_frame_info ++GTY (()) ++{ ++ long total_size; /* # bytes that the entire frame takes up */ ++ long var_size; /* # bytes that variables take up */ ++ long args_size; /* # bytes that outgoing arguments take up */ ++ int save_reg_size; /* # bytes needed to store gp regs */ ++ int save_reg_rounded; /* # bytes needed to store gp regs */ ++ long save_regs_offset; /* offset from new sp to store gp registers */ ++ int initialized; /* != 0 if frame size already calculated */ ++ int num_regs; /* number of gp registers saved */ ++}; ++ ++struct machine_function ++GTY (()) ++{ ++ ++ /* Current frame information, calculated by compute_frame_size. */ ++ struct nios2_frame_info frame; ++}; ++ ++ ++/*************************************** ++ * Section encodings ++ ***************************************/ ++ ++ ++ ++ ++ ++/*************************************** ++ * Stack Layout and Calling Conventions ++ ***************************************/ ++ ++ ++#define TOO_BIG_OFFSET(X) ((X) > ((1 << 15) - 1)) ++#define TEMP_REG_NUM 8 ++ ++static void ++nios2_asm_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED) ++{ ++ if (flag_verbose_asm || flag_debug_asm) ++ { ++ compute_frame_size (); ++ dump_frame_size (file); ++ } ++} ++ ++static rtx ++save_reg (int regno, HOST_WIDE_INT offset, rtx cfa_store_reg) ++{ ++ rtx insn, stack_slot; ++ ++ stack_slot = gen_rtx_PLUS (SImode, ++ cfa_store_reg, ++ GEN_INT (offset)); ++ ++ insn = emit_insn (gen_rtx_SET (SImode, ++ gen_rtx_MEM (SImode, stack_slot), ++ gen_rtx_REG (SImode, regno))); ++ ++ RTX_FRAME_RELATED_P (insn) = 1; ++ ++ return insn; ++} ++ ++static rtx ++restore_reg (int regno, HOST_WIDE_INT offset) ++{ ++ rtx insn, stack_slot; ++ ++ if (TOO_BIG_OFFSET (offset)) ++ { ++ stack_slot = gen_rtx_REG (SImode, TEMP_REG_NUM); ++ insn = emit_insn (gen_rtx_SET (SImode, ++ stack_slot, ++ GEN_INT (offset))); ++ ++ insn = emit_insn (gen_rtx_SET (SImode, ++ stack_slot, ++ gen_rtx_PLUS (SImode, ++ stack_slot, ++ stack_pointer_rtx))); ++ } ++ else ++ { ++ stack_slot = gen_rtx_PLUS (SImode, ++ stack_pointer_rtx, ++ GEN_INT (offset)); ++ } ++ ++ stack_slot = gen_rtx_MEM (SImode, stack_slot); ++ ++ insn = emit_move_insn (gen_rtx_REG (SImode, regno), stack_slot); ++ ++ return insn; ++} ++ ++ ++/* There are two possible paths for prologue expansion, ++- the first is if the total frame size is < 2^15-1. In that ++case all the immediates will fit into the 16-bit immediate ++fields. ++- the second is when the frame size is too big, in that ++case an additional temporary register is used, first ++as a cfa_temp to offset the sp, second as the cfa_store ++register. ++ ++See the comment above dwarf2out_frame_debug_expr in ++dwarf2out.c for more explanation of the "rules." ++ ++ ++Case 1: ++Rule # Example Insn Effect ++2 addi sp, sp, -total_frame_size cfa.reg=sp, cfa.offset=total_frame_size ++ cfa_store.reg=sp, cfa_store.offset=total_frame_size ++12 stw ra, offset(sp) ++12 stw r16, offset(sp) ++1 mov fp, sp ++ ++Case 2: ++Rule # Example Insn Effect ++6 movi r8, total_frame_size cfa_temp.reg=r8, cfa_temp.offset=total_frame_size ++2 sub sp, sp, r8 cfa.reg=sp, cfa.offset=total_frame_size ++ cfa_store.reg=sp, cfa_store.offset=total_frame_size ++5 add r8, r8, sp cfa_store.reg=r8, cfa_store.offset=0 ++12 stw ra, offset(r8) ++12 stw r16, offset(r8) ++1 mov fp, sp ++ ++*/ ++ ++void ++expand_prologue () ++{ ++ int i; ++ HOST_WIDE_INT total_frame_size; ++ int cfa_store_offset; ++ rtx insn; ++ rtx cfa_store_reg = 0; ++ ++ total_frame_size = compute_frame_size (); ++ ++ if (total_frame_size) ++ { ++ ++ if (TOO_BIG_OFFSET (total_frame_size)) ++ { ++ /* cfa_temp and cfa_store_reg are the same register, ++ cfa_store_reg overwrites cfa_temp */ ++ cfa_store_reg = gen_rtx_REG (SImode, TEMP_REG_NUM); ++ insn = emit_insn (gen_rtx_SET (SImode, ++ cfa_store_reg, ++ GEN_INT (total_frame_size))); ++ ++ RTX_FRAME_RELATED_P (insn) = 1; ++ ++ ++ insn = gen_rtx_SET (SImode, ++ stack_pointer_rtx, ++ gen_rtx_MINUS (SImode, ++ stack_pointer_rtx, ++ cfa_store_reg)); ++ ++ insn = emit_insn (insn); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ ++ ++ /* if there are no registers to save, I don't need to ++ create a cfa_store */ ++ if (cfun->machine->frame.save_reg_size) ++ { ++ insn = gen_rtx_SET (SImode, ++ cfa_store_reg, ++ gen_rtx_PLUS (SImode, ++ cfa_store_reg, ++ stack_pointer_rtx)); ++ ++ insn = emit_insn (insn); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ } ++ ++ cfa_store_offset ++ = total_frame_size ++ - (cfun->machine->frame.save_regs_offset ++ + cfun->machine->frame.save_reg_rounded); ++ } ++ else ++ { ++ insn = gen_rtx_SET (SImode, ++ stack_pointer_rtx, ++ gen_rtx_PLUS (SImode, ++ stack_pointer_rtx, ++ GEN_INT (-total_frame_size))); ++ insn = emit_insn (insn); ++ RTX_FRAME_RELATED_P (insn) = 1; ++ ++ cfa_store_reg = stack_pointer_rtx; ++ cfa_store_offset ++ = cfun->machine->frame.save_regs_offset ++ + cfun->machine->frame.save_reg_rounded; ++ } ++ } ++ ++ if (MUST_SAVE_REGISTER (RA_REGNO)) ++ { ++ cfa_store_offset -= 4; ++ save_reg (RA_REGNO, cfa_store_offset, cfa_store_reg); ++ } ++ if (MUST_SAVE_REGISTER (FP_REGNO)) ++ { ++ cfa_store_offset -= 4; ++ save_reg (FP_REGNO, cfa_store_offset, cfa_store_reg); ++ } ++ ++ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ++ { ++ if (MUST_SAVE_REGISTER (i) && i != FP_REGNO && i != RA_REGNO) ++ { ++ cfa_store_offset -= 4; ++ save_reg (i, cfa_store_offset, cfa_store_reg); ++ } ++ } ++ ++ if (frame_pointer_needed) ++ { ++ insn = emit_insn (gen_rtx_SET (SImode, ++ gen_rtx_REG (SImode, FP_REGNO), ++ gen_rtx_REG (SImode, SP_REGNO))); ++ ++ RTX_FRAME_RELATED_P (insn) = 1; ++ } ++ ++ /* If we are profiling, make sure no instructions are scheduled before ++ the call to mcount. */ ++ if (current_function_profile) ++ emit_insn (gen_blockage ()); ++} ++ ++void ++expand_epilogue (bool sibcall_p) ++{ ++ rtx insn; ++ int i; ++ HOST_WIDE_INT total_frame_size; ++ int register_store_offset; ++ ++ total_frame_size = compute_frame_size (); ++ ++ if (!sibcall_p && nios2_can_use_return_insn ()) ++ { ++ insn = emit_jump_insn (gen_return ()); ++ return; ++ } ++ ++ emit_insn (gen_blockage ()); ++ ++ register_store_offset = ++ cfun->machine->frame.save_regs_offset + ++ cfun->machine->frame.save_reg_rounded; ++ ++ if (MUST_SAVE_REGISTER (RA_REGNO)) ++ { ++ register_store_offset -= 4; ++ restore_reg (RA_REGNO, register_store_offset); ++ } ++ ++ if (MUST_SAVE_REGISTER (FP_REGNO)) ++ { ++ register_store_offset -= 4; ++ restore_reg (FP_REGNO, register_store_offset); ++ } ++ ++ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) ++ { ++ if (MUST_SAVE_REGISTER (i) && i != FP_REGNO && i != RA_REGNO) ++ { ++ register_store_offset -= 4; ++ restore_reg (i, register_store_offset); ++ } ++ } ++ ++ if (total_frame_size) ++ { ++ rtx sp_adjust; ++ ++ if (TOO_BIG_OFFSET (total_frame_size)) ++ { ++ sp_adjust = gen_rtx_REG (SImode, TEMP_REG_NUM); ++ insn = emit_insn (gen_rtx_SET (SImode, ++ sp_adjust, ++ GEN_INT (total_frame_size))); ++ ++ } ++ else ++ { ++ sp_adjust = GEN_INT (total_frame_size); ++ } ++ ++ insn = gen_rtx_SET (SImode, ++ stack_pointer_rtx, ++ gen_rtx_PLUS (SImode, ++ stack_pointer_rtx, ++ sp_adjust)); ++ insn = emit_insn (insn); ++ } ++ ++ ++ if (!sibcall_p) ++ { ++ insn = emit_jump_insn (gen_return_from_epilogue (gen_rtx (REG, Pmode, ++ RA_REGNO))); ++ } ++} ++ ++ ++bool ++nios2_function_ok_for_sibcall (tree a ATTRIBUTE_UNUSED, tree b ATTRIBUTE_UNUSED) ++{ ++ return true; ++} ++ ++ ++ ++ ++ ++/* ----------------------- * ++ * Profiling ++ * ----------------------- */ ++ ++void ++function_profiler (FILE *file, int labelno) ++{ ++ fprintf (file, "\t%s mcount begin, label: .LP%d\n", ++ ASM_COMMENT_START, labelno); ++ fprintf (file, "\tnextpc\tr8\n"); ++ fprintf (file, "\tmov\tr9, ra\n"); ++ fprintf (file, "\tmovhi\tr10, %%hiadj(.LP%d)\n", labelno); ++ fprintf (file, "\taddi\tr10, r10, %%lo(.LP%d)\n", labelno); ++ fprintf (file, "\tcall\tmcount\n"); ++ fprintf (file, "\tmov\tra, r9\n"); ++ fprintf (file, "\t%s mcount end\n", ASM_COMMENT_START); ++} ++ ++ ++/*************************************** ++ * Stack Layout ++ ***************************************/ ++ ++ ++void ++dump_frame_size (FILE *file) ++{ ++ fprintf (file, "\t%s Current Frame Info\n", ASM_COMMENT_START); ++ ++ fprintf (file, "\t%s total_size = %ld\n", ASM_COMMENT_START, ++ cfun->machine->frame.total_size); ++ fprintf (file, "\t%s var_size = %ld\n", ASM_COMMENT_START, ++ cfun->machine->frame.var_size); ++ fprintf (file, "\t%s args_size = %ld\n", ASM_COMMENT_START, ++ cfun->machine->frame.args_size); ++ fprintf (file, "\t%s save_reg_size = %d\n", ASM_COMMENT_START, ++ cfun->machine->frame.save_reg_size); ++ fprintf (file, "\t%s save_reg_rounded = %d\n", ASM_COMMENT_START, ++ cfun->machine->frame.save_reg_rounded); ++ fprintf (file, "\t%s initialized = %d\n", ASM_COMMENT_START, ++ cfun->machine->frame.initialized); ++ fprintf (file, "\t%s num_regs = %d\n", ASM_COMMENT_START, ++ cfun->machine->frame.num_regs); ++ fprintf (file, "\t%s save_regs_offset = %ld\n", ASM_COMMENT_START, ++ cfun->machine->frame.save_regs_offset); ++ fprintf (file, "\t%s current_function_is_leaf = %d\n", ASM_COMMENT_START, ++ current_function_is_leaf); ++ fprintf (file, "\t%s frame_pointer_needed = %d\n", ASM_COMMENT_START, ++ frame_pointer_needed); ++ fprintf (file, "\t%s pretend_args_size = %d\n", ASM_COMMENT_START, ++ current_function_pretend_args_size); ++ ++} ++ ++ ++/* Return the bytes needed to compute the frame pointer from the current ++ stack pointer. ++*/ ++ ++HOST_WIDE_INT ++compute_frame_size () ++{ ++ unsigned int regno; ++ HOST_WIDE_INT var_size; /* # of var. bytes allocated */ ++ HOST_WIDE_INT total_size; /* # bytes that the entire frame takes up */ ++ HOST_WIDE_INT save_reg_size; /* # bytes needed to store callee save regs */ ++ HOST_WIDE_INT save_reg_rounded; ++ /* # bytes needed to store callee save regs (rounded) */ ++ HOST_WIDE_INT out_args_size; /* # bytes needed for outgoing args */ ++ ++ save_reg_size = 0; ++ var_size = STACK_ALIGN (get_frame_size ()); ++ out_args_size = STACK_ALIGN (current_function_outgoing_args_size); ++ ++ total_size = var_size + out_args_size; ++ ++ /* Calculate space needed for gp registers. */ ++ for (regno = 0; regno <= FIRST_PSEUDO_REGISTER; regno++) ++ { ++ if (MUST_SAVE_REGISTER (regno)) ++ { ++ save_reg_size += 4; ++ } ++ } ++ ++ save_reg_rounded = STACK_ALIGN (save_reg_size); ++ total_size += save_reg_rounded; ++ ++ total_size += STACK_ALIGN (current_function_pretend_args_size); ++ ++ /* Save other computed information. */ ++ cfun->machine->frame.total_size = total_size; ++ cfun->machine->frame.var_size = var_size; ++ cfun->machine->frame.args_size = current_function_outgoing_args_size; ++ cfun->machine->frame.save_reg_size = save_reg_size; ++ cfun->machine->frame.save_reg_rounded = save_reg_rounded; ++ cfun->machine->frame.initialized = reload_completed; ++ cfun->machine->frame.num_regs = save_reg_size / UNITS_PER_WORD; ++ ++ cfun->machine->frame.save_regs_offset ++ = save_reg_rounded ? current_function_outgoing_args_size + var_size : 0; ++ ++ return total_size; ++} ++ ++ ++int ++nios2_initial_elimination_offset (int from, int to ATTRIBUTE_UNUSED) ++{ ++ int offset; ++ ++ /* Set OFFSET to the offset from the stack pointer. */ ++ switch (from) ++ { ++ case FRAME_POINTER_REGNUM: ++ offset = 0; ++ break; ++ ++ case ARG_POINTER_REGNUM: ++ compute_frame_size (); ++ offset = cfun->machine->frame.total_size; ++ offset -= current_function_pretend_args_size; ++ break; ++ ++ case RETURN_ADDRESS_POINTER_REGNUM: ++ compute_frame_size (); ++ /* since the return address is always the first of the ++ saved registers, return the offset to the beginning ++ of the saved registers block */ ++ offset = cfun->machine->frame.save_regs_offset; ++ break; ++ ++ default: ++ abort (); ++ } ++ ++ return offset; ++} ++ ++/* Return nonzero if this function is known to have a null epilogue. ++ This allows the optimizer to omit jumps to jumps if no stack ++ was created. */ ++int ++nios2_can_use_return_insn () ++{ ++ if (!reload_completed) ++ return 0; ++ ++ if (regs_ever_live[RA_REGNO] || current_function_profile) ++ return 0; ++ ++ if (cfun->machine->frame.initialized) ++ return cfun->machine->frame.total_size == 0; ++ ++ return compute_frame_size () == 0; ++} ++ ++ ++ ++ ++ ++/*************************************** ++ * ++ ***************************************/ ++ ++const char *nios2_sys_nosys_string; /* for -msys=nosys */ ++const char *nios2_sys_lib_string; /* for -msys-lib= */ ++const char *nios2_sys_crt0_string; /* for -msys-crt0= */ ++ ++void ++override_options () ++{ ++ /* Function to allocate machine-dependent function status. */ ++ init_machine_status = &nios2_init_machine_status; ++ ++ nios2_section_threshold ++ = g_switch_set ? g_switch_value : NIOS2_DEFAULT_GVALUE; ++ ++ if (nios2_sys_nosys_string && *nios2_sys_nosys_string) ++ { ++ error ("invalid option '-msys=nosys%s'", nios2_sys_nosys_string); ++ } ++ ++ /* If we don't have mul, we don't have mulx either! */ ++ if (!TARGET_HAS_MUL && TARGET_HAS_MULX) ++ { ++ target_flags &= ~HAS_MULX_FLAG; ++ } ++ ++} ++ ++void ++optimization_options (int level, int size) ++{ ++ if (level || size) ++ { ++ target_flags |= INLINE_MEMCPY_FLAG; ++ } ++ ++ if (level >= 3 && !size) ++ { ++ target_flags |= FAST_SW_DIV_FLAG; ++ } ++} ++ ++/* Allocate a chunk of memory for per-function machine-dependent data. */ ++static struct machine_function * ++nios2_init_machine_status () ++{ ++ return ((struct machine_function *) ++ ggc_alloc_cleared (sizeof (struct machine_function))); ++} ++ ++ ++ ++/***************** ++ * Describing Relative Costs of Operations ++ *****************/ ++ ++/* Compute a (partial) cost for rtx X. Return true if the complete ++ cost has been computed, and false if subexpressions should be ++ scanned. In either case, *TOTAL contains the cost result. */ ++ ++ ++ ++static bool ++nios2_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED, int *total) ++{ ++ switch (code) ++ { ++ case CONST_INT: ++ if (INTVAL (x) == 0) ++ { ++ *total = COSTS_N_INSNS (0); ++ return true; ++ } ++ else if (SMALL_INT (INTVAL (x)) ++ || SMALL_INT_UNSIGNED (INTVAL (x)) ++ || UPPER16_INT (INTVAL (x))) ++ { ++ *total = COSTS_N_INSNS (2); ++ return true; ++ } ++ else ++ { ++ *total = COSTS_N_INSNS (4); ++ return true; ++ } ++ ++ case LABEL_REF: ++ case SYMBOL_REF: ++ /* ??? gp relative stuff will fit in here */ ++ /* fall through */ ++ case CONST: ++ case CONST_DOUBLE: ++ { ++ *total = COSTS_N_INSNS (4); ++ return true; ++ } ++ ++ case MULT: ++ { ++ *total = COSTS_N_INSNS (1); ++ return false; ++ } ++ case SIGN_EXTEND: ++ { ++ *total = COSTS_N_INSNS (3); ++ return false; ++ } ++ case ZERO_EXTEND: ++ { ++ *total = COSTS_N_INSNS (1); ++ return false; ++ } ++ ++ default: ++ return false; ++ } ++} ++ ++ ++/*************************************** ++ * INSTRUCTION SUPPORT ++ * ++ * These functions are used within the Machine Description to ++ * handle common or complicated output and expansions from ++ * instructions. ++ ***************************************/ ++ ++int ++nios2_emit_move_sequence (rtx *operands, enum machine_mode mode) ++{ ++ rtx to = operands[0]; ++ rtx from = operands[1]; ++ ++ if (!register_operand (to, mode) && !reg_or_0_operand (from, mode)) ++ { ++ if (no_new_pseudos) ++ internal_error ("Trying to force_reg no_new_pseudos == 1"); ++ from = copy_to_mode_reg (mode, from); ++ } ++ ++ operands[0] = to; ++ operands[1] = from; ++ return 0; ++} ++ ++/* Divide Support */ ++ ++/* ++ If -O3 is used, we want to output a table lookup for ++ divides between small numbers (both num and den >= 0 ++ and < 0x10). The overhead of this method in the worse ++ case is 40 bytes in the text section (10 insns) and ++ 256 bytes in the data section. Additional divides do ++ not incur additional penalties in the data section. ++ ++ Code speed is improved for small divides by about 5x ++ when using this method in the worse case (~9 cycles ++ vs ~45). And in the worse case divides not within the ++ table are penalized by about 10% (~5 cycles vs ~45). ++ However in the typical case the penalty is not as bad ++ because doing the long divide in only 45 cycles is ++ quite optimistic. ++ ++ ??? It would be nice to have some benchmarks other ++ than Dhrystone to back this up. ++ ++ This bit of expansion is to create this instruction ++ sequence as rtl. ++ or $8, $4, $5 ++ slli $9, $4, 4 ++ cmpgeui $3, $8, 16 ++ beq $3, $0, .L3 ++ or $10, $9, $5 ++ add $12, $11, divide_table ++ ldbu $2, 0($12) ++ br .L1 ++.L3: ++ call slow_div ++.L1: ++# continue here with result in $2 ++ ++ ??? Ideally I would like the emit libcall block to contain ++ all of this code, but I don't know how to do that. What it ++ means is that if the divide can be eliminated, it may not ++ completely disappear. ++ ++ ??? The __divsi3_table label should ideally be moved out ++ of this block and into a global. If it is placed into the ++ sdata section we can save even more cycles by doing things ++ gp relative. ++*/ ++int ++nios2_emit_expensive_div (rtx *operands, enum machine_mode mode) ++{ ++ rtx or_result, shift_left_result; ++ rtx lookup_value; ++ rtx lab1, lab3; ++ rtx insns; ++ rtx libfunc; ++ rtx final_result; ++ rtx tmp; ++ ++ /* it may look a little generic, but only SImode ++ is supported for now */ ++ if (mode != SImode) ++ abort (); ++ ++ libfunc = sdiv_optab->handlers[(int) SImode].libfunc; ++ ++ ++ ++ lab1 = gen_label_rtx (); ++ lab3 = gen_label_rtx (); ++ ++ or_result = expand_simple_binop (SImode, IOR, ++ operands[1], operands[2], ++ 0, 0, OPTAB_LIB_WIDEN); ++ ++ emit_cmp_and_jump_insns (or_result, GEN_INT (15), GTU, 0, ++ GET_MODE (or_result), 0, lab3); ++ JUMP_LABEL (get_last_insn ()) = lab3; ++ ++ shift_left_result = expand_simple_binop (SImode, ASHIFT, ++ operands[1], GEN_INT (4), ++ 0, 0, OPTAB_LIB_WIDEN); ++ ++ lookup_value = expand_simple_binop (SImode, IOR, ++ shift_left_result, operands[2], ++ 0, 0, OPTAB_LIB_WIDEN); ++ ++ convert_move (operands[0], ++ gen_rtx (MEM, QImode, ++ gen_rtx (PLUS, SImode, ++ lookup_value, ++ gen_rtx_SYMBOL_REF (SImode, "__divsi3_table"))), ++ 1); ++ ++ ++ tmp = emit_jump_insn (gen_jump (lab1)); ++ JUMP_LABEL (tmp) = lab1; ++ emit_barrier (); ++ ++ emit_label (lab3); ++ LABEL_NUSES (lab3) = 1; ++ ++ start_sequence (); ++ final_result = emit_library_call_value (libfunc, NULL_RTX, ++ LCT_CONST, SImode, 2, ++ operands[1], SImode, ++ operands[2], SImode); ++ ++ ++ insns = get_insns (); ++ end_sequence (); ++ emit_libcall_block (insns, operands[0], final_result, ++ gen_rtx (DIV, SImode, operands[1], operands[2])); ++ ++ emit_label (lab1); ++ LABEL_NUSES (lab1) = 1; ++ return 1; ++} ++ ++/* Branches/Compares */ ++ ++/* the way of handling branches/compares ++ in gcc is heavily borrowed from MIPS */ ++ ++enum internal_test ++{ ++ ITEST_EQ, ++ ITEST_NE, ++ ITEST_GT, ++ ITEST_GE, ++ ITEST_LT, ++ ITEST_LE, ++ ITEST_GTU, ++ ITEST_GEU, ++ ITEST_LTU, ++ ITEST_LEU, ++ ITEST_MAX ++}; ++ ++static enum internal_test map_test_to_internal_test (enum rtx_code); ++ ++/* Cached operands, and operator to compare for use in set/branch/trap ++ on condition codes. */ ++rtx branch_cmp[2]; ++enum cmp_type branch_type; ++ ++/* Make normal rtx_code into something we can index from an array */ ++ ++static enum internal_test ++map_test_to_internal_test (enum rtx_code test_code) ++{ ++ enum internal_test test = ITEST_MAX; ++ ++ switch (test_code) ++ { ++ case EQ: ++ test = ITEST_EQ; ++ break; ++ case NE: ++ test = ITEST_NE; ++ break; ++ case GT: ++ test = ITEST_GT; ++ break; ++ case GE: ++ test = ITEST_GE; ++ break; ++ case LT: ++ test = ITEST_LT; ++ break; ++ case LE: ++ test = ITEST_LE; ++ break; ++ case GTU: ++ test = ITEST_GTU; ++ break; ++ case GEU: ++ test = ITEST_GEU; ++ break; ++ case LTU: ++ test = ITEST_LTU; ++ break; ++ case LEU: ++ test = ITEST_LEU; ++ break; ++ default: ++ break; ++ } ++ ++ return test; ++} ++ ++/* Generate the code to compare (and possibly branch) two integer values ++ TEST_CODE is the comparison code we are trying to emulate ++ (or implement directly) ++ RESULT is where to store the result of the comparison, ++ or null to emit a branch ++ CMP0 CMP1 are the two comparison operands ++ DESTINATION is the destination of the branch, or null to only compare ++ */ ++ ++void ++gen_int_relational (enum rtx_code test_code, /* relational test (EQ, etc) */ ++ rtx result, /* result to store comp. or 0 if branch */ ++ rtx cmp0, /* first operand to compare */ ++ rtx cmp1, /* second operand to compare */ ++ rtx destination) /* destination of the branch, or 0 if compare */ ++{ ++ struct cmp_info ++ { ++ /* for register (or 0) compares */ ++ enum rtx_code test_code_reg; /* code to use in instruction (LT vs. LTU) */ ++ int reverse_regs; /* reverse registers in test */ ++ ++ /* for immediate compares */ ++ enum rtx_code test_code_const; ++ /* code to use in instruction (LT vs. LTU) */ ++ int const_low; /* low bound of constant we can accept */ ++ int const_high; /* high bound of constant we can accept */ ++ int const_add; /* constant to add */ ++ ++ /* generic info */ ++ int unsignedp; /* != 0 for unsigned comparisons. */ ++ }; ++ ++ static const struct cmp_info info[(int) ITEST_MAX] = { ++ ++ {EQ, 0, EQ, -32768, 32767, 0, 0}, /* EQ */ ++ {NE, 0, NE, -32768, 32767, 0, 0}, /* NE */ ++ ++ {LT, 1, GE, -32769, 32766, 1, 0}, /* GT */ ++ {GE, 0, GE, -32768, 32767, 0, 0}, /* GE */ ++ {LT, 0, LT, -32768, 32767, 0, 0}, /* LT */ ++ {GE, 1, LT, -32769, 32766, 1, 0}, /* LE */ ++ ++ {LTU, 1, GEU, 0, 65534, 1, 0}, /* GTU */ ++ {GEU, 0, GEU, 0, 65535, 0, 0}, /* GEU */ ++ {LTU, 0, LTU, 0, 65535, 0, 0}, /* LTU */ ++ {GEU, 1, LTU, 0, 65534, 1, 0}, /* LEU */ ++ }; ++ ++ enum internal_test test; ++ enum machine_mode mode; ++ const struct cmp_info *p_info; ++ int branch_p; ++ ++ ++ ++ ++ test = map_test_to_internal_test (test_code); ++ if (test == ITEST_MAX) ++ abort (); ++ ++ p_info = &info[(int) test]; ++ ++ mode = GET_MODE (cmp0); ++ if (mode == VOIDmode) ++ mode = GET_MODE (cmp1); ++ ++ branch_p = (destination != 0); ++ ++ /* We can't, under any circumstances, have const_ints in cmp0 ++ ??? Actually we could have const0 */ ++ if (GET_CODE (cmp0) == CONST_INT) ++ cmp0 = force_reg (mode, cmp0); ++ ++ /* if the comparison is against an int not in legal range ++ move it into a register */ ++ if (GET_CODE (cmp1) == CONST_INT) ++ { ++ HOST_WIDE_INT value = INTVAL (cmp1); ++ ++ if (value < p_info->const_low || value > p_info->const_high) ++ cmp1 = force_reg (mode, cmp1); ++ } ++ ++ /* Comparison to constants, may involve adding 1 to change a GT into GE. ++ Comparison between two registers, may involve switching operands. */ ++ if (GET_CODE (cmp1) == CONST_INT) ++ { ++ if (p_info->const_add != 0) ++ { ++ HOST_WIDE_INT new = INTVAL (cmp1) + p_info->const_add; ++ ++ /* If modification of cmp1 caused overflow, ++ we would get the wrong answer if we follow the usual path; ++ thus, x > 0xffffffffU would turn into x > 0U. */ ++ if ((p_info->unsignedp ++ ? (unsigned HOST_WIDE_INT) new > ++ (unsigned HOST_WIDE_INT) INTVAL (cmp1) ++ : new > INTVAL (cmp1)) != (p_info->const_add > 0)) ++ { ++ /* ??? This case can never happen with the current numbers, ++ but I am paranoid and would rather an abort than ++ a bug I will never find */ ++ abort (); ++ } ++ else ++ cmp1 = GEN_INT (new); ++ } ++ } ++ ++ else if (p_info->reverse_regs) ++ { ++ rtx temp = cmp0; ++ cmp0 = cmp1; ++ cmp1 = temp; ++ } ++ ++ ++ ++ if (branch_p) ++ { ++ if (register_operand (cmp0, mode) && register_operand (cmp1, mode)) ++ { ++ rtx insn; ++ rtx cond = gen_rtx (p_info->test_code_reg, mode, cmp0, cmp1); ++ rtx label = gen_rtx_LABEL_REF (VOIDmode, destination); ++ ++ insn = gen_rtx_SET (VOIDmode, pc_rtx, ++ gen_rtx_IF_THEN_ELSE (VOIDmode, ++ cond, label, pc_rtx)); ++ emit_jump_insn (insn); ++ } ++ else ++ { ++ rtx cond, label; ++ ++ result = gen_reg_rtx (mode); ++ ++ emit_move_insn (result, ++ gen_rtx (p_info->test_code_const, mode, cmp0, ++ cmp1)); ++ ++ cond = gen_rtx (NE, mode, result, const0_rtx); ++ label = gen_rtx_LABEL_REF (VOIDmode, destination); ++ ++ emit_jump_insn (gen_rtx_SET (VOIDmode, pc_rtx, ++ gen_rtx_IF_THEN_ELSE (VOIDmode, ++ cond, ++ label, pc_rtx))); ++ } ++ } ++ else ++ { ++ if (register_operand (cmp0, mode) && register_operand (cmp1, mode)) ++ { ++ emit_move_insn (result, ++ gen_rtx (p_info->test_code_reg, mode, cmp0, cmp1)); ++ } ++ else ++ { ++ emit_move_insn (result, ++ gen_rtx (p_info->test_code_const, mode, cmp0, ++ cmp1)); ++ } ++ } ++ ++} ++ ++ ++/* ??? For now conditional moves are only supported ++ when the mode of the operands being compared are ++ the same as the ones being moved */ ++ ++void ++gen_conditional_move (rtx *operands, enum machine_mode mode) ++{ ++ rtx insn, cond; ++ rtx cmp_reg = gen_reg_rtx (mode); ++ enum rtx_code cmp_code = GET_CODE (operands[1]); ++ enum rtx_code move_code = EQ; ++ ++ /* emit a comparison if it is not "simple". ++ Simple comparisons are X eq 0 and X ne 0 */ ++ if ((cmp_code == EQ || cmp_code == NE) && branch_cmp[1] == const0_rtx) ++ { ++ cmp_reg = branch_cmp[0]; ++ move_code = cmp_code; ++ } ++ else if ((cmp_code == EQ || cmp_code == NE) && branch_cmp[0] == const0_rtx) ++ { ++ cmp_reg = branch_cmp[1]; ++ move_code = cmp_code == EQ ? NE : EQ; ++ } ++ else ++ gen_int_relational (cmp_code, cmp_reg, branch_cmp[0], branch_cmp[1], ++ NULL_RTX); ++ ++ cond = gen_rtx (move_code, VOIDmode, cmp_reg, CONST0_RTX (mode)); ++ insn = gen_rtx_SET (mode, operands[0], ++ gen_rtx_IF_THEN_ELSE (mode, ++ cond, operands[2], operands[3])); ++ emit_insn (insn); ++} ++ ++/******************* ++ * Addressing Modes ++ *******************/ ++ ++int ++nios2_legitimate_address (rtx operand, enum machine_mode mode ATTRIBUTE_UNUSED, ++ int strict) ++{ ++ int ret_val = 0; ++ ++ switch (GET_CODE (operand)) ++ { ++ /* direct. */ ++ case SYMBOL_REF: ++ if (SYMBOL_REF_IN_NIOS2_SMALL_DATA_P (operand)) ++ { ++ ret_val = 1; ++ break; ++ } ++ /* else, fall through */ ++ case LABEL_REF: ++ case CONST_INT: ++ case CONST: ++ case CONST_DOUBLE: ++ /* ??? In here I need to add gp addressing */ ++ ret_val = 0; ++ ++ break; ++ ++ /* Register indirect. */ ++ case REG: ++ ret_val = REG_OK_FOR_BASE_P2 (operand, strict); ++ break; ++ ++ /* Register indirect with displacement */ ++ case PLUS: ++ { ++ rtx op0 = XEXP (operand, 0); ++ rtx op1 = XEXP (operand, 1); ++ ++ if (REG_P (op0) && REG_P (op1)) ++ ret_val = 0; ++ else if (REG_P (op0) && CONSTANT_P (op1)) ++ ret_val = REG_OK_FOR_BASE_P2 (op0, strict) ++ && SMALL_INT (INTVAL (op1)); ++ else if (REG_P (op1) && CONSTANT_P (op0)) ++ ret_val = REG_OK_FOR_BASE_P2 (op1, strict) ++ && SMALL_INT (INTVAL (op0)); ++ else ++ ret_val = 0; ++ } ++ break; ++ ++ default: ++ ret_val = 0; ++ break; ++ } ++ ++ return ret_val; ++} ++ ++/* Return true if EXP should be placed in the small data section. */ ++ ++static bool ++nios2_in_small_data_p (tree exp) ++{ ++ /* We want to merge strings, so we never consider them small data. */ ++ if (TREE_CODE (exp) == STRING_CST) ++ return false; ++ ++ if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp)) ++ { ++ const char *section = TREE_STRING_POINTER (DECL_SECTION_NAME (exp)); ++ /* ??? these string names need moving into ++ an array in some header file */ ++ if (nios2_section_threshold > 0 ++ && (strcmp (section, ".sbss") == 0 ++ || strncmp (section, ".sbss.", 6) == 0 ++ || strcmp (section, ".sdata") == 0 ++ || strncmp (section, ".sdata.", 7) == 0)) ++ return true; ++ } ++ else if (TREE_CODE (exp) == VAR_DECL) ++ { ++ HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp)); ++ ++ /* If this is an incomplete type with size 0, then we can't put it ++ in sdata because it might be too big when completed. */ ++ if (size > 0 && size <= nios2_section_threshold) ++ return true; ++ } ++ ++ return false; ++} ++ ++static void ++nios2_encode_section_info (tree decl, rtx rtl, int first) ++{ ++ ++ rtx symbol; ++ int flags; ++ ++ default_encode_section_info (decl, rtl, first); ++ ++ /* Careful not to prod global register variables. */ ++ if (GET_CODE (rtl) != MEM) ++ return; ++ symbol = XEXP (rtl, 0); ++ if (GET_CODE (symbol) != SYMBOL_REF) ++ return; ++ ++ flags = SYMBOL_REF_FLAGS (symbol); ++ ++ /* We don't want weak variables to be addressed with gp in case they end up with ++ value 0 which is not within 2^15 of $gp */ ++ if (DECL_P (decl) && DECL_WEAK (decl)) ++ flags |= SYMBOL_FLAG_WEAK_DECL; ++ ++ SYMBOL_REF_FLAGS (symbol) = flags; ++} ++ ++ ++static unsigned int ++nios2_section_type_flags (tree decl, const char *name, int reloc) ++{ ++ unsigned int flags; ++ ++ flags = default_section_type_flags (decl, name, reloc); ++ ++ /* ??? these string names need moving into an array in some header file */ ++ if (strcmp (name, ".sbss") == 0 ++ || strncmp (name, ".sbss.", 6) == 0 ++ || strcmp (name, ".sdata") == 0 ++ || strncmp (name, ".sdata.", 7) == 0) ++ flags |= SECTION_SMALL; ++ ++ return flags; ++} ++ ++ ++ ++ ++/***************************************** ++ * Defining the Output Assembler Language ++ *****************************************/ ++ ++/* -------------- * ++ * Output of Data ++ * -------------- */ ++ ++ ++/* -------------------------------- * ++ * Output of Assembler Instructions ++ * -------------------------------- */ ++ ++ ++/* print the operand OP to file stream ++ FILE modified by LETTER. LETTER ++ can be one of: ++ i: print "i" if OP is an immediate, except 0 ++ o: print "io" if OP is volatile ++ ++ z: for const0_rtx print $0 instead of 0 ++ H: for %hiadj ++ L: for %lo ++ U: for upper half of 32 bit value ++ */ ++ ++void ++nios2_print_operand (FILE *file, rtx op, int letter) ++{ ++ ++ switch (letter) ++ { ++ case 'i': ++ if (CONSTANT_P (op) && (op != const0_rtx)) ++ fprintf (file, "i"); ++ return; ++ ++ case 'o': ++ if (GET_CODE (op) == MEM ++ && ((MEM_VOLATILE_P (op) && !TARGET_CACHE_VOLATILE) ++ || TARGET_BYPASS_CACHE)) ++ fprintf (file, "io"); ++ return; ++ ++ default: ++ break; ++ } ++ ++ if (comparison_operator (op, VOIDmode)) ++ { ++ if (letter == 0) ++ { ++ fprintf (file, "%s", GET_RTX_NAME (GET_CODE (op))); ++ return; ++ } ++ } ++ ++ ++ switch (GET_CODE (op)) ++ { ++ case REG: ++ if (letter == 0 || letter == 'z') ++ { ++ fprintf (file, "%s", reg_names[REGNO (op)]); ++ return; ++ } ++ ++ case CONST_INT: ++ if (INTVAL (op) == 0 && letter == 'z') ++ { ++ fprintf (file, "zero"); ++ return; ++ } ++ else if (letter == 'U') ++ { ++ HOST_WIDE_INT val = INTVAL (op); ++ rtx new_op; ++ val = (val / 65536) & 0xFFFF; ++ new_op = GEN_INT (val); ++ output_addr_const (file, new_op); ++ return; ++ } ++ ++ /* else, fall through */ ++ case CONST: ++ case LABEL_REF: ++ case SYMBOL_REF: ++ case CONST_DOUBLE: ++ if (letter == 0 || letter == 'z') ++ { ++ output_addr_const (file, op); ++ return; ++ } ++ else if (letter == 'H') ++ { ++ fprintf (file, "%%hiadj("); ++ output_addr_const (file, op); ++ fprintf (file, ")"); ++ return; ++ } ++ else if (letter == 'L') ++ { ++ fprintf (file, "%%lo("); ++ output_addr_const (file, op); ++ fprintf (file, ")"); ++ return; ++ } ++ ++ ++ case SUBREG: ++ case MEM: ++ if (letter == 0) ++ { ++ output_address (op); ++ return; ++ } ++ ++ case CODE_LABEL: ++ if (letter == 0) ++ { ++ output_addr_const (file, op); ++ return; ++ } ++ ++ default: ++ break; ++ } ++ ++ fprintf (stderr, "Missing way to print (%c) ", letter); ++ debug_rtx (op); ++ abort (); ++} ++ ++static int gprel_constant (rtx); ++ ++static int ++gprel_constant (rtx op) ++{ ++ if (GET_CODE (op) == SYMBOL_REF ++ && SYMBOL_REF_IN_NIOS2_SMALL_DATA_P (op)) ++ { ++ return 1; ++ } ++ else if (GET_CODE (op) == CONST ++ && GET_CODE (XEXP (op, 0)) == PLUS) ++ { ++ return gprel_constant (XEXP (XEXP (op, 0), 0)); ++ } ++ else ++ { ++ return 0; ++ } ++} ++ ++void ++nios2_print_operand_address (FILE *file, rtx op) ++{ ++ switch (GET_CODE (op)) ++ { ++ case CONST: ++ case CONST_INT: ++ case LABEL_REF: ++ case CONST_DOUBLE: ++ case SYMBOL_REF: ++ if (gprel_constant (op)) ++ { ++ fprintf (file, "%%gprel("); ++ output_addr_const (file, op); ++ fprintf (file, ")(%s)", reg_names[GP_REGNO]); ++ return; ++ } ++ ++ break; ++ ++ case PLUS: ++ { ++ rtx op0 = XEXP (op, 0); ++ rtx op1 = XEXP (op, 1); ++ ++ if (REG_P (op0) && CONSTANT_P (op1)) ++ { ++ output_addr_const (file, op1); ++ fprintf (file, "(%s)", reg_names[REGNO (op0)]); ++ return; ++ } ++ else if (REG_P (op1) && CONSTANT_P (op0)) ++ { ++ output_addr_const (file, op0); ++ fprintf (file, "(%s)", reg_names[REGNO (op1)]); ++ return; ++ } ++ } ++ break; ++ ++ case REG: ++ fprintf (file, "0(%s)", reg_names[REGNO (op)]); ++ return; ++ ++ case MEM: ++ { ++ rtx base = XEXP (op, 0); ++ PRINT_OPERAND_ADDRESS (file, base); ++ return; ++ } ++ default: ++ break; ++ } ++ ++ fprintf (stderr, "Missing way to print address\n"); ++ debug_rtx (op); ++ abort (); ++} ++ ++ ++ ++ ++ ++/**************************** ++ * Predicates ++ ****************************/ ++ ++int ++arith_operand (rtx op, enum machine_mode mode) ++{ ++ if (GET_CODE (op) == CONST_INT && SMALL_INT (INTVAL (op))) ++ return 1; ++ ++ return register_operand (op, mode); ++} ++ ++int ++uns_arith_operand (rtx op, enum machine_mode mode) ++{ ++ if (GET_CODE (op) == CONST_INT && SMALL_INT_UNSIGNED (INTVAL (op))) ++ return 1; ++ ++ return register_operand (op, mode); ++} ++ ++int ++logical_operand (rtx op, enum machine_mode mode) ++{ ++ if (GET_CODE (op) == CONST_INT ++ && (SMALL_INT_UNSIGNED (INTVAL (op)) || UPPER16_INT (INTVAL (op)))) ++ return 1; ++ ++ return register_operand (op, mode); ++} ++ ++int ++shift_operand (rtx op, enum machine_mode mode) ++{ ++ if (GET_CODE (op) == CONST_INT && SHIFT_INT (INTVAL (op))) ++ return 1; ++ ++ return register_operand (op, mode); ++} ++ ++int ++rdwrctl_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) ++{ ++ return GET_CODE (op) == CONST_INT && RDWRCTL_INT (INTVAL (op)); ++} ++ ++/* Return truth value of whether OP is a register or the constant 0. */ ++ ++int ++reg_or_0_operand (rtx op, enum machine_mode mode) ++{ ++ switch (GET_CODE (op)) ++ { ++ case CONST_INT: ++ return INTVAL (op) == 0; ++ ++ case CONST_DOUBLE: ++ return op == CONST0_RTX (mode); ++ ++ default: ++ break; ++ } ++ ++ return register_operand (op, mode); ++} ++ ++ ++int ++equality_op (rtx op, enum machine_mode mode) ++{ ++ if (mode != GET_MODE (op)) ++ return 0; ++ ++ return GET_CODE (op) == EQ || GET_CODE (op) == NE; ++} ++ ++int ++custom_insn_opcode (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) ++{ ++ return GET_CODE (op) == CONST_INT && CUSTOM_INSN_OPCODE (INTVAL (op)); ++} ++ ++ ++ ++ ++ ++ ++ ++/***************************************************************************** ++** ++** instruction scheduler ++** ++*****************************************************************************/ ++static int ++nios2_use_dfa_pipeline_interface () ++{ ++ return 1; ++} ++ ++ ++static int ++nios2_issue_rate () ++{ ++#ifdef MAX_DFA_ISSUE_RATE ++ return MAX_DFA_ISSUE_RATE; ++#else ++ return 1; ++#endif ++} ++ ++ ++const char * ++asm_output_opcode (FILE *file ATTRIBUTE_UNUSED, ++ const char *ptr ATTRIBUTE_UNUSED) ++{ ++ const char *p; ++ ++ p = ptr; ++ return ptr; ++} ++ ++ ++ ++/***************************************************************************** ++** ++** function arguments ++** ++*****************************************************************************/ ++ ++void ++init_cumulative_args (CUMULATIVE_ARGS *cum, ++ tree fntype ATTRIBUTE_UNUSED, ++ rtx libname ATTRIBUTE_UNUSED, ++ tree fndecl ATTRIBUTE_UNUSED, ++ int n_named_args ATTRIBUTE_UNUSED) ++{ ++ cum->regs_used = 0; ++} ++ ++ ++/* Update the data in CUM to advance over an argument ++ of mode MODE and data type TYPE. ++ (TYPE is null for libcalls where that information may not be available.) */ ++ ++void ++function_arg_advance (CUMULATIVE_ARGS *cum, enum machine_mode mode, ++ tree type ATTRIBUTE_UNUSED, int named ATTRIBUTE_UNUSED) ++{ ++ HOST_WIDE_INT param_size; ++ ++ if (mode == BLKmode) ++ { ++ param_size = int_size_in_bytes (type); ++ if (param_size < 0) ++ internal_error ++ ("Do not know how to handle large structs or variable length types"); ++ } ++ else ++ { ++ param_size = GET_MODE_SIZE (mode); ++ } ++ ++ /* convert to words (round up) */ ++ param_size = (3 + param_size) / 4; ++ ++ if (cum->regs_used + param_size > NUM_ARG_REGS) ++ { ++ cum->regs_used = NUM_ARG_REGS; ++ } ++ else ++ { ++ cum->regs_used += param_size; ++ } ++ ++ return; ++} ++ ++/* Define where to put the arguments to a function. Value is zero to ++ push the argument on the stack, or a hard register in which to ++ store the argument. ++ ++ MODE is the argument's machine mode. ++ TYPE is the data type of the argument (as a tree). ++ This is null for libcalls where that information may ++ not be available. ++ CUM is a variable of type CUMULATIVE_ARGS which gives info about ++ the preceding args and about the function being called. ++ NAMED is nonzero if this argument is a named parameter ++ (otherwise it is an extra parameter matching an ellipsis). */ ++rtx ++function_arg (const CUMULATIVE_ARGS *cum, enum machine_mode mode, ++ tree type ATTRIBUTE_UNUSED, int named ATTRIBUTE_UNUSED) ++{ ++ rtx return_rtx = NULL_RTX; ++ ++ if (cum->regs_used < NUM_ARG_REGS) ++ { ++ return_rtx = gen_rtx_REG (mode, FIRST_ARG_REGNO + cum->regs_used); ++ } ++ ++ return return_rtx; ++} ++ ++int ++function_arg_partial_nregs (const CUMULATIVE_ARGS *cum, ++ enum machine_mode mode, tree type, ++ int named ATTRIBUTE_UNUSED) ++{ ++ HOST_WIDE_INT param_size; ++ ++ if (mode == BLKmode) ++ { ++ param_size = int_size_in_bytes (type); ++ if (param_size < 0) ++ internal_error ++ ("Do not know how to handle large structs or variable length types"); ++ } ++ else ++ { ++ param_size = GET_MODE_SIZE (mode); ++ } ++ ++ /* convert to words (round up) */ ++ param_size = (3 + param_size) / 4; ++ ++ if (cum->regs_used < NUM_ARG_REGS ++ && cum->regs_used + param_size > NUM_ARG_REGS) ++ { ++ return NUM_ARG_REGS - cum->regs_used; ++ } ++ else ++ { ++ return 0; ++ } ++} ++ ++ ++int ++nios2_return_in_memory (tree type) ++{ ++ int res = ((int_size_in_bytes (type) > (2 * UNITS_PER_WORD)) ++ || (int_size_in_bytes (type) == -1)); ++ ++ return res; ++} ++ ++/* ??? It may be possible to eliminate the copyback and implement ++ my own va_arg type, but that is more work for now. */ ++int ++nios2_setup_incoming_varargs (const CUMULATIVE_ARGS *cum, ++ enum machine_mode mode, tree type, ++ int no_rtl) ++{ ++ CUMULATIVE_ARGS local_cum; ++ int regs_to_push; ++ ++ local_cum = *cum; ++ FUNCTION_ARG_ADVANCE (local_cum, mode, type, 1); ++ ++ regs_to_push = NUM_ARG_REGS - local_cum.regs_used; ++ ++ if (!no_rtl) ++ { ++ if (regs_to_push > 0) ++ { ++ rtx ptr, mem; ++ ++ ptr = virtual_incoming_args_rtx; ++ mem = gen_rtx_MEM (BLKmode, ptr); ++ ++ /* va_arg is an array access in this case, which causes ++ it to get MEM_IN_STRUCT_P set. We must set it here ++ so that the insn scheduler won't assume that these ++ stores can't possibly overlap with the va_arg loads. */ ++ MEM_SET_IN_STRUCT_P (mem, 1); ++ ++ emit_insn (gen_blockage ()); ++ move_block_from_reg (local_cum.regs_used + FIRST_ARG_REGNO, mem, ++ regs_to_push); ++ emit_insn (gen_blockage ()); ++ } ++ } ++ ++ return regs_to_push * UNITS_PER_WORD; ++ ++} ++ ++ ++ ++/***************************************************************************** ++** ++** builtins ++** ++** This method for handling builtins is from CSP where _many_ more types of ++** expanders have already been written. Check there first before writing ++** new ones. ++** ++*****************************************************************************/ ++ ++enum nios2_builtins ++{ ++ NIOS2_BUILTIN_LDBIO, ++ NIOS2_BUILTIN_LDBUIO, ++ NIOS2_BUILTIN_LDHIO, ++ NIOS2_BUILTIN_LDHUIO, ++ NIOS2_BUILTIN_LDWIO, ++ NIOS2_BUILTIN_STBIO, ++ NIOS2_BUILTIN_STHIO, ++ NIOS2_BUILTIN_STWIO, ++ NIOS2_BUILTIN_SYNC, ++ NIOS2_BUILTIN_RDCTL, ++ NIOS2_BUILTIN_WRCTL, ++ ++ NIOS2_BUILTIN_CUSTOM_N, ++ NIOS2_BUILTIN_CUSTOM_NI, ++ NIOS2_BUILTIN_CUSTOM_NF, ++ NIOS2_BUILTIN_CUSTOM_NP, ++ NIOS2_BUILTIN_CUSTOM_NII, ++ NIOS2_BUILTIN_CUSTOM_NIF, ++ NIOS2_BUILTIN_CUSTOM_NIP, ++ NIOS2_BUILTIN_CUSTOM_NFI, ++ NIOS2_BUILTIN_CUSTOM_NFF, ++ NIOS2_BUILTIN_CUSTOM_NFP, ++ NIOS2_BUILTIN_CUSTOM_NPI, ++ NIOS2_BUILTIN_CUSTOM_NPF, ++ NIOS2_BUILTIN_CUSTOM_NPP, ++ NIOS2_BUILTIN_CUSTOM_IN, ++ NIOS2_BUILTIN_CUSTOM_INI, ++ NIOS2_BUILTIN_CUSTOM_INF, ++ NIOS2_BUILTIN_CUSTOM_INP, ++ NIOS2_BUILTIN_CUSTOM_INII, ++ NIOS2_BUILTIN_CUSTOM_INIF, ++ NIOS2_BUILTIN_CUSTOM_INIP, ++ NIOS2_BUILTIN_CUSTOM_INFI, ++ NIOS2_BUILTIN_CUSTOM_INFF, ++ NIOS2_BUILTIN_CUSTOM_INFP, ++ NIOS2_BUILTIN_CUSTOM_INPI, ++ NIOS2_BUILTIN_CUSTOM_INPF, ++ NIOS2_BUILTIN_CUSTOM_INPP, ++ NIOS2_BUILTIN_CUSTOM_FN, ++ NIOS2_BUILTIN_CUSTOM_FNI, ++ NIOS2_BUILTIN_CUSTOM_FNF, ++ NIOS2_BUILTIN_CUSTOM_FNP, ++ NIOS2_BUILTIN_CUSTOM_FNII, ++ NIOS2_BUILTIN_CUSTOM_FNIF, ++ NIOS2_BUILTIN_CUSTOM_FNIP, ++ NIOS2_BUILTIN_CUSTOM_FNFI, ++ NIOS2_BUILTIN_CUSTOM_FNFF, ++ NIOS2_BUILTIN_CUSTOM_FNFP, ++ NIOS2_BUILTIN_CUSTOM_FNPI, ++ NIOS2_BUILTIN_CUSTOM_FNPF, ++ NIOS2_BUILTIN_CUSTOM_FNPP, ++ NIOS2_BUILTIN_CUSTOM_PN, ++ NIOS2_BUILTIN_CUSTOM_PNI, ++ NIOS2_BUILTIN_CUSTOM_PNF, ++ NIOS2_BUILTIN_CUSTOM_PNP, ++ NIOS2_BUILTIN_CUSTOM_PNII, ++ NIOS2_BUILTIN_CUSTOM_PNIF, ++ NIOS2_BUILTIN_CUSTOM_PNIP, ++ NIOS2_BUILTIN_CUSTOM_PNFI, ++ NIOS2_BUILTIN_CUSTOM_PNFF, ++ NIOS2_BUILTIN_CUSTOM_PNFP, ++ NIOS2_BUILTIN_CUSTOM_PNPI, ++ NIOS2_BUILTIN_CUSTOM_PNPF, ++ NIOS2_BUILTIN_CUSTOM_PNPP, ++ ++ ++ LIM_NIOS2_BUILTINS ++}; ++ ++struct builtin_description ++{ ++ const enum insn_code icode; ++ const char *const name; ++ const enum nios2_builtins code; ++ const tree *type; ++ rtx (* expander) PARAMS ((const struct builtin_description *, ++ tree, rtx, rtx, enum machine_mode, int)); ++}; ++ ++static rtx nios2_expand_STXIO (const struct builtin_description *, ++ tree, rtx, rtx, enum machine_mode, int); ++static rtx nios2_expand_LDXIO (const struct builtin_description *, ++ tree, rtx, rtx, enum machine_mode, int); ++static rtx nios2_expand_sync (const struct builtin_description *, ++ tree, rtx, rtx, enum machine_mode, int); ++static rtx nios2_expand_rdctl (const struct builtin_description *, ++ tree, rtx, rtx, enum machine_mode, int); ++static rtx nios2_expand_wrctl (const struct builtin_description *, ++ tree, rtx, rtx, enum machine_mode, int); ++ ++static rtx nios2_expand_custom_n (const struct builtin_description *, ++ tree, rtx, rtx, enum machine_mode, int); ++static rtx nios2_expand_custom_Xn (const struct builtin_description *, ++ tree, rtx, rtx, enum machine_mode, int); ++static rtx nios2_expand_custom_nX (const struct builtin_description *, ++ tree, rtx, rtx, enum machine_mode, int); ++static rtx nios2_expand_custom_XnX (const struct builtin_description *, ++ tree, rtx, rtx, enum machine_mode, int); ++static rtx nios2_expand_custom_nXX (const struct builtin_description *, ++ tree, rtx, rtx, enum machine_mode, int); ++static rtx nios2_expand_custom_XnXX (const struct builtin_description *, ++ tree, rtx, rtx, enum machine_mode, int); ++ ++static tree endlink; ++ ++/* int fn (volatile const void *) ++ */ ++static tree int_ftype_volatile_const_void_p; ++ ++/* int fn (int) ++ */ ++static tree int_ftype_int; ++ ++/* void fn (int, int) ++ */ ++static tree void_ftype_int_int; ++ ++/* void fn (volatile void *, int) ++ */ ++static tree void_ftype_volatile_void_p_int; ++ ++/* void fn (void) ++ */ ++static tree void_ftype_void; ++ ++static tree custom_n; ++static tree custom_ni; ++static tree custom_nf; ++static tree custom_np; ++static tree custom_nii; ++static tree custom_nif; ++static tree custom_nip; ++static tree custom_nfi; ++static tree custom_nff; ++static tree custom_nfp; ++static tree custom_npi; ++static tree custom_npf; ++static tree custom_npp; ++static tree custom_in; ++static tree custom_ini; ++static tree custom_inf; ++static tree custom_inp; ++static tree custom_inii; ++static tree custom_inif; ++static tree custom_inip; ++static tree custom_infi; ++static tree custom_inff; ++static tree custom_infp; ++static tree custom_inpi; ++static tree custom_inpf; ++static tree custom_inpp; ++static tree custom_fn; ++static tree custom_fni; ++static tree custom_fnf; ++static tree custom_fnp; ++static tree custom_fnii; ++static tree custom_fnif; ++static tree custom_fnip; ++static tree custom_fnfi; ++static tree custom_fnff; ++static tree custom_fnfp; ++static tree custom_fnpi; ++static tree custom_fnpf; ++static tree custom_fnpp; ++static tree custom_pn; ++static tree custom_pni; ++static tree custom_pnf; ++static tree custom_pnp; ++static tree custom_pnii; ++static tree custom_pnif; ++static tree custom_pnip; ++static tree custom_pnfi; ++static tree custom_pnff; ++static tree custom_pnfp; ++static tree custom_pnpi; ++static tree custom_pnpf; ++static tree custom_pnpp; ++ ++ ++static const struct builtin_description bdesc[] = { ++ {CODE_FOR_ldbio, "__builtin_ldbio", NIOS2_BUILTIN_LDBIO, &int_ftype_volatile_const_void_p, nios2_expand_LDXIO}, ++ {CODE_FOR_ldbuio, "__builtin_ldbuio", NIOS2_BUILTIN_LDBUIO, &int_ftype_volatile_const_void_p, nios2_expand_LDXIO}, ++ {CODE_FOR_ldhio, "__builtin_ldhio", NIOS2_BUILTIN_LDHIO, &int_ftype_volatile_const_void_p, nios2_expand_LDXIO}, ++ {CODE_FOR_ldhuio, "__builtin_ldhuio", NIOS2_BUILTIN_LDHUIO, &int_ftype_volatile_const_void_p, nios2_expand_LDXIO}, ++ {CODE_FOR_ldwio, "__builtin_ldwio", NIOS2_BUILTIN_LDWIO, &int_ftype_volatile_const_void_p, nios2_expand_LDXIO}, ++ ++ {CODE_FOR_stbio, "__builtin_stbio", NIOS2_BUILTIN_STBIO, &void_ftype_volatile_void_p_int, nios2_expand_STXIO}, ++ {CODE_FOR_sthio, "__builtin_sthio", NIOS2_BUILTIN_STHIO, &void_ftype_volatile_void_p_int, nios2_expand_STXIO}, ++ {CODE_FOR_stwio, "__builtin_stwio", NIOS2_BUILTIN_STWIO, &void_ftype_volatile_void_p_int, nios2_expand_STXIO}, ++ ++ {CODE_FOR_sync, "__builtin_sync", NIOS2_BUILTIN_SYNC, &void_ftype_void, nios2_expand_sync}, ++ {CODE_FOR_rdctl, "__builtin_rdctl", NIOS2_BUILTIN_RDCTL, &int_ftype_int, nios2_expand_rdctl}, ++ {CODE_FOR_wrctl, "__builtin_wrctl", NIOS2_BUILTIN_WRCTL, &void_ftype_int_int, nios2_expand_wrctl}, ++ ++ {CODE_FOR_custom_n, "__builtin_custom_n", NIOS2_BUILTIN_CUSTOM_N, &custom_n, nios2_expand_custom_n}, ++ {CODE_FOR_custom_ni, "__builtin_custom_ni", NIOS2_BUILTIN_CUSTOM_NI, &custom_ni, nios2_expand_custom_nX}, ++ {CODE_FOR_custom_nf, "__builtin_custom_nf", NIOS2_BUILTIN_CUSTOM_NF, &custom_nf, nios2_expand_custom_nX}, ++ {CODE_FOR_custom_np, "__builtin_custom_np", NIOS2_BUILTIN_CUSTOM_NP, &custom_np, nios2_expand_custom_nX}, ++ {CODE_FOR_custom_nii, "__builtin_custom_nii", NIOS2_BUILTIN_CUSTOM_NII, &custom_nii, nios2_expand_custom_nXX}, ++ {CODE_FOR_custom_nif, "__builtin_custom_nif", NIOS2_BUILTIN_CUSTOM_NIF, &custom_nif, nios2_expand_custom_nXX}, ++ {CODE_FOR_custom_nip, "__builtin_custom_nip", NIOS2_BUILTIN_CUSTOM_NIP, &custom_nip, nios2_expand_custom_nXX}, ++ {CODE_FOR_custom_nfi, "__builtin_custom_nfi", NIOS2_BUILTIN_CUSTOM_NFI, &custom_nfi, nios2_expand_custom_nXX}, ++ {CODE_FOR_custom_nff, "__builtin_custom_nff", NIOS2_BUILTIN_CUSTOM_NFF, &custom_nff, nios2_expand_custom_nXX}, ++ {CODE_FOR_custom_nfp, "__builtin_custom_nfp", NIOS2_BUILTIN_CUSTOM_NFP, &custom_nfp, nios2_expand_custom_nXX}, ++ {CODE_FOR_custom_npi, "__builtin_custom_npi", NIOS2_BUILTIN_CUSTOM_NPI, &custom_npi, nios2_expand_custom_nXX}, ++ {CODE_FOR_custom_npf, "__builtin_custom_npf", NIOS2_BUILTIN_CUSTOM_NPF, &custom_npf, nios2_expand_custom_nXX}, ++ {CODE_FOR_custom_npp, "__builtin_custom_npp", NIOS2_BUILTIN_CUSTOM_NPP, &custom_npp, nios2_expand_custom_nXX}, ++ {CODE_FOR_custom_in, "__builtin_custom_in", NIOS2_BUILTIN_CUSTOM_IN, &custom_in, nios2_expand_custom_Xn}, ++ {CODE_FOR_custom_ini, "__builtin_custom_ini", NIOS2_BUILTIN_CUSTOM_INI, &custom_ini, nios2_expand_custom_XnX}, ++ {CODE_FOR_custom_inf, "__builtin_custom_inf", NIOS2_BUILTIN_CUSTOM_INF, &custom_inf, nios2_expand_custom_XnX}, ++ {CODE_FOR_custom_inp, "__builtin_custom_inp", NIOS2_BUILTIN_CUSTOM_INP, &custom_inp, nios2_expand_custom_XnX}, ++ {CODE_FOR_custom_inii, "__builtin_custom_inii", NIOS2_BUILTIN_CUSTOM_INII, &custom_inii, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_inif, "__builtin_custom_inif", NIOS2_BUILTIN_CUSTOM_INIF, &custom_inif, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_inip, "__builtin_custom_inip", NIOS2_BUILTIN_CUSTOM_INIP, &custom_inip, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_infi, "__builtin_custom_infi", NIOS2_BUILTIN_CUSTOM_INFI, &custom_infi, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_inff, "__builtin_custom_inff", NIOS2_BUILTIN_CUSTOM_INFF, &custom_inff, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_infp, "__builtin_custom_infp", NIOS2_BUILTIN_CUSTOM_INFP, &custom_infp, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_inpi, "__builtin_custom_inpi", NIOS2_BUILTIN_CUSTOM_INPI, &custom_inpi, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_inpf, "__builtin_custom_inpf", NIOS2_BUILTIN_CUSTOM_INPF, &custom_inpf, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_inpp, "__builtin_custom_inpp", NIOS2_BUILTIN_CUSTOM_INPP, &custom_inpp, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_fn, "__builtin_custom_fn", NIOS2_BUILTIN_CUSTOM_FN, &custom_fn, nios2_expand_custom_Xn}, ++ {CODE_FOR_custom_fni, "__builtin_custom_fni", NIOS2_BUILTIN_CUSTOM_FNI, &custom_fni, nios2_expand_custom_XnX}, ++ {CODE_FOR_custom_fnf, "__builtin_custom_fnf", NIOS2_BUILTIN_CUSTOM_FNF, &custom_fnf, nios2_expand_custom_XnX}, ++ {CODE_FOR_custom_fnp, "__builtin_custom_fnp", NIOS2_BUILTIN_CUSTOM_FNP, &custom_fnp, nios2_expand_custom_XnX}, ++ {CODE_FOR_custom_fnii, "__builtin_custom_fnii", NIOS2_BUILTIN_CUSTOM_FNII, &custom_fnii, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_fnif, "__builtin_custom_fnif", NIOS2_BUILTIN_CUSTOM_FNIF, &custom_fnif, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_fnip, "__builtin_custom_fnip", NIOS2_BUILTIN_CUSTOM_FNIP, &custom_fnip, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_fnfi, "__builtin_custom_fnfi", NIOS2_BUILTIN_CUSTOM_FNFI, &custom_fnfi, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_fnff, "__builtin_custom_fnff", NIOS2_BUILTIN_CUSTOM_FNFF, &custom_fnff, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_fnfp, "__builtin_custom_fnfp", NIOS2_BUILTIN_CUSTOM_FNFP, &custom_fnfp, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_fnpi, "__builtin_custom_fnpi", NIOS2_BUILTIN_CUSTOM_FNPI, &custom_fnpi, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_fnpf, "__builtin_custom_fnpf", NIOS2_BUILTIN_CUSTOM_FNPF, &custom_fnpf, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_fnpp, "__builtin_custom_fnpp", NIOS2_BUILTIN_CUSTOM_FNPP, &custom_fnpp, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_pn, "__builtin_custom_pn", NIOS2_BUILTIN_CUSTOM_PN, &custom_pn, nios2_expand_custom_Xn}, ++ {CODE_FOR_custom_pni, "__builtin_custom_pni", NIOS2_BUILTIN_CUSTOM_PNI, &custom_pni, nios2_expand_custom_XnX}, ++ {CODE_FOR_custom_pnf, "__builtin_custom_pnf", NIOS2_BUILTIN_CUSTOM_PNF, &custom_pnf, nios2_expand_custom_XnX}, ++ {CODE_FOR_custom_pnp, "__builtin_custom_pnp", NIOS2_BUILTIN_CUSTOM_PNP, &custom_pnp, nios2_expand_custom_XnX}, ++ {CODE_FOR_custom_pnii, "__builtin_custom_pnii", NIOS2_BUILTIN_CUSTOM_PNII, &custom_pnii, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_pnif, "__builtin_custom_pnif", NIOS2_BUILTIN_CUSTOM_PNIF, &custom_pnif, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_pnip, "__builtin_custom_pnip", NIOS2_BUILTIN_CUSTOM_PNIP, &custom_pnip, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_pnfi, "__builtin_custom_pnfi", NIOS2_BUILTIN_CUSTOM_PNFI, &custom_pnfi, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_pnff, "__builtin_custom_pnff", NIOS2_BUILTIN_CUSTOM_PNFF, &custom_pnff, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_pnfp, "__builtin_custom_pnfp", NIOS2_BUILTIN_CUSTOM_PNFP, &custom_pnfp, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_pnpi, "__builtin_custom_pnpi", NIOS2_BUILTIN_CUSTOM_PNPI, &custom_pnpi, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_pnpf, "__builtin_custom_pnpf", NIOS2_BUILTIN_CUSTOM_PNPF, &custom_pnpf, nios2_expand_custom_XnXX}, ++ {CODE_FOR_custom_pnpp, "__builtin_custom_pnpp", NIOS2_BUILTIN_CUSTOM_PNPP, &custom_pnpp, nios2_expand_custom_XnXX}, ++ ++ ++ {0, 0, 0, 0, 0}, ++}; ++ ++/* This does not have a closing bracket on purpose (see use) */ ++#define def_param(TYPE) \ ++ tree_cons (NULL_TREE, TYPE, ++ ++static void ++nios2_init_builtins () ++{ ++ const struct builtin_description *d; ++ ++ ++ endlink = void_list_node; ++ ++ /* Special indenting here because one of the brackets is in def_param */ ++ /* *INDENT-OFF* */ ++ ++ /* int fn (volatile const void *) ++ */ ++ int_ftype_volatile_const_void_p ++ = build_function_type (integer_type_node, ++ def_param (build_qualified_type (ptr_type_node, ++ TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE)) ++ endlink)); ++ ++ ++ /* void fn (volatile void *, int) ++ */ ++ void_ftype_volatile_void_p_int ++ = build_function_type (void_type_node, ++ def_param (build_qualified_type (ptr_type_node, ++ TYPE_QUAL_VOLATILE)) ++ def_param (integer_type_node) ++ endlink))); ++ ++ /* void fn (void) ++ */ ++ void_ftype_void ++ = build_function_type (void_type_node, ++ endlink); ++ ++ /* int fn (int) ++ */ ++ int_ftype_int ++ = build_function_type (integer_type_node, ++ def_param (integer_type_node) ++ endlink)); ++ ++ /* void fn (int, int) ++ */ ++ void_ftype_int_int ++ = build_function_type (void_type_node, ++ def_param (integer_type_node) ++ def_param (integer_type_node) ++ endlink))); ++ ++ ++#define CUSTOM_NUM def_param (integer_type_node) ++ ++ custom_n ++ = build_function_type (void_type_node, ++ CUSTOM_NUM ++ endlink)); ++ custom_ni ++ = build_function_type (void_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ endlink))); ++ custom_nf ++ = build_function_type (void_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ endlink))); ++ custom_np ++ = build_function_type (void_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ endlink))); ++ custom_nii ++ = build_function_type (void_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ def_param (integer_type_node) ++ endlink)))); ++ custom_nif ++ = build_function_type (void_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ def_param (float_type_node) ++ endlink)))); ++ custom_nip ++ = build_function_type (void_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ def_param (ptr_type_node) ++ endlink)))); ++ custom_nfi ++ = build_function_type (void_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ def_param (integer_type_node) ++ endlink)))); ++ custom_nff ++ = build_function_type (void_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ def_param (float_type_node) ++ endlink)))); ++ custom_nfp ++ = build_function_type (void_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ def_param (ptr_type_node) ++ endlink)))); ++ custom_npi ++ = build_function_type (void_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ def_param (integer_type_node) ++ endlink)))); ++ custom_npf ++ = build_function_type (void_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ def_param (float_type_node) ++ endlink)))); ++ custom_npp ++ = build_function_type (void_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ def_param (ptr_type_node) ++ endlink)))); ++ ++ custom_in ++ = build_function_type (integer_type_node, ++ CUSTOM_NUM ++ endlink)); ++ custom_ini ++ = build_function_type (integer_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ endlink))); ++ custom_inf ++ = build_function_type (integer_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ endlink))); ++ custom_inp ++ = build_function_type (integer_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ endlink))); ++ custom_inii ++ = build_function_type (integer_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ def_param (integer_type_node) ++ endlink)))); ++ custom_inif ++ = build_function_type (integer_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ def_param (float_type_node) ++ endlink)))); ++ custom_inip ++ = build_function_type (integer_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ def_param (ptr_type_node) ++ endlink)))); ++ custom_infi ++ = build_function_type (integer_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ def_param (integer_type_node) ++ endlink)))); ++ custom_inff ++ = build_function_type (integer_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ def_param (float_type_node) ++ endlink)))); ++ custom_infp ++ = build_function_type (integer_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ def_param (ptr_type_node) ++ endlink)))); ++ custom_inpi ++ = build_function_type (integer_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ def_param (integer_type_node) ++ endlink)))); ++ custom_inpf ++ = build_function_type (integer_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ def_param (float_type_node) ++ endlink)))); ++ custom_inpp ++ = build_function_type (integer_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ def_param (ptr_type_node) ++ endlink)))); ++ ++ custom_fn ++ = build_function_type (float_type_node, ++ CUSTOM_NUM ++ endlink)); ++ custom_fni ++ = build_function_type (float_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ endlink))); ++ custom_fnf ++ = build_function_type (float_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ endlink))); ++ custom_fnp ++ = build_function_type (float_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ endlink))); ++ custom_fnii ++ = build_function_type (float_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ def_param (integer_type_node) ++ endlink)))); ++ custom_fnif ++ = build_function_type (float_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ def_param (float_type_node) ++ endlink)))); ++ custom_fnip ++ = build_function_type (float_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ def_param (ptr_type_node) ++ endlink)))); ++ custom_fnfi ++ = build_function_type (float_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ def_param (integer_type_node) ++ endlink)))); ++ custom_fnff ++ = build_function_type (float_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ def_param (float_type_node) ++ endlink)))); ++ custom_fnfp ++ = build_function_type (float_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ def_param (ptr_type_node) ++ endlink)))); ++ custom_fnpi ++ = build_function_type (float_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ def_param (integer_type_node) ++ endlink)))); ++ custom_fnpf ++ = build_function_type (float_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ def_param (float_type_node) ++ endlink)))); ++ custom_fnpp ++ = build_function_type (float_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ def_param (ptr_type_node) ++ endlink)))); ++ ++ ++ custom_pn ++ = build_function_type (ptr_type_node, ++ CUSTOM_NUM ++ endlink)); ++ custom_pni ++ = build_function_type (ptr_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ endlink))); ++ custom_pnf ++ = build_function_type (ptr_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ endlink))); ++ custom_pnp ++ = build_function_type (ptr_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ endlink))); ++ custom_pnii ++ = build_function_type (ptr_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ def_param (integer_type_node) ++ endlink)))); ++ custom_pnif ++ = build_function_type (ptr_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ def_param (float_type_node) ++ endlink)))); ++ custom_pnip ++ = build_function_type (ptr_type_node, ++ CUSTOM_NUM ++ def_param (integer_type_node) ++ def_param (ptr_type_node) ++ endlink)))); ++ custom_pnfi ++ = build_function_type (ptr_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ def_param (integer_type_node) ++ endlink)))); ++ custom_pnff ++ = build_function_type (ptr_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ def_param (float_type_node) ++ endlink)))); ++ custom_pnfp ++ = build_function_type (ptr_type_node, ++ CUSTOM_NUM ++ def_param (float_type_node) ++ def_param (ptr_type_node) ++ endlink)))); ++ custom_pnpi ++ = build_function_type (ptr_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ def_param (integer_type_node) ++ endlink)))); ++ custom_pnpf ++ = build_function_type (ptr_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ def_param (float_type_node) ++ endlink)))); ++ custom_pnpp ++ = build_function_type (ptr_type_node, ++ CUSTOM_NUM ++ def_param (ptr_type_node) ++ def_param (ptr_type_node) ++ endlink)))); ++ ++ ++ ++ /* *INDENT-ON* */ ++ ++ ++ for (d = bdesc; d->name; d++) ++ { ++ builtin_function (d->name, *d->type, d->code, ++ BUILT_IN_MD, NULL, NULL); ++ } ++} ++ ++/* Expand an expression EXP that calls a built-in function, ++ with result going to TARGET if that's convenient ++ (and in mode MODE if that's convenient). ++ SUBTARGET may be used as the target for computing one of EXP's operands. ++ IGNORE is nonzero if the value is to be ignored. */ ++ ++static rtx ++nios2_expand_builtin (tree exp, rtx target, rtx subtarget, ++ enum machine_mode mode, int ignore) ++{ ++ const struct builtin_description *d; ++ tree fndecl = TREE_OPERAND (TREE_OPERAND (exp, 0), 0); ++ unsigned int fcode = DECL_FUNCTION_CODE (fndecl); ++ ++ for (d = bdesc; d->name; d++) ++ if (d->code == fcode) ++ return (d->expander) (d, exp, target, subtarget, mode, ignore); ++ ++ /* we should have seen one of the functins we registered */ ++ abort (); ++} ++ ++static rtx nios2_create_target (const struct builtin_description *, rtx); ++ ++ ++static rtx ++nios2_create_target (const struct builtin_description *d, rtx target) ++{ ++ if (!target ++ || !(*insn_data[d->icode].operand[0].predicate) (target, ++ insn_data[d->icode].operand[0].mode)) ++ { ++ target = gen_reg_rtx (insn_data[d->icode].operand[0].mode); ++ } ++ ++ return target; ++} ++ ++ ++static rtx nios2_extract_opcode (const struct builtin_description *, int, tree); ++static rtx nios2_extract_operand (const struct builtin_description *, int, int, tree); ++ ++static rtx ++nios2_extract_opcode (const struct builtin_description *d, int op, tree arglist) ++{ ++ enum machine_mode mode = insn_data[d->icode].operand[op].mode; ++ tree arg = TREE_VALUE (arglist); ++ rtx opcode = expand_expr (arg, NULL_RTX, mode, 0); ++ opcode = protect_from_queue (opcode, 0); ++ ++ if (!(*insn_data[d->icode].operand[op].predicate) (opcode, mode)) ++ error ("Custom instruction opcode must be compile time constant in the range 0-255 for %s", d->name); ++ ++ return opcode; ++} ++ ++static rtx ++nios2_extract_operand (const struct builtin_description *d, int op, int argnum, tree arglist) ++{ ++ enum machine_mode mode = insn_data[d->icode].operand[op].mode; ++ tree arg = TREE_VALUE (arglist); ++ rtx operand = expand_expr (arg, NULL_RTX, mode, 0); ++ operand = protect_from_queue (operand, 0); ++ ++ if (!(*insn_data[d->icode].operand[op].predicate) (operand, mode)) ++ operand = copy_to_mode_reg (mode, operand); ++ ++ /* ??? Better errors would be nice */ ++ if (!(*insn_data[d->icode].operand[op].predicate) (operand, mode)) ++ error ("Invalid argument %d to %s", argnum, d->name); ++ ++ return operand; ++} ++ ++ ++static rtx ++nios2_expand_custom_n (const struct builtin_description *d, tree exp, ++ rtx target ATTRIBUTE_UNUSED, rtx subtarget ATTRIBUTE_UNUSED, ++ enum machine_mode mode ATTRIBUTE_UNUSED, int ignore ATTRIBUTE_UNUSED) ++{ ++ tree arglist = TREE_OPERAND (exp, 1); ++ rtx pat; ++ rtx opcode; ++ ++ /* custom_n should have exactly one operand */ ++ if (insn_data[d->icode].n_operands != 1) ++ abort (); ++ ++ opcode = nios2_extract_opcode (d, 0, arglist); ++ ++ pat = GEN_FCN (d->icode) (opcode); ++ if (!pat) ++ return 0; ++ emit_insn (pat); ++ return 0; ++} ++ ++static rtx ++nios2_expand_custom_Xn (const struct builtin_description *d, tree exp, ++ rtx target, rtx subtarget ATTRIBUTE_UNUSED, ++ enum machine_mode mode ATTRIBUTE_UNUSED, ++ int ignore ATTRIBUTE_UNUSED) ++{ ++ tree arglist = TREE_OPERAND (exp, 1); ++ rtx pat; ++ rtx opcode; ++ ++ /* custom_Xn should have exactly two operands */ ++ if (insn_data[d->icode].n_operands != 2) ++ abort (); ++ ++ target = nios2_create_target (d, target); ++ opcode = nios2_extract_opcode (d, 1, arglist); ++ ++ pat = GEN_FCN (d->icode) (target, opcode); ++ if (!pat) ++ return 0; ++ emit_insn (pat); ++ return target; ++} ++ ++static rtx ++nios2_expand_custom_nX (const struct builtin_description *d, tree exp, ++ rtx target ATTRIBUTE_UNUSED, rtx subtarget ATTRIBUTE_UNUSED, ++ enum machine_mode mode ATTRIBUTE_UNUSED, int ignore ATTRIBUTE_UNUSED) ++{ ++ tree arglist = TREE_OPERAND (exp, 1); ++ rtx pat; ++ rtx opcode; ++ rtx operands[1]; ++ int i; ++ ++ ++ /* custom_nX should have exactly two operands */ ++ if (insn_data[d->icode].n_operands != 2) ++ abort (); ++ ++ opcode = nios2_extract_opcode (d, 0, arglist); ++ for (i = 0; i < 1; i++) ++ { ++ arglist = TREE_CHAIN (arglist); ++ operands[i] = nios2_extract_operand (d, i + 1, i + 1, arglist); ++ } ++ ++ pat = GEN_FCN (d->icode) (opcode, operands[0]); ++ if (!pat) ++ return 0; ++ emit_insn (pat); ++ return 0; ++} ++ ++static rtx ++nios2_expand_custom_XnX (const struct builtin_description *d, tree exp, rtx target, ++ rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED, ++ int ignore ATTRIBUTE_UNUSED) ++{ ++ tree arglist = TREE_OPERAND (exp, 1); ++ rtx pat; ++ rtx opcode; ++ rtx operands[1]; ++ int i; ++ ++ /* custom_Xn should have exactly three operands */ ++ if (insn_data[d->icode].n_operands != 3) ++ abort (); ++ ++ target = nios2_create_target (d, target); ++ opcode = nios2_extract_opcode (d, 1, arglist); ++ ++ for (i = 0; i < 1; i++) ++ { ++ arglist = TREE_CHAIN (arglist); ++ operands[i] = nios2_extract_operand (d, i + 2, i + 1, arglist); ++ } ++ ++ pat = GEN_FCN (d->icode) (target, opcode, operands[0]); ++ ++ if (!pat) ++ return 0; ++ emit_insn (pat); ++ return target; ++} ++ ++static rtx ++nios2_expand_custom_nXX (const struct builtin_description *d, tree exp, rtx target ATTRIBUTE_UNUSED, ++ rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED, ++ int ignore ATTRIBUTE_UNUSED) ++{ ++ tree arglist = TREE_OPERAND (exp, 1); ++ rtx pat; ++ rtx opcode; ++ rtx operands[2]; ++ int i; ++ ++ ++ /* custom_nX should have exactly three operands */ ++ if (insn_data[d->icode].n_operands != 3) ++ abort (); ++ ++ opcode = nios2_extract_opcode (d, 0, arglist); ++ for (i = 0; i < 2; i++) ++ { ++ arglist = TREE_CHAIN (arglist); ++ operands[i] = nios2_extract_operand (d, i + 1, i + 1, arglist); ++ } ++ ++ pat = GEN_FCN (d->icode) (opcode, operands[0], operands[1]); ++ if (!pat) ++ return 0; ++ emit_insn (pat); ++ return 0; ++} ++ ++static rtx ++nios2_expand_custom_XnXX (const struct builtin_description *d, tree exp, rtx target, ++ rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED, ++ int ignore ATTRIBUTE_UNUSED) ++{ ++ tree arglist = TREE_OPERAND (exp, 1); ++ rtx pat; ++ rtx opcode; ++ rtx operands[2]; ++ int i; ++ ++ ++ /* custom_XnX should have exactly four operands */ ++ if (insn_data[d->icode].n_operands != 4) ++ abort (); ++ ++ target = nios2_create_target (d, target); ++ opcode = nios2_extract_opcode (d, 1, arglist); ++ for (i = 0; i < 2; i++) ++ { ++ arglist = TREE_CHAIN (arglist); ++ operands[i] = nios2_extract_operand (d, i + 2, i + 1, arglist); ++ } ++ ++ pat = GEN_FCN (d->icode) (target, opcode, operands[0], operands[1]); ++ ++ if (!pat) ++ return 0; ++ emit_insn (pat); ++ return target; ++} ++ ++ ++ ++static rtx ++nios2_expand_STXIO (const struct builtin_description *d, tree exp, rtx target ATTRIBUTE_UNUSED, ++ rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED, ++ int ignore ATTRIBUTE_UNUSED) ++{ ++ tree arglist = TREE_OPERAND (exp, 1); ++ rtx pat; ++ rtx store_dest, store_val; ++ enum insn_code icode = d->icode; ++ ++ /* stores should have exactly two operands */ ++ if (insn_data[icode].n_operands != 2) ++ abort (); ++ ++ /* process the destination of the store */ ++ { ++ enum machine_mode mode = insn_data[icode].operand[0].mode; ++ tree arg = TREE_VALUE (arglist); ++ store_dest = expand_expr (arg, NULL_RTX, VOIDmode, 0); ++ store_dest = protect_from_queue (store_dest, 0); ++ ++ store_dest = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, store_dest)); ++ ++ /* ??? Better errors would be nice */ ++ if (!(*insn_data[icode].operand[0].predicate) (store_dest, mode)) ++ error ("Invalid argument 1 to %s", d->name); ++ } ++ ++ ++ /* process the value to store */ ++ { ++ enum machine_mode mode = insn_data[icode].operand[1].mode; ++ tree arg = TREE_VALUE (TREE_CHAIN (arglist)); ++ store_val = expand_expr (arg, NULL_RTX, mode, 0); ++ store_val = protect_from_queue (store_val, 0); ++ ++ if (!(*insn_data[icode].operand[1].predicate) (store_val, mode)) ++ store_val = copy_to_mode_reg (mode, store_val); ++ ++ /* ??? Better errors would be nice */ ++ if (!(*insn_data[icode].operand[1].predicate) (store_val, mode)) ++ error ("Invalid argument 2 to %s", d->name); ++ } ++ ++ pat = GEN_FCN (d->icode) (store_dest, store_val); ++ if (!pat) ++ return 0; ++ emit_insn (pat); ++ return 0; ++} ++ ++ ++static rtx ++nios2_expand_LDXIO (const struct builtin_description * d, tree exp, rtx target, ++ rtx subtarget ATTRIBUTE_UNUSED, enum machine_mode mode ATTRIBUTE_UNUSED, ++ int ignore ATTRIBUTE_UNUSED) ++{ ++ tree arglist = TREE_OPERAND (exp, 1); ++ rtx pat; ++ rtx ld_src; ++ enum insn_code icode = d->icode; ++ ++ /* loads should have exactly two operands */ ++ if (insn_data[icode].n_operands != 2) ++ abort (); ++ ++ target = nios2_create_target (d, target); ++ ++ { ++ enum machine_mode mode = insn_data[icode].operand[1].mode; ++ tree arg = TREE_VALUE (arglist); ++ ld_src = expand_expr (arg, NULL_RTX, VOIDmode, 0); ++ ld_src = protect_from_queue (ld_src, 0); ++ ++ ld_src = gen_rtx_MEM (mode, copy_to_mode_reg (Pmode, ld_src)); ++ ++ /* ??? Better errors would be nice */ ++ if (!(*insn_data[icode].operand[1].predicate) (ld_src, mode)) ++ { ++ error ("Invalid argument 1 to %s", d->name); ++ } ++ } ++ ++ pat = GEN_FCN (d->icode) (target, ld_src); ++ if (!pat) ++ return 0; ++ emit_insn (pat); ++ return target; ++} ++ ++ ++static rtx ++nios2_expand_sync (const struct builtin_description * d ATTRIBUTE_UNUSED, ++ tree exp ATTRIBUTE_UNUSED, rtx target ATTRIBUTE_UNUSED, ++ rtx subtarget ATTRIBUTE_UNUSED, ++ enum machine_mode mode ATTRIBUTE_UNUSED, ++ int ignore ATTRIBUTE_UNUSED) ++{ ++ emit_insn (gen_sync ()); ++ return 0; ++} ++ ++static rtx ++nios2_expand_rdctl (const struct builtin_description * d ATTRIBUTE_UNUSED, ++ tree exp ATTRIBUTE_UNUSED, rtx target ATTRIBUTE_UNUSED, ++ rtx subtarget ATTRIBUTE_UNUSED, ++ enum machine_mode mode ATTRIBUTE_UNUSED, ++ int ignore ATTRIBUTE_UNUSED) ++{ ++ tree arglist = TREE_OPERAND (exp, 1); ++ rtx pat; ++ rtx rdctl_reg; ++ enum insn_code icode = d->icode; ++ ++ /* rdctl should have exactly two operands */ ++ if (insn_data[icode].n_operands != 2) ++ abort (); ++ ++ target = nios2_create_target (d, target); ++ ++ { ++ enum machine_mode mode = insn_data[icode].operand[1].mode; ++ tree arg = TREE_VALUE (arglist); ++ rdctl_reg = expand_expr (arg, NULL_RTX, VOIDmode, 0); ++ rdctl_reg = protect_from_queue (rdctl_reg, 0); ++ ++ if (!(*insn_data[icode].operand[1].predicate) (rdctl_reg, mode)) ++ { ++ error ("Control register number must be in range 0-31 for %s", d->name); ++ } ++ } ++ ++ pat = GEN_FCN (d->icode) (target, rdctl_reg); ++ if (!pat) ++ return 0; ++ emit_insn (pat); ++ return target; ++} ++ ++static rtx ++nios2_expand_wrctl (const struct builtin_description * d ATTRIBUTE_UNUSED, ++ tree exp ATTRIBUTE_UNUSED, rtx target ATTRIBUTE_UNUSED, ++ rtx subtarget ATTRIBUTE_UNUSED, ++ enum machine_mode mode ATTRIBUTE_UNUSED, ++ int ignore ATTRIBUTE_UNUSED) ++{ ++ tree arglist = TREE_OPERAND (exp, 1); ++ rtx pat; ++ rtx wrctl_reg, store_val; ++ enum insn_code icode = d->icode; ++ ++ /* stores should have exactly two operands */ ++ if (insn_data[icode].n_operands != 2) ++ abort (); ++ ++ /* process the destination of the store */ ++ { ++ enum machine_mode mode = insn_data[icode].operand[0].mode; ++ tree arg = TREE_VALUE (arglist); ++ wrctl_reg = expand_expr (arg, NULL_RTX, VOIDmode, 0); ++ wrctl_reg = protect_from_queue (wrctl_reg, 0); ++ ++ if (!(*insn_data[icode].operand[0].predicate) (wrctl_reg, mode)) ++ error ("Control register number must be in range 0-31 for %s", d->name); ++ } ++ ++ ++ /* process the value to store */ ++ { ++ enum machine_mode mode = insn_data[icode].operand[1].mode; ++ tree arg = TREE_VALUE (TREE_CHAIN (arglist)); ++ store_val = expand_expr (arg, NULL_RTX, mode, 0); ++ store_val = protect_from_queue (store_val, 0); ++ ++ if (!(*insn_data[icode].operand[1].predicate) (store_val, mode)) ++ store_val = copy_to_mode_reg (mode, store_val); ++ ++ /* ??? Better errors would be nice */ ++ if (!(*insn_data[icode].operand[1].predicate) (store_val, mode)) ++ error ("Invalid argument 2 to %s", d->name); ++ } ++ ++ pat = GEN_FCN (d->icode) (wrctl_reg, store_val); ++ if (!pat) ++ return 0; ++ emit_insn (pat); ++ return 0; ++} ++ ++ ++#include "gt-nios2.h" ++ +--- gcc-3.4.3/gcc/config/nios2/nios2.h ++++ gcc-3.4.3-nios2/gcc/config/nios2/nios2.h +@@ -0,0 +1,824 @@ ++/* Definitions of target machine for Altera NIOS 2G NIOS2 version. ++ Copyright (C) 2003 Altera ++ Contributed by Jonah Graham (jgraham@altera.com). ++ ++This file is part of GNU CC. ++ ++GNU CC is free software; you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation; either version 2, or (at your option) ++any later version. ++ ++GNU CC 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 General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with GNU CC; see the file COPYING. If not, write to ++the Free Software Foundation, 59 Temple Place - Suite 330, ++Boston, MA 02111-1307, USA. */ ++ ++ ++ ++#define TARGET_CPU_CPP_BUILTINS() \ ++ do \ ++ { \ ++ builtin_define_std ("NIOS2"); \ ++ builtin_define_std ("nios2"); \ ++ builtin_define ("_GNU_SOURCE"); \ ++ } \ ++ while (0) ++#define TARGET_VERSION fprintf (stderr, " (Altera Nios II)") ++ ++ ++ ++ ++ ++/********************************* ++ * Run-time Target Specification ++ *********************************/ ++ ++#define HAS_DIV_FLAG 0x0001 ++#define HAS_MUL_FLAG 0x0002 ++#define HAS_MULX_FLAG 0x0004 ++#define FAST_SW_DIV_FLAG 0x0008 ++#define INLINE_MEMCPY_FLAG 0x00010 ++#define CACHE_VOLATILE_FLAG 0x0020 ++#define BYPASS_CACHE_FLAG 0x0040 ++ ++extern int target_flags; ++#define TARGET_HAS_DIV (target_flags & HAS_DIV_FLAG) ++#define TARGET_HAS_MUL (target_flags & HAS_MUL_FLAG) ++#define TARGET_HAS_MULX (target_flags & HAS_MULX_FLAG) ++#define TARGET_FAST_SW_DIV (target_flags & FAST_SW_DIV_FLAG) ++#define TARGET_INLINE_MEMCPY (target_flags & INLINE_MEMCPY_FLAG) ++#define TARGET_CACHE_VOLATILE (target_flags & CACHE_VOLATILE_FLAG) ++#define TARGET_BYPASS_CACHE (target_flags & BYPASS_CACHE_FLAG) ++ ++#define TARGET_SWITCHES \ ++{ \ ++ { "hw-div", HAS_DIV_FLAG, \ ++ N_("Enable DIV, DIVU") }, \ ++ { "no-hw-div", -HAS_DIV_FLAG, \ ++ N_("Disable DIV, DIVU (default)") }, \ ++ { "hw-mul", HAS_MUL_FLAG, \ ++ N_("Enable MUL instructions (default)") }, \ ++ { "hw-mulx", HAS_MULX_FLAG, \ ++ N_("Enable MULX instructions, assume fast shifter") }, \ ++ { "no-hw-mul", -HAS_MUL_FLAG, \ ++ N_("Disable MUL instructions") }, \ ++ { "no-hw-mulx", -HAS_MULX_FLAG, \ ++ N_("Disable MULX instructions, assume slow shifter (default and implied by -mno-hw-mul)") }, \ ++ { "fast-sw-div", FAST_SW_DIV_FLAG, \ ++ N_("Use table based fast divide (default at -O3)") }, \ ++ { "no-fast-sw-div", -FAST_SW_DIV_FLAG, \ ++ N_("Don't use table based fast divide ever") }, \ ++ { "inline-memcpy", INLINE_MEMCPY_FLAG, \ ++ N_("Inline small memcpy (default when optimizing)") }, \ ++ { "no-inline-memcpy", -INLINE_MEMCPY_FLAG, \ ++ N_("Don't Inline small memcpy") }, \ ++ { "cache-volatile", CACHE_VOLATILE_FLAG, \ ++ N_("Volatile accesses use non-io variants of instructions (default)") }, \ ++ { "no-cache-volatile", -CACHE_VOLATILE_FLAG, \ ++ N_("Volatile accesses use io variants of instructions") }, \ ++ { "bypass-cache", BYPASS_CACHE_FLAG, \ ++ N_("All ld/st instructins use io variants") }, \ ++ { "no-bypass-cache", -BYPASS_CACHE_FLAG, \ ++ N_("All ld/st instructins do not use io variants (default)") }, \ ++ { "smallc", 0, \ ++ N_("Link with a limited version of the C library") }, \ ++ { "ctors-in-init", 0, \ ++ "" /* undocumented: N_("Link with static constructors and destructors in init") */ }, \ ++ { "", TARGET_DEFAULT, 0 } \ ++} ++ ++ ++extern const char *nios2_sys_nosys_string; /* for -msys=nosys */ ++extern const char *nios2_sys_lib_string; /* for -msys-lib= */ ++extern const char *nios2_sys_crt0_string; /* for -msys-crt0= */ ++ ++#define TARGET_OPTIONS \ ++{ \ ++ { "sys=nosys", &nios2_sys_nosys_string, \ ++ N_("Use stub versions of OS library calls (default)"), 0}, \ ++ { "sys-lib=", &nios2_sys_lib_string, \ ++ N_("Name of System Library to link against. (Converted to a -l option)"), 0}, \ ++ { "sys-crt0=", &nios2_sys_crt0_string, \ ++ N_("Name of the startfile. (default is a crt0 for the ISS only)"), 0}, \ ++} ++ ++ ++/* Default target_flags if no switches specified. */ ++#ifndef TARGET_DEFAULT ++# define TARGET_DEFAULT (HAS_MUL_FLAG | CACHE_VOLATILE_FLAG) ++#endif ++ ++/* Switch Recognition by gcc.c. Add -G xx support */ ++#undef SWITCH_TAKES_ARG ++#define SWITCH_TAKES_ARG(CHAR) \ ++ (DEFAULT_SWITCH_TAKES_ARG (CHAR) || (CHAR) == 'G') ++ ++#define OVERRIDE_OPTIONS override_options () ++#define OPTIMIZATION_OPTIONS(LEVEL, SIZE) optimization_options (LEVEL, SIZE) ++#define CAN_DEBUG_WITHOUT_FP ++ ++#define CC1_SPEC "\ ++%{G*}" ++ ++#undef LIB_SPEC ++#define LIB_SPEC \ ++"--start-group %{msmallc: -lsmallc} %{!msmallc: -lc} -lgcc \ ++ %{msys-lib=*: -l%*} \ ++ %{!msys-lib=*: -lc } \ ++ --end-group \ ++ %{msys-lib=: %eYou need a library name for -msys-lib=} \ ++" ++ ++ ++#undef STARTFILE_SPEC ++#define STARTFILE_SPEC \ ++"%{msys-crt0=*: %*} %{!msys-crt0=*: crt1%O%s} \ ++ %{msys-crt0=: %eYou need a C startup file for -msys-crt0=} \ ++ %{mctors-in-init: crti%O%s crtbegin%O%s} \ ++" ++ ++#undef ENDFILE_SPEC ++#define ENDFILE_SPEC \ ++ "%{mctors-in-init: crtend%O%s crtn%O%s}" ++ ++ ++/*********************** ++ * Storage Layout ++ ***********************/ ++ ++#define DEFAULT_SIGNED_CHAR 1 ++#define BITS_BIG_ENDIAN 0 ++#define BYTES_BIG_ENDIAN 0 ++#define WORDS_BIG_ENDIAN 0 ++#define BITS_PER_UNIT 8 ++#define BITS_PER_WORD 32 ++#define UNITS_PER_WORD 4 ++#define POINTER_SIZE 32 ++#define BIGGEST_ALIGNMENT 32 ++#define STRICT_ALIGNMENT 1 ++#define FUNCTION_BOUNDARY 32 ++#define PARM_BOUNDARY 32 ++#define STACK_BOUNDARY 32 ++#define PREFERRED_STACK_BOUNDARY 32 ++#define MAX_FIXED_MODE_SIZE 64 ++ ++#define CONSTANT_ALIGNMENT(EXP, ALIGN) \ ++ ((TREE_CODE (EXP) == STRING_CST) \ ++ && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN)) ++ ++ ++/********************** ++ * Layout of Source Language Data Types ++ **********************/ ++ ++#define INT_TYPE_SIZE 32 ++#define SHORT_TYPE_SIZE 16 ++#define LONG_TYPE_SIZE 32 ++#define LONG_LONG_TYPE_SIZE 64 ++#define FLOAT_TYPE_SIZE 32 ++#define DOUBLE_TYPE_SIZE 64 ++#define LONG_DOUBLE_TYPE_SIZE DOUBLE_TYPE_SIZE ++ ++ ++/************************* ++ * Condition Code Status ++ ************************/ ++ ++/* comparison type */ ++/* ??? currently only CMP_SI is used */ ++enum cmp_type { ++ CMP_SI, /* compare four byte integers */ ++ CMP_DI, /* compare eight byte integers */ ++ CMP_SF, /* compare single precision floats */ ++ CMP_DF, /* compare double precision floats */ ++ CMP_MAX /* max comparison type */ ++}; ++ ++extern GTY(()) rtx branch_cmp[2]; /* operands for compare */ ++extern enum cmp_type branch_type; /* what type of branch to use */ ++ ++/********************** ++ * Register Usage ++ **********************/ ++ ++/* ---------------------------------- * ++ * Basic Characteristics of Registers ++ * ---------------------------------- */ ++ ++/* ++Register Number ++ Register Name ++ Alternate Name ++ Purpose ++0 r0 zero always zero ++1 r1 at Assembler Temporary ++2-3 r2-r3 Return Location ++4-7 r4-r7 Register Arguments ++8-15 r8-r15 Caller Saved Registers ++16-22 r16-r22 Callee Saved Registers ++23 r23 sc Static Chain (Callee Saved) ++ ??? Does $sc want to be caller or callee ++ saved. If caller, 15, else 23. ++24 r24 Exception Temporary ++25 r25 Breakpoint Temporary ++26 r26 gp Global Pointer ++27 r27 sp Stack Pointer ++28 r28 fp Frame Pointer ++29 r29 ea Exception Return Address ++30 r30 ba Breakpoint Return Address ++31 r31 ra Return Address ++ ++32 ctl0 status ++33 ctl1 estatus STATUS saved by exception ? ++34 ctl2 bstatus STATUS saved by break ? ++35 ctl3 ipri Interrupt Priority Mask ? ++36 ctl4 ecause Exception Cause ? ++ ++37 pc Not an actual register ++ ++38 rap Return address pointer, this does not ++ actually exist and will be eliminated ++ ++39 fake_fp Fake Frame Pointer which will always be eliminated. ++40 fake_ap Fake Argument Pointer which will always be eliminated. ++ ++41 First Pseudo Register ++ ++ ++The definitions for all the hard register numbers ++are located in nios2.md. ++*/ ++ ++#define FIRST_PSEUDO_REGISTER 41 ++#define NUM_ARG_REGS (LAST_ARG_REGNO - FIRST_ARG_REGNO + 1) ++ ++ ++ ++/* also see CONDITIONAL_REGISTER_USAGE */ ++#define FIXED_REGISTERS \ ++ { \ ++/* +0 1 2 3 4 5 6 7 8 9 */ \ ++/* 0 */ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, \ ++/* 10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ ++/* 20 */ 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, \ ++/* 30 */ 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, \ ++/* 40 */ 1, \ ++ } ++ ++/* call used is the same as caller saved ++ + fixed regs + args + ret vals */ ++#define CALL_USED_REGISTERS \ ++ { \ ++/* +0 1 2 3 4 5 6 7 8 9 */ \ ++/* 0 */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ ++/* 10 */ 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, \ ++/* 20 */ 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, \ ++/* 30 */ 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, \ ++/* 40 */ 1, \ ++ } ++ ++#define HARD_REGNO_NREGS(REGNO, MODE) \ ++ ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) \ ++ / UNITS_PER_WORD) ++ ++/* --------------------------- * ++ * How Values Fit in Registers ++ * --------------------------- */ ++ ++#define HARD_REGNO_MODE_OK(REGNO, MODE) 1 ++ ++#define MODES_TIEABLE_P(MODE1, MODE2) 1 ++ ++ ++/************************* ++ * Register Classes ++ *************************/ ++ ++enum reg_class ++{ ++ NO_REGS, ++ ALL_REGS, ++ LIM_REG_CLASSES ++}; ++ ++#define N_REG_CLASSES (int) LIM_REG_CLASSES ++ ++#define REG_CLASS_NAMES \ ++ {"NO_REGS", \ ++ "ALL_REGS"} ++ ++#define GENERAL_REGS ALL_REGS ++ ++#define REG_CLASS_CONTENTS \ ++/* NO_REGS */ {{ 0, 0}, \ ++/* ALL_REGS */ {~0,~0}} \ ++ ++#define REGNO_REG_CLASS(REGNO) ALL_REGS ++ ++#define BASE_REG_CLASS ALL_REGS ++#define INDEX_REG_CLASS ALL_REGS ++ ++/* only one reg class, 'r', is handled automatically */ ++#define REG_CLASS_FROM_LETTER(CHAR) NO_REGS ++ ++#define REGNO_OK_FOR_BASE_P2(REGNO, STRICT) \ ++ ((STRICT) \ ++ ? (REGNO) < FIRST_PSEUDO_REGISTER \ ++ : (REGNO) < FIRST_PSEUDO_REGISTER || (reg_renumber && reg_renumber[REGNO] < FIRST_PSEUDO_REGISTER)) ++ ++#define REGNO_OK_FOR_INDEX_P2(REGNO, STRICT) \ ++ (REGNO_OK_FOR_BASE_P2 (REGNO, STRICT)) ++ ++#define REGNO_OK_FOR_BASE_P(REGNO) \ ++ (REGNO_OK_FOR_BASE_P2 (REGNO, 1)) ++ ++#define REGNO_OK_FOR_INDEX_P(REGNO) \ ++ (REGNO_OK_FOR_INDEX_P2 (REGNO, 1)) ++ ++#define REG_OK_FOR_BASE_P2(X, STRICT) \ ++ (STRICT \ ++ ? REGNO_OK_FOR_BASE_P2 (REGNO (X), 1) \ ++ : REGNO_OK_FOR_BASE_P2 (REGNO (X), 1) || REGNO(X) >= FIRST_PSEUDO_REGISTER) ++ ++#define REG_OK_FOR_INDEX_P2(X, STRICT) \ ++ (STRICT \ ++ ? REGNO_OK_FOR_INDEX_P2 (REGNO (X), 1) \ ++ : REGNO_OK_FOR_INDEX_P2 (REGNO (X), 1) || REGNO(X) >= FIRST_PSEUDO_REGISTER) ++ ++#define CLASS_MAX_NREGS(CLASS, MODE) \ ++ ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) \ ++ / UNITS_PER_WORD) ++ ++ ++#define SMALL_INT(X) ((unsigned HOST_WIDE_INT) ((X) + 0x8000) < 0x10000) ++#define SMALL_INT_UNSIGNED(X) ((unsigned HOST_WIDE_INT) (X) < 0x10000) ++#define UPPER16_INT(X) (((X) & 0xffff) == 0) ++#define SHIFT_INT(X) ((X) >= 0 && (X) <= 31) ++#define RDWRCTL_INT(X) ((X) >= 0 && (X) <= 31) ++#define CUSTOM_INSN_OPCODE(X) ((X) >= 0 && (X) <= 255) ++ ++#define CONST_OK_FOR_LETTER_P(VALUE, C) \ ++ ( \ ++ (C) == 'I' ? SMALL_INT (VALUE) : \ ++ (C) == 'J' ? SMALL_INT_UNSIGNED (VALUE) : \ ++ (C) == 'K' ? UPPER16_INT (VALUE) : \ ++ (C) == 'L' ? SHIFT_INT (VALUE) : \ ++ (C) == 'M' ? (VALUE) == 0 : \ ++ (C) == 'N' ? CUSTOM_INSN_OPCODE (VALUE) : \ ++ (C) == 'O' ? RDWRCTL_INT (VALUE) : \ ++ 0) ++ ++#define CONST_DOUBLE_OK_FOR_LETTER_P(VALUE, C) 0 ++ ++#define PREFERRED_RELOAD_CLASS(X, CLASS) \ ++ ((CLASS) == NO_REGS ? GENERAL_REGS : (CLASS)) ++ ++/* 'S' matches immediates which are in small data ++ and therefore can be added to gp to create a ++ 32-bit value. */ ++#define EXTRA_CONSTRAINT(VALUE, C) \ ++ ((C) == 'S' \ ++ && (GET_CODE (VALUE) == SYMBOL_REF) \ ++ && SYMBOL_REF_IN_NIOS2_SMALL_DATA_P (VALUE)) ++ ++ ++ ++ ++/* Say that the epilogue uses the return address register. Note that ++ in the case of sibcalls, the values "used by the epilogue" are ++ considered live at the start of the called function. */ ++#define EPILOGUE_USES(REGNO) ((REGNO) == RA_REGNO) ++ ++ ++#define DEFAULT_MAIN_RETURN c_expand_return (integer_zero_node) ++ ++/********************************** ++ * Trampolines for Nested Functions ++ ***********************************/ ++ ++#define TRAMPOLINE_TEMPLATE(FILE) \ ++ error ("trampolines not yet implemented") ++#define TRAMPOLINE_SIZE 20 ++#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \ ++ error ("trampolines not yet implemented") ++ ++/*************************** ++ * Stack Layout and Calling Conventions ++ ***************************/ ++ ++/* ------------------ * ++ * Basic Stack Layout ++ * ------------------ */ ++ ++/* The downward variants are used by the compiler, ++ the upward ones serve as documentation */ ++#define STACK_GROWS_DOWNWARD ++#define FRAME_GROWS_UPWARD ++#define ARGS_GROW_UPWARD ++ ++#define STARTING_FRAME_OFFSET current_function_outgoing_args_size ++#define FIRST_PARM_OFFSET(FUNDECL) 0 ++ ++/* Before the prologue, RA lives in r31. */ ++#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (VOIDmode, RA_REGNO) ++ ++/* -------------------------------------- * ++ * Registers That Address the Stack Frame ++ * -------------------------------------- */ ++ ++#define STACK_POINTER_REGNUM SP_REGNO ++#define STATIC_CHAIN_REGNUM SC_REGNO ++#define PC_REGNUM PC_REGNO ++#define DWARF_FRAME_RETURN_COLUMN RA_REGNO ++ ++/* Base register for access to local variables of the function. We ++ pretend that the frame pointer is a non-existent hard register, and ++ then eliminate it to HARD_FRAME_POINTER_REGNUM. */ ++#define FRAME_POINTER_REGNUM FAKE_FP_REGNO ++ ++#define HARD_FRAME_POINTER_REGNUM FP_REGNO ++#define RETURN_ADDRESS_POINTER_REGNUM RAP_REGNO ++/* the argumnet pointer needs to always be eliminated ++ so it is set to a fake hard register. */ ++#define ARG_POINTER_REGNUM FAKE_AP_REGNO ++ ++/* ----------------------------------------- * ++ * Eliminating Frame Pointer and Arg Pointer ++ * ----------------------------------------- */ ++ ++#define FRAME_POINTER_REQUIRED 0 ++ ++#define ELIMINABLE_REGS \ ++{{ ARG_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ ++ { ARG_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \ ++ { RETURN_ADDRESS_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ ++ { RETURN_ADDRESS_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}, \ ++ { FRAME_POINTER_REGNUM, STACK_POINTER_REGNUM}, \ ++ { FRAME_POINTER_REGNUM, HARD_FRAME_POINTER_REGNUM}} ++ ++#define CAN_ELIMINATE(FROM, TO) 1 ++ ++#define INITIAL_ELIMINATION_OFFSET(FROM, TO, OFFSET) \ ++ (OFFSET) = nios2_initial_elimination_offset ((FROM), (TO)) ++ ++#define MUST_SAVE_REGISTER(regno) \ ++ ((regs_ever_live[regno] && !call_used_regs[regno]) \ ++ || (regno == HARD_FRAME_POINTER_REGNUM && frame_pointer_needed) \ ++ || (regno == RA_REGNO && regs_ever_live[RA_REGNO])) ++ ++/* Treat LOC as a byte offset from the stack pointer and round it up ++ to the next fully-aligned offset. */ ++#define STACK_ALIGN(LOC) \ ++ (((LOC) + ((PREFERRED_STACK_BOUNDARY / 8) - 1)) & ~((PREFERRED_STACK_BOUNDARY / 8) - 1)) ++ ++ ++/* ------------------------------ * ++ * Passing Arguments in Registers ++ * ------------------------------ */ ++ ++/* see nios2.c */ ++#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \ ++ (function_arg (&CUM, MODE, TYPE, NAMED)) ++ ++#define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) \ ++ (function_arg_partial_nregs (&CUM, MODE, TYPE, NAMED)) ++ ++#define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) 0 ++ ++#define FUNCTION_ARG_CALLEE_COPIES(CUM, MODE, TYPE, NAMED) 0 ++ ++typedef struct nios2_args ++{ ++ int regs_used; ++} CUMULATIVE_ARGS; ++ ++/* This is to initialize the above unused CUM data type */ ++#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \ ++ (init_cumulative_args (&CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS)) ++ ++#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ ++ (function_arg_advance (&CUM, MODE, TYPE, NAMED)) ++ ++#define FUNCTION_ARG_REGNO_P(REGNO) \ ++ ((REGNO) >= FIRST_ARG_REGNO && (REGNO) <= LAST_ARG_REGNO) ++ ++#define SETUP_INCOMING_VARARGS(CUM,MODE,TYPE,PRETEND_SIZE,NO_RTL) \ ++ { \ ++ int pret_size = nios2_setup_incoming_varargs (&(CUM), (MODE), \ ++ (TYPE), (NO_RTL)); \ ++ if (pret_size) \ ++ (PRETEND_SIZE) = pret_size; \ ++ } ++ ++/* ----------------------------- * ++ * Generating Code for Profiling ++ * ----------------------------- */ ++ ++#define PROFILE_BEFORE_PROLOGUE ++ ++#define FUNCTION_PROFILER(FILE, LABELNO) \ ++ function_profiler ((FILE), (LABELNO)) ++ ++/* --------------------------------------- * ++ * Passing Function Arguments on the Stack ++ * --------------------------------------- */ ++ ++#define PROMOTE_PROTOTYPES 1 ++ ++#define PUSH_ARGS 0 ++#define ACCUMULATE_OUTGOING_ARGS 1 ++ ++#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACKSIZE) 0 ++ ++/* --------------------------------------- * ++ * How Scalar Function Values Are Returned ++ * --------------------------------------- */ ++ ++#define FUNCTION_VALUE(VALTYPE, FUNC) \ ++ gen_rtx(REG, TYPE_MODE(VALTYPE), FIRST_RETVAL_REGNO) ++ ++#define LIBCALL_VALUE(MODE) \ ++ gen_rtx(REG, MODE, FIRST_RETVAL_REGNO) ++ ++#define FUNCTION_VALUE_REGNO_P(REGNO) ((REGNO) == FIRST_RETVAL_REGNO) ++ ++/* ----------------------------- * ++ * How Large Values Are Returned ++ * ----------------------------- */ ++ ++ ++#define RETURN_IN_MEMORY(TYPE) \ ++ nios2_return_in_memory (TYPE) ++ ++ ++#define STRUCT_VALUE 0 ++ ++#define DEFAULT_PCC_STRUCT_RETURN 0 ++ ++/******************* ++ * Addressing Modes ++ *******************/ ++ ++ ++#define LEGITIMIZE_ADDRESS(X, OLDX, MODE, WIN) ++ ++#define CONSTANT_ADDRESS_P(X) (CONSTANT_P (X)) ++ ++#define MAX_REGS_PER_ADDRESS 1 ++ ++/* Go to ADDR if X is a valid address. */ ++#ifndef REG_OK_STRICT ++#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ ++ { \ ++ if (nios2_legitimate_address ((X), (MODE), 0)) \ ++ goto ADDR; \ ++ } ++#else ++#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ ++ { \ ++ if (nios2_legitimate_address ((X), (MODE), 1)) \ ++ goto ADDR; \ ++ } ++#endif ++ ++#ifndef REG_OK_STRICT ++#define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P2 (REGNO (X), 0) ++#define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P2 (REGNO (X), 0) ++#else ++#define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P2 (REGNO (X), 1) ++#define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P2 (REGNO (X), 1) ++#endif ++ ++#define LEGITIMATE_CONSTANT_P(X) 1 ++ ++/* Nios II has no mode dependent addresses. */ ++#define GO_IF_MODE_DEPENDENT_ADDRESS(ADDR, LABEL) ++ ++/* Set if this has a weak declaration */ ++#define SYMBOL_FLAG_WEAK_DECL (1 << SYMBOL_FLAG_MACH_DEP_SHIFT) ++#define SYMBOL_REF_WEAK_DECL_P(RTX) \ ++ ((SYMBOL_REF_FLAGS (RTX) & SYMBOL_FLAG_WEAK_DECL) != 0) ++ ++ ++/* true if a symbol is both small and not weak. In this case, gp ++ relative access can be used */ ++#define SYMBOL_REF_IN_NIOS2_SMALL_DATA_P(RTX) \ ++ (SYMBOL_REF_SMALL_P(RTX) && !SYMBOL_REF_WEAK_DECL_P(RTX)) ++ ++/***************** ++ * Describing Relative Costs of Operations ++ *****************/ ++ ++#define SLOW_BYTE_ACCESS 1 ++ ++/* It is as good to call a constant function address as to call an address ++ kept in a register. ++ ??? Not true anymore really. Now that call cannot address full range ++ of memory callr may need to be used */ ++ ++#define NO_FUNCTION_CSE ++#define NO_RECURSIVE_FUNCTION_CSE ++ ++ ++ ++/***************************************** ++ * Defining the Output Assembler Language ++ *****************************************/ ++ ++/* ------------------------------------------ * ++ * The Overall Framework of an Assembler File ++ * ------------------------------------------ */ ++ ++#define ASM_APP_ON "#APP\n" ++#define ASM_APP_OFF "#NO_APP\n" ++ ++#define ASM_COMMENT_START "# " ++ ++/* ------------------------------- * ++ * Output and Generation of Labels ++ * ------------------------------- */ ++ ++#define GLOBAL_ASM_OP "\t.global\t" ++ ++ ++/* -------------- * ++ * Output of Data ++ * -------------- */ ++ ++#define DWARF2_UNWIND_INFO 0 ++ ++ ++/* -------------------------------- * ++ * Assembler Commands for Alignment ++ * -------------------------------- */ ++ ++#define ASM_OUTPUT_ALIGN(FILE, LOG) \ ++ do { \ ++ fprintf ((FILE), "%s%d\n", ALIGN_ASM_OP, (LOG)); \ ++ } while (0) ++ ++ ++/* -------------------------------- * ++ * Output of Assembler Instructions ++ * -------------------------------- */ ++ ++#define REGISTER_NAMES \ ++{ \ ++ "zero", \ ++ "at", \ ++ "r2", \ ++ "r3", \ ++ "r4", \ ++ "r5", \ ++ "r6", \ ++ "r7", \ ++ "r8", \ ++ "r9", \ ++ "r10", \ ++ "r11", \ ++ "r12", \ ++ "r13", \ ++ "r14", \ ++ "r15", \ ++ "r16", \ ++ "r17", \ ++ "r18", \ ++ "r19", \ ++ "r20", \ ++ "r21", \ ++ "r22", \ ++ "r23", \ ++ "r24", \ ++ "r25", \ ++ "gp", \ ++ "sp", \ ++ "fp", \ ++ "ta", \ ++ "ba", \ ++ "ra", \ ++ "status", \ ++ "estatus", \ ++ "bstatus", \ ++ "ipri", \ ++ "ecause", \ ++ "pc", \ ++ "rap", \ ++ "fake_fp", \ ++ "fake_ap", \ ++} ++ ++#define ASM_OUTPUT_OPCODE(STREAM, PTR)\ ++ (PTR) = asm_output_opcode (STREAM, PTR) ++ ++#define PRINT_OPERAND(STREAM, X, CODE) \ ++ nios2_print_operand (STREAM, X, CODE) ++ ++#define PRINT_OPERAND_ADDRESS(STREAM, X) \ ++ nios2_print_operand_address (STREAM, X) ++ ++#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE) \ ++do { fputs (integer_asm_op (POINTER_SIZE / BITS_PER_UNIT, TRUE), FILE); \ ++ fprintf (FILE, ".L%u\n", (unsigned) (VALUE)); \ ++ } while (0) ++ ++ ++/* ------------ * ++ * Label Output ++ * ------------ */ ++ ++ ++/* ---------------------------------------------------- * ++ * Dividing the Output into Sections (Texts, Data, ...) ++ * ---------------------------------------------------- */ ++ ++/* Output before read-only data. */ ++#define TEXT_SECTION_ASM_OP ("\t.section\t.text") ++ ++/* Output before writable data. */ ++#define DATA_SECTION_ASM_OP ("\t.section\t.data") ++ ++ ++/* Default the definition of "small data" to 8 bytes. */ ++/* ??? How come I can't use HOST_WIDE_INT here? */ ++extern unsigned long nios2_section_threshold; ++#define NIOS2_DEFAULT_GVALUE 8 ++ ++ ++ ++/* This says how to output assembler code to declare an ++ uninitialized external linkage data object. Under SVR4, ++ the linker seems to want the alignment of data objects ++ to depend on their types. We do exactly that here. */ ++ ++#undef COMMON_ASM_OP ++#define COMMON_ASM_OP "\t.comm\t" ++ ++#undef ASM_OUTPUT_ALIGNED_COMMON ++#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \ ++do \ ++{ \ ++ if ((SIZE) <= nios2_section_threshold) \ ++ { \ ++ named_section (0, ".sbss", 0); \ ++ (*targetm.asm_out.globalize_label) (FILE, NAME); \ ++ ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \ ++ if (!flag_inhibit_size_directive) \ ++ ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE); \ ++ ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT)); \ ++ ASM_OUTPUT_LABEL(FILE, NAME); \ ++ ASM_OUTPUT_SKIP((FILE), (SIZE) ? (SIZE) : 1); \ ++ } \ ++ else \ ++ { \ ++ fprintf ((FILE), "%s", COMMON_ASM_OP); \ ++ assemble_name ((FILE), (NAME)); \ ++ fprintf ((FILE), ","HOST_WIDE_INT_PRINT_UNSIGNED",%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \ ++ } \ ++} \ ++while (0) ++ ++ ++/* This says how to output assembler code to declare an ++ uninitialized internal linkage data object. Under SVR4, ++ the linker seems to want the alignment of data objects ++ to depend on their types. We do exactly that here. */ ++ ++#undef ASM_OUTPUT_ALIGNED_LOCAL ++#define ASM_OUTPUT_ALIGNED_LOCAL(FILE, NAME, SIZE, ALIGN) \ ++do { \ ++ if ((SIZE) <= nios2_section_threshold) \ ++ named_section (0, ".sbss", 0); \ ++ else \ ++ named_section (0, ".bss", 0); \ ++ ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "object"); \ ++ if (!flag_inhibit_size_directive) \ ++ ASM_OUTPUT_SIZE_DIRECTIVE (FILE, NAME, SIZE); \ ++ ASM_OUTPUT_ALIGN ((FILE), exact_log2((ALIGN) / BITS_PER_UNIT)); \ ++ ASM_OUTPUT_LABEL(FILE, NAME); \ ++ ASM_OUTPUT_SKIP((FILE), (SIZE) ? (SIZE) : 1); \ ++} while (0) ++ ++ ++ ++/*************************** ++ * Miscellaneous Parameters ++ ***************************/ ++ ++#define MOVE_MAX 4 ++ ++#define Pmode SImode ++#define FUNCTION_MODE QImode ++ ++#define CASE_VECTOR_MODE Pmode ++ ++#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1 ++ ++#define LOAD_EXTEND_OP(MODE) (ZERO_EXTEND) ++ ++#define WORD_REGISTER_OPERATIONS +--- gcc-3.4.3/gcc/config/nios2/nios2.md ++++ gcc-3.4.3-nios2/gcc/config/nios2/nios2.md +@@ -0,0 +1,2078 @@ ++;; Machine Description for Altera NIOS 2G NIOS2 version. ++;; Copyright (C) 2003 Altera ++;; Contributed by Jonah Graham (jgraham@altera.com). ++;; ++;; This file is part of GNU CC. ++;; ++;; GNU CC is free software; you can redistribute it and/or modify ++;; it under the terms of the GNU General Public License as published by ++;; the Free Software Foundation; either version 2, or (at your option) ++;; any later version. ++;; ++;; GNU CC 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 General Public License for more details. ++;; ++;; You should have received a copy of the GNU General Public License ++;; along with GNU CC; see the file COPYING. If not, write to ++;; the Free Software Foundation, 59 Temple Place - Suite 330, ++;; Boston, MA 02111-1307, USA. */ ++ ++ ++ ++;***************************************************************************** ++;* ++;* constants ++;* ++;***************************************************************************** ++(define_constants [ ++ (GP_REGNO 26) ++ (SP_REGNO 27) ++ (FP_REGNO 28) ++ (RA_REGNO 31) ++ (RAP_REGNO 38) ++ (FIRST_RETVAL_REGNO 2) ++ (LAST_RETVAL_REGNO 3) ++ (FIRST_ARG_REGNO 4) ++ (LAST_ARG_REGNO 7) ++ (SC_REGNO 23) ++ (PC_REGNO 37) ++ (FAKE_FP_REGNO 39) ++ (FAKE_AP_REGNO 40) ++ ++ ++ (UNSPEC_BLOCKAGE 0) ++ (UNSPEC_LDBIO 1) ++ (UNSPEC_LDBUIO 2) ++ (UNSPEC_LDHIO 3) ++ (UNSPEC_LDHUIO 4) ++ (UNSPEC_LDWIO 5) ++ (UNSPEC_STBIO 6) ++ (UNSPEC_STHIO 7) ++ (UNSPEC_STWIO 8) ++ (UNSPEC_SYNC 9) ++ (UNSPEC_WRCTL 10) ++ (UNSPEC_RDCTL 11) ++ ++]) ++ ++ ++ ++;***************************************************************************** ++;* ++;* instruction scheduler ++;* ++;***************************************************************************** ++ ++; No schedule info is currently available, using an assumption that no ++; instruction can use the results of the previous instruction without ++; incuring a stall. ++ ++; length of an instruction (in bytes) ++(define_attr "length" "" (const_int 4)) ++(define_attr "type" "unknown,complex,control,alu,cond_alu,st,ld,shift,mul,div,custom" (const_string "complex")) ++ ++(define_asm_attributes ++ [(set_attr "length" "4") ++ (set_attr "type" "complex")]) ++ ++(define_automaton "nios2") ++(automata_option "v") ++;(automata_option "no-minimization") ++(automata_option "ndfa") ++ ++; The nios2 pipeline is fairly straightforward for the fast model. ++; Every alu operation is pipelined so that an instruction can ++; be issued every cycle. However, there are still potential ++; stalls which this description tries to deal with. ++ ++(define_cpu_unit "cpu" "nios2") ++ ++(define_insn_reservation "complex" 1 ++ (eq_attr "type" "complex") ++ "cpu") ++ ++(define_insn_reservation "control" 1 ++ (eq_attr "type" "control") ++ "cpu") ++ ++(define_insn_reservation "alu" 1 ++ (eq_attr "type" "alu") ++ "cpu") ++ ++(define_insn_reservation "cond_alu" 1 ++ (eq_attr "type" "cond_alu") ++ "cpu") ++ ++(define_insn_reservation "st" 1 ++ (eq_attr "type" "st") ++ "cpu") ++ ++(define_insn_reservation "custom" 1 ++ (eq_attr "type" "custom") ++ "cpu") ++ ++; shifts, muls and lds have three cycle latency ++(define_insn_reservation "ld" 3 ++ (eq_attr "type" "ld") ++ "cpu") ++ ++(define_insn_reservation "shift" 3 ++ (eq_attr "type" "shift") ++ "cpu") ++ ++(define_insn_reservation "mul" 3 ++ (eq_attr "type" "mul") ++ "cpu") ++ ++(define_insn_reservation "div" 1 ++ (eq_attr "type" "div") ++ "cpu") ++ ++ ++;***************************************************************************** ++;* ++;* MOV Instructions ++;* ++;***************************************************************************** ++ ++(define_expand "movqi" ++ [(set (match_operand:QI 0 "nonimmediate_operand" "") ++ (match_operand:QI 1 "general_operand" ""))] ++ "" ++{ ++ if (nios2_emit_move_sequence (operands, QImode)) ++ DONE; ++}) ++ ++(define_insn "movqi_internal" ++ [(set (match_operand:QI 0 "nonimmediate_operand" "=m, r,r, r") ++ (match_operand:QI 1 "general_operand" "rM,m,rM,I"))] ++ "(register_operand (operands[0], QImode) ++ || register_operand (operands[1], QImode) ++ || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))" ++ "@ ++ stb%o0\\t%z1, %0 ++ ldbu%o1\\t%0, %1 ++ mov\\t%0, %z1 ++ movi\\t%0, %1" ++ [(set_attr "type" "st,ld,alu,alu")]) ++ ++(define_insn "ldbio" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(const_int 0)] UNSPEC_LDBIO)) ++ (use (match_operand:SI 1 "memory_operand" "m"))] ++ "" ++ "ldbio\\t%0, %1" ++ [(set_attr "type" "ld")]) ++ ++(define_insn "ldbuio" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(const_int 0)] UNSPEC_LDBUIO)) ++ (use (match_operand:SI 1 "memory_operand" "m"))] ++ "" ++ "ldbuio\\t%0, %1" ++ [(set_attr "type" "ld")]) ++ ++(define_insn "stbio" ++ [(set (match_operand:SI 0 "memory_operand" "=m") ++ (match_operand:SI 1 "register_operand" "r")) ++ (unspec_volatile:SI [(const_int 0)] UNSPEC_STBIO)] ++ "" ++ "stbio\\t%z1, %0" ++ [(set_attr "type" "st")]) ++ ++ ++(define_expand "movhi" ++ [(set (match_operand:HI 0 "nonimmediate_operand" "") ++ (match_operand:HI 1 "general_operand" ""))] ++ "" ++{ ++ if (nios2_emit_move_sequence (operands, HImode)) ++ DONE; ++}) ++ ++(define_insn "movhi_internal" ++ [(set (match_operand:HI 0 "nonimmediate_operand" "=m, r,r, r,r") ++ (match_operand:HI 1 "general_operand" "rM,m,rM,I,J"))] ++ "(register_operand (operands[0], HImode) ++ || register_operand (operands[1], HImode) ++ || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))" ++ "@ ++ sth%o0\\t%z1, %0 ++ ldhu%o1\\t%0, %1 ++ mov\\t%0, %z1 ++ movi\\t%0, %1 ++ movui\\t%0, %1" ++ [(set_attr "type" "st,ld,alu,alu,alu")]) ++ ++(define_insn "ldhio" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(const_int 0)] UNSPEC_LDHIO)) ++ (use (match_operand:SI 1 "memory_operand" "m"))] ++ "" ++ "ldhio\\t%0, %1" ++ [(set_attr "type" "ld")]) ++ ++(define_insn "ldhuio" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(const_int 0)] UNSPEC_LDHUIO)) ++ (use (match_operand:SI 1 "memory_operand" "m"))] ++ "" ++ "ldhuio\\t%0, %1" ++ [(set_attr "type" "ld")]) ++ ++(define_insn "sthio" ++ [(set (match_operand:SI 0 "memory_operand" "=m") ++ (match_operand:SI 1 "register_operand" "r")) ++ (unspec_volatile:SI [(const_int 0)] UNSPEC_STHIO)] ++ "" ++ "sthio\\t%z1, %0" ++ [(set_attr "type" "st")]) ++ ++(define_expand "movsi" ++ [(set (match_operand:SI 0 "nonimmediate_operand" "") ++ (match_operand:SI 1 "general_operand" ""))] ++ "" ++{ ++ if (nios2_emit_move_sequence (operands, SImode)) ++ DONE; ++}) ++ ++(define_insn "movsi_internal" ++ [(set (match_operand:SI 0 "nonimmediate_operand" "=m, r,r, r,r,r,r") ++ (match_operand:SI 1 "general_operand" "rM,m,rM,I,J,S,i"))] ++ "(register_operand (operands[0], SImode) ++ || register_operand (operands[1], SImode) ++ || (GET_CODE (operands[1]) == CONST_INT && INTVAL (operands[1]) == 0))" ++ "@ ++ stw%o0\\t%z1, %0 ++ ldw%o1\\t%0, %1 ++ mov\\t%0, %z1 ++ movi\\t%0, %1 ++ movui\\t%0, %1 ++ addi\\t%0, gp, %%gprel(%1) ++ movhi\\t%0, %H1\;addi\\t%0, %0, %L1" ++ [(set_attr "type" "st,ld,alu,alu,alu,alu,alu")]) ++ ++(define_insn "ldwio" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(const_int 0)] UNSPEC_LDWIO)) ++ (use (match_operand:SI 1 "memory_operand" "m"))] ++ "" ++ "ldwio\\t%0, %1" ++ [(set_attr "type" "ld")]) ++ ++(define_insn "stwio" ++ [(set (match_operand:SI 0 "memory_operand" "=m") ++ (match_operand:SI 1 "register_operand" "r")) ++ (unspec_volatile:SI [(const_int 0)] UNSPEC_STWIO)] ++ "" ++ "stwio\\t%z1, %0" ++ [(set_attr "type" "st")]) ++ ++ ++ ++;***************************************************************************** ++;* ++;* zero extension ++;* ++;***************************************************************************** ++ ++ ++(define_insn "zero_extendhisi2" ++ [(set (match_operand:SI 0 "register_operand" "=r,r") ++ (zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "r,m")))] ++ "" ++ "@ ++ andi\\t%0, %1, 0xffff ++ ldhu%o1\\t%0, %1" ++ [(set_attr "type" "alu,ld")]) ++ ++(define_insn "zero_extendqihi2" ++ [(set (match_operand:HI 0 "register_operand" "=r,r") ++ (zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "r,m")))] ++ "" ++ "@ ++ andi\\t%0, %1, 0xff ++ ldbu%o1\\t%0, %1" ++ [(set_attr "type" "alu,ld")]) ++ ++(define_insn "zero_extendqisi2" ++ [(set (match_operand:SI 0 "register_operand" "=r,r") ++ (zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "r,m")))] ++ "" ++ "@ ++ andi\\t%0, %1, 0xff ++ ldbu%o1\\t%0, %1" ++ [(set_attr "type" "alu,ld")]) ++ ++ ++ ++;***************************************************************************** ++;* ++;* sign extension ++;* ++;***************************************************************************** ++ ++(define_expand "extendhisi2" ++ [(set (match_operand:SI 0 "register_operand" "") ++ (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "")))] ++ "" ++{ ++ if (optimize && GET_CODE (operands[1]) == MEM) ++ operands[1] = force_not_mem (operands[1]); ++ ++ if (GET_CODE (operands[1]) != MEM) ++ { ++ rtx op1 = gen_lowpart (SImode, operands[1]); ++ rtx temp = gen_reg_rtx (SImode); ++ rtx shift = GEN_INT (16); ++ ++ emit_insn (gen_ashlsi3 (temp, op1, shift)); ++ emit_insn (gen_ashrsi3 (operands[0], temp, shift)); ++ DONE; ++ } ++}) ++ ++(define_insn "extendhisi2_internal" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (sign_extend:SI (match_operand:HI 1 "memory_operand" "m")))] ++ "" ++ "ldh%o1\\t%0, %1" ++ [(set_attr "type" "ld")]) ++ ++(define_expand "extendqihi2" ++ [(set (match_operand:HI 0 "register_operand" "") ++ (sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "")))] ++ "" ++{ ++ if (optimize && GET_CODE (operands[1]) == MEM) ++ operands[1] = force_not_mem (operands[1]); ++ ++ if (GET_CODE (operands[1]) != MEM) ++ { ++ rtx op0 = gen_lowpart (SImode, operands[0]); ++ rtx op1 = gen_lowpart (SImode, operands[1]); ++ rtx temp = gen_reg_rtx (SImode); ++ rtx shift = GEN_INT (24); ++ ++ emit_insn (gen_ashlsi3 (temp, op1, shift)); ++ emit_insn (gen_ashrsi3 (op0, temp, shift)); ++ DONE; ++ } ++}) ++ ++(define_insn "extendqihi2_internal" ++ [(set (match_operand:HI 0 "register_operand" "=r") ++ (sign_extend:HI (match_operand:QI 1 "memory_operand" "m")))] ++ "" ++ "ldb%o1\\t%0, %1" ++ [(set_attr "type" "ld")]) ++ ++ ++(define_expand "extendqisi2" ++ [(set (match_operand:SI 0 "register_operand" "") ++ (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))] ++ "" ++{ ++ if (optimize && GET_CODE (operands[1]) == MEM) ++ operands[1] = force_not_mem (operands[1]); ++ ++ if (GET_CODE (operands[1]) != MEM) ++ { ++ rtx op1 = gen_lowpart (SImode, operands[1]); ++ rtx temp = gen_reg_rtx (SImode); ++ rtx shift = GEN_INT (24); ++ ++ emit_insn (gen_ashlsi3 (temp, op1, shift)); ++ emit_insn (gen_ashrsi3 (operands[0], temp, shift)); ++ DONE; ++ } ++}) ++ ++(define_insn "extendqisi2_insn" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (sign_extend:SI (match_operand:QI 1 "memory_operand" "m")))] ++ "" ++ "ldb%o1\\t%0, %1" ++ [(set_attr "type" "ld")]) ++ ++ ++ ++;***************************************************************************** ++;* ++;* Arithmetic Operations ++;* ++;***************************************************************************** ++ ++(define_insn "addsi3" ++ [(set (match_operand:SI 0 "register_operand" "=r,r") ++ (plus:SI (match_operand:SI 1 "register_operand" "%r,r") ++ (match_operand:SI 2 "arith_operand" "r,I")))] ++ "" ++ "add%i2\\t%0, %1, %z2" ++ [(set_attr "type" "alu")]) ++ ++(define_insn "subsi3" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (minus:SI (match_operand:SI 1 "reg_or_0_operand" "rM") ++ (match_operand:SI 2 "register_operand" "r")))] ++ "" ++ "sub\\t%0, %z1, %2" ++ [(set_attr "type" "alu")]) ++ ++(define_insn "mulsi3" ++ [(set (match_operand:SI 0 "register_operand" "=r,r") ++ (mult:SI (match_operand:SI 1 "register_operand" "r,r") ++ (match_operand:SI 2 "arith_operand" "r,I")))] ++ "TARGET_HAS_MUL" ++ "mul%i2\\t%0, %1, %z2" ++ [(set_attr "type" "mul")]) ++ ++(define_expand "divsi3" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (div:SI (match_operand:SI 1 "register_operand" "r") ++ (match_operand:SI 2 "register_operand" "r")))] ++ "" ++{ ++ if (!TARGET_HAS_DIV) ++ { ++ if (!TARGET_FAST_SW_DIV) ++ FAIL; ++ else ++ { ++ if (nios2_emit_expensive_div (operands, SImode)) ++ DONE; ++ } ++ } ++}) ++ ++(define_insn "divsi3_insn" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (div:SI (match_operand:SI 1 "register_operand" "r") ++ (match_operand:SI 2 "register_operand" "r")))] ++ "TARGET_HAS_DIV" ++ "div\\t%0, %1, %2" ++ [(set_attr "type" "div")]) ++ ++(define_insn "udivsi3" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (udiv:SI (match_operand:SI 1 "register_operand" "r") ++ (match_operand:SI 2 "register_operand" "r")))] ++ "TARGET_HAS_DIV" ++ "divu\\t%0, %1, %2" ++ [(set_attr "type" "div")]) ++ ++(define_insn "smulsi3_highpart" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (truncate:SI ++ (lshiftrt:DI ++ (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "r")) ++ (sign_extend:DI (match_operand:SI 2 "register_operand" "r"))) ++ (const_int 32))))] ++ "TARGET_HAS_MULX" ++ "mulxss\\t%0, %1, %2" ++ [(set_attr "type" "mul")]) ++ ++(define_insn "umulsi3_highpart" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (truncate:SI ++ (lshiftrt:DI ++ (mult:DI (zero_extend:DI (match_operand:SI 1 "register_operand" "r")) ++ (zero_extend:DI (match_operand:SI 2 "register_operand" "r"))) ++ (const_int 32))))] ++ "TARGET_HAS_MULX" ++ "mulxuu\\t%0, %1, %2" ++ [(set_attr "type" "mul")]) ++ ++ ++(define_expand "mulsidi3" ++ [(set (subreg:SI (match_operand:DI 0 "register_operand" "") 0) ++ (mult:SI (match_operand:SI 1 "register_operand" "") ++ (match_operand:SI 2 "register_operand" ""))) ++ (set (subreg:SI (match_dup 0) 4) ++ (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_dup 1)) ++ (sign_extend:DI (match_dup 2))) ++ (const_int 32))))] ++ "TARGET_HAS_MULX" ++ "") ++ ++(define_expand "umulsidi3" ++ [(set (subreg:SI (match_operand:DI 0 "register_operand" "") 0) ++ (mult:SI (match_operand:SI 1 "register_operand" "") ++ (match_operand:SI 2 "register_operand" ""))) ++ (set (subreg:SI (match_dup 0) 4) ++ (truncate:SI (lshiftrt:DI (mult:DI (zero_extend:DI (match_dup 1)) ++ (zero_extend:DI (match_dup 2))) ++ (const_int 32))))] ++ "TARGET_HAS_MULX" ++ "") ++ ++ ++ ++;***************************************************************************** ++;* ++;* Negate and ones complement ++;* ++;***************************************************************************** ++ ++(define_insn "negsi2" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (neg:SI (match_operand:SI 1 "register_operand" "r")))] ++ "" ++{ ++ operands[2] = const0_rtx; ++ return "sub\\t%0, %z2, %1"; ++} ++ [(set_attr "type" "alu")]) ++ ++(define_insn "one_cmplsi2" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (not:SI (match_operand:SI 1 "register_operand" "r")))] ++ "" ++{ ++ operands[2] = const0_rtx; ++ return "nor\\t%0, %z2, %1"; ++} ++ [(set_attr "type" "alu")]) ++ ++ ++ ++; Logical Operantions ++ ++(define_insn "andsi3" ++ [(set (match_operand:SI 0 "register_operand" "=r, r,r") ++ (and:SI (match_operand:SI 1 "register_operand" "%r, r,r") ++ (match_operand:SI 2 "logical_operand" "rM,J,K")))] ++ "" ++ "@ ++ and\\t%0, %1, %z2 ++ and%i2\\t%0, %1, %2 ++ andh%i2\\t%0, %1, %U2" ++ [(set_attr "type" "alu")]) ++ ++(define_insn "iorsi3" ++ [(set (match_operand:SI 0 "register_operand" "=r, r,r") ++ (ior:SI (match_operand:SI 1 "register_operand" "%r, r,r") ++ (match_operand:SI 2 "logical_operand" "rM,J,K")))] ++ "" ++ "@ ++ or\\t%0, %1, %z2 ++ or%i2\\t%0, %1, %2 ++ orh%i2\\t%0, %1, %U2" ++ [(set_attr "type" "alu")]) ++ ++(define_insn "*norsi3" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (and:SI (not:SI (match_operand:SI 1 "register_operand" "%r")) ++ (not:SI (match_operand:SI 2 "reg_or_0_operand" "rM"))))] ++ "" ++ "nor\\t%0, %1, %z2" ++ [(set_attr "type" "alu")]) ++ ++(define_insn "xorsi3" ++ [(set (match_operand:SI 0 "register_operand" "=r, r,r") ++ (xor:SI (match_operand:SI 1 "register_operand" "%r, r,r") ++ (match_operand:SI 2 "logical_operand" "rM,J,K")))] ++ "" ++ "@ ++ xor\\t%0, %1, %z2 ++ xor%i2\\t%0, %1, %2 ++ xorh%i2\\t%0, %1, %U2" ++ [(set_attr "type" "alu")]) ++ ++ ++ ++;***************************************************************************** ++;* ++;* Shifts ++;* ++;***************************************************************************** ++ ++(define_insn "ashlsi3" ++ [(set (match_operand:SI 0 "register_operand" "=r,r") ++ (ashift:SI (match_operand:SI 1 "register_operand" "r,r") ++ (match_operand:SI 2 "shift_operand" "r,L")))] ++ "" ++ "sll%i2\\t%0, %1, %z2" ++ [(set_attr "type" "shift")]) ++ ++(define_insn "ashrsi3" ++ [(set (match_operand:SI 0 "register_operand" "=r,r") ++ (ashiftrt:SI (match_operand:SI 1 "register_operand" "r,r") ++ (match_operand:SI 2 "shift_operand" "r,L")))] ++ "" ++ "sra%i2\\t%0, %1, %z2" ++ [(set_attr "type" "shift")]) ++ ++(define_insn "lshrsi3" ++ [(set (match_operand:SI 0 "register_operand" "=r,r") ++ (lshiftrt:SI (match_operand:SI 1 "register_operand" "r,r") ++ (match_operand:SI 2 "shift_operand" "r,L")))] ++ "" ++ "srl%i2\\t%0, %1, %z2" ++ [(set_attr "type" "shift")]) ++ ++(define_insn "rotlsi3" ++ [(set (match_operand:SI 0 "register_operand" "=r,r") ++ (rotate:SI (match_operand:SI 1 "register_operand" "r,r") ++ (match_operand:SI 2 "shift_operand" "r,L")))] ++ "" ++ "rol%i2\\t%0, %1, %z2" ++ [(set_attr "type" "shift")]) ++ ++(define_insn "rotrsi3" ++ [(set (match_operand:SI 0 "register_operand" "=r,r") ++ (rotatert:SI (match_operand:SI 1 "register_operand" "r,r") ++ (match_operand:SI 2 "register_operand" "r,r")))] ++ "" ++ "ror\\t%0, %1, %2" ++ [(set_attr "type" "shift")]) ++ ++(define_insn "*shift_mul_constants" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (ashift:SI (mult:SI (match_operand:SI 1 "register_operand" "r") ++ (match_operand:SI 2 "const_int_operand" "I")) ++ (match_operand:SI 3 "const_int_operand" "I")))] ++ "TARGET_HAS_MUL && SMALL_INT (INTVAL (operands[2]) << INTVAL (operands[3]))" ++{ ++ HOST_WIDE_INT mul = INTVAL (operands[2]) << INTVAL (operands[3]); ++ rtx ops[3]; ++ ++ ops[0] = operands[0]; ++ ops[1] = operands[1]; ++ ops[2] = GEN_INT (mul); ++ ++ output_asm_insn ("muli\t%0, %1, %2", ops); ++ return ""; ++} ++ [(set_attr "type" "mul")]) ++ ++ ++ ++ ++;***************************************************************************** ++;* ++;* Prologue, Epilogue and Return ++;* ++;***************************************************************************** ++ ++(define_expand "prologue" ++ [(const_int 1)] ++ "" ++{ ++ expand_prologue (); ++ DONE; ++}) ++ ++(define_expand "epilogue" ++ [(return)] ++ "" ++{ ++ expand_epilogue (false); ++ DONE; ++}) ++ ++(define_expand "sibcall_epilogue" ++ [(return)] ++ "" ++{ ++ expand_epilogue (true); ++ DONE; ++}) ++ ++(define_insn "return" ++ [(return)] ++ "reload_completed && nios2_can_use_return_insn ()" ++ "ret\\t" ++) ++ ++(define_insn "return_from_epilogue" ++ [(use (match_operand 0 "pmode_register_operand" "")) ++ (return)] ++ "reload_completed" ++ "ret\\t" ++) ++ ++;; Block any insns from being moved before this point, since the ++;; profiling call to mcount can use various registers that aren't ++;; saved or used to pass arguments. ++ ++(define_insn "blockage" ++ [(unspec_volatile [(const_int 0)] UNSPEC_BLOCKAGE)] ++ "" ++ "" ++ [(set_attr "type" "unknown") ++ (set_attr "length" "0")]) ++ ++ ++ ++;***************************************************************************** ++;* ++;* Jumps and Calls ++;* ++;***************************************************************************** ++ ++(define_insn "indirect_jump" ++ [(set (pc) (match_operand:SI 0 "register_operand" "r"))] ++ "" ++ "jmp\\t%0" ++ [(set_attr "type" "control")]) ++ ++(define_insn "jump" ++ [(set (pc) ++ (label_ref (match_operand 0 "" "")))] ++ "" ++ "br\\t%0" ++ [(set_attr "type" "control")]) ++ ++ ++(define_insn "indirect_call" ++ [(call (mem:QI (match_operand:SI 0 "register_operand" "r")) ++ (match_operand 1 "" "")) ++ (clobber (reg:SI RA_REGNO))] ++ "" ++ "callr\\t%0" ++ [(set_attr "type" "control")]) ++ ++(define_insn "indirect_call_value" ++ [(set (match_operand 0 "" "") ++ (call (mem:QI (match_operand:SI 1 "register_operand" "r")) ++ (match_operand 2 "" ""))) ++ (clobber (reg:SI RA_REGNO))] ++ "" ++ "callr\\t%1" ++) ++ ++(define_expand "call" ++ [(parallel [(call (match_operand 0 "" "") ++ (match_operand 1 "" "")) ++ (clobber (reg:SI RA_REGNO))])] ++ "" ++ "") ++ ++(define_expand "call_value" ++ [(parallel [(set (match_operand 0 "" "") ++ (call (match_operand 1 "" "") ++ (match_operand 2 "" ""))) ++ (clobber (reg:SI RA_REGNO))])] ++ "" ++ "") ++ ++(define_insn "*call" ++ [(call (mem:QI (match_operand:SI 0 "immediate_operand" "i")) ++ (match_operand 1 "" "")) ++ (clobber (match_operand:SI 2 "register_operand" "=r"))] ++ "" ++ "call\\t%0" ++ [(set_attr "type" "control")]) ++ ++(define_insn "*call_value" ++ [(set (match_operand 0 "" "") ++ (call (mem:QI (match_operand:SI 1 "immediate_operand" "i")) ++ (match_operand 2 "" ""))) ++ (clobber (match_operand:SI 3 "register_operand" "=r"))] ++ "" ++ "call\\t%1" ++ [(set_attr "type" "control")]) ++ ++(define_expand "sibcall" ++ [(parallel [(call (match_operand 0 "" "") ++ (match_operand 1 "" "")) ++ (return) ++ (use (match_operand 2 "" ""))])] ++ "" ++ { ++ XEXP (operands[0], 0) = copy_to_mode_reg (SImode, XEXP (operands[0], 0)); ++ ++ if (operands[2] == NULL_RTX) ++ operands[2] = const0_rtx; ++ } ++) ++ ++(define_expand "sibcall_value" ++ [(parallel [(set (match_operand 0 "" "") ++ (call (match_operand 1 "" "") ++ (match_operand 2 "" ""))) ++ (return) ++ (use (match_operand 3 "" ""))])] ++ "" ++ { ++ XEXP (operands[1], 0) = copy_to_mode_reg (SImode, XEXP (operands[1], 0)); ++ ++ if (operands[3] == NULL_RTX) ++ operands[3] = const0_rtx; ++ } ++) ++ ++(define_insn "sibcall_insn" ++ [(call (mem:QI (match_operand:SI 0 "register_operand" "r")) ++ (match_operand 1 "" "")) ++ (return) ++ (use (match_operand 2 "" ""))] ++ "" ++ "jmp\\t%0" ++) ++ ++(define_insn "sibcall_value_insn" ++ [(set (match_operand 0 "register_operand" "") ++ (call (mem:QI (match_operand:SI 1 "register_operand" "r")) ++ (match_operand 2 "" ""))) ++ (return) ++ (use (match_operand 3 "" ""))] ++ "" ++ "jmp\\t%1" ++) ++ ++ ++ ++ ++(define_expand "tablejump" ++ [(parallel [(set (pc) (match_operand 0 "register_operand" "r")) ++ (use (label_ref (match_operand 1 "" "")))])] ++ "" ++ "" ++) ++ ++(define_insn "*tablejump" ++ [(set (pc) ++ (match_operand:SI 0 "register_operand" "r")) ++ (use (label_ref (match_operand 1 "" "")))] ++ "" ++ "jmp\\t%0" ++ [(set_attr "type" "control")]) ++ ++ ++ ++;***************************************************************************** ++;* ++;* Comparisons ++;* ++;***************************************************************************** ++;; Flow here is rather complex (based on MIPS): ++;; ++;; 1) The cmp{si,di,sf,df} routine is called. It deposits the ++;; arguments into the branch_cmp array, and the type into ++;; branch_type. No RTL is generated. ++;; ++;; 2) The appropriate branch define_expand is called, which then ++;; creates the appropriate RTL for the comparison and branch. ++;; Different CC modes are used, based on what type of branch is ++;; done, so that we can constrain things appropriately. There ++;; are assumptions in the rest of GCC that break if we fold the ++;; operands into the branchs for integer operations, and use cc0 ++;; for floating point, so we use the fp status register instead. ++;; If needed, an appropriate temporary is created to hold the ++;; of the integer compare. ++ ++(define_expand "cmpsi" ++ [(set (cc0) ++ (compare:CC (match_operand:SI 0 "register_operand" "") ++ (match_operand:SI 1 "arith_operand" "")))] ++ "" ++{ ++ branch_cmp[0] = operands[0]; ++ branch_cmp[1] = operands[1]; ++ branch_type = CMP_SI; ++ DONE; ++}) ++ ++(define_expand "tstsi" ++ [(set (cc0) ++ (match_operand:SI 0 "register_operand" ""))] ++ "" ++{ ++ branch_cmp[0] = operands[0]; ++ branch_cmp[1] = const0_rtx; ++ branch_type = CMP_SI; ++ DONE; ++}) ++ ++ ++;***************************************************************************** ++;* ++;* setting a register from a comparison ++;* ++;***************************************************************************** ++ ++(define_expand "seq" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (eq:SI (match_dup 1) ++ (match_dup 2)))] ++ "" ++{ ++ if (branch_type != CMP_SI) ++ FAIL; ++ ++ /* set up operands from compare. */ ++ operands[1] = branch_cmp[0]; ++ operands[2] = branch_cmp[1]; ++ ++ gen_int_relational (EQ, operands[0], operands[1], operands[2], NULL_RTX); ++ DONE; ++}) ++ ++ ++(define_insn "*seq" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (eq:SI (match_operand:SI 1 "reg_or_0_operand" "%rM") ++ (match_operand:SI 2 "arith_operand" "rI")))] ++ "" ++ "cmpeq%i2\\t%0, %z1, %z2" ++ [(set_attr "type" "alu")]) ++ ++ ++(define_expand "sne" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (ne:SI (match_dup 1) ++ (match_dup 2)))] ++ "" ++{ ++ if (branch_type != CMP_SI) ++ FAIL; ++ ++ /* set up operands from compare. */ ++ operands[1] = branch_cmp[0]; ++ operands[2] = branch_cmp[1]; ++ ++ gen_int_relational (NE, operands[0], operands[1], operands[2], NULL_RTX); ++ DONE; ++}) ++ ++ ++(define_insn "*sne" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (ne:SI (match_operand:SI 1 "reg_or_0_operand" "%rM") ++ (match_operand:SI 2 "arith_operand" "rI")))] ++ "" ++ "cmpne%i2\\t%0, %z1, %z2" ++ [(set_attr "type" "alu")]) ++ ++ ++(define_expand "sgt" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (gt:SI (match_dup 1) ++ (match_dup 2)))] ++ "" ++{ ++ if (branch_type != CMP_SI) ++ FAIL; ++ ++ /* set up operands from compare. */ ++ operands[1] = branch_cmp[0]; ++ operands[2] = branch_cmp[1]; ++ ++ gen_int_relational (GT, operands[0], operands[1], operands[2], NULL_RTX); ++ DONE; ++}) ++ ++ ++(define_insn "*sgt" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (gt:SI (match_operand:SI 1 "reg_or_0_operand" "rM") ++ (match_operand:SI 2 "reg_or_0_operand" "rM")))] ++ "" ++ "cmplt\\t%0, %z2, %z1" ++ [(set_attr "type" "alu")]) ++ ++ ++(define_expand "sge" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (ge:SI (match_dup 1) ++ (match_dup 2)))] ++ "" ++{ ++ if (branch_type != CMP_SI) ++ FAIL; ++ ++ /* set up operands from compare. */ ++ operands[1] = branch_cmp[0]; ++ operands[2] = branch_cmp[1]; ++ ++ gen_int_relational (GE, operands[0], operands[1], operands[2], NULL_RTX); ++ DONE; ++}) ++ ++ ++(define_insn "*sge" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (ge:SI (match_operand:SI 1 "reg_or_0_operand" "rM") ++ (match_operand:SI 2 "arith_operand" "rI")))] ++ "" ++ "cmpge%i2\\t%0, %z1, %z2" ++ [(set_attr "type" "alu")]) ++ ++(define_expand "sle" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (le:SI (match_dup 1) ++ (match_dup 2)))] ++ "" ++{ ++ if (branch_type != CMP_SI) ++ FAIL; ++ ++ /* set up operands from compare. */ ++ operands[1] = branch_cmp[0]; ++ operands[2] = branch_cmp[1]; ++ ++ gen_int_relational (LE, operands[0], operands[1], operands[2], NULL_RTX); ++ DONE; ++}) ++ ++ ++(define_insn "*sle" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (le:SI (match_operand:SI 1 "reg_or_0_operand" "rM") ++ (match_operand:SI 2 "reg_or_0_operand" "rM")))] ++ "" ++ "cmpge\\t%0, %z2, %z1" ++ [(set_attr "type" "alu")]) ++ ++ ++(define_expand "slt" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (lt:SI (match_dup 1) ++ (match_dup 2)))] ++ "" ++{ ++ if (branch_type != CMP_SI) ++ FAIL; ++ ++ /* set up operands from compare. */ ++ operands[1] = branch_cmp[0]; ++ operands[2] = branch_cmp[1]; ++ ++ gen_int_relational (LT, operands[0], operands[1], operands[2], NULL_RTX); ++ DONE; ++}) ++ ++ ++(define_insn "*slt" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (lt:SI (match_operand:SI 1 "reg_or_0_operand" "rM") ++ (match_operand:SI 2 "arith_operand" "rI")))] ++ "" ++ "cmplt%i2\\t%0, %z1, %z2" ++ [(set_attr "type" "alu")]) ++ ++ ++(define_expand "sgtu" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (gtu:SI (match_dup 1) ++ (match_dup 2)))] ++ "" ++{ ++ if (branch_type != CMP_SI) ++ FAIL; ++ ++ /* set up operands from compare. */ ++ operands[1] = branch_cmp[0]; ++ operands[2] = branch_cmp[1]; ++ ++ gen_int_relational (GTU, operands[0], operands[1], operands[2], NULL_RTX); ++ DONE; ++}) ++ ++ ++(define_insn "*sgtu" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (gtu:SI (match_operand:SI 1 "reg_or_0_operand" "rM") ++ (match_operand:SI 2 "reg_or_0_operand" "rM")))] ++ "" ++ "cmpltu\\t%0, %z2, %z1" ++ [(set_attr "type" "alu")]) ++ ++ ++(define_expand "sgeu" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (geu:SI (match_dup 1) ++ (match_dup 2)))] ++ "" ++{ ++ if (branch_type != CMP_SI) ++ FAIL; ++ ++ /* set up operands from compare. */ ++ operands[1] = branch_cmp[0]; ++ operands[2] = branch_cmp[1]; ++ ++ gen_int_relational (GEU, operands[0], operands[1], operands[2], NULL_RTX); ++ DONE; ++}) ++ ++ ++(define_insn "*sgeu" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (geu:SI (match_operand:SI 1 "reg_or_0_operand" "rM") ++ (match_operand:SI 2 "uns_arith_operand" "rJ")))] ++ "" ++ "cmpgeu%i2\\t%0, %z1, %z2" ++ [(set_attr "type" "alu")]) ++ ++(define_expand "sleu" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (leu:SI (match_dup 1) ++ (match_dup 2)))] ++ "" ++{ ++ if (branch_type != CMP_SI) ++ FAIL; ++ ++ /* set up operands from compare. */ ++ operands[1] = branch_cmp[0]; ++ operands[2] = branch_cmp[1]; ++ ++ gen_int_relational (LEU, operands[0], operands[1], operands[2], NULL_RTX); ++ DONE; ++}) ++ ++ ++(define_insn "*sleu" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (leu:SI (match_operand:SI 1 "reg_or_0_operand" "rM") ++ (match_operand:SI 2 "reg_or_0_operand" "rM")))] ++ "" ++ "cmpgeu\\t%0, %z2, %z1" ++ [(set_attr "type" "alu")]) ++ ++ ++(define_expand "sltu" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (ltu:SI (match_dup 1) ++ (match_dup 2)))] ++ "" ++{ ++ if (branch_type != CMP_SI) ++ FAIL; ++ ++ /* set up operands from compare. */ ++ operands[1] = branch_cmp[0]; ++ operands[2] = branch_cmp[1]; ++ ++ gen_int_relational (LTU, operands[0], operands[1], operands[2], NULL_RTX); ++ DONE; ++}) ++ ++ ++(define_insn "*sltu" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (ltu:SI (match_operand:SI 1 "reg_or_0_operand" "rM") ++ (match_operand:SI 2 "uns_arith_operand" "rJ")))] ++ "" ++ "cmpltu%i2\\t%0, %z1, %z2" ++ [(set_attr "type" "alu")]) ++ ++ ++ ++ ++;***************************************************************************** ++;* ++;* branches ++;* ++;***************************************************************************** ++ ++(define_insn "*cbranch" ++ [(set (pc) ++ (if_then_else ++ (match_operator:SI 0 "comparison_operator" ++ [(match_operand:SI 2 "reg_or_0_operand" "rM") ++ (match_operand:SI 3 "reg_or_0_operand" "rM")]) ++ (label_ref (match_operand 1 "" "")) ++ (pc)))] ++ "" ++ "b%0\\t%z2, %z3, %l1" ++ [(set_attr "type" "control")]) ++ ++ ++(define_expand "beq" ++ [(set (pc) ++ (if_then_else (eq:CC (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++{ ++ gen_int_relational (EQ, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]); ++ DONE; ++}) ++ ++ ++(define_expand "bne" ++ [(set (pc) ++ (if_then_else (ne:CC (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++{ ++ gen_int_relational (NE, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]); ++ DONE; ++}) ++ ++ ++(define_expand "bgt" ++ [(set (pc) ++ (if_then_else (gt:CC (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++{ ++ gen_int_relational (GT, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]); ++ DONE; ++}) ++ ++(define_expand "bge" ++ [(set (pc) ++ (if_then_else (ge:CC (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++{ ++ gen_int_relational (GE, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]); ++ DONE; ++}) ++ ++(define_expand "ble" ++ [(set (pc) ++ (if_then_else (le:CC (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++{ ++ gen_int_relational (LE, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]); ++ DONE; ++}) ++ ++(define_expand "blt" ++ [(set (pc) ++ (if_then_else (lt:CC (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++{ ++ gen_int_relational (LT, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]); ++ DONE; ++}) ++ ++ ++(define_expand "bgtu" ++ [(set (pc) ++ (if_then_else (gtu:CC (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++{ ++ gen_int_relational (GTU, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]); ++ DONE; ++}) ++ ++(define_expand "bgeu" ++ [(set (pc) ++ (if_then_else (geu:CC (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++{ ++ gen_int_relational (GEU, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]); ++ DONE; ++}) ++ ++(define_expand "bleu" ++ [(set (pc) ++ (if_then_else (leu:CC (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++{ ++ gen_int_relational (LEU, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]); ++ DONE; ++}) ++ ++(define_expand "bltu" ++ [(set (pc) ++ (if_then_else (ltu:CC (cc0) ++ (const_int 0)) ++ (label_ref (match_operand 0 "" "")) ++ (pc)))] ++ "" ++{ ++ gen_int_relational (LTU, NULL_RTX, branch_cmp[0], branch_cmp[1], operands[0]); ++ DONE; ++}) ++ ++ ++;***************************************************************************** ++;* ++;* String and Block Operations ++;* ++;***************************************************************************** ++ ++; ??? This is all really a hack to get Dhrystone to work as fast as possible ++; things to be fixed: ++; * let the compiler core handle all of this, for that to work the extra ++; aliasing needs to be addressed. ++; * we use three temporary registers for loading and storing to ensure no ++; ld use stalls, this is excessive, because after the first ld/st only ++; two are needed. Only two would be needed all the way through if ++; we could schedule with other code. Consider: ++; 1 ld $1, 0($src) ++; 2 ld $2, 4($src) ++; 3 ld $3, 8($src) ++; 4 st $1, 0($dest) ++; 5 ld $1, 12($src) ++; 6 st $2, 4($src) ++; 7 etc. ++; The first store has to wait until 4. If it does not there will be one ++; cycle of stalling. However, if any other instruction could be placed ++; between 1 and 4, $3 would not be needed. ++; * In small we probably don't want to ever do this ourself because there ++; is no ld use stall. ++ ++(define_expand "movstrsi" ++ [(parallel [(set (match_operand:BLK 0 "general_operand" "") ++ (match_operand:BLK 1 "general_operand" "")) ++ (use (match_operand:SI 2 "const_int_operand" "")) ++ (use (match_operand:SI 3 "const_int_operand" "")) ++ (clobber (match_scratch:SI 4 "=&r")) ++ (clobber (match_scratch:SI 5 "=&r")) ++ (clobber (match_scratch:SI 6 "=&r"))])] ++ "TARGET_INLINE_MEMCPY" ++{ ++ rtx ld_addr_reg, st_addr_reg; ++ ++ /* If the predicate for op2 fails in expr.c:emit_block_move_via_movstr ++ it trys to copy to a register, but does not re-try the predicate. ++ ??? Intead of fixing expr.c, I fix it here. */ ++ if (!const_int_operand (operands[2], SImode)) ++ FAIL; ++ ++ /* ??? there are some magic numbers which need to be sorted out here. ++ the basis for them is not increasing code size hugely or going ++ out of range of offset addressing */ ++ if (INTVAL (operands[3]) < 4) ++ FAIL; ++ if (!optimize ++ || (optimize_size && INTVAL (operands[2]) > 12) ++ || (optimize < 3 && INTVAL (operands[2]) > 100) ++ || INTVAL (operands[2]) > 200) ++ FAIL; ++ ++ st_addr_reg ++ = replace_equiv_address (operands[0], ++ copy_to_mode_reg (Pmode, XEXP (operands[0], 0))); ++ ld_addr_reg ++ = replace_equiv_address (operands[1], ++ copy_to_mode_reg (Pmode, XEXP (operands[1], 0))); ++ emit_insn (gen_movstrsi_internal (st_addr_reg, ld_addr_reg, ++ operands[2], operands[3])); ++ ++ DONE; ++}) ++ ++ ++(define_insn "movstrsi_internal" ++ [(set (match_operand:BLK 0 "memory_operand" "=o") ++ (match_operand:BLK 1 "memory_operand" "o")) ++ (use (match_operand:SI 2 "const_int_operand" "i")) ++ (use (match_operand:SI 3 "const_int_operand" "i")) ++ (clobber (match_scratch:SI 4 "=&r")) ++ (clobber (match_scratch:SI 5 "=&r")) ++ (clobber (match_scratch:SI 6 "=&r"))] ++ "TARGET_INLINE_MEMCPY" ++{ ++ int ld_offset = INTVAL (operands[2]); ++ int ld_len = INTVAL (operands[2]); ++ int ld_reg = 0; ++ rtx ld_addr_reg = XEXP (operands[1], 0); ++ int st_offset = INTVAL (operands[2]); ++ int st_len = INTVAL (operands[2]); ++ int st_reg = 0; ++ rtx st_addr_reg = XEXP (operands[0], 0); ++ int delay_count = 0; ++ ++ /* ops[0] is the address used by the insn ++ ops[1] is the register being loaded or stored */ ++ rtx ops[2]; ++ ++ if (INTVAL (operands[3]) < 4) ++ abort (); ++ ++ while (ld_offset >= 4) ++ { ++ /* if the load use delay has been met, I can start ++ storing */ ++ if (delay_count >= 3) ++ { ++ ops[0] = gen_rtx (MEM, SImode, ++ plus_constant (st_addr_reg, st_len - st_offset)); ++ ops[1] = operands[st_reg + 4]; ++ output_asm_insn ("stw\t%1, %0", ops); ++ ++ st_reg = (st_reg + 1) % 3; ++ st_offset -= 4; ++ } ++ ++ ops[0] = gen_rtx (MEM, SImode, ++ plus_constant (ld_addr_reg, ld_len - ld_offset)); ++ ops[1] = operands[ld_reg + 4]; ++ output_asm_insn ("ldw\t%1, %0", ops); ++ ++ ld_reg = (ld_reg + 1) % 3; ++ ld_offset -= 4; ++ delay_count++; ++ } ++ ++ if (ld_offset >= 2) ++ { ++ /* if the load use delay has been met, I can start ++ storing */ ++ if (delay_count >= 3) ++ { ++ ops[0] = gen_rtx (MEM, SImode, ++ plus_constant (st_addr_reg, st_len - st_offset)); ++ ops[1] = operands[st_reg + 4]; ++ output_asm_insn ("stw\t%1, %0", ops); ++ ++ st_reg = (st_reg + 1) % 3; ++ st_offset -= 4; ++ } ++ ++ ops[0] = gen_rtx (MEM, HImode, ++ plus_constant (ld_addr_reg, ld_len - ld_offset)); ++ ops[1] = operands[ld_reg + 4]; ++ output_asm_insn ("ldh\t%1, %0", ops); ++ ++ ld_reg = (ld_reg + 1) % 3; ++ ld_offset -= 2; ++ delay_count++; ++ } ++ ++ if (ld_offset >= 1) ++ { ++ /* if the load use delay has been met, I can start ++ storing */ ++ if (delay_count >= 3) ++ { ++ ops[0] = gen_rtx (MEM, SImode, ++ plus_constant (st_addr_reg, st_len - st_offset)); ++ ops[1] = operands[st_reg + 4]; ++ output_asm_insn ("stw\t%1, %0", ops); ++ ++ st_reg = (st_reg + 1) % 3; ++ st_offset -= 4; ++ } ++ ++ ops[0] = gen_rtx (MEM, QImode, ++ plus_constant (ld_addr_reg, ld_len - ld_offset)); ++ ops[1] = operands[ld_reg + 4]; ++ output_asm_insn ("ldb\t%1, %0", ops); ++ ++ ld_reg = (ld_reg + 1) % 3; ++ ld_offset -= 1; ++ delay_count++; ++ } ++ ++ while (st_offset >= 4) ++ { ++ ops[0] = gen_rtx (MEM, SImode, ++ plus_constant (st_addr_reg, st_len - st_offset)); ++ ops[1] = operands[st_reg + 4]; ++ output_asm_insn ("stw\t%1, %0", ops); ++ ++ st_reg = (st_reg + 1) % 3; ++ st_offset -= 4; ++ } ++ ++ while (st_offset >= 2) ++ { ++ ops[0] = gen_rtx (MEM, HImode, ++ plus_constant (st_addr_reg, st_len - st_offset)); ++ ops[1] = operands[st_reg + 4]; ++ output_asm_insn ("sth\t%1, %0", ops); ++ ++ st_reg = (st_reg + 1) % 3; ++ st_offset -= 2; ++ } ++ ++ while (st_offset >= 1) ++ { ++ ops[0] = gen_rtx (MEM, QImode, ++ plus_constant (st_addr_reg, st_len - st_offset)); ++ ops[1] = operands[st_reg + 4]; ++ output_asm_insn ("stb\t%1, %0", ops); ++ ++ st_reg = (st_reg + 1) % 3; ++ st_offset -= 1; ++ } ++ ++ return ""; ++} ++; ??? lengths are not being used yet, but I will probably forget ++; to update this once I am using lengths, so set it to something ++; definetely big enough to cover it. 400 allows for 200 bytes ++; of motion. ++ [(set_attr "length" "400")]) ++ ++ ++ ++;***************************************************************************** ++;* ++;* Custom instructions ++;* ++;***************************************************************************** ++ ++(define_constants [ ++ (CUSTOM_N 100) ++ (CUSTOM_NI 101) ++ (CUSTOM_NF 102) ++ (CUSTOM_NP 103) ++ (CUSTOM_NII 104) ++ (CUSTOM_NIF 105) ++ (CUSTOM_NIP 106) ++ (CUSTOM_NFI 107) ++ (CUSTOM_NFF 108) ++ (CUSTOM_NFP 109) ++ (CUSTOM_NPI 110) ++ (CUSTOM_NPF 111) ++ (CUSTOM_NPP 112) ++ (CUSTOM_IN 113) ++ (CUSTOM_INI 114) ++ (CUSTOM_INF 115) ++ (CUSTOM_INP 116) ++ (CUSTOM_INII 117) ++ (CUSTOM_INIF 118) ++ (CUSTOM_INIP 119) ++ (CUSTOM_INFI 120) ++ (CUSTOM_INFF 121) ++ (CUSTOM_INFP 122) ++ (CUSTOM_INPI 123) ++ (CUSTOM_INPF 124) ++ (CUSTOM_INPP 125) ++ (CUSTOM_FN 126) ++ (CUSTOM_FNI 127) ++ (CUSTOM_FNF 128) ++ (CUSTOM_FNP 129) ++ (CUSTOM_FNII 130) ++ (CUSTOM_FNIF 131) ++ (CUSTOM_FNIP 132) ++ (CUSTOM_FNFI 133) ++ (CUSTOM_FNFF 134) ++ (CUSTOM_FNFP 135) ++ (CUSTOM_FNPI 136) ++ (CUSTOM_FNPF 137) ++ (CUSTOM_FNPP 138) ++ (CUSTOM_PN 139) ++ (CUSTOM_PNI 140) ++ (CUSTOM_PNF 141) ++ (CUSTOM_PNP 142) ++ (CUSTOM_PNII 143) ++ (CUSTOM_PNIF 144) ++ (CUSTOM_PNIP 145) ++ (CUSTOM_PNFI 146) ++ (CUSTOM_PNFF 147) ++ (CUSTOM_PNFP 148) ++ (CUSTOM_PNPI 149) ++ (CUSTOM_PNPF 150) ++ (CUSTOM_PNPP 151) ++]) ++ ++ ++(define_insn "custom_n" ++ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N")] CUSTOM_N)] ++ "" ++ "custom\\t%0, zero, zero, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_ni" ++ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N") ++ (match_operand:SI 1 "register_operand" "r")] CUSTOM_NI)] ++ "" ++ "custom\\t%0, zero, %1, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_nf" ++ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N") ++ (match_operand:SF 1 "register_operand" "r")] CUSTOM_NF)] ++ "" ++ "custom\\t%0, zero, %1, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_np" ++ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N") ++ (match_operand:SI 1 "register_operand" "r")] CUSTOM_NP)] ++ "" ++ "custom\\t%0, zero, %1, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_nii" ++ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N") ++ (match_operand:SI 1 "register_operand" "r") ++ (match_operand:SI 2 "register_operand" "r")] CUSTOM_NII)] ++ "" ++ "custom\\t%0, zero, %1, %2" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_nif" ++ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N") ++ (match_operand:SI 1 "register_operand" "r") ++ (match_operand:SF 2 "register_operand" "r")] CUSTOM_NIF)] ++ "" ++ "custom\\t%0, zero, %1, %2" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_nip" ++ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N") ++ (match_operand:SI 1 "register_operand" "r") ++ (match_operand:SI 2 "register_operand" "r")] CUSTOM_NIP)] ++ "" ++ "custom\\t%0, zero, %1, %2" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_nfi" ++ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N") ++ (match_operand:SF 1 "register_operand" "r") ++ (match_operand:SI 2 "register_operand" "r")] CUSTOM_NFI)] ++ "" ++ "custom\\t%0, zero, %1, %2" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_nff" ++ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N") ++ (match_operand:SF 1 "register_operand" "r") ++ (match_operand:SF 2 "register_operand" "r")] CUSTOM_NFF)] ++ "" ++ "custom\\t%0, zero, %1, %2" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_nfp" ++ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N") ++ (match_operand:SF 1 "register_operand" "r") ++ (match_operand:SI 2 "register_operand" "r")] CUSTOM_NFP)] ++ "" ++ "custom\\t%0, zero, %1, %2" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_npi" ++ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N") ++ (match_operand:SI 1 "register_operand" "r") ++ (match_operand:SI 2 "register_operand" "r")] CUSTOM_NPI)] ++ "" ++ "custom\\t%0, zero, %1, %2" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_npf" ++ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N") ++ (match_operand:SI 1 "register_operand" "r") ++ (match_operand:SF 2 "register_operand" "r")] CUSTOM_NPF)] ++ "" ++ "custom\\t%0, zero, %1, %2" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_npp" ++ [(unspec_volatile [(match_operand:SI 0 "custom_insn_opcode" "N") ++ (match_operand:SI 1 "register_operand" "r") ++ (match_operand:SI 2 "register_operand" "r")] CUSTOM_NPP)] ++ "" ++ "custom\\t%0, zero, %1, %2" ++ [(set_attr "type" "custom")]) ++ ++ ++ ++(define_insn "custom_in" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")] CUSTOM_IN))] ++ "" ++ "custom\\t%1, %0, zero, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_ini" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r")] CUSTOM_INI))] ++ "" ++ "custom\\t%1, %0, %2, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_inf" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SF 2 "register_operand" "r")] CUSTOM_INF))] ++ "" ++ "custom\\t%1, %0, %2, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_inp" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r")] CUSTOM_INP))] ++ "" ++ "custom\\t%1, %0, %2, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_inii" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_INII))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_inif" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SF 3 "register_operand" "r")] CUSTOM_INIF))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_inip" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_INIP))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_infi" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SF 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_INFI))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_inff" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SF 2 "register_operand" "r") ++ (match_operand:SF 3 "register_operand" "r")] CUSTOM_INFF))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_infp" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SF 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_INFP))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_inpi" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_INPI))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_inpf" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SF 3 "register_operand" "r")] CUSTOM_INPF))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_inpp" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_INPP))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++ ++ ++ ++ ++(define_insn "custom_fn" ++ [(set (match_operand:SF 0 "register_operand" "=r") ++ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N")] CUSTOM_FN))] ++ "" ++ "custom\\t%1, %0, zero, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_fni" ++ [(set (match_operand:SF 0 "register_operand" "=r") ++ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r")] CUSTOM_FNI))] ++ "" ++ "custom\\t%1, %0, %2, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_fnf" ++ [(set (match_operand:SF 0 "register_operand" "=r") ++ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SF 2 "register_operand" "r")] CUSTOM_FNF))] ++ "" ++ "custom\\t%1, %0, %2, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_fnp" ++ [(set (match_operand:SF 0 "register_operand" "=r") ++ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r")] CUSTOM_FNP))] ++ "" ++ "custom\\t%1, %0, %2, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_fnii" ++ [(set (match_operand:SF 0 "register_operand" "=r") ++ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_FNII))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_fnif" ++ [(set (match_operand:SF 0 "register_operand" "=r") ++ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SF 3 "register_operand" "r")] CUSTOM_FNIF))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_fnip" ++ [(set (match_operand:SF 0 "register_operand" "=r") ++ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_FNIP))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_fnfi" ++ [(set (match_operand:SF 0 "register_operand" "=r") ++ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SF 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_FNFI))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_fnff" ++ [(set (match_operand:SF 0 "register_operand" "=r") ++ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SF 2 "register_operand" "r") ++ (match_operand:SF 3 "register_operand" "r")] CUSTOM_FNFF))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_fnfp" ++ [(set (match_operand:SF 0 "register_operand" "=r") ++ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SF 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_FNFP))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_fnpi" ++ [(set (match_operand:SF 0 "register_operand" "=r") ++ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_FNPI))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_fnpf" ++ [(set (match_operand:SF 0 "register_operand" "=r") ++ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SF 3 "register_operand" "r")] CUSTOM_FNPF))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_fnpp" ++ [(set (match_operand:SF 0 "register_operand" "=r") ++ (unspec_volatile:SF [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_FNPP))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++ ++ ++(define_insn "custom_pn" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N")] CUSTOM_PN))] ++ "" ++ "custom\\t%1, %0, zero, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_pni" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r")] CUSTOM_PNI))] ++ "" ++ "custom\\t%1, %0, %2, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_pnf" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SF 2 "register_operand" "r")] CUSTOM_PNF))] ++ "" ++ "custom\\t%1, %0, %2, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_pnp" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r")] CUSTOM_PNP))] ++ "" ++ "custom\\t%1, %0, %2, zero" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_pnii" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_PNII))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_pnif" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SF 3 "register_operand" "r")] CUSTOM_PNIF))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_pnip" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_PNIP))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_pnfi" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SF 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_PNFI))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_pnff" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SF 2 "register_operand" "r") ++ (match_operand:SF 3 "register_operand" "r")] CUSTOM_PNFF))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_pnfp" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SF 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_PNFP))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_pnpi" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_PNPI))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_pnpf" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SF 3 "register_operand" "r")] CUSTOM_PNPF))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++(define_insn "custom_pnpp" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "custom_insn_opcode" "N") ++ (match_operand:SI 2 "register_operand" "r") ++ (match_operand:SI 3 "register_operand" "r")] CUSTOM_PNPP))] ++ "" ++ "custom\\t%1, %0, %2, %3" ++ [(set_attr "type" "custom")]) ++ ++ ++ ++ ++ ++ ++;***************************************************************************** ++;* ++;* Misc ++;* ++;***************************************************************************** ++ ++(define_insn "nop" ++ [(const_int 0)] ++ "" ++ "nop\\t" ++ [(set_attr "type" "alu")]) ++ ++(define_insn "sync" ++ [(unspec_volatile [(const_int 0)] UNSPEC_SYNC)] ++ "" ++ "sync\\t" ++ [(set_attr "type" "control")]) ++ ++ ++(define_insn "rdctl" ++ [(set (match_operand:SI 0 "register_operand" "=r") ++ (unspec_volatile:SI [(match_operand:SI 1 "rdwrctl_operand" "O")] UNSPEC_RDCTL))] ++ "" ++ "rdctl\\t%0, ctl%1" ++ [(set_attr "type" "control")]) ++ ++(define_insn "wrctl" ++ [(unspec_volatile:SI [(match_operand:SI 0 "rdwrctl_operand" "O") ++ (match_operand:SI 1 "register_operand" "r")] UNSPEC_WRCTL)] ++ "" ++ "wrctl\\tctl%0, %1" ++ [(set_attr "type" "control")]) ++ ++ ++ ++;***************************************************************************** ++;* ++;* Peepholes ++;* ++;***************************************************************************** ++ ++ +--- gcc-3.4.3/gcc/config/nios2/t-nios2 ++++ gcc-3.4.3-nios2/gcc/config/nios2/t-nios2 +@@ -0,0 +1,123 @@ ++## ++## Compiler flags to use when compiling libgcc2.c. ++## ++## LIB2FUNCS_EXTRA ++## A list of source file names to be compiled or assembled and inserted into libgcc.a. ++ ++LIB2FUNCS_EXTRA=$(srcdir)/config/nios2/lib2-divmod.c \ ++ $(srcdir)/config/nios2/lib2-divmod-hi.c \ ++ $(srcdir)/config/nios2/lib2-divtable.c \ ++ $(srcdir)/config/nios2/lib2-mul.c ++ ++## ++## Floating Point Emulation ++## To have GCC include software floating point libraries in libgcc.a define FPBIT ++## and DPBIT along with a few rules as follows: ++## ++## # We want fine grained libraries, so use the new code ++## # to build the floating point emulation libraries. ++FPBIT=$(srcdir)/config/nios2/nios2-fp-bit.c ++DPBIT=$(srcdir)/config/nios2/nios2-dp-bit.c ++ ++TARGET_LIBGCC2_CFLAGS = -O2 ++ ++# FLOAT_ONLY - no doubles ++# SMALL_MACHINE - QI/HI is faster than SI ++# Actually SMALL_MACHINE uses chars and shorts instead of ints ++# since ints (16-bit ones as they are today) are at least as fast ++# as chars and shorts, don't define SMALL_MACHINE ++# CMPtype - type returned by FP compare, i.e. INT (hard coded in fp-bit - see code ) ++ ++$(FPBIT): $(srcdir)/config/fp-bit.c Makefile ++ echo '#define FLOAT' > ${FPBIT} ++ cat $(srcdir)/config/fp-bit.c >> ${FPBIT} ++ ++$(DPBIT): $(srcdir)/config/fp-bit.c Makefile ++ echo '' > ${DPBIT} ++ cat $(srcdir)/config/fp-bit.c >> ${DPBIT} ++ ++EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crti.o crtn.o ++ ++# Assemble startup files. ++$(T)crti.o: $(srcdir)/config/nios2/crti.asm $(GCC_PASSES) ++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \ ++ -c -o $(T)crti.o -x assembler-with-cpp $(srcdir)/config/nios2/crti.asm ++ ++$(T)crtn.o: $(srcdir)/config/nios2/crtn.asm $(GCC_PASSES) ++ $(GCC_FOR_TARGET) $(GCC_CFLAGS) $(MULTILIB_CFLAGS) $(INCLUDES) \ ++ -c -o $(T)crtn.o -x assembler-with-cpp $(srcdir)/config/nios2/crtn.asm ++ ++ ++## You may need to provide additional #defines at the beginning of ++## fp-bit.c and dp-bit.c to control target endianness and other options ++## ++## CRTSTUFF_T_CFLAGS ++## Special flags used when compiling crtstuff.c. See Initialization. ++## ++## CRTSTUFF_T_CFLAGS_S ++## Special flags used when compiling crtstuff.c for shared linking. Used ++## if you use crtbeginS.o and crtendS.o in EXTRA-PARTS. See Initialization. ++## ++## MULTILIB_OPTIONS ++## For some targets, invoking GCC in different ways produces objects that ++## can not be linked together. For example, for some targets GCC produces ++## both big and little endian code. For these targets, you must arrange ++## for multiple versions of libgcc.a to be compiled, one for each set of ++## incompatible options. When GCC invokes the linker, it arranges to link ++## in the right version of libgcc.a, based on the command line options ++## used. ++## The MULTILIB_OPTIONS macro lists the set of options for which special ++## versions of libgcc.a must be built. Write options that are mutually ++## incompatible side by side, separated by a slash. Write options that may ++## be used together separated by a space. The build procedure will build ++## all combinations of compatible options. ++## ++## For example, if you set MULTILIB_OPTIONS to m68000/m68020 msoft-float, ++## Makefile will build special versions of libgcc.a using the following ++## sets of options: -m68000, -m68020, -msoft-float, -m68000 -msoft-float, ++## and -m68020 -msoft-float. ++ ++MULTILIB_OPTIONS = mno-hw-mul mhw-mulx ++ ++## MULTILIB_DIRNAMES ++## If MULTILIB_OPTIONS is used, this variable specifies the directory names ++## that should be used to hold the various libraries. Write one element in ++## MULTILIB_DIRNAMES for each element in MULTILIB_OPTIONS. If ++## MULTILIB_DIRNAMES is not used, the default value will be ++## MULTILIB_OPTIONS, with all slashes treated as spaces. ++## For example, if MULTILIB_OPTIONS is set to m68000/m68020 msoft-float, ++## then the default value of MULTILIB_DIRNAMES is m68000 m68020 ++## msoft-float. You may specify a different value if you desire a ++## different set of directory names. ++ ++# MULTILIB_DIRNAMES = ++ ++## MULTILIB_MATCHES ++## Sometimes the same option may be written in two different ways. If an ++## option is listed in MULTILIB_OPTIONS, GCC needs to know about any ++## synonyms. In that case, set MULTILIB_MATCHES to a list of items of the ++## form option=option to describe all relevant synonyms. For example, ++## m68000=mc68000 m68020=mc68020. ++## ++## MULTILIB_EXCEPTIONS ++## Sometimes when there are multiple sets of MULTILIB_OPTIONS being ++## specified, there are combinations that should not be built. In that ++## case, set MULTILIB_EXCEPTIONS to be all of the switch exceptions in ++## shell case syntax that should not be built. ++## For example, in the PowerPC embedded ABI support, it is not desirable to ++## build libraries compiled with the -mcall-aix option and either of the ++## -fleading-underscore or -mlittle options at the same time. Therefore ++## MULTILIB_EXCEPTIONS is set to ++## ++## *mcall-aix/*fleading-underscore* *mlittle/*mcall-aix* ++## ++ ++MULTILIB_EXCEPTIONS = *mno-hw-mul/*mhw-mulx* ++ ++## ++## MULTILIB_EXTRA_OPTS Sometimes it is desirable that when building ++## multiple versions of libgcc.a certain options should always be passed on ++## to the compiler. In that case, set MULTILIB_EXTRA_OPTS to be the list ++## of options to be used for all builds. ++## ++ +--- gcc-3.4.3/gcc/config.gcc ++++ gcc-3.4.3-nios2/gcc/config.gcc +@@ -1321,6 +1321,10 @@ m32rle-*-linux*) + thread_file='posix' + fi + ;; ++# JBG ++nios2-*-* | nios2-*-*) ++ tm_file="elfos.h ${tm_file}" ++ ;; + # m68hc11 and m68hc12 share the same machine description. + m68hc11-*-*|m6811-*-*) + tm_file="dbxelf.h elfos.h m68hc11/m68hc11.h" +--- gcc-3.4.3/gcc/cse.c ++++ gcc-3.4.3-nios2/gcc/cse.c +@@ -3134,6 +3134,10 @@ find_comparison_args (enum rtx_code code + #ifdef FLOAT_STORE_FLAG_VALUE + REAL_VALUE_TYPE fsfv; + #endif ++#ifdef __nios2__ ++ if (p->is_const) ++ break; ++#endif + + /* If the entry isn't valid, skip it. */ + if (! exp_equiv_p (p->exp, p->exp, 1, 0)) +--- gcc-3.4.3/gcc/doc/extend.texi ++++ gcc-3.4.3-nios2/gcc/doc/extend.texi +@@ -5636,12 +5636,118 @@ to those machines. Generally these gene + instructions, but allow the compiler to schedule those calls. + + @menu ++* Altera Nios II Built-in Functions:: + * Alpha Built-in Functions:: + * ARM Built-in Functions:: + * X86 Built-in Functions:: + * PowerPC AltiVec Built-in Functions:: + @end menu + ++@node Altera Nios II Built-in Functions ++@subsection Altera Nios II Built-in Functions ++ ++These built-in functions are available for the Altera Nios II ++family of processors. ++ ++The following built-in functions are always available. They ++all generate the machine instruction that is part of the name. ++ ++@example ++int __builtin_ldbio (volatile const void *) ++int __builtin_ldbuio (volatile const void *) ++int __builtin_ldhio (volatile const void *) ++int __builtin_ldhuio (volatile const void *) ++int __builtin_ldwio (volatile const void *) ++void __builtin_stbio (volatile void *, int) ++void __builtin_sthio (volatile void *, int) ++void __builtin_stwio (volatile void *, int) ++void __builtin_sync (void) ++int __builtin_rdctl (int) ++void __builtin_wrctl (int, int) ++@end example ++ ++The following built-in functions are always available. They ++all generate a Nios II Custom Instruction. The name of the ++function represents the types that the function takes and ++returns. The letter before the @code{n} is the return type ++or void if absent. The @code{n} represnts the first parameter ++to all the custom instructions, the custom instruction number. ++The two letters after the @code{n} represent the up to two ++parameters to the function. ++ ++The letters reprsent the following data types: ++@table @code ++@item <no letter> ++@code{void} for return type and no parameter for parameter types. ++ ++@item i ++@code{int} for return type and parameter type ++ ++@item f ++@code{float} for return type and parameter type ++ ++@item p ++@code{void *} for return type and parameter type ++ ++@end table ++ ++And the function names are: ++@example ++void __builtin_custom_n (void) ++void __builtin_custom_ni (int) ++void __builtin_custom_nf (float) ++void __builtin_custom_np (void *) ++void __builtin_custom_nii (int, int) ++void __builtin_custom_nif (int, float) ++void __builtin_custom_nip (int, void *) ++void __builtin_custom_nfi (float, int) ++void __builtin_custom_nff (float, float) ++void __builtin_custom_nfp (float, void *) ++void __builtin_custom_npi (void *, int) ++void __builtin_custom_npf (void *, float) ++void __builtin_custom_npp (void *, void *) ++int __builtin_custom_in (void) ++int __builtin_custom_ini (int) ++int __builtin_custom_inf (float) ++int __builtin_custom_inp (void *) ++int __builtin_custom_inii (int, int) ++int __builtin_custom_inif (int, float) ++int __builtin_custom_inip (int, void *) ++int __builtin_custom_infi (float, int) ++int __builtin_custom_inff (float, float) ++int __builtin_custom_infp (float, void *) ++int __builtin_custom_inpi (void *, int) ++int __builtin_custom_inpf (void *, float) ++int __builtin_custom_inpp (void *, void *) ++float __builtin_custom_fn (void) ++float __builtin_custom_fni (int) ++float __builtin_custom_fnf (float) ++float __builtin_custom_fnp (void *) ++float __builtin_custom_fnii (int, int) ++float __builtin_custom_fnif (int, float) ++float __builtin_custom_fnip (int, void *) ++float __builtin_custom_fnfi (float, int) ++float __builtin_custom_fnff (float, float) ++float __builtin_custom_fnfp (float, void *) ++float __builtin_custom_fnpi (void *, int) ++float __builtin_custom_fnpf (void *, float) ++float __builtin_custom_fnpp (void *, void *) ++void * __builtin_custom_pn (void) ++void * __builtin_custom_pni (int) ++void * __builtin_custom_pnf (float) ++void * __builtin_custom_pnp (void *) ++void * __builtin_custom_pnii (int, int) ++void * __builtin_custom_pnif (int, float) ++void * __builtin_custom_pnip (int, void *) ++void * __builtin_custom_pnfi (float, int) ++void * __builtin_custom_pnff (float, float) ++void * __builtin_custom_pnfp (float, void *) ++void * __builtin_custom_pnpi (void *, int) ++void * __builtin_custom_pnpf (void *, float) ++void * __builtin_custom_pnpp (void *, void *) ++@end example ++ ++ + @node Alpha Built-in Functions + @subsection Alpha Built-in Functions + +--- gcc-3.4.3/gcc/doc/invoke.texi ++++ gcc-3.4.3-nios2/gcc/doc/invoke.texi +@@ -337,6 +337,14 @@ in the following sections. + @item Machine Dependent Options + @xref{Submodel Options,,Hardware Models and Configurations}. + ++@emph{Altera Nios II Options} ++@gccoptlist{-msmallc -mno-bypass-cache -mbypass-cache @gol ++-mno-cache-volatile -mcache-volatile -mno-inline-memcpy @gol ++-minline-memcpy -mno-fast-sw-div -mfast-sw-div @gol ++-mhw-mul -mno-hw-mul -mhw-mulx -mno-hw-mulx @gol ++-mno-hw-div -mhw-div @gol ++-msys-crt0= -msys-lib= -msys=nosys } ++ + @emph{M680x0 Options} + @gccoptlist{-m68000 -m68020 -m68020-40 -m68020-60 -m68030 -m68040 @gol + -m68060 -mcpu32 -m5200 -m68881 -mbitfield -mc68000 -mc68020 @gol +@@ -5836,6 +5844,7 @@ machine description. The default for th + that macro, which enables you to change the defaults. + + @menu ++* Altera Nios II Options:: + * M680x0 Options:: + * M68hc1x Options:: + * VAX Options:: +@@ -5871,6 +5880,103 @@ that macro, which enables you to change + * FRV Options:: + @end menu + ++ ++@node Altera Nios II Options ++@subsection Altera Nios II Options ++@cindex Altera Nios II options ++ ++These are the @samp{-m} options defined for the Altera Nios II ++processor. ++ ++@table @gcctabopt ++ ++@item -msmallc ++@opindex msmallc ++ ++Link with a limited version of the C library, -lsmallc. For more ++information see the C Library Documentation. ++ ++ ++@item -mbypass-cache ++@itemx -mno-bypass-cache ++@opindex mno-bypass-cache ++@opindex mbypass-cache ++ ++Force all load and store instructions to always bypass cache by ++using io variants of the instructions. The default is to not ++bypass the cache. ++ ++@item -mno-cache-volatile ++@itemx -mcache-volatile ++@opindex mcache-volatile ++@opindex mno-cache-volatile ++ ++Volatile memory access bypass the cache using the io variants of ++the ld and st instructions. The default is to cache volatile ++accesses. ++ ++-mno-cache-volatile is deprecated and will be deleted in a ++future GCC release. ++ ++ ++@item -mno-inline-memcpy ++@itemx -minline-memcpy ++@opindex mno-inline-memcpy ++@opindex minline-memcpy ++ ++Do not inline memcpy. The default is to inline when -O is on. ++ ++ ++@item -mno-fast-sw-div ++@itemx -mfast-sw-div ++@opindex mno-fast-sw-div ++@opindex mfast-sw-div ++ ++Do no use table based fast divide for small numbers. The default ++is to use the fast divide at -O3 and above. ++ ++ ++@item -mno-hw-mul ++@itemx -mhw-mul ++@itemx -mno-hw-mulx ++@itemx -mhw-mulx ++@itemx -mno-hw-div ++@itemx -mhw-div ++@opindex mno-hw-mul ++@opindex mhw-mul ++@opindex mno-hw-mulx ++@opindex mhw-mulx ++@opindex mno-hw-div ++@opindex mhw-div ++ ++Enable or disable emitting @code{mul}, @code{mulx} and @code{div} family of ++instructions by the compiler. The default is to emit @code{mul} ++and not emit @code{div} and @code{mulx}. ++ ++The different combinations of @code{mul} and @code{mulx} instructions ++generate a different multilib options. ++ ++ ++@item -msys-crt0=@var{startfile} ++@opindex msys-crt0 ++ ++@var{startfile} is the file name of the startfile (crt0) to use ++when linking. The default is crt0.o that comes with libgloss ++and is only suitable for use with the instruction set ++simulator. ++ ++@item -msys-lib=@var{systemlib} ++@itemx -msys-lib=nosys ++@opindex msys-lib ++ ++@var{systemlib} is the library name of the library which provides ++the system calls required by the C library, e.g. @code{read}, @code{write} ++etc. The default is to use nosys, this library provides ++stub implementations of the calls and is part of libgloss. ++ ++@end table ++ ++ + @node M680x0 Options + @subsection M680x0 Options + @cindex M680x0 options +--- gcc-3.4.3/gcc/doc/md.texi ++++ gcc-3.4.3-nios2/gcc/doc/md.texi +@@ -1335,6 +1335,49 @@ However, here is a summary of the machin + available on some particular machines. + + @table @emph ++ ++@item Altera Nios II family---@file{nios2.h} ++@table @code ++ ++@item I ++Integer that is valid as an immediate operand in an ++instruction taking a signed 16-bit number. Range ++@minus{}32768 to 32767. ++ ++@item J ++Integer that is valid as an immediate operand in an ++instruction taking an unsigned 16-bit number. Range ++0 to 65535. ++ ++@item K ++Integer that is valid as an immediate operand in an ++instruction taking only the upper 16-bits of a ++32-bit number. Range 32-bit numbers with the lower ++16-bits being 0. ++ ++@item L ++Integer that is valid as an immediate operand for a ++shift instruction. Range 0 to 31. ++ ++ ++@item M ++Integer that is valid as an immediate operand for ++only the value 0. Can be used in conjunction with ++the format modifier @code{z} to use @code{r0} ++instead of @code{0} in the assembly output. ++ ++@item N ++Integer that is valid as an immediate operand for ++a custom instruction opcode. Range 0 to 255. ++ ++@item S ++Matches immediates which are addresses in the small ++data section and therefore can be added to @code{gp} ++as a 16-bit immediate to re-create their 32-bit value. ++ ++@end table ++ ++ + @item ARM family---@file{arm.h} + @table @code + @item f diff --git a/patches/gcc/3.4.4/arm-softfloat.patch b/patches/gcc/3.4.4/arm-softfloat.patch new file mode 100644 index 00000000..19d1b90d --- /dev/null +++ b/patches/gcc/3.4.4/arm-softfloat.patch @@ -0,0 +1,270 @@ +Note... modified my mjn3 to not conflict with the big endian arm patch. +Warning!!! Only the linux target is aware of TARGET_ENDIAN_DEFAULT. +Also changed + #define SUBTARGET_EXTRA_ASM_SPEC "\ + %{!mcpu=*:-mcpu=xscale} \ + %{mhard-float:-mfpu=fpa} \ + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" +to + #define SUBTARGET_EXTRA_ASM_SPEC "\ + %{mhard-float:-mfpu=fpa} \ + %{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" +in gcc/config/arm/linux-elf.h. +# +# Submitted: +# +# Dimitry Andric <dimitry@andric.com>, 2004-05-01 +# +# Description: +# +# Nicholas Pitre released this patch for gcc soft-float support here: +# http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-October/006436.html +# +# This version has been adapted to work with gcc 3.4.0. +# +# The original patch doesn't distinguish between softfpa and softvfp modes +# in the way Nicholas Pitre probably meant. His description is: +# +# "Default is to use APCS-32 mode with soft-vfp. The old Linux default for +# floats can be achieved with -mhard-float or with the configure +# --with-float=hard option. If -msoft-float or --with-float=soft is used then +# software float support will be used just like the default but with the legacy +# big endian word ordering for double float representation instead." +# +# Which means the following: +# +# * If you compile without -mhard-float or -msoft-float, you should get +# software floating point, using the VFP format. The produced object file +# should have these flags in its header: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# * If you compile with -mhard-float, you should get hardware floating point, +# which always uses the FPA format. Object file header flags should be: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# * If you compile with -msoft-float, you should get software floating point, +# using the FPA format. This is done for compatibility reasons with many +# existing distributions. Object file header flags should be: +# +# private flags = 200: [APCS-32] [FPA float format] [software FP] +# +# The original patch from Nicholas Pitre contained the following constructs: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" +# +# However, gcc doesn't accept this ";:" notation, used in the 3rd line. This +# is probably the reason Robert Schwebel modified it to: +# +# #define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +# %{mhard-float:-mfpu=fpa} \ +# %{!mhard-float: %{msoft-float:-mfpu=softfpa -mfpu=softvfp}}" +# +# But this causes the following behaviour: +# +# * If you compile without -mhard-float or -msoft-float, the compiler generates +# software floating point instructions, but *nothing* is passed to the +# assembler, which results in an object file which has flags: +# +# private flags = 0: [APCS-32] [FPA float format] +# +# This is not correct! +# +# * If you compile with -mhard-float, the compiler generates hardware floating +# point instructions, and passes "-mfpu=fpa" to the assembler, which results +# in an object file which has the same flags as in the previous item, but now +# those *are* correct. +# +# * If you compile with -msoft-float, the compiler generates software floating +# point instructions, and passes "-mfpu=softfpa -mfpu=softvfp" (in that +# order) to the assembler, which results in an object file with flags: +# +# private flags = 600: [APCS-32] [VFP float format] [software FP] +# +# This is not correct, because the last "-mfpu=" option on the assembler +# command line determines the actual FPU convention used (which should be FPA +# in this case). +# +# Therefore, I modified this patch to get the desired behaviour. Every +# instance of the notation: +# +# %{msoft-float:-mfpu=softfpa -mfpu=softvfp} +# +# was changed to: +# +# %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp} +# +# I also did the following: +# +# * Modified all TARGET_DEFAULT macros I could find to include ARM_FLAG_VFP, to +# be consistent with Nicholas' original patch. +# * Removed any "msoft-float" or "mhard-float" from all MULTILIB_DEFAULTS +# macros I could find. I think that if you compile without any options, you +# would like to get the defaults. :) +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed +# anymore. (The required functions are now in libgcc.) + +diff -urN gcc-3.4.1-old/gcc/config/arm/coff.h gcc-3.4.1/gcc/config/arm/coff.h +--- gcc-3.4.1-old/gcc/config/arm/coff.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/coff.h 2004-09-02 21:51:15.000000000 -0500 +@@ -31,11 +31,16 @@ + #define TARGET_VERSION fputs (" (ARM/coff)", stderr) + + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork" } + #endif + + /* This is COFF, but prefer stabs. */ +diff -urN gcc-3.4.1-old/gcc/config/arm/elf.h gcc-3.4.1/gcc/config/arm/elf.h +--- gcc-3.4.1-old/gcc/config/arm/elf.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -46,7 +46,9 @@ + + #ifndef SUBTARGET_ASM_FLOAT_SPEC + #define SUBTARGET_ASM_FLOAT_SPEC "\ +-%{mapcs-float:-mfloat} %{msoft-float:-mfpu=softfpa}" ++%{mapcs-float:-mfloat} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + #endif + + #ifndef ASM_SPEC +@@ -106,12 +108,17 @@ + #endif + + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "msoft-float", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } ++ { "marm", "mlittle-endian", "mapcs-32", "mno-thumb-interwork", "fno-leading-underscore" } + #endif + + #define TARGET_ASM_FILE_START_APP_OFF true +diff -urN gcc-3.4.1-old/gcc/config/arm/linux-elf.h gcc-3.4.1/gcc/config/arm/linux-elf.h +--- gcc-3.4.1-old/gcc/config/arm/linux-elf.h 2004-09-02 21:50:52.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/linux-elf.h 2004-09-02 22:00:49.000000000 -0500 +@@ -44,12 +44,26 @@ + #define TARGET_LINKER_EMULATION "armelf_linux" + #endif + +-/* Default is to use APCS-32 mode. */ ++/* ++ * Default is to use APCS-32 mode with soft-vfp. ++ * The old Linux default for floats can be achieved with -mhard-float ++ * or with the configure --with-float=hard option. ++ * If -msoft-float or --with-float=soft is used then software float ++ * support will be used just like the default but with the legacy ++ * big endian word ordering for double float representation instead. ++ */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT \ +- ( ARM_FLAG_APCS_32 | \ +- ARM_FLAG_MMU_TRAPS | \ +- TARGET_ENDIAN_DEFAULT ) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_SOFT_FLOAT \ ++ | TARGET_ENDIAN_DEFAULT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_MMU_TRAPS ) ++ ++#undef SUBTARGET_EXTRA_ASM_SPEC ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +@@ -57,7 +71,7 @@ + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -72,7 +86,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which +diff -urN gcc-3.4.1-old/gcc/config/arm/t-linux gcc-3.4.1/gcc/config/arm/t-linux +--- gcc-3.4.1-old/gcc/config/arm/t-linux 2003-09-20 16:09:07.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/t-linux 2004-09-02 21:51:15.000000000 -0500 +@@ -4,7 +4,10 @@ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float +diff -urN gcc-3.4.1-old/gcc/config/arm/unknown-elf.h gcc-3.4.1/gcc/config/arm/unknown-elf.h +--- gcc-3.4.1-old/gcc/config/arm/unknown-elf.h 2004-02-24 08:25:22.000000000 -0600 ++++ gcc-3.4.1/gcc/config/arm/unknown-elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -30,7 +30,12 @@ + + /* Default to using APCS-32 and software floating point. */ + #ifndef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_SOFT_FLOAT | ARM_FLAG_APCS_32 | ARM_FLAG_APCS_FRAME | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_SOFT_FLOAT \ ++ | ARM_FLAG_VFP \ ++ | ARM_FLAG_APCS_32 \ ++ | ARM_FLAG_APCS_FRAME \ ++ | ARM_FLAG_MMU_TRAPS ) + #endif + + /* Now we define the strings used to build the spec file. */ +diff -urN gcc-3.4.1-old/gcc/config/arm/xscale-elf.h gcc-3.4.1/gcc/config/arm/xscale-elf.h +--- gcc-3.4.1-old/gcc/config/arm/xscale-elf.h 2003-07-01 18:26:43.000000000 -0500 ++++ gcc-3.4.1/gcc/config/arm/xscale-elf.h 2004-09-02 21:51:15.000000000 -0500 +@@ -49,11 +49,12 @@ + endian, regardless of the endian-ness of the memory + system. */ + +-#define SUBTARGET_EXTRA_ASM_SPEC "%{!mcpu=*:-mcpu=xscale} \ +- %{mhard-float:-mfpu=fpa} \ +- %{!mhard-float: %{msoft-float:-mfpu=softfpa;:-mfpu=softvfp}}" ++#define SUBTARGET_EXTRA_ASM_SPEC "\ ++%{!mcpu=*:-mcpu=xscale} \ ++%{mhard-float:-mfpu=fpa} \ ++%{!mhard-float: %{msoft-float:-mfpu=softfpa} %{!msoft-float:-mfpu=softvfp}}" + + #ifndef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "mlittle-endian", "mno-thumb-interwork", "marm", "msoft-float" } ++ { "mlittle-endian", "mno-thumb-interwork", "marm" } + #endif diff --git a/patches/gcc/3.4.4/fix-fixincl.patch b/patches/gcc/3.4.4/fix-fixincl.patch new file mode 100644 index 00000000..7936b19b --- /dev/null +++ b/patches/gcc/3.4.4/fix-fixincl.patch @@ -0,0 +1,70 @@ +See http://gcc.gnu.org/PR22541 + +From: Dan Kegel + +When building gcc-3.4.3 or gcc-4.0.0 as a cross into a clean $PREFIX +(the only two I've tried like this), the configure script happily copies +the glibc include files from include to sys-include; here's the line +from the log file (with $PREFIX instead of the real prefix): + +Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include + +But later, when running fixincludes, it gives the error message + The directory that should contain system headers does not exist: + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include + +Nevertheless, it continues building; the header files it installs in + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include +do not include the boilerplate that would cause it to #include_next the +glibc headers in the system header directory. +Thus the resulting toolchain can't compile the following program: +#include <limits.h> +int x = PATH_MAX; +because its limits.h doesn't include the glibc header. + +That's not nice. I suspect the problem is that gcc/Makefile.in assumes that +it can refer to $PREFIX/i686-unknown-linux-gnu with the path + $PREFIX/lib/../i686-unknown-linux-gnu, but +that fails because the directory $PREFIX/lib doesn't exist during 'make all'; +it is only created later, during 'make install'. (Which makes this problem +confusing, since one only notices the breakage well after 'make install', +at which point the path configure complained about does exist, and has the +right stuff in it.) + +A possible fix is to replace the line in gcc/Makefile.in that says + SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ +with a version that gets rid of extra ..'s, e.g. + SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"` +(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq +for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.) + + +--- gcc-3.4.3/gcc/Makefile.in.foo 2005-05-20 11:41:39.000000000 -0700 ++++ gcc-3.4.3/gcc/Makefile.in 2005-05-20 12:08:46.000000000 -0700 +@@ -350,7 +350,10 @@ + CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@ + + # autoconf sets SYSTEM_HEADER_DIR to one of the above. +-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ ++# Purge it of unneccessary internal relative paths ++# to directories that might not exist yet. ++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta. ++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta` + + # Control whether to run fixproto and fixincludes. + STMP_FIXPROTO = @STMP_FIXPROTO@ +@@ -2532,11 +2535,13 @@ + $(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(gcc_tooldir) + + # Build fixed copies of system files. ++# Abort if no system headers available, unless building a crosscompiler. ++# FIXME: abort unless building --without-headers would be more accurate and less ugly + stmp-fixinc: fixinc.sh gsyslimits.h + @if test ! -d ${SYSTEM_HEADER_DIR}; then \ + echo The directory that should contain system headers does not exist: >&2 ; \ + echo " ${SYSTEM_HEADER_DIR}" >&2 ; \ +- if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \ ++ if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \ + then sleep 1; else exit 1; fi; \ + fi + rm -rf include; mkdir include diff --git a/patches/gcc/3.4.5/fix-fixincl.patch b/patches/gcc/3.4.5/fix-fixincl.patch new file mode 100644 index 00000000..7936b19b --- /dev/null +++ b/patches/gcc/3.4.5/fix-fixincl.patch @@ -0,0 +1,70 @@ +See http://gcc.gnu.org/PR22541 + +From: Dan Kegel + +When building gcc-3.4.3 or gcc-4.0.0 as a cross into a clean $PREFIX +(the only two I've tried like this), the configure script happily copies +the glibc include files from include to sys-include; here's the line +from the log file (with $PREFIX instead of the real prefix): + +Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include + +But later, when running fixincludes, it gives the error message + The directory that should contain system headers does not exist: + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include + +Nevertheless, it continues building; the header files it installs in + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include +do not include the boilerplate that would cause it to #include_next the +glibc headers in the system header directory. +Thus the resulting toolchain can't compile the following program: +#include <limits.h> +int x = PATH_MAX; +because its limits.h doesn't include the glibc header. + +That's not nice. I suspect the problem is that gcc/Makefile.in assumes that +it can refer to $PREFIX/i686-unknown-linux-gnu with the path + $PREFIX/lib/../i686-unknown-linux-gnu, but +that fails because the directory $PREFIX/lib doesn't exist during 'make all'; +it is only created later, during 'make install'. (Which makes this problem +confusing, since one only notices the breakage well after 'make install', +at which point the path configure complained about does exist, and has the +right stuff in it.) + +A possible fix is to replace the line in gcc/Makefile.in that says + SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ +with a version that gets rid of extra ..'s, e.g. + SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"` +(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq +for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.) + + +--- gcc-3.4.3/gcc/Makefile.in.foo 2005-05-20 11:41:39.000000000 -0700 ++++ gcc-3.4.3/gcc/Makefile.in 2005-05-20 12:08:46.000000000 -0700 +@@ -350,7 +350,10 @@ + CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@ + + # autoconf sets SYSTEM_HEADER_DIR to one of the above. +-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ ++# Purge it of unneccessary internal relative paths ++# to directories that might not exist yet. ++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta. ++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta` + + # Control whether to run fixproto and fixincludes. + STMP_FIXPROTO = @STMP_FIXPROTO@ +@@ -2532,11 +2535,13 @@ + $(SHELL) ${srcdir}/mkinstalldirs $(DESTDIR)$(gcc_tooldir) + + # Build fixed copies of system files. ++# Abort if no system headers available, unless building a crosscompiler. ++# FIXME: abort unless building --without-headers would be more accurate and less ugly + stmp-fixinc: fixinc.sh gsyslimits.h + @if test ! -d ${SYSTEM_HEADER_DIR}; then \ + echo The directory that should contain system headers does not exist: >&2 ; \ + echo " ${SYSTEM_HEADER_DIR}" >&2 ; \ +- if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \ ++ if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \ + then sleep 1; else exit 1; fi; \ + fi + rm -rf include; mkdir include diff --git a/patches/gcc/3.4.5/gcc-3.4.0-arm-bigendian.patch b/patches/gcc/3.4.5/gcc-3.4.0-arm-bigendian.patch new file mode 100644 index 00000000..f7178c19 --- /dev/null +++ b/patches/gcc/3.4.5/gcc-3.4.0-arm-bigendian.patch @@ -0,0 +1,82 @@ +By Lennert Buytenhek <buytenh@wantstofly.org> +Adds support for arm*b-linux* big-endian ARM targets + +Fixes build error + +/opt/crosstool/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/armeb-unknown-linux-gnu/bin/ld: unrecognised emulation mode: armelf_linux +Supported emulations: armelfb_linux armelfb +collect2: ld returned 1 exit status +make[2]: *** [/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/build-glibc/csu/crt1.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/glibc-2.3.3/csu' +make[1]: *** [csu/subdir_lib] Error 2 +make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc36/build/armeb-unknown-linux-gnu/gcc-3.4.2-glibc-2.3.3/glibc-2.3.3' +make: *** [all] Error 2 + + +See http://gcc.gnu.org/PR16350 + +diff -urN gcc-3.4.0.orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h +--- gcc-3.4.0.orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-07-02 14:46:29.225443757 +0200 +@@ -30,17 +30,34 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + /* Default is to use APCS-32 mode. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (ARM_FLAG_APCS_32 | ARM_FLAG_MMU_TRAPS) ++#define TARGET_DEFAULT \ ++ ( ARM_FLAG_APCS_32 | \ ++ ARM_FLAG_MMU_TRAPS | \ ++ TARGET_ENDIAN_DEFAULT ) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mapcs-32", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mapcs-32", "mno-thumb-interwork" } + + #define CPP_APCS_PC_DEFAULT_SPEC "-D__APCS_32__" + +@@ -89,7 +106,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #define TARGET_OS_CPP_BUILTINS() LINUX_TARGET_OS_CPP_BUILTINS() +diff -urN gcc-3.4.0.orig/gcc/config.gcc gcc-3.4.0/gcc/config.gcc +--- gcc-3.4.0.orig/gcc/config.gcc 2004-04-17 04:28:24.000000000 +0200 ++++ gcc-3.4.0/gcc/config.gcc 2004-07-02 14:44:40.045822542 +0200 +@@ -666,6 +666,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="t-slibgcc-elf-ver t-linux arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/patches/gcc/3.4.5/gcc-3.4.0-arm-lib1asm.patch b/patches/gcc/3.4.5/gcc-3.4.0-arm-lib1asm.patch new file mode 100644 index 00000000..69a79d5d --- /dev/null +++ b/patches/gcc/3.4.5/gcc-3.4.0-arm-lib1asm.patch @@ -0,0 +1,27 @@ +# Origin: from a patch by Dimitry Andric <dimitry@andric.com>, 2004-05-01 +# See http://gcc.gnu.org/PR14352 and http://gcc.gnu.org/PR16314 +# See also http://gcc.gnu.org/ml/gcc-patches/2004-08/msg02568.html et seq for why this isn't in mainline +# Fixes errors like the following when building glibc (or any other executable +# or shared library) when using gcc 3.4.0 for ARM with softfloat: +# +# .../libc_pic.os(.text+0x15834): In function `__modf': undefined reference to `__subdf3' +# .../libc_pic.os(.text+0x158b8): In function `__modf': undefined reference to `__subdf3' +# .../libc_pic.os(.text+0x1590c): In function `scalbn': undefined reference to `__muldf3' +# .../libc_pic.os(.text+0x15e94): In function `__ldexpf': undefined reference to `__eqsf2' +# .../libc_pic.os(.text+0xcee4c): In function `monstartup': undefined reference to `__fixsfsi' + +diff -urNd gcc-3.4.0-orig/gcc/config/arm/t-linux gcc-3.4.0/gcc/config/arm/t-linux +--- gcc-3.4.0-orig/gcc/config/arm/t-linux 2003-09-20 23:09:07.000000000 +0200 ++++ gcc-3.4.0/gcc/config/arm/t-linux 2004-05-01 20:31:59.102846400 +0200 +@@ -4,7 +4,10 @@ + LIBGCC2_DEBUG_CFLAGS = -g0 + + LIB1ASMSRC = arm/lib1funcs.asm +-LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx ++LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_lnx \ ++ _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ ++ _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ ++ _fixsfsi _fixunssfsi + + # MULTILIB_OPTIONS = mhard-float/msoft-float + # MULTILIB_DIRNAMES = hard-float soft-float diff --git a/patches/gcc/3.4.5/gcc-3.4.0-arm-nolibfloat.patch b/patches/gcc/3.4.5/gcc-3.4.0-arm-nolibfloat.patch new file mode 100644 index 00000000..43eed3ef --- /dev/null +++ b/patches/gcc/3.4.5/gcc-3.4.0-arm-nolibfloat.patch @@ -0,0 +1,24 @@ +# Dimitry Andric <dimitry@andric.com>, 2004-05-01 +# +# * Removed the extra -lfloat option from LIBGCC_SPEC, since it isn't needed +# anymore. (The required functions are now in libgcc.) +# +# Fixes errors like +# arm-softfloat-linux-gnu/3.4.0/../../../../arm-softfloat-linux-gnu/bin/ld: cannot find -lfloat +# collect2: ld returned 1 exit status +# make[2]: *** [arm-softfloat-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/iconvdata/ISO8859-1.so] Error 1 +# when building glibc-2.3.3 with gcc-3.4.0 for arm-softfloat + +diff -urNd gcc-3.4.0-orig/gcc/config/arm/linux-elf.h gcc-3.4.0/gcc/config/arm/linux-elf.h +--- gcc-3.4.0-orig/gcc/config/arm/linux-elf.h 2004-01-31 07:18:11.000000000 +0100 ++++ gcc-3.4.0/gcc/config/arm/linux-elf.h 2004-05-01 19:19:06.935979200 +0200 +@@ -55,7 +73,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + /* Provide a STARTFILE_SPEC appropriate for GNU/Linux. Here we add + the GNU/Linux magical crtbegin.o file (see crtstuff.c) which + diff --git a/patches/gcc/3.4.5/pr15068-fix.patch b/patches/gcc/3.4.5/pr15068-fix.patch new file mode 100644 index 00000000..2977765c --- /dev/null +++ b/patches/gcc/3.4.5/pr15068-fix.patch @@ -0,0 +1,44 @@ +See http://gcc.gnu.org/PR15068 + +Fixes error + +../sysdeps/generic/s_fmax.c: In function `__fmax': +../sysdeps/generic/s_fmax.c:28: internal compiler error: in elim_reg_cond, at flow.c:3257 +Please submit a full bug report, +with preprocessed source if appropriate. +See <URL:http://gcc.gnu.org/bugs.html> for instructions. +make[2]: *** [/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/math/s_fmax.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822/math' +make[1]: *** [math/others] Error 2 +make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc35/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040822' +make: *** [all] Error 2 + +[ rediffed against gcc-3.4.1, with elbow grease, ending up with same thing as +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/flow.c.diff?cvsroot=gcc&only_with_tag=csl-arm-branch&r1=1.563.4.2&r2=1.563.4.3 ] + +--- gcc-3.4.1/gcc/flow.c.old 2004-02-27 19:39:19.000000000 -0800 ++++ gcc-3.4.1/gcc/flow.c 2004-08-26 07:29:46.000000000 -0700 +@@ -1878,6 +1878,7 @@ + rtx set_src = SET_SRC (pc_set (BB_END (bb))); + rtx cond_true = XEXP (set_src, 0); + rtx reg = XEXP (cond_true, 0); ++ enum rtx_code inv_cond; + + if (GET_CODE (reg) == SUBREG) + reg = SUBREG_REG (reg); +@@ -1886,11 +1887,13 @@ + in the form of a comparison of a register against zero. + If the condition is more complex than that, then it is safe + not to record any information. */ +- if (GET_CODE (reg) == REG ++ inv_cond = reversed_comparison_code (cond_true, BB_END (bb)); ++ if (inv_cond != UNKNOWN ++ && GET_CODE (reg) == REG + && XEXP (cond_true, 1) == const0_rtx) + { + rtx cond_false +- = gen_rtx_fmt_ee (reverse_condition (GET_CODE (cond_true)), ++ = gen_rtx_fmt_ee (inv_cond, + GET_MODE (cond_true), XEXP (cond_true, 0), + XEXP (cond_true, 1)); + if (GET_CODE (XEXP (set_src, 1)) == PC) diff --git a/patches/gcc/4.0.0/fix-fixincl.patch b/patches/gcc/4.0.0/fix-fixincl.patch new file mode 100644 index 00000000..8051f31c --- /dev/null +++ b/patches/gcc/4.0.0/fix-fixincl.patch @@ -0,0 +1,72 @@ +See http://gcc.gnu.org/PR22541 + +From: Dan Kegel + +When building gcc-3.4.3 or gcc-4.0.[01] into a clean $PREFIX (the only two I've tried like this), +the configure script happily copies the glibc include files from include to sys-include; +here's the line from the log file (with $PREFIX instead of the real prefix): + +Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include + +But later, when running fixincludes, it gives the error message + The directory that should contain system headers does not exist: + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include + +Nevertheless, it continues building; the header files it installs in + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include +do not include the boilerplate that would cause it to #include_next the +glibc headers in the system header directory. +Thus the resulting toolchain can't compile the following program: +#include <limits.h> +int x = PATH_MAX; +because its limits.h doesn't include the glibc header. + +That's not nice. I suspect the problem is that gcc/Makefile.in assumes that +it can refer to $PREFIX/i686-unknown-linux-gnu with the path + $PREFIX/lib/../i686-unknown-linux-gnu, but +that fails because the directory $PREFIX/lib doesn't exist during 'make all'; +it is only created later, during 'make install'. (Which makes this problem +confusing, since one only notices the breakage well after 'make install', +at which point the path configure complained about does exist, and has the +right stuff in it.) + +A possible fix is to replace the line in gcc/Makefile.in that says + SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ +with a version that gets rid of extra ..'s, e.g. + SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"` +(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq +for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.) + +[rediffed against gcc-4.0.0] + +--- gcc-4.0.0/gcc/Makefile.in.orig 2005-04-04 12:45:13.000000000 -0700 ++++ gcc-4.0.0/gcc/Makefile.in 2005-05-20 12:33:43.000000000 -0700 +@@ -378,7 +378,10 @@ + CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@ + + # autoconf sets SYSTEM_HEADER_DIR to one of the above. +-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ ++# Purge it of unneccessary internal relative paths ++# to directories that might not exist yet. ++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta. ++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta` + + # Control whether to run fixproto and fixincludes. + STMP_FIXPROTO = @STMP_FIXPROTO@ +@@ -2838,13 +2841,15 @@ + ../$(build_subdir)/fixincludes/fixincl: ; @ : + + # Build fixed copies of system files. ++# Abort if no system headers available, unless building a crosscompiler. ++# FIXME: abort unless building --without-headers would be more accurate and less ugly + stmp-fixinc: gsyslimits.h macro_list \ + ../$(build_subdir)/fixincludes/fixincl \ + ../$(build_subdir)/fixincludes/fixinc.sh + @if test ! -d ${SYSTEM_HEADER_DIR}; then \ + echo The directory that should contain system headers does not exist: >&2 ; \ + echo " ${SYSTEM_HEADER_DIR}" >&2 ; \ +- if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \ ++ if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \ + then sleep 1; else exit 1; fi; \ + fi + rm -rf include; mkdir include diff --git a/patches/gcc/4.0.0/gcc-4.0-arm-bigendian.patch b/patches/gcc/4.0.0/gcc-4.0-arm-bigendian.patch new file mode 100644 index 00000000..d9bcffeb --- /dev/null +++ b/patches/gcc/4.0.0/gcc-4.0-arm-bigendian.patch @@ -0,0 +1,79 @@ +By Lennert Buytenhek <buytenh@wantstofly.org> +Adds support for arm*b-linux* big-endian ARM targets + +Fixes following build error for big-endian ARM targets: + +armeb-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/bin/../lib/gcc/armeb-unknown-linux-gnu/4.0.0/../../../../armeb-unknown-linux-gnu/bin/ld: unrecognised emulation mode: armelf_linux +Supported emulations: armelfb_linux armelfb +collect2: ld returned 1 exit status +make[2]: *** [crosstool-0.32/build/armeb-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/csu/crt1.o] Error 1 +make[2]: Leaving directory `crosstool-0.32/build/armeb-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/glibc-2.3.4/csu' +make[1]: *** [csu/subdir_lib] Error 2 +make[1]: Leaving directory `crosstool-0.32/build/armeb-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/glibc-2.3.4' +make: *** [lib] Error 2 + + +See http://gcc.gnu.org/PR16350 + +--- gcc-4.0-20050305/gcc/config/arm/linux-elf.h.orig 2005-03-23 18:44:54.822707377 +0100 ++++ gcc-4.0-20050305/gcc/config/arm/linux-elf.h 2005-03-23 18:46:18.228560206 +0100 +@@ -31,19 +31,33 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for ++ * arm*b-*-linux* (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + #undef TARGET_DEFAULT_FLOAT_ABI + #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD + + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (0) ++#define TARGET_DEFAULT (TARGET_ENDIAN_DEFAULT) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mno-thumb-interwork" } + + /* The GNU C++ standard library requires that these macros be defined. */ + #undef CPLUSPLUS_CPP_SPEC +@@ -90,7 +104,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #define TARGET_OS_CPP_BUILTINS() \ +--- gcc-4.0-20050305/gcc/config.gcc.orig 2005-03-23 18:46:23.318105335 +0100 ++++ gcc-4.0-20050305/gcc/config.gcc 2005-03-23 18:47:41.592546386 +0100 +@@ -650,6 +650,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*-linux*) ++ tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1" ++ ;; ++ esac + tmake_file="${tmake_file} arm/t-arm arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/patches/gcc/4.0.0/pr20815-fix.patch b/patches/gcc/4.0.0/pr20815-fix.patch new file mode 100644 index 00000000..7ac8ab50 --- /dev/null +++ b/patches/gcc/4.0.0/pr20815-fix.patch @@ -0,0 +1,121 @@ +Date: 18 May 2005 22:47:59 -0000 +Message-ID: <20050518224759.7352.qmail@sourceware.org> +From: "hubicka at ucw dot cz" <gcc-bugzilla@gcc.gnu.org> +To: dank@kegel.com +References: <20050407215701.20815.dank@kegel.com> +Reply-To: gcc-bugzilla@gcc.gnu.org +Subject: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'." + + +------- Additional Comments From hubicka at ucw dot cz 2005-05-18 22:47 ------- +Subject: Re: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'." + +> +> ------- Additional Comments From hubicka at ucw dot cz 2005-05-18 22:22 ------- +> Subject: Re: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'." +> +> coverage_checksum_string already knows a bit about ignoring random seed +> produced mess. It looks like this needs to be extended somehow to +> handle namespaces too... + +This seems to solve the missmatch. Would it be possible to test it on +bigger testcase and if it works distile a testcase that don't use +file IO so it is more suitable for gcc regtesting? + +Index: coverage.c +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/coverage.c,v +retrieving revision 1.6.2.12.2.12 +diff -c -3 -p -r1.6.2.12.2.12 coverage.c +*** gcc-old/gcc/coverage.c 18 May 2005 07:37:31 -0000 1.6.2.12.2.12 +--- gcc/gcc/coverage.c 18 May 2005 22:45:36 -0000 +*************** coverage_checksum_string (unsigned chksu +*** 471,505 **** + as the checksums are used only for sanity checking. */ + for (i = 0; string[i]; i++) + { + if (!strncmp (string + i, "_GLOBAL__", 9)) +! for (i = i + 9; string[i]; i++) +! if (string[i]=='_') +! { +! int y; +! unsigned seed; +! int scan; +! +! for (y = 1; y < 9; y++) +! if (!(string[i + y] >= '0' && string[i + y] <= '9') +! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) +! break; +! if (y != 9 || string[i + 9] != '_') +! continue; +! for (y = 10; y < 18; y++) +! if (!(string[i + y] >= '0' && string[i + y] <= '9') +! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) +! break; +! if (y != 18) +! continue; +! scan = sscanf (string + i + 10, "%X", &seed); +! gcc_assert (scan); +! if (seed != crc32_string (0, flag_random_seed)) +! continue; +! string = dup = xstrdup (string); +! for (y = 10; y < 18; y++) +! dup[i + y] = '0'; +! break; +! } + break; + } + +--- 471,511 ---- + as the checksums are used only for sanity checking. */ + for (i = 0; string[i]; i++) + { ++ int offset = 0; ++ if (!strncmp (string + i, "_GLOBAL__N_", 11)) ++ offset = 11; + if (!strncmp (string + i, "_GLOBAL__", 9)) +! offset = 9; +! +! /* C++ namespaces do have scheme: +! _GLOBAL__N_<filename>_<wrongmagicnumber>_<magicnumber>functionname +! since filename might contain extra underscores there seems +! to be no better chance then walk all possible offsets looking +! for magicnuber. */ +! if (offset) +! for (;string[offset]; offset++) +! for (i = i + offset; string[i]; i++) +! if (string[i]=='_') +! { +! int y; +! +! for (y = 1; y < 9; y++) +! if (!(string[i + y] >= '0' && string[i + y] <= '9') +! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) +! break; +! if (y != 9 || string[i + 9] != '_') +! continue; +! for (y = 10; y < 18; y++) +! if (!(string[i + y] >= '0' && string[i + y] <= '9') +! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) +! break; +! if (y != 18) +! continue; +! if (!dup) +! string = dup = xstrdup (string); +! for (y = 10; y < 18; y++) +! dup[i + y] = '0'; +! } + break; + } + + + +-- + + +http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20815 + +------- You are receiving this mail because: ------- +You reported the bug, or are watching the reporter. + + diff --git a/patches/gcc/4.0.0/pr20973-fix.patch b/patches/gcc/4.0.0/pr20973-fix.patch new file mode 100644 index 00000000..74512198 --- /dev/null +++ b/patches/gcc/4.0.0/pr20973-fix.patch @@ -0,0 +1,80 @@ +http://gcc.gnu.org/PR20973 + +"gcc 4 (about RC1) miscompiles khtml, in fact something in CSS, which basically +leads to all websites being misrendered. I can't easily reduce the testcase, +but have applied the whole preprocessed source of css/cssstyleselector.ii. + +It is to be compiled with g++ -O2 -fPIC -march=i586 -mtune=i686 +-fno-exceptions. A more detailed analysis will follow, as we've found out +some things already." + +--- + +Subject: Bug 20973 + +CVSROOT: /cvs/gcc +Module name: gcc +Branch: gcc-4_0-branch +Changes by: matz@gcc.gnu.org 2005-04-22 17:30:21 + +Modified files: + gcc : ChangeLog reload.c + +Log message: + PR middle-end/20973 + * reload.c (push_reload, find_dummy_reload): Check for uninitialized + pseudos. + +Patches: +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=2.7592.2.177&r2=2.7592.2.178 +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/reload.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=1.268&r2=1.268.2.1 + +--- + +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/reload.c,v +retrieving revision 1.268 +retrieving revision 1.268.2.1 +diff -u -r1.268 -r1.268.2.1 +--- gcc/gcc/reload.c 2005/02/24 22:06:06 1.268 ++++ gcc/gcc/reload.c 2005/04/22 17:30:15 1.268.2.1 +@@ -1520,7 +1520,7 @@ + But if there is no spilling in this block, that is OK. + An explicitly used hard reg cannot be a spill reg. */ + +- if (rld[i].reg_rtx == 0 && in != 0) ++ if (rld[i].reg_rtx == 0 && in != 0 && hard_regs_live_known) + { + rtx note; + int regno; +@@ -1534,6 +1534,11 @@ + && REG_P (XEXP (note, 0)) + && (regno = REGNO (XEXP (note, 0))) < FIRST_PSEUDO_REGISTER + && reg_mentioned_p (XEXP (note, 0), in) ++ /* Check that we don't use a hardreg for an uninitialized ++ pseudo. See also find_dummy_reload(). */ ++ && (ORIGINAL_REGNO (XEXP (note, 0)) < FIRST_PSEUDO_REGISTER ++ || ! bitmap_bit_p (ENTRY_BLOCK_PTR->global_live_at_end, ++ ORIGINAL_REGNO (XEXP (note, 0)))) + && ! refers_to_regno_for_reload_p (regno, + (regno + + hard_regno_nregs[regno] +@@ -1997,7 +2002,17 @@ + is a subreg, and in that case, out + has a real mode. */ + (GET_MODE (out) != VOIDmode +- ? GET_MODE (out) : outmode))) ++ ? GET_MODE (out) : outmode)) ++ /* But only do all this if we can be sure, that this input ++ operand doesn't correspond with an uninitialized pseudoreg. ++ global can assign some hardreg to it, which is the same as ++ a different pseudo also currently live (as it can ignore the ++ conflict). So we never must introduce writes to such hardregs, ++ as they would clobber the other live pseudo using the same. ++ See also PR20973. */ ++ && (ORIGINAL_REGNO (in) < FIRST_PSEUDO_REGISTER ++ || ! bitmap_bit_p (ENTRY_BLOCK_PTR->global_live_at_end, ++ ORIGINAL_REGNO (in)))) + { + unsigned int regno = REGNO (in) + in_offset; + unsigned int nwords = hard_regno_nregs[regno][inmode]; diff --git a/patches/gcc/4.0.0/pr21173-fix.patch b/patches/gcc/4.0.0/pr21173-fix.patch new file mode 100644 index 00000000..0582d756 --- /dev/null +++ b/patches/gcc/4.0.0/pr21173-fix.patch @@ -0,0 +1,66 @@ +See http://gcc.gnu.org/PR21173 +This is a fix for a last minute brown-bag bug with gcc-4.0.0 + + ------- Additional Comment #24 From CVS Commits 2005-04-25 14:03 [reply] ------- +Subject: Bug 21173 + +CVSROOT: /cvs/gcc +Module name: gcc +Branch: gcc-4_0-branch +Changes by: dberlin@gcc.gnu.org 2005-04-25 14:02:38 + +Modified files: + gcc : ChangeLog tree-ssa-pre.c + +Log message: + 2005-04-25 Daniel Berlin <dberlin@dberlin.org> + + Fix PR tree-optimization/21173 + + * tree-ssa-pre.c (create_expression_by_pieces): Call unshare_expr + on things we pass to force_gimple_operand. Don't try to special + case min_invariants. + +Patches: +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=2.7592.2.192&r2=2.7592.2.193 +http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/tree-ssa-pre.c.diff?cvsroot=gcc&only_with_tag=gcc-4_0-branch&r1=2.65.4.2&r2=2.65.4.3 + +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/tree-ssa-pre.c,v +retrieving revision 2.65.4.2 +retrieving revision 2.65.4.3 +diff -u -r2.65.4.2 -r2.65.4.3 +--- gcc/gcc/tree-ssa-pre.c 2005/04/17 23:40:31 2.65.4.2 ++++ gcc/gcc/tree-ssa-pre.c 2005/04/25 14:02:31 2.65.4.3 +@@ -1330,7 +1330,8 @@ + + folded = fold (build (TREE_CODE (expr), TREE_TYPE (expr), + genop1, genop2)); +- newexpr = force_gimple_operand (folded, &forced_stmts, false, NULL); ++ newexpr = force_gimple_operand (unshare_expr (folded), ++ &forced_stmts, false, NULL); + if (forced_stmts) + { + tsi = tsi_start (forced_stmts); +@@ -1372,14 +1373,8 @@ + add_referenced_tmp_var (temp); + folded = fold (build (TREE_CODE (expr), TREE_TYPE (expr), + genop1)); +- /* If the generated operand is already GIMPLE min_invariant +- just use it instead of calling force_gimple_operand on it, +- since that may make it not invariant by copying it into an +- assignment. */ +- if (!is_gimple_min_invariant (genop1)) +- newexpr = force_gimple_operand (folded, &forced_stmts, false, NULL); +- else +- newexpr = genop1; ++ newexpr = force_gimple_operand (unshare_expr (folded), ++ &forced_stmts, false, NULL); + if (forced_stmts) + { + tsi = tsi_start (forced_stmts); + + 0K . 1.24 MB/s + +13:16:54 (1.24 MB/s) - `-' saved [1303] + diff --git a/patches/gcc/4.0.0/pr21951.patch b/patches/gcc/4.0.0/pr21951.patch new file mode 100644 index 00000000..8c5ffb9d --- /dev/null +++ b/patches/gcc/4.0.0/pr21951.patch @@ -0,0 +1,153 @@ +Workaround for buglet in std::vector etc. when compiling +with gcc-4.0.0 -Wall -O -fno-exceptions +Fixes: + +.../include/c++/4.0.0/bits/vector.tcc: In member function 'void std::vector<_Tp, +_Alloc>::reserve(size_t) [with _Tp = int, _Alloc = std::allocator<int>]': +.../include/c++/4.0.0/bits/vector.tcc:78: warning: control may reach end of +non-void function 'typename _Alloc::pointer std::vector<_Tp, +_Alloc>::_M_allocate_and_copy(size_t, _ForwardIterator, _ForwardIterator) [with +_ForwardIterator = int*, _Tp = int, _Alloc = std::allocator<int>]' being inlined + +See http://gcc.gnu.org/PR21951 + +--- gcc-4.0.1-20050607/libstdc++-v3/include/bits/stl_vector.h.old 2005-06-11 03:58:20.000000000 -0700 ++++ gcc-4.0.1-20050607/libstdc++-v3/include/bits/stl_vector.h 2005-06-11 04:01:21.000000000 -0700 +@@ -765,13 +765,13 @@ + { + std::__uninitialized_copy_a(__first, __last, __result, + this->get_allocator()); +- return __result; + } + catch(...) + { + _M_deallocate(__result, __n); + __throw_exception_again; + } ++ return __result; + } + + +--- gcc-4.0.1-20050607/libstdc++-v3/include/bits/stl_uninitialized.h.old 2005-06-11 03:58:20.000000000 -0700 ++++ gcc-4.0.1-20050607/libstdc++-v3/include/bits/stl_uninitialized.h 2005-06-11 04:05:18.990003248 -0700 +@@ -84,13 +84,13 @@ + { + for (; __first != __last; ++__first, ++__cur) + std::_Construct(&*__cur, *__first); +- return __cur; + } + catch(...) + { + std::_Destroy(__result, __cur); + __throw_exception_again; + } ++ return __cur; + } + + /** +@@ -236,13 +236,13 @@ + { + for (; __first != __last; ++__first, ++__cur) + __alloc.construct(&*__cur, *__first); +- return __cur; + } + catch(...) + { + std::_Destroy(__result, __cur, __alloc); + __throw_exception_again; + } ++ return __cur; + } + + template<typename _InputIterator, typename _ForwardIterator, typename _Tp> +@@ -337,11 +337,13 @@ + { + return std::__uninitialized_copy_a(__first2, __last2, __mid, __alloc); + } ++#ifdef __EXCEPTIONS // work around http://gcc.gnu.org/PR21951 in gcc-4.0 only + catch(...) + { + std::_Destroy(__result, __mid, __alloc); + __throw_exception_again; + } ++#endif + } + + // __uninitialized_fill_copy +@@ -360,11 +362,13 @@ + { + return std::__uninitialized_copy_a(__first, __last, __mid, __alloc); + } ++#ifdef __EXCEPTIONS // work around http://gcc.gnu.org/PR21951 in gcc-4.0 only + catch(...) + { + std::_Destroy(__result, __mid, __alloc); + __throw_exception_again; + } ++#endif + } + + // __uninitialized_copy_fill +--- gcc-4.0.1-20050607/libstdc++-v3/include/ext/rope.old 2005-06-11 03:58:20.000000000 -0700 ++++ gcc-4.0.1-20050607/libstdc++-v3/include/ext/rope 2005-06-11 04:13:26.628870872 -0700 +@@ -1645,11 +1645,13 @@ + _S_cond_store_eos(__buf[__size]); + try + { return _S_new_RopeLeaf(__buf, __size, __a); } ++#ifdef __EXCEPTIONS // work around http://gcc.gnu.org/PR21951 in gcc-4.0 only + catch(...) + { + _RopeRep::__STL_FREE_STRING(__buf, __size, __a); + __throw_exception_again; + } ++#endif + } + + // Concatenation of nonempty strings. +--- gcc-4.0.1-20050607/libstdc++-v3/include/ext/memory.old 2005-06-11 03:58:20.000000000 -0700 ++++ gcc-4.0.1-20050607/libstdc++-v3/include/ext/memory 2005-06-11 04:13:52.897877376 -0700 +@@ -85,11 +85,13 @@ + std::_Construct(&*__cur, *__first); + return pair<_InputIter, _ForwardIter>(__first, __cur); + } ++#ifdef __EXCEPTIONS // work around http://gcc.gnu.org/PR21951 in gcc-4.0 only + catch(...) + { + std::_Destroy(__result, __cur); + __throw_exception_again; + } ++#endif + } + + template<typename _RandomAccessIter, typename _Size, typename _ForwardIter> +@@ -144,11 +146,13 @@ + __alloc.construct(&*__cur, *__first); + return pair<_InputIter, _ForwardIter>(__first, __cur); + } ++#ifdef __EXCEPTIONS // work around http://gcc.gnu.org/PR21951 in gcc-4.0 only + catch(...) + { + std::_Destroy(__result, __cur, __alloc); + __throw_exception_again; + } ++#endif + } + + template<typename _InputIter, typename _Size, typename _ForwardIter, +--- gcc-4.0.1-20050607/libstdc++-v3/include/ext/hashtable.h.old 2005-06-11 03:58:20.000000000 -0700 ++++ gcc-4.0.1-20050607/libstdc++-v3/include/ext/hashtable.h 2005-06-11 04:14:28.384482592 -0700 +@@ -607,13 +607,13 @@ + try + { + this->get_allocator().construct(&__n->_M_val, __obj); +- return __n; + } + catch(...) + { + _M_put_node(__n); + __throw_exception_again; + } ++ return __n; + } + + void diff --git a/patches/gcc/4.0.1/fix-fixincl.patch b/patches/gcc/4.0.1/fix-fixincl.patch new file mode 100644 index 00000000..8051f31c --- /dev/null +++ b/patches/gcc/4.0.1/fix-fixincl.patch @@ -0,0 +1,72 @@ +See http://gcc.gnu.org/PR22541 + +From: Dan Kegel + +When building gcc-3.4.3 or gcc-4.0.[01] into a clean $PREFIX (the only two I've tried like this), +the configure script happily copies the glibc include files from include to sys-include; +here's the line from the log file (with $PREFIX instead of the real prefix): + +Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include + +But later, when running fixincludes, it gives the error message + The directory that should contain system headers does not exist: + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include + +Nevertheless, it continues building; the header files it installs in + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include +do not include the boilerplate that would cause it to #include_next the +glibc headers in the system header directory. +Thus the resulting toolchain can't compile the following program: +#include <limits.h> +int x = PATH_MAX; +because its limits.h doesn't include the glibc header. + +That's not nice. I suspect the problem is that gcc/Makefile.in assumes that +it can refer to $PREFIX/i686-unknown-linux-gnu with the path + $PREFIX/lib/../i686-unknown-linux-gnu, but +that fails because the directory $PREFIX/lib doesn't exist during 'make all'; +it is only created later, during 'make install'. (Which makes this problem +confusing, since one only notices the breakage well after 'make install', +at which point the path configure complained about does exist, and has the +right stuff in it.) + +A possible fix is to replace the line in gcc/Makefile.in that says + SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ +with a version that gets rid of extra ..'s, e.g. + SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"` +(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq +for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.) + +[rediffed against gcc-4.0.0] + +--- gcc-4.0.0/gcc/Makefile.in.orig 2005-04-04 12:45:13.000000000 -0700 ++++ gcc-4.0.0/gcc/Makefile.in 2005-05-20 12:33:43.000000000 -0700 +@@ -378,7 +378,10 @@ + CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@ + + # autoconf sets SYSTEM_HEADER_DIR to one of the above. +-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ ++# Purge it of unneccessary internal relative paths ++# to directories that might not exist yet. ++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta. ++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta` + + # Control whether to run fixproto and fixincludes. + STMP_FIXPROTO = @STMP_FIXPROTO@ +@@ -2838,13 +2841,15 @@ + ../$(build_subdir)/fixincludes/fixincl: ; @ : + + # Build fixed copies of system files. ++# Abort if no system headers available, unless building a crosscompiler. ++# FIXME: abort unless building --without-headers would be more accurate and less ugly + stmp-fixinc: gsyslimits.h macro_list \ + ../$(build_subdir)/fixincludes/fixincl \ + ../$(build_subdir)/fixincludes/fixinc.sh + @if test ! -d ${SYSTEM_HEADER_DIR}; then \ + echo The directory that should contain system headers does not exist: >&2 ; \ + echo " ${SYSTEM_HEADER_DIR}" >&2 ; \ +- if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \ ++ if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \ + then sleep 1; else exit 1; fi; \ + fi + rm -rf include; mkdir include diff --git a/patches/gcc/4.0.1/pr20815-fix.patch b/patches/gcc/4.0.1/pr20815-fix.patch new file mode 100644 index 00000000..7ac8ab50 --- /dev/null +++ b/patches/gcc/4.0.1/pr20815-fix.patch @@ -0,0 +1,121 @@ +Date: 18 May 2005 22:47:59 -0000 +Message-ID: <20050518224759.7352.qmail@sourceware.org> +From: "hubicka at ucw dot cz" <gcc-bugzilla@gcc.gnu.org> +To: dank@kegel.com +References: <20050407215701.20815.dank@kegel.com> +Reply-To: gcc-bugzilla@gcc.gnu.org +Subject: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'." + + +------- Additional Comments From hubicka at ucw dot cz 2005-05-18 22:47 ------- +Subject: Re: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'." + +> +> ------- Additional Comments From hubicka at ucw dot cz 2005-05-18 22:22 ------- +> Subject: Re: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'." +> +> coverage_checksum_string already knows a bit about ignoring random seed +> produced mess. It looks like this needs to be extended somehow to +> handle namespaces too... + +This seems to solve the missmatch. Would it be possible to test it on +bigger testcase and if it works distile a testcase that don't use +file IO so it is more suitable for gcc regtesting? + +Index: coverage.c +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/coverage.c,v +retrieving revision 1.6.2.12.2.12 +diff -c -3 -p -r1.6.2.12.2.12 coverage.c +*** gcc-old/gcc/coverage.c 18 May 2005 07:37:31 -0000 1.6.2.12.2.12 +--- gcc/gcc/coverage.c 18 May 2005 22:45:36 -0000 +*************** coverage_checksum_string (unsigned chksu +*** 471,505 **** + as the checksums are used only for sanity checking. */ + for (i = 0; string[i]; i++) + { + if (!strncmp (string + i, "_GLOBAL__", 9)) +! for (i = i + 9; string[i]; i++) +! if (string[i]=='_') +! { +! int y; +! unsigned seed; +! int scan; +! +! for (y = 1; y < 9; y++) +! if (!(string[i + y] >= '0' && string[i + y] <= '9') +! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) +! break; +! if (y != 9 || string[i + 9] != '_') +! continue; +! for (y = 10; y < 18; y++) +! if (!(string[i + y] >= '0' && string[i + y] <= '9') +! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) +! break; +! if (y != 18) +! continue; +! scan = sscanf (string + i + 10, "%X", &seed); +! gcc_assert (scan); +! if (seed != crc32_string (0, flag_random_seed)) +! continue; +! string = dup = xstrdup (string); +! for (y = 10; y < 18; y++) +! dup[i + y] = '0'; +! break; +! } + break; + } + +--- 471,511 ---- + as the checksums are used only for sanity checking. */ + for (i = 0; string[i]; i++) + { ++ int offset = 0; ++ if (!strncmp (string + i, "_GLOBAL__N_", 11)) ++ offset = 11; + if (!strncmp (string + i, "_GLOBAL__", 9)) +! offset = 9; +! +! /* C++ namespaces do have scheme: +! _GLOBAL__N_<filename>_<wrongmagicnumber>_<magicnumber>functionname +! since filename might contain extra underscores there seems +! to be no better chance then walk all possible offsets looking +! for magicnuber. */ +! if (offset) +! for (;string[offset]; offset++) +! for (i = i + offset; string[i]; i++) +! if (string[i]=='_') +! { +! int y; +! +! for (y = 1; y < 9; y++) +! if (!(string[i + y] >= '0' && string[i + y] <= '9') +! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) +! break; +! if (y != 9 || string[i + 9] != '_') +! continue; +! for (y = 10; y < 18; y++) +! if (!(string[i + y] >= '0' && string[i + y] <= '9') +! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) +! break; +! if (y != 18) +! continue; +! if (!dup) +! string = dup = xstrdup (string); +! for (y = 10; y < 18; y++) +! dup[i + y] = '0'; +! } + break; + } + + + +-- + + +http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20815 + +------- You are receiving this mail because: ------- +You reported the bug, or are watching the reporter. + + diff --git a/patches/gcc/4.0.1/pr21951-fix2.patch b/patches/gcc/4.0.1/pr21951-fix2.patch new file mode 100644 index 00000000..5e35a1e9 --- /dev/null +++ b/patches/gcc/4.0.1/pr21951-fix2.patch @@ -0,0 +1,71 @@ +Workaround for buglet in std::vector etc. when compiling +with gcc-4.0.1 -Wall -O -fno-exceptions +Fixes: + +.../include/c++/4.0.0/bits/vector.tcc: In member function 'void std::vector<_Tp, +_Alloc>::reserve(size_t) [with _Tp = int, _Alloc = std::allocator<int>]': +.../include/c++/4.0.0/bits/vector.tcc:78: warning: control may reach end of +non-void function 'typename _Alloc::pointer std::vector<_Tp, +_Alloc>::_M_allocate_and_copy(size_t, _ForwardIterator, _ForwardIterator) [with +_ForwardIterator = int*, _Tp = int, _Alloc = std::allocator<int>]' being inlined + +See http://gcc.gnu.org/PR21951 + +To: gcc-patches at gcc dot gnu dot org +Subject: [4.0.x] may reach end warning in system headers +Message-Id: <20050701183024.E138714C16A9@geoffk5.apple.com> +Date: Fri, 1 Jul 2005 11:30:24 -0700 (PDT) +From: gkeating at apple dot com (Geoffrey Keating) + + +One of our users was getting + +/usr/include/gcc/darwin/4.0/c++/bits/stl_uninitialized.h:113: warning: +control may reach end of non-void function '_ForwardIterator +std::__uninitialized_copy_aux(_InputIterator, _InputIterator, +_ForwardIterator, __false_type) [with _InputIterator = +__gnu_cxx::__normal_iterator<TPoolAllocator::tAllocState*, +std::vector<TPoolAllocator::tAllocState, +std::allocator<TPoolAllocator::tAllocState> > >, _ForwardIterator = +__gnu_cxx::__normal_iterator<TPoolAllocator::tAllocState*, +std::vector<TPoolAllocator::tAllocState, +std::allocator<TPoolAllocator::tAllocState> > >]' being inlined + +which shouldn't be happening, he has no way to change a standard C++ +header. The warning is bogus anyway, but it's fixed in 4.1 through +the CFG changes, which I don't really want to backport to the 4.0 +branch, so instead I'll add this patch. Other warnings generated from +tree-inline.c check for DECL_SYSTEM_HEADER like this. + +Bootstrapped & tested on powerpc-darwin8, I'll commit when the branch +is unfrozen. + +-- +- Geoffrey Keating <geoffk@apple.com> + +===File ~/patches/gcc-40-4121982.patch====================== +Index: ChangeLog +2005-06-28 Geoffrey Keating <geoffk@apple.com> + + * tree-inline.c (expand_call_inline): Prevent 'may reach end' + warning in system headers. + +Index: tree-inline.c +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/tree-inline.c,v +retrieving revision 1.170.8.4 +diff -u -p -u -p -r1.170.8.4 tree-inline.c +--- gcc-4.0.1/gcc/tree-inline.c.old 6 Jun 2005 19:20:32 -0000 1.170.8.4 ++++ gcc-4.0.1/gcc/tree-inline.c 1 Jul 2005 18:27:26 -0000 +@@ -1693,7 +1693,8 @@ expand_call_inline (tree *tp, int *walk_ + && !TREE_NO_WARNING (fn) + && !VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fn))) + && return_slot_addr == NULL_TREE +- && block_may_fallthru (copy)) ++ && block_may_fallthru (copy) ++ && !DECL_IN_SYSTEM_HEADER (fn)) + { + warning ("control may reach end of non-void function %qD being inlined", + fn); +============================================================ + diff --git a/patches/gcc/4.0.2/fix-fixincl.patch b/patches/gcc/4.0.2/fix-fixincl.patch new file mode 100644 index 00000000..8051f31c --- /dev/null +++ b/patches/gcc/4.0.2/fix-fixincl.patch @@ -0,0 +1,72 @@ +See http://gcc.gnu.org/PR22541 + +From: Dan Kegel + +When building gcc-3.4.3 or gcc-4.0.[01] into a clean $PREFIX (the only two I've tried like this), +the configure script happily copies the glibc include files from include to sys-include; +here's the line from the log file (with $PREFIX instead of the real prefix): + +Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include + +But later, when running fixincludes, it gives the error message + The directory that should contain system headers does not exist: + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include + +Nevertheless, it continues building; the header files it installs in + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include +do not include the boilerplate that would cause it to #include_next the +glibc headers in the system header directory. +Thus the resulting toolchain can't compile the following program: +#include <limits.h> +int x = PATH_MAX; +because its limits.h doesn't include the glibc header. + +That's not nice. I suspect the problem is that gcc/Makefile.in assumes that +it can refer to $PREFIX/i686-unknown-linux-gnu with the path + $PREFIX/lib/../i686-unknown-linux-gnu, but +that fails because the directory $PREFIX/lib doesn't exist during 'make all'; +it is only created later, during 'make install'. (Which makes this problem +confusing, since one only notices the breakage well after 'make install', +at which point the path configure complained about does exist, and has the +right stuff in it.) + +A possible fix is to replace the line in gcc/Makefile.in that says + SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ +with a version that gets rid of extra ..'s, e.g. + SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,,;ta"` +(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq +for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.) + +[rediffed against gcc-4.0.0] + +--- gcc-4.0.0/gcc/Makefile.in.orig 2005-04-04 12:45:13.000000000 -0700 ++++ gcc-4.0.0/gcc/Makefile.in 2005-05-20 12:33:43.000000000 -0700 +@@ -378,7 +378,10 @@ + CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@ + + # autoconf sets SYSTEM_HEADER_DIR to one of the above. +-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ ++# Purge it of unneccessary internal relative paths ++# to directories that might not exist yet. ++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta. ++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta` + + # Control whether to run fixproto and fixincludes. + STMP_FIXPROTO = @STMP_FIXPROTO@ +@@ -2838,13 +2841,15 @@ + ../$(build_subdir)/fixincludes/fixincl: ; @ : + + # Build fixed copies of system files. ++# Abort if no system headers available, unless building a crosscompiler. ++# FIXME: abort unless building --without-headers would be more accurate and less ugly + stmp-fixinc: gsyslimits.h macro_list \ + ../$(build_subdir)/fixincludes/fixincl \ + ../$(build_subdir)/fixincludes/fixinc.sh + @if test ! -d ${SYSTEM_HEADER_DIR}; then \ + echo The directory that should contain system headers does not exist: >&2 ; \ + echo " ${SYSTEM_HEADER_DIR}" >&2 ; \ +- if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \ ++ if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \ + then sleep 1; else exit 1; fi; \ + fi + rm -rf include; mkdir include diff --git a/patches/gcc/4.0.2/pr20815-fix.patch b/patches/gcc/4.0.2/pr20815-fix.patch new file mode 100644 index 00000000..7ac8ab50 --- /dev/null +++ b/patches/gcc/4.0.2/pr20815-fix.patch @@ -0,0 +1,121 @@ +Date: 18 May 2005 22:47:59 -0000 +Message-ID: <20050518224759.7352.qmail@sourceware.org> +From: "hubicka at ucw dot cz" <gcc-bugzilla@gcc.gnu.org> +To: dank@kegel.com +References: <20050407215701.20815.dank@kegel.com> +Reply-To: gcc-bugzilla@gcc.gnu.org +Subject: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'." + + +------- Additional Comments From hubicka at ucw dot cz 2005-05-18 22:47 ------- +Subject: Re: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'." + +> +> ------- Additional Comments From hubicka at ucw dot cz 2005-05-18 22:22 ------- +> Subject: Re: [Bug gcov/profile/20815] -fprofile-use barfs with "coverage mismatch for function '...' while reading counter 'arcs'." +> +> coverage_checksum_string already knows a bit about ignoring random seed +> produced mess. It looks like this needs to be extended somehow to +> handle namespaces too... + +This seems to solve the missmatch. Would it be possible to test it on +bigger testcase and if it works distile a testcase that don't use +file IO so it is more suitable for gcc regtesting? + +Index: coverage.c +=================================================================== +RCS file: /cvs/gcc/gcc/gcc/coverage.c,v +retrieving revision 1.6.2.12.2.12 +diff -c -3 -p -r1.6.2.12.2.12 coverage.c +*** gcc-old/gcc/coverage.c 18 May 2005 07:37:31 -0000 1.6.2.12.2.12 +--- gcc/gcc/coverage.c 18 May 2005 22:45:36 -0000 +*************** coverage_checksum_string (unsigned chksu +*** 471,505 **** + as the checksums are used only for sanity checking. */ + for (i = 0; string[i]; i++) + { + if (!strncmp (string + i, "_GLOBAL__", 9)) +! for (i = i + 9; string[i]; i++) +! if (string[i]=='_') +! { +! int y; +! unsigned seed; +! int scan; +! +! for (y = 1; y < 9; y++) +! if (!(string[i + y] >= '0' && string[i + y] <= '9') +! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) +! break; +! if (y != 9 || string[i + 9] != '_') +! continue; +! for (y = 10; y < 18; y++) +! if (!(string[i + y] >= '0' && string[i + y] <= '9') +! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) +! break; +! if (y != 18) +! continue; +! scan = sscanf (string + i + 10, "%X", &seed); +! gcc_assert (scan); +! if (seed != crc32_string (0, flag_random_seed)) +! continue; +! string = dup = xstrdup (string); +! for (y = 10; y < 18; y++) +! dup[i + y] = '0'; +! break; +! } + break; + } + +--- 471,511 ---- + as the checksums are used only for sanity checking. */ + for (i = 0; string[i]; i++) + { ++ int offset = 0; ++ if (!strncmp (string + i, "_GLOBAL__N_", 11)) ++ offset = 11; + if (!strncmp (string + i, "_GLOBAL__", 9)) +! offset = 9; +! +! /* C++ namespaces do have scheme: +! _GLOBAL__N_<filename>_<wrongmagicnumber>_<magicnumber>functionname +! since filename might contain extra underscores there seems +! to be no better chance then walk all possible offsets looking +! for magicnuber. */ +! if (offset) +! for (;string[offset]; offset++) +! for (i = i + offset; string[i]; i++) +! if (string[i]=='_') +! { +! int y; +! +! for (y = 1; y < 9; y++) +! if (!(string[i + y] >= '0' && string[i + y] <= '9') +! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) +! break; +! if (y != 9 || string[i + 9] != '_') +! continue; +! for (y = 10; y < 18; y++) +! if (!(string[i + y] >= '0' && string[i + y] <= '9') +! && !(string[i + y] >= 'A' && string[i + y] <= 'F')) +! break; +! if (y != 18) +! continue; +! if (!dup) +! string = dup = xstrdup (string); +! for (y = 10; y < 18; y++) +! dup[i + y] = '0'; +! } + break; + } + + + +-- + + +http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20815 + +------- You are receiving this mail because: ------- +You reported the bug, or are watching the reporter. + + diff --git a/patches/gcc/4.0.2/pr21623-workaround.patch b/patches/gcc/4.0.2/pr21623-workaround.patch new file mode 100644 index 00000000..90453fb3 --- /dev/null +++ b/patches/gcc/4.0.2/pr21623-workaround.patch @@ -0,0 +1,53 @@ +Message-ID: <434576E1.6020305@sscd.de> +Date: Thu, 06 Oct 2005 21:11:29 +0200 +From: Alexander Sieb <sieb@sscd.de> +To: crossgcc@sourceware.org +Subject: Crosstool sh4-linux-gcc-4.0.2-glibc-2.3.5 patches + +Hi, + +attached you find the files I needed to add to crosstool-0.38 +in order to build a sh4-linux gcc-4.0.2-glibc-2.3.5 tool chain. + +Files attached: + +sh4-gcc4.dat: + * gcc4 needs --with-multilib-list=m4,m4-nofpu otherwise a linux + kernel won't build as it uses the -m4-nofpu option. + +gcc-pr21623.patch: + * Kaz Kojima provided a patch [really, a workaround -dank] for http://gcc.gnu.org/PR21623 + +glibc-2.3.5-sh-memset.patch: + * A patch for glibc-2.3.5 which corrects memset. From SUGIOKA Toshinobu. + See content for rationale. + +-- snip -- + +-- Here's patch 1 of 2, plus URLs showing where it is in CVS -- + +[http://gcc.gnu.org/ml/gcc-cvs/2005-10/msg00081.html] + +2005-09-30 Kaz Kojima <kkojima@gcc.gnu.org> + + * config/sh/sh.c (sh_register_move_cost): Add case for moving + from T_REGS to FP register class. + +[http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/sh/sh.c.diff?cvsroot=gcc&r1=1.347&r2=1.348] + +RCS file: /cvs/gcc/gcc/gcc/config/sh/sh.c,v +retrieving revision 1.347 +retrieving revision 1.348 +diff -u -r1.347 -r1.348 +--- gcc/gcc/config/sh/sh.c 2005/09/05 12:45:22 1.347 ++++ gcc/gcc/config/sh/sh.c 2005/10/03 22:07:08 1.348 +@@ -9491,6 +9491,9 @@ sh_register_move_cost (enum machine_mode + && REGCLASS_HAS_FP_REG (dstclass)) + return 4; + ++ if (REGCLASS_HAS_FP_REG (dstclass) && srcclass == T_REGS) ++ return ((TARGET_HARD_SH4 && !optimize_size) ? 10 : 7); ++ + if ((REGCLASS_HAS_FP_REG (dstclass) && srcclass == MAC_REGS) + || (dstclass == MAC_REGS && REGCLASS_HAS_FP_REG (srcclass))) + return 9; diff --git a/patches/gcc/4.0.3/100-uclibc-conf.patch b/patches/gcc/4.0.3/100-uclibc-conf.patch new file mode 100644 index 00000000..3be7d097 --- /dev/null +++ b/patches/gcc/4.0.3/100-uclibc-conf.patch @@ -0,0 +1,553 @@ +--- gcc-4.0.2/gcc/config/t-linux-uclibc ++++ gcc-4.0.2/gcc/config/t-linux-uclibc +@@ -0,0 +1,5 @@ ++# Remove glibc specific files added in t-linux ++SHLIB_MAPFILES := $(filter-out $(srcdir)/config/libgcc-glibc.ver, $(SHLIB_MAPFILES)) ++ ++# Use unwind-dw2-fde instead of unwind-dw2-fde-glibc ++LIB2ADDEH := $(subst unwind-dw2-fde-glibc.c,unwind-dw2-fde.c,$(LIB2ADDEH)) +--- gcc-4.0.2/gcc/config.gcc ++++ gcc-4.0.2/gcc/config.gcc +@@ -1778,7 +1778,7 @@ + ;; + sh-*-elf* | sh[12346l]*-*-elf* | sh*-*-kaos* | \ + sh-*-symbianelf* | sh[12346l]*-*-symbianelf* | \ +- sh-*-linux* | sh[346lbe]*-*-linux* | \ ++ sh*-*-linux* | sh[346lbe]*-*-linux* | \ + sh-*-netbsdelf* | shl*-*-netbsdelf* | sh5-*-netbsd* | sh5l*-*-netbsd* | \ + sh64-*-netbsd* | sh64l*-*-netbsd*) + tmake_file="${tmake_file} sh/t-sh sh/t-elf" +@@ -2234,10 +2234,16 @@ + *) + echo "*** Configuration ${target} not supported" 1>&2 + exit 1 + ;; + esac ++ ++# Rather than hook into each target, just do it after all the linux ++# targets have been processed ++case ${target} in ++*-linux-uclibc*) tm_defines="${tm_defines} USE_UCLIBC" ; tmake_file="${tmake_file} t-linux-uclibc" ++esac + + case ${target} in + i[34567]86-*-linux*aout* | i[34567]86-*-linux*libc1) + tmake_file="${tmake_file} i386/t-gmm_malloc" + ;; +--- gcc-4.0.2/gcc/config/alpha/linux-elf.h ++++ gcc-4.0.2/gcc/config/alpha/linux-elf.h +@@ -27,7 +27,11 @@ + #define SUBTARGET_EXTRA_SPECS \ + { "elf_dynamic_linker", ELF_DYNAMIC_LINKER }, + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else + #define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + + #define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \ + %{O*:-O3} %{!O*:-O1} \ +--- gcc-4.0.2/gcc/config/arm/linux-elf.h ++++ gcc-4.0.2/gcc/config/arm/linux-elf.h +@@ -81,14 +81,19 @@ + #define ENDFILE_SPEC \ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ + %{shared:-shared} \ + %{symbolic:-Bsymbolic} \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "} \ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC +--- gcc-4.0.2/gcc/config/cris/linux.h ++++ gcc-4.0.2/gcc/config/cris/linux.h +@@ -79,6 +79,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -93,6 +112,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +--- gcc-4.0.2/gcc/config/i386/linux.h ++++ gcc-4.0.2/gcc/config/i386/linux.h +@@ -107,6 +107,11 @@ + #define LINK_EMULATION "elf_i386" + #define DYNAMIC_LINKER "/lib/ld-linux.so.2" + ++#ifdef USE_UCLIBC ++#undef DYNAMIC_LINKER ++#define DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#endif ++ + #undef SUBTARGET_EXTRA_SPECS + #define SUBTARGET_EXTRA_SPECS \ + { "link_emulation", LINK_EMULATION },\ +--- gcc-4.0.2/gcc/config/i386/linux64.h ++++ gcc-4.0.2/gcc/config/i386/linux64.h +@@ -54,14 +54,21 @@ + When the -shared link option is used a final link is not being + done. */ + ++#ifdef USE_UCLIBC ++#define ELF32_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0" ++#else ++#define ELF32_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#define ELF64_DYNAMIC_LINKER "/lib64/ld-linux-x86-64.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "%{!m32:-m elf_x86_64} %{m32:-m elf_i386} \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{m32:%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ +- %{!m32:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} \ ++ %{m32:%{!dynamic-linker:-dynamic-linker " ELF32_DYNAMIC_LINKER "}} \ ++ %{!m32:%{!dynamic-linker:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}} \ + %{static:-static}}" + + #define MULTILIB_DEFAULTS { "m64" } +--- gcc-4.0.2/gcc/config/ia64/linux.h ++++ gcc-4.0.2/gcc/config/ia64/linux.h +@@ -37,13 +37,18 @@ + /* Define this for shared library support because it isn't in the main + linux.h file. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "\ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux-ia64.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}" + + +--- gcc-4.0.2/gcc/config/m68k/linux.h ++++ gcc-4.0.2/gcc/config/m68k/linux.h +@@ -127,12 +127,17 @@ + + /* If ELF is the default format, we should not use /lib/elf. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "-m m68kelf %{shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker*:-dynamic-linker /lib/ld.so.1}} \ ++ %{!dynamic-linker*:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static}}" + + /* For compatibility with linux/a.out */ +--- gcc-4.0.2/gcc/config/mips/linux.h ++++ gcc-4.0.2/gcc/config/mips/linux.h +@@ -108,14 +108,19 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" ++#endif + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}}" + + #undef SUBTARGET_ASM_SPEC +--- gcc-4.0.2/gcc/config/pa/pa-linux.h ++++ gcc-4.0.2/gcc/config/pa/pa-linux.h +@@ -82,13 +82,18 @@ + /* Define this for shared library support because it isn't in the main + linux.h file. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "\ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}" + + /* glibc's profiling functions don't need gcc to allocate counters. */ +--- gcc-4.0.2/gcc/config/rs6000/linux.h ++++ gcc-4.0.2/gcc/config/rs6000/linux.h +@@ -69,7 +69,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #define LINK_GCC_C_SEQUENCE_SPEC \ + "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" +--- gcc-4.0.2/gcc/config/rs6000/sysv4.h ++++ gcc-4.0.2/gcc/config/rs6000/sysv4.h +@@ -949,6 +949,7 @@ + mcall-linux : %(link_os_linux) ; \ + mcall-gnu : %(link_os_gnu) ; \ + mcall-netbsd : %(link_os_netbsd) ; \ ++ mcall-linux-uclibc : %(link_os_linux_uclibc); \ + mcall-openbsd: %(link_os_openbsd) ; \ + : %(link_os_default) }" + +@@ -1127,6 +1128,10 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}" + ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + #if defined(HAVE_LD_EH_FRAME_HDR) + # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " + #endif +@@ -1293,6 +1298,7 @@ + { "link_os_sim", LINK_OS_SIM_SPEC }, \ + { "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \ + { "link_os_linux", LINK_OS_LINUX_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_gnu", LINK_OS_GNU_SPEC }, \ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \ +--- gcc-4.0.2/gcc/config/s390/linux.h ++++ gcc-4.0.2/gcc/config/s390/linux.h +@@ -77,6 +77,13 @@ + #define MULTILIB_DEFAULTS { "m31" } + #endif + ++#ifdef USE_UCLIBC ++#define ELF31_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0" ++#else ++#define ELF31_DYNAMIC_LINKER "/lib/ld.so.1" ++#define ELF64_DYNAMIC_LINKER "/lib/ld64.so.1" ++#endif + #undef LINK_SPEC + #define LINK_SPEC \ + "%{m31:-m elf_s390}%{m64:-m elf64_s390} \ +@@ -86,8 +93,8 @@ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker: \ +- %{m31:-dynamic-linker /lib/ld.so.1} \ +- %{m64:-dynamic-linker /lib/ld64.so.1}}}}" ++ %{m31:-dynamic-linker " ELF31_DYNAMIC_LINKER "} \ ++ %{m64:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}}}" + + + #define TARGET_ASM_FILE_END file_end_indicate_exec_stack +--- gcc-4.0.2/gcc/config/sh/linux.h ++++ gcc-4.0.2/gcc/config/sh/linux.h +@@ -67,11 +67,16 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}" + + #undef LIB_SPEC +--- gcc-4.0.2/gcc/config/sparc/linux.h ++++ gcc-4.0.2/gcc/config/sparc/linux.h +@@ -130,14 +130,19 @@ + + /* If ELF is the default format, we should not use /lib/elf. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ + %{!mno-relax:%{!r:-relax}} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}}" + + /* The sun bundled assembler doesn't accept -Yd, (and neither does gas). +--- gcc-4.0.2/gcc/config/sparc/linux64.h ++++ gcc-4.0.2/gcc/config/sparc/linux64.h +@@ -167,12 +166,17 @@ + { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ + { "link_arch", LINK_ARCH_SPEC }, + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}} \ + " + +--- gcc-4.0.2/libtool.m4 ++++ gcc-4.0.2/libtool.m4 +@@ -682,6 +682,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +--- gcc-4.0.2/ltconfig ++++ gcc-4.0.2/ltconfig +@@ -603,6 +603,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1274,6 +1275,23 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +--- gcc-4.0.2/libffi/configure ++++ gcc-4.0.2/libffi/configure +@@ -3457,6 +3457,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.0.2/libgfortran/configure ++++ gcc-4.0.2/libgfortran/configure +@@ -3681,6 +3681,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.0.2/libjava/configure ++++ gcc-4.0.2/libjava/configure +@@ -4351,6 +4351,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.0.2/libmudflap/configure ++++ gcc-4.0.2/libmudflap/configure +@@ -5380,6 +5380,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.0.2/libobjc/configure ++++ gcc-4.0.2/libobjc/configure +@@ -3283,6 +3283,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.0.2/boehm-gc/configure ++++ gcc-4.0.2/boehm-gc/configure +@@ -4320,6 +4320,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.0.2/configure ++++ gcc-4.0.2/configure +@@ -1141,7 +1141,7 @@ + ;; + "") + case "${target}" in +- *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu) ++ *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*) + # Enable libmudflap by default in GNU and friends. + ;; + *-*-freebsd*) +--- gcc-4.0.2/configure.in ++++ gcc-4.0.2/configure.in +@@ -350,7 +350,7 @@ + ;; + "") + case "${target}" in +- *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu) ++ *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*) + # Enable libmudflap by default in GNU and friends. + ;; + *-*-freebsd*) +--- gcc-4.0.2/contrib/regression/objs-gcc.sh ++++ gcc-4.0.2/contrib/regression/objs-gcc.sh +@@ -105,6 +105,10 @@ + then + make all-gdb all-dejagnu all-ld || exit 1 + make install-gdb install-dejagnu install-ld || exit 1 ++elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ] ++ then ++ make all-gdb all-dejagnu all-ld || exit 1 ++ make install-gdb install-dejagnu install-ld || exit 1 + elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then + make bootstrap || exit 1 + make install || exit 1 +--- gcc-4.0.2/zlib/configure ++++ gcc-4.0.2/zlib/configure +@@ -3426,6 +3426,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/patches/gcc/4.0.3/200-uclibc-locale.patch b/patches/gcc/4.0.3/200-uclibc-locale.patch new file mode 100644 index 00000000..ac4cf972 --- /dev/null +++ b/patches/gcc/4.0.3/200-uclibc-locale.patch @@ -0,0 +1,3237 @@ +diff -urN gcc-4.0.0-100/libstdc++-v3/acinclude.m4 gcc-4.0.0/libstdc++-v3/acinclude.m4 +--- gcc-4.0.0-100/libstdc++-v3/acinclude.m4 2005-04-30 13:06:53.000000000 -0500 ++++ gcc-4.0.0/libstdc++-v3/acinclude.m4 2005-04-28 20:19:01.000000000 -0500 +@@ -1104,7 +1104,7 @@ + AC_MSG_CHECKING([for C locale to use]) + GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], + [use MODEL for target locale package], +- [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) ++ [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) + + # If they didn't use this option switch, or if they specified --enable + # with no specific model, we'll have to look for one. If they +@@ -1120,6 +1120,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case ${target_os} in ++ *-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include <features.h> +@@ -1263,6 +1266,40 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,59 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek <jakub@redhat.com> ++ ++#include <clocale> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.cc 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,160 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <cerrno> // For errno ++#include <locale> ++#include <stdexcept> ++#include <langinfo.h> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#warning should dummy __newlocale check for C|POSIX ? ++#define __newlocale(a, b, c) NULL ++#define __freelocale(a) ((void)0) ++#define __duplocale(a) __c_locale() ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale " ++ "name not valid")); ++ } ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++ if (_S_get_c_locale() != __cloc) ++ __freelocale(__cloc); ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++ { return __duplocale(__cloc); } ++} // namespace std ++ ++namespace __gnu_cxx ++{ ++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES", ++#if _GLIBCXX_NUM_CATEGORIES != 0 ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} ++ ++namespace std ++{ ++ const char* const* const locale::_S_categories = __gnu_cxx::category_names; ++} // namespace std +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.h 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,115 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include <cstring> // get std::strlen ++#include <cstdio> // get std::snprintf or std::sprintf ++#include <clocale> ++#include <langinfo.h> // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include <iconv.h> // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include <libintl.h> // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCXX_C_LOCALE_GNU for ++#endif ++#define _GLIBCXX_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCXX_NUM_CATEGORIES 6 ++#define _GLIBCXX_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template<typename _Tv> ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = std::setlocale(LC_ALL, NULL); ++ char* __sav = new char[std::strlen(__old) + 1]; ++ std::strcpy(__sav, __old); ++ std::setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ std::setlocale(LC_ALL, __sav); ++ delete [] __sav; ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,306 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // wcsnrtombs is *very* fast but stops if encounters NUL characters: ++ // in case we fall back to wcrtomb and then continue, in a loop. ++ // NB: wcsnrtombs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', ++ __from_end - __from_next); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ const size_t __conv = wcsnrtombs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // wcrtomb. ++ for (; __from < __from_next; ++__from) ++ __to_next += wcrtomb(__to_next, *__from, &__tmp_state); ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ extern_type __buf[MB_LEN_MAX]; ++ __tmp_state = __state; ++ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); ++ if (__conv > static_cast<size_t>(__to_end - __to_next)) ++ __ret = partial; ++ else ++ { ++ memcpy(__to_next, __buf, __conv); ++ __state = __tmp_state; ++ __to_next += __conv; ++ ++__from_next; ++ } ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we store a L'\0' and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0', ++ __from_end ++ - __from_next)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ size_t __conv = mbsnrtowcs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (;; ++__to_next, __from += __conv) ++ { ++ __conv = mbrtowc(__to_next, __from, __from_end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __from_next = __from; ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ // It is unclear what to return in this case (see DR 382). ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ if (__to_next < __to_end) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from_next; ++ *__to_next++ = L'\0'; ++ } ++ else ++ __ret = partial; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_encoding() const throw() ++ { ++ // XXX This implementation assumes that the encoding is ++ // stateless and is either single-byte or variable-width. ++ int __ret = 0; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ if (MB_CUR_MAX == 1) ++ __ret = 1; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_max_length() const throw() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ // XXX Probably wrong for stateful encodings. ++ int __ret = MB_CUR_MAX; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_length(state_type& __state, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { ++ int __ret = 0; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we advance past it and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ ++ // A dummy internal buffer is needed in order for mbsnrtocws to consider ++ // its fourth parameter (it wouldn't with NULL as first parameter). ++ wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0', ++ __end ++ - __from)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __end; ++ ++ const extern_type* __tmp_from = __from; ++ size_t __conv = mbsnrtowcs(__to, &__from, ++ __from_chunk_end - __from, ++ __max, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (__from = __tmp_from;; __from += __conv) ++ { ++ __conv = mbrtowc(NULL, __from, __end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __state = __tmp_state; ++ __ret += __from - __tmp_from; ++ break; ++ } ++ if (!__from) ++ __from = __from_chunk_end; ++ ++ __ret += __from - __tmp_from; ++ __max -= __conv; ++ ++ if (__from < __end && __max) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from; ++ ++__ret; ++ --__max; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/collate_members.cc 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate<char>::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<char>::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ int ++ collate<wchar_t>::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,300 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype<char> specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) ++ : ctype<char>(0, false, __refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_ctype); ++ this->_S_create_c_locale(this->_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; ++ this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; ++ this->_M_table = this->_M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ ctype<wchar_t>::__wmask_type ++ ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = __wmask_type(); ++ } ++ return __ret; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype<wchar_t>:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur] ++ && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (; __lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ __m |= _M_bit[__bitcur]; ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype<wchar_t>:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<wchar_t>:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast<unsigned char>(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype<wchar_t>:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok) ++ return _M_narrow[__wc]; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ const int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ if (_M_narrow_ok) ++ while (__lo < __hi) ++ { ++ if (*__lo >= 0 && *__lo < 128) ++ *__dest = _M_narrow[*__lo]; ++ else ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype<wchar_t>::_M_initialize_ctype() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wint_t __i; ++ for (__i = 0; __i < 128; ++__i) ++ { ++ const int __c = wctob(__i); ++ if (__c == EOF) ++ break; ++ else ++ _M_narrow[__i] = static_cast<char>(__c); ++ } ++ if (__i == 128) ++ _M_narrow_ok = true; ++ else ++ _M_narrow_ok = false; ++ for (size_t __j = 0; ++ __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) ++ _M_widen[__j] = btowc(__j); ++ ++ for (size_t __k = 0; __k <= 11; ++__k) ++ { ++ _M_bit[__k] = static_cast<mask>(_ISbit(__k)); ++ _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++#endif // _GLIBCXX_USE_WCHAR_T ++} +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.cc 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages<char>::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ wstring ++ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++# elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.h 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,118 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template<typename _CharT> ++ messages<_CharT>::messages(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)), ++ _M_name_messages(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_messages = __tmp; ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::~messages() ++ { ++ if (_M_name_messages != _S_get_c_name()) ++ delete [] _M_name_messages; ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string<char>& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template<typename _CharT> ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template<typename _CharT> ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++ if (this->_M_name_messages != locale::facet::_S_get_c_name()) ++ delete [] this->_M_name_messages; ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ this->_M_name_messages = __tmp; ++ ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_messages); ++ this->_S_create_c_locale(this->_M_c_locale_messages, __s); ++ } ++ } +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2005-04-28 01:23:02.000000000 -0500 +@@ -0,0 +1,692 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ __ret.field[0] = sign; ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[2] = space; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[1] = space; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ else ++ { ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ default: ++ __ret = pattern(); ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == true ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == false ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct<char, true>::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct<char, false>::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = ++ static_cast<wchar_t>(money_base::_S_atoms[__i]); ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = ++ static_cast<wchar_t>(money_base::_S_atoms[__i]); ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct<wchar_t, true>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++ ++ template<> ++ moneypunct<wchar_t, false>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++#endif ++} +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2005-04-28 01:20:20.000000000 -0500 +@@ -0,0 +1,173 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, ++ __cloc)); ++ ++ // Check for NULL, which implies no grouping. ++ if (_M_data->_M_thousands_sep == '\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = "true"; ++ _M_data->_M_truename_size = 4; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = "false"; ++ _M_data->_M_falsename_size = 5; ++ } ++ ++ template<> ++ numpunct<char>::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<wchar_t>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = ++ static_cast<wchar_t>(__num_base::_S_atoms_out[__i]); ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = ++ static_cast<wchar_t>(__num_base::_S_atoms_in[__j]); ++ } ++ else ++ { ++ // Named locale. ++ // NB: In the GNU model wchar_t is always 32 bit wide. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ ++ if (_M_data->_M_thousands_sep == L'\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = L"true"; ++ _M_data->_M_truename_size = 4; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = L"false"; ++ _M_data->_M_falsename_size = 5; ++ } ++ ++ template<> ++ numpunct<wchar_t>::~numpunct() ++ { delete _M_data; } ++ #endif ++} +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.cc 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,406 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct<char>:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const size_t __len = __strftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = '\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = "%m/%d/%y"; ++ _M_data->_M_date_era_format = "%m/%d/%y"; ++ _M_data->_M_time_format = "%H:%M:%S"; ++ _M_data->_M_time_era_format = "%H:%M:%S"; ++ _M_data->_M_date_time_format = ""; ++ _M_data->_M_date_time_era_format = ""; ++ _M_data->_M_am = "AM"; ++ _M_data->_M_pm = "PM"; ++ _M_data->_M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = "Sunday"; ++ _M_data->_M_day2 = "Monday"; ++ _M_data->_M_day3 = "Tuesday"; ++ _M_data->_M_day4 = "Wednesday"; ++ _M_data->_M_day5 = "Thursday"; ++ _M_data->_M_day6 = "Friday"; ++ _M_data->_M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = "Sun"; ++ _M_data->_M_aday2 = "Mon"; ++ _M_data->_M_aday3 = "Tue"; ++ _M_data->_M_aday4 = "Wed"; ++ _M_data->_M_aday5 = "Thu"; ++ _M_data->_M_aday6 = "Fri"; ++ _M_data->_M_aday7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = "January"; ++ _M_data->_M_month02 = "February"; ++ _M_data->_M_month03 = "March"; ++ _M_data->_M_month04 = "April"; ++ _M_data->_M_month05 = "May"; ++ _M_data->_M_month06 = "June"; ++ _M_data->_M_month07 = "July"; ++ _M_data->_M_month08 = "August"; ++ _M_data->_M_month09 = "September"; ++ _M_data->_M_month10 = "October"; ++ _M_data->_M_month11 = "November"; ++ _M_data->_M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = "Jan"; ++ _M_data->_M_amonth02 = "Feb"; ++ _M_data->_M_amonth03 = "Mar"; ++ _M_data->_M_amonth04 = "Apr"; ++ _M_data->_M_amonth05 = "May"; ++ _M_data->_M_amonth06 = "Jun"; ++ _M_data->_M_amonth07 = "Jul"; ++ _M_data->_M_amonth08 = "Aug"; ++ _M_data->_M_amonth09 = "Sep"; ++ _M_data->_M_amonth10 = "Oct"; ++ _M_data->_M_amonth11 = "Nov"; ++ _M_data->_M_amonth12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, ++ __cloc); ++ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ __timepunct<wchar_t>:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++ const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = L'\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<wchar_t>; ++ ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = L"%m/%d/%y"; ++ _M_data->_M_date_era_format = L"%m/%d/%y"; ++ _M_data->_M_time_format = L"%H:%M:%S"; ++ _M_data->_M_time_era_format = L"%H:%M:%S"; ++ _M_data->_M_date_time_format = L""; ++ _M_data->_M_date_time_era_format = L""; ++ _M_data->_M_am = L"AM"; ++ _M_data->_M_pm = L"PM"; ++ _M_data->_M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = L"Sunday"; ++ _M_data->_M_day2 = L"Monday"; ++ _M_data->_M_day3 = L"Tuesday"; ++ _M_data->_M_day4 = L"Wednesday"; ++ _M_data->_M_day5 = L"Thursday"; ++ _M_data->_M_day6 = L"Friday"; ++ _M_data->_M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = L"Sun"; ++ _M_data->_M_aday2 = L"Mon"; ++ _M_data->_M_aday3 = L"Tue"; ++ _M_data->_M_aday4 = L"Wed"; ++ _M_data->_M_aday5 = L"Thu"; ++ _M_data->_M_aday6 = L"Fri"; ++ _M_data->_M_aday7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = L"January"; ++ _M_data->_M_month02 = L"February"; ++ _M_data->_M_month03 = L"March"; ++ _M_data->_M_month04 = L"April"; ++ _M_data->_M_month05 = L"May"; ++ _M_data->_M_month06 = L"June"; ++ _M_data->_M_month07 = L"July"; ++ _M_data->_M_month08 = L"August"; ++ _M_data->_M_month09 = L"September"; ++ _M_data->_M_month10 = L"October"; ++ _M_data->_M_month11 = L"November"; ++ _M_data->_M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = L"Jan"; ++ _M_data->_M_amonth02 = L"Feb"; ++ _M_data->_M_amonth03 = L"Mar"; ++ _M_data->_M_amonth04 = L"Apr"; ++ _M_data->_M_amonth05 = L"May"; ++ _M_data->_M_amonth06 = L"Jun"; ++ _M_data->_M_amonth07 = L"Jul"; ++ _M_data->_M_amonth08 = L"Aug"; ++ _M_data->_M_amonth09 = L"Sep"; ++ _M_data->_M_amonth10 = L"Oct"; ++ _M_data->_M_amonth11 = L"Nov"; ++ _M_data->_M_amonth12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ union { char *__s; wchar_t *__w; } __u; ++ ++ __u.__s = __nl_langinfo_l(_NL_WD_FMT, __cloc); ++ _M_data->_M_date_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_D_FMT, __cloc); ++ _M_data->_M_date_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WT_FMT, __cloc); ++ _M_data->_M_time_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_T_FMT, __cloc); ++ _M_data->_M_time_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WD_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WAM_STR, __cloc); ++ _M_data->_M_am = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WPM_STR, __cloc); ++ _M_data->_M_pm = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc); ++ _M_data->_M_am_pm_format = __u.__w; ++ ++ // Day names, starting with "C"'s Sunday. ++ __u.__s = __nl_langinfo_l(_NL_WDAY_1, __cloc); ++ _M_data->_M_day1 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_2, __cloc); ++ _M_data->_M_day2 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_3, __cloc); ++ _M_data->_M_day3 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_4, __cloc); ++ _M_data->_M_day4 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_5, __cloc); ++ _M_data->_M_day5 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_6, __cloc); ++ _M_data->_M_day6 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_7, __cloc); ++ _M_data->_M_day7 = __u.__w; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_1, __cloc); ++ _M_data->_M_aday1 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_2, __cloc); ++ _M_data->_M_aday2 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_3, __cloc); ++ _M_data->_M_aday3 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_4, __cloc); ++ _M_data->_M_aday4 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_5, __cloc); ++ _M_data->_M_aday5 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_6, __cloc); ++ _M_data->_M_aday6 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_7, __cloc); ++ _M_data->_M_aday7 = __u.__w; ++ ++ // Month names, starting with "C"'s January. ++ __u.__s = __nl_langinfo_l(_NL_WMON_1, __cloc); ++ _M_data->_M_month01 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_2, __cloc); ++ _M_data->_M_month02 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_3, __cloc); ++ _M_data->_M_month03 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_4, __cloc); ++ _M_data->_M_month04 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_5, __cloc); ++ _M_data->_M_month05 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_6, __cloc); ++ _M_data->_M_month06 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_7, __cloc); ++ _M_data->_M_month07 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_8, __cloc); ++ _M_data->_M_month08 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_9, __cloc); ++ _M_data->_M_month09 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_10, __cloc); ++ _M_data->_M_month10 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_11, __cloc); ++ _M_data->_M_month11 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_12, __cloc); ++ _M_data->_M_month12 = __u.__w; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ __u.__s = __nl_langinfo_l(_NL_WABMON_1, __cloc); ++ _M_data->_M_amonth01 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_2, __cloc); ++ _M_data->_M_amonth02 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_3, __cloc); ++ _M_data->_M_amonth03 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_4, __cloc); ++ _M_data->_M_amonth04 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_5, __cloc); ++ _M_data->_M_amonth05 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_6, __cloc); ++ _M_data->_M_amonth06 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_7, __cloc); ++ _M_data->_M_amonth07 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_8, __cloc); ++ _M_data->_M_amonth08 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_9, __cloc); ++ _M_data->_M_amonth09 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_10, __cloc); ++ _M_data->_M_amonth10 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_11, __cloc); ++ _M_data->_M_amonth11 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_12, __cloc); ++ _M_data->_M_amonth12 = __u.__w; ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.h 2004-05-22 18:46:31.000000000 -0500 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) ++ : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_timepunct = __tmp; ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::~__timepunct() ++ { ++ if (_M_name_timepunct != _S_get_c_name()) ++ delete [] _M_name_timepunct; ++ delete _M_data; ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_base.h 2005-04-28 01:10:27.000000000 -0500 +@@ -0,0 +1,64 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++/** @file ctype_base.h ++ * This is an internal header file, included by other library headers. ++ * You should not attempt to use it directly. ++ */ ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ /// @brief Base class for ctype. ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ ++ // NB: Offsets into ctype<char>::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISalpha | _ISdigit | _ISpunct; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalpha | _ISdigit; ++ }; +diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_inline.h 2002-06-24 00:49:19.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype<char>:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast<unsigned char>(__c)] & __m; } ++ ++ const char* ++ ctype<char>:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2005-04-28 01:10:27.000000000 -0500 +@@ -0,0 +1,92 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype<char>::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype<char>::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ char ++ ctype<char>::do_toupper(char __c) const ++ { return _M_toupper[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype<char>::do_tolower(char __c) const ++ { return _M_tolower[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/os_defines.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/os_defines.h 2005-04-28 01:10:27.000000000 -0500 +@@ -0,0 +1,44 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCXX_OS_DEFINES ++#define _GLIBCXX_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include <features.h> ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif +diff -urN gcc-4.0.0-100/libstdc++-v3/configure gcc-4.0.0/libstdc++-v3/configure +--- gcc-4.0.0-100/libstdc++-v3/configure 2005-04-30 13:06:53.683055232 -0500 ++++ gcc-4.0.0/libstdc++-v3/configure 2005-04-30 12:24:24.000000000 -0500 +@@ -3998,6 +3998,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5672,7 +5677,7 @@ + enableval="$enable_clocale" + + case "$enableval" in +- generic|gnu|ieee_1003.1-2001|yes|no|auto) ;; ++ generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto) ;; + *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable clocale" >&5 + echo "$as_me: error: Unknown argument to enable/disable clocale" >&2;} + { (exit 1); exit 1; }; } ;; +@@ -5697,6 +5702,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case ${target_os} in ++ linux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) + cat >conftest.$ac_ext <<_ACEOF + /* confdefs.h. */ +@@ -5927,6 +5935,76 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ echo "$as_me:$LINENO: result: uclibc" >&5 ++echo "${ECHO_T}uclibc" >&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; 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_check_msgfmt+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_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_check_msgfmt="yes" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt=$ac_cv_prog_check_msgfmt ++if test -n "$check_msgfmt"; then ++ echo "$as_me:$LINENO: result: $check_msgfmt" >&5 ++echo "${ECHO_T}$check_msgfmt" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-4.0.0-100/libstdc++-v3/configure.host gcc-4.0.0/libstdc++-v3/configure.host +--- gcc-4.0.0-100/libstdc++-v3/configure.host 2005-04-30 13:06:53.688054472 -0500 ++++ gcc-4.0.0/libstdc++-v3/configure.host 2005-04-28 20:20:32.000000000 -0500 +@@ -249,6 +249,12 @@ + ;; + esac + ++# Override for uClibc since linux-uclibc gets mishandled above. ++case "${host_os}" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; ++esac + + # Set any OS-dependent and CPU-dependent bits. + # THIS TABLE IS SORTED. KEEP IT THAT WAY. +diff -urN gcc-4.0.0-100/libstdc++-v3/crossconfig.m4 gcc-4.0.0/libstdc++-v3/crossconfig.m4 +--- gcc-4.0.0-100/libstdc++-v3/crossconfig.m4 2005-04-30 13:06:53.689054320 -0500 ++++ gcc-4.0.0/libstdc++-v3/crossconfig.m4 2005-04-28 20:27:15.000000000 -0500 +@@ -142,6 +142,98 @@ + ;; + esac + ;; ++ *-uclibc*) ++# Temporary hack until we implement the float versions of the libm funcs ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCXX_CHECK_LINKER_FEATURES ++ GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCXX_CHECK_WCHAR_T_SUPPORT ++ ++ # For LFS. ++ AC_DEFINE(HAVE_INT64_T) ++ case "$target" in ++ *-uclinux*) ++ # Don't enable LFS with uClinux ++ ;; ++ *) ++ AC_DEFINE(_GLIBCXX_USE_LFS) ++ esac ++ ++ # For showmanyc_helper(). ++ AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h) ++ GLIBCXX_CHECK_POLL ++ GLIBCXX_CHECK_S_ISREG_OR_S_IFREG ++ ++ # For xsputn_2(). ++ AC_CHECK_HEADERS(sys/uio.h) ++ GLIBCXX_CHECK_WRITEV ++ ++# AC_DEFINE(HAVE_ACOSF) ++# AC_DEFINE(HAVE_ASINF) ++# AC_DEFINE(HAVE_ATANF) ++# AC_DEFINE(HAVE_ATAN2F) ++ AC_DEFINE(HAVE_CEILF) ++ AC_DEFINE(HAVE_COPYSIGN) ++# AC_DEFINE(HAVE_COPYSIGNF) ++# AC_DEFINE(HAVE_COSF) ++# AC_DEFINE(HAVE_COSHF) ++# AC_DEFINE(HAVE_EXPF) ++# AC_DEFINE(HAVE_FABSF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ AC_DEFINE(HAVE_FLOORF) ++# AC_DEFINE(HAVE_FMODF) ++# AC_DEFINE(HAVE_FREXPF) ++ AC_DEFINE(HAVE_HYPOT) ++# AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++# AC_DEFINE(HAVE_LOGF) ++# AC_DEFINE(HAVE_LOG10F) ++# AC_DEFINE(HAVE_MODFF) ++# AC_DEFINE(HAVE_SINF) ++# AC_DEFINE(HAVE_SINHF) ++# AC_DEFINE(HAVE_SINCOS) ++# AC_DEFINE(HAVE_SINCOSF) ++ AC_DEFINE(HAVE_SQRTF) ++# AC_DEFINE(HAVE_TANF) ++# AC_DEFINE(HAVE_TANHF) ++ if test x"long_double_math_on_this_cpu" = x"yes"; then ++# AC_DEFINE(HAVE_ACOSL) ++# AC_DEFINE(HAVE_ASINL) ++# AC_DEFINE(HAVE_ATANL) ++# AC_DEFINE(HAVE_ATAN2L) ++# AC_DEFINE(HAVE_CEILL) ++# AC_DEFINE(HAVE_COPYSIGNL) ++# AC_DEFINE(HAVE_COSL) ++# AC_DEFINE(HAVE_COSHL) ++# AC_DEFINE(HAVE_EXPL) ++# AC_DEFINE(HAVE_FABSL) ++# AC_DEFINE(HAVE_FINITEL) ++# AC_DEFINE(HAVE_FLOORL) ++# AC_DEFINE(HAVE_FMODL) ++# AC_DEFINE(HAVE_FREXPL) ++# AC_DEFINE(HAVE_HYPOTL) ++# AC_DEFINE(HAVE_ISINFL) ++# AC_DEFINE(HAVE_ISNANL) ++# AC_DEFINE(HAVE_LOGL) ++# AC_DEFINE(HAVE_LOG10L) ++# AC_DEFINE(HAVE_MODFL) ++# AC_DEFINE(HAVE_POWL) ++# AC_DEFINE(HAVE_SINL) ++# AC_DEFINE(HAVE_SINHL) ++# AC_DEFINE(HAVE_SINCOSL) ++# AC_DEFINE(HAVE_SQRTL) ++# AC_DEFINE(HAVE_TANL) ++# AC_DEFINE(HAVE_TANHL) ++ fi ++ ;; + *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu) + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ + machine/endian.h machine/param.h sys/machine.h sys/types.h \ +@@ -156,7 +248,7 @@ + AC_DEFINE(HAVE_INT64_T) + case "$target" in + *-uclinux*) +- # Don't enable LFS with uClibc ++ # Don't enable LFS with uClinux + ;; + *) + AC_DEFINE(_GLIBCXX_USE_LFS) +diff -urN gcc-4.0.0-100/libstdc++-v3/include/c_compatibility/wchar.h gcc-4.0.0/libstdc++-v3/include/c_compatibility/wchar.h +--- gcc-4.0.0-100/libstdc++-v3/include/c_compatibility/wchar.h 2005-04-30 13:06:53.690054168 -0500 ++++ gcc-4.0.0/libstdc++-v3/include/c_compatibility/wchar.h 2005-04-28 20:15:56.000000000 -0500 +@@ -101,7 +101,9 @@ + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; ++#if _GLIBCXX_HAVE_WCSFTIME + using std::wcsftime; ++#endif + + #if _GLIBCXX_USE_C99 + using std::wcstold; +diff -urN gcc-4.0.0-100/libstdc++-v3/include/c_std/std_cwchar.h gcc-4.0.0/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-4.0.0-100/libstdc++-v3/include/c_std/std_cwchar.h 2005-04-30 13:06:53.691054016 -0500 ++++ gcc-4.0.0/libstdc++-v3/include/c_std/std_cwchar.h 2005-04-28 20:15:56.000000000 -0500 +@@ -179,7 +179,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#if _GLIBCXX_HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; diff --git a/patches/gcc/4.0.3/300-libstdc++-pic.patch b/patches/gcc/4.0.3/300-libstdc++-pic.patch new file mode 100644 index 00000000..a9d6e718 --- /dev/null +++ b/patches/gcc/4.0.3/300-libstdc++-pic.patch @@ -0,0 +1,45 @@ +--- gcc-4.0.0/libstdc++-v3/src/Makefile.am ++++ gcc-4.0.0/libstdc++-v3/src/Makefile.am +@@ -214,6 +214,10 @@ + $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LDFLAGS) -o $@ + + ++install-exec-local: ++ $(AR) cru libstdc++_pic.a *.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Added bits to build debug library. + if GLIBCXX_BUILD_DEBUG + all-local: build_debug +--- gcc-4.0.0/libstdc++-v3/src/Makefile.in ++++ gcc-4.0.0/libstdc++-v3/src/Makefile.in +@@ -625,7 +625,7 @@ + + install-data-am: install-data-local + +-install-exec-am: install-toolexeclibLTLIBRARIES ++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local + + install-info: install-info-am + +@@ -664,7 +664,7 @@ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ +- uninstall-toolexeclibLTLIBRARIES ++ uninstall-toolexeclibLTLIBRARIES install-exec-local + + @GLIBCXX_BUILD_VERSIONED_SHLIB_TRUE@libstdc++-symbol.ver: ${glibcxx_srcdir}/$(SYMVER_MAP) + @GLIBCXX_BUILD_VERSIONED_SHLIB_TRUE@ cp ${glibcxx_srcdir}/$(SYMVER_MAP) ./libstdc++-symbol.ver +@@ -743,6 +743,11 @@ + install_debug: + (cd ${debugdir} && $(MAKE) \ + toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install) ++ ++install-exec-local: ++ $(AR) cru libstdc++_pic.a *.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: diff --git a/patches/gcc/4.0.3/301-missing-execinfo_h.patch b/patches/gcc/4.0.3/301-missing-execinfo_h.patch new file mode 100644 index 00000000..0e2092f3 --- /dev/null +++ b/patches/gcc/4.0.3/301-missing-execinfo_h.patch @@ -0,0 +1,11 @@ +--- gcc-4.0.0/boehm-gc/include/gc.h-orig 2005-04-28 22:28:57.000000000 -0500 ++++ gcc-4.0.0/boehm-gc/include/gc.h 2005-04-28 22:30:38.000000000 -0500 +@@ -500,7 +500,7 @@ + #ifdef __linux__ + # include <features.h> + # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2) \ +- && !defined(__ia64__) ++ && !defined(__ia64__) && !defined(__UCLIBC__) + # ifndef GC_HAVE_BUILTIN_BACKTRACE + # define GC_HAVE_BUILTIN_BACKTRACE + # endif diff --git a/patches/gcc/4.0.3/302-c99-snprintf.patch b/patches/gcc/4.0.3/302-c99-snprintf.patch new file mode 100644 index 00000000..dfb22d68 --- /dev/null +++ b/patches/gcc/4.0.3/302-c99-snprintf.patch @@ -0,0 +1,11 @@ +--- gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h-orig 2005-04-29 00:08:41.000000000 -0500 ++++ gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h 2005-04-29 00:08:45.000000000 -0500 +@@ -142,7 +142,7 @@ + using ::vsprintf; + } + +-#if _GLIBCXX_USE_C99 ++#if _GLIBCXX_USE_C99 || defined(__UCLIBC__) + + #undef snprintf + #undef vfscanf diff --git a/patches/gcc/4.0.3/303-c99-complex-ugly-hack.patch b/patches/gcc/4.0.3/303-c99-complex-ugly-hack.patch new file mode 100644 index 00000000..2ccc80d9 --- /dev/null +++ b/patches/gcc/4.0.3/303-c99-complex-ugly-hack.patch @@ -0,0 +1,12 @@ +--- gcc-4.0.0/libstdc++-v3/configure-old 2005-04-30 22:04:48.061603912 -0500 ++++ gcc-4.0.0/libstdc++-v3/configure 2005-04-30 22:06:13.678588152 -0500 +@@ -7194,6 +7194,9 @@ + cat >>conftest.$ac_ext <<_ACEOF + /* end confdefs.h. */ + #include <complex.h> ++#ifdef __UCLIBC__ ++#error ugly hack to make sure configure test fails here for cross until uClibc supports the complex funcs ++#endif + int + main () + { diff --git a/patches/gcc/4.0.3/304-index_macro.patch b/patches/gcc/4.0.3/304-index_macro.patch new file mode 100644 index 00000000..1fac112f --- /dev/null +++ b/patches/gcc/4.0.3/304-index_macro.patch @@ -0,0 +1,24 @@ +--- gcc-4.1.0/libstdc++-v3/include/ext/rope.mps 2006-03-24 01:49:51 +0100 ++++ gcc-4.1.0/libstdc++-v3/include/ext/rope 2006-03-24 01:49:37 +0100 +@@ -59,6 +59,9 @@ + #include <bits/allocator.h> + #include <ext/hash_fun.h> + ++/* cope w/ index defined as macro, SuSv3 proposal */ ++#undef index ++ + # ifdef __GC + # define __GC_CONST const + # else +--- gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h.mps 2006-03-24 01:50:04 +0100 ++++ gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h 2006-03-24 01:50:28 +0100 +@@ -53,6 +53,9 @@ + #include <ext/memory> // For uninitialized_copy_n + #include <ext/numeric> // For power + ++/* cope w/ index defined as macro, SuSv3 proposal */ ++#undef index ++ + namespace __gnu_cxx + { + using std::size_t; diff --git a/patches/gcc/4.0.3/602-sdk-libstdc++-includes.patch b/patches/gcc/4.0.3/602-sdk-libstdc++-includes.patch new file mode 100644 index 00000000..c7676ae6 --- /dev/null +++ b/patches/gcc/4.0.3/602-sdk-libstdc++-includes.patch @@ -0,0 +1,22 @@ +diff -urN gcc-4.0.0-100/libstdc++-v3/fragment.am gcc-4.0.0/libstdc++-v3/fragment.am +--- gcc-4.0.0-100/libstdc++-v3/fragment.am 2004-10-25 15:32:40.000000000 -0500 ++++ gcc-4.0.0/libstdc++-v3/fragment.am 2005-04-28 21:48:43.000000000 -0500 +@@ -18,5 +18,5 @@ + $(WARN_FLAGS) $(WERROR) -fdiagnostics-show-location=once + + # -I/-D flags to pass when compiling. +-AM_CPPFLAGS = $(GLIBCXX_INCLUDES) ++AM_CPPFLAGS = $(GLIBCXX_INCLUDES) -I$(toplevel_srcdir)/include + +diff -urN gcc-4.0.0-100/libstdc++-v3/libmath/Makefile.am gcc-4.0.0/libstdc++-v3/libmath/Makefile.am +--- gcc-4.0.0-100/libstdc++-v3/libmath/Makefile.am 2003-08-27 16:29:42.000000000 -0500 ++++ gcc-4.0.0/libstdc++-v3/libmath/Makefile.am 2005-04-28 21:48:43.000000000 -0500 +@@ -32,7 +32,7 @@ + + libmath_la_SOURCES = stubs.c + +-AM_CPPFLAGS = $(CANADIAN_INCLUDES) ++AM_CPPFLAGS = $(CANADIAN_INCLUDES) -I$(toplevel_srcdir)/include + + # Only compiling "C" sources in this directory. + LIBTOOL = @LIBTOOL@ --tag CC diff --git a/patches/gcc/4.0.3/800-arm-bigendian.patch b/patches/gcc/4.0.3/800-arm-bigendian.patch new file mode 100644 index 00000000..307aea3e --- /dev/null +++ b/patches/gcc/4.0.3/800-arm-bigendian.patch @@ -0,0 +1,67 @@ +By Lennert Buytenhek <buytenh@wantstofly.org> +Adds support for arm*b-linux* big-endian ARM targets + +See http://gcc.gnu.org/PR16350 + +--- gcc-4.0.3/gcc/config/arm/linux-elf.h ++++ gcc-4.0.3/gcc/config/arm/linux-elf.h +@@ -31,19 +31,33 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + #undef TARGET_DEFAULT_FLOAT_ABI + #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD + + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (0) ++#define TARGET_DEFAULT (TARGET_ENDIAN_DEFAULT) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mno-thumb-interwork" } + + /* The GNU C++ standard library requires that these macros be defined. */ + #undef CPLUSPLUS_CPP_SPEC +@@ -90,7 +104,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #define TARGET_OS_CPP_BUILTINS() \ +--- gcc-4.0.3/gcc/config.gcc ++++ gcc-4.0.3/gcc/config.gcc +@@ -672,6 +672,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="${tmake_file} arm/t-arm arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/patches/gcc/4.0.4/100-uclibc-conf.patch b/patches/gcc/4.0.4/100-uclibc-conf.patch new file mode 100644 index 00000000..3be7d097 --- /dev/null +++ b/patches/gcc/4.0.4/100-uclibc-conf.patch @@ -0,0 +1,553 @@ +--- gcc-4.0.2/gcc/config/t-linux-uclibc ++++ gcc-4.0.2/gcc/config/t-linux-uclibc +@@ -0,0 +1,5 @@ ++# Remove glibc specific files added in t-linux ++SHLIB_MAPFILES := $(filter-out $(srcdir)/config/libgcc-glibc.ver, $(SHLIB_MAPFILES)) ++ ++# Use unwind-dw2-fde instead of unwind-dw2-fde-glibc ++LIB2ADDEH := $(subst unwind-dw2-fde-glibc.c,unwind-dw2-fde.c,$(LIB2ADDEH)) +--- gcc-4.0.2/gcc/config.gcc ++++ gcc-4.0.2/gcc/config.gcc +@@ -1778,7 +1778,7 @@ + ;; + sh-*-elf* | sh[12346l]*-*-elf* | sh*-*-kaos* | \ + sh-*-symbianelf* | sh[12346l]*-*-symbianelf* | \ +- sh-*-linux* | sh[346lbe]*-*-linux* | \ ++ sh*-*-linux* | sh[346lbe]*-*-linux* | \ + sh-*-netbsdelf* | shl*-*-netbsdelf* | sh5-*-netbsd* | sh5l*-*-netbsd* | \ + sh64-*-netbsd* | sh64l*-*-netbsd*) + tmake_file="${tmake_file} sh/t-sh sh/t-elf" +@@ -2234,10 +2234,16 @@ + *) + echo "*** Configuration ${target} not supported" 1>&2 + exit 1 + ;; + esac ++ ++# Rather than hook into each target, just do it after all the linux ++# targets have been processed ++case ${target} in ++*-linux-uclibc*) tm_defines="${tm_defines} USE_UCLIBC" ; tmake_file="${tmake_file} t-linux-uclibc" ++esac + + case ${target} in + i[34567]86-*-linux*aout* | i[34567]86-*-linux*libc1) + tmake_file="${tmake_file} i386/t-gmm_malloc" + ;; +--- gcc-4.0.2/gcc/config/alpha/linux-elf.h ++++ gcc-4.0.2/gcc/config/alpha/linux-elf.h +@@ -27,7 +27,11 @@ + #define SUBTARGET_EXTRA_SPECS \ + { "elf_dynamic_linker", ELF_DYNAMIC_LINKER }, + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else + #define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + + #define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \ + %{O*:-O3} %{!O*:-O1} \ +--- gcc-4.0.2/gcc/config/arm/linux-elf.h ++++ gcc-4.0.2/gcc/config/arm/linux-elf.h +@@ -81,14 +81,19 @@ + #define ENDFILE_SPEC \ + "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s" + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "%{h*} %{version:-v} \ + %{b} %{Wl,*:%*} \ + %{static:-Bstatic} \ + %{shared:-shared} \ + %{symbolic:-Bsymbolic} \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "} \ + -X \ + %{mbig-endian:-EB}" \ + SUBTARGET_EXTRA_LINK_SPEC +--- gcc-4.0.2/gcc/config/cris/linux.h ++++ gcc-4.0.2/gcc/config/cris/linux.h +@@ -79,6 +79,25 @@ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -93,6 +112,8 @@ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +--- gcc-4.0.2/gcc/config/i386/linux.h ++++ gcc-4.0.2/gcc/config/i386/linux.h +@@ -107,6 +107,11 @@ + #define LINK_EMULATION "elf_i386" + #define DYNAMIC_LINKER "/lib/ld-linux.so.2" + ++#ifdef USE_UCLIBC ++#undef DYNAMIC_LINKER ++#define DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#endif ++ + #undef SUBTARGET_EXTRA_SPECS + #define SUBTARGET_EXTRA_SPECS \ + { "link_emulation", LINK_EMULATION },\ +--- gcc-4.0.2/gcc/config/i386/linux64.h ++++ gcc-4.0.2/gcc/config/i386/linux64.h +@@ -54,14 +54,21 @@ + When the -shared link option is used a final link is not being + done. */ + ++#ifdef USE_UCLIBC ++#define ELF32_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0" ++#else ++#define ELF32_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#define ELF64_DYNAMIC_LINKER "/lib64/ld-linux-x86-64.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "%{!m32:-m elf_x86_64} %{m32:-m elf_i386} \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{m32:%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ +- %{!m32:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} \ ++ %{m32:%{!dynamic-linker:-dynamic-linker " ELF32_DYNAMIC_LINKER "}} \ ++ %{!m32:%{!dynamic-linker:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}} \ + %{static:-static}}" + + #define MULTILIB_DEFAULTS { "m64" } +--- gcc-4.0.2/gcc/config/ia64/linux.h ++++ gcc-4.0.2/gcc/config/ia64/linux.h +@@ -37,13 +37,18 @@ + /* Define this for shared library support because it isn't in the main + linux.h file. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "\ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux-ia64.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}" + + +--- gcc-4.0.2/gcc/config/m68k/linux.h ++++ gcc-4.0.2/gcc/config/m68k/linux.h +@@ -127,12 +127,17 @@ + + /* If ELF is the default format, we should not use /lib/elf. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "-m m68kelf %{shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker*:-dynamic-linker /lib/ld.so.1}} \ ++ %{!dynamic-linker*:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static}}" + + /* For compatibility with linux/a.out */ +--- gcc-4.0.2/gcc/config/mips/linux.h ++++ gcc-4.0.2/gcc/config/mips/linux.h +@@ -108,14 +108,19 @@ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" ++#endif + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}}" + + #undef SUBTARGET_ASM_SPEC +--- gcc-4.0.2/gcc/config/pa/pa-linux.h ++++ gcc-4.0.2/gcc/config/pa/pa-linux.h +@@ -82,13 +82,18 @@ + /* Define this for shared library support because it isn't in the main + linux.h file. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "\ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}" + + /* glibc's profiling functions don't need gcc to allocate counters. */ +--- gcc-4.0.2/gcc/config/rs6000/linux.h ++++ gcc-4.0.2/gcc/config/rs6000/linux.h +@@ -69,7 +69,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #define LINK_GCC_C_SEQUENCE_SPEC \ + "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" +--- gcc-4.0.2/gcc/config/rs6000/sysv4.h ++++ gcc-4.0.2/gcc/config/rs6000/sysv4.h +@@ -949,6 +949,7 @@ + mcall-linux : %(link_os_linux) ; \ + mcall-gnu : %(link_os_gnu) ; \ + mcall-netbsd : %(link_os_netbsd) ; \ ++ mcall-linux-uclibc : %(link_os_linux_uclibc); \ + mcall-openbsd: %(link_os_openbsd) ; \ + : %(link_os_default) }" + +@@ -1127,6 +1128,10 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}" + ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + #if defined(HAVE_LD_EH_FRAME_HDR) + # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " + #endif +@@ -1293,6 +1298,7 @@ + { "link_os_sim", LINK_OS_SIM_SPEC }, \ + { "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \ + { "link_os_linux", LINK_OS_LINUX_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_gnu", LINK_OS_GNU_SPEC }, \ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \ +--- gcc-4.0.2/gcc/config/s390/linux.h ++++ gcc-4.0.2/gcc/config/s390/linux.h +@@ -77,6 +77,13 @@ + #define MULTILIB_DEFAULTS { "m31" } + #endif + ++#ifdef USE_UCLIBC ++#define ELF31_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0" ++#else ++#define ELF31_DYNAMIC_LINKER "/lib/ld.so.1" ++#define ELF64_DYNAMIC_LINKER "/lib/ld64.so.1" ++#endif + #undef LINK_SPEC + #define LINK_SPEC \ + "%{m31:-m elf_s390}%{m64:-m elf64_s390} \ +@@ -86,8 +93,8 @@ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker: \ +- %{m31:-dynamic-linker /lib/ld.so.1} \ +- %{m64:-dynamic-linker /lib/ld64.so.1}}}}" ++ %{m31:-dynamic-linker " ELF31_DYNAMIC_LINKER "} \ ++ %{m64:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}}}" + + + #define TARGET_ASM_FILE_END file_end_indicate_exec_stack +--- gcc-4.0.2/gcc/config/sh/linux.h ++++ gcc-4.0.2/gcc/config/sh/linux.h +@@ -67,11 +67,16 @@ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}" + + #undef LIB_SPEC +--- gcc-4.0.2/gcc/config/sparc/linux.h ++++ gcc-4.0.2/gcc/config/sparc/linux.h +@@ -130,14 +130,19 @@ + + /* If ELF is the default format, we should not use /lib/elf. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ + %{!mno-relax:%{!r:-relax}} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}}" + + /* The sun bundled assembler doesn't accept -Yd, (and neither does gas). +--- gcc-4.0.2/gcc/config/sparc/linux64.h ++++ gcc-4.0.2/gcc/config/sparc/linux64.h +@@ -167,12 +166,17 @@ + { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ + { "link_arch", LINK_ARCH_SPEC }, + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}} \ + " + +--- gcc-4.0.2/libtool.m4 ++++ gcc-4.0.2/libtool.m4 +@@ -682,6 +682,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +--- gcc-4.0.2/ltconfig ++++ gcc-4.0.2/ltconfig +@@ -603,6 +603,7 @@ + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1274,6 +1275,23 @@ + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +--- gcc-4.0.2/libffi/configure ++++ gcc-4.0.2/libffi/configure +@@ -3457,6 +3457,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.0.2/libgfortran/configure ++++ gcc-4.0.2/libgfortran/configure +@@ -3681,6 +3681,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.0.2/libjava/configure ++++ gcc-4.0.2/libjava/configure +@@ -4351,6 +4351,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.0.2/libmudflap/configure ++++ gcc-4.0.2/libmudflap/configure +@@ -5380,6 +5380,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.0.2/libobjc/configure ++++ gcc-4.0.2/libobjc/configure +@@ -3283,6 +3283,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.0.2/boehm-gc/configure ++++ gcc-4.0.2/boehm-gc/configure +@@ -4320,6 +4320,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.0.2/configure ++++ gcc-4.0.2/configure +@@ -1141,7 +1141,7 @@ + ;; + "") + case "${target}" in +- *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu) ++ *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*) + # Enable libmudflap by default in GNU and friends. + ;; + *-*-freebsd*) +--- gcc-4.0.2/configure.in ++++ gcc-4.0.2/configure.in +@@ -350,7 +350,7 @@ + ;; + "") + case "${target}" in +- *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu) ++ *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*) + # Enable libmudflap by default in GNU and friends. + ;; + *-*-freebsd*) +--- gcc-4.0.2/contrib/regression/objs-gcc.sh ++++ gcc-4.0.2/contrib/regression/objs-gcc.sh +@@ -105,6 +105,10 @@ + then + make all-gdb all-dejagnu all-ld || exit 1 + make install-gdb install-dejagnu install-ld || exit 1 ++elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ] ++ then ++ make all-gdb all-dejagnu all-ld || exit 1 ++ make install-gdb install-dejagnu install-ld || exit 1 + elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then + make bootstrap || exit 1 + make install || exit 1 +--- gcc-4.0.2/zlib/configure ++++ gcc-4.0.2/zlib/configure +@@ -3426,6 +3426,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/patches/gcc/4.0.4/200-uclibc-locale.patch b/patches/gcc/4.0.4/200-uclibc-locale.patch new file mode 100644 index 00000000..ac4cf972 --- /dev/null +++ b/patches/gcc/4.0.4/200-uclibc-locale.patch @@ -0,0 +1,3237 @@ +diff -urN gcc-4.0.0-100/libstdc++-v3/acinclude.m4 gcc-4.0.0/libstdc++-v3/acinclude.m4 +--- gcc-4.0.0-100/libstdc++-v3/acinclude.m4 2005-04-30 13:06:53.000000000 -0500 ++++ gcc-4.0.0/libstdc++-v3/acinclude.m4 2005-04-28 20:19:01.000000000 -0500 +@@ -1104,7 +1104,7 @@ + AC_MSG_CHECKING([for C locale to use]) + GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], + [use MODEL for target locale package], +- [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) ++ [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) + + # If they didn't use this option switch, or if they specified --enable + # with no specific model, we'll have to look for one. If they +@@ -1120,6 +1120,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case ${target_os} in ++ *-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include <features.h> +@@ -1263,6 +1266,40 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c++locale_internal.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,59 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek <jakub@redhat.com> ++ ++#include <clocale> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#endif // GLIBC 2.3 and later +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.cc 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,160 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <cerrno> // For errno ++#include <locale> ++#include <stdexcept> ++#include <langinfo.h> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#warning should dummy __newlocale check for C|POSIX ? ++#define __newlocale(a, b, c) NULL ++#define __freelocale(a) ((void)0) ++#define __duplocale(a) __c_locale() ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ if (!(__err & ios_base::failbit)) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale " ++ "name not valid")); ++ } ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++ if (_S_get_c_locale() != __cloc) ++ __freelocale(__cloc); ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++ { return __duplocale(__cloc); } ++} // namespace std ++ ++namespace __gnu_cxx ++{ ++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES", ++#if _GLIBCXX_NUM_CATEGORIES != 0 ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} ++ ++namespace std ++{ ++ const char* const* const locale::_S_categories = __gnu_cxx::category_names; ++} // namespace std +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.h +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/c_locale.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/c_locale.h 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,115 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include <cstring> // get std::strlen ++#include <cstdio> // get std::snprintf or std::sprintf ++#include <clocale> ++#include <langinfo.h> // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include <iconv.h> // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include <libintl.h> // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCXX_C_LOCALE_GNU for ++#endif ++#define _GLIBCXX_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCXX_NUM_CATEGORIES 6 ++#define _GLIBCXX_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template<typename _Tv> ++ int ++ __convert_from_v(char* __out, const int __size, const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = std::setlocale(LC_ALL, NULL); ++ char* __sav = new char[std::strlen(__old) + 1]; ++ std::strcpy(__sav, __old); ++ std::setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ std::setlocale(LC_ALL, __sav); ++ delete [] __sav; ++#endif ++ return __ret; ++ } ++} ++ ++#endif +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/codecvt_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,306 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // wcsnrtombs is *very* fast but stops if encounters NUL characters: ++ // in case we fall back to wcrtomb and then continue, in a loop. ++ // NB: wcsnrtombs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', ++ __from_end - __from_next); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ const size_t __conv = wcsnrtombs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // wcrtomb. ++ for (; __from < __from_next; ++__from) ++ __to_next += wcrtomb(__to_next, *__from, &__tmp_state); ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ extern_type __buf[MB_LEN_MAX]; ++ __tmp_state = __state; ++ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); ++ if (__conv > static_cast<size_t>(__to_end - __to_next)) ++ __ret = partial; ++ else ++ { ++ memcpy(__to_next, __buf, __conv); ++ __state = __tmp_state; ++ __to_next += __conv; ++ ++__from_next; ++ } ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we store a L'\0' and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0', ++ __from_end ++ - __from_next)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ size_t __conv = mbsnrtowcs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (;; ++__to_next, __from += __conv) ++ { ++ __conv = mbrtowc(__to_next, __from, __from_end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __from_next = __from; ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ // It is unclear what to return in this case (see DR 382). ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ if (__to_next < __to_end) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from_next; ++ *__to_next++ = L'\0'; ++ } ++ else ++ __ret = partial; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_encoding() const throw() ++ { ++ // XXX This implementation assumes that the encoding is ++ // stateless and is either single-byte or variable-width. ++ int __ret = 0; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ if (MB_CUR_MAX == 1) ++ __ret = 1; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_max_length() const throw() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ // XXX Probably wrong for stateful encodings. ++ int __ret = MB_CUR_MAX; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_length(state_type& __state, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { ++ int __ret = 0; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we advance past it and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ ++ // A dummy internal buffer is needed in order for mbsnrtocws to consider ++ // its fourth parameter (it wouldn't with NULL as first parameter). ++ wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0', ++ __end ++ - __from)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __end; ++ ++ const extern_type* __tmp_from = __from; ++ size_t __conv = mbsnrtowcs(__to, &__from, ++ __from_chunk_end - __from, ++ __max, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (__from = __tmp_from;; __from += __conv) ++ { ++ __conv = mbrtowc(NULL, __from, __end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __state = __tmp_state; ++ __ret += __from - __tmp_from; ++ break; ++ } ++ if (!__from) ++ __from = __from_chunk_end; ++ ++ __ret += __from - __tmp_from; ++ __max -= __conv; ++ ++ if (__from < __end && __max) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from; ++ ++__ret; ++ --__max; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++#endif ++} +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/collate_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/collate_members.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/collate_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/collate_members.cc 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate<char>::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<char>::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ int ++ collate<wchar_t>::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/ctype_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/ctype_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,300 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype<char> specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) ++ : ctype<char>(0, false, __refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_ctype); ++ this->_S_create_c_locale(this->_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; ++ this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; ++ this->_M_table = this->_M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ ctype<wchar_t>::__wmask_type ++ ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = __wmask_type(); ++ } ++ return __ret; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype<wchar_t>:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ bool __ret = false; ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur] ++ && __iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (; __lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ __m |= _M_bit[__bitcur]; ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype<wchar_t>:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<wchar_t>:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast<unsigned char>(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype<wchar_t>:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok) ++ return _M_narrow[__wc]; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ const int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ if (_M_narrow_ok) ++ while (__lo < __hi) ++ { ++ if (*__lo >= 0 && *__lo < 128) ++ *__dest = _M_narrow[*__lo]; ++ else ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype<wchar_t>::_M_initialize_ctype() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wint_t __i; ++ for (__i = 0; __i < 128; ++__i) ++ { ++ const int __c = wctob(__i); ++ if (__c == EOF) ++ break; ++ else ++ _M_narrow[__i] = static_cast<char>(__c); ++ } ++ if (__i == 128) ++ _M_narrow_ok = true; ++ else ++ _M_narrow_ok = false; ++ for (size_t __j = 0; ++ __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) ++ _M_widen[__j] = btowc(__j); ++ ++ for (size_t __k = 0; __k <= 11; ++__k) ++ { ++ _M_bit[__k] = static_cast<mask>(_ISbit(__k)); ++ _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++#endif // _GLIBCXX_USE_WCHAR_T ++} +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.cc 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages<char>::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ wstring ++ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++# elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.h +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/messages_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/messages_members.h 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,118 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template<typename _CharT> ++ messages<_CharT>::messages(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_clone_c_locale(__cloc)), ++ _M_name_messages(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_messages = __tmp; ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::~messages() ++ { ++ if (_M_name_messages != _S_get_c_name()) ++ delete [] _M_name_messages; ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string<char>& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template<typename _CharT> ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template<typename _CharT> ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++ if (this->_M_name_messages != locale::facet::_S_get_c_name()) ++ delete [] this->_M_name_messages; ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ this->_M_name_messages = __tmp; ++ ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_messages); ++ this->_S_create_c_locale(this->_M_c_locale_messages, __s); ++ } ++ } +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/monetary_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/monetary_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc 2005-04-28 01:23:02.000000000 -0500 +@@ -0,0 +1,692 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ __ret.field[0] = sign; ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[2] = space; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[1] = space; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ else ++ { ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ default: ++ __ret = pattern(); ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == true ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == false ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct<char, true>::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct<char, false>::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = ++ static_cast<wchar_t>(money_base::_S_atoms[__i]); ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = ++ static_cast<wchar_t>(money_base::_S_atoms[__i]); ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct<wchar_t, true>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++ ++ template<> ++ moneypunct<wchar_t, false>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++#endif ++} +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/numeric_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/numeric_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc 2005-04-28 01:20:20.000000000 -0500 +@@ -0,0 +1,173 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, ++ __cloc)); ++ ++ // Check for NULL, which implies no grouping. ++ if (_M_data->_M_thousands_sep == '\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = "true"; ++ _M_data->_M_truename_size = 4; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = "false"; ++ _M_data->_M_falsename_size = 5; ++ } ++ ++ template<> ++ numpunct<char>::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<wchar_t>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = ++ static_cast<wchar_t>(__num_base::_S_atoms_out[__i]); ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = ++ static_cast<wchar_t>(__num_base::_S_atoms_in[__j]); ++ } ++ else ++ { ++ // Named locale. ++ // NB: In the GNU model wchar_t is always 32 bit wide. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# else ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ ++ if (_M_data->_M_thousands_sep == L'\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = L"true"; ++ _M_data->_M_truename_size = 4; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = L"false"; ++ _M_data->_M_falsename_size = 5; ++ } ++ ++ template<> ++ numpunct<wchar_t>::~numpunct() ++ { delete _M_data; } ++ #endif ++} +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.cc gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.cc +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.cc 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.cc 2005-04-28 01:13:15.000000000 -0500 +@@ -0,0 +1,406 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct<char>:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const size_t __len = __strftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = '\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = "%m/%d/%y"; ++ _M_data->_M_date_era_format = "%m/%d/%y"; ++ _M_data->_M_time_format = "%H:%M:%S"; ++ _M_data->_M_time_era_format = "%H:%M:%S"; ++ _M_data->_M_date_time_format = ""; ++ _M_data->_M_date_time_era_format = ""; ++ _M_data->_M_am = "AM"; ++ _M_data->_M_pm = "PM"; ++ _M_data->_M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = "Sunday"; ++ _M_data->_M_day2 = "Monday"; ++ _M_data->_M_day3 = "Tuesday"; ++ _M_data->_M_day4 = "Wednesday"; ++ _M_data->_M_day5 = "Thursday"; ++ _M_data->_M_day6 = "Friday"; ++ _M_data->_M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = "Sun"; ++ _M_data->_M_aday2 = "Mon"; ++ _M_data->_M_aday3 = "Tue"; ++ _M_data->_M_aday4 = "Wed"; ++ _M_data->_M_aday5 = "Thu"; ++ _M_data->_M_aday6 = "Fri"; ++ _M_data->_M_aday7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = "January"; ++ _M_data->_M_month02 = "February"; ++ _M_data->_M_month03 = "March"; ++ _M_data->_M_month04 = "April"; ++ _M_data->_M_month05 = "May"; ++ _M_data->_M_month06 = "June"; ++ _M_data->_M_month07 = "July"; ++ _M_data->_M_month08 = "August"; ++ _M_data->_M_month09 = "September"; ++ _M_data->_M_month10 = "October"; ++ _M_data->_M_month11 = "November"; ++ _M_data->_M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = "Jan"; ++ _M_data->_M_amonth02 = "Feb"; ++ _M_data->_M_amonth03 = "Mar"; ++ _M_data->_M_amonth04 = "Apr"; ++ _M_data->_M_amonth05 = "May"; ++ _M_data->_M_amonth06 = "Jun"; ++ _M_data->_M_amonth07 = "Jul"; ++ _M_data->_M_amonth08 = "Aug"; ++ _M_data->_M_amonth09 = "Sep"; ++ _M_data->_M_amonth10 = "Oct"; ++ _M_data->_M_amonth11 = "Nov"; ++ _M_data->_M_amonth12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, ++ __cloc); ++ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ __timepunct<wchar_t>:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++ const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = L'\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<wchar_t>; ++ ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = L"%m/%d/%y"; ++ _M_data->_M_date_era_format = L"%m/%d/%y"; ++ _M_data->_M_time_format = L"%H:%M:%S"; ++ _M_data->_M_time_era_format = L"%H:%M:%S"; ++ _M_data->_M_date_time_format = L""; ++ _M_data->_M_date_time_era_format = L""; ++ _M_data->_M_am = L"AM"; ++ _M_data->_M_pm = L"PM"; ++ _M_data->_M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = L"Sunday"; ++ _M_data->_M_day2 = L"Monday"; ++ _M_data->_M_day3 = L"Tuesday"; ++ _M_data->_M_day4 = L"Wednesday"; ++ _M_data->_M_day5 = L"Thursday"; ++ _M_data->_M_day6 = L"Friday"; ++ _M_data->_M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = L"Sun"; ++ _M_data->_M_aday2 = L"Mon"; ++ _M_data->_M_aday3 = L"Tue"; ++ _M_data->_M_aday4 = L"Wed"; ++ _M_data->_M_aday5 = L"Thu"; ++ _M_data->_M_aday6 = L"Fri"; ++ _M_data->_M_aday7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = L"January"; ++ _M_data->_M_month02 = L"February"; ++ _M_data->_M_month03 = L"March"; ++ _M_data->_M_month04 = L"April"; ++ _M_data->_M_month05 = L"May"; ++ _M_data->_M_month06 = L"June"; ++ _M_data->_M_month07 = L"July"; ++ _M_data->_M_month08 = L"August"; ++ _M_data->_M_month09 = L"September"; ++ _M_data->_M_month10 = L"October"; ++ _M_data->_M_month11 = L"November"; ++ _M_data->_M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = L"Jan"; ++ _M_data->_M_amonth02 = L"Feb"; ++ _M_data->_M_amonth03 = L"Mar"; ++ _M_data->_M_amonth04 = L"Apr"; ++ _M_data->_M_amonth05 = L"May"; ++ _M_data->_M_amonth06 = L"Jun"; ++ _M_data->_M_amonth07 = L"Jul"; ++ _M_data->_M_amonth08 = L"Aug"; ++ _M_data->_M_amonth09 = L"Sep"; ++ _M_data->_M_amonth10 = L"Oct"; ++ _M_data->_M_amonth11 = L"Nov"; ++ _M_data->_M_amonth12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ union { char *__s; wchar_t *__w; } __u; ++ ++ __u.__s = __nl_langinfo_l(_NL_WD_FMT, __cloc); ++ _M_data->_M_date_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_D_FMT, __cloc); ++ _M_data->_M_date_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WT_FMT, __cloc); ++ _M_data->_M_time_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_T_FMT, __cloc); ++ _M_data->_M_time_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WD_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WAM_STR, __cloc); ++ _M_data->_M_am = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WPM_STR, __cloc); ++ _M_data->_M_pm = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc); ++ _M_data->_M_am_pm_format = __u.__w; ++ ++ // Day names, starting with "C"'s Sunday. ++ __u.__s = __nl_langinfo_l(_NL_WDAY_1, __cloc); ++ _M_data->_M_day1 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_2, __cloc); ++ _M_data->_M_day2 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_3, __cloc); ++ _M_data->_M_day3 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_4, __cloc); ++ _M_data->_M_day4 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_5, __cloc); ++ _M_data->_M_day5 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_6, __cloc); ++ _M_data->_M_day6 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_7, __cloc); ++ _M_data->_M_day7 = __u.__w; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_1, __cloc); ++ _M_data->_M_aday1 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_2, __cloc); ++ _M_data->_M_aday2 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_3, __cloc); ++ _M_data->_M_aday3 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_4, __cloc); ++ _M_data->_M_aday4 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_5, __cloc); ++ _M_data->_M_aday5 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_6, __cloc); ++ _M_data->_M_aday6 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_7, __cloc); ++ _M_data->_M_aday7 = __u.__w; ++ ++ // Month names, starting with "C"'s January. ++ __u.__s = __nl_langinfo_l(_NL_WMON_1, __cloc); ++ _M_data->_M_month01 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_2, __cloc); ++ _M_data->_M_month02 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_3, __cloc); ++ _M_data->_M_month03 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_4, __cloc); ++ _M_data->_M_month04 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_5, __cloc); ++ _M_data->_M_month05 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_6, __cloc); ++ _M_data->_M_month06 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_7, __cloc); ++ _M_data->_M_month07 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_8, __cloc); ++ _M_data->_M_month08 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_9, __cloc); ++ _M_data->_M_month09 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_10, __cloc); ++ _M_data->_M_month10 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_11, __cloc); ++ _M_data->_M_month11 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_12, __cloc); ++ _M_data->_M_month12 = __u.__w; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ __u.__s = __nl_langinfo_l(_NL_WABMON_1, __cloc); ++ _M_data->_M_amonth01 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_2, __cloc); ++ _M_data->_M_amonth02 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_3, __cloc); ++ _M_data->_M_amonth03 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_4, __cloc); ++ _M_data->_M_amonth04 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_5, __cloc); ++ _M_data->_M_amonth05 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_6, __cloc); ++ _M_data->_M_amonth06 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_7, __cloc); ++ _M_data->_M_amonth07 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_8, __cloc); ++ _M_data->_M_amonth08 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_9, __cloc); ++ _M_data->_M_amonth09 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_10, __cloc); ++ _M_data->_M_amonth10 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_11, __cloc); ++ _M_data->_M_amonth11 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_12, __cloc); ++ _M_data->_M_amonth12 = __u.__w; ++ } ++#endif // 0 ++ } ++#endif ++} +diff -urN gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.h gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.h +--- gcc-4.0.0-100/libstdc++-v3/config/locale/uclibc/time_members.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/locale/uclibc/time_members.h 2004-05-22 18:46:31.000000000 -0500 +@@ -0,0 +1,68 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) ++ : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(__s) ++ { ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ _M_name_timepunct = __tmp; ++ _M_initialize_timepunct(__cloc); ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::~__timepunct() ++ { ++ if (_M_name_timepunct != _S_get_c_name()) ++ delete [] _M_name_timepunct; ++ delete _M_data; ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_base.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_base.h +--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_base.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_base.h 2005-04-28 01:10:27.000000000 -0500 +@@ -0,0 +1,64 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++/** @file ctype_base.h ++ * This is an internal header file, included by other library headers. ++ * You should not attempt to use it directly. ++ */ ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ /// @brief Base class for ctype. ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ ++ // NB: Offsets into ctype<char>::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISalpha | _ISdigit | _ISpunct; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalpha | _ISdigit; ++ }; +diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_inline.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_inline.h +--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_inline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_inline.h 2002-06-24 00:49:19.000000000 -0500 +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype<char>:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast<unsigned char>(__c)] & __m; } ++ ++ const char* ++ ctype<char>:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_noninline.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h +--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/ctype_noninline.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h 2005-04-28 01:10:27.000000000 -0500 +@@ -0,0 +1,92 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype<char>::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype<char>::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ char ++ ctype<char>::do_toupper(char __c) const ++ { return _M_toupper[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype<char>::do_tolower(char __c) const ++ { return _M_tolower[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +diff -urN gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/os_defines.h gcc-4.0.0/libstdc++-v3/config/os/uclibc/os_defines.h +--- gcc-4.0.0-100/libstdc++-v3/config/os/uclibc/os_defines.h 1969-12-31 18:00:00.000000000 -0600 ++++ gcc-4.0.0/libstdc++-v3/config/os/uclibc/os_defines.h 2005-04-28 01:10:27.000000000 -0500 +@@ -0,0 +1,44 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCXX_OS_DEFINES ++#define _GLIBCXX_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include <features.h> ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif +diff -urN gcc-4.0.0-100/libstdc++-v3/configure gcc-4.0.0/libstdc++-v3/configure +--- gcc-4.0.0-100/libstdc++-v3/configure 2005-04-30 13:06:53.683055232 -0500 ++++ gcc-4.0.0/libstdc++-v3/configure 2005-04-30 12:24:24.000000000 -0500 +@@ -3998,6 +3998,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5672,7 +5677,7 @@ + enableval="$enable_clocale" + + case "$enableval" in +- generic|gnu|ieee_1003.1-2001|yes|no|auto) ;; ++ generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto) ;; + *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable clocale" >&5 + echo "$as_me: error: Unknown argument to enable/disable clocale" >&2;} + { (exit 1); exit 1; }; } ;; +@@ -5697,6 +5702,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case ${target_os} in ++ linux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) + cat >conftest.$ac_ext <<_ACEOF + /* confdefs.h. */ +@@ -5927,6 +5935,76 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ echo "$as_me:$LINENO: result: uclibc" >&5 ++echo "${ECHO_T}uclibc" >&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; 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_check_msgfmt+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_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_check_msgfmt="yes" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt=$ac_cv_prog_check_msgfmt ++if test -n "$check_msgfmt"; then ++ echo "$as_me:$LINENO: result: $check_msgfmt" >&5 ++echo "${ECHO_T}$check_msgfmt" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +diff -urN gcc-4.0.0-100/libstdc++-v3/configure.host gcc-4.0.0/libstdc++-v3/configure.host +--- gcc-4.0.0-100/libstdc++-v3/configure.host 2005-04-30 13:06:53.688054472 -0500 ++++ gcc-4.0.0/libstdc++-v3/configure.host 2005-04-28 20:20:32.000000000 -0500 +@@ -249,6 +249,12 @@ + ;; + esac + ++# Override for uClibc since linux-uclibc gets mishandled above. ++case "${host_os}" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; ++esac + + # Set any OS-dependent and CPU-dependent bits. + # THIS TABLE IS SORTED. KEEP IT THAT WAY. +diff -urN gcc-4.0.0-100/libstdc++-v3/crossconfig.m4 gcc-4.0.0/libstdc++-v3/crossconfig.m4 +--- gcc-4.0.0-100/libstdc++-v3/crossconfig.m4 2005-04-30 13:06:53.689054320 -0500 ++++ gcc-4.0.0/libstdc++-v3/crossconfig.m4 2005-04-28 20:27:15.000000000 -0500 +@@ -142,6 +142,98 @@ + ;; + esac + ;; ++ *-uclibc*) ++# Temporary hack until we implement the float versions of the libm funcs ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCXX_CHECK_LINKER_FEATURES ++ GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCXX_CHECK_WCHAR_T_SUPPORT ++ ++ # For LFS. ++ AC_DEFINE(HAVE_INT64_T) ++ case "$target" in ++ *-uclinux*) ++ # Don't enable LFS with uClinux ++ ;; ++ *) ++ AC_DEFINE(_GLIBCXX_USE_LFS) ++ esac ++ ++ # For showmanyc_helper(). ++ AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h) ++ GLIBCXX_CHECK_POLL ++ GLIBCXX_CHECK_S_ISREG_OR_S_IFREG ++ ++ # For xsputn_2(). ++ AC_CHECK_HEADERS(sys/uio.h) ++ GLIBCXX_CHECK_WRITEV ++ ++# AC_DEFINE(HAVE_ACOSF) ++# AC_DEFINE(HAVE_ASINF) ++# AC_DEFINE(HAVE_ATANF) ++# AC_DEFINE(HAVE_ATAN2F) ++ AC_DEFINE(HAVE_CEILF) ++ AC_DEFINE(HAVE_COPYSIGN) ++# AC_DEFINE(HAVE_COPYSIGNF) ++# AC_DEFINE(HAVE_COSF) ++# AC_DEFINE(HAVE_COSHF) ++# AC_DEFINE(HAVE_EXPF) ++# AC_DEFINE(HAVE_FABSF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ AC_DEFINE(HAVE_FLOORF) ++# AC_DEFINE(HAVE_FMODF) ++# AC_DEFINE(HAVE_FREXPF) ++ AC_DEFINE(HAVE_HYPOT) ++# AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++# AC_DEFINE(HAVE_LOGF) ++# AC_DEFINE(HAVE_LOG10F) ++# AC_DEFINE(HAVE_MODFF) ++# AC_DEFINE(HAVE_SINF) ++# AC_DEFINE(HAVE_SINHF) ++# AC_DEFINE(HAVE_SINCOS) ++# AC_DEFINE(HAVE_SINCOSF) ++ AC_DEFINE(HAVE_SQRTF) ++# AC_DEFINE(HAVE_TANF) ++# AC_DEFINE(HAVE_TANHF) ++ if test x"long_double_math_on_this_cpu" = x"yes"; then ++# AC_DEFINE(HAVE_ACOSL) ++# AC_DEFINE(HAVE_ASINL) ++# AC_DEFINE(HAVE_ATANL) ++# AC_DEFINE(HAVE_ATAN2L) ++# AC_DEFINE(HAVE_CEILL) ++# AC_DEFINE(HAVE_COPYSIGNL) ++# AC_DEFINE(HAVE_COSL) ++# AC_DEFINE(HAVE_COSHL) ++# AC_DEFINE(HAVE_EXPL) ++# AC_DEFINE(HAVE_FABSL) ++# AC_DEFINE(HAVE_FINITEL) ++# AC_DEFINE(HAVE_FLOORL) ++# AC_DEFINE(HAVE_FMODL) ++# AC_DEFINE(HAVE_FREXPL) ++# AC_DEFINE(HAVE_HYPOTL) ++# AC_DEFINE(HAVE_ISINFL) ++# AC_DEFINE(HAVE_ISNANL) ++# AC_DEFINE(HAVE_LOGL) ++# AC_DEFINE(HAVE_LOG10L) ++# AC_DEFINE(HAVE_MODFL) ++# AC_DEFINE(HAVE_POWL) ++# AC_DEFINE(HAVE_SINL) ++# AC_DEFINE(HAVE_SINHL) ++# AC_DEFINE(HAVE_SINCOSL) ++# AC_DEFINE(HAVE_SQRTL) ++# AC_DEFINE(HAVE_TANL) ++# AC_DEFINE(HAVE_TANHL) ++ fi ++ ;; + *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu) + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ + machine/endian.h machine/param.h sys/machine.h sys/types.h \ +@@ -156,7 +248,7 @@ + AC_DEFINE(HAVE_INT64_T) + case "$target" in + *-uclinux*) +- # Don't enable LFS with uClibc ++ # Don't enable LFS with uClinux + ;; + *) + AC_DEFINE(_GLIBCXX_USE_LFS) +diff -urN gcc-4.0.0-100/libstdc++-v3/include/c_compatibility/wchar.h gcc-4.0.0/libstdc++-v3/include/c_compatibility/wchar.h +--- gcc-4.0.0-100/libstdc++-v3/include/c_compatibility/wchar.h 2005-04-30 13:06:53.690054168 -0500 ++++ gcc-4.0.0/libstdc++-v3/include/c_compatibility/wchar.h 2005-04-28 20:15:56.000000000 -0500 +@@ -101,7 +101,9 @@ + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; ++#if _GLIBCXX_HAVE_WCSFTIME + using std::wcsftime; ++#endif + + #if _GLIBCXX_USE_C99 + using std::wcstold; +diff -urN gcc-4.0.0-100/libstdc++-v3/include/c_std/std_cwchar.h gcc-4.0.0/libstdc++-v3/include/c_std/std_cwchar.h +--- gcc-4.0.0-100/libstdc++-v3/include/c_std/std_cwchar.h 2005-04-30 13:06:53.691054016 -0500 ++++ gcc-4.0.0/libstdc++-v3/include/c_std/std_cwchar.h 2005-04-28 20:15:56.000000000 -0500 +@@ -179,7 +179,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#if _GLIBCXX_HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; diff --git a/patches/gcc/4.0.4/300-libstdc++-pic.patch b/patches/gcc/4.0.4/300-libstdc++-pic.patch new file mode 100644 index 00000000..a9d6e718 --- /dev/null +++ b/patches/gcc/4.0.4/300-libstdc++-pic.patch @@ -0,0 +1,45 @@ +--- gcc-4.0.0/libstdc++-v3/src/Makefile.am ++++ gcc-4.0.0/libstdc++-v3/src/Makefile.am +@@ -214,6 +214,10 @@ + $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LDFLAGS) -o $@ + + ++install-exec-local: ++ $(AR) cru libstdc++_pic.a *.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Added bits to build debug library. + if GLIBCXX_BUILD_DEBUG + all-local: build_debug +--- gcc-4.0.0/libstdc++-v3/src/Makefile.in ++++ gcc-4.0.0/libstdc++-v3/src/Makefile.in +@@ -625,7 +625,7 @@ + + install-data-am: install-data-local + +-install-exec-am: install-toolexeclibLTLIBRARIES ++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local + + install-info: install-info-am + +@@ -664,7 +664,7 @@ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ +- uninstall-toolexeclibLTLIBRARIES ++ uninstall-toolexeclibLTLIBRARIES install-exec-local + + @GLIBCXX_BUILD_VERSIONED_SHLIB_TRUE@libstdc++-symbol.ver: ${glibcxx_srcdir}/$(SYMVER_MAP) + @GLIBCXX_BUILD_VERSIONED_SHLIB_TRUE@ cp ${glibcxx_srcdir}/$(SYMVER_MAP) ./libstdc++-symbol.ver +@@ -743,6 +743,11 @@ + install_debug: + (cd ${debugdir} && $(MAKE) \ + toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install) ++ ++install-exec-local: ++ $(AR) cru libstdc++_pic.a *.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: diff --git a/patches/gcc/4.0.4/301-missing-execinfo_h.patch b/patches/gcc/4.0.4/301-missing-execinfo_h.patch new file mode 100644 index 00000000..0e2092f3 --- /dev/null +++ b/patches/gcc/4.0.4/301-missing-execinfo_h.patch @@ -0,0 +1,11 @@ +--- gcc-4.0.0/boehm-gc/include/gc.h-orig 2005-04-28 22:28:57.000000000 -0500 ++++ gcc-4.0.0/boehm-gc/include/gc.h 2005-04-28 22:30:38.000000000 -0500 +@@ -500,7 +500,7 @@ + #ifdef __linux__ + # include <features.h> + # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2) \ +- && !defined(__ia64__) ++ && !defined(__ia64__) && !defined(__UCLIBC__) + # ifndef GC_HAVE_BUILTIN_BACKTRACE + # define GC_HAVE_BUILTIN_BACKTRACE + # endif diff --git a/patches/gcc/4.0.4/302-c99-snprintf.patch b/patches/gcc/4.0.4/302-c99-snprintf.patch new file mode 100644 index 00000000..dfb22d68 --- /dev/null +++ b/patches/gcc/4.0.4/302-c99-snprintf.patch @@ -0,0 +1,11 @@ +--- gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h-orig 2005-04-29 00:08:41.000000000 -0500 ++++ gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h 2005-04-29 00:08:45.000000000 -0500 +@@ -142,7 +142,7 @@ + using ::vsprintf; + } + +-#if _GLIBCXX_USE_C99 ++#if _GLIBCXX_USE_C99 || defined(__UCLIBC__) + + #undef snprintf + #undef vfscanf diff --git a/patches/gcc/4.0.4/303-c99-complex-ugly-hack.patch b/patches/gcc/4.0.4/303-c99-complex-ugly-hack.patch new file mode 100644 index 00000000..2ccc80d9 --- /dev/null +++ b/patches/gcc/4.0.4/303-c99-complex-ugly-hack.patch @@ -0,0 +1,12 @@ +--- gcc-4.0.0/libstdc++-v3/configure-old 2005-04-30 22:04:48.061603912 -0500 ++++ gcc-4.0.0/libstdc++-v3/configure 2005-04-30 22:06:13.678588152 -0500 +@@ -7194,6 +7194,9 @@ + cat >>conftest.$ac_ext <<_ACEOF + /* end confdefs.h. */ + #include <complex.h> ++#ifdef __UCLIBC__ ++#error ugly hack to make sure configure test fails here for cross until uClibc supports the complex funcs ++#endif + int + main () + { diff --git a/patches/gcc/4.0.4/304-index_macro.patch b/patches/gcc/4.0.4/304-index_macro.patch new file mode 100644 index 00000000..1fac112f --- /dev/null +++ b/patches/gcc/4.0.4/304-index_macro.patch @@ -0,0 +1,24 @@ +--- gcc-4.1.0/libstdc++-v3/include/ext/rope.mps 2006-03-24 01:49:51 +0100 ++++ gcc-4.1.0/libstdc++-v3/include/ext/rope 2006-03-24 01:49:37 +0100 +@@ -59,6 +59,9 @@ + #include <bits/allocator.h> + #include <ext/hash_fun.h> + ++/* cope w/ index defined as macro, SuSv3 proposal */ ++#undef index ++ + # ifdef __GC + # define __GC_CONST const + # else +--- gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h.mps 2006-03-24 01:50:04 +0100 ++++ gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h 2006-03-24 01:50:28 +0100 +@@ -53,6 +53,9 @@ + #include <ext/memory> // For uninitialized_copy_n + #include <ext/numeric> // For power + ++/* cope w/ index defined as macro, SuSv3 proposal */ ++#undef index ++ + namespace __gnu_cxx + { + using std::size_t; diff --git a/patches/gcc/4.0.4/602-sdk-libstdc++-includes.patch b/patches/gcc/4.0.4/602-sdk-libstdc++-includes.patch new file mode 100644 index 00000000..c7676ae6 --- /dev/null +++ b/patches/gcc/4.0.4/602-sdk-libstdc++-includes.patch @@ -0,0 +1,22 @@ +diff -urN gcc-4.0.0-100/libstdc++-v3/fragment.am gcc-4.0.0/libstdc++-v3/fragment.am +--- gcc-4.0.0-100/libstdc++-v3/fragment.am 2004-10-25 15:32:40.000000000 -0500 ++++ gcc-4.0.0/libstdc++-v3/fragment.am 2005-04-28 21:48:43.000000000 -0500 +@@ -18,5 +18,5 @@ + $(WARN_FLAGS) $(WERROR) -fdiagnostics-show-location=once + + # -I/-D flags to pass when compiling. +-AM_CPPFLAGS = $(GLIBCXX_INCLUDES) ++AM_CPPFLAGS = $(GLIBCXX_INCLUDES) -I$(toplevel_srcdir)/include + +diff -urN gcc-4.0.0-100/libstdc++-v3/libmath/Makefile.am gcc-4.0.0/libstdc++-v3/libmath/Makefile.am +--- gcc-4.0.0-100/libstdc++-v3/libmath/Makefile.am 2003-08-27 16:29:42.000000000 -0500 ++++ gcc-4.0.0/libstdc++-v3/libmath/Makefile.am 2005-04-28 21:48:43.000000000 -0500 +@@ -32,7 +32,7 @@ + + libmath_la_SOURCES = stubs.c + +-AM_CPPFLAGS = $(CANADIAN_INCLUDES) ++AM_CPPFLAGS = $(CANADIAN_INCLUDES) -I$(toplevel_srcdir)/include + + # Only compiling "C" sources in this directory. + LIBTOOL = @LIBTOOL@ --tag CC diff --git a/patches/gcc/4.0.4/800-arm-bigendian.patch b/patches/gcc/4.0.4/800-arm-bigendian.patch new file mode 100644 index 00000000..fd2c9bfc --- /dev/null +++ b/patches/gcc/4.0.4/800-arm-bigendian.patch @@ -0,0 +1,65 @@ +diff -dur gcc-4.0.4.orig/gcc/config/arm/linux-elf.h gcc-4.0.4/gcc/config/arm/linux-elf.h +--- gcc-4.0.4.orig/gcc/config/arm/linux-elf.h 2007-02-02 19:24:50.000000000 +0100 ++++ gcc-4.0.4/gcc/config/arm/linux-elf.h 2007-02-02 19:26:12.000000000 +0100 +@@ -31,19 +31,33 @@ + /* Do not assume anything about header files. */ + #define NO_IMPLICIT_EXTERN_C + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT ARM_FLAG_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + #undef TARGET_DEFAULT_FLOAT_ABI + #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD + + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (0) ++#define TARGET_DEFAULT (TARGET_ENDIAN_DEFAULT) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mno-thumb-interwork" } + + /* The GNU C++ standard library requires that these macros be defined. */ + #undef CPLUSPLUS_CPP_SPEC +@@ -95,7 +109,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #define TARGET_OS_CPP_BUILTINS() \ +Only in gcc-4.0.4/gcc/config/arm: linux-elf.h.orig +diff -dur gcc-4.0.4.orig/gcc/config.gcc gcc-4.0.4/gcc/config.gcc +--- gcc-4.0.4.orig/gcc/config.gcc 2007-02-02 19:24:50.000000000 +0100 ++++ gcc-4.0.4/gcc/config.gcc 2007-02-02 19:26:12.000000000 +0100 +@@ -672,6 +672,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h arm/aout.h arm/arm.h" ++ case $target in ++ arm*b-*) ++ tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" ++ ;; ++ esac + tmake_file="${tmake_file} arm/t-arm arm/t-linux" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes diff --git a/patches/gcc/4.0.4/801-arm-softfloat.patch b/patches/gcc/4.0.4/801-arm-softfloat.patch new file mode 100644 index 00000000..9ae921e3 --- /dev/null +++ b/patches/gcc/4.0.4/801-arm-softfloat.patch @@ -0,0 +1,14 @@ +Enable building a pure soft-float compiler without the need for libfloat. + +diff -dur gcc-4.0.4.orig/gcc/config.gcc gcc-4.0.4/gcc/config.gcc +--- gcc-4.0.4.orig/gcc/config.gcc 2007-02-02 19:12:28.000000000 +0100 ++++ gcc-4.0.4/gcc/config.gcc 2007-02-02 19:12:07.000000000 +0100 +@@ -677,7 +677,7 @@ + tm_defines="TARGET_BIG_ENDIAN_DEFAULT=1 $tm_defines" + ;; + esac +- tmake_file="${tmake_file} arm/t-arm arm/t-linux" ++ tmake_file="${tmake_file} arm/t-arm arm/t-linux arm/t-arm-elf" + extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o" + gnu_ld=yes + ;; diff --git a/patches/gcc/4.1.0/gcc-4.1-fix-fixincl.patch b/patches/gcc/4.1.0/gcc-4.1-fix-fixincl.patch new file mode 100644 index 00000000..39287056 --- /dev/null +++ b/patches/gcc/4.1.0/gcc-4.1-fix-fixincl.patch @@ -0,0 +1,71 @@ +See http://gcc.gnu.org/PR22541 + +From: Dan Kegel + +When building gcc-3.4.3 or gcc-4.x into a clean $PREFIX, +the configure script happily copies the glibc include files from include to sys-include; +here's the line from the log file (with $PREFIX instead of the real prefix): + +Copying $PREFIX/i686-unknown-linux-gnu/include to $PREFIX/i686-unknown-linux-gnu/sys-include + +But later, when running fixincludes, it gives the error message + The directory that should contain system headers does not exist: + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/../../../../i686-unknown-linux-gnu/sys-include + +Nevertheless, it continues building; the header files it installs in + $PREFIX/lib/gcc/i686-unknown-linux-gnu/3.4.3/include +do not include the boilerplate that would cause it to #include_next the +glibc headers in the system header directory. +Thus the resulting toolchain can't compile the following program: +#include <limits.h> +int x = PATH_MAX; +because its limits.h doesn't include the glibc header. + +The problem is that gcc/Makefile.in assumes that +it can refer to $PREFIX/i686-unknown-linux-gnu with the path + $PREFIX/lib/../i686-unknown-linux-gnu, but +that fails because the directory $PREFIX/lib doesn't exist during 'make all'; +it is only created later, during 'make install'. (Which makes this problem +confusing, since one only notices the breakage well after 'make install', +at which point the path configure complained about does exist, and has the +right stuff in it.) + +A fix that I've been using for a while is to use sed to canonicalize +the path. The sed syntax is a bit obtuse, but it works. + +(hey, that's the first time I've ever used a label in a sed script; thanks to the sed faq +for explaining the :a ... ta method of looping to repeat a search-and-replace until it doesn't match.) + +[rediffed against gcc-4.1-20060210] + +--- gcc-4.1-20060210/gcc/Makefile.in.old 2006-01-11 06:29:29.000000000 -0800 ++++ gcc-4.1-20060210/gcc/Makefile.in 2006-02-14 16:08:54.000000000 -0800 +@@ -388,7 +388,10 @@ + CROSS_SYSTEM_HEADER_DIR = @CROSS_SYSTEM_HEADER_DIR@ + + # autoconf sets SYSTEM_HEADER_DIR to one of the above. +-SYSTEM_HEADER_DIR = @SYSTEM_HEADER_DIR@ ++# Purge it of unneccessary internal relative paths ++# to directories that might not exist yet. ++# The sed idiom for this is to repeat the search-and-replace until it doesn't match, using :a ... ta. ++SYSTEM_HEADER_DIR = `echo @SYSTEM_HEADER_DIR@ | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta` + + # Control whether to run fixproto and fixincludes. + STMP_FIXPROTO = @STMP_FIXPROTO@ +@@ -3167,13 +3170,15 @@ + ../$(build_subdir)/fixincludes/fixincl: ; @ : + + # Build fixed copies of system files. ++# Abort if no system headers available, unless building a crosscompiler. ++# Canonicalize $gcc_tooldir/sys-include in same way as $SYSTEM_HEADER_DIR was canonicalized so test still works + stmp-fixinc: gsyslimits.h macro_list \ + $(build_objdir)/fixincludes/fixincl \ + $(build_objdir)/fixincludes/fixinc.sh + @if ! $(inhibit_libc) && test ! -d ${SYSTEM_HEADER_DIR}; then \ + echo The directory that should contain system headers does not exist: >&2 ; \ + echo " ${SYSTEM_HEADER_DIR}" >&2 ; \ +- if test "x${SYSTEM_HEADER_DIR}" = "x${gcc_tooldir}/sys-include"; \ ++ if test "x${SYSTEM_HEADER_DIR}" = "x`echo "${gcc_tooldir}/sys-include" | sed -e :a -e "s,[^/]*/\.\.\/,," -e ta`"; \ + then sleep 1; else exit 1; fi; \ + fi + rm -rf include; mkdir include diff --git a/patches/gcc/4.1.1/100-uclibc-conf.patch b/patches/gcc/4.1.1/100-uclibc-conf.patch new file mode 100644 index 00000000..49d576c7 --- /dev/null +++ b/patches/gcc/4.1.1/100-uclibc-conf.patch @@ -0,0 +1,544 @@ +--- gcc-4.1.0/gcc/config/t-linux-uclibc ++++ gcc-4.1.0/gcc/config/t-linux-uclibc +@@ -0,0 +1,5 @@ ++# Remove glibc specific files added in t-linux ++SHLIB_MAPFILES := $(filter-out $(srcdir)/config/libgcc-glibc.ver, $(SHLIB_MAPFILES)) ++ ++# Use unwind-dw2-fde instead of unwind-dw2-fde-glibc ++LIB2ADDEH := $(subst unwind-dw2-fde-glibc.c,unwind-dw2-fde.c,$(LIB2ADDEH)) +--- gcc-4.1.0/gcc/config.gcc ++++ gcc-4.1.0/gcc/config.gcc +@@ -1887,7 +1887,7 @@ s390x-ibm-tpf*) + ;; + sh-*-elf* | sh[12346l]*-*-elf* | sh*-*-kaos* | \ + sh-*-symbianelf* | sh[12346l]*-*-symbianelf* | \ +- sh-*-linux* | sh[346lbe]*-*-linux* | \ ++ sh*-*-linux* | sh[346lbe]*-*-linux* | \ + sh-*-netbsdelf* | shl*-*-netbsdelf* | sh5-*-netbsd* | sh5l*-*-netbsd* | \ + sh64-*-netbsd* | sh64l*-*-netbsd*) + tmake_file="${tmake_file} sh/t-sh sh/t-elf" +@@ -2341,6 +2341,12 @@ m32c-*-elf*) + ;; + esac + ++# Rather than hook into each target, just do it after all the linux ++# targets have been processed ++case ${target} in ++*-linux-uclibc*) tm_defines="${tm_defines} USE_UCLIBC" ; tmake_file="${tmake_file} t-linux-uclibc" ++esac ++ + case ${target} in + i[34567]86-*-linux*aout* | i[34567]86-*-linux*libc1) + tmake_file="${tmake_file} i386/t-gmm_malloc" +--- gcc-4.1.0/boehm-gc/configure ++++ gcc-4.1.0/boehm-gc/configure +@@ -4320,6 +4320,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.1.0/configure ++++ gcc-4.1.0/configure +@@ -1133,7 +1133,7 @@ no) + ;; + "") + case "${target}" in +- *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu) ++ *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*) + # Enable libmudflap by default in GNU and friends. + ;; + *-*-freebsd*) +--- gcc-4.1.0/configure.in ++++ gcc-4.1.0/configure.in +@@ -341,7 +341,7 @@ no) + ;; + "") + case "${target}" in +- *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu) ++ *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*) + # Enable libmudflap by default in GNU and friends. + ;; + *-*-freebsd*) +--- gcc-4.1.0/contrib/regression/objs-gcc.sh ++++ gcc-4.1.0/contrib/regression/objs-gcc.sh +@@ -105,6 +105,10 @@ if [ $H_REAL_TARGET = $H_REAL_HOST -a $H + then + make all-gdb all-dejagnu all-ld || exit 1 + make install-gdb install-dejagnu install-ld || exit 1 ++elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ] ++ then ++ make all-gdb all-dejagnu all-ld || exit 1 ++ make install-gdb install-dejagnu install-ld || exit 1 + elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then + make bootstrap || exit 1 + make install || exit 1 +--- gcc-4.1.0/gcc/config/alpha/linux-elf.h ++++ gcc-4.1.0/gcc/config/alpha/linux-elf.h +@@ -27,7 +27,11 @@ Boston, MA 02110-1301, USA. */ + #define SUBTARGET_EXTRA_SPECS \ + { "elf_dynamic_linker", ELF_DYNAMIC_LINKER }, + ++#if defined USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else + #define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + + #define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \ + %{O*:-O3} %{!O*:-O1} \ +--- gcc-4.1.0/gcc/config/arm/linux-elf.h ++++ gcc-4.1.0/gcc/config/arm/linux-elf.h +@@ -51,7 +51,11 @@ + + #define LIBGCC_SPEC "%{msoft-float:-lfloat} %{mfloat-abi=soft*:-lfloat} -lgcc" + ++#ifdef USE_UCLIBC ++#define LINUX_TARGET_INTERPRETER "/lib/ld-uClibc.so.0" ++#else + #define LINUX_TARGET_INTERPRETER "/lib/ld-linux.so.2" ++#endif + + #define LINUX_TARGET_LINK_SPEC "%{h*} %{version:-v} \ + %{b} \ +--- gcc-4.1.0/gcc/config/cris/linux.h ++++ gcc-4.1.0/gcc/config/cris/linux.h +@@ -73,6 +73,25 @@ Boston, MA 02110-1301, USA. */ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -87,6 +106,8 @@ Boston, MA 02110-1301, USA. */ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +--- gcc-4.1.0/gcc/config/i386/linux.h ++++ gcc-4.1.0/gcc/config/i386/linux.h +@@ -107,6 +107,11 @@ Boston, MA 02110-1301, USA. */ + #define LINK_EMULATION "elf_i386" + #define DYNAMIC_LINKER "/lib/ld-linux.so.2" + ++#if defined USE_UCLIBC ++#undef DYNAMIC_LINKER ++#define DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#endif ++ + #undef SUBTARGET_EXTRA_SPECS + #define SUBTARGET_EXTRA_SPECS \ + { "link_emulation", LINK_EMULATION },\ +--- gcc-4.1.0/gcc/config/i386/linux64.h ++++ gcc-4.1.0/gcc/config/i386/linux64.h +@@ -54,14 +54,21 @@ Boston, MA 02110-1301, USA. */ + When the -shared link option is used a final link is not being + done. */ + ++#ifdef USE_UCLIBC ++#define ELF32_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0" ++#else ++#define ELF32_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#define ELF64_DYNAMIC_LINKER "/lib64/ld-linux-x86-64.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "%{!m32:-m elf_x86_64} %{m32:-m elf_i386} \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{m32:%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ +- %{!m32:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} \ ++ %{m32:%{!dynamic-linker:-dynamic-linker " ELF32_DYNAMIC_LINKER "}} \ ++ %{!m32:%{!dynamic-linker:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}} \ + %{static:-static}}" + + /* Similar to standard Linux, but adding -ffast-math support. */ +--- gcc-4.1.0/gcc/config/ia64/linux.h ++++ gcc-4.1.0/gcc/config/ia64/linux.h +@@ -37,13 +37,18 @@ do { \ + /* Define this for shared library support because it isn't in the main + linux.h file. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "\ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux-ia64.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}" + + +--- gcc-4.1.0/gcc/config/m68k/linux.h ++++ gcc-4.1.0/gcc/config/m68k/linux.h +@@ -123,12 +123,17 @@ Boston, MA 02110-1301, USA. */ + + /* If ELF is the default format, we should not use /lib/elf. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "-m m68kelf %{shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker*:-dynamic-linker /lib/ld.so.1}} \ ++ %{!dynamic-linker*:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static}}" + + /* For compatibility with linux/a.out */ +--- gcc-4.1.0/gcc/config/mips/linux.h ++++ gcc-4.1.0/gcc/config/mips/linux.h +@@ -105,6 +105,11 @@ Boston, MA 02110-1301, USA. */ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" ++#endif + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -112,7 +117,7 @@ Boston, MA 02110-1301, USA. */ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}}" + + #undef SUBTARGET_ASM_SPEC +--- gcc-4.1.0/gcc/config/pa/pa-linux.h ++++ gcc-4.1.0/gcc/config/pa/pa-linux.h +@@ -49,13 +49,18 @@ Boston, MA 02110-1301, USA. */ + /* Define this for shared library support because it isn't in the main + linux.h file. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "\ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}" + + /* glibc's profiling functions don't need gcc to allocate counters. */ +--- gcc-4.1.0/gcc/config/rs6000/linux.h ++++ gcc-4.1.0/gcc/config/rs6000/linux.h +@@ -72,7 +72,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #define LINK_GCC_C_SEQUENCE_SPEC \ + "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" +--- gcc-4.1.0/gcc/config/rs6000/sysv4.h ++++ gcc-4.1.0/gcc/config/rs6000/sysv4.h +@@ -866,6 +866,7 @@ extern int fixuplabelno; + mcall-linux : %(link_os_linux) ; \ + mcall-gnu : %(link_os_gnu) ; \ + mcall-netbsd : %(link_os_netbsd) ; \ ++ mcall-linux-uclibc : %(link_os_linux_uclibc); \ + mcall-openbsd: %(link_os_openbsd) ; \ + : %(link_os_default) }" + +@@ -1043,6 +1044,10 @@ extern int fixuplabelno; + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}" + ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + #if defined(HAVE_LD_EH_FRAME_HDR) + # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " + #endif +@@ -1209,6 +1214,7 @@ ncrtn.o%s" + { "link_os_sim", LINK_OS_SIM_SPEC }, \ + { "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \ + { "link_os_linux", LINK_OS_LINUX_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_gnu", LINK_OS_GNU_SPEC }, \ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \ +--- gcc-4.1.0/gcc/config/s390/linux.h ++++ gcc-4.1.0/gcc/config/s390/linux.h +@@ -77,6 +77,13 @@ Software Foundation, 51 Franklin Street, + #define MULTILIB_DEFAULTS { "m31" } + #endif + ++#ifdef USE_UCLIBC ++#define ELF31_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0" ++#else ++#define ELF31_DYNAMIC_LINKER "/lib/ld.so.1" ++#define ELF64_DYNAMIC_LINKER "/lib/ld64.so.1" ++#endif + #undef LINK_SPEC + #define LINK_SPEC \ + "%{m31:-m elf_s390}%{m64:-m elf64_s390} \ +@@ -86,8 +93,8 @@ Software Foundation, 51 Franklin Street, + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker: \ +- %{m31:-dynamic-linker /lib/ld.so.1} \ +- %{m64:-dynamic-linker /lib/ld64.so.1}}}}" ++ %{m31:-dynamic-linker " ELF31_DYNAMIC_LINKER "} \ ++ %{m64:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}}}" + + + #define TARGET_ASM_FILE_END file_end_indicate_exec_stack +--- gcc-4.1.0/gcc/config/sh/linux.h ++++ gcc-4.1.0/gcc/config/sh/linux.h +@@ -56,12 +56,21 @@ Boston, MA 02110-1301, USA. */ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + /* Output assembler code to STREAM to call the profiler. */ + +--- gcc-4.1.0/gcc/config/sparc/linux.h ++++ gcc-4.1.0/gcc/config/sparc/linux.h +@@ -125,6 +125,11 @@ Boston, MA 02110-1301, USA. */ + + /* If ELF is the default format, we should not use /lib/elf. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ + %{!mno-relax:%{!r:-relax}} \ +@@ -132,7 +137,7 @@ Boston, MA 02110-1301, USA. */ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}}" + + /* The sun bundled assembler doesn't accept -Yd, (and neither does gas). +--- gcc-4.1.0/gcc/config/sparc/linux64.h ++++ gcc-4.1.0/gcc/config/sparc/linux64.h +@@ -162,12 +162,17 @@ Boston, MA 02110-1301, USA. */ + { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ + { "link_arch", LINK_ARCH_SPEC }, + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}} \ + " + +--- gcc-4.1.0/libffi/configure ++++ gcc-4.1.0/libffi/configure +@@ -3457,6 +3457,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.1.0/libgfortran/configure ++++ gcc-4.1.0/libgfortran/configure +@@ -3699,6 +3699,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.1.0/libjava/configure ++++ gcc-4.1.0/libjava/configure +@@ -5137,6 +5137,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.1.0/libmudflap/configure ++++ gcc-4.1.0/libmudflap/configure +@@ -5382,6 +5382,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.1.0/libobjc/configure ++++ gcc-4.1.0/libobjc/configure +@@ -3312,6 +3312,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.1.0/libtool.m4 ++++ gcc-4.1.0/libtool.m4 +@@ -743,6 +743,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +--- gcc-4.1.0/ltconfig ++++ gcc-4.1.0/ltconfig +@@ -603,6 +603,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)- + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1274,6 +1275,23 @@ linux-gnu*) + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +--- gcc-4.1.0/zlib/configure ++++ gcc-4.1.0/zlib/configure +@@ -3426,6 +3426,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/patches/gcc/4.1.1/110-arm-eabi.patch b/patches/gcc/4.1.1/110-arm-eabi.patch new file mode 100644 index 00000000..1657e7ba --- /dev/null +++ b/patches/gcc/4.1.1/110-arm-eabi.patch @@ -0,0 +1,27 @@ +--- gcc-2005q3-1.orig/gcc/config.gcc 2005-10-31 19:02:54.000000000 +0300 ++++ gcc-2005q3-1/gcc/config.gcc 2006-01-27 01:09:09.000000000 +0300 +@@ -674,7 +674,7 @@ + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h" + tmake_file="${tmake_file} t-linux arm/t-arm" + case ${target} in +- arm*-*-linux-gnueabi) ++ arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi) + tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h" + tmake_file="$tmake_file arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi" + # The BPABI long long divmod functions return a 128-bit value in + +diff -urN gcc-2005q3-2/gcc/config/arm/linux-eabi.h gcc-2005q3-2.new/gcc/config/arm/linux-eabi.h +--- gcc-2005q3-2/gcc/config/arm/linux-eabi.h 2005-12-07 23:14:16.000000000 +0300 ++++ gcc-2005q3-2.new/gcc/config/arm/linux-eabi.h 2006-03-29 19:02:34.000000000 +0400 +@@ -53,7 +53,11 @@ + /* Use ld-linux.so.3 so that it will be possible to run "classic" + GNU/Linux binaries on an EABI system. */ + #undef LINUX_TARGET_INTERPRETER ++#ifdef USE_UCLIBC ++#define LINUX_TARGET_INTERPRETER "/lib/ld-uClibc.so.0" ++#else + #define LINUX_TARGET_INTERPRETER "/lib/ld-linux.so.3" ++#endif + + /* At this point, bpabi.h will have clobbered LINK_SPEC. We want to + use the GNU/Linux version, not the generic BPABI version. */ diff --git a/patches/gcc/4.1.1/200-uclibc-locale.patch b/patches/gcc/4.1.1/200-uclibc-locale.patch new file mode 100644 index 00000000..e5d712e7 --- /dev/null +++ b/patches/gcc/4.1.1/200-uclibc-locale.patch @@ -0,0 +1,3239 @@ +--- gcc-4.1.0-dist/libstdc++-v3/acinclude.m4 ++++ gcc-4.1.0/libstdc++-v3/acinclude.m4 +@@ -1071,7 +1071,7 @@ + AC_MSG_CHECKING([for C locale to use]) + GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], + [use MODEL for target locale package], +- [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) ++ [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) + + # If they didn't use this option switch, or if they specified --enable + # with no specific model, we'll have to look for one. If they +@@ -1087,6 +1087,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case ${target_os} in ++ *-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include <features.h> +@@ -1230,6 +1233,40 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +@@ -0,0 +1,63 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek <jakub@redhat.com> ++ ++#include <bits/c++config.h> ++#include <clocale> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++#endif ++ ++#endif // GLIBC 2.3 and later +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c_locale.cc +@@ -0,0 +1,152 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004, 2005 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <cerrno> // For errno ++#include <locale> ++#include <stdexcept> ++#include <langinfo.h> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#warning should dummy __newlocale check for C|POSIX ? ++#define __newlocale(a, b, c) NULL ++#define __freelocale(a) ((void)0) ++#define __duplocale(a) __c_locale() ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale " ++ "name not valid")); ++ } ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++ if (__cloc && _S_get_c_locale() != __cloc) ++ __freelocale(__cloc); ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++ { return __duplocale(__cloc); } ++} // namespace std ++ ++namespace __gnu_cxx ++{ ++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES", ++#if _GLIBCXX_NUM_CATEGORIES != 0 ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} ++ ++namespace std ++{ ++ const char* const* const locale::_S_categories = __gnu_cxx::category_names; ++} // namespace std +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.h ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c_locale.h +@@ -0,0 +1,117 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include <cstring> // get std::strlen ++#include <cstdio> // get std::snprintf or std::sprintf ++#include <clocale> ++#include <langinfo.h> // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include <iconv.h> // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include <libintl.h> // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCXX_C_LOCALE_GNU for ++#endif ++#define _GLIBCXX_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCXX_NUM_CATEGORIES 6 ++#define _GLIBCXX_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template<typename _Tv> ++ int ++ __convert_from_v(char* __out, ++ const int __size __attribute__ ((__unused__)), ++ const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = std::setlocale(LC_ALL, NULL); ++ char* __sav = new char[std::strlen(__old) + 1]; ++ std::strcpy(__sav, __old); ++ std::setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ std::setlocale(LC_ALL, __sav); ++ delete [] __sav; ++#endif ++ return __ret; ++ } ++} ++ ++#endif +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +@@ -0,0 +1,306 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // wcsnrtombs is *very* fast but stops if encounters NUL characters: ++ // in case we fall back to wcrtomb and then continue, in a loop. ++ // NB: wcsnrtombs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', ++ __from_end - __from_next); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ const size_t __conv = wcsnrtombs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // wcrtomb. ++ for (; __from < __from_next; ++__from) ++ __to_next += wcrtomb(__to_next, *__from, &__tmp_state); ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ extern_type __buf[MB_LEN_MAX]; ++ __tmp_state = __state; ++ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); ++ if (__conv > static_cast<size_t>(__to_end - __to_next)) ++ __ret = partial; ++ else ++ { ++ memcpy(__to_next, __buf, __conv); ++ __state = __tmp_state; ++ __to_next += __conv; ++ ++__from_next; ++ } ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we store a L'\0' and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0', ++ __from_end ++ - __from_next)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ size_t __conv = mbsnrtowcs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (;; ++__to_next, __from += __conv) ++ { ++ __conv = mbrtowc(__to_next, __from, __from_end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __from_next = __from; ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ // It is unclear what to return in this case (see DR 382). ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ if (__to_next < __to_end) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from_next; ++ *__to_next++ = L'\0'; ++ } ++ else ++ __ret = partial; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_encoding() const throw() ++ { ++ // XXX This implementation assumes that the encoding is ++ // stateless and is either single-byte or variable-width. ++ int __ret = 0; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ if (MB_CUR_MAX == 1) ++ __ret = 1; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_max_length() const throw() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ // XXX Probably wrong for stateful encodings. ++ int __ret = MB_CUR_MAX; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_length(state_type& __state, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { ++ int __ret = 0; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we advance past it and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ ++ // A dummy internal buffer is needed in order for mbsnrtocws to consider ++ // its fourth parameter (it wouldn't with NULL as first parameter). ++ wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0', ++ __end ++ - __from)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __end; ++ ++ const extern_type* __tmp_from = __from; ++ size_t __conv = mbsnrtowcs(__to, &__from, ++ __from_chunk_end - __from, ++ __max, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (__from = __tmp_from;; __from += __conv) ++ { ++ __conv = mbrtowc(NULL, __from, __end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __state = __tmp_state; ++ __ret += __from - __tmp_from; ++ break; ++ } ++ if (!__from) ++ __from = __from_chunk_end; ++ ++ __ret += __from - __tmp_from; ++ __max -= __conv; ++ ++ if (__from < __end && __max) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from; ++ ++__ret; ++ --__max; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++#endif ++} +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/collate_members.cc +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate<char>::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<char>::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ int ++ collate<wchar_t>::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc +@@ -0,0 +1,314 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype<char> specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) ++ : ctype<char>(0, false, __refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_ctype); ++ this->_S_create_c_locale(this->_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; ++ this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; ++ this->_M_table = this->_M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ ctype<wchar_t>::__wmask_type ++ ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = __wmask_type(); ++ } ++ return __ret; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype<wchar_t>:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // The case of __m == ctype_base::space is particularly important, ++ // due to its use in many istream functions. Therefore we deal with ++ // it first, exploiting the knowledge that on GNU systems _M_bit[5] ++ // is the mask corresponding to ctype_base::space. NB: an encoding ++ // change would not affect correctness! ++ bool __ret = false; ++ if (__m == _M_bit[5]) ++ __ret = __iswctype_l(__c, _M_wmask[5], _M_c_locale_ctype); ++ else ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur]) ++ { ++ if (__iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ else if (__m == _M_bit[__bitcur]) ++ break; ++ } ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (; __lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ __m |= _M_bit[__bitcur]; ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype<wchar_t>:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<wchar_t>:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast<unsigned char>(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype<wchar_t>:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok) ++ return _M_narrow[__wc]; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ const int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ if (_M_narrow_ok) ++ while (__lo < __hi) ++ { ++ if (*__lo >= 0 && *__lo < 128) ++ *__dest = _M_narrow[*__lo]; ++ else ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype<wchar_t>::_M_initialize_ctype() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wint_t __i; ++ for (__i = 0; __i < 128; ++__i) ++ { ++ const int __c = wctob(__i); ++ if (__c == EOF) ++ break; ++ else ++ _M_narrow[__i] = static_cast<char>(__c); ++ } ++ if (__i == 128) ++ _M_narrow_ok = true; ++ else ++ _M_narrow_ok = false; ++ for (size_t __j = 0; ++ __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) ++ _M_widen[__j] = btowc(__j); ++ ++ for (size_t __k = 0; __k <= 11; ++__k) ++ { ++ _M_bit[__k] = static_cast<mask>(_ISbit(__k)); ++ _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++#endif // _GLIBCXX_USE_WCHAR_T ++} +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/messages_members.cc +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages<char>::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ wstring ++ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++# elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.h ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/messages_members.h +@@ -0,0 +1,121 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template<typename _CharT> ++ messages<_CharT>::messages(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_messages(NULL), _M_name_messages(NULL) ++ { ++ const size_t __len = std::strlen(__s) + 1; ++ char* __tmp = new char[__len]; ++ std::memcpy(__tmp, __s, __len); ++ _M_name_messages = __tmp; ++ ++ // Last to avoid leaking memory if new throws. ++ _M_c_locale_messages = _S_clone_c_locale(__cloc); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::~messages() ++ { ++ if (_M_name_messages != _S_get_c_name()) ++ delete [] _M_name_messages; ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string<char>& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template<typename _CharT> ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template<typename _CharT> ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++ if (this->_M_name_messages != locale::facet::_S_get_c_name()) ++ delete [] this->_M_name_messages; ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ this->_M_name_messages = __tmp; ++ ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_messages); ++ this->_S_create_c_locale(this->_M_c_locale_messages, __s); ++ } ++ } +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc +@@ -0,0 +1,692 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ __ret.field[0] = sign; ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[2] = space; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[1] = space; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ else ++ { ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ default: ++ __ret = pattern(); ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == true ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == false ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct<char, true>::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct<char, false>::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = ++ static_cast<wchar_t>(money_base::_S_atoms[__i]); ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# elif defined __UCLIBC_HAS_LOCALE__ ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = ++ static_cast<wchar_t>(money_base::_S_atoms[__i]); ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# elif defined __UCLIBC_HAS_LOCALE__ ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct<wchar_t, true>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++ ++ template<> ++ moneypunct<wchar_t, false>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++#endif ++} +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc +@@ -0,0 +1,173 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, ++ __cloc)); ++ ++ // Check for NULL, which implies no grouping. ++ if (_M_data->_M_thousands_sep == '\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = "true"; ++ _M_data->_M_truename_size = 4; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = "false"; ++ _M_data->_M_falsename_size = 5; ++ } ++ ++ template<> ++ numpunct<char>::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<wchar_t>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = ++ static_cast<wchar_t>(__num_base::_S_atoms_out[__i]); ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = ++ static_cast<wchar_t>(__num_base::_S_atoms_in[__j]); ++ } ++ else ++ { ++ // Named locale. ++ // NB: In the GNU model wchar_t is always 32 bit wide. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# elif defined __UCLIBC_HAS_LOCALE__ ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ ++ if (_M_data->_M_thousands_sep == L'\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = L"true"; ++ _M_data->_M_truename_size = 4; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = L"false"; ++ _M_data->_M_falsename_size = 5; ++ } ++ ++ template<> ++ numpunct<wchar_t>::~numpunct() ++ { delete _M_data; } ++ #endif ++} +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/time_members.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/time_members.cc +@@ -0,0 +1,406 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct<char>:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const size_t __len = __strftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = '\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = "%m/%d/%y"; ++ _M_data->_M_date_era_format = "%m/%d/%y"; ++ _M_data->_M_time_format = "%H:%M:%S"; ++ _M_data->_M_time_era_format = "%H:%M:%S"; ++ _M_data->_M_date_time_format = ""; ++ _M_data->_M_date_time_era_format = ""; ++ _M_data->_M_am = "AM"; ++ _M_data->_M_pm = "PM"; ++ _M_data->_M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = "Sunday"; ++ _M_data->_M_day2 = "Monday"; ++ _M_data->_M_day3 = "Tuesday"; ++ _M_data->_M_day4 = "Wednesday"; ++ _M_data->_M_day5 = "Thursday"; ++ _M_data->_M_day6 = "Friday"; ++ _M_data->_M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = "Sun"; ++ _M_data->_M_aday2 = "Mon"; ++ _M_data->_M_aday3 = "Tue"; ++ _M_data->_M_aday4 = "Wed"; ++ _M_data->_M_aday5 = "Thu"; ++ _M_data->_M_aday6 = "Fri"; ++ _M_data->_M_aday7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = "January"; ++ _M_data->_M_month02 = "February"; ++ _M_data->_M_month03 = "March"; ++ _M_data->_M_month04 = "April"; ++ _M_data->_M_month05 = "May"; ++ _M_data->_M_month06 = "June"; ++ _M_data->_M_month07 = "July"; ++ _M_data->_M_month08 = "August"; ++ _M_data->_M_month09 = "September"; ++ _M_data->_M_month10 = "October"; ++ _M_data->_M_month11 = "November"; ++ _M_data->_M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = "Jan"; ++ _M_data->_M_amonth02 = "Feb"; ++ _M_data->_M_amonth03 = "Mar"; ++ _M_data->_M_amonth04 = "Apr"; ++ _M_data->_M_amonth05 = "May"; ++ _M_data->_M_amonth06 = "Jun"; ++ _M_data->_M_amonth07 = "Jul"; ++ _M_data->_M_amonth08 = "Aug"; ++ _M_data->_M_amonth09 = "Sep"; ++ _M_data->_M_amonth10 = "Oct"; ++ _M_data->_M_amonth11 = "Nov"; ++ _M_data->_M_amonth12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, ++ __cloc); ++ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ __timepunct<wchar_t>:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++ const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = L'\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<wchar_t>; ++ ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = L"%m/%d/%y"; ++ _M_data->_M_date_era_format = L"%m/%d/%y"; ++ _M_data->_M_time_format = L"%H:%M:%S"; ++ _M_data->_M_time_era_format = L"%H:%M:%S"; ++ _M_data->_M_date_time_format = L""; ++ _M_data->_M_date_time_era_format = L""; ++ _M_data->_M_am = L"AM"; ++ _M_data->_M_pm = L"PM"; ++ _M_data->_M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = L"Sunday"; ++ _M_data->_M_day2 = L"Monday"; ++ _M_data->_M_day3 = L"Tuesday"; ++ _M_data->_M_day4 = L"Wednesday"; ++ _M_data->_M_day5 = L"Thursday"; ++ _M_data->_M_day6 = L"Friday"; ++ _M_data->_M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = L"Sun"; ++ _M_data->_M_aday2 = L"Mon"; ++ _M_data->_M_aday3 = L"Tue"; ++ _M_data->_M_aday4 = L"Wed"; ++ _M_data->_M_aday5 = L"Thu"; ++ _M_data->_M_aday6 = L"Fri"; ++ _M_data->_M_aday7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = L"January"; ++ _M_data->_M_month02 = L"February"; ++ _M_data->_M_month03 = L"March"; ++ _M_data->_M_month04 = L"April"; ++ _M_data->_M_month05 = L"May"; ++ _M_data->_M_month06 = L"June"; ++ _M_data->_M_month07 = L"July"; ++ _M_data->_M_month08 = L"August"; ++ _M_data->_M_month09 = L"September"; ++ _M_data->_M_month10 = L"October"; ++ _M_data->_M_month11 = L"November"; ++ _M_data->_M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = L"Jan"; ++ _M_data->_M_amonth02 = L"Feb"; ++ _M_data->_M_amonth03 = L"Mar"; ++ _M_data->_M_amonth04 = L"Apr"; ++ _M_data->_M_amonth05 = L"May"; ++ _M_data->_M_amonth06 = L"Jun"; ++ _M_data->_M_amonth07 = L"Jul"; ++ _M_data->_M_amonth08 = L"Aug"; ++ _M_data->_M_amonth09 = L"Sep"; ++ _M_data->_M_amonth10 = L"Oct"; ++ _M_data->_M_amonth11 = L"Nov"; ++ _M_data->_M_amonth12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ union { char *__s; wchar_t *__w; } __u; ++ ++ __u.__s = __nl_langinfo_l(_NL_WD_FMT, __cloc); ++ _M_data->_M_date_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_D_FMT, __cloc); ++ _M_data->_M_date_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WT_FMT, __cloc); ++ _M_data->_M_time_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_T_FMT, __cloc); ++ _M_data->_M_time_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WD_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WAM_STR, __cloc); ++ _M_data->_M_am = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WPM_STR, __cloc); ++ _M_data->_M_pm = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc); ++ _M_data->_M_am_pm_format = __u.__w; ++ ++ // Day names, starting with "C"'s Sunday. ++ __u.__s = __nl_langinfo_l(_NL_WDAY_1, __cloc); ++ _M_data->_M_day1 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_2, __cloc); ++ _M_data->_M_day2 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_3, __cloc); ++ _M_data->_M_day3 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_4, __cloc); ++ _M_data->_M_day4 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_5, __cloc); ++ _M_data->_M_day5 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_6, __cloc); ++ _M_data->_M_day6 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_7, __cloc); ++ _M_data->_M_day7 = __u.__w; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_1, __cloc); ++ _M_data->_M_aday1 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_2, __cloc); ++ _M_data->_M_aday2 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_3, __cloc); ++ _M_data->_M_aday3 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_4, __cloc); ++ _M_data->_M_aday4 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_5, __cloc); ++ _M_data->_M_aday5 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_6, __cloc); ++ _M_data->_M_aday6 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_7, __cloc); ++ _M_data->_M_aday7 = __u.__w; ++ ++ // Month names, starting with "C"'s January. ++ __u.__s = __nl_langinfo_l(_NL_WMON_1, __cloc); ++ _M_data->_M_month01 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_2, __cloc); ++ _M_data->_M_month02 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_3, __cloc); ++ _M_data->_M_month03 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_4, __cloc); ++ _M_data->_M_month04 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_5, __cloc); ++ _M_data->_M_month05 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_6, __cloc); ++ _M_data->_M_month06 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_7, __cloc); ++ _M_data->_M_month07 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_8, __cloc); ++ _M_data->_M_month08 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_9, __cloc); ++ _M_data->_M_month09 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_10, __cloc); ++ _M_data->_M_month10 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_11, __cloc); ++ _M_data->_M_month11 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_12, __cloc); ++ _M_data->_M_month12 = __u.__w; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ __u.__s = __nl_langinfo_l(_NL_WABMON_1, __cloc); ++ _M_data->_M_amonth01 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_2, __cloc); ++ _M_data->_M_amonth02 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_3, __cloc); ++ _M_data->_M_amonth03 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_4, __cloc); ++ _M_data->_M_amonth04 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_5, __cloc); ++ _M_data->_M_amonth05 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_6, __cloc); ++ _M_data->_M_amonth06 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_7, __cloc); ++ _M_data->_M_amonth07 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_8, __cloc); ++ _M_data->_M_amonth08 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_9, __cloc); ++ _M_data->_M_amonth09 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_10, __cloc); ++ _M_data->_M_amonth10 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_11, __cloc); ++ _M_data->_M_amonth11 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_12, __cloc); ++ _M_data->_M_amonth12 = __u.__w; ++ } ++#endif // 0 ++ } ++#endif ++} +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/time_members.h ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/time_members.h +@@ -0,0 +1,76 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) ++ : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(NULL) ++ { ++ const size_t __len = std::strlen(__s) + 1; ++ char* __tmp = new char[__len]; ++ std::memcpy(__tmp, __s, __len); ++ _M_name_timepunct = __tmp; ++ ++ try ++ { _M_initialize_timepunct(__cloc); } ++ catch(...) ++ { ++ delete [] _M_name_timepunct; ++ __throw_exception_again; ++ } ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::~__timepunct() ++ { ++ if (_M_name_timepunct != _S_get_c_name()) ++ delete [] _M_name_timepunct; ++ delete _M_data; ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_base.h ++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_base.h +@@ -0,0 +1,64 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++/** @file ctype_base.h ++ * This is an internal header file, included by other library headers. ++ * You should not attempt to use it directly. ++ */ ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ /// @brief Base class for ctype. ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ ++ // NB: Offsets into ctype<char>::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISalpha | _ISdigit | _ISpunct; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalpha | _ISdigit; ++ }; +--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h ++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_inline.h +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype<char>:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast<unsigned char>(__c)] & __m; } ++ ++ const char* ++ ctype<char>:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h ++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h +@@ -0,0 +1,92 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype<char>::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype<char>::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ char ++ ctype<char>::do_toupper(char __c) const ++ { return _M_toupper[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype<char>::do_tolower(char __c) const ++ { return _M_tolower[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/os_defines.h ++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/os_defines.h +@@ -0,0 +1,44 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCXX_OS_DEFINES ++#define _GLIBCXX_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include <features.h> ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif +--- gcc-4.1.0-dist/libstdc++-v3/configure ++++ gcc-4.1.0/libstdc++-v3/configure +@@ -4005,6 +4005,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5740,7 +5745,7 @@ + enableval="$enable_clocale" + + case "$enableval" in +- generic|gnu|ieee_1003.1-2001|yes|no|auto) ;; ++ generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto) ;; + *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable clocale" >&5 + echo "$as_me: error: Unknown argument to enable/disable clocale" >&2;} + { (exit 1); exit 1; }; } ;; +@@ -5765,6 +5770,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case ${target_os} in ++ linux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) + cat >conftest.$ac_ext <<_ACEOF + /* confdefs.h. */ +@@ -5995,6 +6003,76 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ echo "$as_me:$LINENO: result: uclibc" >&5 ++echo "${ECHO_T}uclibc" >&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; 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_check_msgfmt+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_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_check_msgfmt="yes" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt=$ac_cv_prog_check_msgfmt ++if test -n "$check_msgfmt"; then ++ echo "$as_me:$LINENO: result: $check_msgfmt" >&5 ++echo "${ECHO_T}$check_msgfmt" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +--- gcc-4.1.0-dist/libstdc++-v3/configure.host ++++ gcc-4.1.0/libstdc++-v3/configure.host +@@ -261,6 +261,12 @@ + ;; + esac + ++# Override for uClibc since linux-uclibc gets mishandled above. ++case "${host_os}" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; ++esac + + # Set any OS-dependent and CPU-dependent bits. + # THIS TABLE IS SORTED. KEEP IT THAT WAY. +--- gcc-4.1.0-dist/libstdc++-v3/crossconfig.m4 ++++ gcc-4.1.0/libstdc++-v3/crossconfig.m4 +@@ -143,6 +143,99 @@ + ;; + esac + ;; ++ *-uclibc*) ++# Temporary hack until we implement the float versions of the libm funcs ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCXX_CHECK_LINKER_FEATURES ++ GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCXX_CHECK_WCHAR_T_SUPPORT ++ ++ # For LFS. ++ AC_DEFINE(HAVE_INT64_T) ++ case "$target" in ++ *-uclinux*) ++ # Don't enable LFS with uClinux ++ ;; ++ *) ++ AC_DEFINE(_GLIBCXX_USE_LFS) ++ esac ++ ++ # For showmanyc_helper(). ++ AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h) ++ GLIBCXX_CHECK_POLL ++ GLIBCXX_CHECK_S_ISREG_OR_S_IFREG ++ ++ # For xsputn_2(). ++ AC_CHECK_HEADERS(sys/uio.h) ++ GLIBCXX_CHECK_WRITEV ++ ++# AC_DEFINE(HAVE_ACOSF) ++# AC_DEFINE(HAVE_ASINF) ++# AC_DEFINE(HAVE_ATANF) ++# AC_DEFINE(HAVE_ATAN2F) ++ AC_DEFINE(HAVE_CEILF) ++ AC_DEFINE(HAVE_COPYSIGN) ++# AC_DEFINE(HAVE_COPYSIGNF) ++# AC_DEFINE(HAVE_COSF) ++# AC_DEFINE(HAVE_COSHF) ++# AC_DEFINE(HAVE_EXPF) ++# AC_DEFINE(HAVE_FABSF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ AC_DEFINE(HAVE_FLOORF) ++# AC_DEFINE(HAVE_FMODF) ++# AC_DEFINE(HAVE_FREXPF) ++ AC_DEFINE(HAVE_HYPOT) ++# AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++# AC_DEFINE(HAVE_LOGF) ++# AC_DEFINE(HAVE_LOG10F) ++# AC_DEFINE(HAVE_MODFF) ++# AC_DEFINE(HAVE_SINF) ++# AC_DEFINE(HAVE_SINHF) ++# AC_DEFINE(HAVE_SINCOS) ++# AC_DEFINE(HAVE_SINCOSF) ++ AC_DEFINE(HAVE_SQRTF) ++# AC_DEFINE(HAVE_TANF) ++# AC_DEFINE(HAVE_TANHF) ++ if test x"long_double_math_on_this_cpu" = x"yes"; then ++ AC_MSG_ERROR([long_double_math_on_this_cpu is yes!]) ++# AC_DEFINE(HAVE_ACOSL) ++# AC_DEFINE(HAVE_ASINL) ++# AC_DEFINE(HAVE_ATANL) ++# AC_DEFINE(HAVE_ATAN2L) ++# AC_DEFINE(HAVE_CEILL) ++# AC_DEFINE(HAVE_COPYSIGNL) ++# AC_DEFINE(HAVE_COSL) ++# AC_DEFINE(HAVE_COSHL) ++# AC_DEFINE(HAVE_EXPL) ++# AC_DEFINE(HAVE_FABSL) ++# AC_DEFINE(HAVE_FINITEL) ++# AC_DEFINE(HAVE_FLOORL) ++# AC_DEFINE(HAVE_FMODL) ++# AC_DEFINE(HAVE_FREXPL) ++# AC_DEFINE(HAVE_HYPOTL) ++# AC_DEFINE(HAVE_ISINFL) ++# AC_DEFINE(HAVE_ISNANL) ++# AC_DEFINE(HAVE_LOGL) ++# AC_DEFINE(HAVE_LOG10L) ++# AC_DEFINE(HAVE_MODFL) ++# AC_DEFINE(HAVE_POWL) ++# AC_DEFINE(HAVE_SINL) ++# AC_DEFINE(HAVE_SINHL) ++# AC_DEFINE(HAVE_SINCOSL) ++# AC_DEFINE(HAVE_SQRTL) ++# AC_DEFINE(HAVE_TANL) ++# AC_DEFINE(HAVE_TANHL) ++ fi ++ ;; + *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu) + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ + machine/endian.h machine/param.h sys/machine.h sys/types.h \ +@@ -157,7 +250,7 @@ + AC_DEFINE(HAVE_INT64_T) + case "$target" in + *-uclinux*) +- # Don't enable LFS with uClibc ++ # Don't enable LFS with uClinux + ;; + *) + AC_DEFINE(_GLIBCXX_USE_LFS) +--- gcc-4.1.0-dist/libstdc++-v3/include/c_compatibility/wchar.h ++++ gcc-4.1.0/libstdc++-v3/include/c_compatibility/wchar.h +@@ -101,7 +101,9 @@ + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; ++#if _GLIBCXX_HAVE_WCSFTIME + using std::wcsftime; ++#endif + + #if _GLIBCXX_USE_C99 + using std::wcstold; +--- gcc-4.1.0-dist/libstdc++-v3/include/c_std/std_cwchar.h ++++ gcc-4.1.0/libstdc++-v3/include/c_std/std_cwchar.h +@@ -180,7 +180,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#if _GLIBCXX_HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; diff --git a/patches/gcc/4.1.1/300-libstdc++-pic.patch b/patches/gcc/4.1.1/300-libstdc++-pic.patch new file mode 100644 index 00000000..560bcb23 --- /dev/null +++ b/patches/gcc/4.1.1/300-libstdc++-pic.patch @@ -0,0 +1,50 @@ +# DP: Build and install libstdc++_pic.a library. + +--- gcc/libstdc++-v3/src/Makefile.am ++++ gcc/libstdc++-v3/src/Makefile.am +@@ -214,6 +214,12 @@ + $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LDFLAGS) -o $@ + + ++install-exec-local: ++ifeq ($(enable_shared),yes) ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++endif ++ + # Added bits to build debug library. + if GLIBCXX_BUILD_DEBUG + all-local: build_debug +--- gcc/libstdc++-v3/src/Makefile.in ++++ gcc/libstdc++-v3/src/Makefile.in +@@ -627,7 +627,7 @@ + + install-data-am: install-data-local + +-install-exec-am: install-toolexeclibLTLIBRARIES ++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local + + install-info: install-info-am + +@@ -660,6 +660,7 @@ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-data-local install-exec \ ++ install-exec-local \ + install-exec-am install-info install-info-am install-man \ + install-strip install-toolexeclibLTLIBRARIES installcheck \ + installcheck-am installdirs maintainer-clean \ +@@ -743,6 +743,13 @@ + install_debug: + (cd ${debugdir} && $(MAKE) \ + toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install) ++ ++install-exec-local: ++ifeq ($(enable_shared),yes) ++ $(AR) cru libstdc++_pic.a *.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++endif ++ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: diff --git a/patches/gcc/4.1.1/301-missing-execinfo_h.patch b/patches/gcc/4.1.1/301-missing-execinfo_h.patch new file mode 100644 index 00000000..0e2092f3 --- /dev/null +++ b/patches/gcc/4.1.1/301-missing-execinfo_h.patch @@ -0,0 +1,11 @@ +--- gcc-4.0.0/boehm-gc/include/gc.h-orig 2005-04-28 22:28:57.000000000 -0500 ++++ gcc-4.0.0/boehm-gc/include/gc.h 2005-04-28 22:30:38.000000000 -0500 +@@ -500,7 +500,7 @@ + #ifdef __linux__ + # include <features.h> + # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2) \ +- && !defined(__ia64__) ++ && !defined(__ia64__) && !defined(__UCLIBC__) + # ifndef GC_HAVE_BUILTIN_BACKTRACE + # define GC_HAVE_BUILTIN_BACKTRACE + # endif diff --git a/patches/gcc/4.1.1/302-c99-snprintf.patch b/patches/gcc/4.1.1/302-c99-snprintf.patch new file mode 100644 index 00000000..dfb22d68 --- /dev/null +++ b/patches/gcc/4.1.1/302-c99-snprintf.patch @@ -0,0 +1,11 @@ +--- gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h-orig 2005-04-29 00:08:41.000000000 -0500 ++++ gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h 2005-04-29 00:08:45.000000000 -0500 +@@ -142,7 +142,7 @@ + using ::vsprintf; + } + +-#if _GLIBCXX_USE_C99 ++#if _GLIBCXX_USE_C99 || defined(__UCLIBC__) + + #undef snprintf + #undef vfscanf diff --git a/patches/gcc/4.1.1/303-c99-complex-ugly-hack.patch b/patches/gcc/4.1.1/303-c99-complex-ugly-hack.patch new file mode 100644 index 00000000..2ccc80d9 --- /dev/null +++ b/patches/gcc/4.1.1/303-c99-complex-ugly-hack.patch @@ -0,0 +1,12 @@ +--- gcc-4.0.0/libstdc++-v3/configure-old 2005-04-30 22:04:48.061603912 -0500 ++++ gcc-4.0.0/libstdc++-v3/configure 2005-04-30 22:06:13.678588152 -0500 +@@ -7194,6 +7194,9 @@ + cat >>conftest.$ac_ext <<_ACEOF + /* end confdefs.h. */ + #include <complex.h> ++#ifdef __UCLIBC__ ++#error ugly hack to make sure configure test fails here for cross until uClibc supports the complex funcs ++#endif + int + main () + { diff --git a/patches/gcc/4.1.1/304-index_macro.patch b/patches/gcc/4.1.1/304-index_macro.patch new file mode 100644 index 00000000..1fac112f --- /dev/null +++ b/patches/gcc/4.1.1/304-index_macro.patch @@ -0,0 +1,24 @@ +--- gcc-4.1.0/libstdc++-v3/include/ext/rope.mps 2006-03-24 01:49:51 +0100 ++++ gcc-4.1.0/libstdc++-v3/include/ext/rope 2006-03-24 01:49:37 +0100 +@@ -59,6 +59,9 @@ + #include <bits/allocator.h> + #include <ext/hash_fun.h> + ++/* cope w/ index defined as macro, SuSv3 proposal */ ++#undef index ++ + # ifdef __GC + # define __GC_CONST const + # else +--- gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h.mps 2006-03-24 01:50:04 +0100 ++++ gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h 2006-03-24 01:50:28 +0100 +@@ -53,6 +53,9 @@ + #include <ext/memory> // For uninitialized_copy_n + #include <ext/numeric> // For power + ++/* cope w/ index defined as macro, SuSv3 proposal */ ++#undef index ++ + namespace __gnu_cxx + { + using std::size_t; diff --git a/patches/gcc/4.1.1/740-sh-pr24836.patch b/patches/gcc/4.1.1/740-sh-pr24836.patch new file mode 100644 index 00000000..7992282c --- /dev/null +++ b/patches/gcc/4.1.1/740-sh-pr24836.patch @@ -0,0 +1,25 @@ +http://sourceforge.net/mailarchive/forum.php?thread_id=8959304&forum_id=5348 +http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24836 + +--- gcc/gcc/configure.ac (revision 106699) ++++ gcc/gcc/configure.ac (working copy) +@@ -2446,7 +2446,7 @@ + tls_first_minor=14 + tls_as_opt="-m64 -Aesame --fatal-warnings" + ;; +- sh-*-* | sh[34]-*-*) ++ sh-*-* | sh[34]*-*-*) + conftest_s=' + .section ".tdata","awT",@progbits + foo: .long 25 +--- gcc/gcc/configure ++++ gcc/gcc/configure +@@ -14846,7 +14846,7 @@ + tls_first_minor=14 + tls_as_opt="-m64 -Aesame --fatal-warnings" + ;; +- sh-*-* | sh[34]-*-*) ++ sh-*-* | sh[34]*-*-*) + conftest_s=' + .section ".tdata","awT",@progbits + foo: .long 25 diff --git a/patches/gcc/4.1.1/800-arm-bigendian.patch b/patches/gcc/4.1.1/800-arm-bigendian.patch new file mode 100644 index 00000000..1fa5ae1c --- /dev/null +++ b/patches/gcc/4.1.1/800-arm-bigendian.patch @@ -0,0 +1,67 @@ +By Lennert Buytenhek <buytenh@wantstofly.org> +Adds support for arm*b-linux* big-endian ARM targets + +See http://gcc.gnu.org/PR16350 + +--- gcc-4.1.0/gcc/config/arm/linux-elf.h ++++ gcc-4.1.0/gcc/config/arm/linux-elf.h +@@ -28,19 +28,33 @@ + #undef TARGET_VERSION + #define TARGET_VERSION fputs (" (ARM GNU/Linux with ELF)", stderr); + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT MASK_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + #undef TARGET_DEFAULT_FLOAT_ABI + #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD + + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (0) ++#define TARGET_DEFAULT (TARGET_ENDIAN_DEFAULT) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mno-thumb-interwork" } + + /* Now we define the strings used to build the spec file. */ + #undef LIB_SPEC +@@ -61,7 +75,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker " LINUX_TARGET_INTERPRETER "} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #undef LINK_SPEC +--- gcc-4.1.0/gcc/config.gcc ++++ gcc-4.1.0/gcc/config.gcc +@@ -672,6 +672,11 @@ + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h" ++ case $target in ++ arm*b-*) ++ tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1" ++ ;; ++ esac + tmake_file="${tmake_file} t-linux arm/t-arm" + case ${target} in + arm*-*-linux-gnueabi) diff --git a/patches/gcc/4.1.1/801-softfloat-fix.patch b/patches/gcc/4.1.1/801-softfloat-fix.patch new file mode 100644 index 00000000..844c9a06 --- /dev/null +++ b/patches/gcc/4.1.1/801-softfloat-fix.patch @@ -0,0 +1,58 @@ +This patch (C) 2007 Yann E. MORIN +Licensed under GPL v2. + +First hunk of this patch solves compiling uClibc-0.9.28{,.1} : + +make[1]: Entering directory `/home/ymorin/x-tools/build/armeb-unknown-linux-uclibc/gcc-4.1.1-uClibc-0.9.28.1/build-libc' + LD libuClibc-0.9.29.so +libc/libc_so.a(difftime.os): In function `difftime': +difftime.c:(.text+0x8): undefined reference to `__floatsidf' +difftime.c:(.text+0x2c): undefined reference to `__subdf3' +libc/libc_so.a(_fpmaxtostr.os): In function `_fpmaxtostr': +_fpmaxtostr.c:(.text+0xd4): undefined reference to `__nedf2' +_fpmaxtostr.c:(.text+0xf8): undefined reference to `__eqdf2' +_fpmaxtostr.c:(.text+0x114): undefined reference to `__divdf3' +_fpmaxtostr.c:(.text+0x120): undefined reference to `__ltdf2' +_fpmaxtostr.c:(.text+0x1c4): undefined reference to `__muldf3' +_fpmaxtostr.c:(.text+0x388): undefined reference to `__gedf2' +_fpmaxtostr.c:(.text+0x430): undefined reference to `__adddf3' +libc/libc_so.a(__psfs_do_numeric.os): In function `__psfs_do_numeric': +__psfs_do_numeric.c:(.text+0x520): undefined reference to `__truncdfsf2' +libc/libc_so.a(strtof.os): In function `strtof': +strtof.c:(.text+0x1c): undefined reference to `__extendsfdf2' +/home/ymorin/x-tools/build/armeb-unknown-linux-uclibc/gcc-4.1.1-uClibc-0.9.28.1/cc_core_prefix/lib/gcc/arm-linux-uclibc/4.1.1/libgcc.a(_fixunsdfsi.o): +In function `__fixunsdfsi': +libgcc2.c:(.text+0x34): undefined reference to `__fixdfsi' +make[2]: *** [lib/libc.so] Error 1 +make[1]: *** [lib/libc.so.0] Error 2 +make[1]: Leaving directory `/home/ymorin/x-tools/build/armeb-unknown-linux-uclibc/gcc-4.1.1-uClibc-0.9.28.1/build-libc' +make: *** [/home/ymorin/x-tools/build/armeb-unknown-linux-uclibc/gcc-4.1.1-uClibc-0.9.28.1/build-libc/lib/libc.a] +Error 2 + +The second hunk fixes building final gcc because soft-float implies using -lfloat (which we don't have). + + +diff -dur gcc-4.1.1.no-softfloat-fix/gcc/config.gcc gcc-4.1.1/gcc/config.gcc +--- gcc-4.1.1.no-softfloat-fix/gcc/config.gcc 2007-02-01 21:57:17.000000000 +0100 ++++ gcc-4.1.1/gcc/config.gcc 2007-02-01 22:11:06.000000000 +0100 +@@ -690,7 +690,7 @@ + default_use_cxa_atexit=yes + ;; + *) +- tmake_file="$tmake_file arm/t-linux" ++ tmake_file="$tmake_file arm/t-linux arm/t-arm-elf" + ;; + esac + tm_file="$tm_file arm/aout.h arm/arm.h" +diff -dur gcc-4.1.1.-lfloat/gcc/config/arm/linux-elf.h gcc-4.1.1/gcc/config/arm/linux-elf.h +--- gcc-4.1.1.-lfloat/gcc/config/arm/linux-elf.h 2007-02-01 21:57:17.000000000 +0100 ++++ gcc-4.1.1/gcc/config/arm/linux-elf.h 2007-02-01 23:00:42.000000000 +0100 +@@ -63,7 +63,7 @@ + %{shared:-lc} \ + %{!shared:%{profile:-lc_p}%{!profile:-lc}}" + +-#define LIBGCC_SPEC "%{msoft-float:-lfloat} %{mfloat-abi=soft*:-lfloat} -lgcc" ++#define LIBGCC_SPEC "-lgcc" + + #ifdef USE_UCLIBC + #define LINUX_TARGET_INTERPRETER "/lib/ld-uClibc.so.0" diff --git a/patches/gcc/4.1.2/100-uclibc-conf.patch b/patches/gcc/4.1.2/100-uclibc-conf.patch new file mode 100644 index 00000000..49d576c7 --- /dev/null +++ b/patches/gcc/4.1.2/100-uclibc-conf.patch @@ -0,0 +1,544 @@ +--- gcc-4.1.0/gcc/config/t-linux-uclibc ++++ gcc-4.1.0/gcc/config/t-linux-uclibc +@@ -0,0 +1,5 @@ ++# Remove glibc specific files added in t-linux ++SHLIB_MAPFILES := $(filter-out $(srcdir)/config/libgcc-glibc.ver, $(SHLIB_MAPFILES)) ++ ++# Use unwind-dw2-fde instead of unwind-dw2-fde-glibc ++LIB2ADDEH := $(subst unwind-dw2-fde-glibc.c,unwind-dw2-fde.c,$(LIB2ADDEH)) +--- gcc-4.1.0/gcc/config.gcc ++++ gcc-4.1.0/gcc/config.gcc +@@ -1887,7 +1887,7 @@ s390x-ibm-tpf*) + ;; + sh-*-elf* | sh[12346l]*-*-elf* | sh*-*-kaos* | \ + sh-*-symbianelf* | sh[12346l]*-*-symbianelf* | \ +- sh-*-linux* | sh[346lbe]*-*-linux* | \ ++ sh*-*-linux* | sh[346lbe]*-*-linux* | \ + sh-*-netbsdelf* | shl*-*-netbsdelf* | sh5-*-netbsd* | sh5l*-*-netbsd* | \ + sh64-*-netbsd* | sh64l*-*-netbsd*) + tmake_file="${tmake_file} sh/t-sh sh/t-elf" +@@ -2341,6 +2341,12 @@ m32c-*-elf*) + ;; + esac + ++# Rather than hook into each target, just do it after all the linux ++# targets have been processed ++case ${target} in ++*-linux-uclibc*) tm_defines="${tm_defines} USE_UCLIBC" ; tmake_file="${tmake_file} t-linux-uclibc" ++esac ++ + case ${target} in + i[34567]86-*-linux*aout* | i[34567]86-*-linux*libc1) + tmake_file="${tmake_file} i386/t-gmm_malloc" +--- gcc-4.1.0/boehm-gc/configure ++++ gcc-4.1.0/boehm-gc/configure +@@ -4320,6 +4320,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.1.0/configure ++++ gcc-4.1.0/configure +@@ -1133,7 +1133,7 @@ no) + ;; + "") + case "${target}" in +- *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu) ++ *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*) + # Enable libmudflap by default in GNU and friends. + ;; + *-*-freebsd*) +--- gcc-4.1.0/configure.in ++++ gcc-4.1.0/configure.in +@@ -341,7 +341,7 @@ no) + ;; + "") + case "${target}" in +- *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu) ++ *-*-linux*-gnu | *-*-gnu* | *-*-k*bsd*-gnu | *-*-linux-uclibc*) + # Enable libmudflap by default in GNU and friends. + ;; + *-*-freebsd*) +--- gcc-4.1.0/contrib/regression/objs-gcc.sh ++++ gcc-4.1.0/contrib/regression/objs-gcc.sh +@@ -105,6 +105,10 @@ if [ $H_REAL_TARGET = $H_REAL_HOST -a $H + then + make all-gdb all-dejagnu all-ld || exit 1 + make install-gdb install-dejagnu install-ld || exit 1 ++elif [ $H_REAL_TARGET = $H_REAL_HOST -a $H_REAL_TARGET = i686-pc-linux-uclibc ] ++ then ++ make all-gdb all-dejagnu all-ld || exit 1 ++ make install-gdb install-dejagnu install-ld || exit 1 + elif [ $H_REAL_TARGET = $H_REAL_HOST ] ; then + make bootstrap || exit 1 + make install || exit 1 +--- gcc-4.1.0/gcc/config/alpha/linux-elf.h ++++ gcc-4.1.0/gcc/config/alpha/linux-elf.h +@@ -27,7 +27,11 @@ Boston, MA 02110-1301, USA. */ + #define SUBTARGET_EXTRA_SPECS \ + { "elf_dynamic_linker", ELF_DYNAMIC_LINKER }, + ++#if defined USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else + #define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + + #define LINK_SPEC "-m elf64alpha %{G*} %{relax:-relax} \ + %{O*:-O3} %{!O*:-O1} \ +--- gcc-4.1.0/gcc/config/arm/linux-elf.h ++++ gcc-4.1.0/gcc/config/arm/linux-elf.h +@@ -51,7 +51,11 @@ + + #define LIBGCC_SPEC "%{msoft-float:-lfloat} %{mfloat-abi=soft*:-lfloat} -lgcc" + ++#ifdef USE_UCLIBC ++#define LINUX_TARGET_INTERPRETER "/lib/ld-uClibc.so.0" ++#else + #define LINUX_TARGET_INTERPRETER "/lib/ld-linux.so.2" ++#endif + + #define LINUX_TARGET_LINK_SPEC "%{h*} %{version:-v} \ + %{b} \ +--- gcc-4.1.0/gcc/config/cris/linux.h ++++ gcc-4.1.0/gcc/config/cris/linux.h +@@ -73,6 +73,25 @@ Boston, MA 02110-1301, USA. */ + #undef CRIS_DEFAULT_CPU_VERSION + #define CRIS_DEFAULT_CPU_VERSION CRIS_CPU_NG + ++#ifdef USE_UCLIBC ++ ++#undef CRIS_SUBTARGET_VERSION ++#define CRIS_SUBTARGET_VERSION " - cris-axis-linux-uclibc" ++ ++#undef CRIS_LINK_SUBTARGET_SPEC ++#define CRIS_LINK_SUBTARGET_SPEC \ ++ "-mcrislinux\ ++ -rpath-link include/asm/../..%s\ ++ %{shared} %{static}\ ++ %{symbolic:-Bdynamic} %{shlib:-Bdynamic} %{static:-Bstatic}\ ++ %{!shared: \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}} \ ++ %{!r:%{O2|O3: --gc-sections}}" ++ ++#else /* USE_UCLIBC */ ++ + #undef CRIS_SUBTARGET_VERSION + #define CRIS_SUBTARGET_VERSION " - cris-axis-linux-gnu" + +@@ -87,6 +106,8 @@ Boston, MA 02110-1301, USA. */ + %{!shared:%{!static:%{rdynamic:-export-dynamic}}}\ + %{!r:%{O2|O3: --gc-sections}}" + ++#endif /* USE_UCLIBC */ ++ + + /* Node: Run-time Target */ + +--- gcc-4.1.0/gcc/config/i386/linux.h ++++ gcc-4.1.0/gcc/config/i386/linux.h +@@ -107,6 +107,11 @@ Boston, MA 02110-1301, USA. */ + #define LINK_EMULATION "elf_i386" + #define DYNAMIC_LINKER "/lib/ld-linux.so.2" + ++#if defined USE_UCLIBC ++#undef DYNAMIC_LINKER ++#define DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#endif ++ + #undef SUBTARGET_EXTRA_SPECS + #define SUBTARGET_EXTRA_SPECS \ + { "link_emulation", LINK_EMULATION },\ +--- gcc-4.1.0/gcc/config/i386/linux64.h ++++ gcc-4.1.0/gcc/config/i386/linux64.h +@@ -54,14 +54,21 @@ Boston, MA 02110-1301, USA. */ + When the -shared link option is used a final link is not being + done. */ + ++#ifdef USE_UCLIBC ++#define ELF32_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0" ++#else ++#define ELF32_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#define ELF64_DYNAMIC_LINKER "/lib64/ld-linux-x86-64.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "%{!m32:-m elf_x86_64} %{m32:-m elf_i386} \ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{m32:%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ +- %{!m32:%{!dynamic-linker:-dynamic-linker /lib64/ld-linux-x86-64.so.2}}} \ ++ %{m32:%{!dynamic-linker:-dynamic-linker " ELF32_DYNAMIC_LINKER "}} \ ++ %{!m32:%{!dynamic-linker:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}} \ + %{static:-static}}" + + /* Similar to standard Linux, but adding -ffast-math support. */ +--- gcc-4.1.0/gcc/config/ia64/linux.h ++++ gcc-4.1.0/gcc/config/ia64/linux.h +@@ -37,13 +37,18 @@ do { \ + /* Define this for shared library support because it isn't in the main + linux.h file. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux-ia64.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "\ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux-ia64.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}" + + +--- gcc-4.1.0/gcc/config/m68k/linux.h ++++ gcc-4.1.0/gcc/config/m68k/linux.h +@@ -123,12 +123,17 @@ Boston, MA 02110-1301, USA. */ + + /* If ELF is the default format, we should not use /lib/elf. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "-m m68kelf %{shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker*:-dynamic-linker /lib/ld.so.1}} \ ++ %{!dynamic-linker*:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static}}" + + /* For compatibility with linux/a.out */ +--- gcc-4.1.0/gcc/config/mips/linux.h ++++ gcc-4.1.0/gcc/config/mips/linux.h +@@ -105,6 +105,11 @@ Boston, MA 02110-1301, USA. */ + + /* Borrowed from sparc/linux.h */ + #undef LINK_SPEC ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" ++#endif + #define LINK_SPEC \ + "%(endian_spec) \ + %{shared:-shared} \ +@@ -112,7 +117,7 @@ Boston, MA 02110-1301, USA. */ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}}" + + #undef SUBTARGET_ASM_SPEC +--- gcc-4.1.0/gcc/config/pa/pa-linux.h ++++ gcc-4.1.0/gcc/config/pa/pa-linux.h +@@ -49,13 +49,18 @@ Boston, MA 02110-1301, USA. */ + /* Define this for shared library support because it isn't in the main + linux.h file. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld.so.1" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "\ + %{shared:-shared} \ + %{!shared: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}" + + /* glibc's profiling functions don't need gcc to allocate counters. */ +--- gcc-4.1.0/gcc/config/rs6000/linux.h ++++ gcc-4.1.0/gcc/config/rs6000/linux.h +@@ -72,7 +72,11 @@ + #define LINK_START_DEFAULT_SPEC "%(link_start_linux)" + + #undef LINK_OS_DEFAULT_SPEC ++#ifdef USE_UCLIBC ++#define LINK_OS_DEFAULT_SPEC "%(link_os_linux_uclibc)" ++#else + #define LINK_OS_DEFAULT_SPEC "%(link_os_linux)" ++#endif + + #define LINK_GCC_C_SEQUENCE_SPEC \ + "%{static:--start-group} %G %L %{static:--end-group}%{!static:%G}" +--- gcc-4.1.0/gcc/config/rs6000/sysv4.h ++++ gcc-4.1.0/gcc/config/rs6000/sysv4.h +@@ -866,6 +866,7 @@ extern int fixuplabelno; + mcall-linux : %(link_os_linux) ; \ + mcall-gnu : %(link_os_gnu) ; \ + mcall-netbsd : %(link_os_netbsd) ; \ ++ mcall-linux-uclibc : %(link_os_linux_uclibc); \ + mcall-openbsd: %(link_os_openbsd) ; \ + : %(link_os_default) }" + +@@ -1043,6 +1044,10 @@ extern int fixuplabelno; + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}}}" + ++#define LINK_OS_LINUX_UCLIBC_SPEC "-m elf32ppclinux %{!shared: %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}}}" ++ + #if defined(HAVE_LD_EH_FRAME_HDR) + # define LINK_EH_SPEC "%{!static:--eh-frame-hdr} " + #endif +@@ -1209,6 +1214,7 @@ ncrtn.o%s" + { "link_os_sim", LINK_OS_SIM_SPEC }, \ + { "link_os_freebsd", LINK_OS_FREEBSD_SPEC }, \ + { "link_os_linux", LINK_OS_LINUX_SPEC }, \ ++ { "link_os_linux_uclibc", LINK_OS_LINUX_UCLIBC_SPEC }, \ + { "link_os_gnu", LINK_OS_GNU_SPEC }, \ + { "link_os_netbsd", LINK_OS_NETBSD_SPEC }, \ + { "link_os_openbsd", LINK_OS_OPENBSD_SPEC }, \ +--- gcc-4.1.0/gcc/config/s390/linux.h ++++ gcc-4.1.0/gcc/config/s390/linux.h +@@ -77,6 +77,13 @@ Software Foundation, 51 Franklin Street, + #define MULTILIB_DEFAULTS { "m31" } + #endif + ++#ifdef USE_UCLIBC ++#define ELF31_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#define ELF64_DYNAMIC_LINKER "/lib/ld64-uClibc.so.0" ++#else ++#define ELF31_DYNAMIC_LINKER "/lib/ld.so.1" ++#define ELF64_DYNAMIC_LINKER "/lib/ld64.so.1" ++#endif + #undef LINK_SPEC + #define LINK_SPEC \ + "%{m31:-m elf_s390}%{m64:-m elf64_s390} \ +@@ -86,8 +93,8 @@ Software Foundation, 51 Franklin Street, + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker: \ +- %{m31:-dynamic-linker /lib/ld.so.1} \ +- %{m64:-dynamic-linker /lib/ld64.so.1}}}}" ++ %{m31:-dynamic-linker " ELF31_DYNAMIC_LINKER "} \ ++ %{m64:-dynamic-linker " ELF64_DYNAMIC_LINKER "}}}}" + + + #define TARGET_ASM_FILE_END file_end_indicate_exec_stack +--- gcc-4.1.0/gcc/config/sh/linux.h ++++ gcc-4.1.0/gcc/config/sh/linux.h +@@ -56,12 +56,21 @@ Boston, MA 02110-1301, USA. */ + #undef SUBTARGET_LINK_EMUL_SUFFIX + #define SUBTARGET_LINK_EMUL_SUFFIX "_linux" + #undef SUBTARGET_LINK_SPEC ++#ifdef USE_UCLIBC ++#define SUBTARGET_LINK_SPEC \ ++ "%{shared:-shared} \ ++ %{!static: \ ++ %{rdynamic:-export-dynamic} \ ++ %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \ ++ %{static:-static}" ++#else + #define SUBTARGET_LINK_SPEC \ + "%{shared:-shared} \ + %{!static: \ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ + %{static:-static}" ++#endif + + /* Output assembler code to STREAM to call the profiler. */ + +--- gcc-4.1.0/gcc/config/sparc/linux.h ++++ gcc-4.1.0/gcc/config/sparc/linux.h +@@ -125,6 +125,11 @@ Boston, MA 02110-1301, USA. */ + + /* If ELF is the default format, we should not use /lib/elf. */ + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #undef LINK_SPEC + #define LINK_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ + %{!mno-relax:%{!r:-relax}} \ +@@ -132,7 +137,7 @@ Boston, MA 02110-1301, USA. */ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}}" + + /* The sun bundled assembler doesn't accept -Yd, (and neither does gas). +--- gcc-4.1.0/gcc/config/sparc/linux64.h ++++ gcc-4.1.0/gcc/config/sparc/linux64.h +@@ -162,12 +162,17 @@ Boston, MA 02110-1301, USA. */ + { "link_arch_default", LINK_ARCH_DEFAULT_SPEC }, \ + { "link_arch", LINK_ARCH_SPEC }, + ++#ifdef USE_UCLIBC ++#define ELF_DYNAMIC_LINKER "/lib/ld-uClibc.so.0" ++#else ++#define ELF_DYNAMIC_LINKER "/lib/ld-linux.so.2" ++#endif + #define LINK_ARCH32_SPEC "-m elf32_sparc -Y P,/usr/lib %{shared:-shared} \ + %{!shared: \ + %{!ibcs: \ + %{!static: \ + %{rdynamic:-export-dynamic} \ +- %{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \ ++ %{!dynamic-linker:-dynamic-linker " ELF_DYNAMIC_LINKER "}} \ + %{static:-static}}} \ + " + +--- gcc-4.1.0/libffi/configure ++++ gcc-4.1.0/libffi/configure +@@ -3457,6 +3457,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.1.0/libgfortran/configure ++++ gcc-4.1.0/libgfortran/configure +@@ -3699,6 +3699,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.1.0/libjava/configure ++++ gcc-4.1.0/libjava/configure +@@ -5137,6 +5137,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.1.0/libmudflap/configure ++++ gcc-4.1.0/libmudflap/configure +@@ -5382,6 +5382,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.1.0/libobjc/configure ++++ gcc-4.1.0/libobjc/configure +@@ -3312,6 +3312,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +--- gcc-4.1.0/libtool.m4 ++++ gcc-4.1.0/libtool.m4 +@@ -743,6 +743,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + [lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$'] +--- gcc-4.1.0/ltconfig ++++ gcc-4.1.0/ltconfig +@@ -603,6 +603,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)- + + # Transform linux* to *-*-linux-gnu*, to support old configure scripts. + case $host_os in ++linux-uclibc*) ;; + linux-gnu*) ;; + linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` + esac +@@ -1274,6 +1275,23 @@ linux-gnu*) + dynamic_linker='GNU/Linux ld.so' + ;; + ++linux-uclibc*) ++ version_type=linux ++ need_lib_prefix=no ++ need_version=no ++ library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' ++ soname_spec='${libname}${release}.so$major' ++ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' ++ shlibpath_var=LD_LIBRARY_PATH ++ shlibpath_overrides_runpath=no ++ # This implies no fast_install, which is unacceptable. ++ # Some rework will be needed to allow for fast_install ++ # before this can be enabled. ++ hardcode_into_libs=yes ++ # Assume using the uClibc dynamic linker. ++ dynamic_linker="uClibc ld.so" ++ ;; ++ + netbsd*) + need_lib_prefix=no + need_version=no +--- gcc-4.1.0/zlib/configure ++++ gcc-4.1.0/zlib/configure +@@ -3426,6 +3426,11 @@ linux-gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' diff --git a/patches/gcc/4.1.2/110-arm-eabi.patch b/patches/gcc/4.1.2/110-arm-eabi.patch new file mode 100644 index 00000000..acebe530 --- /dev/null +++ b/patches/gcc/4.1.2/110-arm-eabi.patch @@ -0,0 +1,27 @@ +--- gcc-2005q3-1.orig/gcc/config.gcc 2005-10-31 19:02:54.000000000 +0300 ++++ gcc-2005q3-1/gcc/config.gcc 2006-01-27 01:09:09.000000000 +0300 +@@ -674,7 +674,7 @@ + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h" + tmake_file="t-slibgcc-elf-ver t-linux arm/t-arm" + case ${target} in +- arm*-*-linux-gnueabi) ++ arm*-*-linux-gnueabi | arm*-*-linux-uclibcgnueabi) + tm_file="$tm_file arm/bpabi.h arm/linux-eabi.h" + tmake_file="$tmake_file arm/t-arm-elf arm/t-bpabi arm/t-linux-eabi" + # The BPABI long long divmod functions return a 128-bit value in + +diff -urN gcc-2005q3-2/gcc/config/arm/linux-eabi.h gcc-2005q3-2.new/gcc/config/arm/linux-eabi.h +--- gcc-2005q3-2/gcc/config/arm/linux-eabi.h 2005-12-07 23:14:16.000000000 +0300 ++++ gcc-2005q3-2.new/gcc/config/arm/linux-eabi.h 2006-03-29 19:02:34.000000000 +0400 +@@ -53,7 +53,11 @@ + /* Use ld-linux.so.3 so that it will be possible to run "classic" + GNU/Linux binaries on an EABI system. */ + #undef LINUX_TARGET_INTERPRETER ++#ifdef USE_UCLIBC ++#define LINUX_TARGET_INTERPRETER "/lib/ld-uClibc.so.0" ++#else + #define LINUX_TARGET_INTERPRETER "/lib/ld-linux.so.3" ++#endif + + /* At this point, bpabi.h will have clobbered LINK_SPEC. We want to + use the GNU/Linux version, not the generic BPABI version. */ diff --git a/patches/gcc/4.1.2/200-uclibc-locale.patch b/patches/gcc/4.1.2/200-uclibc-locale.patch new file mode 100644 index 00000000..e5d712e7 --- /dev/null +++ b/patches/gcc/4.1.2/200-uclibc-locale.patch @@ -0,0 +1,3239 @@ +--- gcc-4.1.0-dist/libstdc++-v3/acinclude.m4 ++++ gcc-4.1.0/libstdc++-v3/acinclude.m4 +@@ -1071,7 +1071,7 @@ + AC_MSG_CHECKING([for C locale to use]) + GLIBCXX_ENABLE(clocale,auto,[@<:@=MODEL@:>@], + [use MODEL for target locale package], +- [permit generic|gnu|ieee_1003.1-2001|yes|no|auto]) ++ [permit generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto]) + + # If they didn't use this option switch, or if they specified --enable + # with no specific model, we'll have to look for one. If they +@@ -1087,6 +1087,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case ${target_os} in ++ *-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) + AC_EGREP_CPP([_GLIBCXX_ok], [ + #include <features.h> +@@ -1230,6 +1233,40 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ AC_MSG_RESULT(uclibc) ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ AC_CHECK_PROG(check_msgfmt, msgfmt, yes, no) ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ AC_SUBST(glibcxx_MOFILES) ++ AC_SUBST(glibcxx_POFILES) ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c++locale_internal.h ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c++locale_internal.h +@@ -0,0 +1,63 @@ ++// Prototypes for GLIBC thread locale __-prefixed functions -*- C++ -*- ++ ++// Copyright (C) 2002, 2004, 2005 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// Written by Jakub Jelinek <jakub@redhat.com> ++ ++#include <bits/c++config.h> ++#include <clocale> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning clean this up ++#endif ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ ++extern "C" __typeof(nl_langinfo_l) __nl_langinfo_l; ++extern "C" __typeof(strcoll_l) __strcoll_l; ++extern "C" __typeof(strftime_l) __strftime_l; ++extern "C" __typeof(strtod_l) __strtod_l; ++extern "C" __typeof(strtof_l) __strtof_l; ++extern "C" __typeof(strtold_l) __strtold_l; ++extern "C" __typeof(strxfrm_l) __strxfrm_l; ++extern "C" __typeof(newlocale) __newlocale; ++extern "C" __typeof(freelocale) __freelocale; ++extern "C" __typeof(duplocale) __duplocale; ++extern "C" __typeof(uselocale) __uselocale; ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++extern "C" __typeof(iswctype_l) __iswctype_l; ++extern "C" __typeof(towlower_l) __towlower_l; ++extern "C" __typeof(towupper_l) __towupper_l; ++extern "C" __typeof(wcscoll_l) __wcscoll_l; ++extern "C" __typeof(wcsftime_l) __wcsftime_l; ++extern "C" __typeof(wcsxfrm_l) __wcsxfrm_l; ++extern "C" __typeof(wctype_l) __wctype_l; ++#endif ++ ++#endif // GLIBC 2.3 and later +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c_locale.cc +@@ -0,0 +1,152 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004, 2005 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <cerrno> // For errno ++#include <locale> ++#include <stdexcept> ++#include <langinfo.h> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strtol_l(S, E, B, L) strtol((S), (E), (B)) ++#define __strtoul_l(S, E, B, L) strtoul((S), (E), (B)) ++#define __strtoll_l(S, E, B, L) strtoll((S), (E), (B)) ++#define __strtoull_l(S, E, B, L) strtoull((S), (E), (B)) ++#define __strtof_l(S, E, L) strtof((S), (E)) ++#define __strtod_l(S, E, L) strtod((S), (E)) ++#define __strtold_l(S, E, L) strtold((S), (E)) ++#warning should dummy __newlocale check for C|POSIX ? ++#define __newlocale(a, b, c) NULL ++#define __freelocale(a) ((void)0) ++#define __duplocale(a) __c_locale() ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __convert_to_v(const char* __s, float& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ char* __sanity; ++ errno = 0; ++ float __f = __strtof_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __f; ++ else ++ __err |= ios_base::failbit; ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ char* __sanity; ++ errno = 0; ++ double __d = __strtod_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __d; ++ else ++ __err |= ios_base::failbit; ++ } ++ ++ template<> ++ void ++ __convert_to_v(const char* __s, long double& __v, ios_base::iostate& __err, ++ const __c_locale& __cloc) ++ { ++ char* __sanity; ++ errno = 0; ++ long double __ld = __strtold_l(__s, &__sanity, __cloc); ++ if (__sanity != __s && errno != ERANGE) ++ __v = __ld; ++ else ++ __err |= ios_base::failbit; ++ } ++ ++ void ++ locale::facet::_S_create_c_locale(__c_locale& __cloc, const char* __s, ++ __c_locale __old) ++ { ++ __cloc = __newlocale(1 << LC_ALL, __s, __old); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ if (!__cloc) ++ { ++ // This named locale is not supported by the underlying OS. ++ __throw_runtime_error(__N("locale::facet::_S_create_c_locale " ++ "name not valid")); ++ } ++#endif ++ } ++ ++ void ++ locale::facet::_S_destroy_c_locale(__c_locale& __cloc) ++ { ++ if (__cloc && _S_get_c_locale() != __cloc) ++ __freelocale(__cloc); ++ } ++ ++ __c_locale ++ locale::facet::_S_clone_c_locale(__c_locale& __cloc) ++ { return __duplocale(__cloc); } ++} // namespace std ++ ++namespace __gnu_cxx ++{ ++ const char* const category_names[6 + _GLIBCXX_NUM_CATEGORIES] = ++ { ++ "LC_CTYPE", ++ "LC_NUMERIC", ++ "LC_TIME", ++ "LC_COLLATE", ++ "LC_MONETARY", ++ "LC_MESSAGES", ++#if _GLIBCXX_NUM_CATEGORIES != 0 ++ "LC_PAPER", ++ "LC_NAME", ++ "LC_ADDRESS", ++ "LC_TELEPHONE", ++ "LC_MEASUREMENT", ++ "LC_IDENTIFICATION" ++#endif ++ }; ++} ++ ++namespace std ++{ ++ const char* const* const locale::_S_categories = __gnu_cxx::category_names; ++} // namespace std +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/c_locale.h ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/c_locale.h +@@ -0,0 +1,117 @@ ++// Wrapper for underlying C-language localization -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.8 Standard locale categories. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifndef _C_LOCALE_H ++#define _C_LOCALE_H 1 ++ ++#pragma GCC system_header ++ ++#include <cstring> // get std::strlen ++#include <cstdio> // get std::snprintf or std::sprintf ++#include <clocale> ++#include <langinfo.h> // For codecvt ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC_HAS_LOCALE__ ++#include <iconv.h> // For codecvt using iconv, iconv_t ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++#include <libintl.h> // For messages ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning what is _GLIBCXX_C_LOCALE_GNU for ++#endif ++#define _GLIBCXX_C_LOCALE_GNU 1 ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix categories ++#endif ++// #define _GLIBCXX_NUM_CATEGORIES 6 ++#define _GLIBCXX_NUM_CATEGORIES 0 ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++namespace __gnu_cxx ++{ ++ extern "C" __typeof(uselocale) __uselocale; ++} ++#endif ++ ++namespace std ++{ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ typedef __locale_t __c_locale; ++#else ++ typedef int* __c_locale; ++#endif ++ ++ // Convert numeric value of type _Tv to string and return length of ++ // string. If snprintf is available use it, otherwise fall back to ++ // the unsafe sprintf which, in general, can be dangerous and should ++ // be avoided. ++ template<typename _Tv> ++ int ++ __convert_from_v(char* __out, ++ const int __size __attribute__ ((__unused__)), ++ const char* __fmt, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ _Tv __v, const __c_locale& __cloc, int __prec) ++ { ++ __c_locale __old = __gnu_cxx::__uselocale(__cloc); ++#else ++ _Tv __v, const __c_locale&, int __prec) ++ { ++# ifdef __UCLIBC_HAS_LOCALE__ ++ char* __old = std::setlocale(LC_ALL, NULL); ++ char* __sav = new char[std::strlen(__old) + 1]; ++ std::strcpy(__sav, __old); ++ std::setlocale(LC_ALL, "C"); ++# endif ++#endif ++ ++ const int __ret = std::snprintf(__out, __size, __fmt, __prec, __v); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __gnu_cxx::__uselocale(__old); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ std::setlocale(LC_ALL, __sav); ++ delete [] __sav; ++#endif ++ return __ret; ++ } ++} ++ ++#endif +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/codecvt_members.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/codecvt_members.cc +@@ -0,0 +1,306 @@ ++// std::codecvt implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.5 - Template class codecvt ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++namespace std ++{ ++ // Specializations. ++#ifdef _GLIBCXX_USE_WCHAR_T ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_out(state_type& __state, const intern_type* __from, ++ const intern_type* __from_end, const intern_type*& __from_next, ++ extern_type* __to, extern_type* __to_end, ++ extern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // wcsnrtombs is *very* fast but stops if encounters NUL characters: ++ // in case we fall back to wcrtomb and then continue, in a loop. ++ // NB: wcsnrtombs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const intern_type* __from_chunk_end = wmemchr(__from_next, L'\0', ++ __from_end - __from_next); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ const size_t __conv = wcsnrtombs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // wcrtomb. ++ for (; __from < __from_next; ++__from) ++ __to_next += wcrtomb(__to_next, *__from, &__tmp_state); ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ extern_type __buf[MB_LEN_MAX]; ++ __tmp_state = __state; ++ const size_t __conv = wcrtomb(__buf, *__from_next, &__tmp_state); ++ if (__conv > static_cast<size_t>(__to_end - __to_next)) ++ __ret = partial; ++ else ++ { ++ memcpy(__to_next, __buf, __conv); ++ __state = __tmp_state; ++ __to_next += __conv; ++ ++__from_next; ++ } ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ codecvt_base::result ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_in(state_type& __state, const extern_type* __from, ++ const extern_type* __from_end, const extern_type*& __from_next, ++ intern_type* __to, intern_type* __to_end, ++ intern_type*& __to_next) const ++ { ++ result __ret = ok; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we store a L'\0' and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ for (__from_next = __from, __to_next = __to; ++ __from_next < __from_end && __to_next < __to_end ++ && __ret == ok;) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from_next, '\0', ++ __from_end ++ - __from_next)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __from_end; ++ ++ __from = __from_next; ++ size_t __conv = mbsnrtowcs(__to_next, &__from_next, ++ __from_chunk_end - __from_next, ++ __to_end - __to_next, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (;; ++__to_next, __from += __conv) ++ { ++ __conv = mbrtowc(__to_next, __from, __from_end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __from_next = __from; ++ __state = __tmp_state; ++ __ret = error; ++ } ++ else if (__from_next && __from_next < __from_chunk_end) ++ { ++ // It is unclear what to return in this case (see DR 382). ++ __to_next += __conv; ++ __ret = partial; ++ } ++ else ++ { ++ __from_next = __from_chunk_end; ++ __to_next += __conv; ++ } ++ ++ if (__from_next < __from_end && __ret == ok) ++ { ++ if (__to_next < __to_end) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from_next; ++ *__to_next++ = L'\0'; ++ } ++ else ++ __ret = partial; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_encoding() const throw() ++ { ++ // XXX This implementation assumes that the encoding is ++ // stateless and is either single-byte or variable-width. ++ int __ret = 0; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ if (MB_CUR_MAX == 1) ++ __ret = 1; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_max_length() const throw() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ // XXX Probably wrong for stateful encodings. ++ int __ret = MB_CUR_MAX; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __ret; ++ } ++ ++ int ++ codecvt<wchar_t, char, mbstate_t>:: ++ do_length(state_type& __state, const extern_type* __from, ++ const extern_type* __end, size_t __max) const ++ { ++ int __ret = 0; ++ state_type __tmp_state(__state); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_codecvt); ++#endif ++ ++ // mbsnrtowcs is *very* fast but stops if encounters NUL characters: ++ // in case we advance past it and then continue, in a loop. ++ // NB: mbsnrtowcs is a GNU extension ++ ++ // A dummy internal buffer is needed in order for mbsnrtocws to consider ++ // its fourth parameter (it wouldn't with NULL as first parameter). ++ wchar_t* __to = static_cast<wchar_t*>(__builtin_alloca(sizeof(wchar_t) ++ * __max)); ++ while (__from < __end && __max) ++ { ++ const extern_type* __from_chunk_end; ++ __from_chunk_end = static_cast<const extern_type*>(memchr(__from, '\0', ++ __end ++ - __from)); ++ if (!__from_chunk_end) ++ __from_chunk_end = __end; ++ ++ const extern_type* __tmp_from = __from; ++ size_t __conv = mbsnrtowcs(__to, &__from, ++ __from_chunk_end - __from, ++ __max, &__state); ++ if (__conv == static_cast<size_t>(-1)) ++ { ++ // In case of error, in order to stop at the exact place we ++ // have to start again from the beginning with a series of ++ // mbrtowc. ++ for (__from = __tmp_from;; __from += __conv) ++ { ++ __conv = mbrtowc(NULL, __from, __end - __from, ++ &__tmp_state); ++ if (__conv == static_cast<size_t>(-1) ++ || __conv == static_cast<size_t>(-2)) ++ break; ++ } ++ __state = __tmp_state; ++ __ret += __from - __tmp_from; ++ break; ++ } ++ if (!__from) ++ __from = __from_chunk_end; ++ ++ __ret += __from - __tmp_from; ++ __max -= __conv; ++ ++ if (__from < __end && __max) ++ { ++ // XXX Probably wrong for stateful encodings ++ __tmp_state = __state; ++ ++__from; ++ ++__ret; ++ --__max; ++ } ++ } ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ ++ return __ret; ++ } ++#endif ++} +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/collate_members.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/collate_members.cc +@@ -0,0 +1,80 @@ ++// std::collate implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.4.1.2 collate virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __strcoll_l(S1, S2, L) strcoll((S1), (S2)) ++#define __strxfrm_l(S1, S2, N, L) strxfrm((S1), (S2), (N)) ++#define __wcscoll_l(S1, S2, L) wcscoll((S1), (S2)) ++#define __wcsxfrm_l(S1, S2, N, L) wcsxfrm((S1), (S2), (N)) ++#endif ++ ++namespace std ++{ ++ // These are basically extensions to char_traits, and perhaps should ++ // be put there instead of here. ++ template<> ++ int ++ collate<char>::_M_compare(const char* __one, const char* __two) const ++ { ++ int __cmp = __strcoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<char>::_M_transform(char* __to, const char* __from, ++ size_t __n) const ++ { return __strxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ int ++ collate<wchar_t>::_M_compare(const wchar_t* __one, ++ const wchar_t* __two) const ++ { ++ int __cmp = __wcscoll_l(__one, __two, _M_c_locale_collate); ++ return (__cmp >> (8 * sizeof (int) - 2)) | (__cmp != 0); ++ } ++ ++ template<> ++ size_t ++ collate<wchar_t>::_M_transform(wchar_t* __to, const wchar_t* __from, ++ size_t __n) const ++ { return __wcsxfrm_l(__to, __from, __n, _M_c_locale_collate); } ++#endif ++} +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/ctype_members.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/ctype_members.cc +@@ -0,0 +1,314 @@ ++// std::ctype implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __wctype_l(S, L) wctype((S)) ++#define __towupper_l(C, L) towupper((C)) ++#define __towlower_l(C, L) towlower((C)) ++#define __iswctype_l(C, M, L) iswctype((C), (M)) ++#endif ++ ++namespace std ++{ ++ // NB: The other ctype<char> specializations are in src/locale.cc and ++ // various /config/os/* files. ++ template<> ++ ctype_byname<char>::ctype_byname(const char* __s, size_t __refs) ++ : ctype<char>(0, false, __refs) ++ { ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_ctype); ++ this->_S_create_c_locale(this->_M_c_locale_ctype, __s); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; ++ this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; ++ this->_M_table = this->_M_c_locale_ctype->__ctype_b; ++#endif ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ ctype<wchar_t>::__wmask_type ++ ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const ++ { ++ __wmask_type __ret; ++ switch (__m) ++ { ++ case space: ++ __ret = __wctype_l("space", _M_c_locale_ctype); ++ break; ++ case print: ++ __ret = __wctype_l("print", _M_c_locale_ctype); ++ break; ++ case cntrl: ++ __ret = __wctype_l("cntrl", _M_c_locale_ctype); ++ break; ++ case upper: ++ __ret = __wctype_l("upper", _M_c_locale_ctype); ++ break; ++ case lower: ++ __ret = __wctype_l("lower", _M_c_locale_ctype); ++ break; ++ case alpha: ++ __ret = __wctype_l("alpha", _M_c_locale_ctype); ++ break; ++ case digit: ++ __ret = __wctype_l("digit", _M_c_locale_ctype); ++ break; ++ case punct: ++ __ret = __wctype_l("punct", _M_c_locale_ctype); ++ break; ++ case xdigit: ++ __ret = __wctype_l("xdigit", _M_c_locale_ctype); ++ break; ++ case alnum: ++ __ret = __wctype_l("alnum", _M_c_locale_ctype); ++ break; ++ case graph: ++ __ret = __wctype_l("graph", _M_c_locale_ctype); ++ break; ++ default: ++ __ret = __wmask_type(); ++ } ++ return __ret; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_toupper(wchar_t __c) const ++ { return __towupper_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_toupper(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towupper_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ wchar_t ++ ctype<wchar_t>::do_tolower(wchar_t __c) const ++ { return __towlower_l(__c, _M_c_locale_ctype); } ++ ++ const wchar_t* ++ ctype<wchar_t>::do_tolower(wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi) ++ { ++ *__lo = __towlower_l(*__lo, _M_c_locale_ctype); ++ ++__lo; ++ } ++ return __hi; ++ } ++ ++ bool ++ ctype<wchar_t>:: ++ do_is(mask __m, wchar_t __c) const ++ { ++ // The case of __m == ctype_base::space is particularly important, ++ // due to its use in many istream functions. Therefore we deal with ++ // it first, exploiting the knowledge that on GNU systems _M_bit[5] ++ // is the mask corresponding to ctype_base::space. NB: an encoding ++ // change would not affect correctness! ++ bool __ret = false; ++ if (__m == _M_bit[5]) ++ __ret = __iswctype_l(__c, _M_wmask[5], _M_c_locale_ctype); ++ else ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__m & _M_bit[__bitcur]) ++ { ++ if (__iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ { ++ __ret = true; ++ break; ++ } ++ else if (__m == _M_bit[__bitcur]) ++ break; ++ } ++ } ++ return __ret; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const ++ { ++ for (; __lo < __hi; ++__vec, ++__lo) ++ { ++ // Highest bitmask in ctype_base == 10, but extra in "C" ++ // library for blank. ++ const size_t __bitmasksize = 11; ++ mask __m = 0; ++ for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) ++ if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) ++ __m |= _M_bit[__bitcur]; ++ *__vec = __m; ++ } ++ return __hi; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const ++ { ++ while (__lo < __hi && !this->do_is(__m, *__lo)) ++ ++__lo; ++ return __lo; ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const ++ { ++ while (__lo < __hi && this->do_is(__m, *__lo) != 0) ++ ++__lo; ++ return __lo; ++ } ++ ++ wchar_t ++ ctype<wchar_t>:: ++ do_widen(char __c) const ++ { return _M_widen[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<wchar_t>:: ++ do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const ++ { ++ while (__lo < __hi) ++ { ++ *__dest = _M_widen[static_cast<unsigned char>(*__lo)]; ++ ++__lo; ++ ++__dest; ++ } ++ return __hi; ++ } ++ ++ char ++ ctype<wchar_t>:: ++ do_narrow(wchar_t __wc, char __dfault) const ++ { ++ if (__wc >= 0 && __wc < 128 && _M_narrow_ok) ++ return _M_narrow[__wc]; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ const int __c = wctob(__wc); ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++ const wchar_t* ++ ctype<wchar_t>:: ++ do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault, ++ char* __dest) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ if (_M_narrow_ok) ++ while (__lo < __hi) ++ { ++ if (*__lo >= 0 && *__lo < 128) ++ *__dest = _M_narrow[*__lo]; ++ else ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ } ++ ++__lo; ++ ++__dest; ++ } ++ else ++ while (__lo < __hi) ++ { ++ const int __c = wctob(*__lo); ++ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c)); ++ ++__lo; ++ ++__dest; ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ return __hi; ++ } ++ ++ void ++ ctype<wchar_t>::_M_initialize_ctype() ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_ctype); ++#endif ++ wint_t __i; ++ for (__i = 0; __i < 128; ++__i) ++ { ++ const int __c = wctob(__i); ++ if (__c == EOF) ++ break; ++ else ++ _M_narrow[__i] = static_cast<char>(__c); ++ } ++ if (__i == 128) ++ _M_narrow_ok = true; ++ else ++ _M_narrow_ok = false; ++ for (size_t __j = 0; ++ __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) ++ _M_widen[__j] = btowc(__j); ++ ++ for (size_t __k = 0; __k <= 11; ++__k) ++ { ++ _M_bit[__k] = static_cast<mask>(_ISbit(__k)); ++ _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); ++ } ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#endif ++ } ++#endif // _GLIBCXX_USE_WCHAR_T ++} +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/messages_members.cc +@@ -0,0 +1,100 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix gettext stuff ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__dcgettext(const char *domainname, ++ const char *msgid, int category); ++#undef gettext ++#define gettext(msgid) __dcgettext(NULL, msgid, LC_MESSAGES) ++#else ++#undef gettext ++#define gettext(msgid) (msgid) ++#endif ++ ++namespace std ++{ ++ // Specializations. ++ template<> ++ string ++ messages<char>::do_get(catalog, int, int, const string& __dfault) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ const char* __msg = const_cast<const char*>(gettext(__dfault.c_str())); ++ __uselocale(__old); ++ return string(__msg); ++#elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ const char* __msg = gettext(__dfault.c_str()); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return string(__msg); ++#else ++ const char* __msg = gettext(__dfault.c_str()); ++ return string(__msg); ++#endif ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ wstring ++ messages<wchar_t>::do_get(catalog, int, int, const wstring& __dfault) const ++ { ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(_M_c_locale_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ __uselocale(__old); ++ return _M_convert_from_char(__msg); ++# elif defined __UCLIBC_HAS_LOCALE__ ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_messages); ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ setlocale(LC_ALL, __old); ++ free(__old); ++ return _M_convert_from_char(__msg); ++# else ++ char* __msg = gettext(_M_convert_to_char(__dfault)); ++ return _M_convert_from_char(__msg); ++# endif ++ } ++#endif ++} +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/messages_members.h ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/messages_members.h +@@ -0,0 +1,121 @@ ++// std::messages implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.7.1.2 messages functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix prototypes for *textdomain funcs ++#endif ++#ifdef __UCLIBC_HAS_GETTEXT_AWARENESS__ ++extern "C" char *__textdomain(const char *domainname); ++extern "C" char *__bindtextdomain(const char *domainname, ++ const char *dirname); ++#else ++#undef __textdomain ++#undef __bindtextdomain ++#define __textdomain(D) ((void)0) ++#define __bindtextdomain(D,P) ((void)0) ++#endif ++ ++ // Non-virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::messages(size_t __refs) ++ : facet(__refs), _M_c_locale_messages(_S_get_c_locale()), ++ _M_name_messages(_S_get_c_name()) ++ { } ++ ++ template<typename _CharT> ++ messages<_CharT>::messages(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_messages(NULL), _M_name_messages(NULL) ++ { ++ const size_t __len = std::strlen(__s) + 1; ++ char* __tmp = new char[__len]; ++ std::memcpy(__tmp, __s, __len); ++ _M_name_messages = __tmp; ++ ++ // Last to avoid leaking memory if new throws. ++ _M_c_locale_messages = _S_clone_c_locale(__cloc); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::open(const basic_string<char>& __s, const locale& __loc, ++ const char* __dir) const ++ { ++ __bindtextdomain(__s.c_str(), __dir); ++ return this->do_open(__s, __loc); ++ } ++ ++ // Virtual member functions. ++ template<typename _CharT> ++ messages<_CharT>::~messages() ++ { ++ if (_M_name_messages != _S_get_c_name()) ++ delete [] _M_name_messages; ++ _S_destroy_c_locale(_M_c_locale_messages); ++ } ++ ++ template<typename _CharT> ++ typename messages<_CharT>::catalog ++ messages<_CharT>::do_open(const basic_string<char>& __s, ++ const locale&) const ++ { ++ // No error checking is done, assume the catalog exists and can ++ // be used. ++ __textdomain(__s.c_str()); ++ return 0; ++ } ++ ++ template<typename _CharT> ++ void ++ messages<_CharT>::do_close(catalog) const ++ { } ++ ++ // messages_byname ++ template<typename _CharT> ++ messages_byname<_CharT>::messages_byname(const char* __s, size_t __refs) ++ : messages<_CharT>(__refs) ++ { ++ if (this->_M_name_messages != locale::facet::_S_get_c_name()) ++ delete [] this->_M_name_messages; ++ char* __tmp = new char[std::strlen(__s) + 1]; ++ std::strcpy(__tmp, __s); ++ this->_M_name_messages = __tmp; ++ ++ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0) ++ { ++ this->_S_destroy_c_locale(this->_M_c_locale_messages); ++ this->_S_create_c_locale(this->_M_c_locale_messages, __s); ++ } ++ } +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/monetary_members.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/monetary_members.cc +@@ -0,0 +1,692 @@ ++// std::moneypunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.6.3.2 moneypunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning optimize this for uclibc ++#warning tailor for stub locale support ++#endif ++ ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ // Construct and return valid pattern consisting of some combination of: ++ // space none symbol sign value ++ money_base::pattern ++ money_base::_S_construct_pattern(char __precedes, char __space, char __posn) ++ { ++ pattern __ret; ++ ++ // This insanely complicated routine attempts to construct a valid ++ // pattern for use with monyepunct. A couple of invariants: ++ ++ // if (__precedes) symbol -> value ++ // else value -> symbol ++ ++ // if (__space) space ++ // else none ++ ++ // none == never first ++ // space never first or last ++ ++ // Any elegant implementations of this are welcome. ++ switch (__posn) ++ { ++ case 0: ++ case 1: ++ // 1 The sign precedes the value and symbol. ++ __ret.field[0] = sign; ++ if (__space) ++ { ++ // Pattern starts with sign. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[3] = symbol; ++ } ++ __ret.field[2] = space; ++ } ++ else ++ { ++ // Pattern starts with sign and ends with none. ++ if (__precedes) ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[1] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[3] = none; ++ } ++ break; ++ case 2: ++ // 2 The sign follows the value and symbol. ++ if (__space) ++ { ++ // Pattern either ends with sign. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[2] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[2] = symbol; ++ } ++ __ret.field[1] = space; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ // Pattern ends with sign then none. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = value; ++ } ++ else ++ { ++ __ret.field[0] = value; ++ __ret.field[1] = symbol; ++ } ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ break; ++ case 3: ++ // 3 The sign immediately precedes the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = sign; ++ __ret.field[1] = symbol; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = sign; ++ __ret.field[3] = symbol; ++ } ++ else ++ { ++ __ret.field[1] = sign; ++ __ret.field[2] = symbol; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ case 4: ++ // 4 The sign immediately follows the symbol. ++ if (__precedes) ++ { ++ __ret.field[0] = symbol; ++ __ret.field[1] = sign; ++ if (__space) ++ { ++ __ret.field[2] = space; ++ __ret.field[3] = value; ++ } ++ else ++ { ++ __ret.field[2] = value; ++ __ret.field[3] = none; ++ } ++ } ++ else ++ { ++ __ret.field[0] = value; ++ if (__space) ++ { ++ __ret.field[1] = space; ++ __ret.field[2] = symbol; ++ __ret.field[3] = sign; ++ } ++ else ++ { ++ __ret.field[1] = symbol; ++ __ret.field[2] = sign; ++ __ret.field[3] = none; ++ } ++ } ++ break; ++ default: ++ __ret = pattern(); ++ } ++ return __ret; ++ } ++ ++ template<> ++ void ++ moneypunct<char, true>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == true ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<char, false>::_M_initialize_moneypunct(__c_locale __cloc, ++ const char*) ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<char, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = ""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = ""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = ""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = money_base::_S_atoms[__i]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(__MON_DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(__MON_THOUSANDS_SEP, ++ __cloc)); ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ _M_data->_M_positive_sign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ _M_data->_M_positive_sign_size = strlen(_M_data->_M_positive_sign); ++ ++ char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ if (!__nposn) ++ _M_data->_M_negative_sign = "()"; ++ else ++ _M_data->_M_negative_sign = __nl_langinfo_l(__NEGATIVE_SIGN, ++ __cloc); ++ _M_data->_M_negative_sign_size = strlen(_M_data->_M_negative_sign); ++ ++ // _Intl == false ++ _M_data->_M_curr_symbol = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ _M_data->_M_curr_symbol_size = strlen(_M_data->_M_curr_symbol); ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ } ++ } ++ ++ template<> ++ moneypunct<char, true>::~moneypunct() ++ { delete _M_data; } ++ ++ template<> ++ moneypunct<char, false>::~moneypunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ moneypunct<wchar_t, true>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, true>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = ++ static_cast<wchar_t>(money_base::_S_atoms[__i]); ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# elif defined __UCLIBC_HAS_LOCALE__ ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__INT_CURR_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__INT_N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__INT_FRAC_DIGITS, ++ __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__INT_P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__INT_P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__INT_P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__INT_N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__INT_N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ void ++ moneypunct<wchar_t, false>::_M_initialize_moneypunct(__c_locale __cloc, ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const char*) ++#else ++ const char* __name) ++#endif ++ { ++ if (!_M_data) ++ _M_data = new __moneypunct_cache<wchar_t, false>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = 0; ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = 0; ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = 0; ++ _M_data->_M_frac_digits = 0; ++ _M_data->_M_pos_format = money_base::_S_default_pattern; ++ _M_data->_M_neg_format = money_base::_S_default_pattern; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < money_base::_S_end; ++__i) ++ _M_data->_M_atoms[__i] = ++ static_cast<wchar_t>(money_base::_S_atoms[__i]); ++ } ++ else ++ { ++ // Named locale. ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __c_locale __old = __uselocale(__cloc); ++#else ++ // Switch to named locale so that mbsrtowcs will work. ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, __name); ++#endif ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this... should be monetary ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# elif defined __UCLIBC_HAS_LOCALE__ ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_MONETARY_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ _M_data->_M_grouping = __nl_langinfo_l(__MON_GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ ++ const char* __cpossign = __nl_langinfo_l(__POSITIVE_SIGN, __cloc); ++ const char* __cnegsign = __nl_langinfo_l(__NEGATIVE_SIGN, __cloc); ++ const char* __ccurr = __nl_langinfo_l(__CURRENCY_SYMBOL, __cloc); ++ ++ wchar_t* __wcs_ps = 0; ++ wchar_t* __wcs_ns = 0; ++ const char __nposn = *(__nl_langinfo_l(__N_SIGN_POSN, __cloc)); ++ try ++ { ++ mbstate_t __state; ++ size_t __len; ++ __len = strlen(__cpossign); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ps = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ps, &__cpossign, __len, &__state); ++ _M_data->_M_positive_sign = __wcs_ps; ++ } ++ else ++ _M_data->_M_positive_sign = L""; ++ _M_data->_M_positive_sign_size = wcslen(_M_data->_M_positive_sign); ++ ++ __len = strlen(__cnegsign); ++ if (!__nposn) ++ _M_data->_M_negative_sign = L"()"; ++ else if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ __wcs_ns = new wchar_t[__len]; ++ mbsrtowcs(__wcs_ns, &__cnegsign, __len, &__state); ++ _M_data->_M_negative_sign = __wcs_ns; ++ } ++ else ++ _M_data->_M_negative_sign = L""; ++ _M_data->_M_negative_sign_size = wcslen(_M_data->_M_negative_sign); ++ ++ // _Intl == true. ++ __len = strlen(__ccurr); ++ if (__len) ++ { ++ ++__len; ++ memset(&__state, 0, sizeof(mbstate_t)); ++ wchar_t* __wcs = new wchar_t[__len]; ++ mbsrtowcs(__wcs, &__ccurr, __len, &__state); ++ _M_data->_M_curr_symbol = __wcs; ++ } ++ else ++ _M_data->_M_curr_symbol = L""; ++ _M_data->_M_curr_symbol_size = wcslen(_M_data->_M_curr_symbol); ++ } ++ catch (...) ++ { ++ delete _M_data; ++ _M_data = 0; ++ delete __wcs_ps; ++ delete __wcs_ns; ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ __throw_exception_again; ++ } ++ ++ _M_data->_M_frac_digits = *(__nl_langinfo_l(__FRAC_DIGITS, __cloc)); ++ char __pprecedes = *(__nl_langinfo_l(__P_CS_PRECEDES, __cloc)); ++ char __pspace = *(__nl_langinfo_l(__P_SEP_BY_SPACE, __cloc)); ++ char __pposn = *(__nl_langinfo_l(__P_SIGN_POSN, __cloc)); ++ _M_data->_M_pos_format = _S_construct_pattern(__pprecedes, __pspace, ++ __pposn); ++ char __nprecedes = *(__nl_langinfo_l(__N_CS_PRECEDES, __cloc)); ++ char __nspace = *(__nl_langinfo_l(__N_SEP_BY_SPACE, __cloc)); ++ _M_data->_M_neg_format = _S_construct_pattern(__nprecedes, __nspace, ++ __nposn); ++ ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __uselocale(__old); ++#else ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ } ++ } ++ ++ template<> ++ moneypunct<wchar_t, true>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++ ++ template<> ++ moneypunct<wchar_t, false>::~moneypunct() ++ { ++ if (_M_data->_M_positive_sign_size) ++ delete [] _M_data->_M_positive_sign; ++ if (_M_data->_M_negative_sign_size ++ && wcscmp(_M_data->_M_negative_sign, L"()") != 0) ++ delete [] _M_data->_M_negative_sign; ++ if (_M_data->_M_curr_symbol_size) ++ delete [] _M_data->_M_curr_symbol; ++ delete _M_data; ++ } ++#endif ++} +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/numeric_members.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/numeric_members.cc +@@ -0,0 +1,173 @@ ++// std::numpunct implementation details, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.3.1.2 numpunct virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#define _LIBC ++#include <locale> ++#undef _LIBC ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ numpunct<char>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = '.'; ++ _M_data->_M_thousands_sep = ','; ++ ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = __num_base::_S_atoms_out[__i]; ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = __num_base::_S_atoms_in[__j]; ++ } ++ else ++ { ++ // Named locale. ++ _M_data->_M_decimal_point = *(__nl_langinfo_l(DECIMAL_POINT, ++ __cloc)); ++ _M_data->_M_thousands_sep = *(__nl_langinfo_l(THOUSANDS_SEP, ++ __cloc)); ++ ++ // Check for NULL, which implies no grouping. ++ if (_M_data->_M_thousands_sep == '\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = "true"; ++ _M_data->_M_truename_size = 4; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = "false"; ++ _M_data->_M_falsename_size = 5; ++ } ++ ++ template<> ++ numpunct<char>::~numpunct() ++ { delete _M_data; } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ numpunct<wchar_t>::_M_initialize_numpunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __numpunct_cache<wchar_t>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_data->_M_grouping = ""; ++ _M_data->_M_grouping_size = 0; ++ _M_data->_M_use_grouping = false; ++ ++ _M_data->_M_decimal_point = L'.'; ++ _M_data->_M_thousands_sep = L','; ++ ++ // Use ctype::widen code without the facet... ++ for (size_t __i = 0; __i < __num_base::_S_oend; ++__i) ++ _M_data->_M_atoms_out[__i] = ++ static_cast<wchar_t>(__num_base::_S_atoms_out[__i]); ++ ++ for (size_t __j = 0; __j < __num_base::_S_iend; ++__j) ++ _M_data->_M_atoms_in[__j] = ++ static_cast<wchar_t>(__num_base::_S_atoms_in[__j]); ++ } ++ else ++ { ++ // Named locale. ++ // NB: In the GNU model wchar_t is always 32 bit wide. ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning fix this ++#endif ++#ifdef __UCLIBC__ ++# ifdef __UCLIBC_HAS_XLOCALE__ ++ _M_data->_M_decimal_point = __cloc->decimal_point_wc; ++ _M_data->_M_thousands_sep = __cloc->thousands_sep_wc; ++# elif defined __UCLIBC_HAS_LOCALE__ ++ _M_data->_M_decimal_point = __global_locale->decimal_point_wc; ++ _M_data->_M_thousands_sep = __global_locale->thousands_sep_wc; ++# endif ++#else ++ union { char *__s; wchar_t __w; } __u; ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_DECIMAL_POINT_WC, __cloc); ++ _M_data->_M_decimal_point = __u.__w; ++ ++ __u.__s = __nl_langinfo_l(_NL_NUMERIC_THOUSANDS_SEP_WC, __cloc); ++ _M_data->_M_thousands_sep = __u.__w; ++#endif ++ ++ if (_M_data->_M_thousands_sep == L'\0') ++ _M_data->_M_grouping = ""; ++ else ++ _M_data->_M_grouping = __nl_langinfo_l(GROUPING, __cloc); ++ _M_data->_M_grouping_size = strlen(_M_data->_M_grouping); ++ } ++ ++ // NB: There is no way to extact this info from posix locales. ++ // _M_truename = __nl_langinfo_l(YESSTR, __cloc); ++ _M_data->_M_truename = L"true"; ++ _M_data->_M_truename_size = 4; ++ // _M_falsename = __nl_langinfo_l(NOSTR, __cloc); ++ _M_data->_M_falsename = L"false"; ++ _M_data->_M_falsename_size = 5; ++ } ++ ++ template<> ++ numpunct<wchar_t>::~numpunct() ++ { delete _M_data; } ++ #endif ++} +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/time_members.cc ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/time_members.cc +@@ -0,0 +1,406 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get virtual functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put virtual functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++#include <locale> ++#include <bits/c++locale_internal.h> ++ ++#ifdef __UCLIBC_MJN3_ONLY__ ++#warning tailor for stub locale support ++#endif ++#ifndef __UCLIBC_HAS_XLOCALE__ ++#define __nl_langinfo_l(N, L) nl_langinfo((N)) ++#endif ++ ++namespace std ++{ ++ template<> ++ void ++ __timepunct<char>:: ++ _M_put(char* __s, size_t __maxlen, const char* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ const size_t __len = __strftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = strftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = '\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<char>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<char>; ++ ++ if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = "%m/%d/%y"; ++ _M_data->_M_date_era_format = "%m/%d/%y"; ++ _M_data->_M_time_format = "%H:%M:%S"; ++ _M_data->_M_time_era_format = "%H:%M:%S"; ++ _M_data->_M_date_time_format = ""; ++ _M_data->_M_date_time_era_format = ""; ++ _M_data->_M_am = "AM"; ++ _M_data->_M_pm = "PM"; ++ _M_data->_M_am_pm_format = ""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = "Sunday"; ++ _M_data->_M_day2 = "Monday"; ++ _M_data->_M_day3 = "Tuesday"; ++ _M_data->_M_day4 = "Wednesday"; ++ _M_data->_M_day5 = "Thursday"; ++ _M_data->_M_day6 = "Friday"; ++ _M_data->_M_day7 = "Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = "Sun"; ++ _M_data->_M_aday2 = "Mon"; ++ _M_data->_M_aday3 = "Tue"; ++ _M_data->_M_aday4 = "Wed"; ++ _M_data->_M_aday5 = "Thu"; ++ _M_data->_M_aday6 = "Fri"; ++ _M_data->_M_aday7 = "Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = "January"; ++ _M_data->_M_month02 = "February"; ++ _M_data->_M_month03 = "March"; ++ _M_data->_M_month04 = "April"; ++ _M_data->_M_month05 = "May"; ++ _M_data->_M_month06 = "June"; ++ _M_data->_M_month07 = "July"; ++ _M_data->_M_month08 = "August"; ++ _M_data->_M_month09 = "September"; ++ _M_data->_M_month10 = "October"; ++ _M_data->_M_month11 = "November"; ++ _M_data->_M_month12 = "December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = "Jan"; ++ _M_data->_M_amonth02 = "Feb"; ++ _M_data->_M_amonth03 = "Mar"; ++ _M_data->_M_amonth04 = "Apr"; ++ _M_data->_M_amonth05 = "May"; ++ _M_data->_M_amonth06 = "Jun"; ++ _M_data->_M_amonth07 = "Jul"; ++ _M_data->_M_amonth08 = "Aug"; ++ _M_data->_M_amonth09 = "Sep"; ++ _M_data->_M_amonth10 = "Oct"; ++ _M_data->_M_amonth11 = "Nov"; ++ _M_data->_M_amonth12 = "Dec"; ++ } ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ _M_data->_M_date_format = __nl_langinfo_l(D_FMT, __cloc); ++ _M_data->_M_date_era_format = __nl_langinfo_l(ERA_D_FMT, __cloc); ++ _M_data->_M_time_format = __nl_langinfo_l(T_FMT, __cloc); ++ _M_data->_M_time_era_format = __nl_langinfo_l(ERA_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __nl_langinfo_l(D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __nl_langinfo_l(ERA_D_T_FMT, ++ __cloc); ++ _M_data->_M_am = __nl_langinfo_l(AM_STR, __cloc); ++ _M_data->_M_pm = __nl_langinfo_l(PM_STR, __cloc); ++ _M_data->_M_am_pm_format = __nl_langinfo_l(T_FMT_AMPM, __cloc); ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = __nl_langinfo_l(DAY_1, __cloc); ++ _M_data->_M_day2 = __nl_langinfo_l(DAY_2, __cloc); ++ _M_data->_M_day3 = __nl_langinfo_l(DAY_3, __cloc); ++ _M_data->_M_day4 = __nl_langinfo_l(DAY_4, __cloc); ++ _M_data->_M_day5 = __nl_langinfo_l(DAY_5, __cloc); ++ _M_data->_M_day6 = __nl_langinfo_l(DAY_6, __cloc); ++ _M_data->_M_day7 = __nl_langinfo_l(DAY_7, __cloc); ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = __nl_langinfo_l(ABDAY_1, __cloc); ++ _M_data->_M_aday2 = __nl_langinfo_l(ABDAY_2, __cloc); ++ _M_data->_M_aday3 = __nl_langinfo_l(ABDAY_3, __cloc); ++ _M_data->_M_aday4 = __nl_langinfo_l(ABDAY_4, __cloc); ++ _M_data->_M_aday5 = __nl_langinfo_l(ABDAY_5, __cloc); ++ _M_data->_M_aday6 = __nl_langinfo_l(ABDAY_6, __cloc); ++ _M_data->_M_aday7 = __nl_langinfo_l(ABDAY_7, __cloc); ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = __nl_langinfo_l(MON_1, __cloc); ++ _M_data->_M_month02 = __nl_langinfo_l(MON_2, __cloc); ++ _M_data->_M_month03 = __nl_langinfo_l(MON_3, __cloc); ++ _M_data->_M_month04 = __nl_langinfo_l(MON_4, __cloc); ++ _M_data->_M_month05 = __nl_langinfo_l(MON_5, __cloc); ++ _M_data->_M_month06 = __nl_langinfo_l(MON_6, __cloc); ++ _M_data->_M_month07 = __nl_langinfo_l(MON_7, __cloc); ++ _M_data->_M_month08 = __nl_langinfo_l(MON_8, __cloc); ++ _M_data->_M_month09 = __nl_langinfo_l(MON_9, __cloc); ++ _M_data->_M_month10 = __nl_langinfo_l(MON_10, __cloc); ++ _M_data->_M_month11 = __nl_langinfo_l(MON_11, __cloc); ++ _M_data->_M_month12 = __nl_langinfo_l(MON_12, __cloc); ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = __nl_langinfo_l(ABMON_1, __cloc); ++ _M_data->_M_amonth02 = __nl_langinfo_l(ABMON_2, __cloc); ++ _M_data->_M_amonth03 = __nl_langinfo_l(ABMON_3, __cloc); ++ _M_data->_M_amonth04 = __nl_langinfo_l(ABMON_4, __cloc); ++ _M_data->_M_amonth05 = __nl_langinfo_l(ABMON_5, __cloc); ++ _M_data->_M_amonth06 = __nl_langinfo_l(ABMON_6, __cloc); ++ _M_data->_M_amonth07 = __nl_langinfo_l(ABMON_7, __cloc); ++ _M_data->_M_amonth08 = __nl_langinfo_l(ABMON_8, __cloc); ++ _M_data->_M_amonth09 = __nl_langinfo_l(ABMON_9, __cloc); ++ _M_data->_M_amonth10 = __nl_langinfo_l(ABMON_10, __cloc); ++ _M_data->_M_amonth11 = __nl_langinfo_l(ABMON_11, __cloc); ++ _M_data->_M_amonth12 = __nl_langinfo_l(ABMON_12, __cloc); ++ } ++ } ++ ++#ifdef _GLIBCXX_USE_WCHAR_T ++ template<> ++ void ++ __timepunct<wchar_t>:: ++ _M_put(wchar_t* __s, size_t __maxlen, const wchar_t* __format, ++ const tm* __tm) const ++ { ++#ifdef __UCLIBC_HAS_XLOCALE__ ++ __wcsftime_l(__s, __maxlen, __format, __tm, _M_c_locale_timepunct); ++ const size_t __len = __wcsftime_l(__s, __maxlen, __format, __tm, ++ _M_c_locale_timepunct); ++#else ++ char* __old = strdup(setlocale(LC_ALL, NULL)); ++ setlocale(LC_ALL, _M_name_timepunct); ++ const size_t __len = wcsftime(__s, __maxlen, __format, __tm); ++ setlocale(LC_ALL, __old); ++ free(__old); ++#endif ++ // Make sure __s is null terminated. ++ if (__len == 0) ++ __s[0] = L'\0'; ++ } ++ ++ template<> ++ void ++ __timepunct<wchar_t>::_M_initialize_timepunct(__c_locale __cloc) ++ { ++ if (!_M_data) ++ _M_data = new __timepunct_cache<wchar_t>; ++ ++#warning wide time stuff ++// if (!__cloc) ++ { ++ // "C" locale ++ _M_c_locale_timepunct = _S_get_c_locale(); ++ ++ _M_data->_M_date_format = L"%m/%d/%y"; ++ _M_data->_M_date_era_format = L"%m/%d/%y"; ++ _M_data->_M_time_format = L"%H:%M:%S"; ++ _M_data->_M_time_era_format = L"%H:%M:%S"; ++ _M_data->_M_date_time_format = L""; ++ _M_data->_M_date_time_era_format = L""; ++ _M_data->_M_am = L"AM"; ++ _M_data->_M_pm = L"PM"; ++ _M_data->_M_am_pm_format = L""; ++ ++ // Day names, starting with "C"'s Sunday. ++ _M_data->_M_day1 = L"Sunday"; ++ _M_data->_M_day2 = L"Monday"; ++ _M_data->_M_day3 = L"Tuesday"; ++ _M_data->_M_day4 = L"Wednesday"; ++ _M_data->_M_day5 = L"Thursday"; ++ _M_data->_M_day6 = L"Friday"; ++ _M_data->_M_day7 = L"Saturday"; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ _M_data->_M_aday1 = L"Sun"; ++ _M_data->_M_aday2 = L"Mon"; ++ _M_data->_M_aday3 = L"Tue"; ++ _M_data->_M_aday4 = L"Wed"; ++ _M_data->_M_aday5 = L"Thu"; ++ _M_data->_M_aday6 = L"Fri"; ++ _M_data->_M_aday7 = L"Sat"; ++ ++ // Month names, starting with "C"'s January. ++ _M_data->_M_month01 = L"January"; ++ _M_data->_M_month02 = L"February"; ++ _M_data->_M_month03 = L"March"; ++ _M_data->_M_month04 = L"April"; ++ _M_data->_M_month05 = L"May"; ++ _M_data->_M_month06 = L"June"; ++ _M_data->_M_month07 = L"July"; ++ _M_data->_M_month08 = L"August"; ++ _M_data->_M_month09 = L"September"; ++ _M_data->_M_month10 = L"October"; ++ _M_data->_M_month11 = L"November"; ++ _M_data->_M_month12 = L"December"; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ _M_data->_M_amonth01 = L"Jan"; ++ _M_data->_M_amonth02 = L"Feb"; ++ _M_data->_M_amonth03 = L"Mar"; ++ _M_data->_M_amonth04 = L"Apr"; ++ _M_data->_M_amonth05 = L"May"; ++ _M_data->_M_amonth06 = L"Jun"; ++ _M_data->_M_amonth07 = L"Jul"; ++ _M_data->_M_amonth08 = L"Aug"; ++ _M_data->_M_amonth09 = L"Sep"; ++ _M_data->_M_amonth10 = L"Oct"; ++ _M_data->_M_amonth11 = L"Nov"; ++ _M_data->_M_amonth12 = L"Dec"; ++ } ++#if 0 ++ else ++ { ++ _M_c_locale_timepunct = _S_clone_c_locale(__cloc); ++ ++ union { char *__s; wchar_t *__w; } __u; ++ ++ __u.__s = __nl_langinfo_l(_NL_WD_FMT, __cloc); ++ _M_data->_M_date_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_D_FMT, __cloc); ++ _M_data->_M_date_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WT_FMT, __cloc); ++ _M_data->_M_time_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_T_FMT, __cloc); ++ _M_data->_M_time_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WD_T_FMT, __cloc); ++ _M_data->_M_date_time_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WERA_D_T_FMT, __cloc); ++ _M_data->_M_date_time_era_format = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WAM_STR, __cloc); ++ _M_data->_M_am = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WPM_STR, __cloc); ++ _M_data->_M_pm = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WT_FMT_AMPM, __cloc); ++ _M_data->_M_am_pm_format = __u.__w; ++ ++ // Day names, starting with "C"'s Sunday. ++ __u.__s = __nl_langinfo_l(_NL_WDAY_1, __cloc); ++ _M_data->_M_day1 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_2, __cloc); ++ _M_data->_M_day2 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_3, __cloc); ++ _M_data->_M_day3 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_4, __cloc); ++ _M_data->_M_day4 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_5, __cloc); ++ _M_data->_M_day5 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_6, __cloc); ++ _M_data->_M_day6 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WDAY_7, __cloc); ++ _M_data->_M_day7 = __u.__w; ++ ++ // Abbreviated day names, starting with "C"'s Sun. ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_1, __cloc); ++ _M_data->_M_aday1 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_2, __cloc); ++ _M_data->_M_aday2 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_3, __cloc); ++ _M_data->_M_aday3 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_4, __cloc); ++ _M_data->_M_aday4 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_5, __cloc); ++ _M_data->_M_aday5 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_6, __cloc); ++ _M_data->_M_aday6 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABDAY_7, __cloc); ++ _M_data->_M_aday7 = __u.__w; ++ ++ // Month names, starting with "C"'s January. ++ __u.__s = __nl_langinfo_l(_NL_WMON_1, __cloc); ++ _M_data->_M_month01 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_2, __cloc); ++ _M_data->_M_month02 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_3, __cloc); ++ _M_data->_M_month03 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_4, __cloc); ++ _M_data->_M_month04 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_5, __cloc); ++ _M_data->_M_month05 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_6, __cloc); ++ _M_data->_M_month06 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_7, __cloc); ++ _M_data->_M_month07 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_8, __cloc); ++ _M_data->_M_month08 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_9, __cloc); ++ _M_data->_M_month09 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_10, __cloc); ++ _M_data->_M_month10 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_11, __cloc); ++ _M_data->_M_month11 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WMON_12, __cloc); ++ _M_data->_M_month12 = __u.__w; ++ ++ // Abbreviated month names, starting with "C"'s Jan. ++ __u.__s = __nl_langinfo_l(_NL_WABMON_1, __cloc); ++ _M_data->_M_amonth01 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_2, __cloc); ++ _M_data->_M_amonth02 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_3, __cloc); ++ _M_data->_M_amonth03 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_4, __cloc); ++ _M_data->_M_amonth04 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_5, __cloc); ++ _M_data->_M_amonth05 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_6, __cloc); ++ _M_data->_M_amonth06 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_7, __cloc); ++ _M_data->_M_amonth07 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_8, __cloc); ++ _M_data->_M_amonth08 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_9, __cloc); ++ _M_data->_M_amonth09 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_10, __cloc); ++ _M_data->_M_amonth10 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_11, __cloc); ++ _M_data->_M_amonth11 = __u.__w; ++ __u.__s = __nl_langinfo_l(_NL_WABMON_12, __cloc); ++ _M_data->_M_amonth12 = __u.__w; ++ } ++#endif // 0 ++ } ++#endif ++} +--- gcc-4.1.0-dist/libstdc++-v3/config/locale/uclibc/time_members.h ++++ gcc-4.1.0/libstdc++-v3/config/locale/uclibc/time_members.h +@@ -0,0 +1,76 @@ ++// std::time_get, std::time_put implementation, GNU version -*- C++ -*- ++ ++// Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.2.5.1.2 - time_get functions ++// ISO C++ 14882: 22.2.5.3.2 - time_put functions ++// ++ ++// Written by Benjamin Kosnik <bkoz@redhat.com> ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__cache_type* __cache, size_t __refs) ++ : facet(__refs), _M_data(__cache), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(_S_get_c_name()) ++ { _M_initialize_timepunct(); } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, ++ size_t __refs) ++ : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), ++ _M_name_timepunct(NULL) ++ { ++ const size_t __len = std::strlen(__s) + 1; ++ char* __tmp = new char[__len]; ++ std::memcpy(__tmp, __s, __len); ++ _M_name_timepunct = __tmp; ++ ++ try ++ { _M_initialize_timepunct(__cloc); } ++ catch(...) ++ { ++ delete [] _M_name_timepunct; ++ __throw_exception_again; ++ } ++ } ++ ++ template<typename _CharT> ++ __timepunct<_CharT>::~__timepunct() ++ { ++ if (_M_name_timepunct != _S_get_c_name()) ++ delete [] _M_name_timepunct; ++ delete _M_data; ++ _S_destroy_c_locale(_M_c_locale_timepunct); ++ } +--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_base.h ++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_base.h +@@ -0,0 +1,64 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2002, 2003, 2004 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++/** @file ctype_base.h ++ * This is an internal header file, included by other library headers. ++ * You should not attempt to use it directly. ++ */ ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ /// @brief Base class for ctype. ++ struct ctype_base ++ { ++ // Note: In uClibc, the following two types depend on configuration. ++ ++ // Non-standard typedefs. ++ typedef const __ctype_touplow_t* __to_type; ++ ++ // NB: Offsets into ctype<char>::_M_table force a particular size ++ // on the mask type. Because of this, we don't use an enum. ++ typedef __ctype_mask_t mask; ++ static const mask upper = _ISupper; ++ static const mask lower = _ISlower; ++ static const mask alpha = _ISalpha; ++ static const mask digit = _ISdigit; ++ static const mask xdigit = _ISxdigit; ++ static const mask space = _ISspace; ++ static const mask print = _ISprint; ++ static const mask graph = _ISalpha | _ISdigit | _ISpunct; ++ static const mask cntrl = _IScntrl; ++ static const mask punct = _ISpunct; ++ static const mask alnum = _ISalpha | _ISdigit; ++ }; +--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_inline.h ++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_inline.h +@@ -0,0 +1,69 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 2000, 2002 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) ++// functions go in ctype.cc ++ ++ bool ++ ctype<char>:: ++ is(mask __m, char __c) const ++ { return _M_table[static_cast<unsigned char>(__c)] & __m; } ++ ++ const char* ++ ctype<char>:: ++ is(const char* __low, const char* __high, mask* __vec) const ++ { ++ while (__low < __high) ++ *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; ++ return __high; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_is(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) ++ ++__low; ++ return __low; ++ } ++ ++ const char* ++ ctype<char>:: ++ scan_not(mask __m, const char* __low, const char* __high) const ++ { ++ while (__low < __high ++ && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) ++ ++__low; ++ return __low; ++ } +--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/ctype_noninline.h ++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/ctype_noninline.h +@@ -0,0 +1,92 @@ ++// Locale support -*- C++ -*- ++ ++// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004 ++// Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++// ++// ISO C++ 14882: 22.1 Locales ++// ++ ++// Information as gleaned from /usr/include/ctype.h ++ ++ const ctype_base::mask* ++ ctype<char>::classic_table() throw() ++ { return __C_ctype_b; } ++ ++ ctype<char>::ctype(__c_locale, const mask* __table, bool __del, ++ size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) ++ : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()), ++ _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) ++ { ++ _M_toupper = __C_ctype_toupper; ++ _M_tolower = __C_ctype_tolower; ++ _M_table = __table ? __table : __C_ctype_b; ++ memset(_M_widen, 0, sizeof(_M_widen)); ++ memset(_M_narrow, 0, sizeof(_M_narrow)); ++ } ++ ++ char ++ ctype<char>::do_toupper(char __c) const ++ { return _M_toupper[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_toupper(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_toupper[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } ++ ++ char ++ ctype<char>::do_tolower(char __c) const ++ { return _M_tolower[static_cast<unsigned char>(__c)]; } ++ ++ const char* ++ ctype<char>::do_tolower(char* __low, const char* __high) const ++ { ++ while (__low < __high) ++ { ++ *__low = _M_tolower[static_cast<unsigned char>(*__low)]; ++ ++__low; ++ } ++ return __high; ++ } +--- gcc-4.1.0-dist/libstdc++-v3/config/os/uclibc/os_defines.h ++++ gcc-4.1.0/libstdc++-v3/config/os/uclibc/os_defines.h +@@ -0,0 +1,44 @@ ++// Specific definitions for GNU/Linux -*- C++ -*- ++ ++// Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. ++// ++// This file is part of the GNU ISO C++ Library. This library is free ++// software; you can redistribute it and/or modify it under the ++// terms of the GNU General Public License as published by the ++// Free Software Foundation; either version 2, 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 General Public License for more details. ++ ++// You should have received a copy of the GNU General Public License along ++// with this library; see the file COPYING. If not, write to the Free ++// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, ++// USA. ++ ++// As a special exception, you may use this file as part of a free software ++// library without restriction. Specifically, if other files instantiate ++// templates or use macros or inline functions from this file, or you compile ++// this file and link it with other files to produce an executable, this ++// file does not by itself cause the resulting executable to be covered by ++// the GNU General Public License. This exception does not however ++// invalidate any other reasons why the executable file might be covered by ++// the GNU General Public License. ++ ++#ifndef _GLIBCXX_OS_DEFINES ++#define _GLIBCXX_OS_DEFINES 1 ++ ++// System-specific #define, typedefs, corrections, etc, go here. This ++// file will come before all others. ++ ++// This keeps isanum, et al from being propagated as macros. ++#define __NO_CTYPE 1 ++ ++#include <features.h> ++ ++// We must not see the optimized string functions GNU libc defines. ++#define __NO_STRING_INLINES ++ ++#endif +--- gcc-4.1.0-dist/libstdc++-v3/configure ++++ gcc-4.1.0/libstdc++-v3/configure +@@ -4005,6 +4005,11 @@ + lt_cv_deplibs_check_method=pass_all + ;; + ++linux-uclibc*) ++ lt_cv_deplibs_check_method=pass_all ++ lt_cv_file_magic_test_file=`echo /lib/libuClibc-*.so` ++ ;; ++ + netbsd* | knetbsd*-gnu) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/\.]+\.so\.[0-9]+\.[0-9]+$' +@@ -5740,7 +5745,7 @@ + enableval="$enable_clocale" + + case "$enableval" in +- generic|gnu|ieee_1003.1-2001|yes|no|auto) ;; ++ generic|gnu|ieee_1003.1-2001|uclibc|yes|no|auto) ;; + *) { { echo "$as_me:$LINENO: error: Unknown argument to enable/disable clocale" >&5 + echo "$as_me: error: Unknown argument to enable/disable clocale" >&2;} + { (exit 1); exit 1; }; } ;; +@@ -5765,6 +5770,9 @@ + # Default to "generic". + if test $enable_clocale_flag = auto; then + case ${target_os} in ++ linux-uclibc*) ++ enable_clocale_flag=uclibc ++ ;; + linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu) + cat >conftest.$ac_ext <<_ACEOF + /* confdefs.h. */ +@@ -5995,6 +6003,76 @@ + CTIME_CC=config/locale/generic/time_members.cc + CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h + ;; ++ uclibc) ++ echo "$as_me:$LINENO: result: uclibc" >&5 ++echo "${ECHO_T}uclibc" >&6 ++ ++ # Declare intention to use gettext, and add support for specific ++ # languages. ++ # For some reason, ALL_LINGUAS has to be before AM-GNU-GETTEXT ++ ALL_LINGUAS="de fr" ++ ++ # Don't call AM-GNU-GETTEXT here. Instead, assume glibc. ++ # Extract the first word of "msgfmt", so it can be a program name with args. ++set dummy msgfmt; 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_check_msgfmt+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ if test -n "$check_msgfmt"; then ++ ac_cv_prog_check_msgfmt="$check_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_check_msgfmt="yes" ++ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 ++ break 2 ++ fi ++done ++done ++ ++ test -z "$ac_cv_prog_check_msgfmt" && ac_cv_prog_check_msgfmt="no" ++fi ++fi ++check_msgfmt=$ac_cv_prog_check_msgfmt ++if test -n "$check_msgfmt"; then ++ echo "$as_me:$LINENO: result: $check_msgfmt" >&5 ++echo "${ECHO_T}$check_msgfmt" >&6 ++else ++ echo "$as_me:$LINENO: result: no" >&5 ++echo "${ECHO_T}no" >&6 ++fi ++ ++ if test x"$check_msgfmt" = x"yes" && test x"$enable_nls" = x"yes"; then ++ USE_NLS=yes ++ fi ++ # Export the build objects. ++ for ling in $ALL_LINGUAS; do \ ++ glibcxx_MOFILES="$glibcxx_MOFILES $ling.mo"; \ ++ glibcxx_POFILES="$glibcxx_POFILES $ling.po"; \ ++ done ++ ++ ++ ++ CLOCALE_H=config/locale/uclibc/c_locale.h ++ CLOCALE_CC=config/locale/uclibc/c_locale.cc ++ CCODECVT_CC=config/locale/uclibc/codecvt_members.cc ++ CCOLLATE_CC=config/locale/uclibc/collate_members.cc ++ CCTYPE_CC=config/locale/uclibc/ctype_members.cc ++ CMESSAGES_H=config/locale/uclibc/messages_members.h ++ CMESSAGES_CC=config/locale/uclibc/messages_members.cc ++ CMONEY_CC=config/locale/uclibc/monetary_members.cc ++ CNUMERIC_CC=config/locale/uclibc/numeric_members.cc ++ CTIME_H=config/locale/uclibc/time_members.h ++ CTIME_CC=config/locale/uclibc/time_members.cc ++ CLOCALE_INTERNAL_H=config/locale/uclibc/c++locale_internal.h ++ ;; + esac + + # This is where the testsuite looks for locale catalogs, using the +--- gcc-4.1.0-dist/libstdc++-v3/configure.host ++++ gcc-4.1.0/libstdc++-v3/configure.host +@@ -261,6 +261,12 @@ + ;; + esac + ++# Override for uClibc since linux-uclibc gets mishandled above. ++case "${host_os}" in ++ *-uclibc*) ++ os_include_dir="os/uclibc" ++ ;; ++esac + + # Set any OS-dependent and CPU-dependent bits. + # THIS TABLE IS SORTED. KEEP IT THAT WAY. +--- gcc-4.1.0-dist/libstdc++-v3/crossconfig.m4 ++++ gcc-4.1.0/libstdc++-v3/crossconfig.m4 +@@ -143,6 +143,99 @@ + ;; + esac + ;; ++ *-uclibc*) ++# Temporary hack until we implement the float versions of the libm funcs ++ AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ ++ machine/endian.h machine/param.h sys/machine.h sys/types.h \ ++ fp.h float.h endian.h inttypes.h locale.h float.h stdint.h]) ++ SECTION_FLAGS='-ffunction-sections -fdata-sections' ++ AC_SUBST(SECTION_FLAGS) ++ GLIBCXX_CHECK_LINKER_FEATURES ++ GLIBCXX_CHECK_COMPLEX_MATH_SUPPORT ++ GLIBCXX_CHECK_WCHAR_T_SUPPORT ++ ++ # For LFS. ++ AC_DEFINE(HAVE_INT64_T) ++ case "$target" in ++ *-uclinux*) ++ # Don't enable LFS with uClinux ++ ;; ++ *) ++ AC_DEFINE(_GLIBCXX_USE_LFS) ++ esac ++ ++ # For showmanyc_helper(). ++ AC_CHECK_HEADERS(sys/ioctl.h sys/filio.h) ++ GLIBCXX_CHECK_POLL ++ GLIBCXX_CHECK_S_ISREG_OR_S_IFREG ++ ++ # For xsputn_2(). ++ AC_CHECK_HEADERS(sys/uio.h) ++ GLIBCXX_CHECK_WRITEV ++ ++# AC_DEFINE(HAVE_ACOSF) ++# AC_DEFINE(HAVE_ASINF) ++# AC_DEFINE(HAVE_ATANF) ++# AC_DEFINE(HAVE_ATAN2F) ++ AC_DEFINE(HAVE_CEILF) ++ AC_DEFINE(HAVE_COPYSIGN) ++# AC_DEFINE(HAVE_COPYSIGNF) ++# AC_DEFINE(HAVE_COSF) ++# AC_DEFINE(HAVE_COSHF) ++# AC_DEFINE(HAVE_EXPF) ++# AC_DEFINE(HAVE_FABSF) ++ AC_DEFINE(HAVE_FINITE) ++ AC_DEFINE(HAVE_FINITEF) ++ AC_DEFINE(HAVE_FLOORF) ++# AC_DEFINE(HAVE_FMODF) ++# AC_DEFINE(HAVE_FREXPF) ++ AC_DEFINE(HAVE_HYPOT) ++# AC_DEFINE(HAVE_HYPOTF) ++ AC_DEFINE(HAVE_ISINF) ++ AC_DEFINE(HAVE_ISINFF) ++ AC_DEFINE(HAVE_ISNAN) ++ AC_DEFINE(HAVE_ISNANF) ++# AC_DEFINE(HAVE_LOGF) ++# AC_DEFINE(HAVE_LOG10F) ++# AC_DEFINE(HAVE_MODFF) ++# AC_DEFINE(HAVE_SINF) ++# AC_DEFINE(HAVE_SINHF) ++# AC_DEFINE(HAVE_SINCOS) ++# AC_DEFINE(HAVE_SINCOSF) ++ AC_DEFINE(HAVE_SQRTF) ++# AC_DEFINE(HAVE_TANF) ++# AC_DEFINE(HAVE_TANHF) ++ if test x"long_double_math_on_this_cpu" = x"yes"; then ++ AC_MSG_ERROR([long_double_math_on_this_cpu is yes!]) ++# AC_DEFINE(HAVE_ACOSL) ++# AC_DEFINE(HAVE_ASINL) ++# AC_DEFINE(HAVE_ATANL) ++# AC_DEFINE(HAVE_ATAN2L) ++# AC_DEFINE(HAVE_CEILL) ++# AC_DEFINE(HAVE_COPYSIGNL) ++# AC_DEFINE(HAVE_COSL) ++# AC_DEFINE(HAVE_COSHL) ++# AC_DEFINE(HAVE_EXPL) ++# AC_DEFINE(HAVE_FABSL) ++# AC_DEFINE(HAVE_FINITEL) ++# AC_DEFINE(HAVE_FLOORL) ++# AC_DEFINE(HAVE_FMODL) ++# AC_DEFINE(HAVE_FREXPL) ++# AC_DEFINE(HAVE_HYPOTL) ++# AC_DEFINE(HAVE_ISINFL) ++# AC_DEFINE(HAVE_ISNANL) ++# AC_DEFINE(HAVE_LOGL) ++# AC_DEFINE(HAVE_LOG10L) ++# AC_DEFINE(HAVE_MODFL) ++# AC_DEFINE(HAVE_POWL) ++# AC_DEFINE(HAVE_SINL) ++# AC_DEFINE(HAVE_SINHL) ++# AC_DEFINE(HAVE_SINCOSL) ++# AC_DEFINE(HAVE_SQRTL) ++# AC_DEFINE(HAVE_TANL) ++# AC_DEFINE(HAVE_TANHL) ++ fi ++ ;; + *-linux* | *-uclinux* | *-gnu* | *-kfreebsd*-gnu | *-knetbsd*-gnu) + AC_CHECK_HEADERS([nan.h ieeefp.h endian.h sys/isa_defs.h \ + machine/endian.h machine/param.h sys/machine.h sys/types.h \ +@@ -157,7 +250,7 @@ + AC_DEFINE(HAVE_INT64_T) + case "$target" in + *-uclinux*) +- # Don't enable LFS with uClibc ++ # Don't enable LFS with uClinux + ;; + *) + AC_DEFINE(_GLIBCXX_USE_LFS) +--- gcc-4.1.0-dist/libstdc++-v3/include/c_compatibility/wchar.h ++++ gcc-4.1.0/libstdc++-v3/include/c_compatibility/wchar.h +@@ -101,7 +101,9 @@ + using std::wmemcpy; + using std::wmemmove; + using std::wmemset; ++#if _GLIBCXX_HAVE_WCSFTIME + using std::wcsftime; ++#endif + + #if _GLIBCXX_USE_C99 + using std::wcstold; +--- gcc-4.1.0-dist/libstdc++-v3/include/c_std/std_cwchar.h ++++ gcc-4.1.0/libstdc++-v3/include/c_std/std_cwchar.h +@@ -180,7 +180,9 @@ + using ::wcscoll; + using ::wcscpy; + using ::wcscspn; ++#if _GLIBCXX_HAVE_WCSFTIME + using ::wcsftime; ++#endif + using ::wcslen; + using ::wcsncat; + using ::wcsncmp; diff --git a/patches/gcc/4.1.2/300-libstdc++-pic.patch b/patches/gcc/4.1.2/300-libstdc++-pic.patch new file mode 100644 index 00000000..560bcb23 --- /dev/null +++ b/patches/gcc/4.1.2/300-libstdc++-pic.patch @@ -0,0 +1,50 @@ +# DP: Build and install libstdc++_pic.a library. + +--- gcc/libstdc++-v3/src/Makefile.am ++++ gcc/libstdc++-v3/src/Makefile.am +@@ -214,6 +214,12 @@ + $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LDFLAGS) -o $@ + + ++install-exec-local: ++ifeq ($(enable_shared),yes) ++ $(AR) cru libstdc++_pic.a .libs/*.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++endif ++ + # Added bits to build debug library. + if GLIBCXX_BUILD_DEBUG + all-local: build_debug +--- gcc/libstdc++-v3/src/Makefile.in ++++ gcc/libstdc++-v3/src/Makefile.in +@@ -627,7 +627,7 @@ + + install-data-am: install-data-local + +-install-exec-am: install-toolexeclibLTLIBRARIES ++install-exec-am: install-toolexeclibLTLIBRARIES install-exec-local + + install-info: install-info-am + +@@ -660,6 +660,7 @@ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-data-local install-exec \ ++ install-exec-local \ + install-exec-am install-info install-info-am install-man \ + install-strip install-toolexeclibLTLIBRARIES installcheck \ + installcheck-am installdirs maintainer-clean \ +@@ -743,6 +743,13 @@ + install_debug: + (cd ${debugdir} && $(MAKE) \ + toolexeclibdir=$(glibcxx_toolexeclibdir)/debug install) ++ ++install-exec-local: ++ifeq ($(enable_shared),yes) ++ $(AR) cru libstdc++_pic.a *.o $(top_builddir)/libsupc++/*.o ++ $(INSTALL_DATA) libstdc++_pic.a $(DESTDIR)$(toolexeclibdir) ++endif ++ + # Tell versions [3.59,3.63) of GNU make to not export all variables. + # Otherwise a system limit (for SysV at least) may be exceeded. + .NOEXPORT: diff --git a/patches/gcc/4.1.2/301-missing-execinfo_h.patch b/patches/gcc/4.1.2/301-missing-execinfo_h.patch new file mode 100644 index 00000000..0e2092f3 --- /dev/null +++ b/patches/gcc/4.1.2/301-missing-execinfo_h.patch @@ -0,0 +1,11 @@ +--- gcc-4.0.0/boehm-gc/include/gc.h-orig 2005-04-28 22:28:57.000000000 -0500 ++++ gcc-4.0.0/boehm-gc/include/gc.h 2005-04-28 22:30:38.000000000 -0500 +@@ -500,7 +500,7 @@ + #ifdef __linux__ + # include <features.h> + # if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 1 || __GLIBC__ > 2) \ +- && !defined(__ia64__) ++ && !defined(__ia64__) && !defined(__UCLIBC__) + # ifndef GC_HAVE_BUILTIN_BACKTRACE + # define GC_HAVE_BUILTIN_BACKTRACE + # endif diff --git a/patches/gcc/4.1.2/302-c99-snprintf.patch b/patches/gcc/4.1.2/302-c99-snprintf.patch new file mode 100644 index 00000000..dfb22d68 --- /dev/null +++ b/patches/gcc/4.1.2/302-c99-snprintf.patch @@ -0,0 +1,11 @@ +--- gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h-orig 2005-04-29 00:08:41.000000000 -0500 ++++ gcc-4.0.0/libstdc++-v3/include/c_std/std_cstdio.h 2005-04-29 00:08:45.000000000 -0500 +@@ -142,7 +142,7 @@ + using ::vsprintf; + } + +-#if _GLIBCXX_USE_C99 ++#if _GLIBCXX_USE_C99 || defined(__UCLIBC__) + + #undef snprintf + #undef vfscanf diff --git a/patches/gcc/4.1.2/303-c99-complex-ugly-hack.patch b/patches/gcc/4.1.2/303-c99-complex-ugly-hack.patch new file mode 100644 index 00000000..2ccc80d9 --- /dev/null +++ b/patches/gcc/4.1.2/303-c99-complex-ugly-hack.patch @@ -0,0 +1,12 @@ +--- gcc-4.0.0/libstdc++-v3/configure-old 2005-04-30 22:04:48.061603912 -0500 ++++ gcc-4.0.0/libstdc++-v3/configure 2005-04-30 22:06:13.678588152 -0500 +@@ -7194,6 +7194,9 @@ + cat >>conftest.$ac_ext <<_ACEOF + /* end confdefs.h. */ + #include <complex.h> ++#ifdef __UCLIBC__ ++#error ugly hack to make sure configure test fails here for cross until uClibc supports the complex funcs ++#endif + int + main () + { diff --git a/patches/gcc/4.1.2/304-index_macro.patch b/patches/gcc/4.1.2/304-index_macro.patch new file mode 100644 index 00000000..1fac112f --- /dev/null +++ b/patches/gcc/4.1.2/304-index_macro.patch @@ -0,0 +1,24 @@ +--- gcc-4.1.0/libstdc++-v3/include/ext/rope.mps 2006-03-24 01:49:51 +0100 ++++ gcc-4.1.0/libstdc++-v3/include/ext/rope 2006-03-24 01:49:37 +0100 +@@ -59,6 +59,9 @@ + #include <bits/allocator.h> + #include <ext/hash_fun.h> + ++/* cope w/ index defined as macro, SuSv3 proposal */ ++#undef index ++ + # ifdef __GC + # define __GC_CONST const + # else +--- gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h.mps 2006-03-24 01:50:04 +0100 ++++ gcc-4.1.0/libstdc++-v3/include/ext/ropeimpl.h 2006-03-24 01:50:28 +0100 +@@ -53,6 +53,9 @@ + #include <ext/memory> // For uninitialized_copy_n + #include <ext/numeric> // For power + ++/* cope w/ index defined as macro, SuSv3 proposal */ ++#undef index ++ + namespace __gnu_cxx + { + using std::size_t; diff --git a/patches/gcc/4.1.2/402-libbackend_dep_gcov-iov.h.patch b/patches/gcc/4.1.2/402-libbackend_dep_gcov-iov.h.patch new file mode 100644 index 00000000..b7d9bb99 --- /dev/null +++ b/patches/gcc/4.1.2/402-libbackend_dep_gcov-iov.h.patch @@ -0,0 +1,12 @@ +# gcc.gnu.org/PR30620 +--- gcc-4.1.2-20070208.orig/gcc/Makefile.in 2006-11-01 15:40:44.000000000 +0100 ++++ gcc-4.1.2-20070208/gcc/Makefile.in 2007-02-13 19:23:31.000000000 +0100 +@@ -2522,7 +2522,7 @@ + # FIXME: writing proper dependencies for this is a *LOT* of work. + libbackend.o : $(OBJS-common:.o=.c) $(out_file) \ + insn-config.h insn-flags.h insn-codes.h insn-constants.h \ +- insn-attr.h $(DATESTAMP) $(BASEVER) $(DEVPHASE) ++ insn-attr.h $(DATESTAMP) $(BASEVER) $(DEVPHASE) gcov-iov.h + $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) \ + -DTARGET_NAME=\"$(target_noncanonical)\" \ + -DLOCALEDIR=\"$(localedir)\" \ diff --git a/patches/gcc/4.1.2/740-sh-pr24836.patch b/patches/gcc/4.1.2/740-sh-pr24836.patch new file mode 100644 index 00000000..7992282c --- /dev/null +++ b/patches/gcc/4.1.2/740-sh-pr24836.patch @@ -0,0 +1,25 @@ +http://sourceforge.net/mailarchive/forum.php?thread_id=8959304&forum_id=5348 +http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24836 + +--- gcc/gcc/configure.ac (revision 106699) ++++ gcc/gcc/configure.ac (working copy) +@@ -2446,7 +2446,7 @@ + tls_first_minor=14 + tls_as_opt="-m64 -Aesame --fatal-warnings" + ;; +- sh-*-* | sh[34]-*-*) ++ sh-*-* | sh[34]*-*-*) + conftest_s=' + .section ".tdata","awT",@progbits + foo: .long 25 +--- gcc/gcc/configure ++++ gcc/gcc/configure +@@ -14846,7 +14846,7 @@ + tls_first_minor=14 + tls_as_opt="-m64 -Aesame --fatal-warnings" + ;; +- sh-*-* | sh[34]-*-*) ++ sh-*-* | sh[34]*-*-*) + conftest_s=' + .section ".tdata","awT",@progbits + foo: .long 25 diff --git a/patches/gcc/4.1.2/800-arm-bigendian.patch b/patches/gcc/4.1.2/800-arm-bigendian.patch new file mode 100644 index 00000000..0a941741 --- /dev/null +++ b/patches/gcc/4.1.2/800-arm-bigendian.patch @@ -0,0 +1,127 @@ +By Lennert Buytenhek <buytenh@wantstofly.org> +Adds support for arm*b-linux* big-endian ARM targets + +See http://gcc.gnu.org/PR16350 + +Index: gcc-4.1.1/gcc/config/arm/linux-elf.h +=================================================================== +--- gcc-4.1.1.orig/gcc/config/arm/linux-elf.h ++++ gcc-4.1.1/gcc/config/arm/linux-elf.h +@@ -28,19 +28,33 @@ + #undef TARGET_VERSION + #define TARGET_VERSION fputs (" (ARM GNU/Linux with ELF)", stderr); + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT MASK_BIG_END ++#define TARGET_ENDIAN_OPTION "mbig-endian" ++#define TARGET_LINKER_EMULATION "armelfb_linux" ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#define TARGET_ENDIAN_OPTION "mlittle-endian" ++#define TARGET_LINKER_EMULATION "armelf_linux" ++#endif ++ + #undef TARGET_DEFAULT_FLOAT_ABI + #define TARGET_DEFAULT_FLOAT_ABI ARM_FLOAT_ABI_HARD + + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT (0) ++#define TARGET_DEFAULT (TARGET_ENDIAN_DEFAULT) + + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm6 + +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux -p" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION " -p" + + #undef MULTILIB_DEFAULTS + #define MULTILIB_DEFAULTS \ +- { "marm", "mlittle-endian", "mhard-float", "mno-thumb-interwork" } ++ { "marm", TARGET_ENDIAN_OPTION, "mhard-float", "mno-thumb-interwork" } + + /* Now we define the strings used to build the spec file. */ + #undef LIB_SPEC +@@ -61,7 +75,7 @@ + %{rdynamic:-export-dynamic} \ + %{!dynamic-linker:-dynamic-linker " LINUX_TARGET_INTERPRETER "} \ + -X \ +- %{mbig-endian:-EB}" \ ++ %{mbig-endian:-EB} %{mlittle-endian:-EL}" \ + SUBTARGET_EXTRA_LINK_SPEC + + #undef LINK_SPEC +Index: gcc-4.1.1/gcc/config.gcc +=================================================================== +--- gcc-4.1.1.orig/gcc/config.gcc ++++ gcc-4.1.1/gcc/config.gcc +@@ -672,6 +672,11 @@ arm*-*-netbsd*) + ;; + arm*-*-linux*) # ARM GNU/Linux with ELF + tm_file="dbxelf.h elfos.h linux.h arm/elf.h arm/linux-gas.h arm/linux-elf.h" ++ case $target in ++ arm*b-*) ++ tm_defines="${tm_defines} TARGET_BIG_ENDIAN_DEFAULT=1" ++ ;; ++ esac + tmake_file="${tmake_file} t-linux arm/t-arm" + case ${target} in + arm*-*-linux-gnueabi) +Index: gcc-4.1.1/gcc/config/arm/linux-eabi.h +=================================================================== +--- gcc-4.1.1.orig/gcc/config/arm/linux-eabi.h ++++ gcc-4.1.1/gcc/config/arm/linux-eabi.h +@@ -20,6 +20,17 @@ + the Free Software Foundation, 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#undef TARGET_LINKER_EMULATION ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_LINKER_EMULATION "armelfb_linux_eabi" ++#else ++#define TARGET_LINKER_EMULATION "armelf_linux_eabi" ++#endif ++ + /* On EABI GNU/Linux, we want both the BPABI builtins and the + GNU/Linux builtins. */ + #undef TARGET_OS_CPP_BUILTINS +@@ -48,7 +59,7 @@ + #define SUBTARGET_CPU_DEFAULT TARGET_CPU_arm10tdmi + + #undef SUBTARGET_EXTRA_LINK_SPEC +-#define SUBTARGET_EXTRA_LINK_SPEC " -m armelf_linux_eabi" ++#define SUBTARGET_EXTRA_LINK_SPEC " -m " TARGET_LINKER_EMULATION + + /* Use ld-linux.so.3 so that it will be possible to run "classic" + GNU/Linux binaries on an EABI system. */ +Index: gcc-4.1.1/gcc/config/arm/bpabi.h +=================================================================== +--- gcc-4.1.1.orig/gcc/config/arm/bpabi.h ++++ gcc-4.1.1/gcc/config/arm/bpabi.h +@@ -33,9 +33,19 @@ + #undef FPUTYPE_DEFAULT + #define FPUTYPE_DEFAULT FPUTYPE_VFP + ++/* ++ * 'config.gcc' defines TARGET_BIG_ENDIAN_DEFAULT as 1 for arm*b-* ++ * (big endian) configurations. ++ */ ++#if TARGET_BIG_ENDIAN_DEFAULT ++#define TARGET_ENDIAN_DEFAULT MASK_BIG_END ++#else ++#define TARGET_ENDIAN_DEFAULT 0 ++#endif ++ + /* EABI targets should enable interworking by default. */ + #undef TARGET_DEFAULT +-#define TARGET_DEFAULT MASK_INTERWORK ++#define TARGET_DEFAULT (MASK_INTERWORK | TARGET_ENDIAN_DEFAULT) + + /* The ARM BPABI functions return a boolean; they use no special + calling convention. */ diff --git a/patches/glibc/2.1.3/README b/patches/glibc/2.1.3/README new file mode 100644 index 00000000..2b17d93e --- /dev/null +++ b/patches/glibc/2.1.3/README @@ -0,0 +1,4 @@ +The files rh62*.patch are from the Red Hat 6.2 file glibc-2.1.3-28.src.rpm +I am trusting here that Red Hat's patches are appropriate for all CPU +types. If I'm wrong, just remove the offending patch... +- Dan Kegel diff --git a/patches/glibc/2.1.3/arm-ctl_bus_isa.patch b/patches/glibc/2.1.3/arm-ctl_bus_isa.patch new file mode 100644 index 00000000..3422070b --- /dev/null +++ b/patches/glibc/2.1.3/arm-ctl_bus_isa.patch @@ -0,0 +1,51 @@ +Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004. +Needed to build glibc with linux kernels 2.4.23 or higher on ARM, +Fixes following error: + +../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys': +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]') +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]') +make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1 + +cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA", http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html + +--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old 2003-02-20 14:22:24.000000000 -0800 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c 2004-01-31 16:01:50.000000000 -0800 +@@ -47,6 +47,12 @@ + #include <asm/page.h> + #include <sys/sysctl.h> + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include <linux/version.h> ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23)) ++#define CTL_BUS_ISA BUS_ISA /* and hope it's not the one from linux/input.h */ ++#endif ++ + #define PATH_ARM_SYSTYPE "/etc/arm_systype" + #define PATH_CPUINFO "/proc/cpuinfo" + +@@ -80,7 +86,7 @@ + * Initialize I/O system. There are several ways to get the information + * we need. Each is tried in turn until one succeeds. + * +- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*). This is the preferred method ++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*). This is the preferred method + * but not all kernels support it. + * + * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE. +@@ -100,8 +106,8 @@ + { + char systype[256]; + int i, n; +- static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE }; +- static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT }; ++ static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE }; ++ static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT }; + size_t len = sizeof(io.base); + + if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0) diff --git a/patches/glibc/2.1.3/backport-config.sub.patch b/patches/glibc/2.1.3/backport-config.sub.patch new file mode 100644 index 00000000..8c1b1afe --- /dev/null +++ b/patches/glibc/2.1.3/backport-config.sub.patch @@ -0,0 +1,834 @@ +# Backport glibc-2.3.2's config.sub to glibc-2.1.3 +# Should fix nonfatal but annoying like +# checking build system type... Invalid configuration `x86_64-unknown-linux-gnu': machine `x86_64-unknown' not recognized +# ../glibc-2.1.3/configure: line 1227: test: i686-unknown-linux-gnu: unary operator expected +# checking build system type... Configuration name missing. + + +--- glibc-2.1.3/scripts/config.sub 2004-03-24 13:27:06.000000000 -0800 ++++ glibc-2.3.2/scripts/config.sub 2002-07-10 00:24:32.000000000 -0700 +@@ -1,6 +1,10 @@ + #! /bin/sh +-# Configuration validation subroutine script, version 1.1. +-# Copyright (C) 1991, 92-97, 1998, 1999 Free Software Foundation, Inc. ++# Configuration validation subroutine script. ++# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, ++# 2000, 2001, 2002 Free Software Foundation, Inc. ++ ++timestamp='2002-07-03' ++ + # This file is (in principle) common to ALL GNU software. + # The presence of a machine in this file suggests that SOME GNU software + # can handle that machine. It does not imply ALL GNU software can. +@@ -25,6 +29,9 @@ + # configuration script generated by Autoconf, you may include it under + # the same distribution terms that you use for the rest of that program. + ++# Please send patches to <config-patches@gnu.org>. Submit a context ++# diff and a properly formatted ChangeLog entry. ++# + # Configuration subroutine to validate and canonicalize a configuration type. + # Supply the specified configuration type as an argument. + # If it is invalid, we print an error message on stderr and exit with code 1. +@@ -45,30 +52,73 @@ + # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM + # It is wrong to echo any other type of specification. + +-if [ x$1 = x ] +-then +- echo Configuration name missing. 1>&2 +- echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 +- echo "or $0 ALIAS" 1>&2 +- echo where ALIAS is a recognized configuration type. 1>&2 +- exit 1 +-fi ++me=`echo "$0" | sed -e 's,.*/,,'` + +-# First pass through any local machine types. +-case $1 in +- *local*) +- echo $1 +- exit 0 +- ;; +- *) +- ;; ++usage="\ ++Usage: $0 [OPTION] CPU-MFR-OPSYS ++ $0 [OPTION] ALIAS ++ ++Canonicalize a configuration name. ++ ++Operation modes: ++ -h, --help print this help, then exit ++ -t, --time-stamp print date of last modification, then exit ++ -v, --version print version number, then exit ++ ++Report bugs and patches to <config-patches@gnu.org>." ++ ++version="\ ++GNU config.sub ($timestamp) ++ ++Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 ++Free Software Foundation, Inc. ++ ++This is free software; see the source for copying conditions. There is NO ++warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." ++ ++help=" ++Try \`$me --help' for more information." ++ ++# Parse command line ++while test $# -gt 0 ; do ++ case $1 in ++ --time-stamp | --time* | -t ) ++ echo "$timestamp" ; exit 0 ;; ++ --version | -v ) ++ echo "$version" ; exit 0 ;; ++ --help | --h* | -h ) ++ echo "$usage"; exit 0 ;; ++ -- ) # Stop option processing ++ shift; break ;; ++ - ) # Use stdin as input. ++ break ;; ++ -* ) ++ echo "$me: invalid option $1$help" ++ exit 1 ;; ++ ++ *local*) ++ # First pass through any local machine types. ++ echo $1 ++ exit 0;; ++ ++ * ) ++ break ;; ++ esac ++done ++ ++case $# in ++ 0) echo "$me: missing argument$help" >&2 ++ exit 1;; ++ 1) ;; ++ *) echo "$me: too many arguments$help" >&2 ++ exit 1;; + esac + + # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). + # Here we must recognize all the valid KERNEL-OS combinations. + maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` + case $maybe_os in +- linux-gnu*) ++ nto-qnx* | linux-gnu* | freebsd*-gnu* | storm-chaos* | os2-emx* | windows32-* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +@@ -94,7 +144,7 @@ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ +- -apple) ++ -apple | -axis) + os= + basic_machine=$1 + ;; +@@ -108,6 +158,14 @@ + os=-vxworks + basic_machine=$1 + ;; ++ -chorusos*) ++ os=-chorusos ++ basic_machine=$1 ++ ;; ++ -chorusrdb) ++ os=-chorusrdb ++ basic_machine=$1 ++ ;; + -hiux*) + os=-hiuxwe2 + ;; +@@ -166,27 +224,58 @@ + case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. +- tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \ +- | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \ +- | 580 | i960 | h8300 \ +- | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ +- | alpha | alphaev[4-7] | alphaev56 | alphapca5[67] \ +- | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \ +- | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \ +- | mips64orion | mips64orionel | mipstx39 | mipstx39el \ +- | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ +- | mips64vr5000 | miprs64vr5000el | mcore \ +- | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \ +- | thumb | d10v | fr30) ++ 1750a | 580 \ ++ | a29k \ ++ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ ++ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ ++ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ ++ | c4x | clipper \ ++ | d10v | d30v | dlx | dsp16xx \ ++ | fr30 | frv \ ++ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ ++ | i370 | i860 | i960 | ia64 \ ++ | ip2k \ ++ | m32r | m68000 | m68k | m88k | mcore \ ++ | mips | mipsbe | mipseb | mipsel | mipsle \ ++ | mips16 \ ++ | mips64 | mips64el \ ++ | mips64orion | mips64orionel \ ++ | mips64vr4100 | mips64vr4100el \ ++ | mips64vr4300 | mips64vr4300el \ ++ | mips64vr5000 | mips64vr5000el \ ++ | mipsisa32 | mipsisa32el \ ++ | mipsisa64 | mipsisa64el \ ++ | mipsisa64sb1 | mipsisa64sb1el \ ++ | mipstx39 | mipstx39el \ ++ | mn10200 | mn10300 \ ++ | ns16k | ns32k \ ++ | openrisc | or32 \ ++ | pdp10 | pdp11 | pj | pjl \ ++ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ ++ | pyramid \ ++ | sh | sh[1234] | sh3e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ ++ | sh64 | sh64le \ ++ | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ ++ | strongarm \ ++ | tahoe | thumb | tic80 | tron \ ++ | v850 | v850e \ ++ | we32k \ ++ | x86 | xscale | xstormy16 | xtensa \ ++ | z8k) ++ basic_machine=$basic_machine-unknown ++ ;; ++ m6811 | m68hc11 | m6812 | m68hc12) ++ # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown ++ os=-none + ;; +- m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl) ++ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. +- i[34567]86) ++ i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. +@@ -195,24 +284,54 @@ + exit 1 + ;; + # Recognize the basic CPU types with company name. +- # FIXME: clean up the formatting here. +- vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ +- | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \ +- | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ +- | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ +- | xmp-* | ymp-* \ +- | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* | hppa2.0n-* \ +- | alpha-* | alphaev[4-7]-* | alphaev56-* | alphapca5[67]-* \ +- | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ +- | clipper-* | orion-* \ +- | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ +- | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \ +- | mips64el-* | mips64orion-* | mips64orionel-* \ +- | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ +- | mipstx39-* | mipstx39el-* | mcore-* \ +- | f301-* | armv*-* | t3e-* \ +- | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ +- | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* ) ++ 580-* \ ++ | a29k-* \ ++ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ ++ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ ++ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ ++ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ ++ | avr-* \ ++ | bs2000-* \ ++ | c[123]* | c30-* | [cjt]90-* | c54x-* \ ++ | clipper-* | cydra-* \ ++ | d10v-* | d30v-* | dlx-* \ ++ | elxsi-* \ ++ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ ++ | h8300-* | h8500-* \ ++ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ ++ | i*86-* | i860-* | i960-* | ia64-* \ ++ | ip2k-* \ ++ | m32r-* \ ++ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ ++ | m88110-* | m88k-* | mcore-* \ ++ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ ++ | mips16-* \ ++ | mips64-* | mips64el-* \ ++ | mips64orion-* | mips64orionel-* \ ++ | mips64vr4100-* | mips64vr4100el-* \ ++ | mips64vr4300-* | mips64vr4300el-* \ ++ | mips64vr5000-* | mips64vr5000el-* \ ++ | mipsisa32-* | mipsisa32el-* \ ++ | mipsisa64-* | mipsisa64el-* \ ++ | mipsisa64sb1-* | mipsisa64sb1el-* \ ++ | mipstx39 | mipstx39el \ ++ | none-* | np1-* | ns16k-* | ns32k-* \ ++ | orion-* \ ++ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ ++ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ ++ | pyramid-* \ ++ | romp-* | rs6000-* \ ++ | sh-* | sh[1234]-* | sh3e-* | sh[34]eb-* | shbe-* \ ++ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ ++ | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ ++ | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ ++ | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ ++ | v850-* | v850e-* | vax-* \ ++ | we32k-* \ ++ | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ ++ | xtensa-* \ ++ | ymp-* \ ++ | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. +@@ -249,14 +368,14 @@ + os=-sysv + ;; + amiga | amiga-*) +- basic_machine=m68k-cbm ++ basic_machine=m68k-unknown + ;; + amigaos | amigados) +- basic_machine=m68k-cbm ++ basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) +- basic_machine=m68k-cbm ++ basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) +@@ -275,6 +394,10 @@ + basic_machine=ns32k-sequent + os=-dynix + ;; ++ c90) ++ basic_machine=c90-cray ++ os=-unicos ++ ;; + convex-c1) + basic_machine=c1-convex + os=-bsd +@@ -295,27 +418,30 @@ + basic_machine=c38-convex + os=-bsd + ;; +- cray | ymp) +- basic_machine=ymp-cray +- os=-unicos +- ;; +- cray2) +- basic_machine=cray2-cray +- os=-unicos +- ;; +- [ctj]90-cray) +- basic_machine=c90-cray ++ cray | j90) ++ basic_machine=j90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; ++ cris | cris-* | etrax*) ++ basic_machine=cris-axis ++ ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; ++ decsystem10* | dec10*) ++ basic_machine=pdp10-dec ++ os=-tops10 ++ ;; ++ decsystem20* | dec20*) ++ basic_machine=pdp10-dec ++ os=-tops20 ++ ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola +@@ -357,6 +483,10 @@ + basic_machine=tron-gmicro + os=-sysv + ;; ++ go32) ++ basic_machine=i386-pc ++ os=-go32 ++ ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 +@@ -432,19 +562,19 @@ + basic_machine=i370-ibm + ;; + # I'm not sure what "Sysv32" means. Should this be sysv3.2? +- i[34567]86v32) ++ i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; +- i[34567]86v4*) ++ i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; +- i[34567]86v) ++ i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; +- i[34567]86sol2) ++ i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; +@@ -456,17 +586,6 @@ + basic_machine=i386-unknown + os=-vsta + ;; +- i386-go32 | go32) +- basic_machine=i386-unknown +- os=-go32 +- ;; +- i386-mingw32 | mingw32) +- basic_machine=i386-unknown +- os=-mingw32 +- ;; +- i386-qnx | qnx) +- basic_machine=i386-qnx +- ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in +@@ -492,6 +611,10 @@ + basic_machine=ns32k-utek + os=-sysv + ;; ++ mingw32) ++ basic_machine=i386-pc ++ os=-mingw32 ++ ;; + miniframe) + basic_machine=m68000-convergent + ;; +@@ -499,26 +622,26 @@ + basic_machine=m68k-atari + os=-mint + ;; +- mipsel*-linux*) +- basic_machine=mipsel-unknown +- os=-linux-gnu +- ;; +- mips*-linux*) +- basic_machine=mips-unknown +- os=-linux-gnu +- ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; ++ mmix*) ++ basic_machine=mmix-knuth ++ os=-mmixware ++ ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; ++ morphos) ++ basic_machine=powerpc-unknown ++ os=-morphos ++ ;; + msdos) +- basic_machine=i386-unknown ++ basic_machine=i386-pc + os=-msdos + ;; + mvs) +@@ -582,13 +705,24 @@ + basic_machine=i960-intel + os=-mon960 + ;; ++ nonstopux) ++ basic_machine=mips-compaq ++ os=-nonstopux ++ ;; + np1) + basic_machine=np1-gould + ;; ++ nsr-tandem) ++ basic_machine=nsr-tandem ++ ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; ++ or32 | or32-*) ++ basic_machine=or32-unknown ++ os=-coff ++ ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose +@@ -614,28 +748,28 @@ + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; +- pentium | p5 | k5 | k6 | nexen) ++ pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; +- pentiumpro | p6 | 6x86) ++ pentiumpro | p6 | 6x86 | athlon) + basic_machine=i686-pc + ;; + pentiumii | pentium2) +- basic_machine=i786-pc ++ basic_machine=i686-pc + ;; +- pentium-* | p5-* | k5-* | k6-* | nexen-*) ++ pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; +- pentiumpro-* | p6-* | 6x86-*) ++ pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) +- basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ++ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; +- power) basic_machine=rs6000-ibm ++ power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; +@@ -647,9 +781,23 @@ + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; ++ ppc64) basic_machine=powerpc64-unknown ++ ;; ++ ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; ++ ppc64le | powerpc64little | ppc64-le | powerpc64-little) ++ basic_machine=powerpc64le-unknown ++ ;; ++ ppc64le-* | powerpc64little-*) ++ basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ++ ;; + ps2) + basic_machine=i386-ibm + ;; ++ pw32) ++ basic_machine=i586-unknown ++ os=-pw32 ++ ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff +@@ -660,6 +808,12 @@ + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; ++ s390 | s390-*) ++ basic_machine=s390-ibm ++ ;; ++ s390x | s390x-*) ++ basic_machine=s390x-ibm ++ ;; + sa29200) + basic_machine=a29k-amd + os=-udi +@@ -671,7 +825,7 @@ + basic_machine=sh-hitachi + os=-hms + ;; +- sparclite-wrs) ++ sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; +@@ -729,20 +883,40 @@ + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; ++ sv1) ++ basic_machine=sv1-cray ++ os=-unicos ++ ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; ++ t3d) ++ basic_machine=alpha-cray ++ os=-unicos ++ ;; + t3e) +- basic_machine=t3e-cray ++ basic_machine=alphaev5-cray ++ os=-unicos ++ ;; ++ t90) ++ basic_machine=t90-cray + os=-unicos + ;; ++ tic54x | c54x*) ++ basic_machine=tic54x-unknown ++ os=-coff ++ ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; ++ toad1) ++ basic_machine=pdp10-xkl ++ os=-tops20 ++ ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; +@@ -789,13 +963,17 @@ + basic_machine=hppa1.1-winbond + os=-proelf + ;; +- xmp) +- basic_machine=xmp-cray +- os=-unicos ++ windows32) ++ basic_machine=i386-pc ++ os=-windows32-msvcrt + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; ++ ymp) ++ basic_machine=ymp-cray ++ os=-unicos ++ ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim +@@ -816,13 +994,6 @@ + op60c) + basic_machine=hppa1.1-oki + ;; +- mips) +- if [ x$os = x-linux-gnu ]; then +- basic_machine=mips-unknown +- else +- basic_machine=mips-mips +- fi +- ;; + romp) + basic_machine=romp-ibm + ;; +@@ -832,13 +1003,23 @@ + vax) + basic_machine=vax-dec + ;; ++ pdp10) ++ # there are many clones, so DEC is not a safe bet ++ basic_machine=pdp10-unknown ++ ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; +- sparc | sparcv9) ++ sh3 | sh4 | sh3eb | sh4eb | sh[1234]le | sh3ele) ++ basic_machine=sh-unknown ++ ;; ++ sh64) ++ basic_machine=sh64-unknown ++ ;; ++ sparc | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) +@@ -860,6 +1041,9 @@ + basic_machine=c4x-none + os=-coff + ;; ++ *-unknown) ++ # Make sure to match an already-canonicalized machine name. ++ ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 +@@ -916,14 +1100,31 @@ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ ++ | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ +- | -interix* | -uwin* | -rhapsody* | -opened* | -openstep* | -oskit*) ++ | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ ++ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ ++ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ ++ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ ++ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* | -powermax*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; ++ -qnx*) ++ case $basic_machine in ++ x86-* | i*86-*) ++ ;; ++ *) ++ os=-nto$os ++ ;; ++ esac ++ ;; ++ -nto*) ++ os=-nto-qnx ++ ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ +- | -macos* | -mpw* | -magic* | -mon960* | -lnews*) ++ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` +@@ -940,6 +1141,9 @@ + -opened*) + os=-openedition + ;; ++ -wince*) ++ os=-wince ++ ;; + -osfrose*) + os=-osfrose + ;; +@@ -955,15 +1159,24 @@ + -acis*) + os=-aos + ;; ++ -atheos*) ++ os=-atheos ++ ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; ++ -nova*) ++ os=-rtmk-nova ++ ;; + -ns2 ) + os=-nextstep2 + ;; ++ -nsk*) ++ os=-nsk ++ ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` +@@ -977,9 +1190,6 @@ + -oss*) + os=-sysv3 + ;; +- -qnx) +- os=-qnx4 +- ;; + -svr4) + os=-sysv4 + ;; +@@ -1001,7 +1211,7 @@ + -xenix) + os=-xenix + ;; +- -*mint | -*MiNT) ++ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -none) +@@ -1035,6 +1245,10 @@ + arm*-semi) + os=-aout + ;; ++ # This must come before the *-dec entry. ++ pdp10-*) ++ os=-tops20 ++ ;; + pdp11-*) + os=-none + ;; +@@ -1062,6 +1276,9 @@ + mips*-*) + os=-elf + ;; ++ or32-*) ++ os=-coff ++ ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; +@@ -1143,7 +1360,7 @@ + *-masscomp) + os=-rtu + ;; +- f301-fujitsu) ++ f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) +@@ -1209,7 +1426,7 @@ + -ptx*) + vendor=sequent + ;; +- -vxsim* | -vxworks*) ++ -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) +@@ -1221,12 +1438,23 @@ + -mpw* | -macos*) + vendor=apple + ;; +- -*mint | -*MiNT) ++ -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; ++ -vos*) ++ vendor=stratus ++ ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; + esac + + echo $basic_machine$os ++exit 0 ++ ++# Local variables: ++# eval: (add-hook 'write-file-hooks 'time-stamp) ++# time-stamp-start: "timestamp='" ++# time-stamp-format: "%:y-%02m-%02d" ++# time-stamp-end: "'" ++# End: diff --git a/patches/glibc/2.1.3/el.po.patch b/patches/glibc/2.1.3/el.po.patch new file mode 100644 index 00000000..15ed1de9 --- /dev/null +++ b/patches/glibc/2.1.3/el.po.patch @@ -0,0 +1,40 @@ +From +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/po/Makefile.diff?r1=1.17&r2=1.18&cvsroot=glibc + +Fixes error + msgfmt -o el.mo el.po + el.po:538:31: invalid multibyte sequence + el.po:539:21: invalid multibyte sequence + el.po:1537:38: invalid multibyte sequence + msgfmt: found 3 fatal errors + make[2]: *** [el.mo] Error 1 + make[2]: Leaving directory + `/home/dkegel/wk/crosstool-0.25/build/i686-unknown-linux-gnu/gcc-2.95.3-glibc-2.1.3/glibc-2.1.3/po' + +=================================================================== +RCS file: /cvs/glibc/libc/po/Makefile,v +retrieving revision 1.17 +retrieving revision 1.18 +diff -u -r1.17 -r1.18 +--- libc/po/Makefile 1999/09/13 08:48:40 1.17 ++++ libc/po/Makefile 2001/04/20 04:45:54 1.18 +@@ -1,4 +1,4 @@ +-# Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++# Copyright (C) 1996, 1997, 1998, 1999, 2001 Free Software Foundation, Inc. + # This file is part of the GNU C Library. + + # The GNU C Library is free software; you can redistribute it and/or +@@ -20,8 +20,12 @@ + + subdir := po + ++# List of languages that are currently broken (just run msgfmt from ++# GNU gettext 0.10.36 on them to see why) ++BROKEN_LINGUAS = el ++ + # List of languages for which we have message catalogs of translations. +-ALL_LINGUAS := $(basename $(wildcard *.po)) ++ALL_LINGUAS := $(filter-out $(BROKEN_LINGUAS),$(basename $(wildcard *.po))) + + # You can override this in configparms or the make command line to limit + # the languages which get installed. diff --git a/patches/glibc/2.1.3/glibc-2.1.3-ac_cv_prog_cc_cross.patch b/patches/glibc/2.1.3/glibc-2.1.3-ac_cv_prog_cc_cross.patch new file mode 100644 index 00000000..0b5c5750 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-ac_cv_prog_cc_cross.patch @@ -0,0 +1,44 @@ +Lets you work around the canadian cross build error + +.../gcc-3.4.0-glibc-2.1.3/build-glibc/elf/sln .../gcc-3.4.0-glibc-2.1.3/build-glibc/elf/symlink.list +make[1]: *** [install-symbolic-link] Segmentation fault +make[1]: Leaving directory `.../gcc-3.4.0-glibc-2.1.3/glibc-2.1.3' +make: *** [install] Error 2 + +by setting --host != --build when running glibc-2.1.3/configure +instead of hoping that host and build aren't aliases for each other +and that running a host program on the build machine doesn't +put up a dialog box or accidentally work. + +(cf. http://sources.redhat.com/ml/crossgcc/2002-08/msg00099.html, in which +the run of conftest caused a dialog box to pop up and block the build on cygwin) + +--- glibc-2.1.3/configure.old 2004-05-26 19:30:45.000000000 -0700 ++++ glibc-2.1.3/configure 2004-05-26 19:42:29.000000000 -0700 +@@ -1224,7 +1224,7 @@ + build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + echo "$ac_t""$build" 1>&6 + +-if test $host != $build; then ++if test x$host_alias != x$build_alias; then + ac_tool_prefix=${host_alias}- + else + ac_tool_prefix= +@@ -1487,7 +1487,7 @@ + if { (eval echo configure:1488: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. +- if (./conftest; exit) 2>/dev/null; then ++ if test x$host_alias == x$build_alias && (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes +@@ -1566,7 +1566,7 @@ + build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + echo "$ac_t""$build" 1>&6 + +-if test $host != $build; then ++if test x$host_alias != x$build_alias; then + for ac_prog in gcc cc + do + # Extract the first word of "$ac_prog", so it can be a program name with args. diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-db2.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-db2.patch new file mode 100644 index 00000000..b337d0a9 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-db2.patch @@ -0,0 +1,17 @@ +Fixes error compiling with gcc-3.4.0: + +os/os_oflags.c: In function `__db_oflags': +os/os_oflags.c:48: error: label at end of compound statement +make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/build-glibc/db2/os_oflags.os] Error 1 + +--- glibc-2.1.3/db2/os/os_oflags.c.old Sun Apr 11 19:56:44 2004 ++++ glibc-2.1.3/db2/os/os_oflags.c Sun Apr 11 19:57:06 2004 +@@ -44,7 +44,7 @@ + case O_RDWR: + break; + default: /* Bogus flags value from user. */ +- /* XXX no way to return error from here */ ++ ; /* XXX no way to return error from here */ + } + if (oflags & O_CREAT) + dbflags |= DB_CREATE; diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-dns.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-dns.patch new file mode 100644 index 00000000..4005df75 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-dns.patch @@ -0,0 +1,21 @@ +Fixes + +nss_dns/dns-host.c: In function `_nss_dns_gethostbyaddr_r': +nss_dns/dns-host.c:268: error: label at end of compound statement +make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/build-glibc/resolv/dns-host.os] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/glibc-2.1.3/resolv' +make[1]: *** [resolv/others] Error 2 + +when building with gcc-3.4.0 + +--- glibc-2.1.3/resolv/nss_dns/dns-host.c.old Sun Apr 11 20:32:47 2004 ++++ glibc-2.1.3/resolv/nss_dns/dns-host.c Sun Apr 11 20:33:07 2004 +@@ -264,7 +264,7 @@ + strcpy (qp, "ip6.int"); + break; + default: +- /* Cannot happen. */ ++ ; /* Cannot happen. */ + } + + host_buffer = (querybuf *) malloc (sizeof (*host_buffer)); diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-fixup.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-fixup.patch new file mode 100644 index 00000000..0028d23d --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-fixup.patch @@ -0,0 +1,70 @@ +Fixes +dl-runtime.c:56: error: conflicting types for 'fixup' +../sysdeps/i386/dl-machine.h:158: error: previous declaration of 'fixup' was here +when building with gcc-3.4.0 + +First hunk: +Define ARCH_FIXUP_ATTRIBUTE and use it in the fixup function declarations. +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/dl-machine.h.diff?r1=1.124&r2=1.125&cvsroot=glibc +[rediffed against glibc-2.1.3] + +Second hunk: +If ARCH_FIXUP_ATTRIBUTE is not defined, provide dummy definition. +Use macro in fixup function definitions. +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/elf/dl-runtime.c.diff?r1=1.64&r2=1.65&cvsroot=glibc +[rediffed against glibc-2.3.2] + +=================================================================== +--- glibc-2.1.3/sysdeps/i386/dl-machine.h.old Sun Apr 11 18:58:45 2004 ++++ glibc-2.1.3/sysdeps/i386/dl-machine.h Sun Apr 11 18:59:51 2004 +@@ -70,11 +70,14 @@ + + We cannot use this scheme for profiling because the _mcount call + destroys the passed register information. */ ++ ++#define ARCH_FIXUP_ATTRIBUTE __attribute__ ((regparm (3), unused)) ++ + static ElfW(Addr) fixup (struct link_map *l, ElfW(Word) reloc_offset) +- __attribute__ ((regparm (2), unused)); ++ ARCH_FIXUP_ATTRIBUTE; + static ElfW(Addr) profile_fixup (struct link_map *l, ElfW(Word) reloc_offset, + ElfW(Addr) retaddr) +- __attribute__ ((regparm (3), unused)); ++ ARCH_FIXUP_ATTRIBUTE; + #endif + + /* Set up the loaded object described by L so its unrelocated PLT +=================================================================== +--- glibc-2.1.3/elf/dl-runtime.c~ Thu Jul 15 11:32:41 1999 ++++ glibc-2.1.3/elf/dl-runtime.c Sun Apr 11 19:02:01 2004 +@@ -31,6 +31,12 @@ + # define VERSYMIDX(sym) (DT_NUM + DT_PROCNUM + DT_VERSIONTAGIDX (sym)) + #endif + ++/* The fixup functions might have need special attributes. If none ++ are provided define the macro as empty. */ ++#ifndef ARCH_FIXUP_ATTRIBUTE ++# define ARCH_FIXUP_ATTRIBUTE ++#endif ++ + + /* This function is called through a special trampoline from the PLT the + first time each PLT entry is called. We must perform the relocation +@@ -40,7 +46,7 @@ + function. */ + + #ifndef ELF_MACHINE_NO_PLT +-static ElfW(Addr) __attribute__ ((unused)) ++static ElfW(Addr) __attribute__ ((unused)) ARCH_FIXUP_ATTRIBUTE + fixup ( + # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS + ELF_MACHINE_RUNTIME_FIXUP_ARGS, +@@ -105,7 +111,7 @@ + + #if !defined PROF && !defined ELF_MACHINE_NO_PLT + +-static ElfW(Addr) __attribute__ ((unused)) ++static ElfW(Addr) __attribute__ ((unused)) ARCH_FIXUP_ATTRIBUTE + profile_fixup ( + #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS + ELF_MACHINE_RUNTIME_FIXUP_ARGS, diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-generic.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-generic.patch new file mode 100644 index 00000000..8359cc66 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-generic.patch @@ -0,0 +1,157 @@ +Fixes following error when building with gcc-3.4.0: +../sysdeps/generic/strstr.c: In function `strstr': +../sysdeps/generic/strstr.c:85: error: label at end of compound statement +make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/build-glibc/string/strstr.o] Error 1 + + +-------- +CVSROOT: /cvs/glibc +Module name: libc +Changes by: drepper@sources.redhat.com 2000-11-25 23:30:03 + +Modified files: + sysdeps/generic: _strerror.c memrchr.c strcasestr.c strstr.c + +Log message: + Add casts to avoid warnings. +-------- + +Retrieved with + cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/glibc diff -u -D"2000-11-24 23:30:03" -D"2000-11-26 23:30:03" +then fixed paths and threw out first two hunks + + +#Index: _strerror.c +#=================================================================== +#RCS file: /cvs/libc/sysdeps/generic/_strerror.c,v +#retrieving revision 1.16 +#retrieving revision 1.17 +#diff -u -r1.16 -r1.17 +#--- libc/sysdeps/generic/_strerror.c 29 Aug 2000 01:09:56 -0000 1.16 +#+++ libc/sysdeps/generic/_strerror.c 26 Nov 2000 07:30:03 -0000 1.17 +#@@ -56,7 +56,7 @@ +# buffer size. */ +# q = __mempcpy (buf, unk, MIN (unklen, buflen)); +# if (unklen < buflen) +#- memcpy (q, p, MIN (&numbuf[21] - p, buflen - unklen)); +#+ memcpy (q, p, MIN ((size_t) (&numbuf[21] - p), buflen - unklen)); +# +# /* Terminate the string in any case. */ +# if (buflen > 0) +#Index: memrchr.c +#=================================================================== +#RCS file: /cvs/libc/sysdeps/generic/memrchr.c,v +#retrieving revision 1.5 +#retrieving revision 1.6 +#diff -u -r1.5 -r1.6 +#--- libc/sysdeps/generic/memrchr.c 23 Oct 2000 23:07:32 -0000 1.5 +#+++ libc/sysdeps/generic/memrchr.c 26 Nov 2000 07:30:03 -0000 1.6 +#@@ -86,7 +86,7 @@ +# /* All these elucidatory comments refer to 4-byte longwords, +# but the theory applies equally well to 8-byte longwords. */ +# +#- longword_ptr = (unsigned long int *) char_ptr; +#+ longword_ptr = (const unsigned long int *) char_ptr; +# +# /* Bits 31, 24, 16, and 8 of this number are zero. Call these bits +# the "holes." Note that there is a hole just to the left of +Index: strcasestr.c +=================================================================== +RCS file: /cvs/libc/sysdeps/generic/strcasestr.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/sysdeps/generic/strcasestr.c 23 Jan 1999 22:16:03 -0000 1.3 ++++ libc/sysdeps/generic/strcasestr.c 26 Nov 2000 07:30:03 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Return the offset of one string within another. +- Copyright (C) 1994, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. ++ Copyright (C) 1994,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 +@@ -62,7 +62,7 @@ + if (c == '\0') + goto ret0; + } +- while (_tolower (c) != b); ++ while (_tolower (c) != (int) b); + + c = _tolower (*++needle); + if (c == '\0') +@@ -80,40 +80,42 @@ + a = *++haystack; + if (a == '\0') + goto ret0; +- if (_tolower (a) == b) ++ if (_tolower (a) == (int) b) + break; + a = *++haystack; + if (a == '\0') + goto ret0; +-shloop: } +- while (_tolower (a) != b); ++shloop: ++ ; ++ } ++ while (_tolower (a) != (int) b); + + jin: a = *++haystack; + if (a == '\0') + goto ret0; + +- if (_tolower (a) != c) ++ if (_tolower (a) != (int) c) + goto shloop; + + rhaystack = haystack-- + 1; + rneedle = needle; + a = _tolower (*rneedle); + +- if (_tolower (*rhaystack) == a) ++ if (_tolower (*rhaystack) == (int) a) + do + { + if (a == '\0') + goto foundneedle; + ++rhaystack; + a = _tolower (*++needle); +- if (_tolower (*rhaystack) != a) ++ if (_tolower (*rhaystack) != (int) a) + break; + if (a == '\0') + goto foundneedle; + ++rhaystack; + a = _tolower (*++needle); + } +- while (_tolower (*rhaystack) == a); ++ while (_tolower (*rhaystack) == (int) a); + + needle = rneedle; /* took the register-poor approach */ + +Index: strstr.c +=================================================================== +RCS file: /cvs/libc/sysdeps/generic/strstr.c,v +retrieving revision 1.10 +retrieving revision 1.11 +diff -u -r1.10 -r1.11 +--- libc/sysdeps/generic/strstr.c 11 Sep 1997 03:18:20 -0000 1.10 ++++ libc/sysdeps/generic/strstr.c 26 Nov 2000 07:30:03 -0000 1.11 +@@ -1,5 +1,5 @@ + /* Return the offset of one string within another. +- Copyright (C) 1994, 1996, 1997 Free Software Foundation, Inc. ++ Copyright (C) 1994, 1996, 1997, 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 +@@ -82,7 +82,9 @@ + a = *++haystack; + if (a == '\0') + goto ret0; +-shloop: } ++shloop: ++ ; ++ } + while (a != b); + + jin: a = *++haystack; diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-grp.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-grp.patch new file mode 100644 index 00000000..db70efb2 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-grp.patch @@ -0,0 +1,56 @@ +Fixes +initgroups.c: In function `internal_getgrouplist': +initgroups.c:179: error: parse error before "__FUNCTION__" + +CVSROOT: /cvs/glibc +Module name: libc +Changes by: roland@sources.redhat.com 2001-12-16 21:52:12 + +Modified files: + nss : nsswitch.c + grp : initgroups.c + +Log message: + 2001-12-16 Roland McGrath <roland@frob.com> + + * nss/nsswitch.c (__nss_next): Don't use __FUNCTION__ as literal. + * grp/initgroups.c (internal_getgrouplist): Likewise. + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/grp/initgroups.c.diff?r1=1.26&r2=1.27&cvsroot=glibc +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/nss/nsswitch.c.diff?r1=1.52&r2=1.53&cvsroot=glibc + +Removed 2nd hunk for glibc-2.1.3 (it was just whitespace) + +=================================================================== +RCS file: /cvs/glibc/libc/grp/initgroups.c,v +retrieving revision 1.26 +retrieving revision 1.27 +diff -u -r1.26 -r1.27 +--- libc/grp/initgroups.c 2001/07/06 04:54:46 1.26 ++++ libc/grp/initgroups.c 2001/12/17 05:52:11 1.27 +@@ -176,7 +176,7 @@ + + /* This is really only for debugging. */ + if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN) +- __libc_fatal ("illegal status in " __FUNCTION__); ++ __libc_fatal ("illegal status in internal_getgrouplist"); + + if (status != NSS_STATUS_SUCCESS + && nss_next_action (nip, status) == NSS_ACTION_RETURN) + +=================================================================== +RCS file: /cvs/glibc/libc/nss/nsswitch.c,v +retrieving revision 1.52 +retrieving revision 1.53 +diff -u -r1.52 -r1.53 +--- libc/nss/nsswitch.c 2001/07/17 08:21:36 1.52 ++++ libc/nss/nsswitch.c 2001/12/17 05:52:11 1.53 +@@ -178,7 +178,7 @@ + { + /* This is really only for debugging. */ + if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN) +- __libc_fatal ("illegal status in " __FUNCTION__); ++ __libc_fatal ("illegal status in __nss_next"); + + if (nss_next_action (*ni, status) == NSS_ACTION_RETURN) + return 1; diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-locale.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-locale.patch new file mode 100644 index 00000000..f3bd4abf --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-locale.patch @@ -0,0 +1,33 @@ +programs/locfile.c: In function `locfile_read': +programs/locfile.c:863: error: label at end of compound statement +make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/build-glibc/locale/locfile.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/glibc-2.1.3/locale' + +programs/locale.c: In function `print_item': +programs/locale.c:666: error: label at end of compound statement +make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/build-glibc/locale/locale.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/glibc-2.1.3/locale' + + +Mechanical changes to quiet the errors. + +--- glibc-2.1.3/locale/programs/locfile.c.old Sun Apr 11 20:03:52 2004 ++++ glibc-2.1.3/locale/programs/locfile.c Sun Apr 11 20:04:47 2004 +@@ -860,6 +860,7 @@ + + collate_end_weight (ldfile, result); + illegal_weight: ++ ; /* gcc-3.4 requires a statement here */ + } + continue; + +--- glibc-2.1.3/locale/programs/locale.c.old Sun Apr 11 20:08:48 2004 ++++ glibc-2.1.3/locale/programs/locale.c Sun Apr 11 20:09:04 2004 +@@ -663,6 +663,7 @@ + } + break; + default: ++ ; /* gcc-3.4 requires a statement here */ + } + putchar ('\n'); + } diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-mntent.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-mntent.patch new file mode 100644 index 00000000..dde7bf34 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-mntent.patch @@ -0,0 +1,39 @@ +Fixes compilation with gcc-3.4.0: + +mntent_r.c: In function `__getmntent_r': +mntent_r.c:146: error: label at end of compound statement +mntent_r.c: In function `__addmntent': +mntent_r.c:214: warning: implicit declaration of function `alloca' + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/misc/mntent_r.c.diff?r1=1.9&r2=1.11&cvsroot=glibc + +=================================================================== +RCS file: /cvs/glibc/libc/misc/mntent_r.c,v +retrieving revision 1.9 +retrieving revision 1.11 +diff -u -r1.9 -r1.11 +--- libc/misc/mntent_r.c 1999/07/26 01:45:32 1.9 ++++ libc/misc/mntent_r.c 2000/11/28 07:27:14 1.11 +@@ -1,5 +1,5 @@ + /* Utilities for reading/writing fstab, mtab, etc. +- Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. ++ Copyright (C) 1995,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 +@@ -17,6 +17,7 @@ + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + ++#include <alloca.h> + #include <mntent.h> + #include <stdio.h> + #include <string.h> +@@ -143,6 +144,7 @@ + case 1: + mp->mnt_passno = 0; + case 2: ++ break; + } + funlockfile (stream); + diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-sunrpc.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-sunrpc.patch new file mode 100644 index 00000000..c54d7a22 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc-3.4-sunrpc.patch @@ -0,0 +1,33 @@ +Fixes gcc-3.4.0 compilation errors + +rpc_hout.c: In function `print_funcdef': +rpc_hout.c:140: error: label at end of compound statement +make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/build-glibc/sunrpc/rpc_hout.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/glibc-2.1.3/sunrpc' + +rpc_cout.c: In function `emit_inline': +rpc_cout.c:743: error: label at end of compound statement +... + +--- glibc-2.1.3/sunrpc/rpc_hout.c.old Sun Apr 11 22:06:26 2004 ++++ glibc-2.1.3/sunrpc/rpc_hout.c Sun Apr 11 22:06:42 2004 +@@ -136,7 +136,7 @@ + pprogramdef (def); + break; + default: +- /* ?... shouldn't happen I guess */ ++ ; /* ?... shouldn't happen I guess */ + } + } + +--- glibc-2.1.3/sunrpc/rpc_cout.c.old Sun Apr 11 22:10:39 2004 ++++ glibc-2.1.3/sunrpc/rpc_cout.c Sun Apr 11 22:10:53 2004 +@@ -739,7 +739,7 @@ + f_print (fout, "}\n"); + break; + default: +- /* ?... do nothing I guess */ ++ ; /* ?... do nothing I guess */ + } + } + diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-configure.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-configure.patch new file mode 100644 index 00000000..eb03dd02 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-configure.patch @@ -0,0 +1,11 @@ +--- glibc-2.1.3/configure.old 2004-03-04 11:05:49.000000000 -0800 ++++ glibc-2.1.3/configure 2004-03-04 11:07:58.000000000 -0800 +@@ -1273,7 +1273,7 @@ + ac_prog_version=`$CC -v 2>&1 | sed -n 's/^.*version \([egcygnustp-]*[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; +- egcs-2.9[1-9].*|egcs-2.90.2[789]|egcs-2.90.[3-9][0-9]|*gcc-2.9[1-9].*|pgcc-2.90.2[789]|pgcc-2.90.[3-9][0-9]|*2.8.[1-9]*|*2.9|*2.9.[0-9]*|2.9[5-9]*|cygnus-2.9[1-9].*|gcc-2.9[5-9]|gcc-2.1[0-9][0-9]) ++ egcs-2.9[1-9].*|egcs-2.90.2[789]|egcs-2.90.[3-9][0-9]|*gcc-2.9[1-9].*|pgcc-2.90.2[789]|pgcc-2.90.[3-9][0-9]|*2.8.[1-9]*|*2.9|*2.9.[0-9]*|2.9[5-9]*|3.[2-9]*|cygnus-2.9[1-9].*|gcc-2.9[5-9]|gcc-2.1[0-9][0-9]) + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-dl-machine-i386.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-dl-machine-i386.patch new file mode 100644 index 00000000..2a98ac94 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-dl-machine-i386.patch @@ -0,0 +1,171 @@ + * sysdeps/i386/dl-machine.h (RTLD_START): Don't use multi-line + strings. + (ELF_MACHINE_RUNTIME_TRAMPOLINE): Likewise. + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/dl-machine.h.diff?r1=1.82&r2=1.83&cvsroot=glibc&hideattic=0 +backported a bit + +--- glibc-2.1.3/sysdeps/i386/dl-machine.h.old 1999-02-20 10:19:47.000000000 -0800 ++++ glibc-2.1.3/sysdeps/i386/dl-machine.h 2004-03-05 15:56:25.000000000 -0800 +@@ -124,68 +124,68 @@ + and then redirect to the address it returns. */ + #ifndef PROF + # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ +- .text +- .globl _dl_runtime_resolve +- .type _dl_runtime_resolve, @function +- .align 16 +-_dl_runtime_resolve: +- pushl %eax # Preserve registers otherwise clobbered. +- pushl %ecx +- pushl %edx +- movl 16(%esp), %edx # Copy args pushed by PLT in register. Note +- movl 12(%esp), %eax # that `fixup' takes its parameters in regs. +- call fixup # Call resolver. +- popl %edx # Get register content back. +- popl %ecx +- xchgl %eax, (%esp) # Get %eax contents end store function address. +- ret $8 # Jump to function address. +- .size _dl_runtime_resolve, .-_dl_runtime_resolve +- +- .globl _dl_runtime_profile +- .type _dl_runtime_profile, @function +- .align 16 +-_dl_runtime_profile: +- pushl %eax # Preserve registers otherwise clobbered. +- pushl %ecx +- pushl %edx +- movl 20(%esp), %ecx # Load return address +- movl 16(%esp), %edx # Copy args pushed by PLT in register. Note +- movl 12(%esp), %eax # that `fixup' takes its parameters in regs. +- call profile_fixup # Call resolver. +- popl %edx # Get register content back. +- popl %ecx +- xchgl %eax, (%esp) # Get %eax contents end store function address. +- ret $8 # Jump to function address. +- .size _dl_runtime_profile, .-_dl_runtime_profile +- .previous ++ .text\n\ ++ .globl _dl_runtime_resolve\n\ ++ .type _dl_runtime_resolve, @function\n\ ++ .align 16\n\ ++_dl_runtime_resolve:\n\ ++ pushl %eax # Preserve registers otherwise clobbered.\n\ ++ pushl %ecx\n\ ++ pushl %edx\n\ ++ movl 16(%esp), %edx # Copy args pushed by PLT in register. Note\n\ ++ movl 12(%esp), %eax # that `fixup' takes its parameters in regs.\n\ ++ call fixup # Call resolver.\n\ ++ popl %edx # Get register content back.\n\ ++ popl %ecx\n\ ++ xchgl %eax, (%esp) # Get %eax contents end store function address.\n\ ++ ret $8 # Jump to function address.\n\ ++ .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\ ++\n\ ++ .globl _dl_runtime_profile\n\ ++ .type _dl_runtime_profile, @function\n\ ++ .align 16\n\ ++_dl_runtime_profile:\n\ ++ pushl %eax # Preserve registers otherwise clobbered.\n\ ++ pushl %ecx\n\ ++ pushl %edx\n\ ++ movl 20(%esp), %ecx # Load return address\n\ ++ movl 16(%esp), %edx # Copy args pushed by PLT in register. Note\n\ ++ movl 12(%esp), %eax # that `fixup' takes its parameters in regs.\n\ ++ call profile_fixup # Call resolver.\n\ ++ popl %edx # Get register content back.\n\ ++ popl %ecx\n\ ++ xchgl %eax, (%esp) # Get %eax contents end store function address.\n\ ++ ret $8 # Jump to function address.\n\ ++ .size _dl_runtime_profile, .-_dl_runtime_profile\n\ ++ .previous\n\ + "); + #else +-# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ +- .text +- .globl _dl_runtime_resolve +- .globl _dl_runtime_profile +- .type _dl_runtime_resolve, @function +- .type _dl_runtime_profile, @function +- .align 16 +-_dl_runtime_resolve: +-_dl_runtime_profile: +- pushl %eax # Preserve registers otherwise clobbered. +- pushl %ecx +- pushl %edx +- movl 16(%esp), %edx # Push the arguments for `fixup' +- movl 12(%esp), %eax +- pushl %edx +- pushl %eax +- call fixup # Call resolver. +- popl %edx # Pop the parameters +- popl %ecx +- popl %edx # Get register content back. +- popl %ecx +- xchgl %eax, (%esp) # Get %eax contents end store function address. +- ret $8 # Jump to function address. +- .size _dl_runtime_resolve, .-_dl_runtime_resolve +- .size _dl_runtime_profile, .-_dl_runtime_profile +- .previous ++# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\n\ ++ .text\n\ ++ .globl _dl_runtime_resolve\n\ ++ .globl _dl_runtime_profile\n\ ++ .type _dl_runtime_resolve, @function\n\ ++ .type _dl_runtime_profile, @function\n\ ++ .align 16\n\ ++_dl_runtime_resolve:\n\ ++_dl_runtime_profile:\n\ ++ pushl %eax # Preserve registers otherwise clobbered.\n\ ++ pushl %ecx\n\ ++ pushl %edx\n\ ++ movl 16(%esp), %edx # Push the arguments for `fixup'\n\ ++ movl 12(%esp), %eax\n\ ++ pushl %edx\n\ ++ pushl %eax\n\ ++ call fixup # Call resolver.\n\ ++ popl %edx # Pop the parameters\n\ ++ popl %ecx\n\ ++ popl %edx # Get register content back.\n\ ++ popl %ecx\n\ ++ xchgl %eax, (%esp) # Get %eax contents end store function address.\n\ ++ ret $8 # Jump to function address.\n\ ++ .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\ ++ .size _dl_runtime_profile, .-_dl_runtime_profile\n\ ++ .previous\n\ + "); + #endif + +@@ -197,10 +197,10 @@ + The C function `_dl_start' is the real entry point; + its return value is the user program's entry point. */ + +-#define RTLD_START asm ("\ +-.text\n\ +-.globl _start\n\ +-.globl _dl_start_user\n\ ++#define RTLD_START asm ("\n\ ++ .text\n\ ++ .globl _start\n\ ++ .globl _dl_start_user\n\ + _start:\n\ + pushl %esp\n\ + call _dl_start\n\ +@@ -208,7 +208,7 @@ + _dl_start_user:\n\ + # Save the user entry point address in %edi.\n\ + movl %eax, %edi\n\ +- # Point %ebx at the GOT. ++ # Point %ebx at the GOT.\n\ + call 0f\n\ + 0: popl %ebx\n\ + addl $_GLOBAL_OFFSET_TABLE_+[.-0b], %ebx\n\ +@@ -255,7 +255,7 @@ + movl _dl_fini@GOT(%ebx), %edx\n\ + # Jump to the user's entry point.\n\ + jmp *%edi\n\ +-.previous\n\ ++ .previous\n\ + "); + + /* Nonzero iff TYPE should not be allowed to resolve to one of diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-errlist.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-errlist.patch new file mode 100644 index 00000000..7c035298 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-errlist.patch @@ -0,0 +1,48 @@ +Backport from cvs + +Fixes: + +../sysdeps/unix/sysv/linux/errlist.c:41: weak declaration of `_old_sys_nerr' must precede definition +make[2]: *** [/home/dank/downloads/crosstool-0.24/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.3/build-glibc/stdio-common/errlist.os] Error 1 + +as well as breakage on arches where ; is a comment char in asm + +--- glibc-2.1.3/sysdeps/unix/sysv/linux/errlist.c.old 2004-03-05 15:32:21.000000000 -0800 ++++ glibc-2.1.3/sysdeps/unix/sysv/linux/errlist.c 2004-03-05 15:39:39.000000000 -0800 +@@ -24,13 +24,13 @@ + # define SYS_ERRLIST __new_sys_errlist + # define SYS_NERR __new_sys_nerr + +-asm (".data; .globl __old_sys_errlist; __old_sys_errlist:"); ++asm (".data\n\t.globl __old_sys_errlist\n\t __old_sys_errlist:"); + #endif + + #include <sysdeps/gnu/errlist.c> + + #if defined HAVE_ELF && defined PIC && defined DO_VERSIONING +-asm (".type __old_sys_errlist,@object;.size __old_sys_errlist," ++asm (".type __old_sys_errlist,@object\n\t.size __old_sys_errlist," + OLD_ERRLIST_SIZE_STR "*" PTR_SIZE_STR); + + extern const char *const *__old_sys_errlist; +@@ -38,17 +38,16 @@ + const int __old_sys_nerr = OLD_ERRLIST_SIZE; + + strong_alias (__old_sys_nerr, _old_sys_nerr); +-weak_alias (__old_sys_nerr, _old_sys_nerr) + symbol_version (__old_sys_nerr, _sys_nerr, GLIBC_2.0); + symbol_version (_old_sys_nerr, sys_nerr, GLIBC_2.0); +-weak_alias (__old_sys_errlist, _old_sys_errlist); ++strong_alias (__old_sys_errlist, _old_sys_errlist); + symbol_version (__old_sys_errlist, _sys_errlist, GLIBC_2.0); + symbol_version (_old_sys_errlist, sys_errlist, GLIBC_2.0); + +-weak_alias (__new_sys_nerr, _new_sys_nerr) ++strong_alias (__new_sys_nerr, _new_sys_nerr) + default_symbol_version (__new_sys_nerr, _sys_nerr, GLIBC_2.1); + default_symbol_version (_new_sys_nerr, sys_nerr, GLIBC_2.1); +-weak_alias (__new_sys_errlist, _new_sys_errlist) ++strong_alias (__new_sys_errlist, _new_sys_errlist) + default_symbol_version (__new_sys_errlist, _sys_errlist, GLIBC_2.1); + default_symbol_version (_new_sys_errlist, sys_errlist, GLIBC_2.1); + diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-longlong.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-longlong.patch new file mode 100644 index 00000000..99ef3564 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-longlong.patch @@ -0,0 +1,774 @@ +--- glibc-2.1.3/stdlib/longlong.h.old 2004-03-05 14:49:14.000000000 -0800 ++++ glibc-2.1.3/stdlib/longlong.h 2004-03-05 15:19:26.000000000 -0800 +@@ -106,8 +106,8 @@ + + #if (defined (__a29k__) || defined (_AM29K)) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("add %1,%4,%5 +- addc %0,%2,%3" \ ++ __asm__ ("add %1,%4,%5\n" \ ++ "addc %0,%2,%3" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "%r" ((USItype)(ah)), \ +@@ -115,8 +115,8 @@ + "%r" ((USItype)(al)), \ + "rI" ((USItype)(bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("sub %1,%4,%5 +- subc %0,%2,%3" \ ++ __asm__ ("sub %1,%4,%5\n" \ ++ "subc %0,%2,%3" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "r" ((USItype)(ah)), \ +@@ -173,8 +173,8 @@ + + #if defined (__arm__) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("adds %1, %4, %5 +- adc %0, %2, %3" \ ++ __asm__ ("adds %1, %4, %5\n" \ ++ "adc %0, %2, %3" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "%r" ((USItype)(ah)), \ +@@ -182,8 +182,8 @@ + "%r" ((USItype)(al)), \ + "rI" ((USItype)(bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("subs %1, %4, %5 +- sbc %0, %2, %3" \ ++ __asm__ ("subs %1, %4, %5\n" \ ++ "sbc %0, %2, %3" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "r" ((USItype)(ah)), \ +@@ -192,19 +192,19 @@ + "rI" ((USItype)(bl))) + #if 0 + #define umul_ppmm(xh, xl, a, b) \ +- __asm__ ("%@ Inlined umul_ppmm +- mov %|r0, %2, lsr #16 +- mov %|r2, %3, lsr #16 +- bic %|r1, %2, %|r0, lsl #16 +- bic %|r2, %3, %|r2, lsl #16 +- mul %1, %|r1, %|r2 +- mul %|r2, %|r0, %|r2 +- mul %|r1, %0, %|r1 +- mul %0, %|r0, %0 +- adds %|r1, %|r2, %|r1 +- addcs %0, %0, #65536 +- adds %1, %1, %|r1, lsl #16 +- adc %0, %0, %|r1, lsr #16" \ ++ __asm__ ("%@ Inlined umul_ppmm\n" \ ++ "mov %|r0, %2, lsr #16\n" \ ++ "mov %|r2, %3, lsr #16\n" \ ++ "bic %|r1, %2, %|r0, lsl #16\n" \ ++ "bic %|r2, %3, %|r2, lsl #16\n" \ ++ "mul %1, %|r1, %|r2\n" \ ++ "mul %|r2, %|r0, %|r2\n" \ ++ "mul %|r1, %0, %|r1\n" \ ++ "mul %0, %|r0, %0\n" \ ++ "adds %|r1, %|r2, %|r1\n" \ ++ "addcs %0, %0, #65536\n" \ ++ "adds %1, %1, %|r1, lsl #16\n" \ ++ "adc %0, %0, %|r1, lsr #16" \ + : "=&r" ((USItype)(xh)), \ + "=r" ((USItype)(xl)) \ + : "r" ((USItype)(a)), \ +@@ -245,8 +245,8 @@ + + #if defined (__gmicro__) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("add.w %5,%1 +- addx %3,%0" \ ++ __asm__ ("add.w %5,%1\n" \ ++ "addx %3,%0" \ + : "=g" ((USItype)(sh)), \ + "=&g" ((USItype)(sl)) \ + : "%0" ((USItype)(ah)), \ +@@ -254,8 +254,8 @@ + "%1" ((USItype)(al)), \ + "g" ((USItype)(bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("sub.w %5,%1 +- subx %3,%0" \ ++ __asm__ ("sub.w %5,%1\n" \ ++ "subx %3,%0" \ + : "=g" ((USItype)(sh)), \ + "=&g" ((USItype)(sl)) \ + : "0" ((USItype)(ah)), \ +@@ -284,8 +284,8 @@ + + #if defined (__hppa) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("add %4,%5,%1 +- addc %2,%3,%0" \ ++ __asm__ ("add %4,%5,%1\n" \ ++ "addc %2,%3,%0" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "%rM" ((USItype)(ah)), \ +@@ -293,8 +293,8 @@ + "%rM" ((USItype)(al)), \ + "rM" ((USItype)(bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("sub %4,%5,%1 +- subb %2,%3,%0" \ ++ __asm__ ("sub %4,%5,%1\n" \ ++ "subb %2,%3,%0" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "rM" ((USItype)(ah)), \ +@@ -332,22 +332,22 @@ + do { \ + USItype __tmp; \ + __asm__ ( \ +- "ldi 1,%0 +- extru,= %1,15,16,%%r0 ; Bits 31..16 zero? +- extru,tr %1,15,16,%1 ; No. Shift down, skip add. +- ldo 16(%0),%0 ; Yes. Perform add. +- extru,= %1,23,8,%%r0 ; Bits 15..8 zero? +- extru,tr %1,23,8,%1 ; No. Shift down, skip add. +- ldo 8(%0),%0 ; Yes. Perform add. +- extru,= %1,27,4,%%r0 ; Bits 7..4 zero? +- extru,tr %1,27,4,%1 ; No. Shift down, skip add. +- ldo 4(%0),%0 ; Yes. Perform add. +- extru,= %1,29,2,%%r0 ; Bits 3..2 zero? +- extru,tr %1,29,2,%1 ; No. Shift down, skip add. +- ldo 2(%0),%0 ; Yes. Perform add. +- extru %1,30,1,%1 ; Extract bit 1. +- sub %0,%1,%0 ; Subtract it. +- " : "=r" (count), "=r" (__tmp) : "1" (x)); \ ++ "ldi 1,%0\n" \ ++ "extru,= %1,15,16,%%r0 ; Bits 31..16 zero?\n" \ ++ "extru,tr %1,15,16,%1 ; No. Shift down, skip add.\n" \ ++ "ldo 16(%0),%0 ; Yes. Perform add.\n" \ ++ "extru,= %1,23,8,%%r0 ; Bits 15..8 zero?\n" \ ++ "extru,tr %1,23,8,%1 ; No. Shift down, skip add.\n" \ ++ "ldo 8(%0),%0 ; Yes. Perform add.\n" \ ++ "extru,= %1,27,4,%%r0 ; Bits 7..4 zero?\n" \ ++ "extru,tr %1,27,4,%1 ; No. Shift down, skip add.\n" \ ++ "ldo 4(%0),%0 ; Yes. Perform add.\n" \ ++ "extru,= %1,29,2,%%r0 ; Bits 3..2 zero?\n" \ ++ "extru,tr %1,29,2,%1 ; No. Shift down, skip add.\n" \ ++ "ldo 2(%0),%0 ; Yes. Perform add.\n" \ ++ "extru %1,30,1,%1 ; Extract bit 1.\n" \ ++ "sub %0,%1,%0 ; Subtract it.\n" \ ++ : "=r" (count), "=r" (__tmp) : "1" (x)); \ + } while (0) + #endif /* hppa */ + +@@ -394,8 +394,8 @@ + + #if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("addl %5,%1 +- adcl %3,%0" \ ++ __asm__ ("addl %5,%1\n" \ ++ "adcl %3,%0" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "%0" ((USItype)(ah)), \ +@@ -403,8 +403,8 @@ + "%1" ((USItype)(al)), \ + "g" ((USItype)(bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("subl %5,%1 +- sbbl %3,%0" \ ++ __asm__ ("subl %5,%1\n" \ ++ "sbbl %3,%0" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "0" ((USItype)(ah)), \ +@@ -516,8 +516,8 @@ + + #if (defined (__mc68000__) || defined (__mc68020__) || defined (__NeXT__) || defined(mc68020)) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("add%.l %5,%1 +- addx%.l %3,%0" \ ++ __asm__ ("add%.l %5,%1\n" \ ++ "addx%.l %3,%0" \ + : "=d" ((USItype)(sh)), \ + "=&d" ((USItype)(sl)) \ + : "%0" ((USItype)(ah)), \ +@@ -525,8 +525,8 @@ + "%1" ((USItype)(al)), \ + "g" ((USItype)(bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("sub%.l %5,%1 +- subx%.l %3,%0" \ ++ __asm__ ("sub%.l %5,%1\n" \ ++ "subx%.l %3,%0" \ + : "=d" ((USItype)(sh)), \ + "=&d" ((USItype)(sl)) \ + : "0" ((USItype)(ah)), \ +@@ -564,28 +564,28 @@ + #else /* not mc68020 */ + #define umul_ppmm(xh, xl, a, b) \ + do { USItype __umul_tmp1, __umul_tmp2; \ +- __asm__ ("| Inlined umul_ppmm +- move%.l %5,%3 +- move%.l %2,%0 +- move%.w %3,%1 +- swap %3 +- swap %0 +- mulu %2,%1 +- mulu %3,%0 +- mulu %2,%3 +- swap %2 +- mulu %5,%2 +- add%.l %3,%2 +- jcc 1f +- add%.l %#0x10000,%0 +-1: move%.l %2,%3 +- clr%.w %2 +- swap %2 +- swap %3 +- clr%.w %3 +- add%.l %3,%1 +- addx%.l %2,%0 +- | End inlined umul_ppmm" \ ++ __asm__ ("| Inlined umul_ppmm\n" \ ++ "move%.l %5,%3\n" \ ++ "move%.l %2,%0\n" \ ++ "move%.w %3,%1\n" \ ++ "swap %3\n" \ ++ "swap %0\n" \ ++ "mulu %2,%1\n" \ ++ "mulu %3,%0\n" \ ++ "mulu %2,%3\n" \ ++ "swap %2\n" \ ++ "mulu %5,%2\n" \ ++ "add%.l %3,%2\n" \ ++ "jcc 1f\n" \ ++ "add%.l %#0x10000,%0\n" \ ++"1: move%.l %2,%3\n" \ ++ "clr%.w %2\n" \ ++ "swap %2\n" \ ++ "swap %3\n" \ ++ "clr%.w %3\n" \ ++ "add%.l %3,%1\n" \ ++ "addx%.l %2,%0\n" \ ++ "| End inlined umul_ppmm" \ + : "=&d" ((USItype)(xh)), "=&d" ((USItype)(xl)), \ + "=d" (__umul_tmp1), "=&d" (__umul_tmp2) \ + : "%2" ((USItype)(a)), "d" ((USItype)(b))); \ +@@ -597,8 +597,8 @@ + + #if defined (__m88000__) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("addu.co %1,%r4,%r5 +- addu.ci %0,%r2,%r3" \ ++ __asm__ ("addu.co %1,%r4,%r5\n" \ ++ "addu.ci %0,%r2,%r3" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "%rJ" ((USItype)(ah)), \ +@@ -606,8 +606,8 @@ + "%rJ" ((USItype)(al)), \ + "rJ" ((USItype)(bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("subu.co %1,%r4,%r5 +- subu.ci %0,%r2,%r3" \ ++ __asm__ ("subu.co %1,%r4,%r5\n" \ ++ "subu.ci %0,%r2,%r3" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "rJ" ((USItype)(ah)), \ +@@ -665,9 +665,9 @@ + "d" ((USItype)(v))) + #else + #define umul_ppmm(w1, w0, u, v) \ +- __asm__ ("multu %2,%3 +- mflo %0 +- mfhi %1" \ ++ __asm__ ("multu %2,%3\n" \ ++ "mflo %0\n" \ ++ "mfhi %1" \ + : "=d" ((USItype)(w0)), \ + "=d" ((USItype)(w1)) \ + : "d" ((USItype)(u)), \ +@@ -687,9 +687,9 @@ + "d" ((UDItype)(v))) + #else + #define umul_ppmm(w1, w0, u, v) \ +- __asm__ ("dmultu %2,%3 +- mflo %0 +- mfhi %1" \ ++ __asm__ ("dmultu %2,%3\n" \ ++ "mflo %0\n" \ ++ "mfhi %1" \ + : "=d" ((UDItype)(w0)), \ + "=d" ((UDItype)(w1)) \ + : "d" ((UDItype)(u)), \ +@@ -857,8 +857,8 @@ + + #if defined (__pyr__) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("addw %5,%1 +- addwc %3,%0" \ ++ __asm__ ("addw %5,%1\n" \ ++ "addwc %3,%0" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "%0" ((USItype)(ah)), \ +@@ -866,8 +866,8 @@ + "%1" ((USItype)(al)), \ + "g" ((USItype)(bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("subw %5,%1 +- subwb %3,%0" \ ++ __asm__ ("subw %5,%1\n" \ ++ "subwb %3,%0" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "0" ((USItype)(ah)), \ +@@ -879,8 +879,8 @@ + ({union {UDItype __ll; \ + struct {USItype __h, __l;} __i; \ + } __xx; \ +- __asm__ ("movw %1,%R0 +- uemul %2,%0" \ ++ __asm__ ("movw %1,%R0\n" \ ++ "uemul %2,%0" \ + : "=&r" (__xx.__ll) \ + : "g" ((USItype) (u)), \ + "g" ((USItype)(v))); \ +@@ -889,8 +889,8 @@ + + #if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("a %1,%5 +- ae %0,%3" \ ++ __asm__ ("a %1,%5\n" \ ++ "ae %0,%3" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "%0" ((USItype)(ah)), \ +@@ -898,8 +898,8 @@ + "%1" ((USItype)(al)), \ + "r" ((USItype)(bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("s %1,%5 +- se %0,%3" \ ++ __asm__ ("s %1,%5\n" \ ++ "se %0,%3" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "0" ((USItype)(ah)), \ +@@ -910,26 +910,26 @@ + do { \ + USItype __m0 = (m0), __m1 = (m1); \ + __asm__ ( \ +- "s r2,r2 +- mts r10,%2 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- cas %0,r2,r0 +- mfs r10,%1" \ ++ "s r2,r2\n" \ ++ "mts r10,%2\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "cas %0,r2,r0\n" \ ++ "mfs r10,%1" \ + : "=r" ((USItype)(ph)), \ + "=r" ((USItype)(pl)) \ + : "%r" (__m0), \ +@@ -959,9 +959,9 @@ + #if defined (__sh2__) && W_TYPE_SIZE == 32 + #define umul_ppmm(w1, w0, u, v) \ + __asm__ ( \ +- "dmulu.l %2,%3 +- sts macl,%1 +- sts mach,%0" \ ++ "dmulu.l %2,%3\n" \ ++ "sts macl,%1\n" \ ++ "sts mach,%0" \ + : "=r" ((USItype)(w1)), \ + "=r" ((USItype)(w0)) \ + : "r" ((USItype)(u)), \ +@@ -972,8 +972,8 @@ + + #if defined (__sparc__) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("addcc %r4,%5,%1 +- addx %r2,%3,%0" \ ++ __asm__ ("addcc %r4,%5,%1\n" \ ++ "addx %r2,%3,%0" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "%rJ" ((USItype)(ah)), \ +@@ -982,8 +982,8 @@ + "rI" ((USItype)(bl)) \ + __CLOBBER_CC) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("subcc %r4,%5,%1 +- subx %r2,%3,%0" \ ++ __asm__ ("subcc %r4,%5,%1\n" \ ++ "subx %r2,%3,%0" \ + : "=r" ((USItype)(sh)), \ + "=&r" ((USItype)(sl)) \ + : "rJ" ((USItype)(ah)), \ +@@ -1029,45 +1029,45 @@ + "r" ((USItype)(v))) + #define UMUL_TIME 5 + #define udiv_qrnnd(q, r, n1, n0, d) \ +- __asm__ ("! Inlined udiv_qrnnd +- wr %%g0,%2,%%y ! Not a delayed write for sparclite +- tst %%g0 +- divscc %3,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%0 +- rd %%y,%1 +- bl,a 1f +- add %1,%4,%1 +-1: ! End of inline udiv_qrnnd" \ ++ __asm__ ("! Inlined udiv_qrnnd\n" \ ++ "wr %%g0,%2,%%y ! Not a delayed write for sparclite\n" \ ++ "tst %%g0\n" \ ++ "divscc %3,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%0\n" \ ++ "rd %%y,%1\n" \ ++ "bl,a 1f\n" \ ++ "add %1,%4,%1\n" \ ++"1: ! End of inline udiv_qrnnd" \ + : "=r" ((USItype)(q)), \ + "=r" ((USItype)(r)) \ + : "r" ((USItype)(n1)), \ +@@ -1087,46 +1087,46 @@ + /* Default to sparc v7 versions of umul_ppmm and udiv_qrnnd. */ + #ifndef umul_ppmm + #define umul_ppmm(w1, w0, u, v) \ +- __asm__ ("! Inlined umul_ppmm +- wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr +- sra %3,31,%%g2 ! Don't move this insn +- and %2,%%g2,%%g2 ! Don't move this insn +- andcc %%g0,0,%%g1 ! Don't move this insn +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,0,%%g1 +- add %%g1,%%g2,%0 +- rd %%y,%1" \ ++ __asm__ ("! Inlined umul_ppmm\n" \ ++ "wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr\n" \ ++ "sra %3,31,%%g2 ! Don't move this insn\n" \ ++ "and %2,%%g2,%%g2 ! Don't move this insn\n" \ ++ "andcc %%g0,0,%%g1 ! Don't move this insn\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,0,%%g1\n" \ ++ "add %%g1,%%g2,%0\n" \ ++ "rd %%y,%1" \ + : "=r" ((USItype)(w1)), \ + "=r" ((USItype)(w0)) \ + : "%rI" ((USItype)(u)), \ +@@ -1138,30 +1138,30 @@ + /* It's quite necessary to add this much assembler for the sparc. + The default udiv_qrnnd (in C) is more than 10 times slower! */ + #define udiv_qrnnd(q, r, n1, n0, d) \ +- __asm__ ("! Inlined udiv_qrnnd +- mov 32,%%g1 +- subcc %1,%2,%%g0 +-1: bcs 5f +- addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb +- sub %1,%2,%1 ! this kills msb of n +- addx %1,%1,%1 ! so this can't give carry +- subcc %%g1,1,%%g1 +-2: bne 1b +- subcc %1,%2,%%g0 +- bcs 3f +- addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb +- b 3f +- sub %1,%2,%1 ! this kills msb of n +-4: sub %1,%2,%1 +-5: addxcc %1,%1,%1 +- bcc 2b +- subcc %%g1,1,%%g1 +-! Got carry from n. Subtract next step to cancel this carry. +- bne 4b +- addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb +- sub %1,%2,%1 +-3: xnor %0,0,%0 +- ! End of inline udiv_qrnnd" \ ++ __asm__ ("! Inlined udiv_qrnnd\n" \ ++ "mov 32,%%g1\n" \ ++ "subcc %1,%2,%%g0\n" \ ++"1: bcs 5f\n" \ ++ "addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n" \ ++ "sub %1,%2,%1 ! this kills msb of n\n" \ ++ "addx %1,%1,%1 ! so this can't give carry\n" \ ++ "subcc %%g1,1,%%g1\n" \ ++"2: bne 1b\n" \ ++ "subcc %1,%2,%%g0\n" \ ++ "bcs 3f\n" \ ++ "addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n" \ ++ "b 3f\n" \ ++ "sub %1,%2,%1 ! this kills msb of n\n" \ ++"4: sub %1,%2,%1\n" \ ++"5: addxcc %1,%1,%1\n" \ ++ "bcc 2b\n" \ ++ "subcc %%g1,1,%%g1\n" \ ++"! Got carry from n. Subtract next step to cancel this carry.\n" \ ++ "bne 4b\n" \ ++ "addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb\n" \ ++ "sub %1,%2,%1\n" \ ++"3: xnor %0,0,%0\n" \ ++ "! End of inline udiv_qrnnd" \ + : "=&r" ((USItype)(q)), \ + "=&r" ((USItype)(r)) \ + : "r" ((USItype)(d)), \ +@@ -1179,11 +1179,11 @@ + #if (defined (__sparc_v9__) || (defined (__sparc__) && defined (__arch64__)) \ + || defined (__sparcv9)) && W_TYPE_SIZE == 64 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("addcc %r4,%5,%1 +- add %r2,%3,%0 +- bcs,a,pn %%xcc, 1f +- add %0, 1, %0 +- 1:" \ ++ __asm__ ("addcc %r4,%5,%1\n" \ ++ "add %r2,%3,%0\n" \ ++ "bcs,a,pn %%xcc, 1f\n" \ ++ "add %0, 1, %0\n" \ ++ "1:" \ + : "=r" ((UDItype)(sh)), \ + "=&r" ((UDItype)(sl)) \ + : "r" ((UDItype)(ah)), \ +@@ -1193,11 +1193,11 @@ + : "cc") + + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("subcc %r4,%5,%1 +- sub %r2,%3,%0 +- bcs,a,pn %%xcc, 1f +- sub %0, 1, %0 +- 1:" \ ++ __asm__ ("subcc %r4,%5,%1\n" \ ++ "sub %r2,%3,%0\n" \ ++ "bcs,a,pn %%xcc, 1f\n" \ ++ "sub %0, 1, %0\n" \ ++ "1:" \ + : "=r" ((UDItype)(sh)), \ + "=&r" ((UDItype)(sl)) \ + : "r" ((UDItype)(ah)), \ +@@ -1210,27 +1210,27 @@ + do { \ + UDItype tmp1, tmp2, tmp3, tmp4; \ + __asm__ __volatile__ ( \ +- "srl %7,0,%3 +- mulx %3,%6,%1 +- srlx %6,32,%2 +- mulx %2,%3,%4 +- sllx %4,32,%5 +- srl %6,0,%3 +- sub %1,%5,%5 +- srlx %5,32,%5 +- addcc %4,%5,%4 +- srlx %7,32,%5 +- mulx %3,%5,%3 +- mulx %2,%5,%5 +- sethi %%hi(0x80000000),%2 +- addcc %4,%3,%4 +- srlx %4,32,%4 +- add %2,%2,%2 +- movcc %%xcc,%%g0,%2 +- addcc %5,%4,%5 +- sllx %3,32,%3 +- add %1,%3,%1 +- add %5,%2,%0" \ ++ "srl %7,0,%3\n" \ ++ "mulx %3,%6,%1\n" \ ++ "srlx %6,32,%2\n" \ ++ "mulx %2,%3,%4\n" \ ++ "sllx %4,32,%5\n" \ ++ "srl %6,0,%3\n" \ ++ "sub %1,%5,%5\n" \ ++ "srlx %5,32,%5\n" \ ++ "addcc %4,%5,%4\n" \ ++ "srlx %7,32,%5\n" \ ++ "mulx %3,%5,%3\n" \ ++ "mulx %2,%5,%5\n" \ ++ "sethi %%hi(0x80000000),%2\n" \ ++ "addcc %4,%3,%4\n" \ ++ "srlx %4,32,%4\n" \ ++ "add %2,%2,%2\n" \ ++ "movcc %%xcc,%%g0,%2\n" \ ++ "addcc %5,%4,%5\n" \ ++ "sllx %3,32,%3\n" \ ++ "add %1,%3,%1\n" \ ++ "add %5,%2,%0" \ + : "=r" ((UDItype)(wh)), \ + "=&r" ((UDItype)(wl)), \ + "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4) \ +@@ -1244,8 +1244,8 @@ + + #if defined (__vax__) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("addl2 %5,%1 +- adwc %3,%0" \ ++ __asm__ ("addl2 %5,%1\n" \ ++ "adwc %3,%0" \ + : "=g" ((USItype)(sh)), \ + "=&g" ((USItype)(sl)) \ + : "%0" ((USItype)(ah)), \ +@@ -1253,8 +1253,8 @@ + "%1" ((USItype)(al)), \ + "g" ((USItype)(bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("subl2 %5,%1 +- sbwc %3,%0" \ ++ __asm__ ("subl2 %5,%1\n" \ ++ "sbwc %3,%0" \ + : "=g" ((USItype)(sh)), \ + "=&g" ((USItype)(sl)) \ + : "0" ((USItype)(ah)), \ diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-sscanf.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-sscanf.patch new file mode 100644 index 00000000..b1269e09 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-sscanf.patch @@ -0,0 +1,73 @@ +http://sources.redhat.com/ml/bug-glibc/2003-08/msg00087.html + +From: Gernot Hillier <gernot dot hillier at siemens dot com> +Organization: Siemens AG +To: Jeffrey Bedard <jefbed at e-list dot net>, bug-glibc at gnu dot org +Date: Mon, 18 Aug 2003 08:50:03 +0200 +References: <3F3D0899.6020004@e-list.net> +Message-Id: <200308180850.03431.gernot.hillier@siemens.com> +Subject: Re: Build Fails with gcc 3.3.1 +X-BeenThere: bug-glibc@gnu.org + +Hi! + +Am Freitag, 15. August 2003 18:21 schrieb Jeffrey Bedard: +> gcc sscanf.c -c -std=gnu99 -O2 -Wall -Winline -Wstrict-prototypes +[...] +> sscanf.c:31: warning: conflicting types for built-in function `sscanf' +> sscanf.c: In function `sscanf': +> sscanf.c:37: error: `va_start' used in function with fixed args +> .../stdio-common/_itoa.h: At top level: +> .../stdio-common/_itoa.h:40: warning: inlining failed in call to +> `_itoa_word' .../stdio-common/_itoa.h:76: warning: called from here +> make[2]: *** +> [/home/jefbed/src/packages/glibc-build/stdio-common/sscanf.o] Error 1 + +You can find the fitting patch in the glibc CVS. You have to replace some +function headers. + +I created a patch for glibc-2.2.5 for the same reason. I don't know if it +applies cleanly, but if not it should at least show you what to do... + +-- +Bye, + +Gernot Hillier +Siemens AG + + + + +Content-Disposition: attachment; filename="glibc-2.2.5-gcc-3.3.diff" + +diff -ur glibc-2.2.5.orig/stdio-common/sprintf.c glibc-2.2.5/stdio-common/sprintf.c +--- glibc-2.2.5.orig/stdio-common/sprintf.c 2001-07-06 06:55:41.000000000 +0200 ++++ glibc-2.2.5/stdio-common/sprintf.c 2003-08-11 13:25:48.000000000 +0200 +@@ -27,9 +27,7 @@ + /* Write formatted output into S, according to the format string FORMAT. */ + /* VARARGS2 */ + int +-sprintf (s, format) +- char *s; +- const char *format; ++sprintf (char *s, const char *format,...) + { + va_list arg; + int done; +Only in glibc-2.2.5/stdio-common: sprintf.c.orig +Only in glibc-2.2.5/stdio-common: sprintf.c.rej +diff -ur glibc-2.2.5.orig/stdio-common/sscanf.c glibc-2.2.5/stdio-common/sscanf.c +--- glibc-2.2.5.orig/stdio-common/sscanf.c 2001-07-06 06:55:41.000000000 +0200 ++++ glibc-2.2.5/stdio-common/sscanf.c 2003-08-11 13:27:58.000000000 +0200 +@@ -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 --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-syscall.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-syscall.patch new file mode 100644 index 00000000..e04b5691 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-syscall.patch @@ -0,0 +1,29 @@ +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/i386/sysdep.h.diff?r1=1.40&r2=1.41&cvsroot=glibc +See also http://gcc.gnu.org/PR12928, comment 6 (which says this is a glibc bug, not a gcc bug) + +Fixes +/tmp/ccdGVIRa.s: Assembler messages: +/tmp/ccdGVIRa.s:82: Error: non-constant expression in ".if" statement +/tmp/ccdGVIRa.s:83: Error: non-constant expression in ".if" statement +/tmp/ccdGVIRa.s:86: Error: non-constant expression in ".if" statement +make[2]: *** [/crosstool-0.28-pre4/build/i686-unknown-linux-gnu/gcc-3.3.3-glibc-2.1.3/build-glibc/signal/sigsuspend.o] Error 1 + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/i386/sysdep.h,v +retrieving revision 1.40 +retrieving revision 1.41 +diff -u -r1.40 -r1.41 +--- libc/sysdeps/unix/sysv/linux/i386/sysdep.h 2002/10/16 08:57:25 1.40 ++++ libc/sysdeps/unix/sysv/linux/i386/sysdep.h 2002/11/28 05:21:48 1.41 +@@ -347,9 +347,9 @@ + #define ASMFMT_1(arg1) \ + , "acdSD" (arg1) + #define ASMFMT_2(arg1, arg2) \ +- , "adCD" (arg1), "c" (arg2) ++ , "adSD" (arg1), "c" (arg2) + #define ASMFMT_3(arg1, arg2, arg3) \ +- , "aCD" (arg1), "c" (arg2), "d" (arg3) ++ , "aSD" (arg1), "c" (arg2), "d" (arg3) + #define ASMFMT_4(arg1, arg2, arg3, arg4) \ + , "aD" (arg1), "c" (arg2), "d" (arg3), "S" (arg4) + #define ASMFMT_5(arg1, arg2, arg3, arg4, arg5) \ diff --git a/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-versioninfo.patch b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-versioninfo.patch new file mode 100644 index 00000000..ce888792 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-allow-gcc3-versioninfo.patch @@ -0,0 +1,17 @@ +# gcc-3.x doesn't like run-on strings +# See also http://sources.redhat.com/ml/libc-alpha/2004-01/msg00032.html + +--- glibc-2.1.3/csu/Makefile.old 2004-03-04 12:18:52.000000000 -0800 ++++ glibc-2.1.3/csu/Makefile 2004-03-04 12:19:35.000000000 -0800 +@@ -188,8 +188,8 @@ + esac; \ + files="$(all-Banner-files)"; \ + if test -n "$$files"; then \ +- echo "\"Available extensions:"; \ +- sed -e '/^#/d' -e 's/^[[:space:]]*/ /' $$files; \ +- echo "\""; \ ++ echo -e "\"Available extensions:\\\\n\""; \ ++ sed -e '/^#/d' -e 's/^[[:space:]]*/ /' \ ++ -e 's/^\(.*\)$$/\"\1\\n\"/' $$files; \ + fi) > $@T + mv -f $@T $@ diff --git a/patches/glibc/2.1.3/glibc-2.1.3-cygwin.patch b/patches/glibc/2.1.3/glibc-2.1.3-cygwin.patch new file mode 100644 index 00000000..3f5e5f01 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-cygwin.patch @@ -0,0 +1,80 @@ +Fixes +elf/librtld.os: In function `process_envvars': : undefined reference to `__access' +... +when building glibc-2.1.3 on cygwin + +Idea from +http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch +backported to glibc-2.1.3. +Basically, make glibc use .oST as suffix for 'object static' +instead of .oS, since cygwin has trouble distinguishing .os from .oS +(Original patch had .on, but .oST is more mnemonic for 'object static') + + +--- glibc-2.1.3/Makeconfig.old 1999-11-29 11:19:20.000000000 -0800 ++++ glibc-2.1.3/Makeconfig 2004-03-14 16:38:43.218750000 -0800 +@@ -406,7 +406,7 @@ + # run the linked programs. + link-libc = -Wl,-rpath-link=$(rpath-link) \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib) ++ $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib) + # Choose the default search path for the dynamic linker based on + # where we will install libraries. + ifneq ($(libdir),$(slibdir)) +@@ -586,7 +586,7 @@ + # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX}) + # to pass different flags for each flavor. + libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o)) +-all-object-suffixes := .o .os .op .og .ob .oS ++all-object-suffixes := .o .os .op .og .ob .oST + object-suffixes := + CPPFLAGS-.o = $(pic-default) + CFLAGS-.o = $(filter %frame-pointer,$(+cflags)) +@@ -636,14 +636,14 @@ + + ifeq (yes,$(build-shared)) + # Build special library that contains the static-only routines for libc. +-object-suffixes-for-libc += .oS ++object-suffixes-for-libc += .oST + + # Must build the routines as PIC, though, because they can end up in (users') + # shared objects. We don't want to use CFLAGS-os because users may, for + # example, make that processor-specific. +-CFLAGS-.oS = $(CFLAGS-.o) $(pic-ccflag) +-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC +-libtype.oS = lib%_nonshared.a ++CFLAGS-.oST = $(CFLAGS-.o) $(pic-ccflag) ++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC ++libtype.oST = lib%_nonshared.a + endif + + +--- glibc-2.1.3/Makerules.old 1999-08-01 15:12:23.000000000 -0700 ++++ glibc-2.1.3/Makerules 2004-03-14 16:39:07.906250000 -0800 +@@ -386,7 +386,7 @@ + static-only-routines = + endif + +-elide-routines.oS += $(filter-out $(static-only-routines),\ ++elide-routines.oST += $(filter-out $(static-only-routines),\ + $(routines) $(aux) $(sysdep_routines)) + elide-routines.os += $(static-only-routines) + +@@ -694,14 +694,14 @@ + # of the files are taken by the linker. + install: $(inst_libdir)/libc.so + $(inst_libdir)/libc.so: $(common-objpfx)libc.so$(libc.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)$(libc-name)) \ + $(+force) + (echo '/* GNU ld script';\ + echo ' Use the shared library, but some functions are only in';\ + echo ' the static library, so try that secondarily. */';\ + echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\ + ')' \ + ) > $@.new + mv -f $@.new $@ diff --git a/patches/glibc/2.1.3/glibc-2.1.3-override.patch b/patches/glibc/2.1.3/glibc-2.1.3-override.patch new file mode 100644 index 00000000..ddaaa9b2 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.1.3-override.patch @@ -0,0 +1,48 @@ +The error + +make[2]: *** [.../gcc-3.3.3-glibc-2.1.3/i686-unknown-linux-gnu/share/zoneinfo/Africa/Algiers] Segmentation fault +make[2]: Leaving directory `.../gcc-3.3.3-glibc-2.1.3/glibc-2.1.3/timezone' +make[1]: *** [timezone/subdir_install] Error 2 + +is caused by glibc trying to run something it just compiled. +A crude workaround for this was posted at +http://lists.scratchbox.org/pipermail/scratchbox-users/2004-February/000018.html +but the following patch lets you optionally override these programs at +make time by setting environment variables + localedef_FOR_BUILD rpcgen_FOR_BUILD zic_FOR_BUILD +and maybe a few others to point to versions of those programs +that can run on the build machine. +Thanks to http://groups.google.com/groups?selm=9012160052.AA23106%40kaos.ksr.com +for pointing out the idiom for inline $(ifdef ...) in GNU Make. + +Dan Kegel 2004-05-17 + +--- glibc-2.1.3/Makeconfig.old 1999-11-29 11:19:20.000000000 -0800 ++++ glibc-2.1.3/Makeconfig 2004-05-17 15:57:53.000000000 -0700 +@@ -470,20 +470,24 @@ + # The program binary is assumed to be $(word 2,$^). + built-program-file = $(dir $(word 2,$^))$(notdir $(word 2,$^)) + ifneq (yes,$(build-shared)) +-built-program-cmd = $(built-program-file) ++built-program-real = $(built-program-file) + else + comma = , + sysdep-library-path = \ + $(subst $(empty) ,:,$(strip $(patsubst -Wl$(comma)-rpath-link=%, %,\ + $(filter -Wl$(comma)-rpath-link=%,\ + $(sysdep-LDFLAGS))))) +-define built-program-cmd ++define built-program-real + $(elf-objpfx)$(rtld-installed-name) \ + --library-path $(rpath-link)$(patsubst %,:%,$(sysdep-library-path)) \ + $(built-program-file) + endef + endif + ++# If user set foo_FOR_BUILD, use that instead of actually running the program we just linked. ++built-program-override-name = $(notdir $(word 2,$^))_FOR_BUILD ++built-program-cmd = $(if $(findstring undefined,$(origin $(built-program-override-name))),$(built-program-real),$($(built-program-override-name))) ++ + ifndef LD + LD := ld -X + endif diff --git a/patches/glibc/2.1.3/glibc-2.2.2-export_fp_hw.patch b/patches/glibc/2.1.3/glibc-2.2.2-export_fp_hw.patch new file mode 100644 index 00000000..a14e1d45 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-2.2.2-export_fp_hw.patch @@ -0,0 +1,30 @@ +Fixes undefined symbol _fp_hw required by the ABI: +readelf -s /opt/crosstool/i686-pc-linux-gnu/i686-unknown-linux-gnu/gcc-3.4.3-glibc-2.2.2/i686-unknown-linux-gnu/lib/crt1.o | grep fp_hw + 29: 00000000 4 NOTYPE GLOBAL DEFAULT UND _fp_hw +Rumored to fix problems with icc, which gets upset at any symbol +which is undefined, even if nobody cares about it. + +Revision 1.16, Thu Feb 22 19:57:34 2001 UTC (4 years, 2 months ago) by drepper +Branch: MAIN +CVS Tags: glibc-2_2_3 +Changes since 1.15: +1 -1 lines +Diff to previous 1.15 (colored) + +(_fp_hw): Actually define label. + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/i386/elf/start.S,v +retrieving revision 1.15 +retrieving revision 1.16 +diff -u -r1.15 -r1.16 +--- libc/sysdeps/i386/elf/start.S 2001/02/03 21:34:54 1.15 ++++ libc/sysdeps/i386/elf/start.S 2001/02/22 19:57:34 1.16 +@@ -85,7 +85,7 @@ + meaningless since we don't support machines < 80386. */ + .section .rodata + .globl _fp_hw +- .long 3 ++_fp_hw: .long 3 + .size _fp_hw, 4 + + /* Define a symbol for the first piece of initialized data. */ diff --git a/patches/glibc/2.1.3/glibc-manual-stdin.texi-1.127.patch b/patches/glibc/2.1.3/glibc-manual-stdin.texi-1.127.patch new file mode 100644 index 00000000..1ed64806 --- /dev/null +++ b/patches/glibc/2.1.3/glibc-manual-stdin.texi-1.127.patch @@ -0,0 +1,26 @@ +Fixes +./stdio.texi:2491: First argument to cross-reference may not be empty. +./stdio.texi:2492: First argument to cross-reference may not be empty. +makeinfo: Removing output file `/home/dank/crosstool-0.25/build/arm-unknown-linux-gnu/gcc-2.95.3-glibc-2.1.3/glibc-2.1.3/manual/libc.info' due to errors; use --force to preserve. +make[2]: *** [libc.info] Error 2 + +Patch from glib-2.2; Line numbers adjusted. + +=================================================================== +RCS file: /cvs/glibc/libc/manual/stdio.texi,v +retrieving revision 1.126 +retrieving revision 1.127 +diff -u -r1.126 -r1.127 +--- libc/manual/stdio.texi 2001/06/06 07:11:00 ++++ libc/manual/stdio.texi 2001/07/31 18:57:00 +@@ -2487,8 +2487,8 @@ + If you are trying to read input that doesn't match a single, fixed + pattern, you may be better off using a tool such as Flex to generate a + lexical scanner, or Bison to generate a parser, rather than using +-@code{scanf}. For more information about these tools, see @ref{, , , +-flex.info, Flex: The Lexical Scanner Generator}, and @ref{, , , ++@code{scanf}. For more information about these tools, see @ref{Top, , , ++flex.info, Flex: The Lexical Scanner Generator}, and @ref{Top, , , + bison.info, The Bison Reference Manual}. + + @node Input Conversion Syntax diff --git a/patches/glibc/2.1.3/glibc-rpcgen-cpp.patch b/patches/glibc/2.1.3/glibc-rpcgen-cpp.patch new file mode 100644 index 00000000..8d9b4fac --- /dev/null +++ b/patches/glibc/2.1.3/glibc-rpcgen-cpp.patch @@ -0,0 +1,14 @@ +--- glibc-2.1.3/sunrpc/Makefile.orig 2004-05-12 12:26:58.000000000 -0700 ++++ glibc-2.1.3/sunrpc/Makefile 2004-05-12 12:29:05.000000000 -0700 +@@ -123,9 +123,8 @@ + $(addprefix $(csu-objpfx),start.o) $(+preinit) $(+postinit) + $(+link) + +-# Tell rpcgen where to find the C preprocessor. +-rpcgen-cmd = $(built-program-cmd) -Y `$(CC) -print-file-name=cpp | \ +- sed "s|/cpp$$||"` ++# Don't tell rpcgen where to find the C preprocessor -- let it find it itself. ++rpcgen-cmd = $(built-program-cmd) + + # Install the rpc data base file. + $(inst_sysconfdir)/rpc: etc.rpc $(+force) diff --git a/patches/glibc/2.1.3/rh62-00-glibc-2.1.3.patch b/patches/glibc/2.1.3/rh62-00-glibc-2.1.3.patch new file mode 100644 index 00000000..7f93a4ff --- /dev/null +++ b/patches/glibc/2.1.3/rh62-00-glibc-2.1.3.patch @@ -0,0 +1,117574 @@ +diff -Naur ../glibc-2.1.3/ChangeLog glibc-2.1.3/ChangeLog +--- ../glibc-2.1.3/ChangeLog 2000-02-24 18:05:16.000000000 -0800 ++++ glibc-2.1.3/ChangeLog 2000-02-29 13:15:05.000000000 -0800 +@@ -1,3 +1,16 @@ ++2000-02-28 David S. Miller <davem@redhat.com> ++ ++ * sysdeps/unix/sysv/linux/sparc/getsysstats.c: New file. ++ ++2000-02-24 Ulrich Drepper <drepper@redhat.com> ++ ++ * locale/C-ctype.c (_nl_C_LC_CTYPE): Move comma to correct place ++ for big endian machines. ++ ++2000-02-24 Andreas Jaeger <aj@suse.de> ++ ++ * locale/programs/ld-ctype.c (ctype_output): Add missing &. ++ + 2000-02-24 Ulrich Drepper <drepper@cygnus.com> + + * locale/C-ctype.c: Add table pointer for both endianesses. +@@ -42,6 +55,10 @@ + conditions so as not to clobber the final '\0' when there is only one + element in the vector. + ++2000-02-23 Cristian Gafton <gafton@redhat.com> ++ ++ * locale/programs/ld-ctype.c (CTYPE_DATA): Make sure we keep the alignment ++ + 2000-02-22 Ulrich Drepper <drepper@redhat.com> + + * libio/stdio.h: Define macros stdin, stdout, and stderr. +@@ -230,6 +247,11 @@ + Rebel-NetWinder to platform table so _ioperm platform lookup via + /proc/cpuinfo works on later version NetWinders. + ++2000-02-14 Cristian Gafton <gafton@redhat.com> ++ ++ * timezone/aliases: New file ++ * timezone/Makefile (tzlinks): Add aliases ++ + 2000-02-13 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/i386/fpu/s_cosf.S: Domain of opcode is not large enough +@@ -406,6 +428,12 @@ + + * sysdeps/unix/sysv/linux/arm/mmap64.S: Correct check for ENOSYS. + ++2000-02-01 Cristian Gafton <gafton@redhat.com> ++ ++ * misc/syslog.c (closelog): reset LogType to SOCK_DGRAM ++ (openlog_internal): retry with SOCK_DGRAM if we are in SOCK_STREAM ++ mode and we get a connection refused. ++ + 2000-01-25 Ulrich Drepper <drepper@cygnus.com> + + * sysdeps/unix/sysv/linux/i386/Dist: Add sys/io.h. +diff -Naur ../glibc-2.1.3/Makeconfig glibc-2.1.3/Makeconfig +--- ../glibc-2.1.3/Makeconfig 1999-11-29 11:19:20.000000000 -0800 ++++ glibc-2.1.3/Makeconfig 2000-01-10 14:11:06.000000000 -0800 +@@ -789,7 +789,8 @@ + $(patsubst $<,/dev/null,$^) > $@-tmp + mv -f $@-tmp $@ + +-all-Depend-files = $(wildcard $(..)*/Depend) ++all-Depend-files = $(wildcard $(patsubst %,$(..)%/Depend,$(add-ons))) ++ + $(common-objpfx)sysd-sorted: $(..)scripts/gen-sorted.awk $(all-Depend-files) \ + $(common-objpfx)sysd-dirs $(..)Makeconfig + { { dirs='$(patsubst $(..)%/Depend,$(..)%,$(filter %/Depend,$^))';\ +diff -Naur ../glibc-2.1.3/Makefile.in glibc-2.1.3/Makefile.in +--- ../glibc-2.1.3/Makefile.in 1998-02-26 06:51:55.000000000 -0800 ++++ glibc-2.1.3/Makefile.in 1998-03-12 12:17:58.000000000 -0800 +@@ -1,4 +1,4 @@ +-# Generated from $Id: Makefile.in,v 1.6 1998/02/26 14:51:55 drepper Exp $. ++# Generated from $Id: Makefile.in,v 1.1.1.1 1998/03/12 20:17:58 gafton Exp $. + + srcdir = @srcdir@ + +diff -Naur ../glibc-2.1.3/README-alpha glibc-2.1.3/README-alpha +--- ../glibc-2.1.3/README-alpha 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/README-alpha 1999-06-16 15:30:43.000000000 -0700 +@@ -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 <drepper@gnu.org>. 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 <drepper@gnu.org>. 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 -Naur ../glibc-2.1.3/README.template glibc-2.1.3/README.template +--- ../glibc-2.1.3/README.template 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/README.template 1999-07-28 15:46:07.000000000 -0700 +@@ -0,0 +1,96 @@ ++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 ++ sparc-*-linux-gnu Linux-2.x on SPARC ++ sparc64-*-linux-gnu Linux-2.x on UltraSPARC ++ arm-*-none ARM standalone systems ++ arm-*-linux Linux-2.x on ARM ++ arm-*-linuxaout Linux-2.x on ARM using a.out binaries ++ ++ ++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 <bug-glibc@gnu.org>. ++ ++The GNU C library now includes Michael Glad's Ultra Fast Crypt, which ++provides the Unix `crypt' function, plus some other entry points. ++Because of the United States export restriction on DES ++implementations, we are distributing this code separately from the ++rest of the C library. There is an extra distribution tar file just ++for crypt; it is called `glibc-crypt-VERSION.tar.gz'. You can just ++unpack the crypt distribution along with the rest of the C library and ++build; you can also build the library without getting crypt. Users ++outside the USA can get the crypt distribution via anonymous FTP from ++ftp.gwdg.de [134.76.11.100] in the directory pub/linux/glibc, or ++another archive site outside the USA. Archive maintainers are ++encouraged to copy this distribution to their archives outside the ++USA. Please get it from ftp.gwdg.de; transferring this distribution ++from ftp.gnu.org (or any other site in the USA) to a site outside the ++USA is in violation of US export laws. ++ ++Beside the separate crypt tar file there are some more 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 <bug-glibc-manual@gnu.org>, 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 <bugs@gnu.org>. ++Simply run this shell script and fill in the information. Nevertheless ++you can still send bug reports to <bug-glibc@gnu.org> as normal electronic ++mails. ++ ++The GNU C Library is free software. See the file COPYING.LIB for copying ++conditions. +diff -Naur ../glibc-2.1.3/Versions.def glibc-2.1.3/Versions.def +--- ../glibc-2.1.3/Versions.def 1999-11-15 16:24:57.000000000 -0800 ++++ glibc-2.1.3/Versions.def 1999-12-27 08:16:06.000000000 -0800 +@@ -31,6 +31,7 @@ + libnsl { + GLIBC_2.0 + GLIBC_2.1 GLIBC_2.0 ++ GLIBC_2.1.2 GLIBC_2.1 + } + libnss_compat { + GLIBC_2.0 +diff -Naur ../glibc-2.1.3/c_stubs/Banner glibc-2.1.3/c_stubs/Banner +--- ../glibc-2.1.3/c_stubs/Banner 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/c_stubs/Banner 2000-02-25 16:35:04.000000000 -0800 +@@ -0,0 +1 @@ ++The C stubs add-on version 2.1.2. +diff -Naur ../glibc-2.1.3/c_stubs/COPYING.LIB glibc-2.1.3/c_stubs/COPYING.LIB +--- ../glibc-2.1.3/c_stubs/COPYING.LIB 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/c_stubs/COPYING.LIB 2000-02-25 16:35:05.000000000 -0800 +@@ -0,0 +1,482 @@ ++ GNU LIBRARY GENERAL PUBLIC LICENSE ++ Version 2, June 1991 ++ ++ Copyright (C) 1991 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 library GPL. It is ++ numbered 2 because it goes with version 2 of the ordinary GPL.] ++ ++ 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 Library General Public License, applies to some ++specially designated Free Software Foundation software, and to any ++other libraries whose authors decide to use it. You can use it for ++your libraries, too. ++ ++ When we speak of free software, we are referring to freedom, 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 or use pieces of it ++in new free programs; and that you know you can do these things. ++ ++ To protect your rights, we need to make restrictions that forbid ++anyone to deny you these rights or to ask you to surrender the 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 a program 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. ++ ++ Our method of protecting your rights has two steps: (1) copyright ++the library, and (2) offer you this license which gives you legal ++permission to copy, distribute and/or modify the library. ++ ++ Also, for each distributor's protection, we want to make certain ++that everyone understands that there is no warranty for this free ++library. If the library is modified by someone else and passed on, we ++want its recipients to know that what they have is not the original ++version, so that any problems introduced by others will not reflect on ++the original authors' reputations. ++ ++ Finally, any free program is threatened constantly by software ++patents. We wish to avoid the danger that companies distributing free ++software will individually obtain patent licenses, thus in effect ++transforming the program into proprietary software. To prevent this, ++we have made it clear that any patent must be licensed for everyone's ++free use or not licensed at all. ++ ++ Most GNU software, including some libraries, is covered by the ordinary ++GNU General Public License, which was designed for utility programs. This ++license, the GNU Library General Public License, applies to certain ++designated libraries. This license is quite different from the ordinary ++one; be sure to read it in full, and don't assume that anything in it is ++the same as in the ordinary license. ++ ++ The reason we have a separate public license for some libraries is that ++they blur the distinction we usually make between modifying or adding to a ++program and simply using it. Linking a program with a library, without ++changing the library, is in some sense simply using the library, and is ++analogous to running a utility program or application program. However, in ++a textual and legal sense, the linked executable is a combined work, a ++derivative of the original library, and the ordinary General Public License ++treats it as such. ++ ++ Because of this blurred distinction, using the ordinary General ++Public License for libraries did not effectively promote software ++sharing, because most developers did not use the libraries. We ++concluded that weaker conditions might promote sharing better. ++ ++ However, unrestricted linking of non-free programs would deprive the ++users of those programs of all benefit from the free status of the ++libraries themselves. This Library General Public License is intended to ++permit developers of non-free programs to use free libraries, while ++preserving your freedom as a user of such programs to change the free ++libraries that are incorporated in them. (We have not seen how to achieve ++this as regards changes in header files, but we have achieved it as regards ++changes in the actual functions of the Library.) The hope is that this ++will lead to faster development of free libraries. ++ ++ 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, while the latter only ++works together with the library. ++ ++ Note that it is possible for a library to be covered by the ordinary ++General Public License rather than by this special one. ++ ++ GNU LIBRARY GENERAL PUBLIC LICENSE ++ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ++ ++ 0. This License Agreement applies to any software library which ++contains a notice placed by the copyright holder or other authorized ++party saying it may be distributed under the terms of this Library ++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 compile 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) 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. ++ ++ c) 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. ++ ++ d) 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 source code 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 to ++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 Library 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 ++ ++ Appendix: 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 a brief 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 Library General Public ++ License as published by the Free Software Foundation; either ++ version 2 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 ++ Library General Public License for more details. ++ ++ You should have received a copy of the GNU Library 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 -Naur ../glibc-2.1.3/c_stubs/ChangeLog glibc-2.1.3/c_stubs/ChangeLog +--- ../glibc-2.1.3/c_stubs/ChangeLog 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/c_stubs/ChangeLog 2000-02-27 11:35:23.000000000 -0800 +@@ -0,0 +1,32 @@ ++2000-02-27 Cristian Gafton <gafton@redhat.com> ++ ++ * gconv_stubs.c: Return __gconv_OK for: ++ __gconv_transform_ascii_internal ++ __gconv_transform_ucs2little_internal ++ __gconv_transform_utf16_internal ++ __gconv_transform_utf8_internal ++ __gconv_transform_ucs2_internal ++ ++2000-02-25 Cristian Gafton <gafton@redhat.com> ++ ++ * gconv_stubs.c: add __c_stubs_is_compiled_in so we can detect when ++ the library is linked in. ++ ++Wed Dec 8 13:47:25 1999 Ivan Brunello <ivan.brunello@tiscalinet.it> ++ ++ * Makefile (extra-objs): Changed stubs.o to gconv_stubs.o. ++ ++Sun Dec 5 11:32:17 1999 H.J. Lu <hjl@gnu.org> ++ ++ * gconv_stubs.c: Renamed from stubs.c. ++ Support glibc 2.1.x. ++ ++Mon Aug 23 16:42:05 1999 H.J. Lu <hjl@gnu.org> ++ ++ * Banner: New. ++ * COPYING.LIB: Likewise. ++ * Makefile: Likewise. ++ * README: Likewise. ++ * configure: Likewise. ++ * stubs.c: Likewise. ++ * test-stdio.c: Likewise. +diff -Naur ../glibc-2.1.3/c_stubs/Makefile glibc-2.1.3/c_stubs/Makefile +--- ../glibc-2.1.3/c_stubs/Makefile 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/c_stubs/Makefile 2000-02-25 16:35:05.000000000 -0800 +@@ -0,0 +1,46 @@ ++# 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 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. ++ ++# ++# Sub-makefile for the C stub add-on library. ++# ++subdir := c_stubs ++ ++tests-static := test-stdio ++tests := $(tests-static) ++ ++libc_stubs-objs := gconv_stubs.o ++ ++install-lib := libc_stubs.a ++non-lib.a := libc_stubs.a ++ ++extra-objs := gconv_stubs.o libc_stubs.a ++ ++include ../Makeconfig ++ ++CPPFLAGS += -I../iconv ++ ++include ../Rules ++ ++$(objpfx)libc_stubs.a: $(addprefix $(objpfx), $(libc_stubs-objs)) ++ -rm -f $@ ++ $(LD) -r -o $@ $^ ++ ++lib: $(objpfx)libc_stubs.a ++ ++$(objpfx)test-stdio: $(objpfx)libc_stubs.a +diff -Naur ../glibc-2.1.3/c_stubs/README glibc-2.1.3/c_stubs/README +--- ../glibc-2.1.3/c_stubs/README 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/c_stubs/README 2000-02-25 16:35:05.000000000 -0800 +@@ -0,0 +1,8 @@ ++This is a stub add-on library for the GNU C library version 2.1.2 and ++above. It is used to create the smaller static binaries by stubbing ++out the gconv related functions. The resulting binaries may not have ++all the functionalities. ++ ++H.J. Lu ++hjl@gnu.org ++12/05/1999 +diff -Naur ../glibc-2.1.3/c_stubs/configure glibc-2.1.3/c_stubs/configure +--- ../glibc-2.1.3/c_stubs/configure 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/c_stubs/configure 2000-02-25 16:35:05.000000000 -0800 +@@ -0,0 +1,2 @@ ++# This is only to keep the GNU C library configure mechanism happy. ++exit 0 +diff -Naur ../glibc-2.1.3/c_stubs/gconv_stubs.c glibc-2.1.3/c_stubs/gconv_stubs.c +--- ../glibc-2.1.3/c_stubs/gconv_stubs.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/c_stubs/gconv_stubs.c 2000-02-27 11:35:23.000000000 -0800 +@@ -0,0 +1,83 @@ ++/* Provide gconv stub functions for the minimum static binaries. ++ 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 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. */ ++ ++#include <features.h> ++#include <gconv_int.h> ++ ++/* hack for self identification */ ++int __c_stubs_is_compiled_in; ++ ++/* Don't drag in the dynamic linker. */ ++void *__libc_stack_end; ++ ++int ++__gconv_OK () ++{ ++#if __GLIBC__ > 2 || __GLIBC_MINOR__ > 1 ++ return __GCONV_OK; ++#else ++ return GCONV_OK; ++#endif ++} ++ ++int ++__gconv_NOCONV () ++{ ++#if __GLIBC__ > 2 || __GLIBC_MINOR__ > 1 ++ return __GCONV_NOCONV; ++#else ++ return GCONV_NOCONV; ++#endif ++} ++ ++strong_alias (__gconv_OK, ++ __gconv_close_transform); ++ ++strong_alias (__gconv_NOCONV, ++ __gconv); ++strong_alias (__gconv_NOCONV, ++ __gconv_find_transform); ++strong_alias (__gconv_NOCONV, ++ __gconv_open); ++ ++/* These transformations should not fail in normal conditions */ ++strong_alias (__gconv_OK, ++ __gconv_transform_ascii_internal); ++strong_alias (__gconv_OK, ++ __gconv_transform_ucs2little_internal); ++strong_alias (__gconv_OK, ++ __gconv_transform_utf16_internal); ++strong_alias (__gconv_OK, ++ __gconv_transform_utf8_internal); ++strong_alias (__gconv_OK, ++ __gconv_transform_ucs2_internal); ++ ++/* We can assume no conversion for these ones */ ++strong_alias (__gconv_NOCONV, ++ __gconv_transform_internal_ascii); ++strong_alias (__gconv_NOCONV, ++ __gconv_transform_internal_ucs2); ++strong_alias (__gconv_NOCONV, ++ __gconv_transform_internal_ucs2little); ++strong_alias (__gconv_NOCONV, ++ __gconv_transform_internal_ucs4); ++strong_alias (__gconv_NOCONV, ++ __gconv_transform_internal_utf16); ++strong_alias (__gconv_NOCONV, ++ __gconv_transform_internal_utf8); +diff -Naur ../glibc-2.1.3/c_stubs/test-stdio.c glibc-2.1.3/c_stubs/test-stdio.c +--- ../glibc-2.1.3/c_stubs/test-stdio.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/c_stubs/test-stdio.c 2000-02-25 16:35:05.000000000 -0800 +@@ -0,0 +1,8 @@ ++#include <stdio.h> ++ ++int ++main () ++{ ++ printf ("Hello world\n"); ++ return 0; ++} +diff -Naur ../glibc-2.1.3/config-name.in glibc-2.1.3/config-name.in +--- ../glibc-2.1.3/config-name.in 1994-12-08 01:12:33.000000000 -0800 ++++ glibc-2.1.3/config-name.in 1998-02-07 12:00:39.000000000 -0800 +@@ -1,5 +1,5 @@ + /* @configure_input@ -*- C -*- +- Generated from $Id: config-name.in,v 1.1 1994/12/08 09:12:33 roland Exp $. ++ Generated from $Id: config-name.in,v 1.1.1.1 1998/02/07 20:00:39 gafton Exp $. + + This is used only by the generic `uname' function for systems with no real + `uname' call. If this data is not correct, it does not matter much. */ +diff -Naur ../glibc-2.1.3/config.make.in glibc-2.1.3/config.make.in +--- ../glibc-2.1.3/config.make.in 2000-02-11 15:49:41.000000000 -0800 ++++ glibc-2.1.3/config.make.in 2000-02-14 12:05:50.000000000 -0800 +@@ -1,5 +1,5 @@ + # @configure_input@ +-# From $Id: config.make.in,v 1.61.2.2 2000/02/11 20:45:02 drepper Exp $. ++# From $Id: config.make.in,v 1.1.1.2 2000/02/14 20:05:50 gafton Exp $. + # Don't edit this file. Put configuration parameters in configparms instead. + + version = @VERSION@ +diff -Naur ../glibc-2.1.3/db2/include/queue.h glibc-2.1.3/db2/include/queue.h +--- ../glibc-2.1.3/db2/include/queue.h 1998-06-09 08:03:53.000000000 -0700 ++++ glibc-2.1.3/db2/include/queue.h 1998-07-09 11:45:13.000000000 -0700 +@@ -1,4 +1,4 @@ +-/* BSDI $Id: queue.h,v 1.3 1998/06/09 15:03:53 drepper Exp $ */ ++/* BSDI $Id: queue.h,v 1.1.1.1 1998/07/09 18:45:13 gafton Exp $ */ + + /* + * Copyright (c) 1991, 1993 +diff -Naur ../glibc-2.1.3/elf/rtld.c glibc-2.1.3/elf/rtld.c +--- ../glibc-2.1.3/elf/rtld.c 2000-02-22 23:02:47.000000000 -0800 ++++ glibc-2.1.3/elf/rtld.c 2000-02-23 14:48:17.000000000 -0800 +@@ -758,6 +758,60 @@ + __munmap (file, file_size); + } + ++ ++ /* ++ * Modifications by Red Hat Software ++ * ++ * Deal with the broken binaries from the non-versioned ages of glibc. ++ * If a binary does not have version information enebled, we assume that ++ * it is a glibc 2.0 binary andwe load a compatibility library to try to ++ * overcome binary incompatibilities. ++ * Blame: gafton@redhat.com ++ */ ++#define LIB_NOVERSION "/lib/libNoVersion.so.1" ++ ++ if (_dl_loaded->l_info[DT_NUM + DT_PROCNUM + DT_VERSIONTAGIDX (DT_VERNEED)] == NULL) { ++ struct link_map *new_map = NULL; ++ struct stat test_st; ++ int test_fd; ++ int can_load; ++ ++ HP_TIMING_NOW (start); ++ ++/* _dl_sysdep_message("Loading compatibility library... ", NULL); */ ++ ++ can_load = 1; ++ test_fd = __open (LIB_NOVERSION, O_RDONLY); ++ if (test_fd < 0) { ++ can_load = 0; ++/* _dl_sysdep_message(" Can't find " LIB_NOVERSION "\n", NULL); */ ++ } else { ++ if (__fxstat (_STAT_VER, test_fd, &test_st) < 0 || test_st.st_size == 0) { ++ can_load = 0; ++/* _dl_sysdep_message(" Can't stat " LIB_NOVERSION "\n", NULL); */ ++ } ++ } ++ ++ if (test_fd >= 0) /* open did no fail.. */ ++ __close(test_fd); /* avoid fd leaks */ ++ ++ if (can_load != 0) { ++ new_map = _dl_map_object (_dl_loaded, LIB_NOVERSION, ++ 1, lt_library, 0); ++ if (new_map->l_opencount == 1) { ++ /* It is no duplicate. */ ++ ++npreloads; ++/* _dl_sysdep_message(" DONE\n", NULL); */ ++ } else { ++/* _dl_sysdep_message(" FAILED\n", NULL); */ ++ } ++ } ++ ++ HP_TIMING_NOW (stop); ++ HP_TIMING_DIFF (diff, start, stop); ++ HP_TIMING_ACCUM_NT (load_time, diff); ++ } ++ + if (npreloads != 0) + { + /* Set up PRELOADS with a vector of the preloaded libraries. */ +diff -Naur ../glibc-2.1.3/glibc-2.1.spec glibc-2.1.3/glibc-2.1.spec +--- ../glibc-2.1.3/glibc-2.1.spec 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-2.1.spec 2000-02-29 13:27:37.000000000 -0800 +@@ -0,0 +1,305 @@ ++Summary: The GNU libc libraries. ++Name: glibc ++Version: 2.1.3 ++Release: 15 ++Copyright: LGPL ++Group: System Environment/Libraries ++Source: %{name}-%{version}.tar.gz ++# Other sources are available at: ++# http://www.ozemail.com.au/~geoffk/glibc-crypt/glibc-crypt-2.1.tar.gz ++# In the source tarball the file diff-CYGNUS-to-REDHAT.patch contains all ++# diffs applied by Red Hat to the current CVS version of glibc ++Buildroot: /var/tmp/glibc-%{PACKAGE_VERSION}-root ++Obsoletes: zoneinfo, libc-static, libc-devel, libc-profile, libc-headers, ++Obsoletes: linuxthreads, gencat, locale ++Autoreq: false ++%ifarch alpha ++Provides: ld.so.2 ++%else ++%endif ++%ifarch sparc ++Obsoletes: libc ++%endif ++ ++%description ++The glibc package contains standard libraries which are used by ++multiple programs on the system. In order to save disk space and ++memory, as well as to make upgrading easier, common system code is ++kept in one place and shared between programs. This particular package ++contains the most important sets of shared libraries: the standard C ++library and the standard math library. Without these two libraries, a ++Linux system will not function. The glibc package also contains ++national language (locale) support and timezone databases. ++ ++%package devel ++Summary: Header and object files for development using standard C libraries. ++Group: Development/Libraries ++Conflicts: texinfo < 3.11 ++Prereq: /sbin/install-info ++Obsoletes: libc-debug, libc-headers, libc-devel, linuxthreads-devel ++Obsoletes: glibc-debug ++Prereq: kernel-headers ++Requires: kernel-headers >= 2.2.1 ++Autoreq: true ++ ++%description devel ++The glibc-devel package contains the header and object files necessary ++for developing programs which use the standard C libraries (which are ++used by nearly all programs). If you are developing programs which ++will use the standard C libraries, your system needs to have these ++standard header and object files available in order to create the ++executables. ++ ++Install glibc-devel if you are going to develop programs which will ++use the standard C libraries. ++ ++%package profile ++Summary: The GNU libc libraries, including support for gprof profiling. ++Group: Development/Libraries ++Obsoletes: libc-profile ++Autoreq: true ++ ++%description profile ++The glibc-profile package includes the GNU libc libraries and support ++for profiling using the gprof program. Profiling is analyzing a ++program's functions to see how much CPU time they use and determining ++which functions are calling other functions during execution. To use ++gprof to profile a program, your program needs to use the GNU libc ++libraries included in glibc-profile (instead of the standard GNU libc ++libraries included in the glibc package). ++ ++If you are going to use the gprof program to profile a program, you'll ++need to install the glibc-profile program. ++ ++%package -n nscd ++Summary: A Name Service Caching Daemon (nscd). ++Group: System Environment/Daemons ++Conflicts: kernel < 2.2.0 ++Prereq: /sbin/chkconfig ++Autoreq: true ++ ++%description -n nscd ++Nscd caches name service lookups and can dramatically improve ++performance with NIS+, and may help with DNS as well. Note that you ++can't use nscd with 2.0 kernels because of bugs in the kernel-side ++thread support. Unfortunately, nscd happens to hit these bugs ++particularly hard. ++ ++Install nscd if you need a name service lookup caching daemon, and ++you're not using a version 2.0 kernel. ++ ++%prep ++%setup -q ++ ++%ifarch armv4l ++rm -rf glibc-compat ++%endif ++ ++find . -type f -size 0 -o -name "*.orig" -exec rm -f {} \; ++ ++%build ++rm -rf build-$RPM_ARCH-linux ++mkdir build-$RPM_ARCH-linux ; cd build-$RPM_ARCH-linux ++%ifarch i586 i686 ++BuildFlags="-mpentium -D__USE_STRING_INLINES -fstrict-aliasing -mcpu=%{_target_cpu}" ++%endif ++%ifarch sparcv9 ++BuildFlags="-mv8 -mtune=ultrasparc" ++%endif ++CC=egcs CFLAGS="$BuildFlags -g -O3" ../configure --prefix=/usr \ ++ --enable-add-ons=yes --without-cvs \ ++ %{_target_cpu}-redhat-linux ++make -r CFLAGS="$BuildFlags -g -O3" PARALLELMFLAGS=-s ++ ++%install ++rm -rf $RPM_BUILD_ROOT ++mkdir -p $RPM_BUILD_ROOT ++make install_root=$RPM_BUILD_ROOT install -C build-$RPM_ARCH-linux ++cd build-$RPM_ARCH-linux && \ ++ make install_root=$RPM_BUILD_ROOT install-locales -C ../localedata objdir=`pwd` && \ ++ cd .. ++ ++# compatibility hack: this locale has vanished from glibc, but some other ++# programs are still using it. Normally we would handle it in the %pre ++# section but with glibc that is simply not an option ++mkdir -p $RPM_BUILD_ROOT/usr/share/locale/ru_RU/LC_MESSAGES ++ ++# Remove the files we don't want to distribute ++rm -f $RPM_BUILD_ROOT/usr/lib/libNoVersion* ++ ++# the man pages for the linuxthreads require special attention ++make -C linuxthreads/man ++mkdir -p $RPM_BUILD_ROOT/usr/man/man3 ++install -m 0644 linuxthreads/man/*.3thr $RPM_BUILD_ROOT/usr/man/man3 ++gzip -9nvf $RPM_BUILD_ROOT/usr/man/man3/* ++ ++gzip -9nvf $RPM_BUILD_ROOT/usr/info/libc* ++ ++ln -sf libbsd-compat.a $RPM_BUILD_ROOT/usr/lib/libbsd.a ++ ++install -m 644 redhat/nsswitch.conf $RPM_BUILD_ROOT/etc/nsswitch.conf ++ ++# Take care of setuids ++# -- new security review sez that this shouldn't be needed anymore ++#chmod 755 $RPM_BUILD_ROOT/usr/libexec/pt_chown ++ ++# This is for ncsd - in glibc 2.1 ++install -m 644 nscd/nscd.conf $RPM_BUILD_ROOT/etc ++mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d ++install -m 755 nscd/nscd.init $RPM_BUILD_ROOT/etc/rc.d/init.d/nscd ++ ++# The database support ++mkdir -p $RPM_BUILD_ROOT/var/db ++install -m 644 nss/db-Makefile $RPM_BUILD_ROOT/var/db/Makefile ++ ++# Strip binaries ++strip $RPM_BUILD_ROOT/sbin/* || : ++strip $RPM_BUILD_ROOT/usr/bin/* || : ++strip $RPM_BUILD_ROOT/usr/sbin/* || : ++ ++# BUILD THE FILE LIST ++find $RPM_BUILD_ROOT -type f -or -type l | ++ sed -e 's|.*/etc|%config &|' > rpm.filelist.in ++for n in /usr/share /usr/include; do ++ find ${RPM_BUILD_ROOT}${n} -type d | \ ++ grep -v '^/usr/share$' | \ ++ sed "s/^/%dir /" >> rpm.filelist.in ++done ++ ++# primary filelist ++sed "s|$RPM_BUILD_ROOT||" < rpm.filelist.in | ++ grep -v '/etc/localtime' | \ ++ grep -v '/etc/nsswitch.conf' | \ ++ sort > rpm.filelist ++ ++grep '/usr/lib/lib.*_p\.a' < rpm.filelist > profile.filelist ++egrep "(/usr/include)|(/usr/info)" < rpm.filelist | ++ grep -v /usr/info/dir > devel.filelist ++ ++mv rpm.filelist rpm.filelist.full ++grep -v '/usr/lib/lib.*_p.a' rpm.filelist.full | ++ egrep -v "(/usr/include)|(/usr/info)" > rpm.filelist ++ ++grep '/usr/lib/lib.*\.a' < rpm.filelist >> devel.filelist ++grep '/usr/lib/.*\.o' < rpm.filelist >> devel.filelist ++grep '/usr/lib/lib.*\.so' < rpm.filelist >> devel.filelist ++grep '/usr/man/man' < rpm.filelist >> devel.filelist ++ ++mv rpm.filelist rpm.filelist.full ++grep -v '/usr/lib/lib.*\.a' < rpm.filelist.full | ++ grep -v '/usr/lib/.*\.o' | ++ grep -v '/usr/lib/lib.*\.so'| ++ grep -v '/usr/man/man' | ++ grep -v 'nscd' > rpm.filelist ++ ++# /etc/localtime - we're proud of our timezone ++rm -f $RPM_BUILD_ROOT/etc/localtime ++cp -f $RPM_BUILD_ROOT/usr/share/zoneinfo/US/Eastern $RPM_BUILD_ROOT/etc/localtime ++#ln -sf ../usr/share/zoneinfo/US/Eastern $RPM_BUILD_ROOT/etc/localtime ++ ++# the last bit: more documentation ++rm -rf documentation ++mkdir documentation ++cp linuxthreads/ChangeLog documentation/ChangeLog.threads ++cp linuxthreads/Changes documentation/Changes.threads ++cp linuxthreads/README documentation/README.threads ++cp linuxthreads/FAQ.html documentation/FAQ-threads.html ++cp -r linuxthreads/Examples documentation/examples.threads ++cp crypt/README documentation/README.crypt ++cp db2/README documentation/README.db2 ++cp db2/mutex/README documentation/README.db2.mutex ++cp timezone/README documentation/README.timezone ++cp ChangeLog* documentation ++gzip -9 documentation/ChangeLog* ++ ++%post -p /sbin/ldconfig ++ ++%postun -p /sbin/ldconfig ++ ++%post devel ++/sbin/install-info /usr/info/libc.info.gz /usr/info/dir ++ ++%pre devel ++# this used to be a link and it is causing nightmares now ++if [ -L /usr/include/scsi ] ; then ++ rm -f /usr/include/scsi ++fi ++ ++%preun devel ++if [ "$1" = 0 ]; then ++ /sbin/install-info --delete /usr/info/libc.info.gz /usr/info/dir ++fi ++ ++%post -n nscd ++/sbin/chkconfig --add nscd ++ ++%preun -n nscd ++if [ $1 = 0 ] ; then ++ /sbin/chkconfig --del nscd ++fi ++ ++%clean ++rm -rf "$RPM_BUILD_ROOT" ++rm -f *.filelist* ++ ++%files -f rpm.filelist ++%defattr(-,root,root) ++%config(noreplace) /etc/localtime ++%config(noreplace) /etc/nsswitch.conf ++%doc README NEWS INSTALL FAQ BUGS NOTES PROJECTS ++%doc documentation/* README.template README.libm ++%doc login/README.utmpd hesiod/README.hesiod ++%dir /var/db ++ ++%ifnarch sparcv9 i586 i686 ++%files -f devel.filelist devel ++%defattr(-,root,root) ++ ++%files -f profile.filelist profile ++%defattr(-,root,root) ++ ++%files -n nscd ++%defattr(-,root,root) ++%config /etc/nscd.conf ++/etc/rc.d/init.d/nscd ++/usr/sbin/nscd ++%endif ++ ++%define date %(echo `LC_ALL="C" date +"%a %b %d %Y"`) ++ ++%changelog ++* %{date} Cristian Gafton <gafton@redhat.com> ++- fix c_stubs add-on to work around various assert()s in glibc ++- add Davem's patch for _NPROCESSORS_ONLN on Sparc ++ ++* Fri Feb 25 2000 Cristian Gafton <gafton@redhat.com> ++- add the c_stubs add-on ++- sparc patch from davem ++ ++* Thu Feb 24 2000 Cristian Gafton <gafton@redhat.com> ++- fix locale problems on 64 bit arches ++ ++* Tue Feb 22 2000 Cristian Gafton <gafton@redhat.com> ++- cygnus sync up for fixes to nscd ++ ++* Thu Feb 17 2000 Cristian Gafton <gafton@redhat.com> ++- updated to include new China timezones ++- sync up with the locale changes from Cygnus ++ ++* Tue Feb 01 2000 Cristian Gafton <gafton@redhat.com> ++- updated from cygnus branch ++- fix syslog so that it will continuously try to fallback from SOK_DGRAM to ++ SOCK_STREAM and backwards ++ ++* Mon Jan 31 2000 Cristian Gafton <gafton@redhat.com> ++- update from cygnus branch ++- compress man pages for the linuxthreads stuff ++ ++* Fri Jan 21 2000 Cristian Gafton <gafton@redhat.com> ++- add Jakub's patch so we back out even more ++ ++* Thu Jan 20 2000 Cristian Gafton <gafton@redhat.com> ++- back out the setrlimit changes (well, sort of) ++ ++* Mon Jan 03 2000 Cristian Gafton <gafton@redhat.com> ++- make release from CVS server directly now +diff -Naur ../glibc-2.1.3/glibc-compat/.cvsignore glibc-2.1.3/glibc-compat/.cvsignore +--- ../glibc-2.1.3/glibc-compat/.cvsignore 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/.cvsignore 2000-01-03 18:17:33.000000000 -0800 +@@ -0,0 +1 @@ ++glibc-compat*.tar.gz +diff -Naur ../glibc-2.1.3/glibc-compat/Banner glibc-2.1.3/glibc-compat/Banner +--- ../glibc-2.1.3/glibc-compat/Banner 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/Banner 2000-01-03 17:07:07.000000000 -0800 +@@ -0,0 +1 @@ ++Glibc-2.0 compatibility add-on by Cristian Gafton +diff -Naur ../glibc-2.1.3/glibc-compat/ChangeLog glibc-2.1.3/glibc-compat/ChangeLog +--- ../glibc-2.1.3/glibc-compat/ChangeLog 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/ChangeLog 2000-02-23 17:59:39.000000000 -0800 +@@ -0,0 +1,24 @@ ++2000-02-23 Cristian Gafton <gafton@redhat.com> ++ ++ * stubs.c (__setfpucw): Avoid using _FPU_SETCW on platform that do not have it ++ ++1999-07-08 Cristian Gafton <gafton@redhat.com> ++ ++ * stubs.c (__setfpucw): New function ++ * Makefile: Use -include, not include ++ (archive): New target. ++ ++ ++1999-04-09 Andreas Jaeger <aj@arthur.rhein-neckar.de> ++ * glibc-compat/Makefile: Add rules to link libnss_*.so.1 to libnss1_*.so.2. ++ ++1998-11-18 Cristian Gafton <gafton@redhat.com> ++ ++ * shlib-versions: added alpha versions ++ ++ * Makefile (services): Added libnss_dns ++ ++1998-11-16 Cristian Gafton <gafton@redhat.com> ++ ++ * makedist (archive): remove old tar file just in case ++ +diff -Naur ../glibc-2.1.3/glibc-compat/Depend glibc-2.1.3/glibc-compat/Depend +--- ../glibc-2.1.3/glibc-compat/Depend 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/Depend 2000-01-03 17:07:07.000000000 -0800 +@@ -0,0 +1,3 @@ ++resolv ++nss ++nis +diff -Naur ../glibc-2.1.3/glibc-compat/Makefile glibc-2.1.3/glibc-compat/Makefile +--- ../glibc-2.1.3/glibc-compat/Makefile 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/Makefile 2000-01-06 09:33:12.000000000 -0800 +@@ -0,0 +1,152 @@ ++# Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ ++# This 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. ++ ++# $Id: Makefile,v 1.2 2000/01/06 17:33:12 gafton Exp $ ++ ++subdir := glibc-compat ++ ++distribute := nss-nis.h ++ ++# This is the trivial part which goes into libc itself. ++routines = ++ ++# These are the databases that go through nss dispatch. ++# Caution: if you add a database here, you must add its real name ++# in databases.def, too. ++databases = proto service hosts network grp pwd rpc ethers \ ++ spwd netgrp alias ++ ++# Specify rules for the nss_* modules. We have some services. ++services := files nis compat dns db ++ ++extra-libs := $(services:%=libnss1_%) libNoVersion ++# These libraries will be built in the `others' pass rather than ++# the `lib' pass, because they depend on libc.so being built already. ++extra-libs-others = $(extra-libs) ++ ++# The sources are found in the appropriate subdir. ++subdir-dirs = $(services:%=nss_%) ++vpath %.c $(subdir-dirs) ++ ++libnss1_files-routines := $(addprefix files-,$(databases)) ++libnss1_db-routines := $(addprefix db-,$(filter-out hosts network,$(databases))) ++libnss1_compat-routines := $(addprefix compat-,grp pwd spwd) ++libnss1_nis-routines := $(addprefix nis-,$(databases)) ++libnss1_dns-routines := $(addprefix dns-, host network) ++ ++libcompat-routines := $(addprefix old, fileops iofdopen iopopen stdfiles \ ++ iofclose iofopen pclose tmpfile) ++libNoVersion-routines := stubs ++ ++generated += $(filter-out db-alias.c db-netgrp.c, \ ++ $(addsuffix .c,$(libnss1_db-routines))) ++ ++libnss1_files-inhibit-o = $(filter-out .os,$(object-suffixes)) ++libnss1_db-inhibit-o = $(filter-out .os,$(object-suffixes)) ++libnss1_compat-inhibit-o = $(filter-out .os,$(object-suffixes)) ++libnss1_nis-inhibit-o = $(filter-out .os,$(object-suffixes)) ++libnss1_dns-inhibit-o = $(filter-out .os,$(object-suffixes)) ++ ++-include ../Rules ++ ++# Force the soname to be libnss_*.so.1 for compatibility. ++LDFLAGS-nss1_files.so = -Wl,-soname=lib$(libprefix)nss_files.so$($(@F)-version) ++LDFLAGS-nss1_db.so = -Wl,-soname=lib$(libprefix)nss_db.so$($(@F)-version) ++LDFLAGS-nss1_nis.so = -Wl,-soname=lib$(libprefix)nss_nis.so$($(@F)-version) ++LDFLAGS-nss1_compat.so = -Wl,-soname=lib$(libprefix)nss_compat.so$($(@F)-version) ++LDFLAGS-nss1_dns.so = -Wl,-soname=lib$(libprefix)nss_dns.so$($(@F)-version) ++ ++-include ../Makeconfig ++ ++ifeq (yes,$(build-shared)) ++install-others += $(inst_slibdir)/libnss_files.so$(libnss1_files.so-version) \ ++ $(inst_slibdir)/libnss_db.so$(libnss1_db.so-version) \ ++ $(inst_slibdir)/libnss_nis.so$(libnss1_nis.so-version) \ ++ $(inst_slibdir)/libnss_compat.so$(libnss1_compat.so-version) \ ++ $(inst_slibdir)/libnss_dns.so$(libnss1_dns.so-version) ++endif ++ ++$(inst_slibdir)/libnss_files.so$(libnss1_files.so-version): $(inst_slibdir)/libnss1_files-$(version).so $(+force) ++ rm -f $@ ++ $(LN_S) $(<F) $@ ++ ++$(inst_slibdir)/libnss_db.so$(libnss1_db.so-version): $(inst_slibdir)/libnss1_db-$(version).so $(+force) ++ rm -f $@ ++ $(LN_S) $(<F) $@ ++ ++$(inst_slibdir)/libnss_nis.so$(libnss1_nis.so-version): $(inst_slibdir)/libnss1_nis-$(version).so $(+force) ++ rm -f $@ ++ $(LN_S) $(<F) $@ ++ ++$(inst_slibdir)/libnss_compat.so$(libnss1_compat.so-version): $(inst_slibdir)/libnss1_compat-$(version).so $(+force) ++ rm -f $@ ++ $(LN_S) $(<F) $@ ++ ++$(inst_slibdir)/libnss_dns.so$(libnss1_dns.so-version): $(inst_slibdir)/libnss1_dns-$(version).so $(+force) ++ rm -f $@ ++ $(LN_S) $(<F) $@ ++ ++ ++$(objpfx)libnss1_db.so: $(common-objpfx)db/libdb1.so $(objpfx)libnss1_files.so ++ ++$(libnss1_db-routines:%=$(objpfx)%.c): $(objpfx)db-%.c: nss_files/files-%.c ++ @rm -f $@.new ++ (echo '#define EXTERN_PARSER';\ ++ echo '#define GENERIC "../nss_db/db-XXX.c"';\ ++ echo '#include <$<>') > $@.new ++ mv -f $@.new $@ ++ ++$(objpfx)libnss1_compat.so: $(common-objpfx)nis/libnsl.so$(libnsl.so-version) \ ++ $(objpfx)libnss1_files.so ++$(objpfx)libnss1_nis.so: $(common-objpfx)nis/libnsl.so$(libnsl.so-version) \ ++ $(objpfx)libnss1_files.so ++ ++# The DNS NSS modules needs the resolver. ++#$(objpfx)libnss1_dns.so: $(filter-out $(common-objpfx)resolv/stamp.os, \ ++# $(wildcard $(common-objpfx)resolv/*.os)) \ ++# $(common-objpfx)libc.so ++$(objpfx)libnss1_dns.so: $(common-objpfx)resolv/libresolv.so $(common-objpfx)libc.so ++ ++# Depend on libc.so so a DT_NEEDED is generated in the shared objects. ++# This ensures they will load libc.so for needed symbols if loaded by ++# a statically-linked program that hasn't already loaded it. ++$(objpfx)libnss1_compat.so: $(common-objpfx)nis/libnsl.so$(libnsl.so-version) \ ++ $(objpfx)libnss1_files.so $(common-objpfx)libc.so ++$(objpfx)libnss1_db.so: $(common-objpfx)db2/libdb.so $(objpfx)libnss1_files.so\ ++ $(common-objpfx)libc.so ++$(objpfx)libnss1_dns.so: $(common-objpfx)resolv/libresolv.so \ ++ $(common-objpfx)libc.so ++$(objpfs)libnss1_files.so: $(common-objpfx)libc.so ++$(objpfx)libnss1_nis.so: $(common-objpfx)nis/libnsl.so$(libnsl.so-version) \ ++ $(objpfx)libnss1_files.so $(common-objpfx)libc.so ++ ++ ++# ++# This is needed to build the separate tarball ++# ++pkgNAME = $(subdir) ++pkgVERSION = 2.1.2 ++pkgCVSTAG = $(pkgNAME)_$(subst .,-,$(pkgVERSION)) ++ ++archive: ++ @rm -f *.tar.gz *~ ++ cvs tag -F $(pkgCVSTAG) . ++ @rm -rf /tmp/$(pkgNAME)-$(pkgVERSION) /tmp/$(pkgNAME) $(pkgNAME)-$(pkgVERSION).tar.gz ++ @cd /tmp; cvs export -r$(pkgCVSTAG) $(pkgNAME) ++ @pkgDIR=$$PWD; cd /tmp; tar cvzf $$pkgDIR/$(pkgNAME)-$(pkgVERSION).tar.gz $(pkgNAME) ++ @rm -rf /tmp/$(pkgNAME) ++ @echo "The archive is in $(pkgNAME)-$(pkgVERSION).tar.gz" +diff -Naur ../glibc-2.1.3/glibc-compat/Versions glibc-2.1.3/glibc-compat/Versions +--- ../glibc-2.1.3/glibc-compat/Versions 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/Versions 2000-01-03 17:07:07.000000000 -0800 +@@ -0,0 +1,106 @@ ++libnss1_db { ++ GLIBC_2.0 { ++ _nss_db_endaliasent; _nss_db_endetherent; _nss_db_endgrent; ++ _nss_db_endnetgrent; _nss_db_endprotoent; _nss_db_endpwent; ++ _nss_db_endrpcent; _nss_db_endservent; _nss_db_endspent; ++ _nss_db_getaliasbyname_r; _nss_db_getaliasent_r; _nss_db_getetherent_r; ++ _nss_db_getgrent_r; _nss_db_getgrgid_r; _nss_db_getgrnam_r; ++ _nss_db_gethostton_r; _nss_db_getnetgrent_r; _nss_db_getntohost_r; ++ _nss_db_getprotobyname_r; _nss_db_getprotobynumber_r; ++ _nss_db_getprotoent_r; _nss_db_getpwent_r; _nss_db_getpwnam_r; ++ _nss_db_getpwuid_r; _nss_db_getrpcbyname_r; _nss_db_getrpcbynumber_r; ++ _nss_db_getrpcent_r; _nss_db_getservbyname_r; _nss_db_getservbyport_r; ++ _nss_db_getservent_r; _nss_db_getspent_r; _nss_db_getspnam_r; ++ _nss_db_setaliasent; _nss_db_setetherent; _nss_db_setgrent; ++ _nss_db_setnetgrent; _nss_db_setprotoent; _nss_db_setpwent; ++ _nss_db_setrpcent; _nss_db_setservent; _nss_db_setspent; ++ } ++} ++ ++libnss1_dns { ++ GLIBC_2.0 { ++ _nss_dns_gethostbyaddr_r; _nss_dns_gethostbyname2_r; ++ _nss_dns_gethostbyname_r; _nss_dns_getnetbyaddr_r; ++ _nss_dns_getnetbyname_r; ++ } ++} ++ ++libnss1_files { ++ GLIBC_2.0 { ++ _nss_files_setaliasent; _nss_files_endaliasent; ++ _nss_files_getaliasbyname_r; _nss_files_getaliasent_r; ++ ++ _nss_files_setetherent; _nss_files_endetherent; ++ _nss_files_getetherent_r; _nss_files_parse_etherent; ++ ++ _nss_files_setgrent; _nss_files_endgrent; ++ _nss_files_getgrent_r; _nss_files_getgrgid_r; _nss_files_getgrnam_r; ++ ++ _nss_files_sethostent; _nss_files_endhostent; ++ _nss_files_gethostbyaddr_r; _nss_files_gethostbyname2_r; _nss_files_gethostbyname_r; ++ _nss_files_gethostent_r; _nss_files_gethostton_r; ++ ++ _nss_files_setnetent; _nss_files_endnetent; ++ _nss_files_getnetbyaddr_r; _nss_files_getnetbyname_r; ++ _nss_files_getnetent_r; _nss_files_getntohost_r; ++ _nss_files_parse_netent; ++ ++ _nss_files_setnetgrent; _nss_files_endnetgrent; _nss_files_getnetgrent_r; ++ ++ _nss_files_setprotoent; _nss_files_endprotoent; ++ _nss_files_getprotobyname_r; _nss_files_getprotobynumber_r; ++ _nss_files_getprotoent_r; _nss_files_parse_protoent; ++ ++ _nss_files_setpwent; _nss_files_endpwent; ++ _nss_files_getpwent_r; _nss_files_getpwnam_r; _nss_files_getpwuid_r; ++ ++ _nss_files_setrpcent; _nss_files_endrpcent; ++ _nss_files_getrpcbyname_r; _nss_files_getrpcbynumber_r; ++ _nss_files_getrpcent_r; ++ _nss_files_parse_rpcent; ++ ++ _nss_files_setservent; _nss_files_endservent; ++ _nss_files_getservbyname_r; _nss_files_getservbyport_r; ++ _nss_files_getservent_r; ++ _nss_files_parse_servent; ++ ++ _nss_files_setspent; _nss_files_endspent; ++ _nss_files_getspent_r; _nss_files_getspnam_r; ++ ++ _nss_netgroup_parseline; ++ } ++} ++ ++libnss1_compat { ++ GLIBC_2.0 { ++ _nss_compat_endgrent; _nss_compat_endpwent; _nss_compat_endspent; ++ _nss_compat_getgrent_r; _nss_compat_getgrgid_r; _nss_compat_getgrnam_r; ++ _nss_compat_getpwent_r; _nss_compat_getpwnam_r; _nss_compat_getpwuid_r; ++ _nss_compat_getspent_r; _nss_compat_getspnam_r; _nss_compat_initgroups; ++ _nss_compat_setgrent; _nss_compat_setpwent; _nss_compat_setspent; ++ } ++} ++ ++libnss1_nis { ++ GLIBC_2.0 { ++ _nss_nis_endaliasent; _nss_nis_endetherent; _nss_nis_endgrent; ++ _nss_nis_endhostent; _nss_nis_endnetent; _nss_nis_endnetgrent; ++ _nss_nis_endprotoent; _nss_nis_endpwent; _nss_nis_endrpcent; ++ _nss_nis_endservent; _nss_nis_endspent; _nss_nis_getaliasbyname_r; ++ _nss_nis_getaliasent_r; _nss_nis_getetherent_r; _nss_nis_getgrent_r; ++ _nss_nis_getgrgid_r; _nss_nis_getgrnam_r; _nss_nis_gethostbyaddr_r; ++ _nss_nis_gethostbyname2_r; _nss_nis_gethostbyname_r; _nss_nis_gethostent_r; ++ _nss_nis_gethostton_r; _nss_nis_getnetbyaddr_r; _nss_nis_getnetbyname_r; ++ _nss_nis_getnetent_r; _nss_nis_getnetgrent_r; _nss_nis_getntohost_r; ++ _nss_nis_getprotobyname_r; _nss_nis_getprotobynumber_r; ++ _nss_nis_getprotoent_r; _nss_nis_getpublickey; _nss_nis_getpwent_r; ++ _nss_nis_getpwnam_r; _nss_nis_getpwuid_r; _nss_nis_getrpcbyname_r; ++ _nss_nis_getrpcbynumber_r; _nss_nis_getrpcent_r; _nss_nis_getsecretkey; ++ _nss_nis_getservbyname_r; _nss_nis_getservbyport_r; _nss_nis_getservent_r; ++ _nss_nis_getspent_r; _nss_nis_getspnam_r; _nss_nis_initgroups; ++ _nss_nis_netname2user; _nss_nis_setaliasent; _nss_nis_setetherent; ++ _nss_nis_setgrent; _nss_nis_sethostent; _nss_nis_setnetent; ++ _nss_nis_setnetgrent; _nss_nis_setprotoent; _nss_nis_setpwent; ++ _nss_nis_setrpcent; _nss_nis_setservent; _nss_nis_setspent; ++ } ++} +diff -Naur ../glibc-2.1.3/glibc-compat/Versions.def glibc-2.1.3/glibc-compat/Versions.def +--- ../glibc-2.1.3/glibc-compat/Versions.def 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/Versions.def 2000-01-03 17:07:07.000000000 -0800 +@@ -0,0 +1,15 @@ ++libnss1_files { ++ GLIBC_2.0 ++} ++libnss1_db { ++ GLIBC_2.0 ++} ++libnss1_dns { ++ GLIBC_2.0 ++} ++libnss1_nis { ++ GLIBC_2.0 ++} ++libnss1_compat { ++ GLIBC_2.0 ++} +diff -Naur ../glibc-2.1.3/glibc-compat/configure glibc-2.1.3/glibc-compat/configure +--- ../glibc-2.1.3/glibc-compat/configure 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/configure 2000-01-03 17:07:07.000000000 -0800 +@@ -0,0 +1,28 @@ ++#! /bin/sh ++# ++# We need a configure script only when compiling as part of GNU C library. ++# Here we have to generate one of the files we need while compiling. ++# ++# The only problem is that no users of the package might thing they have to ++# run configure themself and find it irritating when nothing happens. ++# ++# So we try here to find out whether we are called from the glibc configure ++# or by a user. If the later is true show a gentle message. ++# ++saw_srcdir=no ++srcdir= ++saw_cache_file=no ++# We use a simple heuristic which might fail: if we see the argument the ++# glibc configure passes we assume it's glibc who calls us. ++for opt in $*; do ++ case $opt in ++ --srcdir=*) saw_srcdir=yes ++ srcdir=`echo "$opt" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;; ++ --cache-file=*) saw_cache_file=yes ;; ++ *) ;; ++ esac ++done ++ ++echo "Configure stage for glibc 2.0 add-on" ++ ++exit 0 +diff -Naur ../glibc-2.1.3/glibc-compat/nss-nis.h glibc-2.1.3/glibc-compat/nss-nis.h +--- ../glibc-2.1.3/glibc-compat/nss-nis.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss-nis.h 2000-01-03 17:07:07.000000000 -0800 +@@ -0,0 +1,58 @@ ++/* Copyright (C) 1996 Free Software 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 _NIS_NSS_NIS_H ++#define _NIS_NSS_NIS_H 1 ++ ++#include <rpcsvc/ypclnt.h> ++ ++#include "nsswitch.h" ++ ++ ++/* Convert YP error number to NSS error number. */ ++static enum nss_status yperr2nss_tab[] = ++{ ++ [YPERR_SUCCESS] = NSS_STATUS_SUCCESS, ++ [YPERR_BADARGS] = NSS_STATUS_UNAVAIL, ++ [YPERR_RPC] = NSS_STATUS_UNAVAIL, ++ [YPERR_DOMAIN] = NSS_STATUS_UNAVAIL, ++ [YPERR_MAP] = NSS_STATUS_UNAVAIL, ++ [YPERR_KEY] = NSS_STATUS_NOTFOUND, ++ [YPERR_YPERR] = NSS_STATUS_UNAVAIL, ++ [YPERR_RESRC] = NSS_STATUS_TRYAGAIN, ++ [YPERR_NOMORE] = NSS_STATUS_NOTFOUND, ++ [YPERR_PMAP] = NSS_STATUS_UNAVAIL, ++ [YPERR_YPBIND] = NSS_STATUS_UNAVAIL, ++ [YPERR_YPSERV] = NSS_STATUS_UNAVAIL, ++ [YPERR_NODOM] = NSS_STATUS_UNAVAIL, ++ [YPERR_BADDB] = NSS_STATUS_UNAVAIL, ++ [YPERR_VERS] = NSS_STATUS_UNAVAIL, ++ [YPERR_ACCESS] = NSS_STATUS_UNAVAIL, ++ [YPERR_BUSY] = NSS_STATUS_TRYAGAIN ++}; ++#define YPERR_COUNT (sizeof (yperr2nss_tab) / sizeof (yperr2nss_tab[0])) ++ ++static inline enum nss_status ++yperr2nss (int errval) ++{ ++ if ((unsigned int) errval > YPERR_COUNT) ++ return NSS_STATUS_UNAVAIL; ++ return yperr2nss_tab[errval]; ++} ++ ++#endif /* nis/nss-nis.h */ +diff -Naur ../glibc-2.1.3/glibc-compat/nss_compat/compat-grp.c glibc-2.1.3/glibc-compat/nss_compat/compat-grp.c +--- ../glibc-2.1.3/glibc-compat/nss_compat/compat-grp.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_compat/compat-grp.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,769 @@ ++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996. ++ ++ 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. */ ++ ++#include <errno.h> ++#include <fcntl.h> ++#include <nss.h> ++#include <grp.h> ++#include <ctype.h> ++#include <bits/libc-lock.h> ++#include <string.h> ++#include <rpcsvc/yp.h> ++#include <rpcsvc/ypclnt.h> ++#include <nsswitch.h> ++ ++/* Get the declaration of the parser function. */ ++#define ENTNAME grent ++#define STRUCTURE group ++#define EXTERN_PARSER ++#include "../nss_files/files-parse.c" ++ ++/* Structure for remembering -group members ... */ ++#define BLACKLIST_INITIAL_SIZE 512 ++#define BLACKLIST_INCREMENT 256 ++struct blacklist_t ++ { ++ char *data; ++ int current; ++ int size; ++ }; ++ ++struct ent_t ++ { ++ bool_t nis; ++ bool_t nis_first; ++ char *oldkey; ++ int oldkeylen; ++ FILE *stream; ++ struct blacklist_t blacklist; ++}; ++typedef struct ent_t ent_t; ++ ++static ent_t ext_ent = {0, 0, NULL, 0, NULL, {NULL, 0, 0}}; ++ ++/* Protect global state against multiple changers. */ ++__libc_lock_define_initialized (static, lock) ++ ++/* Prototypes for local functions. */ ++static void blacklist_store_name (const char *, ent_t *); ++static int in_blacklist (const char *, int, ent_t *); ++ ++static enum nss_status ++internal_setgrent (ent_t *ent) ++{ ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ ++ ent->nis = ent->nis_first = 0; ++ ++ if (ent->oldkey != NULL) ++ { ++ free (ent->oldkey); ++ ent->oldkey = NULL; ++ ent->oldkeylen = 0; ++ } ++ ++ if (ent->blacklist.data != NULL) ++ { ++ ent->blacklist.current = 1; ++ ent->blacklist.data[0] = '|'; ++ ent->blacklist.data[1] = '\0'; ++ } ++ else ++ ent->blacklist.current = 0; ++ ++ if (ent->stream == NULL) ++ { ++ ent->stream = fopen ("/etc/group", "r"); ++ ++ if (ent->stream == NULL) ++ status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; ++ else ++ { ++ /* We have to make sure the file is `closed on exec'. */ ++ int result, flags; ++ ++ result = flags = fcntl (fileno (ent->stream), F_GETFD, 0); ++ if (result >= 0) ++ { ++ flags |= FD_CLOEXEC; ++ result = fcntl (fileno (ent->stream), F_SETFD, flags); ++ } ++ if (result < 0) ++ { ++ /* Something went wrong. Close the stream and return a ++ failure. */ ++ fclose (ent->stream); ++ ent->stream = NULL; ++ status = NSS_STATUS_UNAVAIL; ++ } ++ } ++ } ++ else ++ rewind (ent->stream); ++ ++ return status; ++} ++ ++ ++enum nss_status ++_nss_compat_setgrent (void) ++{ ++ enum nss_status result; ++ ++ __libc_lock_lock (lock); ++ ++ result = internal_setgrent (&ext_ent); ++ ++ __libc_lock_unlock (lock); ++ ++ return result; ++} ++ ++ ++static enum nss_status ++internal_endgrent (ent_t *ent) ++{ ++ if (ent->stream != NULL) ++ { ++ fclose (ent->stream); ++ ent->stream = NULL; ++ } ++ ++ ent->nis = ent->nis_first = 0; ++ ++ if (ent->oldkey != NULL) ++ { ++ free (ent->oldkey); ++ ent->oldkey = NULL; ++ ent->oldkeylen = 0; ++ } ++ ++ if (ent->blacklist.data != NULL) ++ { ++ ent->blacklist.current = 1; ++ ent->blacklist.data[0] = '|'; ++ ent->blacklist.data[1] = '\0'; ++ } ++ else ++ ent->blacklist.current = 0; ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_compat_endgrent (void) ++{ ++ enum nss_status result; ++ ++ __libc_lock_lock (lock); ++ ++ result = internal_endgrent (&ext_ent); ++ ++ __libc_lock_unlock (lock); ++ ++ return result; ++} ++ ++static enum nss_status ++getgrent_next_nis (struct group *result, ent_t *ent, char *buffer, ++ size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ char *domain; ++ char *outkey, *outval; ++ int outkeylen, outvallen, parse_res; ++ char *p; ++ ++ if (yp_get_default_domain (&domain) != YPERR_SUCCESS) ++ { ++ ent->nis = 0; ++ return NSS_STATUS_NOTFOUND; ++ } ++ ++ do ++ { ++ char *save_oldkey; ++ int save_oldlen; ++ bool_t save_nis_first; ++ ++ if (ent->nis_first) ++ { ++ if (yp_first (domain, "group.byname", &outkey, &outkeylen, ++ &outval, &outvallen) != YPERR_SUCCESS) ++ { ++ ent->nis = 0; ++ return NSS_STATUS_UNAVAIL; ++ } ++ save_oldkey = ent->oldkey; ++ save_oldlen = ent->oldkeylen; ++ save_nis_first = TRUE; ++ ent->oldkey = outkey; ++ ent->oldkeylen = outkeylen; ++ ent->nis_first = FALSE; ++ } ++ else ++ { ++ if (yp_next (domain, "group.byname", ent->oldkey, ent->oldkeylen, ++ &outkey, &outkeylen, &outval, &outvallen) ++ != YPERR_SUCCESS) ++ { ++ ent->nis = 0; ++ return NSS_STATUS_NOTFOUND; ++ } ++ ++ save_oldkey = ent->oldkey; ++ save_oldlen = ent->oldkeylen; ++ save_nis_first = FALSE; ++ ent->oldkey = outkey; ++ ent->oldkeylen = outkeylen; ++ } ++ ++ /* Copy the found data to our buffer */ ++ p = strncpy (buffer, outval, buflen); ++ ++ /* ...and free the data. */ ++ free (outval); ++ ++ while (isspace (*p)) ++ ++p; ++ ++ if ((parse_res = _nss_files_parse_grent (p, result, data, buflen)) == -1) ++ { ++ free (ent->oldkey); ++ ent->oldkey = save_oldkey; ++ ent->oldkeylen = save_oldlen; ++ ent->nis_first = save_nis_first; ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ else ++ { ++ if (!save_nis_first) ++ free (save_oldkey); ++ } ++ ++ if (parse_res && ++ in_blacklist (result->gr_name, strlen (result->gr_name), ent)) ++ parse_res = 0; /* if result->gr_name in blacklist,search next entry */ ++ } ++ while (!parse_res); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++/* This function handle the +group entrys in /etc/group */ ++static enum nss_status ++getgrnam_plusgroup (const char *name, struct group *result, char *buffer, ++ size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ int parse_res; ++ char *domain, *outval, *p; ++ int outvallen; ++ ++ if (yp_get_default_domain (&domain) != YPERR_SUCCESS) ++ return NSS_STATUS_NOTFOUND; ++ ++ if (yp_match (domain, "group.byname", name, strlen (name), ++ &outval, &outvallen) != YPERR_SUCCESS) ++ return NSS_STATUS_NOTFOUND; ++ p = strncpy (buffer, outval, ++ buflen < (size_t) outvallen ? buflen : (size_t) outvallen); ++ free (outval); ++ while (isspace (*p)) ++ p++; ++ if ((parse_res = _nss_files_parse_grent (p, result, data, buflen)) == -1) ++ { ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ if (parse_res) ++ /* We found the entry. */ ++ return NSS_STATUS_SUCCESS; ++ else ++ return NSS_STATUS_RETURN; ++} ++ ++static enum nss_status ++getgrent_next_file (struct group *result, ent_t *ent, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ while (1) ++ { ++ fpos_t pos; ++ int parse_res = 0; ++ char *p; ++ ++ do ++ { ++ fgetpos (ent->stream, &pos); ++ buffer[buflen - 1] = '\xff'; ++ p = fgets (buffer, buflen, ent->stream); ++ if (p == NULL && feof (ent->stream)) ++ return NSS_STATUS_NOTFOUND; ++ if (p == NULL || buffer[buflen - 1] != '\xff') ++ { ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ /* Terminate the line for any case. */ ++ buffer[buflen - 1] = '\0'; ++ ++ /* Skip leading blanks. */ ++ while (isspace (*p)) ++ ++p; ++ } ++ while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ ++ /* Parse the line. If it is invalid, loop to ++ get the next line of the file to parse. */ ++ !(parse_res = _nss_files_parse_grent (p, result, data, buflen))); ++ ++ if (parse_res == -1) ++ { ++ /* The parser ran out of space. */ ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ if (result->gr_name[0] != '+' && result->gr_name[0] != '-') ++ /* This is a real entry. */ ++ break; ++ ++ /* -group */ ++ if (result->gr_name[0] == '-' && result->gr_name[1] != '\0' ++ && result->gr_name[1] != '@') ++ { ++ blacklist_store_name (&result->gr_name[1], ent); ++ continue; ++ } ++ ++ /* +group */ ++ if (result->gr_name[0] == '+' && result->gr_name[1] != '\0' ++ && result->gr_name[1] != '@') ++ { ++ enum nss_status status; ++ ++ /* Store the group in the blacklist for the "+" at the end of ++ /etc/group */ ++ blacklist_store_name (&result->gr_name[1], ent); ++ status = getgrnam_plusgroup (&result->gr_name[1], result, buffer, ++ buflen); ++ if (status == NSS_STATUS_SUCCESS) /* We found the entry. */ ++ break; ++ else ++ if (status == NSS_STATUS_RETURN /* We couldn't parse the entry */ ++ || status == NSS_STATUS_NOTFOUND) /* No group in NIS */ ++ continue; ++ else ++ { ++ if (status == NSS_STATUS_TRYAGAIN) ++ /* The parser ran out of space. */ ++ fsetpos (ent->stream, &pos); ++ return status; ++ } ++ } ++ ++ /* +:... */ ++ if (result->gr_name[0] == '+' && result->gr_name[1] == '\0') ++ { ++ ent->nis = TRUE; ++ ent->nis_first = TRUE; ++ ++ return getgrent_next_nis (result, ent, buffer, buflen); ++ } ++ } ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++ ++static enum nss_status ++internal_getgrent_r (struct group *gr, ent_t *ent, char *buffer, ++ size_t buflen) ++{ ++ if (ent->nis) ++ { ++ return getgrent_next_nis (gr, ent, buffer, buflen); ++ } ++ else ++ return getgrent_next_file (gr, ent, buffer, buflen); ++} ++ ++enum nss_status ++_nss_compat_getgrent_r (struct group *grp, char *buffer, size_t buflen) ++{ ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ ++ __libc_lock_lock (lock); ++ ++ /* Be prepared that the setgrent function was not called before. */ ++ if (ext_ent.stream == NULL) ++ status = internal_setgrent (&ext_ent); ++ ++ if (status == NSS_STATUS_SUCCESS) ++ status = internal_getgrent_r (grp, &ext_ent, buffer, buflen); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++/* Searches in /etc/group and the NIS/NIS+ map for a special group */ ++static enum nss_status ++internal_getgrnam_r (const char *name, struct group *result, ent_t *ent, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ while (1) ++ { ++ fpos_t pos; ++ int parse_res = 0; ++ char *p; ++ ++ do ++ { ++ fgetpos (ent->stream, &pos); ++ buffer[buflen - 1] = '\xff'; ++ p = fgets (buffer, buflen, ent->stream); ++ if (p == NULL && feof (ent->stream)) ++ return NSS_STATUS_NOTFOUND; ++ if (p == NULL || buffer[buflen - 1] != '\xff') ++ { ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ /* Terminate the line for any case. */ ++ buffer[buflen - 1] = '\0'; ++ ++ /* Skip leading blanks. */ ++ while (isspace (*p)) ++ ++p; ++ } ++ while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ ++ /* Parse the line. If it is invalid, loop to ++ get the next line of the file to parse. */ ++ !(parse_res = _nss_files_parse_grent (p, result, data, buflen))); ++ ++ if (parse_res == -1) ++ { ++ /* The parser ran out of space. */ ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ /* This is a real entry. */ ++ if (result->gr_name[0] != '+' && result->gr_name[0] != '-') ++ { ++ if (strcmp (result->gr_name, name) == 0) ++ return NSS_STATUS_SUCCESS; ++ else ++ continue; ++ } ++ ++ /* -group */ ++ if (result->gr_name[0] == '-' && result->gr_name[1] != '\0') ++ { ++ if (strcmp (&result->gr_name[1], name) == 0) ++ return NSS_STATUS_NOTFOUND; ++ else ++ continue; ++ } ++ ++ /* +group */ ++ if (result->gr_name[0] == '+' && result->gr_name[1] != '\0') ++ { ++ if (strcmp (name, &result->gr_name[1]) == 0) ++ { ++ enum nss_status status; ++ ++ status = getgrnam_plusgroup (name, result, buffer, buflen); ++ if (status == NSS_STATUS_RETURN) ++ /* We couldn't parse the entry */ ++ continue; ++ else ++ return status; ++ } ++ } ++ /* +:... */ ++ if (result->gr_name[0] == '+' && result->gr_name[1] == '\0') ++ { ++ enum nss_status status; ++ ++ status = getgrnam_plusgroup (name, result, buffer, buflen); ++ if (status == NSS_STATUS_RETURN) ++ /* We couldn't parse the entry */ ++ continue; ++ else ++ return status; ++ } ++ } ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_compat_getgrnam_r (const char *name, struct group *grp, ++ char *buffer, size_t buflen) ++{ ++ ent_t ent = {0, 0, NULL, 0, NULL, {NULL, 0, 0}}; ++ enum nss_status status; ++ ++ if (name[0] == '-' || name[0] == '+') ++ return NSS_STATUS_NOTFOUND; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_setgrent (&ent); ++ ++ __libc_lock_unlock (lock); ++ ++ if (status != NSS_STATUS_SUCCESS) ++ return status; ++ ++ status = internal_getgrnam_r (name, grp, &ent, buffer, buflen); ++ ++ internal_endgrent (&ent); ++ ++ return status; ++} ++ ++/* This function handle the + entry in /etc/group */ ++static enum nss_status ++getgrgid_plusgroup (gid_t gid, struct group *result, char *buffer, ++ size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ int parse_res; ++ char buf[1024]; ++ char *domain, *outval, *p; ++ int outvallen; ++ ++ if (yp_get_default_domain (&domain) != YPERR_SUCCESS) ++ return NSS_STATUS_TRYAGAIN; ++ ++ snprintf (buf, sizeof (buf), "%d", gid); ++ ++ if (yp_match (domain, "group.bygid", buf, strlen (buf), ++ &outval, &outvallen) != YPERR_SUCCESS) ++ return NSS_STATUS_TRYAGAIN; ++ p = strncpy (buffer, outval, ++ buflen < (size_t) outvallen ? buflen : (size_t) outvallen); ++ free (outval); ++ while (isspace (*p)) ++ p++; ++ if ((parse_res = _nss_files_parse_grent (p, result, data, buflen)) == -1) ++ { ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ if (parse_res) ++ /* We found the entry. */ ++ return NSS_STATUS_SUCCESS; ++ else ++ return NSS_STATUS_RETURN; ++} ++ ++/* Searches in /etc/group and the NIS/NIS+ map for a special group id */ ++static enum nss_status ++internal_getgrgid_r (gid_t gid, struct group *result, ent_t *ent, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ while (1) ++ { ++ fpos_t pos; ++ int parse_res = 0; ++ char *p; ++ ++ do ++ { ++ fgetpos (ent->stream, &pos); ++ buffer[buflen - 1] = '\xff'; ++ p = fgets (buffer, buflen, ent->stream); ++ if (p == NULL && feof (ent->stream)) ++ return NSS_STATUS_NOTFOUND; ++ if (p == NULL || buffer[buflen - 1] != '\xff') ++ { ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ /* Terminate the line for any case. */ ++ buffer[buflen - 1] = '\0'; ++ ++ /* Skip leading blanks. */ ++ while (isspace (*p)) ++ ++p; ++ } ++ while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ ++ /* Parse the line. If it is invalid, loop to ++ get the next line of the file to parse. */ ++ !(parse_res = _nss_files_parse_grent (p, result, data, buflen))); ++ ++ if (parse_res == -1) ++ { ++ /* The parser ran out of space. */ ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ /* This is a real entry. */ ++ if (result->gr_name[0] != '+' && result->gr_name[0] != '-') ++ { ++ if (result->gr_gid == gid) ++ return NSS_STATUS_SUCCESS; ++ else ++ continue; ++ } ++ ++ /* -group */ ++ if (result->gr_name[0] == '-' && result->gr_name[1] != '\0') ++ { ++ blacklist_store_name (&result->gr_name[1], ent); ++ continue; ++ } ++ ++ /* +group */ ++ if (result->gr_name[0] == '+' && result->gr_name[1] != '\0') ++ { ++ enum nss_status status; ++ ++ /* Store the group in the blacklist for the "+" at the end of ++ /etc/group */ ++ blacklist_store_name (&result->gr_name[1], ent); ++ status = getgrnam_plusgroup (&result->gr_name[1], result, buffer, ++ buflen); ++ if (status == NSS_STATUS_SUCCESS && result->gr_gid == gid) ++ break; ++ else ++ continue; ++ } ++ /* +:... */ ++ if (result->gr_name[0] == '+' && result->gr_name[1] == '\0') ++ { ++ enum nss_status status; ++ ++ status = getgrgid_plusgroup (gid, result, buffer, buflen); ++ if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */ ++ return NSS_STATUS_NOTFOUND; ++ else ++ return status; ++ } ++ } ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_compat_getgrgid_r (gid_t gid, struct group *grp, ++ char *buffer, size_t buflen) ++{ ++ ent_t ent = {0, 0, NULL, 0, NULL, {NULL, 0, 0}}; ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_setgrent (&ent); ++ ++ __libc_lock_unlock (lock); ++ ++ if (status != NSS_STATUS_SUCCESS) ++ return status; ++ ++ status = internal_getgrgid_r (gid, grp, &ent, buffer, buflen); ++ ++ internal_endgrent (&ent); ++ ++ return status; ++} ++ ++ ++/* Support routines for remembering -@netgroup and -user entries. ++ The names are stored in a single string with `|' as separator. */ ++static void ++blacklist_store_name (const char *name, ent_t *ent) ++{ ++ int namelen = strlen (name); ++ char *tmp; ++ ++ /* first call, setup cache */ ++ if (ent->blacklist.size == 0) ++ { ++ ent->blacklist.size = MAX (BLACKLIST_INITIAL_SIZE, 2 * namelen); ++ ent->blacklist.data = malloc (ent->blacklist.size); ++ if (ent->blacklist.data == NULL) ++ return; ++ ent->blacklist.data[0] = '|'; ++ ent->blacklist.data[1] = '\0'; ++ ent->blacklist.current = 1; ++ } ++ else ++ { ++ if (in_blacklist (name, namelen, ent)) ++ return; /* no duplicates */ ++ ++ if (ent->blacklist.current + namelen + 1 >= ent->blacklist.size) ++ { ++ ent->blacklist.size += MAX (BLACKLIST_INCREMENT, 2 * namelen); ++ tmp = realloc (ent->blacklist.data, ent->blacklist.size); ++ if (tmp == NULL) ++ { ++ free (ent->blacklist.data); ++ ent->blacklist.size = 0; ++ return; ++ } ++ ent->blacklist.data = tmp; ++ } ++ } ++ ++ tmp = stpcpy (ent->blacklist.data + ent->blacklist.current, name); ++ *tmp++ = '|'; ++ *tmp = '\0'; ++ ent->blacklist.current += namelen + 1; ++ ++ return; ++} ++ ++/* returns TRUE if ent->blacklist contains name, else FALSE */ ++static bool_t ++in_blacklist (const char *name, int namelen, ent_t *ent) ++{ ++ char buf[namelen + 3]; ++ char *cp; ++ ++ if (ent->blacklist.data == NULL) ++ return FALSE; ++ ++ buf[0] = '|'; ++ cp = stpcpy (&buf[1], name); ++ *cp++= '|'; ++ *cp = '\0'; ++ return strstr (ent->blacklist.data, buf) != NULL; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_compat/compat-pwd.c glibc-2.1.3/glibc-compat/nss_compat/compat-pwd.c +--- ../glibc-2.1.3/glibc-compat/nss_compat/compat-pwd.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_compat/compat-pwd.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,1199 @@ ++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996. ++ ++ 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. */ ++ ++#include <nss.h> ++#include <pwd.h> ++#include <errno.h> ++#include <ctype.h> ++#include <fcntl.h> ++#include <netdb.h> ++#include <string.h> ++#include <bits/libc-lock.h> ++#include <rpcsvc/yp.h> ++#include <rpcsvc/ypclnt.h> ++#include <nsswitch.h> ++ ++#include "netgroup.h" ++ ++/* Get the declaration of the parser function. */ ++#define ENTNAME pwent ++#define STRUCTURE passwd ++#define EXTERN_PARSER ++#include "../nss_files/files-parse.c" ++ ++/* Structure for remembering -@netgroup and -user members ... */ ++#define BLACKLIST_INITIAL_SIZE 512 ++#define BLACKLIST_INCREMENT 256 ++struct blacklist_t ++ { ++ char *data; ++ int current; ++ int size; ++ }; ++ ++struct ent_t ++ { ++ bool_t netgroup; ++ bool_t nis; ++ bool_t first; ++ char *oldkey; ++ int oldkeylen; ++ FILE *stream; ++ struct blacklist_t blacklist; ++ struct passwd pwd; ++ struct __netgrent netgrdata; ++ }; ++typedef struct ent_t ent_t; ++ ++static ent_t ext_ent = {0, 0, 0, NULL, 0, NULL, {NULL, 0, 0}, ++ {NULL, NULL, 0, 0, NULL, NULL, NULL}}; ++ ++/* Protect global state against multiple changers. */ ++__libc_lock_define_initialized (static, lock) ++ ++/* Prototypes for local functions. */ ++static void blacklist_store_name (const char *, ent_t *); ++static int in_blacklist (const char *, int, ent_t *); ++ ++static void ++give_pwd_free (struct passwd *pwd) ++{ ++ if (pwd->pw_name != NULL) ++ free (pwd->pw_name); ++ if (pwd->pw_passwd != NULL) ++ free (pwd->pw_passwd); ++ if (pwd->pw_gecos != NULL) ++ free (pwd->pw_gecos); ++ if (pwd->pw_dir != NULL) ++ free (pwd->pw_dir); ++ if (pwd->pw_shell != NULL) ++ free (pwd->pw_shell); ++ ++ memset (pwd, '\0', sizeof (struct passwd)); ++} ++ ++static size_t ++pwd_need_buflen (struct passwd *pwd) ++{ ++ size_t len = 0; ++ ++ if (pwd->pw_passwd != NULL) ++ len += strlen (pwd->pw_passwd) + 1; ++ ++ if (pwd->pw_gecos != NULL) ++ len += strlen (pwd->pw_gecos) + 1; ++ ++ if (pwd->pw_dir != NULL) ++ len += strlen (pwd->pw_dir) + 1; ++ ++ if (pwd->pw_shell != NULL) ++ len += strlen (pwd->pw_shell) + 1; ++ ++ return len; ++} ++ ++static void ++copy_pwd_changes (struct passwd *dest, struct passwd *src, ++ char *buffer, size_t buflen) ++{ ++ if (src->pw_passwd != NULL && strlen (src->pw_passwd)) ++ { ++ if (buffer == NULL) ++ dest->pw_passwd = strdup (src->pw_passwd); ++ else if (dest->pw_passwd && ++ strlen (dest->pw_passwd) >= strlen (src->pw_passwd)) ++ strcpy (dest->pw_passwd, src->pw_passwd); ++ else ++ { ++ dest->pw_passwd = buffer; ++ strcpy (dest->pw_passwd, src->pw_passwd); ++ buffer += strlen (dest->pw_passwd) + 1; ++ buflen = buflen - (strlen (dest->pw_passwd) + 1); ++ } ++ } ++ ++ if (src->pw_gecos != NULL && strlen (src->pw_gecos)) ++ { ++ if (buffer == NULL) ++ dest->pw_gecos = strdup (src->pw_gecos); ++ else if (dest->pw_gecos && ++ strlen (dest->pw_gecos) >= strlen (src->pw_gecos)) ++ strcpy (dest->pw_gecos, src->pw_gecos); ++ else ++ { ++ dest->pw_gecos = buffer; ++ strcpy (dest->pw_gecos, src->pw_gecos); ++ buffer += strlen (dest->pw_gecos) + 1; ++ buflen = buflen - (strlen (dest->pw_gecos) + 1); ++ } ++ } ++ if (src->pw_dir != NULL && strlen (src->pw_dir)) ++ { ++ if (buffer == NULL) ++ dest->pw_dir = strdup (src->pw_dir); ++ else if (dest->pw_dir && ++ strlen (dest->pw_dir) >= strlen (src->pw_dir)) ++ strcpy (dest->pw_dir, src->pw_dir); ++ else ++ { ++ dest->pw_dir = buffer; ++ strcpy (dest->pw_dir, src->pw_dir); ++ buffer += strlen (dest->pw_dir) + 1; ++ buflen = buflen - (strlen (dest->pw_dir) + 1); ++ } ++ } ++ ++ if (src->pw_shell != NULL && strlen (src->pw_shell)) ++ { ++ if (buffer == NULL) ++ dest->pw_shell = strdup (src->pw_shell); ++ else if (dest->pw_shell && ++ strlen (dest->pw_shell) >= strlen (src->pw_shell)) ++ strcpy (dest->pw_shell, src->pw_shell); ++ else ++ { ++ dest->pw_shell = buffer; ++ strcpy (dest->pw_shell, src->pw_shell); ++ buffer += strlen (dest->pw_shell) + 1; ++ buflen = buflen - (strlen (dest->pw_shell) + 1); ++ } ++ } ++} ++ ++static enum nss_status ++internal_setpwent (ent_t *ent) ++{ ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ ++ ent->nis = ent->first = ent->netgroup = 0; ++ ++ /* If something was left over free it. */ ++ if (ent->netgroup) ++ __internal_endnetgrent (&ent->netgrdata); ++ ++ if (ent->oldkey != NULL) ++ { ++ free (ent->oldkey); ++ ent->oldkey = NULL; ++ ent->oldkeylen = 0; ++ } ++ ++ if (ent->blacklist.data != NULL) ++ { ++ ent->blacklist.current = 1; ++ ent->blacklist.data[0] = '|'; ++ ent->blacklist.data[1] = '\0'; ++ } ++ else ++ ent->blacklist.current = 0; ++ ++ if (ent->stream == NULL) ++ { ++ ent->stream = fopen ("/etc/passwd", "r"); ++ ++ if (ent->stream == NULL) ++ status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; ++ else ++ { ++ /* We have to make sure the file is `closed on exec'. */ ++ int result, flags; ++ ++ result = flags = fcntl (fileno (ent->stream), F_GETFD, 0); ++ if (result >= 0) ++ { ++ flags |= FD_CLOEXEC; ++ result = fcntl (fileno (ent->stream), F_SETFD, flags); ++ } ++ if (result < 0) ++ { ++ /* Something went wrong. Close the stream and return a ++ failure. */ ++ fclose (ent->stream); ++ ent->stream = NULL; ++ status = NSS_STATUS_UNAVAIL; ++ } ++ } ++ } ++ else ++ rewind (ent->stream); ++ ++ give_pwd_free (&ent->pwd); ++ ++ return status; ++} ++ ++ ++enum nss_status ++_nss_compat_setpwent (void) ++{ ++ enum nss_status result; ++ ++ __libc_lock_lock (lock); ++ ++ result = internal_setpwent (&ext_ent); ++ ++ __libc_lock_unlock (lock); ++ ++ return result; ++} ++ ++ ++static enum nss_status ++internal_endpwent (ent_t *ent) ++{ ++ if (ent->stream != NULL) ++ { ++ fclose (ent->stream); ++ ent->stream = NULL; ++ } ++ ++ if (ent->netgroup) ++ __internal_endnetgrent (&ent->netgrdata); ++ ++ ent->nis = ent->first = ent->netgroup = 0; ++ ++ if (ent->oldkey != NULL) ++ { ++ free (ent->oldkey); ++ ent->oldkey = NULL; ++ ent->oldkeylen = 0; ++ } ++ ++ if (ent->blacklist.data != NULL) ++ { ++ ent->blacklist.current = 1; ++ ent->blacklist.data[0] = '|'; ++ ent->blacklist.data[1] = '\0'; ++ } ++ else ++ ent->blacklist.current = 0; ++ ++ give_pwd_free (&ent->pwd); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_compat_endpwent (void) ++{ ++ enum nss_status result; ++ ++ __libc_lock_lock (lock); ++ ++ result = internal_endpwent (&ext_ent); ++ ++ __libc_lock_unlock (lock); ++ ++ return result; ++} ++ ++static enum nss_status ++getpwent_next_nis_netgr (const char *name, struct passwd *result, ent_t *ent, ++ char *group, char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ char *ypdomain, *host, *user, *domain, *outval, *p, *p2; ++ int status, outvallen; ++ size_t p2len; ++ ++ if (yp_get_default_domain (&ypdomain) != YPERR_SUCCESS) ++ { ++ ent->netgroup = 0; ++ ent->first = 0; ++ give_pwd_free (&ent->pwd); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ if (ent->first == TRUE) ++ { ++ memset (&ent->netgrdata, 0, sizeof (struct __netgrent)); ++ __internal_setnetgrent (group, &ent->netgrdata); ++ ent->first = FALSE; ++ } ++ ++ while (1) ++ { ++ char *saved_cursor; ++ int parse_res; ++ ++ saved_cursor = ent->netgrdata.cursor; ++ status = __internal_getnetgrent_r (&host, &user, &domain, ++ &ent->netgrdata, buffer, buflen, ++ &errno); ++ if (status != 1) ++ { ++ __internal_endnetgrent (&ent->netgrdata); ++ ent->netgroup = 0; ++ give_pwd_free (&ent->pwd); ++ return NSS_STATUS_RETURN; ++ } ++ ++ if (user == NULL || user[0] == '-') ++ continue; ++ ++ if (domain != NULL && strcmp (ypdomain, domain) != 0) ++ continue; ++ ++ /* If name != NULL, we are called from getpwnam */ ++ if (name != NULL) ++ if (strcmp (user, name) != 0) ++ continue; ++ ++ if (yp_match (ypdomain, "passwd.byname", user, ++ strlen (user), &outval, &outvallen) ++ != YPERR_SUCCESS) ++ continue; ++ ++ p2len = pwd_need_buflen (&ent->pwd); ++ if (p2len > buflen) ++ { ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ p2 = buffer + (buflen - p2len); ++ buflen -= p2len; ++ p = strncpy (buffer, outval, buflen); ++ while (isspace (*p)) ++ p++; ++ free (outval); ++ if ((parse_res = _nss_files_parse_pwent (p, result, data, buflen)) == -1) ++ { ++ ent->netgrdata.cursor = saved_cursor; ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ if (parse_res) ++ { ++ /* Store the User in the blacklist for the "+" at the end of ++ /etc/passwd */ ++ blacklist_store_name (result->pw_name, ent); ++ copy_pwd_changes (result, &ent->pwd, p2, p2len); ++ break; ++ } ++ } ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++static enum nss_status ++getpwent_next_nis (struct passwd *result, ent_t *ent, char *buffer, ++ size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ char *domain, *outkey, *outval, *p, *p2; ++ int outkeylen, outvallen, parse_res; ++ size_t p2len; ++ ++ if (yp_get_default_domain (&domain) != YPERR_SUCCESS) ++ { ++ ent->nis = 0; ++ give_pwd_free (&ent->pwd); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ p2len = pwd_need_buflen (&ent->pwd); ++ if (p2len > buflen) ++ { ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ p2 = buffer + (buflen - p2len); ++ buflen -= p2len; ++ do ++ { ++ bool_t saved_first; ++ char *saved_oldkey; ++ int saved_oldlen; ++ ++ if (ent->first) ++ { ++ if (yp_first (domain, "passwd.byname", &outkey, &outkeylen, ++ &outval, &outvallen) != YPERR_SUCCESS) ++ { ++ ent->nis = 0; ++ give_pwd_free (&ent->pwd); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ saved_first = TRUE; ++ saved_oldkey = ent->oldkey; ++ saved_oldlen = ent->oldkeylen; ++ ent->oldkey = outkey; ++ ent->oldkeylen = outkeylen; ++ ent->first = FALSE; ++ } ++ else ++ { ++ if (yp_next (domain, "passwd.byname", ent->oldkey, ent->oldkeylen, ++ &outkey, &outkeylen, &outval, &outvallen) ++ != YPERR_SUCCESS) ++ { ++ ent->nis = 0; ++ give_pwd_free (&ent->pwd); ++ return NSS_STATUS_NOTFOUND; ++ } ++ ++ saved_first = FALSE; ++ saved_oldkey = ent->oldkey; ++ saved_oldlen = ent->oldkeylen; ++ ent->oldkey = outkey; ++ ent->oldkeylen = outkeylen; ++ } ++ ++ /* Copy the found data to our buffer */ ++ p = strncpy (buffer, outval, buflen); ++ ++ /* ...and free the data. */ ++ free (outval); ++ ++ while (isspace (*p)) ++ ++p; ++ if ((parse_res = _nss_files_parse_pwent (p, result, data, buflen)) == -1) ++ { ++ free (ent->oldkey); ++ ent->oldkey = saved_oldkey; ++ ent->oldkeylen = saved_oldlen; ++ ent->first = saved_first; ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ else ++ { ++ if (!saved_first) ++ free (saved_oldkey); ++ } ++ if (parse_res && ++ in_blacklist (result->pw_name, strlen (result->pw_name), ent)) ++ parse_res = 0; ++ } ++ while (!parse_res); ++ ++ copy_pwd_changes (result, &ent->pwd, p2, p2len); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++/* This function handle the +user entrys in /etc/passwd */ ++static enum nss_status ++getpwnam_plususer (const char *name, struct passwd *result, char *buffer, ++ size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ struct passwd pwd; ++ int parse_res; ++ char *p; ++ size_t plen; ++ char *domain, *outval, *ptr; ++ int outvallen; ++ ++ memset (&pwd, '\0', sizeof (struct passwd)); ++ ++ copy_pwd_changes (&pwd, result, NULL, 0); ++ ++ plen = pwd_need_buflen (&pwd); ++ if (plen > buflen) ++ { ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ p = buffer + (buflen - plen); ++ buflen -= plen; ++ ++ ++ if (yp_get_default_domain (&domain) != YPERR_SUCCESS) ++ return NSS_STATUS_NOTFOUND; ++ ++ if (yp_match (domain, "passwd.byname", name, strlen (name), ++ &outval, &outvallen) != YPERR_SUCCESS) ++ return NSS_STATUS_NOTFOUND; ++ ptr = strncpy (buffer, outval, buflen < (size_t) outvallen ? ++ buflen : (size_t) outvallen); ++ buffer[buflen < (size_t) outvallen ? buflen : (size_t) outvallen] = '\0'; ++ free (outval); ++ while (isspace (*ptr)) ++ ptr++; ++ if ((parse_res = _nss_files_parse_pwent (ptr, result, data, buflen)) ++ == -1) ++ { ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ if (parse_res > 0) ++ { ++ copy_pwd_changes (result, &pwd, p, plen); ++ give_pwd_free (&pwd); ++ /* We found the entry. */ ++ return NSS_STATUS_SUCCESS; ++ } ++ else ++ { ++ /* Give buffer the old len back */ ++ buflen += plen; ++ give_pwd_free (&pwd); ++ } ++ return NSS_STATUS_RETURN; ++} ++ ++/* get the next user from NIS+ (+ entry) */ ++static enum nss_status ++getpwent_next_file (struct passwd *result, ent_t *ent, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ while (1) ++ { ++ fpos_t pos; ++ char *p; ++ int parse_res; ++ ++ do ++ { ++ fgetpos (ent->stream, &pos); ++ buffer[buflen - 1] = '\xff'; ++ p = fgets (buffer, buflen, ent->stream); ++ if (p == NULL && feof (ent->stream)) ++ return NSS_STATUS_NOTFOUND; ++ if (p == NULL || buffer[buflen - 1] != '\xff') ++ { ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ /* Terminate the line for any case. */ ++ buffer[buflen - 1] = '\0'; ++ ++ /* Skip leading blanks. */ ++ while (isspace (*p)) ++ ++p; ++ } ++ while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ ++ /* Parse the line. If it is invalid, loop to ++ get the next line of the file to parse. */ ++ !(parse_res = _nss_files_parse_pwent (p, result, data, buflen))); ++ ++ if (parse_res == -1) ++ { ++ /* The parser ran out of space. */ ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ if (result->pw_name[0] != '+' && result->pw_name[0] != '-') ++ /* This is a real entry. */ ++ break; ++ ++ /* -@netgroup */ ++ if (result->pw_name[0] == '-' && result->pw_name[1] == '@' ++ && result->pw_name[2] != '\0') ++ { ++ char buf2[1024]; ++ char *user, *host, *domain; ++ struct __netgrent netgrdata; ++ ++ bzero (&netgrdata, sizeof (struct __netgrent)); ++ __internal_setnetgrent (&result->pw_name[2], &netgrdata); ++ while (__internal_getnetgrent_r (&host, &user, &domain, ++ &netgrdata, buf2, sizeof (buf2), ++ &errno)) ++ { ++ if (user != NULL && user[0] != '-') ++ blacklist_store_name (user, ent); ++ } ++ __internal_endnetgrent (&netgrdata); ++ continue; ++ } ++ ++ /* +@netgroup */ ++ if (result->pw_name[0] == '+' && result->pw_name[1] == '@' ++ && result->pw_name[2] != '\0') ++ { ++ int status; ++ ++ ent->netgroup = TRUE; ++ ent->first = TRUE; ++ copy_pwd_changes (&ent->pwd, result, NULL, 0); ++ ++ status = getpwent_next_nis_netgr (NULL, result, ent, ++ &result->pw_name[2], ++ buffer, buflen); ++ if (status == NSS_STATUS_RETURN) ++ continue; ++ else ++ return status; ++ } ++ ++ /* -user */ ++ if (result->pw_name[0] == '-' && result->pw_name[1] != '\0' ++ && result->pw_name[1] != '@') ++ { ++ blacklist_store_name (&result->pw_name[1], ent); ++ continue; ++ } ++ ++ /* +user */ ++ if (result->pw_name[0] == '+' && result->pw_name[1] != '\0' ++ && result->pw_name[1] != '@') ++ { ++ enum nss_status status; ++ ++ /* Store the User in the blacklist for the "+" at the end of ++ /etc/passwd */ ++ blacklist_store_name (&result->pw_name[1], ent); ++ status = getpwnam_plususer (&result->pw_name[1], result, buffer, ++ buflen); ++ if (status == NSS_STATUS_SUCCESS) /* We found the entry. */ ++ break; ++ else ++ if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */ ++ continue; ++ else ++ return status; ++ } ++ ++ /* +:... */ ++ if (result->pw_name[0] == '+' && result->pw_name[1] == '\0') ++ { ++ ent->nis = TRUE; ++ ent->first = TRUE; ++ copy_pwd_changes (&ent->pwd, result, NULL, 0); ++ ++ return getpwent_next_nis (result, ent, buffer, buflen); ++ } ++ } ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++ ++/* get the next user from NIS (+ entry) */ ++static enum nss_status ++internal_getpwent_r (struct passwd *pw, ent_t *ent, char *buffer, ++ size_t buflen) ++{ ++ if (ent->netgroup) ++ { ++ int status; ++ ++ /* We are searching members in a netgroup */ ++ /* Since this is not the first call, we don't need the group name */ ++ status = getpwent_next_nis_netgr (NULL, pw, ent, NULL, buffer, buflen); ++ if (status == NSS_STATUS_RETURN) ++ return getpwent_next_file (pw, ent, buffer, buflen); ++ else ++ return status; ++ } ++ else ++ if (ent->nis) ++ { ++ return getpwent_next_nis (pw, ent, buffer, buflen); ++ } ++ else ++ return getpwent_next_file (pw, ent, buffer, buflen); ++} ++ ++enum nss_status ++_nss_compat_getpwent_r (struct passwd *pwd, char *buffer, size_t buflen) ++{ ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ ++ __libc_lock_lock (lock); ++ ++ /* Be prepared that the setpwent function was not called before. */ ++ if (ext_ent.stream == NULL) ++ status = internal_setpwent (&ext_ent); ++ ++ if (status == NSS_STATUS_SUCCESS) ++ status = internal_getpwent_r (pwd, &ext_ent, buffer, buflen); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++/* Searches in /etc/passwd and the NIS/NIS+ map for a special user */ ++static enum nss_status ++internal_getpwnam_r (const char *name, struct passwd *result, ent_t *ent, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ ++ while (1) ++ { ++ fpos_t pos; ++ char *p; ++ int parse_res; ++ ++ do ++ { ++ fgetpos (ent->stream, &pos); ++ buffer[buflen - 1] = '\xff'; ++ p = fgets (buffer, buflen, ent->stream); ++ if (p == NULL && feof (ent->stream)) ++ return NSS_STATUS_NOTFOUND; ++ if (p == NULL || buffer[buflen - 1] != '\xff') ++ { ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ /* Terminate the line for any case. */ ++ buffer[buflen - 1] = '\0'; ++ ++ /* Skip leading blanks. */ ++ while (isspace (*p)) ++ ++p; ++ } ++ while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ ++ /* Parse the line. If it is invalid, loop to ++ get the next line of the file to parse. */ ++ !(parse_res = _nss_files_parse_pwent (p, result, data, buflen))); ++ ++ if (parse_res == -1) ++ { ++ /* The parser ran out of space. */ ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ /* This is a real entry. */ ++ if (result->pw_name[0] != '+' && result->pw_name[0] != '-') ++ { ++ if (strcmp (result->pw_name, name) == 0) ++ return NSS_STATUS_SUCCESS; ++ else ++ continue; ++ } ++ ++ /* -@netgroup */ ++ if (result->pw_name[0] == '-' && result->pw_name[1] == '@' ++ && result->pw_name[2] != '\0') ++ { ++ char buf2[1024]; ++ char *user, *host, *domain; ++ struct __netgrent netgrdata; ++ ++ bzero (&netgrdata, sizeof (struct __netgrent)); ++ __internal_setnetgrent (&result->pw_name[2], &netgrdata); ++ while (__internal_getnetgrent_r (&host, &user, &domain, ++ &netgrdata, buf2, sizeof (buf2), ++ &errno)) ++ { ++ if (user != NULL && user[0] != '-') ++ if (strcmp (user, name) == 0) ++ return NSS_STATUS_NOTFOUND; ++ } ++ __internal_endnetgrent (&netgrdata); ++ continue; ++ } ++ ++ /* +@netgroup */ ++ if (result->pw_name[0] == '+' && result->pw_name[1] == '@' ++ && result->pw_name[2] != '\0') ++ { ++ char buf[strlen (result->pw_name)]; ++ int status; ++ ++ strcpy (buf, &result->pw_name[2]); ++ ent->netgroup = TRUE; ++ ent->first = TRUE; ++ copy_pwd_changes (&ent->pwd, result, NULL, 0); ++ ++ do ++ { ++ status = getpwent_next_nis_netgr (name, result, ent, buf, ++ buffer, buflen); ++ if (status == NSS_STATUS_RETURN) ++ continue; ++ ++ if (status == NSS_STATUS_SUCCESS && ++ strcmp (result->pw_name, name) == 0) ++ return NSS_STATUS_SUCCESS; ++ } while (status == NSS_STATUS_SUCCESS); ++ continue; ++ } ++ ++ /* -user */ ++ if (result->pw_name[0] == '-' && result->pw_name[1] != '\0' ++ && result->pw_name[1] != '@') ++ { ++ if (strcmp (&result->pw_name[1], name) == 0) ++ return NSS_STATUS_NOTFOUND; ++ else ++ continue; ++ } ++ ++ /* +user */ ++ if (result->pw_name[0] == '+' && result->pw_name[1] != '\0' ++ && result->pw_name[1] != '@') ++ { ++ if (strcmp (name, &result->pw_name[1]) == 0) ++ { ++ enum nss_status status; ++ ++ status = getpwnam_plususer (name, result, buffer, buflen); ++ if (status == NSS_STATUS_RETURN) ++ /* We couldn't parse the entry */ ++ return NSS_STATUS_NOTFOUND; ++ else ++ return status; ++ } ++ } ++ ++ /* +:... */ ++ if (result->pw_name[0] == '+' && result->pw_name[1] == '\0') ++ { ++ enum nss_status status; ++ ++ status = getpwnam_plususer (name, result, buffer, buflen); ++ if (status == NSS_STATUS_SUCCESS) /* We found the entry. */ ++ break; ++ else ++ if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */ ++ return NSS_STATUS_NOTFOUND; ++ else ++ return status; ++ } ++ } ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_compat_getpwnam_r (const char *name, struct passwd *pwd, ++ char *buffer, size_t buflen) ++{ ++ ent_t ent = {0, 0, 0, NULL, 0, NULL, {NULL, 0, 0}, ++ {NULL, NULL, 0, 0, NULL, NULL, NULL}}; ++ enum nss_status status; ++ ++ if (name[0] == '-' || name[0] == '+') ++ return NSS_STATUS_NOTFOUND; ++ ++ status = internal_setpwent (&ent); ++ if (status != NSS_STATUS_SUCCESS) ++ return status; ++ ++ status = internal_getpwnam_r (name, pwd, &ent, buffer, buflen); ++ ++ internal_endpwent (&ent); ++ ++ return status; ++} ++ ++/* This function handle the + entry in /etc/passwd for getpwuid */ ++static enum nss_status ++getpwuid_plususer (uid_t uid, struct passwd *result, char *buffer, ++ size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ struct passwd pwd; ++ int parse_res; ++ char *p; ++ size_t plen; ++ char buf[1024]; ++ char *domain, *outval, *ptr; ++ int outvallen; ++ ++ memset (&pwd, '\0', sizeof (struct passwd)); ++ ++ copy_pwd_changes (&pwd, result, NULL, 0); ++ ++ plen = pwd_need_buflen (&pwd); ++ if (plen > buflen) ++ { ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ p = buffer + (buflen - plen); ++ buflen -= plen; ++ ++ ++ if (yp_get_default_domain (&domain) != YPERR_SUCCESS) ++ return NSS_STATUS_TRYAGAIN; ++ ++ sprintf (buf, "%d", uid); ++ if (yp_match (domain, "passwd.byuid", buf, strlen (buf), ++ &outval, &outvallen) ++ != YPERR_SUCCESS) ++ return NSS_STATUS_TRYAGAIN; ++ ptr = strncpy (buffer, outval, buflen < (size_t) outvallen ? ++ buflen : (size_t) outvallen); ++ buffer[buflen < (size_t) outvallen ? buflen : (size_t) outvallen] = '\0'; ++ free (outval); ++ while (isspace (*ptr)) ++ ptr++; ++ if ((parse_res = _nss_files_parse_pwent (ptr, result, data, buflen)) ++ == -1) ++ { ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ if (parse_res > 0) ++ { ++ copy_pwd_changes (result, &pwd, p, plen); ++ give_pwd_free (&pwd); ++ /* We found the entry. */ ++ return NSS_STATUS_SUCCESS; ++ } ++ else ++ { ++ /* Give buffer the old len back */ ++ buflen += plen; ++ give_pwd_free (&pwd); ++ } ++ return NSS_STATUS_RETURN; ++} ++ ++/* Searches in /etc/passwd and the NIS/NIS+ map for a special user id */ ++static enum nss_status ++internal_getpwuid_r (uid_t uid, struct passwd *result, ent_t *ent, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ ++ while (1) ++ { ++ fpos_t pos; ++ char *p; ++ int parse_res; ++ ++ do ++ { ++ fgetpos (ent->stream, &pos); ++ buffer[buflen - 1] = '\xff'; ++ p = fgets (buffer, buflen, ent->stream); ++ if (p == NULL && feof (ent->stream)) ++ return NSS_STATUS_NOTFOUND; ++ if (p == NULL || buffer[buflen - 1] != '\xff') ++ { ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ /* Terminate the line for any case. */ ++ buffer[buflen - 1] = '\0'; ++ ++ /* Skip leading blanks. */ ++ while (isspace (*p)) ++ ++p; ++ } ++ while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ ++ /* Parse the line. If it is invalid, loop to ++ get the next line of the file to parse. */ ++ !(parse_res = _nss_files_parse_pwent (p, result, data, buflen))); ++ ++ if (parse_res == -1) ++ { ++ /* The parser ran out of space. */ ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ /* This is a real entry. */ ++ if (result->pw_name[0] != '+' && result->pw_name[0] != '-') ++ { ++ if (result->pw_uid == uid) ++ return NSS_STATUS_SUCCESS; ++ else ++ continue; ++ } ++ ++ /* -@netgroup */ ++ if (result->pw_name[0] == '-' && result->pw_name[1] == '@' ++ && result->pw_name[2] != '\0') ++ { ++ char buf2[1024]; ++ char *user, *host, *domain; ++ struct __netgrent netgrdata; ++ ++ bzero (&netgrdata, sizeof (struct __netgrent)); ++ __internal_setnetgrent (&result->pw_name[2], &netgrdata); ++ while (__internal_getnetgrent_r (&host, &user, &domain, ++ &netgrdata, buf2, sizeof (buf2), ++ &errno)) ++ { ++ if (user != NULL && user[0] != '-') ++ blacklist_store_name (user, ent); ++ } ++ __internal_endnetgrent (&netgrdata); ++ continue; ++ } ++ ++ /* +@netgroup */ ++ if (result->pw_name[0] == '+' && result->pw_name[1] == '@' ++ && result->pw_name[2] != '\0') ++ { ++ char buf[strlen (result->pw_name)]; ++ int status; ++ ++ strcpy (buf, &result->pw_name[2]); ++ ent->netgroup = TRUE; ++ ent->first = TRUE; ++ copy_pwd_changes (&ent->pwd, result, NULL, 0); ++ ++ do ++ { ++ status = getpwent_next_nis_netgr (NULL, result, ent, buf, ++ buffer, buflen); ++ if (status == NSS_STATUS_RETURN) ++ continue; ++ ++ if (status == NSS_STATUS_SUCCESS && uid == result->pw_uid) ++ return NSS_STATUS_SUCCESS; ++ } while (status == NSS_STATUS_SUCCESS); ++ continue; ++ } ++ ++ /* -user */ ++ if (result->pw_name[0] == '-' && result->pw_name[1] != '\0' ++ && result->pw_name[1] != '@') ++ { ++ blacklist_store_name (&result->pw_name[1], ent); ++ continue; ++ } ++ ++ /* +user */ ++ if (result->pw_name[0] == '+' && result->pw_name[1] != '\0' ++ && result->pw_name[1] != '@') ++ { ++ enum nss_status status; ++ ++ /* Store the User in the blacklist for the "+" at the end of ++ /etc/passwd */ ++ blacklist_store_name (&result->pw_name[1], ent); ++ status = getpwnam_plususer (&result->pw_name[1], result, buffer, ++ buflen); ++ if (status == NSS_STATUS_SUCCESS && result->pw_uid == uid) ++ break; ++ else ++ continue; ++ } ++ ++ /* +:... */ ++ if (result->pw_name[0] == '+' && result->pw_name[1] == '\0') ++ { ++ enum nss_status status; ++ ++ status = getpwuid_plususer (uid, result, buffer, buflen); ++ if (status == NSS_STATUS_SUCCESS) /* We found the entry. */ ++ break; ++ else ++ if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */ ++ return NSS_STATUS_NOTFOUND; ++ else ++ { ++ if (status == NSS_STATUS_TRYAGAIN) ++ /* The parser ran out of space */ ++ fsetpos (ent->stream, &pos); ++ return status; ++ } ++ } ++ } ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_compat_getpwuid_r (uid_t uid, struct passwd *pwd, ++ char *buffer, size_t buflen) ++{ ++ ent_t ent = {0, 0, 0, NULL, 0, NULL, {NULL, 0, 0}, ++ {NULL, NULL, 0, 0, NULL, NULL, NULL}}; ++ enum nss_status status; ++ ++ status = internal_setpwent (&ent); ++ if (status != NSS_STATUS_SUCCESS) ++ return status; ++ ++ status = internal_getpwuid_r (uid, pwd, &ent, buffer, buflen); ++ ++ internal_endpwent (&ent); ++ ++ return status; ++} ++ ++ ++/* Support routines for remembering -@netgroup and -user entries. ++ The names are stored in a single string with `|' as separator. */ ++static void ++blacklist_store_name (const char *name, ent_t *ent) ++{ ++ int namelen = strlen (name); ++ char *tmp; ++ ++ /* first call, setup cache */ ++ if (ent->blacklist.size == 0) ++ { ++ ent->blacklist.size = MAX (BLACKLIST_INITIAL_SIZE, 2 * namelen); ++ ent->blacklist.data = malloc (ent->blacklist.size); ++ if (ent->blacklist.data == NULL) ++ return; ++ ent->blacklist.data[0] = '|'; ++ ent->blacklist.data[1] = '\0'; ++ ent->blacklist.current = 1; ++ } ++ else ++ { ++ if (in_blacklist (name, namelen, ent)) ++ return; /* no duplicates */ ++ ++ if (ent->blacklist.current + namelen + 1 >= ent->blacklist.size) ++ { ++ ent->blacklist.size += MAX (BLACKLIST_INCREMENT, 2 * namelen); ++ tmp = realloc (ent->blacklist.data, ent->blacklist.size); ++ if (tmp == NULL) ++ { ++ free (ent->blacklist.data); ++ ent->blacklist.size = 0; ++ return; ++ } ++ ent->blacklist.data = tmp; ++ } ++ } ++ ++ tmp = stpcpy (ent->blacklist.data + ent->blacklist.current, name); ++ *tmp++ = '|'; ++ *tmp = '\0'; ++ ent->blacklist.current += namelen + 1; ++ ++ return; ++} ++ ++/* returns TRUE if ent->blacklist contains name, else FALSE */ ++static bool_t ++in_blacklist (const char *name, int namelen, ent_t *ent) ++{ ++ char buf[namelen + 3]; ++ char *cp; ++ ++ if (ent->blacklist.data == NULL) ++ return FALSE; ++ ++ buf[0] = '|'; ++ cp = stpcpy (&buf[1], name); ++ *cp++= '|'; ++ *cp = '\0'; ++ return strstr (ent->blacklist.data, buf) != NULL; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_compat/compat-spwd.c glibc-2.1.3/glibc-compat/nss_compat/compat-spwd.c +--- ../glibc-2.1.3/glibc-compat/nss_compat/compat-spwd.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_compat/compat-spwd.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,915 @@ ++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996. ++ ++ 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. */ ++ ++#include <nss.h> ++#include <errno.h> ++#include <ctype.h> ++#include <fcntl.h> ++#include <netdb.h> ++#include <shadow.h> ++#include <string.h> ++#include <bits/libc-lock.h> ++#include <rpcsvc/yp.h> ++#include <rpcsvc/ypclnt.h> ++#include <nsswitch.h> ++ ++#include "netgroup.h" ++ ++/* Get the declaration of the parser function. */ ++#define ENTNAME spent ++#define STRUCTURE spwd ++#define EXTERN_PARSER ++#include "../nss_files/files-parse.c" ++ ++/* Structure for remembering -@netgroup and -user members ... */ ++#define BLACKLIST_INITIAL_SIZE 512 ++#define BLACKLIST_INCREMENT 256 ++struct blacklist_t ++ { ++ char *data; ++ int current; ++ int size; ++ }; ++ ++struct ent_t ++ { ++ bool_t netgroup; ++ bool_t nis; ++ bool_t first; ++ char *oldkey; ++ int oldkeylen; ++ FILE *stream; ++ struct blacklist_t blacklist; ++ struct spwd pwd; ++ struct __netgrent netgrdata; ++ }; ++typedef struct ent_t ent_t; ++ ++static ent_t ext_ent = {0, 0, 0, NULL, 0, NULL, {NULL, 0, 0}, ++ {NULL, NULL, 0, 0, 0, 0, 0, 0, 0}}; ++ ++/* Protect global state against multiple changers. */ ++__libc_lock_define_initialized (static, lock) ++ ++/* Prototypes for local functions. */ ++static void blacklist_store_name (const char *, ent_t *); ++static int in_blacklist (const char *, int, ent_t *); ++ ++static void ++give_spwd_free (struct spwd *pwd) ++{ ++ if (pwd->sp_namp != NULL) ++ free (pwd->sp_namp); ++ if (pwd->sp_pwdp != NULL) ++ free (pwd->sp_pwdp); ++ ++ memset (pwd, '\0', sizeof (struct spwd)); ++} ++ ++static int ++spwd_need_buflen (struct spwd *pwd) ++{ ++ int len = 0; ++ ++ if (pwd->sp_pwdp != NULL) ++ len += strlen (pwd->sp_pwdp) + 1; ++ ++ return len; ++} ++ ++static void ++copy_spwd_changes (struct spwd *dest, struct spwd *src, ++ char *buffer, size_t buflen) ++{ ++ if (src->sp_pwdp != NULL && strlen (src->sp_pwdp)) ++ { ++ if (buffer == NULL) ++ dest->sp_pwdp = strdup (src->sp_pwdp); ++ else if (dest->sp_pwdp && ++ strlen (dest->sp_pwdp) >= strlen (src->sp_pwdp)) ++ strcpy (dest->sp_pwdp, src->sp_pwdp); ++ else ++ { ++ dest->sp_pwdp = buffer; ++ strcpy (dest->sp_pwdp, src->sp_pwdp); ++ buffer += strlen (dest->sp_pwdp) + 1; ++ buflen = buflen - (strlen (dest->sp_pwdp) + 1); ++ } ++ } ++ if (src->sp_lstchg != 0) ++ dest->sp_lstchg = src->sp_lstchg; ++ if (src->sp_min != 0) ++ dest->sp_min = src->sp_min; ++ if (src->sp_max != 0) ++ dest->sp_max = src->sp_max; ++ if (src->sp_warn != 0) ++ dest->sp_warn = src->sp_warn; ++ if (src->sp_inact != 0) ++ dest->sp_inact = src->sp_inact; ++ if (src->sp_expire != 0) ++ dest->sp_expire = src->sp_expire; ++ if (src->sp_flag != 0) ++ dest->sp_flag = src->sp_flag; ++} ++ ++static enum nss_status ++internal_setspent (ent_t *ent) ++{ ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ ++ ent->nis = ent->first = ent->netgroup = 0; ++ ++ /* If something was left over free it. */ ++ if (ent->netgroup) ++ __internal_endnetgrent (&ent->netgrdata); ++ ++ if (ent->oldkey != NULL) ++ { ++ free (ent->oldkey); ++ ent->oldkey = NULL; ++ ent->oldkeylen = 0; ++ } ++ ++ if (ent->blacklist.data != NULL) ++ { ++ ent->blacklist.current = 1; ++ ent->blacklist.data[0] = '|'; ++ ent->blacklist.data[1] = '\0'; ++ } ++ else ++ ent->blacklist.current = 0; ++ ++ if (ent->stream == NULL) ++ { ++ ent->stream = fopen ("/etc/shadow", "r"); ++ ++ if (ent->stream == NULL) ++ status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; ++ else ++ { ++ /* We have to make sure the file is `closed on exec'. */ ++ int result, flags; ++ ++ result = flags = fcntl (fileno (ent->stream), F_GETFD, 0); ++ if (result >= 0) ++ { ++ flags |= FD_CLOEXEC; ++ result = fcntl (fileno (ent->stream), F_SETFD, flags); ++ } ++ if (result < 0) ++ { ++ /* Something went wrong. Close the stream and return a ++ failure. */ ++ fclose (ent->stream); ++ ent->stream = NULL; ++ status = NSS_STATUS_UNAVAIL; ++ } ++ } ++ } ++ else ++ rewind (ent->stream); ++ ++ give_spwd_free (&ent->pwd); ++ ++ return status; ++} ++ ++ ++enum nss_status ++_nss_compat_setspent (void) ++{ ++ enum nss_status result; ++ ++ __libc_lock_lock (lock); ++ ++ result = internal_setspent (&ext_ent); ++ ++ __libc_lock_unlock (lock); ++ ++ return result; ++} ++ ++ ++static enum nss_status ++internal_endspent (ent_t *ent) ++{ ++ if (ent->stream != NULL) ++ { ++ fclose (ent->stream); ++ ent->stream = NULL; ++ } ++ ++ if (ent->netgroup) ++ __internal_endnetgrent (&ent->netgrdata); ++ ++ ent->nis = ent->first = ent->netgroup = 0; ++ ++ if (ent->oldkey != NULL) ++ { ++ free (ent->oldkey); ++ ent->oldkey = NULL; ++ ent->oldkeylen = 0; ++ } ++ ++ if (ent->blacklist.data != NULL) ++ { ++ ent->blacklist.current = 1; ++ ent->blacklist.data[0] = '|'; ++ ent->blacklist.data[1] = '\0'; ++ } ++ else ++ ent->blacklist.current = 0; ++ ++ give_spwd_free (&ent->pwd); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_compat_endspent (void) ++{ ++ enum nss_status result; ++ ++ __libc_lock_lock (lock); ++ ++ result = internal_endspent (&ext_ent); ++ ++ __libc_lock_unlock (lock); ++ ++ return result; ++} ++ ++ ++static enum nss_status ++getspent_next_nis_netgr (const char *name, struct spwd *result, ent_t *ent, ++ char *group, char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ char *ypdomain, *host, *user, *domain, *outval, *p, *p2; ++ int status, outvallen; ++ size_t p2len; ++ ++ if (yp_get_default_domain (&ypdomain) != YPERR_SUCCESS) ++ { ++ ent->netgroup = 0; ++ ent->first = 0; ++ give_spwd_free (&ent->pwd); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ if (ent->first == TRUE) ++ { ++ bzero (&ent->netgrdata, sizeof (struct __netgrent)); ++ __internal_setnetgrent (group, &ent->netgrdata); ++ ent->first = FALSE; ++ } ++ ++ while (1) ++ { ++ char *saved_cursor; ++ int parse_res; ++ ++ saved_cursor = ent->netgrdata.cursor; ++ status = __internal_getnetgrent_r (&host, &user, &domain, ++ &ent->netgrdata, buffer, buflen, ++ &errno); ++ if (status != 1) ++ { ++ __internal_endnetgrent (&ent->netgrdata); ++ ent->netgroup = 0; ++ give_spwd_free (&ent->pwd); ++ return NSS_STATUS_RETURN; ++ } ++ ++ if (user == NULL || user[0] == '-') ++ continue; ++ ++ if (domain != NULL && strcmp (ypdomain, domain) != 0) ++ continue; ++ ++ /* If name != NULL, we are called from getpwnam */ ++ if (name != NULL) ++ if (strcmp (user, name) != 0) ++ continue; ++ ++ if (yp_match (ypdomain, "shadow.byname", user, ++ strlen (user), &outval, &outvallen) ++ != YPERR_SUCCESS) ++ continue; ++ ++ p2len = spwd_need_buflen (&ent->pwd); ++ if (p2len > buflen) ++ { ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ p2 = buffer + (buflen - p2len); ++ buflen -= p2len; ++ p = strncpy (buffer, outval, buflen); ++ while (isspace (*p)) ++ p++; ++ free (outval); ++ if ((parse_res = _nss_files_parse_spent (p, result, data, buflen)) == -1) ++ { ++ ent->netgrdata.cursor = saved_cursor; ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ if (parse_res) ++ { ++ /* Store the User in the blacklist for the "+" at the end of ++ /etc/passwd */ ++ blacklist_store_name (result->sp_namp, ent); ++ copy_spwd_changes (result, &ent->pwd, p2, p2len); ++ break; ++ } ++ } ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++static enum nss_status ++getspent_next_nis (struct spwd *result, ent_t *ent, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ char *domain, *outkey, *outval, *p, *p2; ++ int outkeylen, outvallen, parse_res; ++ size_t p2len; ++ ++ if (yp_get_default_domain (&domain) != YPERR_SUCCESS) ++ { ++ ent->nis = 0; ++ give_spwd_free (&ent->pwd); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ p2len = spwd_need_buflen (&ent->pwd); ++ if (p2len > buflen) ++ { ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ p2 = buffer + (buflen - p2len); ++ buflen -= p2len; ++ do ++ { ++ bool_t saved_first; ++ char *saved_oldkey; ++ int saved_oldlen; ++ ++ if (ent->first) ++ { ++ if (yp_first (domain, "shadow.byname", &outkey, &outkeylen, ++ &outval, &outvallen) != YPERR_SUCCESS) ++ { ++ ent->nis = 0; ++ give_spwd_free (&ent->pwd); ++ return NSS_STATUS_UNAVAIL; ++ } ++ saved_first = TRUE; ++ saved_oldkey = ent->oldkey; ++ saved_oldlen = ent->oldkeylen; ++ ent->oldkey = outkey; ++ ent->oldkeylen = outkeylen; ++ ent->first = FALSE; ++ } ++ else ++ { ++ if (yp_next (domain, "shadow.byname", ent->oldkey, ent->oldkeylen, ++ &outkey, &outkeylen, &outval, &outvallen) ++ != YPERR_SUCCESS) ++ { ++ ent->nis = 0; ++ give_spwd_free (&ent->pwd); ++ return NSS_STATUS_NOTFOUND; ++ } ++ ++ saved_first = FALSE; ++ saved_oldkey = ent->oldkey; ++ saved_oldlen = ent->oldkeylen; ++ ent->oldkey = outkey; ++ ent->oldkeylen = outkeylen; ++ } ++ ++ /* Copy the found data to our buffer */ ++ p = strncpy (buffer, outval, buflen); ++ ++ /* ...and free the data. */ ++ free (outval); ++ ++ while (isspace (*p)) ++ ++p; ++ if ((parse_res = _nss_files_parse_spent (p, result, data, buflen)) == -1) ++ { ++ free (ent->oldkey); ++ ent->oldkey = saved_oldkey; ++ ent->oldkeylen = saved_oldlen; ++ ent->first = saved_first; ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ else ++ { ++ if (!saved_first) ++ free (saved_oldkey); ++ } ++ if (parse_res && ++ in_blacklist (result->sp_namp, strlen (result->sp_namp), ent)) ++ parse_res = 0; ++ } ++ while (!parse_res); ++ ++ copy_spwd_changes (result, &ent->pwd, p2, p2len); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++/* This function handle the +user entrys in /etc/shadow */ ++static enum nss_status ++getspnam_plususer (const char *name, struct spwd *result, char *buffer, ++ size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ struct spwd pwd; ++ int parse_res; ++ char *p; ++ size_t plen; ++ char *domain, *outval, *ptr; ++ int outvallen; ++ ++ ++ memset (&pwd, '\0', sizeof (struct spwd)); ++ ++ copy_spwd_changes (&pwd, result, NULL, 0); ++ ++ plen = spwd_need_buflen (&pwd); ++ if (plen > buflen) ++ { ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ p = buffer + (buflen - plen); ++ buflen -= plen; ++ ++ if (yp_get_default_domain (&domain) != YPERR_SUCCESS) ++ return NSS_STATUS_NOTFOUND; ++ ++ if (yp_match (domain, "shadow.byname", name, strlen (name), ++ &outval, &outvallen) != YPERR_SUCCESS) ++ return NSS_STATUS_NOTFOUND; ++ ptr = strncpy (buffer, outval, buflen < (size_t) outvallen ? ++ buflen : (size_t) outvallen); ++ buffer[buflen < (size_t) outvallen ? buflen : (size_t) outvallen] = '\0'; ++ free (outval); ++ while (isspace (*ptr)) ++ ptr++; ++ if ((parse_res = _nss_files_parse_spent (ptr, result, data, buflen)) == -1) ++ { ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ if (parse_res) ++ { ++ copy_spwd_changes (result, &pwd, p, plen); ++ give_spwd_free (&pwd); ++ /* We found the entry. */ ++ return NSS_STATUS_SUCCESS; ++ } ++ else ++ { ++ /* Give buffer the old len back */ ++ buflen += plen; ++ give_spwd_free (&pwd); ++ } ++ return NSS_STATUS_RETURN; ++} ++ ++static enum nss_status ++getspent_next_file (struct spwd *result, ent_t *ent, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ while (1) ++ { ++ fpos_t pos; ++ int parse_res = 0; ++ char *p; ++ ++ do ++ { ++ fgetpos (ent->stream, &pos); ++ buffer[buflen - 1] = '\xff'; ++ p = fgets (buffer, buflen, ent->stream); ++ if (p == NULL && feof (ent->stream)) ++ return NSS_STATUS_NOTFOUND; ++ if (p == NULL || buffer[buflen - 1] != '\xff') ++ { ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ /* Terminate the line for any case. */ ++ buffer[buflen - 1] = '\0'; ++ ++ /* Skip leading blanks. */ ++ while (isspace (*p)) ++ ++p; ++ } ++ while (*p == '\0' || *p == '#' /* Ignore empty and comment lines. */ ++ /* Parse the line. If it is invalid, loop to ++ get the next line of the file to parse. */ ++ || !(parse_res = _nss_files_parse_spent (p, result, data, ++ buflen))); ++ ++ if (parse_res == -1) ++ { ++ /* The parser ran out of space. */ ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ if (result->sp_namp[0] != '+' && result->sp_namp[0] != '-') ++ /* This is a real entry. */ ++ break; ++ ++ /* -@netgroup */ ++ if (result->sp_namp[0] == '-' && result->sp_namp[1] == '@' ++ && result->sp_namp[2] != '\0') ++ { ++ char buf2[1024]; ++ char *user, *host, *domain; ++ struct __netgrent netgrdata; ++ ++ bzero (&netgrdata, sizeof (struct __netgrent)); ++ __internal_setnetgrent (&result->sp_namp[2], &netgrdata); ++ while (__internal_getnetgrent_r (&host, &user, &domain, ++ &netgrdata, buf2, sizeof (buf2), ++ &errno)) ++ { ++ if (user != NULL && user[0] != '-') ++ blacklist_store_name (user, ent); ++ } ++ __internal_endnetgrent (&netgrdata); ++ continue; ++ } ++ ++ /* +@netgroup */ ++ if (result->sp_namp[0] == '+' && result->sp_namp[1] == '@' ++ && result->sp_namp[2] != '\0') ++ { ++ int status; ++ ++ ent->netgroup = TRUE; ++ ent->first = TRUE; ++ copy_spwd_changes (&ent->pwd, result, NULL, 0); ++ ++ status = getspent_next_nis_netgr (NULL, result, ent, ++ &result->sp_namp[2], ++ buffer, buflen); ++ if (status == NSS_STATUS_RETURN) ++ continue; ++ else ++ return status; ++ } ++ ++ /* -user */ ++ if (result->sp_namp[0] == '-' && result->sp_namp[1] != '\0' ++ && result->sp_namp[1] != '@') ++ { ++ blacklist_store_name (&result->sp_namp[1], ent); ++ continue; ++ } ++ ++ /* +user */ ++ if (result->sp_namp[0] == '+' && result->sp_namp[1] != '\0' ++ && result->sp_namp[1] != '@') ++ { ++ enum nss_status status; ++ ++ /* Store the User in the blacklist for the "+" at the end of ++ /etc/passwd */ ++ blacklist_store_name (&result->sp_namp[1], ent); ++ status = getspnam_plususer (&result->sp_namp[1], result, buffer, ++ buflen); ++ if (status == NSS_STATUS_SUCCESS) /* We found the entry. */ ++ break; ++ else ++ if (status == NSS_STATUS_RETURN /* We couldn't parse the entry */ ++ || status == NSS_STATUS_NOTFOUND) /* entry doesn't exist */ ++ continue; ++ else ++ { ++ if (status == NSS_STATUS_TRYAGAIN) ++ fsetpos (ent->stream, &pos); ++ return status; ++ } ++ } ++ ++ /* +:... */ ++ if (result->sp_namp[0] == '+' && result->sp_namp[1] == '\0') ++ { ++ ent->nis = TRUE; ++ ent->first = TRUE; ++ copy_spwd_changes (&ent->pwd, result, NULL, 0); ++ ++ return getspent_next_nis (result, ent, buffer, buflen); ++ } ++ } ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++ ++static enum nss_status ++internal_getspent_r (struct spwd *pw, ent_t *ent, ++ char *buffer, size_t buflen) ++{ ++ if (ent->netgroup) ++ { ++ int status; ++ ++ /* We are searching members in a netgroup */ ++ /* Since this is not the first call, we don't need the group name */ ++ status = getspent_next_nis_netgr (NULL, pw, ent, NULL, buffer, buflen); ++ if (status == NSS_STATUS_RETURN) ++ return getspent_next_file (pw, ent, buffer, buflen); ++ else ++ return status; ++ } ++ else ++ if (ent->nis) ++ { ++ return getspent_next_nis (pw, ent, buffer, buflen); ++ } ++ else ++ return getspent_next_file (pw, ent, buffer, buflen); ++} ++ ++enum nss_status ++_nss_compat_getspent_r (struct spwd *pwd, char *buffer, size_t buflen) ++{ ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ ++ __libc_lock_lock (lock); ++ ++ if (ext_ent.stream == NULL) ++ status = internal_setspent (&ext_ent); ++ ++ if (status == NSS_STATUS_SUCCESS) ++ status = internal_getspent_r (pwd, &ext_ent, buffer, buflen); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++/* Searches in /etc/passwd and the NIS/NIS+ map for a special user */ ++static enum nss_status ++internal_getspnam_r (const char *name, struct spwd *result, ent_t *ent, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ ++ while (1) ++ { ++ fpos_t pos; ++ char *p; ++ int parse_res; ++ ++ do ++ { ++ fgetpos (ent->stream, &pos); ++ buffer[buflen - 1] = '\xff'; ++ p = fgets (buffer, buflen, ent->stream); ++ if (p == NULL && feof (ent->stream)) ++ return NSS_STATUS_NOTFOUND; ++ if (p == NULL || buffer[buflen - 1] != '\xff') ++ { ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ /* Terminate the line for any case. */ ++ buffer[buflen - 1] = '\0'; ++ ++ /* Skip leading blanks. */ ++ while (isspace (*p)) ++ ++p; ++ } ++ while (*p == '\0' || *p == '#' || /* Ignore empty and comment lines. */ ++ /* Parse the line. If it is invalid, loop to ++ get the next line of the file to parse. */ ++ !(parse_res = _nss_files_parse_spent (p, result, data, buflen))); ++ ++ if (parse_res == -1) ++ { ++ /* The parser ran out of space. */ ++ fsetpos (ent->stream, &pos); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ /* This is a real entry. */ ++ if (result->sp_namp[0] != '+' && result->sp_namp[0] != '-') ++ { ++ if (strcmp (result->sp_namp, name) == 0) ++ return NSS_STATUS_SUCCESS; ++ else ++ continue; ++ } ++ ++ /* -@netgroup */ ++ if (result->sp_namp[0] == '-' && result->sp_namp[1] == '@' ++ && result->sp_namp[2] != '\0') ++ { ++ char buf2[1024]; ++ char *user, *host, *domain; ++ struct __netgrent netgrdata; ++ ++ bzero (&netgrdata, sizeof (struct __netgrent)); ++ __internal_setnetgrent (&result->sp_namp[2], &netgrdata); ++ while (__internal_getnetgrent_r (&host, &user, &domain, ++ &netgrdata, buf2, sizeof (buf2), ++ &errno)) ++ { ++ if (user != NULL && user[0] != '-') ++ if (strcmp (user, name) == 0) ++ return NSS_STATUS_NOTFOUND; ++ } ++ __internal_endnetgrent (&netgrdata); ++ continue; ++ } ++ ++ /* +@netgroup */ ++ if (result->sp_namp[0] == '+' && result->sp_namp[1] == '@' ++ && result->sp_namp[2] != '\0') ++ { ++ char buf[strlen (result->sp_namp)]; ++ int status; ++ ++ strcpy (buf, &result->sp_namp[2]); ++ ent->netgroup = TRUE; ++ ent->first = TRUE; ++ copy_spwd_changes (&ent->pwd, result, NULL, 0); ++ ++ do ++ { ++ status = getspent_next_nis_netgr (name, result, ent, buf, ++ buffer, buflen); ++ if (status == NSS_STATUS_RETURN) ++ continue; ++ ++ if (status == NSS_STATUS_SUCCESS && ++ strcmp (result->sp_namp, name) == 0) ++ return NSS_STATUS_SUCCESS; ++ } while (status == NSS_STATUS_SUCCESS); ++ continue; ++ } ++ ++ /* -user */ ++ if (result->sp_namp[0] == '-' && result->sp_namp[1] != '\0' ++ && result->sp_namp[1] != '@') ++ { ++ if (strcmp (&result->sp_namp[1], name) == 0) ++ return NSS_STATUS_NOTFOUND; ++ else ++ continue; ++ } ++ ++ /* +user */ ++ if (result->sp_namp[0] == '+' && result->sp_namp[1] != '\0' ++ && result->sp_namp[1] != '@') ++ { ++ if (strcmp (name, &result->sp_namp[1]) == 0) ++ { ++ enum nss_status status; ++ ++ status = getspnam_plususer (name, result, buffer, buflen); ++ if (status == NSS_STATUS_RETURN) ++ /* We couldn't parse the entry */ ++ return NSS_STATUS_NOTFOUND; ++ else ++ return status; ++ } ++ } ++ ++ /* +:... */ ++ if (result->sp_namp[0] == '+' && result->sp_namp[1] == '\0') ++ { ++ enum nss_status status; ++ ++ status = getspnam_plususer (name, result, buffer, buflen); ++ if (status == NSS_STATUS_RETURN) /* We couldn't parse the entry */ ++ return NSS_STATUS_NOTFOUND; ++ else ++ return status; ++ } ++ } ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_compat_getspnam_r (const char *name, struct spwd *pwd, ++ char *buffer, size_t buflen) ++{ ++ ent_t ent = {0, 0, 0, NULL, 0, NULL, {NULL, 0, 0}, ++ {NULL, NULL, 0, 0, 0, 0, 0, 0, 0}}; ++ enum nss_status status; ++ ++ if (name[0] == '-' || name[0] == '+') ++ return NSS_STATUS_NOTFOUND; ++ ++ status = internal_setspent (&ent); ++ if (status != NSS_STATUS_SUCCESS) ++ return status; ++ ++ status = internal_getspnam_r (name, pwd, &ent, buffer, buflen); ++ ++ internal_endspent (&ent); ++ ++ return status; ++} ++ ++/* Support routines for remembering -@netgroup and -user entries. ++ The names are stored in a single string with `|' as separator. */ ++static void ++blacklist_store_name (const char *name, ent_t *ent) ++{ ++ int namelen = strlen (name); ++ char *tmp; ++ ++ /* first call, setup cache */ ++ if (ent->blacklist.size == 0) ++ { ++ ent->blacklist.size = MAX (BLACKLIST_INITIAL_SIZE, 2 * namelen); ++ ent->blacklist.data = malloc (ent->blacklist.size); ++ if (ent->blacklist.data == NULL) ++ return; ++ ent->blacklist.data[0] = '|'; ++ ent->blacklist.data[1] = '\0'; ++ ent->blacklist.current = 1; ++ } ++ else ++ { ++ if (in_blacklist (name, namelen, ent)) ++ return; /* no duplicates */ ++ ++ if (ent->blacklist.current + namelen + 1 >= ent->blacklist.size) ++ { ++ ent->blacklist.size += MAX (BLACKLIST_INCREMENT, 2 * namelen); ++ tmp = realloc (ent->blacklist.data, ent->blacklist.size); ++ if (tmp == NULL) ++ { ++ free (ent->blacklist.data); ++ ent->blacklist.size = 0; ++ return; ++ } ++ ent->blacklist.data = tmp; ++ } ++ } ++ ++ tmp = stpcpy (ent->blacklist.data + ent->blacklist.current, name); ++ *tmp++ = '|'; ++ *tmp = '\0'; ++ ent->blacklist.current += namelen + 1; ++ ++ return; ++} ++ ++/* Returns TRUE if ent->blacklist contains name, else FALSE. */ ++static bool_t ++in_blacklist (const char *name, int namelen, ent_t *ent) ++{ ++ char buf[namelen + 3]; ++ char *cp; ++ ++ if (ent->blacklist.data == NULL) ++ return FALSE; ++ ++ buf[0] = '|'; ++ cp = stpcpy (&buf[1], name); ++ *cp++= '|'; ++ *cp = '\0'; ++ return strstr (ent->blacklist.data, buf) != NULL; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_db/db-XXX.c glibc-2.1.3/glibc-compat/nss_db/db-XXX.c +--- ../glibc-2.1.3/glibc-compat/nss_db/db-XXX.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_db/db-XXX.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,288 @@ ++/* Common code for DB-based databases in nss_db module. ++ Copyright (C) 1996, 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 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. */ ++ ++#include <db_185.h> ++#include <fcntl.h> ++#include <bits/libc-lock.h> ++#include "nsswitch.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 <paths.h> ++#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 DB *db; ++static int keep_db; ++static unsigned int entidx; /* Index for `getENTNAME'. */ ++ ++/* Open database file if not already opened. */ ++static enum nss_status ++internal_setent (int stayopen) ++{ ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ ++ if (db == NULL) ++ { ++ db = dbopen (DBFILE, O_RDONLY, 0, DB_BTREE, NULL); ++ ++ if (db == NULL) ++ status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; ++ else ++ { ++ /* We have to make sure the file is `closed on exec'. */ ++ int result, flags; ++ ++ result = flags = fcntl ((*db->fd) (db), F_GETFD, 0); ++ if (result >= 0) ++ { ++ flags |= FD_CLOEXEC; ++ result = fcntl ((*db->fd) (db), F_SETFD, flags); ++ } ++ if (result < 0) ++ { ++ /* Something went wrong. Close the stream and return a ++ failure. */ ++ (*db->close) (db); ++ db = NULL; ++ status = NSS_STATUS_UNAVAIL; ++ } ++ } ++ } ++ ++ /* Remember STAYOPEN flag. */ ++ if (db != NULL) ++ keep_db |= stayopen; ++ ++ return status; ++} ++ ++ ++/* Thread-safe, exported version of that. */ ++enum nss_status ++CONCAT(_nss_db_set,ENTNAME) (int stayopen) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_setent (stayopen); ++ ++ /* Reset the sequential index. */ ++ entidx = 0; ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++ ++/* Close the database file. */ ++static void ++internal_endent (void) ++{ ++ if (db != NULL) ++ { ++ (*db->close) (db); ++ db = NULL; ++ } ++} ++ ++ ++/* Thread-safe, exported version of that. */ ++enum nss_status ++CONCAT(_nss_db_end,ENTNAME) (void) ++{ ++ __libc_lock_lock (lock); ++ ++ internal_endent (); ++ ++ /* 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 (const DBT *key, struct STRUCTURE *result, ++ void *buffer, int buflen H_ERRNO_PROTO) ++{ ++ char *p; ++ enum nss_status status; ++ int err; ++ DBT value; ++ ++ /* Open the database. */ ++ status = internal_setent (keep_db); ++ if (status != NSS_STATUS_SUCCESS) ++ { ++ H_ERRNO_SET (NETDB_INTERNAL); ++ return status; ++ } ++ ++ /* Succeed iff it matches a value that parses correctly. */ ++ err = (*db->get) (db, key, &value, 0); ++ if (err < 0) ++ { ++ H_ERRNO_SET (NETDB_INTERNAL); ++ status = NSS_STATUS_UNAVAIL; ++ } ++ else if (err != 0) ++ { ++ H_ERRNO_SET (HOST_NOT_FOUND); ++ status = NSS_STATUS_NOTFOUND; ++ } ++ 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); ++ ++ 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 (); ++ ++ 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 H_ERRNO_PROTO) \ ++{ \ ++ DBT key; \ ++ enum nss_status status; \ ++ const size_t size = (keysize) + 1; \ ++ key.data = __alloca (size); \ ++ key.size = KEYPRINTF keypattern; \ ++ __libc_lock_lock (lock); \ ++ status = lookup (&key, result, buffer, buflen H_ERRNO_ARG); \ ++ __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 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++); ++ status = lookup (&key, result, buffer, buflen H_ERRNO_ARG); ++ if (status == NSS_STATUS_TRYAGAIN ++#ifdef NEED_H_ERRNO ++ && *herrnop == NETDB_INTERNAL ++#endif ++ && errno == 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 -Naur ../glibc-2.1.3/glibc-compat/nss_db/db-alias.c glibc-2.1.3/glibc-compat/nss_db/db-alias.c +--- ../glibc-2.1.3/glibc-compat/nss_db/db-alias.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_db/db-alias.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,255 @@ ++/* Mail alias file parser in nss_db module. ++ Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. ++ ++ 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. */ ++ ++#include <aliases.h> ++#include <alloca.h> ++#include <ctype.h> ++#include <db_185.h> ++#include <errno.h> ++#include <fcntl.h> ++#include <bits/libc-lock.h> ++#include <paths.h> ++#include <string.h> ++ ++#include "nsswitch.h" ++ ++/* Locks the static variables in this file. */ ++__libc_lock_define_initialized (static, lock) ++ ++/* Maintenance of the shared handle open on the database. */ ++ ++static DB *db; ++static int keep_db; ++static unsigned int entidx; /* Index for `getaliasent_r'. */ ++ ++/* Open database file if not already opened. */ ++static enum nss_status ++internal_setent (int stayopen) ++{ ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ ++ if (db == NULL) ++ { ++ db = dbopen (_PATH_VARDB "aliases.db", O_RDONLY, 0, DB_BTREE, NULL); ++ ++ if (db == NULL) ++ status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; ++ else ++ { ++ /* We have to make sure the file is `closed on exec'. */ ++ int result, flags; ++ ++ result = flags = fcntl ((*db->fd) (db), F_GETFD, 0); ++ if (result >= 0) ++ { ++ flags |= FD_CLOEXEC; ++ result = fcntl ((*db->fd) (db), F_SETFD, flags); ++ } ++ if (result < 0) ++ { ++ /* Something went wrong. Close the stream and return a ++ failure. */ ++ (*db->close) (db); ++ db = NULL; ++ status = NSS_STATUS_UNAVAIL; ++ } ++ } ++ } ++ ++ /* Remember STAYOPEN flag. */ ++ if (db != NULL) ++ keep_db |= stayopen; ++ ++ return status; ++} ++ ++ ++/* Thread-safe, exported version of that. */ ++enum nss_status ++_nss_db_setaliasent (int stayopen) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_setent (stayopen); ++ ++ /* Reset the sequential index. */ ++ entidx = 0; ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++ ++/* Close the database file. */ ++static void ++internal_endent (void) ++{ ++ if (db != NULL) ++ { ++ (*db->close) (db); ++ db = NULL; ++ } ++} ++ ++ ++/* Thread-safe, exported version of that. */ ++enum nss_status ++_nss_db_endaliasent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ internal_endent (); ++ ++ /* 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 (const DBT *key, struct aliasent *result, char *buffer, ++ size_t buflen) ++{ ++ enum nss_status status; ++ DBT value; ++ ++ /* Open the database. */ ++ status = internal_setent (keep_db); ++ if (status != NSS_STATUS_SUCCESS) ++ return status; ++ ++ if ((*db->get) (db, key, &value, 0) == 0) ++ { ++ const char *src = value.data; ++ ++ result->alias_members_len = 0; ++ ++ /* We now have to fill the BUFFER with all the information. */ ++ if (buflen < key->size + 1) ++ { ++ no_more_room: ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ if (status == NSS_STATUS_SUCCESS) ++ { ++ char *cp; ++ size_t cnt; ++ ++ 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 (); ++ ++ return status; ++} ++ ++enum nss_status ++_nss_db_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen) ++{ ++ /* 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++); ++ status = lookup (&key, result, buffer, buflen); ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++ ++enum nss_status ++_nss_db_getaliasbyname_r (const char *name, struct aliasent *result, ++ char *buffer, size_t buflen) ++{ ++ 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); ++ ++ __libc_lock_lock (lock); ++ status = lookup (&key, result, buffer, buflen); ++ __libc_lock_unlock (lock); ++ ++ return status; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_db/db-netgrp.c glibc-2.1.3/glibc-compat/nss_db/db-netgrp.c +--- ../glibc-2.1.3/glibc-compat/nss_db/db-netgrp.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_db/db-netgrp.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,129 @@ ++/* Netgroup file parser in nss_db modules. ++ Copyright (C) 1996, 1997 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. ++ ++ 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. */ ++ ++#include <db_185.h> ++#include <errno.h> ++#include <fcntl.h> ++#include <string.h> ++#include <bits/libc-lock.h> ++#include <paths.h> ++#include "nsswitch.h" ++#include "netgroup.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 DB *db; ++static char *entry; ++static char *cursor; ++ ++enum nss_status ++_nss_db_setnetgrent (const char *group) ++{ ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ ++ __libc_lock_lock (lock); ++ ++ /* Make sure the data base file is open. */ ++ if (db == NULL) ++ { ++ db = dbopen (DBFILE, O_RDONLY, 0, DB_BTREE, NULL); ++ ++ if (db == NULL) ++ status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; ++ else ++ { ++ /* We have to make sure the file is `closed on exec'. */ ++ int result, flags; ++ ++ result = flags = fcntl ((*db->fd) (db), F_GETFD, 0); ++ if (result >= 0) ++ { ++ flags |= FD_CLOEXEC; ++ result = fcntl ((*db->fd) (db), F_SETFD, flags); ++ } ++ if (result < 0) ++ { ++ /* Something went wrong. Close the stream and return a ++ failure. */ ++ (*db->close) (db); ++ db = NULL; ++ status = NSS_STATUS_UNAVAIL; ++ } ++ } ++ } ++ ++ if (status == NSS_STATUS_SUCCESS) ++ { ++ DBT key = { data: (void *) group, size: strlen (group) }; ++ DBT value; ++ ++ if ((*db->get) (db, &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); ++ ++ if (db != NULL) ++ { ++ (*db->close) (db); ++ db = NULL; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++ ++extern enum nss_status _nss_netgroup_parseline (char **cursor, ++ struct __netgrent *result, ++ char *buffer, int buflen); ++ ++enum nss_status ++_nss_db_getnetgrent_r (struct __netgrent *result, char *buffer, int buflen) ++{ ++ int status; ++ ++ __libc_lock_lock (lock); ++ ++ status = _nss_netgroup_parseline (&cursor, result, buffer, buflen); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_dns/dns-host.c glibc-2.1.3/glibc-compat/nss_dns/dns-host.c +--- ../glibc-2.1.3/glibc-compat/nss_dns/dns-host.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_dns/dns-host.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,602 @@ ++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 1996. ++ ++ 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. */ ++ ++/* Parts of this file are plain copies of the file `gethtnamadr.c' from ++ the bind package and it has the following copyright. */ ++ ++/* ++ * ++Copyright++ 1985, 1988, 1993 ++ * - ++ * Copyright (c) 1985, 1988, 1993 ++ * The Regents of the University of California. All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by the University of ++ * California, Berkeley and its contributors. ++ * 4. Neither the name of the University nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ * - ++ * Portions Copyright (c) 1993 by Digital Equipment Corporation. ++ * ++ * Permission to use, copy, modify, and distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies, and that ++ * the name of Digital Equipment Corporation not be used in advertising or ++ * publicity pertaining to distribution of the document or software without ++ * specific, written prior permission. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL ++ * WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES ++ * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT ++ * CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL ++ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR ++ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ++ * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ++ * SOFTWARE. ++ * - ++ * --Copyright-- ++ */ ++ ++#include <ctype.h> ++#include <errno.h> ++#include <netdb.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <stddef.h> ++#include <string.h> ++#include <sys/syslog.h> ++ ++#include "nsswitch.h" ++ ++/* Get implementation for some internal functions. */ ++#include "../resolv/mapv4v6addr.h" ++#include "../resolv/mapv4v6hostent.h" ++ ++/* Maximum number of aliases we allow. */ ++#define MAX_NR_ALIASES 48 ++#define MAX_NR_ADDRS 48 ++ ++#if PACKETSZ > 1024 ++# define MAXPACKET PACKETSZ ++#else ++# define MAXPACKET 1024 ++#endif ++/* As per RFC 1034 and 1035 a host name cannot exceed 255 octets in length. */ ++#ifdef MAXHOSTNAMELEN ++# undef MAXHOSTNAMELEN ++#endif ++#define MAXHOSTNAMELEN 256 ++ ++static const char AskedForGot[] = "\ ++gethostby*.getanswer: asked for \"%s\", got \"%s\""; ++ ++ ++/* We need this time later. */ ++typedef union querybuf ++{ ++ HEADER hdr; ++ u_char buf[MAXPACKET]; ++} querybuf; ++ ++ ++static enum nss_status getanswer_r (const querybuf *answer, int anslen, ++ const char *qname, int qtype, ++ struct hostent *result, char *buffer, ++ size_t buflen, int *h_errnop); ++ ++enum nss_status ++_nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result, ++ char *buffer, size_t buflen, int *h_errnop) ++{ ++ querybuf host_buffer; ++ int size, type, n; ++ const char *cp; ++ ++ switch (af) { ++ case AF_INET: ++ size = INADDRSZ; ++ type = T_A; ++ break; ++ case AF_INET6: ++ size = IN6ADDRSZ; ++ type = T_AAAA; ++ break; ++ default: ++ *h_errnop = NETDB_INTERNAL; ++ __set_errno (EAFNOSUPPORT); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ result->h_addrtype = af; ++ result->h_length = size; ++ ++ /* ++ * if there aren't any dots, it could be a user-level alias. ++ * this is also done in res_query() since we are not the only ++ * function that looks up host names. ++ */ ++ if (strchr (name, '.') == NULL && (cp = __hostalias (name)) != NULL) ++ name = cp; ++ ++ n = res_search (name, C_IN, type, host_buffer.buf, sizeof (host_buffer.buf)); ++ if (n < 0) ++ { ++ *h_errnop = h_errno; ++ return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; ++ } ++ ++ return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen, ++ h_errnop); ++} ++ ++ ++enum nss_status ++_nss_dns_gethostbyname_r (const char *name, struct hostent *result, ++ char *buffer, size_t buflen, int *h_errnop) ++{ ++ enum nss_status status = NSS_STATUS_NOTFOUND; ++ ++ if (_res.options & RES_USE_INET6) ++ status = _nss_dns_gethostbyname2_r (name, AF_INET6, result, buffer, ++ buflen, h_errnop); ++ if (status == NSS_STATUS_NOTFOUND) ++ status = _nss_dns_gethostbyname2_r (name, AF_INET, result, buffer, ++ buflen, h_errnop); ++ ++ return status; ++} ++ ++ ++enum nss_status ++_nss_dns_gethostbyaddr_r (const char *addr, int len, int af, ++ struct hostent *result, char *buffer, size_t buflen, ++ int *h_errnop) ++{ ++ static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff }; ++ static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; ++ const u_char *uaddr = (const u_char *)addr; ++ struct host_data ++ { ++ char *aliases[MAX_NR_ALIASES]; ++ unsigned char host_addr[16]; /* IPv4 or IPv6 */ ++ char *h_addr_ptrs[MAX_NR_ADDRS + 1]; ++ char linebuffer[0]; ++ } *host_data = (struct host_data *) buffer; ++ querybuf host_buffer; ++ char qbuf[MAXDNAME+1], *qp; ++ int size, n, status; ++ ++ if (af == AF_INET6 && len == IN6ADDRSZ && ++ (memcmp (uaddr, mapped, sizeof mapped) == 0 ++ || memcmp (uaddr, tunnelled, sizeof tunnelled) == 0)) ++ { ++ /* Unmap. */ ++ addr += sizeof mapped; ++ uaddr += sizeof mapped; ++ af = AF_INET; ++ len = INADDRSZ; ++ } ++ ++ switch (af) ++ { ++ case AF_INET: ++ size = INADDRSZ; ++ break; ++ case AF_INET6: ++ size = IN6ADDRSZ; ++ break; ++ default: ++ __set_errno (EAFNOSUPPORT); ++ *h_errnop = NETDB_INTERNAL; ++ return NSS_STATUS_UNAVAIL; ++ } ++ if (size != len) ++ { ++ __set_errno (EAFNOSUPPORT); ++ *h_errnop = NETDB_INTERNAL; ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ switch (af) ++ { ++ case AF_INET: ++ sprintf (qbuf, "%u.%u.%u.%u.in-addr.arpa", (uaddr[3] & 0xff), ++ (uaddr[2] & 0xff), (uaddr[1] & 0xff), (uaddr[0] & 0xff)); ++ break; ++ case AF_INET6: ++ qp = qbuf; ++ for (n = IN6ADDRSZ - 1; n >= 0; n--) ++ qp += sprintf (qp, "%x.%x.", uaddr[n] & 0xf, (uaddr[n] >> 4) & 0xf); ++ strcpy(qp, "ip6.int"); ++ break; ++ default: ++ /* Cannot happen. */ ++ } ++ ++ n = res_query (qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf, ++ sizeof host_buffer); ++ if (n < 0) ++ { ++ *h_errnop = h_errno; ++ return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; ++ } ++ ++ status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen, ++ h_errnop); ++ if (status != NSS_STATUS_SUCCESS) ++ { ++ *h_errnop = h_errno; ++ return status; ++ } ++ ++#ifdef SUNSECURITY ++ This is not implemented because it is not possible to use the current ++ source from bind in a multi-threaded program. ++#endif ++ ++ result->h_addrtype = af; ++ result->h_length = len; ++ memcpy (host_data->host_addr, addr, len); ++ host_data->h_addr_ptrs[0] = (char *) host_data->host_addr; ++ host_data->h_addr_ptrs[1] = NULL; ++ if (af == AF_INET && (_res.options & RES_USE_INET6)) ++ { ++ map_v4v6_address ((char *) host_data->host_addr, ++ (char *) host_data->host_addr); ++ result->h_addrtype = AF_INET6; ++ result->h_length = IN6ADDRSZ; ++ } ++ *h_errnop = NETDB_SUCCESS; ++ return NSS_STATUS_SUCCESS; ++} ++ ++ ++static enum nss_status ++getanswer_r (const querybuf *answer, int anslen, const char *qname, int qtype, ++ struct hostent *result, char *buffer, size_t buflen, ++ int *h_errnop) ++{ ++ struct host_data ++ { ++ char *aliases[MAX_NR_ALIASES]; ++ unsigned char host_addr[16]; /* IPv4 or IPv6 */ ++ char *h_addr_ptrs[MAX_NR_ADDRS + 1]; ++ char linebuffer[0]; ++ } *host_data = (struct host_data *) buffer; ++ int linebuflen = buflen - offsetof (struct host_data, linebuffer); ++ register const HEADER *hp; ++ const u_char *end_of_message, *cp; ++ int n, ancount, qdcount; ++ int haveanswer, had_error; ++ char *bp, **ap, **hap; ++ char tbuf[MAXDNAME]; ++ const char *tname; ++ int (*name_ok) __P ((const char *)); ++ ++ tname = qname; ++ result->h_name = NULL; ++ end_of_message = answer->buf + anslen; ++ switch (qtype) ++ { ++ case T_A: ++ case T_AAAA: ++ name_ok = res_hnok; ++ break; ++ case T_PTR: ++ name_ok = res_dnok; ++ break; ++ default: ++ return NSS_STATUS_UNAVAIL; /* XXX should be abort(); */ ++ } ++ ++ /* ++ * find first satisfactory answer ++ */ ++ hp = &answer->hdr; ++ bp = host_data->linebuffer; ++ ancount = ntohs (hp->ancount); ++ qdcount = ntohs (hp->qdcount); ++ cp = answer->buf + HFIXEDSZ; ++ if (qdcount != 1) ++ { ++ *h_errnop = NO_RECOVERY; ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen); ++ if (n < 0 || (*name_ok) (bp) == 0) ++ { ++ *h_errnop = NO_RECOVERY; ++ return NSS_STATUS_UNAVAIL; ++ } ++ cp += n + QFIXEDSZ; ++ ++ if (qtype == T_A || qtype == T_AAAA) ++ { ++ /* res_send() has already verified that the query name is the ++ * same as the one we sent; this just gets the expanded name ++ * (i.e., with the succeeding search-domain tacked on). ++ */ ++ n = strlen (bp) + 1; /* for the \0 */ ++ if (n >= MAXHOSTNAMELEN) ++ { ++ __set_h_errno (NO_RECOVERY); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ result->h_name = bp; ++ bp += n; ++ linebuflen -= n; ++ /* The qname can be abbreviated, but h_name is now absolute. */ ++ qname = result->h_name; ++ } ++ ++ ap = host_data->aliases; ++ *ap = NULL; ++ result->h_aliases = host_data->aliases; ++ hap = host_data->h_addr_ptrs; ++ *hap = NULL; ++ result->h_addr_list = host_data->h_addr_ptrs; ++ haveanswer = 0; ++ had_error = 0; ++ ++ while (ancount-- > 0 && cp < end_of_message && had_error == 0) ++ { ++ int type, class; ++ ++ n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen); ++ if (n < 0 || (*name_ok) (bp) == 0) ++ { ++ ++had_error; ++ continue; ++ } ++ cp += n; /* name */ ++ type = _getshort (cp); ++ cp += INT16SZ; /* type */ ++ class = _getshort(cp); ++ cp += INT16SZ + INT32SZ; /* class, TTL */ ++ n = _getshort(cp); ++ cp += INT16SZ; /* len */ ++ if (class != C_IN) ++ { ++ /* XXX - debug? syslog? */ ++ cp += n; ++ continue; /* XXX - had_error++ ? */ ++ } ++ ++ if ((qtype ==T_A || qtype == T_AAAA) && type == T_CNAME) ++ { ++ if (ap >= &host_data->aliases[MAX_NR_ALIASES - 1]) ++ continue; ++ n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf); ++ if (n < 0 || (*name_ok) (tbuf) == 0) ++ { ++ ++had_error; ++ continue; ++ } ++ cp += n; ++ /* Store alias. */ ++ *ap++ = bp; ++ n = strlen (bp) + 1; /* For the \0. */ ++ if (n >= MAXHOSTNAMELEN) ++ { ++ ++had_error; ++ continue; ++ } ++ bp += n; ++ linebuflen -= n; ++ /* Get canonical name. */ ++ n = strlen (tbuf) + 1; /* For the \0. */ ++ if ((size_t) n > buflen || n >= MAXHOSTNAMELEN) ++ { ++ ++had_error; ++ continue; ++ } ++ strcpy (bp, tbuf); /* Cannot overflow. */ ++ result->h_name = bp; ++ bp += n; ++ linebuflen -= n; ++ continue; ++ } ++ ++ if (qtype == T_PTR && type == T_CNAME) ++ { ++ n = dn_expand (answer->buf, end_of_message, cp, tbuf, sizeof tbuf); ++ if (n < 0 || res_dnok (tbuf) == 0) ++ { ++ ++had_error; ++ continue; ++ } ++ cp += n; ++ /* Get canonical name. */ ++ n = strlen (tbuf) + 1; /* For the \0. */ ++ if ((size_t) n > buflen || n >= MAXHOSTNAMELEN) ++ { ++ ++had_error; ++ continue; ++ } ++ strcpy (bp, tbuf); /* Cannot overflow. */ ++ tname = bp; ++ bp += n; ++ linebuflen -= n; ++ continue; ++ } ++ if (type != qtype) ++ { ++ syslog (LOG_NOTICE | LOG_AUTH, ++ "gethostby*.getanswer: asked for \"%s %s %s\", got type \"%s\"", ++ qname, p_class (C_IN), p_type (qtype), p_type (type)); ++ cp += n; ++ continue; /* XXX - had_error++ ? */ ++ } ++ ++ switch (type) ++ { ++ case T_PTR: ++ if (strcasecmp (tname, bp) != 0) ++ { ++ syslog (LOG_NOTICE | LOG_AUTH, AskedForGot, qname, bp); ++ cp += n; ++ continue; /* XXX - had_error++ ? */ ++ } ++ n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen); ++ if (n < 0 || res_hnok (bp) == 0) ++ { ++ ++had_error; ++ break; ++ } ++#if MULTI_PTRS_ARE_ALIASES ++ cp += n; ++ if (haveanswer == 0) ++ result->h_name = bp; ++ else if (ap < &host_data->aliases[MAXALIASES-1]) ++ *ap++ = bp; ++ else ++ n = -1; ++ if (n != -1) ++ { ++ n = strlen (bp) + 1; /* for the \0 */ ++ if (n >= MAXHOSTNAMELEN) ++ { ++ ++had_error; ++ break; ++ } ++ bp += n; ++ linebuflen -= n; ++ } ++ break; ++#else ++ result->h_name = bp; ++ if (_res.options & RES_USE_INET6) ++ { ++ n = strlen (bp) + 1; /* for the \0 */ ++ if (n >= MAXHOSTNAMELEN) ++ { ++ ++had_error; ++ break; ++ } ++ bp += n; ++ linebuflen -= n; ++ map_v4v6_hostent (result, &bp, &linebuflen); ++ } ++ *h_errnop = NETDB_SUCCESS; ++ return NSS_STATUS_SUCCESS; ++#endif ++ case T_A: ++ case T_AAAA: ++ if (strcasecmp (result->h_name, bp) != 0) ++ { ++ syslog (LOG_NOTICE | LOG_AUTH, AskedForGot, result->h_name, bp); ++ cp += n; ++ continue; /* XXX - had_error++ ? */ ++ } ++ if (n != result->h_length) ++ { ++ cp += n; ++ continue; ++ } ++ if (!haveanswer) ++ { ++ register int nn; ++ ++ result->h_name = bp; ++ nn = strlen (bp) + 1; /* for the \0 */ ++ bp += nn; ++ linebuflen -= nn; ++ } ++ ++ bp += sizeof (align) - ((u_long) bp % sizeof (align)); ++ ++ if (n >= linebuflen) ++ { ++ ++had_error; ++ continue; ++ } ++ if (hap >= &host_data->h_addr_ptrs[MAX_NR_ADDRS-1]) ++ { ++ cp += n; ++ continue; ++ } ++ memcpy (*hap++ = bp, cp, n); ++ bp += n; ++ cp += n; ++ linebuflen -= n; ++ break; ++ default: ++ abort (); ++ } ++ if (had_error == 0) ++ ++haveanswer; ++ } ++ ++ if (haveanswer > 0) ++ { ++ *ap = NULL; ++ *hap = NULL; ++#if defined(RESOLVSORT) ++ /* ++ * Note: we sort even if host can take only one address ++ * in its return structures - should give it the "best" ++ * address in that case, not some random one ++ */ ++ if (_res.nsort && haveanswer > 1 && qtype == T_A) ++ addrsort (host_data->h_addr_ptrs, haveanswer); ++#endif /*RESOLVSORT*/ ++ ++ if (result->h_name == NULL) ++ { ++ n = strlen (qname) + 1; /* For the \0. */ ++ if (n > linebuflen || n >= MAXHOSTNAMELEN) ++ goto no_recovery; ++ strcpy (bp, qname); /* Cannot overflow. */ ++ result->h_name = bp; ++ bp += n; ++ linebuflen -= n; ++ } ++ ++ if (_res.options & RES_USE_INET6) ++ map_v4v6_hostent (result, &bp, &linebuflen); ++ *h_errnop = NETDB_SUCCESS; ++ return NSS_STATUS_SUCCESS; ++ } ++ no_recovery: ++ *h_errnop = NO_RECOVERY; ++ return NSS_STATUS_TRYAGAIN; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_dns/dns-network.c glibc-2.1.3/glibc-compat/nss_dns/dns-network.c +--- ../glibc-2.1.3/glibc-compat/nss_dns/dns-network.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_dns/dns-network.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,345 @@ ++/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Extended from original form by Ulrich Drepper <drepper@cygnus.com>, 1996. ++ ++ 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. */ ++ ++/* Parts of this file are plain copies of the file `getnetnamadr.c' from ++ the bind package and it has the following copyright. */ ++ ++/* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro ++ * Dep. Matematica Universidade de Coimbra, Portugal, Europe ++ * ++ * Permission to use, copy, modify, and distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ */ ++/* ++ * Copyright (c) 1983, 1993 ++ * The Regents of the University of California. All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by the University of ++ * California, Berkeley and its contributors. ++ * 4. Neither the name of the University nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ ++#include <ctype.h> ++#include <errno.h> ++#include <netdb.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++ ++#include "nsswitch.h" ++#include <arpa/inet.h> ++ ++/* Maximum number of aliases we allow. */ ++#define MAX_NR_ALIASES 48 ++ ++ ++#if PACKETSZ > 1024 ++#define MAXPACKET PACKETSZ ++#else ++#define MAXPACKET 1024 ++#endif ++ ++ ++typedef enum ++{ ++ BYADDR, ++ BYNAME ++} lookup_method; ++ ++ ++/* We need this time later. */ ++typedef union querybuf ++{ ++ HEADER hdr; ++ u_char buf[MAXPACKET]; ++} querybuf; ++ ++ ++/* Prototypes for local functions. */ ++static enum nss_status getanswer_r (const querybuf *answer, int anslen, ++ struct netent *result, char *buffer, ++ size_t buflen, lookup_method net_i); ++ ++ ++enum nss_status ++_nss_dns_getnetbyname_r (const char *name, struct netent *result, ++ char *buffer, size_t buflen) ++{ ++ /* Return entry for network with NAME. */ ++ querybuf net_buffer; ++ int anslen; ++ char *qbuf; ++ ++ qbuf = strdupa (name); ++ anslen = res_search (qbuf, C_IN, T_PTR, (u_char *) &net_buffer, ++ sizeof (querybuf)); ++ if (anslen < 0) ++ /* Nothing found. */ ++ return (errno == ECONNREFUSED ++ || errno == EPFNOSUPPORT ++ || errno == EAFNOSUPPORT) ++ ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; ++ ++ return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME); ++} ++ ++ ++enum nss_status ++_nss_dns_getnetbyaddr_r (long net, int type, struct netent *result, ++ char *buffer, size_t buflen) ++{ ++ /* Return entry for network with NAME. */ ++ enum nss_status status; ++ querybuf net_buffer; ++ unsigned int net_bytes[4]; ++ char qbuf[MAXDNAME]; ++ int cnt, anslen; ++ u_int32_t net2; ++ ++ /* No net address lookup for IPv6 yet. */ ++ if (type != AF_INET) ++ return NSS_STATUS_UNAVAIL; ++ ++ net2 = (u_int32_t) net; ++ for (cnt = 4; net2 != 0; net2 >>= 8) ++ net_bytes[--cnt] = net2 & 0xff; ++ ++ switch (cnt) ++ { ++ case 3: ++ /* Class A network. */ ++ sprintf (qbuf, "0.0.0.%u.in-addr.arpa", net_bytes[3]); ++ break; ++ case 2: ++ /* Class B network. */ ++ sprintf (qbuf, "0.0.%u.%u.in-addr.arpa", net_bytes[3], net_bytes[2]); ++ break; ++ case 1: ++ /* Class C network. */ ++ sprintf (qbuf, "0.%u.%u.%u.in-addr.arpa", net_bytes[3], net_bytes[2], ++ net_bytes[1]); ++ break; ++ case 0: ++ /* Class D - E network. */ ++ sprintf (qbuf, "%u.%u.%u.%u.in-addr.arpa", net_bytes[3], net_bytes[2], ++ net_bytes[1], net_bytes[0]); ++ break; ++ } ++ ++ anslen = res_query (qbuf, C_IN, T_PTR, (u_char *) &net_buffer, ++ sizeof (querybuf)); ++ if (anslen < 0) ++ /* Nothing found. */ ++ return (errno == ECONNREFUSED ++ || errno == EPFNOSUPPORT ++ || errno == EAFNOSUPPORT) ++ ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; ++ ++ status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR); ++ if (status == NSS_STATUS_SUCCESS) ++ { ++ /* Strip trailing zeros. */ ++ unsigned int u_net = net; /* Maybe net should be unsigned? */ ++ ++ while ((u_net & 0xff) == 0 && u_net != 0) ++ u_net >>= 8; ++ result->n_net = u_net; ++ } ++ ++ return status; ++} ++ ++ ++#undef offsetof ++#define offsetof(Type, Member) ((size_t) &((Type *) NULL)->Member) ++ ++static enum nss_status ++getanswer_r (const querybuf *answer, int anslen, struct netent *result, ++ char *buffer, size_t buflen, lookup_method net_i) ++{ ++ /* ++ * Find first satisfactory answer ++ * ++ * answer --> +------------+ ( MESSAGE ) ++ * | Header | ++ * +------------+ ++ * | Question | the question for the name server ++ * +------------+ ++ * | Answer | RRs answering the question ++ * +------------+ ++ * | Authority | RRs pointing toward an authority ++ * | Additional | RRs holding additional information ++ * +------------+ ++ */ ++ struct net_data ++ { ++ char *aliases[MAX_NR_ALIASES]; ++ char linebuffer[0]; ++ } *net_data = (struct net_data *) buffer; ++ int linebuflen = buflen - offsetof (struct net_data, linebuffer); ++ const char *end_of_message = &answer->buf[anslen]; ++ const HEADER *header_pointer = &answer->hdr; ++ /* #/records in the answer section. */ ++ int answer_count = ntohs (header_pointer->ancount); ++ /* #/entries in the question section. */ ++ int question_count = ntohs (header_pointer->qdcount); ++ char *bp = net_data->linebuffer; ++ const char *cp = &answer->buf[HFIXEDSZ]; ++ char **alias_pointer; ++ int have_answer; ++ char *ans; ++ ++ if (question_count == 0) ++ { ++ /* FIXME: the Sun version uses for host name lookup an additional ++ parameter for pointing to h_errno. this is missing here. ++ OSF/1 has a per-thread h_errno variable. */ ++ if (header_pointer->aa != 0) ++ { ++ __set_h_errno (HOST_NOT_FOUND); ++ return NSS_STATUS_NOTFOUND; ++ } ++ else ++ { ++ __set_h_errno (TRY_AGAIN); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ } ++ ++ /* Skip the question part. */ ++ while (question_count-- > 0) ++ cp += __dn_skipname (cp, end_of_message) + QFIXEDSZ; ++ ++ alias_pointer = result->n_aliases = &net_data->aliases[0]; ++ *alias_pointer = NULL; ++ have_answer = 0; ++ ans = NULL; ++ ++ while (--answer_count >= 0 && cp < end_of_message) ++ { ++ int n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen); ++ int type, class; ++ ++ if (n < 0 || res_dnok (bp) == 0) ++ break; ++ cp += n; ++ ans = strdupa (bp); ++ GETSHORT (type, cp); ++ GETSHORT (class, cp); ++ cp += INT32SZ; /* TTL */ ++ GETSHORT (n, cp); ++ ++ if (class == C_IN && type == T_PTR) ++ { ++ n = dn_expand (answer->buf, end_of_message, cp, bp, linebuflen); ++ if (n < 0 || !res_hnok (bp)) ++ { ++ /* XXX What does this mean? The original form from bind ++ returns NULL. Incrementing cp has no effect in any case. ++ What should I return here. ??? */ ++ cp += n; ++ return NSS_STATUS_UNAVAIL; ++ } ++ cp += n; ++ *alias_pointer++ = bp; ++ bp += strlen (bp) + 1; ++ result->n_addrtype = class == C_IN ? AF_INET : AF_UNSPEC; ++ ++have_answer; ++ } ++ } ++ ++ if (have_answer) ++ { ++ char *tmp; ++ int len; ++ char *in, *cp, *rp, *wp; ++ int cnt, first_flag; ++ ++ *alias_pointer = NULL; ++ switch (net_i) ++ { ++ case BYADDR: ++ result->n_name = result->n_aliases[0]; ++ result->n_net = 0L; ++ break; ++ case BYNAME: ++ len = strlen (result->n_aliases[0]); ++ tmp = (char *) alloca (len + 1); ++ tmp[len] = 0; ++ wp = &tmp[len - 1]; ++ ++ rp = in = result->n_aliases[0]; ++ result->n_name = ans; ++ ++ first_flag = 1; ++ for (cnt = 0; cnt < 4; ++cnt) ++ { ++ char *startp; ++ ++ startp = rp; ++ while (*rp != '.') ++ ++rp; ++ if (rp - startp > 1 || *startp != '0' || !first_flag) ++ { ++ first_flag = 0; ++ if (cnt > 0) ++ *wp-- = '.'; ++ cp = rp; ++ while (cp > startp) ++ *wp-- = *--cp; ++ } ++ in = rp + 1; ++ } ++ ++ result->n_net = inet_network (wp); ++ break; ++ } ++ ++ ++result->n_aliases; ++ return NSS_STATUS_SUCCESS; ++ } ++ ++ __set_h_errno (TRY_AGAIN); ++ return NSS_STATUS_TRYAGAIN; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-XXX.c glibc-2.1.3/glibc-compat/nss_files/files-XXX.c +--- ../glibc-2.1.3/glibc-compat/nss_files/files-XXX.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_files/files-XXX.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,311 @@ ++/* Common code for file-based databases in nss_files module. ++ Copyright (C) 1996, 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 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. */ ++ ++#include <stdio.h> ++#include <ctype.h> ++#include <fcntl.h> ++#include <assert.h> ++#include <errno.h> ++#include <bits/libc-lock.h> ++#include "nsswitch.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 -- string of the database file's name ("hosts", "passwd"). ++ ++ NEED_H_ERRNO - defined iff an arg `int *herrnop' is used. ++ ++ Also see files-parse.c. ++*/ ++ ++#define ENTNAME_r CONCAT(ENTNAME,_r) ++ ++#define DATAFILE "/etc/" DATABASE ++ ++#ifdef NEED_H_ERRNO ++# include <netdb.h> ++# 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 stream open on the database file. */ ++ ++static FILE *stream; ++static fpos_t position; ++static enum { none, getent, getby } last_use; ++static int keep_stream; ++ ++/* Open database file if not already opened. */ ++static enum nss_status ++internal_setent (int stayopen) ++{ ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ ++ if (stream == NULL) ++ { ++ stream = fopen (DATAFILE, "r"); ++ ++ if (stream == NULL) ++ status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; ++ else ++ { ++ /* We have to make sure the file is `closed on exec'. */ ++ int result, flags; ++ ++ result = flags = fcntl (fileno (stream), F_GETFD, 0); ++ if (result >= 0) ++ { ++ flags |= FD_CLOEXEC; ++ result = fcntl (fileno (stream), F_SETFD, flags); ++ } ++ if (result < 0) ++ { ++ /* Something went wrong. Close the stream and return a ++ failure. */ ++ fclose (stream); ++ stream = NULL; ++ status = NSS_STATUS_UNAVAIL; ++ } ++ } ++ } ++ else ++ rewind (stream); ++ ++ /* Remember STAYOPEN flag. */ ++ if (stream != NULL) ++ keep_stream |= stayopen; ++ ++ return status; ++} ++ ++ ++/* Thread-safe, exported version of that. */ ++enum nss_status ++CONCAT(_nss_files_set,ENTNAME) (int stayopen) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_setent (stayopen); ++ ++ if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0) ++ { ++ fclose (stream); ++ stream = NULL; ++ status = NSS_STATUS_UNAVAIL; ++ } ++ ++ last_use = getent; ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++ ++/* Close the database file. */ ++static void ++internal_endent (void) ++{ ++ if (stream != NULL) ++ { ++ fclose (stream); ++ stream = NULL; ++ } ++} ++ ++ ++/* Thread-safe, exported version of that. */ ++enum nss_status ++CONCAT(_nss_files_end,ENTNAME) (void) ++{ ++ __libc_lock_lock (lock); ++ ++ internal_endent (); ++ ++ /* Reset STAYOPEN flag. */ ++ keep_stream = 0; ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++/* Parsing the database file into `struct STRUCTURE' data structures. */ ++ ++static enum nss_status ++internal_getent (struct STRUCTURE *result, ++ char *buffer, int buflen H_ERRNO_PROTO) ++{ ++ char *p; ++ struct parser_data *data = (void *) buffer; ++ int linebuflen = buffer + buflen - data->linebuffer; ++ int parse_result; ++ ++ if (buflen < (int) sizeof *data + 1) ++ { ++ __set_errno (ERANGE); ++ H_ERRNO_SET (NETDB_INTERNAL); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ do ++ { ++ /* Terminate the line so that we can test for overflow. */ ++ data->linebuffer[linebuflen - 1] = '\xff'; ++ ++ p = fgets (data->linebuffer, linebuflen, stream); ++ if (p == NULL && feof (stream)) ++ { ++ /* End of file or read error. */ ++ __set_errno (ENOENT); ++ H_ERRNO_SET (HOST_NOT_FOUND); ++ return NSS_STATUS_NOTFOUND; ++ } ++ else if (p == NULL || data->linebuffer[linebuflen - 1] != '\xff') ++ { ++ /* The line is too long. Give the user the opportunity to ++ enlarge the buffer. */ ++ __set_errno (ERANGE); ++ H_ERRNO_SET (NETDB_INTERNAL); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ /* Skip leading blanks. */ ++ while (isspace (*p)) ++ ++p; ++ } ++ while (*p == '\0' || *p == '#' /* Ignore empty and comment lines. */ ++ /* Parse the line. If it is invalid, loop to get the next ++ line of the file to parse. */ ++ || ! (parse_result = parse_line (p, result, data, buflen))); ++ ++ /* Filled in RESULT with the next entry from the database file. */ ++ return parse_result == -1 ? NSS_STATUS_TRYAGAIN : NSS_STATUS_SUCCESS; ++} ++ ++ ++/* Return the next entry from the database file, doing locking. */ ++enum nss_status ++CONCAT(_nss_files_get,ENTNAME_r) (struct STRUCTURE *result, ++ char *buffer, size_t buflen H_ERRNO_PROTO) ++{ ++ /* Return next entry in host file. */ ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ ++ __libc_lock_lock (lock); ++ ++ /* Be prepared that the set*ent function was not called before. */ ++ if (stream == NULL) ++ { ++ status = internal_setent (0); ++ ++ if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0) ++ { ++ fclose (stream); ++ stream = NULL; ++ status = NSS_STATUS_UNAVAIL; ++ } ++ } ++ ++ if (status == NSS_STATUS_SUCCESS) ++ { ++ /* If the last use was not by the getent function we need the ++ position the stream. */ ++ if (last_use != getent) ++ { ++ if (fsetpos (stream, &position) < 0) ++ status = NSS_STATUS_UNAVAIL; ++ else ++ last_use = getent; ++ } ++ ++ if (status == NSS_STATUS_SUCCESS) ++ { ++ status = internal_getent (result, buffer, buflen H_ERRNO_ARG); ++ ++ /* Remember this position if we were successful. If the ++ operation failed we give the user a chance to repeat the ++ operation (perhaps the buffer was too small). */ ++ if (status == NSS_STATUS_SUCCESS) ++ fgetpos (stream, &position); ++ else ++ /* We must make sure we reposition the stream the next call. */ ++ last_use = none; ++ } ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++/* Macro for defining lookup functions for this file-based database. ++ ++ NAME is the name of the lookup; e.g. `hostbyname'. ++ ++ KEYSIZE and KEYPATTERN are ignored here but used by ../nss_db/db-XXX.c. ++ ++ PROTO describes the arguments for the lookup key; ++ e.g. `const char *hostname'. ++ ++ BREAK_IF_MATCH is a block of code which compares `struct STRUCTURE *result' ++ to the lookup key arguments and does `break;' if they match. */ ++ ++#define DB_LOOKUP(name, keysize, keypattern, break_if_match, proto...) \ ++enum nss_status \ ++_nss_files_get##name##_r (proto, \ ++ struct STRUCTURE *result, \ ++ char *buffer, size_t buflen H_ERRNO_PROTO) \ ++{ \ ++ enum nss_status status; \ ++ \ ++ __libc_lock_lock (lock); \ ++ \ ++ /* Reset file pointer to beginning or open file. */ \ ++ status = internal_setent (keep_stream); \ ++ \ ++ if (status == NSS_STATUS_SUCCESS) \ ++ { \ ++ /* Tell getent function that we have repositioned the file pointer. */ \ ++ last_use = getby; \ ++ \ ++ while ((status = internal_getent (result, buffer, buflen H_ERRNO_ARG)) \ ++ == NSS_STATUS_SUCCESS) \ ++ { break_if_match } \ ++ \ ++ if (! keep_stream) \ ++ internal_endent (); \ ++ } \ ++ \ ++ __libc_lock_unlock (lock); \ ++ \ ++ return status; \ ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-alias.c glibc-2.1.3/glibc-compat/nss_files/files-alias.c +--- ../glibc-2.1.3/glibc-compat/nss_files/files-alias.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_files/files-alias.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,451 @@ ++/* Mail alias file parser in nss_files module. ++ Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. ++ ++ 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. */ ++ ++#include <aliases.h> ++#include <ctype.h> ++#include <errno.h> ++#include <fcntl.h> ++#include <bits/libc-lock.h> ++#include <stdlib.h> ++#include <stdio.h> ++#include <string.h> ++ ++#include "nsswitch.h" ++ ++/* Locks the static variables in this file. */ ++__libc_lock_define_initialized (static, lock) ++ ++/* Maintenance of the shared stream open on the database file. */ ++ ++static FILE *stream; ++static fpos_t position; ++static enum { none, getent, getby } last_use; ++ ++ ++static enum nss_status ++internal_setent (void) ++{ ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ ++ if (stream == NULL) ++ { ++ stream = fopen ("/etc/aliases", "r"); ++ ++ if (stream == NULL) ++ status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; ++ else ++ { ++ /* We have to make sure the file is `closed on exec'. */ ++ int result, flags; ++ ++ result = flags = fcntl (fileno (stream), F_GETFD, 0); ++ if (result >= 0) ++ { ++ flags |= FD_CLOEXEC; ++ result = fcntl (fileno (stream), F_SETFD, flags); ++ } ++ if (result < 0) ++ { ++ /* Something went wrong. Close the stream and return a ++ failure. */ ++ fclose (stream); ++ stream = NULL; ++ status = NSS_STATUS_UNAVAIL; ++ } ++ } ++ } ++ else ++ rewind (stream); ++ ++ return status; ++} ++ ++ ++/* Thread-safe, exported version of that. */ ++enum nss_status ++_nss_files_setaliasent (void) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_setent (); ++ ++ if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0) ++ { ++ fclose (stream); ++ stream = NULL; ++ status = NSS_STATUS_UNAVAIL; ++ } ++ ++ last_use = getent; ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++ ++/* Close the database file. */ ++static void ++internal_endent (void) ++{ ++ if (stream != NULL) ++ { ++ fclose (stream); ++ stream = NULL; ++ } ++} ++ ++ ++/* Thread-safe, exported version of that. */ ++enum nss_status ++_nss_files_endaliasent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ internal_endent (); ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++/* Parsing the database file into `struct aliasent' data structures. */ ++static enum nss_status ++get_next_alias (const char *match, struct aliasent *result, ++ char *buffer, size_t buflen) ++{ ++ enum nss_status status = NSS_STATUS_NOTFOUND; ++ int ignore = 0; ++ ++ result->alias_members_len = 0; ++ ++ while (1) ++ { ++ /* Now we are ready to process the input. We have to read a ++ line and all its continuations and construct the array of ++ string pointers. This pointers and the names itself have to ++ be placed in BUFFER. */ ++ char *first_unused = buffer; ++ size_t room_left = buflen - (buflen % __alignof__ (char *)); ++ char *line; ++ ++ /* Read the first line. It must contain the alias name and ++ possibly some alias names. */ ++ first_unused[room_left - 1] = '\xff'; ++ line = fgets (first_unused, room_left, stream); ++ if (line == NULL && feof (stream)) ++ /* Nothing to read. */ ++ break; ++ else if (line == NULL || first_unused[room_left - 1] != '\xff') ++ { ++ /* The line is too long for our buffer. */ ++ no_more_room: ++ __set_errno (ERANGE); ++ status = NSS_STATUS_TRYAGAIN; ++ break; ++ } ++ else ++ { ++ char *cp; ++ ++ /* If we are in IGNORE mode and the first character in the ++ line is a white space we ignore the line and start ++ reading the next. */ ++ if (ignore && isspace (*first_unused)) ++ continue; ++ ++ /* Terminate the line for any case. */ ++ cp = strpbrk (first_unused, "#\n"); ++ if (cp != NULL) ++ *cp = '\0'; ++ ++ /* Skip leading blanks. */ ++ while (isspace (*line)) ++ ++line; ++ ++ result->alias_name = first_unused; ++ while (*line != '\0' && *line != ':') ++ *first_unused++ = *line++; ++ if (*line == '\0' || result->alias_name == first_unused) ++ /* No valid name. Ignore the line. */ ++ continue; ++ ++ *first_unused++ = '\0'; ++ if (room_left < (size_t) (first_unused - result->alias_name)) ++ goto no_more_room; ++ room_left -= first_unused - result->alias_name; ++ ++line; ++ ++ /* When we search for a specific alias we can avoid all the ++ difficult parts and compare now with the name we are ++ looking for. If it does not match we simply ignore all ++ lines until the next line containing the start of a new ++ alias is found. */ ++ ignore = (match != NULL ++ && __strcasecmp (result->alias_name, match) != 0); ++ ++ while (! ignore) ++ { ++ while (isspace (*line)) ++ ++line; ++ ++ cp = first_unused; ++ while (*line != '\0' && *line != ',') ++ *first_unused++ = *line++; ++ ++ if (first_unused != cp) ++ { ++ /* OK, we can have a regular entry or an include ++ request. */ ++ if (*line != '\0') ++ ++line; ++ *first_unused++ = '\0'; ++ ++ if (strncmp (cp, ":include:", 9) != 0) ++ { ++ if (room_left < (first_unused - cp) + sizeof (char *)) ++ goto no_more_room; ++ room_left -= (first_unused - cp) + sizeof (char *); ++ ++ ++result->alias_members_len; ++ } ++ else ++ { ++ /* Oh well, we have to read the addressed file. */ ++ FILE *listfile; ++ char *old_line = NULL; ++ ++ first_unused = cp; ++ ++ listfile = fopen (&cp[9], "r"); ++ /* If the file does not exist we simply ignore ++ the statement. */ ++ if (listfile != NULL ++ && (old_line = strdup (line)) != NULL) ++ { ++ while (! feof (listfile)) ++ { ++ first_unused[room_left - 1] = '\xff'; ++ line = fgets (first_unused, room_left, listfile); ++ if (line == NULL && feof (listfile)) ++ break; ++ if (line == NULL ++ || first_unused[room_left - 1] != '\xff') ++ { ++ free (old_line); ++ goto no_more_room; ++ } ++ ++ /* Parse the line. */ ++ cp = strpbrk (line, "#\n"); ++ if (cp != NULL) ++ *cp = '\0'; ++ ++ do ++ { ++ while (isspace (*line)) ++ ++line; ++ ++ cp = first_unused; ++ while (*line != '\0' && *line != ',') ++ *first_unused++ = *line++; ++ ++ if (*line != '\0') ++ ++line; ++ ++ if (first_unused != cp) ++ { ++ *first_unused++ = '\0'; ++ if (room_left < ((first_unused - cp) ++ + __alignof__ (char *))) ++ { ++ free (old_line); ++ goto no_more_room; ++ } ++ room_left -= ((first_unused - cp) ++ + __alignof__ (char *)); ++ ++result->alias_members_len; ++ } ++ } ++ while (*line != '\0'); ++ } ++ fclose (listfile); ++ ++ first_unused[room_left - 1] = '\0'; ++ strncpy (first_unused, old_line, room_left); ++ ++ if (old_line != NULL) ++ free (old_line); ++ ++ if (first_unused[room_left - 1] != '\0') ++ goto no_more_room; ++ } ++ } ++ } ++ ++ if (*line == '\0') ++ { ++ /* Get the next line. But we must be careful. We ++ must not read the whole line at once since it ++ might belong to the current alias. Simply read ++ the first character. If it is a white space we ++ have a continuation line. Otherwise it is the ++ beginning of a new alias and we can push back the ++ just read character. */ ++ int ch; ++ ++ ch = fgetc (stream); ++ if (ch == EOF || ch == '\n' || !isspace (ch)) ++ { ++ size_t cnt; ++ ++ /* Now prepare the return. Provide string ++ pointers for the currently selected aliases. */ ++ if (ch != EOF) ++ ungetc (ch, stream); ++ ++ /* Adjust the pointer so it is aligned for ++ storing pointers. */ ++ first_unused += __alignof__ (char *) - 1; ++ first_unused -= ((first_unused - (char *) 0) ++ % __alignof__ (char *)); ++ result->alias_members = (char **) first_unused; ++ ++ /* 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); ++ break; ++ } ++ ++ /* The just read character is a white space and so ++ can be ignored. */ ++ first_unused[room_left - 1] = '\xff'; ++ line = fgets (first_unused, room_left, stream); ++ if (line == NULL && feof (stream)) ++ break; ++ if (line == NULL || first_unused[room_left - 1] != '\xff') ++ goto no_more_room; ++ cp = strpbrk (line, "#\n"); ++ if (cp != NULL) ++ *cp = '\0'; ++ } ++ } ++ } ++ ++ if (status != NSS_STATUS_NOTFOUND) ++ /* We read something. In any case break here. */ ++ break; ++ } ++ ++ return status; ++} ++ ++ ++enum nss_status ++_nss_files_getaliasent_r (struct aliasent *result, char *buffer, size_t buflen) ++{ ++ /* Return next entry in host file. */ ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ ++ __libc_lock_lock (lock); ++ ++ /* Be prepared that the set*ent function was not called before. */ ++ if (stream == NULL) ++ status = internal_setent (); ++ ++ if (status == NSS_STATUS_SUCCESS) ++ { ++ /* If the last use was not by the getent function we need the ++ position the stream. */ ++ if (last_use != getent) ++ { ++ if (fsetpos (stream, &position) < 0) ++ status = NSS_STATUS_UNAVAIL; ++ else ++ last_use = getent; ++ } ++ ++ if (status == NSS_STATUS_SUCCESS) ++ { ++ result->alias_local = 1; ++ ++ /* Read lines until we get a definite result. */ ++ do ++ status = get_next_alias (NULL, result, buffer, buflen); ++ while (status == NSS_STATUS_RETURN); ++ ++ /* If we successfully read an entry remember this position. */ ++ if (status == NSS_STATUS_SUCCESS) ++ fgetpos (stream, &position); ++ else ++ last_use = none; ++ } ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++ ++enum nss_status ++_nss_files_getaliasbyname_r (const char *name, struct aliasent *result, ++ char *buffer, size_t buflen) ++{ ++ /* Return next entry in host file. */ ++ enum nss_status status = NSS_STATUS_SUCCESS; ++ ++ if (name == NULL) ++ { ++ __set_errno (EINVAL); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ __libc_lock_lock (lock); ++ ++ /* Open the stream or rest it. */ ++ status = internal_setent (); ++ last_use = getby; ++ ++ if (status == NSS_STATUS_SUCCESS) ++ { ++ result->alias_local = 1; ++ ++ /* Read lines until we get a definite result. */ ++ do ++ status = get_next_alias (name, result, buffer, buflen); ++ while (status == NSS_STATUS_RETURN); ++ } ++ ++ internal_endent (); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-ethers.c glibc-2.1.3/glibc-compat/nss_files/files-ethers.c +--- ../glibc-2.1.3/glibc-compat/nss_files/files-ethers.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_files/files-ethers.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,75 @@ ++/* Copyright (C) 1996 Free Software 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. */ ++ ++#include <string.h> ++#include <netinet/if_ether.h> ++ ++/* Because the `ethers' lookup does not fit so well in the scheme so ++ we define a dummy struct here which helps us to use the available ++ functions. */ ++struct etherent ++{ ++ const char *e_name; ++ struct ether_addr e_addr; ++}; ++struct etherent_data {}; ++ ++#define ENTNAME etherent ++#define DATABASE "ethers" ++#include "files-parse.c" ++LINE_PARSER ++("#", ++ /* Read the ethernet address: 6 x 8bit hexadecimal number. */ ++ { ++ size_t cnt; ++ ++ for (cnt = 0; cnt < 6; ++cnt) ++ { ++ unsigned int number; ++ ++ if (cnt < 5) ++ INT_FIELD (number, ISCOLON , 0, 16, (unsigned int)) ++ else ++ INT_FIELD (number, isspace, 0, 16, (unsigned int)) ++ ++ if (number > 0xff) ++ return 0; ++ result->e_addr.ether_addr_octet[cnt] = number; ++ } ++ }; ++ STRING_FIELD (result->e_name, isspace, 1); ++ ) ++ ++ ++#include GENERIC ++ ++DB_LOOKUP (hostton, 1 + strlen (name), (".%s", name), ++ { ++ if (strcmp (result->e_name, name) == 0) ++ break; ++ }, const char *name) ++ ++DB_LOOKUP (ntohost, 18, ("=%x:%x:%x:%x:%x:%x", ++ addr->ether_addr_octet[0], addr->ether_addr_octet[1], ++ addr->ether_addr_octet[2], addr->ether_addr_octet[3], ++ addr->ether_addr_octet[4], addr->ether_addr_octet[5]), ++ { ++ if (memcmp (&result->e_addr, addr, ++ sizeof (struct ether_addr)) == 0) ++ break; ++ }, struct ether_addr *addr) +diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-grp.c glibc-2.1.3/glibc-compat/nss_files/files-grp.c +--- ../glibc-2.1.3/glibc-compat/nss_files/files-grp.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_files/files-grp.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,45 @@ ++/* Group file parser in nss_files module. ++ 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 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. */ ++ ++#include <grp.h> ++ ++#define STRUCTURE group ++#define ENTNAME grent ++#define DATABASE "group" ++struct grent_data {}; ++ ++/* Our parser function is already defined in fgetgrent.c, so use that. ++ to parse lines from the database file. */ ++#define EXTERN_PARSER ++#include "files-parse.c" ++#include GENERIC ++ ++DB_LOOKUP (grnam, 1 + strlen (name), (".%s", name), ++ { ++ if (name[0] != '-' && name[0] != '+' ++ && ! strcmp (name, result->gr_name)) ++ break; ++ }, const char *name) ++ ++DB_LOOKUP (grgid, 20, ("=%lu", (unsigned long int) gid), ++ { ++ if (result->gr_gid == gid && result->gr_name[0] != '+' ++ && result->gr_name[0] != '-') ++ break; ++ }, gid_t gid) +diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-hosts.c glibc-2.1.3/glibc-compat/nss_files/files-hosts.c +--- ../glibc-2.1.3/glibc-compat/nss_files/files-hosts.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_files/files-hosts.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,107 @@ ++/* Hosts file parser in nss_files module. ++ Copyright (C) 1996, 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 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. */ ++ ++#include <netinet/in.h> ++#include <arpa/inet.h> ++#include <arpa/nameser.h> ++#include <netdb.h> ++#include <resolv.h> ++ ++ ++/* Get implementation for some internal functions. */ ++#include "../resolv/mapv4v6addr.h" ++ ++ ++#define ENTNAME hostent ++#define DATABASE "hosts" ++#define NEED_H_ERRNO ++ ++#define ENTDATA hostent_data ++struct hostent_data ++ { ++ unsigned char host_addr[16]; /* IPv4 or IPv6 address. */ ++ char *h_addr_ptrs[2]; /* Points to that and null terminator. */ ++ }; ++ ++#define TRAILING_LIST_MEMBER h_aliases ++#define TRAILING_LIST_SEPARATOR_P isspace ++#include "files-parse.c" ++LINE_PARSER ++("#", ++ { ++ char *addr; ++ ++ STRING_FIELD (addr, isspace, 1); ++ ++ /* Parse address. */ ++ if (inet_pton (AF_INET, addr, entdata->host_addr) > 0) ++ { ++ if (_res.options & RES_USE_INET6) ++ { ++ map_v4v6_address ((char *) entdata->host_addr, ++ (char *) entdata->host_addr); ++ result->h_addrtype = AF_INET6; ++ result->h_length = IN6ADDRSZ; ++ } ++ else ++ { ++ result->h_addrtype = AF_INET; ++ result->h_length = INADDRSZ; ++ } ++ } ++ else if (inet_pton (AF_INET6, addr, entdata->host_addr) > 0) ++ { ++ result->h_addrtype = AF_INET6; ++ result->h_length = IN6ADDRSZ; ++ } ++ else ++ /* Illegal address: ignore line. */ ++ return 0; ++ ++ /* Store a pointer to the address in the expected form. */ ++ entdata->h_addr_ptrs[0] = entdata->host_addr; ++ entdata->h_addr_ptrs[1] = NULL; ++ result->h_addr_list = entdata->h_addr_ptrs; ++ ++ STRING_FIELD (result->h_name, isspace, 1); ++ }) ++ ++#include "files-XXX.c" ++ ++DB_LOOKUP (hostbyname, ,, ++ { ++ if (result->h_addrtype != ((_res.options & RES_USE_INET6) ++ ? AF_INET6 : AF_INET)) ++ continue; ++ LOOKUP_NAME_CASE (h_name, h_aliases) ++ }, const char *name) ++ ++DB_LOOKUP (hostbyname2, ,, ++ { ++ if (result->h_addrtype != af) ++ continue; ++ LOOKUP_NAME_CASE (h_name, h_aliases) ++ }, const char *name, int af) ++ ++DB_LOOKUP (hostbyaddr, ,, ++ { ++ if (result->h_addrtype == type && result->h_length == len && ++ ! memcmp (addr, result->h_addr_list[0], len)) ++ break; ++ }, const char *addr, int len, int type) +diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-netgrp.c glibc-2.1.3/glibc-compat/nss_files/files-netgrp.c +--- ../glibc-2.1.3/glibc-compat/nss_files/files-netgrp.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_files/files-netgrp.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,268 @@ ++/* Netgroup file parser in nss_files modules. ++ Copyright (C) 1996, 1997 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. ++ ++ 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. */ ++ ++#include <ctype.h> ++#include <errno.h> ++#include <netdb.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include "nsswitch.h" ++#include "netgroup.h" ++ ++#define DATAFILE "/etc/netgroup" ++ ++ ++#define EXPAND(needed) \ ++ do \ ++ { \ ++ size_t old_cursor = result->cursor - result->data; \ ++ \ ++ result->data_size += 512 > 2 * needed ? 512 : 2 * needed; \ ++ result->data = realloc (result->data, result->data_size); \ ++ \ ++ if (result->data == NULL) \ ++ { \ ++ status = NSS_STATUS_UNAVAIL; \ ++ goto the_end; \ ++ } \ ++ \ ++ result->cursor = result->data + old_cursor; \ ++ } \ ++ while (0) ++ ++ ++enum nss_status ++_nss_files_setnetgrent (const char *group, struct __netgrent *result) ++{ ++ FILE *fp; ++ enum nss_status status; ++ ++ if (group[0] == '\0') ++ return NSS_STATUS_UNAVAIL; ++ ++ /* Find the netgroups file and open it. */ ++ fp = fopen (DATAFILE, "r"); ++ if (fp == NULL) ++ status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL; ++ else ++ { ++ /* Read the file line by line and try to find the description ++ GROUP. We must take care for long lines. */ ++ char *line = NULL; ++ size_t line_len = 0; ++ const ssize_t group_len = strlen (group); ++ ++ status = NSS_STATUS_NOTFOUND; ++ result->cursor = result->data; ++ ++ while (!feof (fp)) ++ { ++ ssize_t curlen = getline (&line, &line_len, fp); ++ int found; ++ ++ if (curlen < 0) ++ { ++ status = NSS_STATUS_NOTFOUND; ++ break; ++ } ++ ++ found = (curlen > group_len && strncmp (line, group, group_len) == 0 ++ && isspace (line[group_len])); ++ ++ /* Read the whole line (including continuation) and store it ++ if FOUND in nonzero. Otherwise we don't need it. */ ++ if (found) ++ { ++ /* Store the data from the first line. */ ++ EXPAND (curlen - group_len); ++ memcpy (result->cursor, &line[group_len + 1], ++ curlen - group_len); ++ result->cursor += (curlen - group_len) - 1; ++ } ++ ++ while (line[curlen - 1] == '\n' && line[curlen - 2] == '\\') ++ { ++ /* Yes, we have a continuation line. */ ++ if (found) ++ /* Remove these characters from the stored line. */ ++ result->cursor -= 2; ++ ++ /* Get next line. */ ++ curlen = getline (&line, &line_len, fp); ++ if (curlen <= 0) ++ break; ++ ++ if (found) ++ { ++ /* Make sure we have enough room. */ ++ EXPAND (1 + curlen + 1); ++ ++ /* Add separator in case next line starts immediately. */ ++ *result->cursor++ = ' '; ++ ++ /* Copy new line. */ ++ memcpy (result->cursor, line, curlen + 1); ++ result->cursor += curlen; ++ } ++ } ++ ++ if (found) ++ { ++ /* Now we have read the line. */ ++ status = NSS_STATUS_SUCCESS; ++ result->cursor = result->data; ++ result->first = 1; ++ break; ++ } ++ } ++ ++ the_end: ++ /* We don't need the file and the line buffer anymore. */ ++ free (line); ++ fclose (fp); ++ } ++ ++ return status; ++} ++ ++ ++int ++_nss_files_endnetgrent (struct __netgrent *result) ++{ ++ /* Free allocated memory for data if some is present. */ ++ if (result->data != NULL) ++ { ++ free (result->data); ++ result->data = NULL; ++ result->data_size = 0; ++ result->cursor = NULL; ++ } ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++ ++enum nss_status ++_nss_netgroup_parseline (char **cursor, struct __netgrent *result, ++ char *buffer, int buflen) ++{ ++ enum nss_status status; ++ const char *host, *user, *domain; ++ char *cp = *cursor; ++ ++ /* Some sanity checks. */ ++ if (cp == NULL) ++ return NSS_STATUS_NOTFOUND; ++ ++ /* First skip leading spaces. */ ++ while (isspace (*cp)) ++ ++cp; ++ ++ if (*cp != '(') ++ { ++ /* We have a list of other netgroups. */ ++ char *name = cp; ++ ++ while (*cp != '\0' && ! isspace (*cp)) ++ ++cp; ++ ++ if (name != cp) ++ { ++ /* It is another netgroup name. */ ++ int last = *cp == '\0'; ++ ++ result->type = group_val; ++ result->val.group = name; ++ *cp = '\0'; ++ if (! last) ++ ++cp; ++ *cursor = cp; ++ result->first = 0; ++ ++ return NSS_STATUS_SUCCESS; ++ } ++ ++ return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; ++ } ++ ++ /* Match host name. */ ++ host = ++cp; ++ while (*cp != ',') ++ if (*cp++ == '\0') ++ return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; ++ ++ /* Match user name. */ ++ user = ++cp; ++ while (*cp != ',') ++ if (*cp++ == '\0') ++ return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; ++ ++ /* Match domain name. */ ++ domain = ++cp; ++ while (*cp != ')') ++ if (*cp++ == '\0') ++ return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN; ++ ++cp; ++ ++ ++ /* When we got here we have found an entry. Before we can copy it ++ to the private buffer we have to make sure it is big enough. */ ++ if (cp - host > buflen) ++ { ++ __set_errno (ERANGE); ++ status = NSS_STATUS_UNAVAIL; ++ } ++ else ++ { ++ memcpy (buffer, host, cp - host); ++ result->type = triple_val; ++ ++ buffer[(user - host) - 1] = '\0'; ++ result->val.triple.host = *host == ',' ? NULL : buffer; ++ ++ buffer[(domain - host) - 1] = '\0'; ++ result->val.triple.user = *user == ',' ? NULL : buffer + (user - host); ++ ++ buffer[(cp - host) - 1] = '\0'; ++ result->val.triple.domain = ++ *domain == ')' ? NULL : buffer + (domain - host); ++ ++ status = NSS_STATUS_SUCCESS; ++ ++ /* Remember where we stopped reading. */ ++ *cursor = cp; ++ ++ result->first = 0; ++ } ++ ++ return status; ++} ++ ++ ++enum nss_status ++_nss_files_getnetgrent_r (struct __netgrent *result, char *buffer, int buflen) ++{ ++ enum nss_status status; ++ ++ status = _nss_netgroup_parseline (&result->cursor, result, buffer, buflen); ++ ++ return status; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-network.c glibc-2.1.3/glibc-compat/nss_files/files-network.c +--- ../glibc-2.1.3/glibc-compat/nss_files/files-network.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_files/files-network.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,56 @@ ++/* Networks file parser in nss_files module. ++ Copyright (C) 1996, 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 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. */ ++ ++#include <netinet/in.h> ++#include <arpa/inet.h> ++#include <netdb.h> ++ ++#define ENTNAME netent ++#define DATABASE "networks" ++ ++struct netent_data {}; ++ ++#define TRAILING_LIST_MEMBER n_aliases ++#define TRAILING_LIST_SEPARATOR_P isspace ++#include "files-parse.c" ++LINE_PARSER ++("#", ++ { ++ char *addr; ++ ++ STRING_FIELD (result->n_name, isspace, 1); ++ ++ STRING_FIELD (addr, isspace, 1); ++ result->n_net = inet_network (addr); ++ result->n_addrtype = AF_INET; ++ ++ }) ++ ++#include "files-XXX.c" ++ ++DB_LOOKUP (netbyname, ,, ++ LOOKUP_NAME_CASE (n_name, n_aliases), ++ const char *name) ++ ++DB_LOOKUP (netbyaddr, ,, ++ { ++ if (result->n_addrtype == type && result->n_net == net) ++ /* Bingo! */ ++ break; ++ }, unsigned long int net, int type) +diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-parse.c glibc-2.1.3/glibc-compat/nss_files/files-parse.c +--- ../glibc-2.1.3/glibc-compat/nss_files/files-parse.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_files/files-parse.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,251 @@ ++/* Common code for file-based database parsers in nss_files module. ++ Copyright (C) 1996, 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 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. */ ++ ++#include <ctype.h> ++#include <errno.h> ++#include <string.h> ++#include <stdlib.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 -- string of the database file's name ("hosts", "passwd"). ++ ++ ENTDATA -- if defined, `struct ENTDATA' is used by the parser to store ++ things pointed to by the resultant `struct STRUCTURE'. ++ ++ NEED_H_ERRNO - defined iff an arg `int *herrnop' is used. ++ ++ Also see files-XXX.c. */ ++ ++#define CONCAT(a,b) CONCAT1(a,b) ++#define CONCAT1(a,b) a##b ++ ++#ifndef STRUCTURE ++# define STRUCTURE ENTNAME ++#endif ++ ++ ++struct parser_data ++ { ++#ifdef ENTDATA ++ struct ENTDATA entdata; ++# define ENTDATA_DECL(data) struct ENTDATA *const entdata = &data->entdata; ++#else ++# define ENTDATA_DECL(data) ++#endif ++ char linebuffer[0]; ++ }; ++ ++#ifdef ENTDATA ++/* The function can't be exported, because the entdata structure ++ is defined only in files-foo.c. */ ++# define parser_stclass static inline ++#else ++/* Export the line parser function so it can be used in nss_db. */ ++# define parser_stclass /* Global */ ++# define parse_line CONCAT(_nss_files_parse_,ENTNAME) ++#endif ++ ++ ++#ifdef EXTERN_PARSER ++ ++/* The parser is defined in a different module. */ ++extern int parse_line (char *line, struct STRUCTURE *result, ++ struct parser_data *data, size_t datalen); ++ ++# define LINE_PARSER(EOLSET, BODY) /* Do nothing */ ++ ++#else ++ ++/* Define a line parsing function. */ ++ ++# define LINE_PARSER(EOLSET, BODY) \ ++parser_stclass int \ ++parse_line (char *line, struct STRUCTURE *result, \ ++ struct parser_data *data, size_t datalen) \ ++{ \ ++ ENTDATA_DECL (data) \ ++ char *p = strpbrk (line, EOLSET "\n"); \ ++ if (p != NULL) \ ++ *p = '\0'; \ ++ BODY; \ ++ TRAILING_LIST_PARSER; \ ++ return 1; \ ++} ++ ++ ++# define STRING_FIELD(variable, terminator_p, swallow) \ ++ { \ ++ variable = line; \ ++ while (*line != '\0' && !terminator_p (*line)) \ ++ ++line; \ ++ if (*line != '\0') \ ++ { \ ++ *line = '\0'; \ ++ do \ ++ ++line; \ ++ while (swallow && terminator_p (*line)); \ ++ } \ ++ } ++ ++# define INT_FIELD(variable, terminator_p, swallow, base, convert) \ ++ { \ ++ char *endp; \ ++ variable = convert (strtoul (line, &endp, base)); \ ++ if (endp == line) \ ++ return 0; \ ++ else if (terminator_p (*endp)) \ ++ do \ ++ ++endp; \ ++ while (swallow && terminator_p (*endp)); \ ++ else if (*endp != '\0') \ ++ return 0; \ ++ line = endp; \ ++ } ++ ++# define INT_FIELD_MAYBE_NULL(variable, terminator_p, swallow, base, convert, default) \ ++ { \ ++ char *endp; \ ++ if (*line == '\0') \ ++ /* We expect some more input, so don't allow the string to end here. */ \ ++ return 0; \ ++ variable = convert (strtoul (line, &endp, base)); \ ++ if (endp == line) \ ++ variable = default; \ ++ if (terminator_p (*endp)) \ ++ do \ ++ ++endp; \ ++ while (swallow && terminator_p (*endp)); \ ++ else if (*endp != '\0') \ ++ return 0; \ ++ line = endp; \ ++ } ++ ++# define ISCOLON(c) ((c) == ':') ++ ++ ++# ifndef TRAILING_LIST_MEMBER ++# define TRAILING_LIST_PARSER /* Nothing to do. */ ++# else ++ ++# define TRAILING_LIST_PARSER \ ++{ \ ++ char **list = parse_list (line, data, datalen); \ ++ if (list) \ ++ result->TRAILING_LIST_MEMBER = list; \ ++ else \ ++ return -1; /* -1 indicates we ran out of space. */ \ ++} ++ ++static inline char ** ++parse_list (char *line, struct parser_data *data, size_t datalen) ++{ ++ char *eol, **list, **p; ++ ++ if (line >= data->linebuffer && line < (char *) data + datalen) ++ /* Find the end of the line buffer, we will use the space in DATA after ++ it for storing the vector of pointers. */ ++ eol = strchr (line, '\0') + 1; ++ else ++ /* LINE does not point within DATA->linebuffer, so that space is ++ not being used for scratch space right now. We can use all of ++ it for the pointer vector storage. */ ++ eol = data->linebuffer; ++ /* Adjust the pointer so it is aligned for storing pointers. */ ++ eol += __alignof__ (char *) - 1; ++ eol -= (eol - (char *) 0) % __alignof__ (char *); ++ /* We will start the storage here for the vector of pointers. */ ++ list = (char **) eol; ++ ++ p = list; ++ while (1) ++ { ++ char *elt; ++ ++ if ((size_t) ((char *) &p[1] - (char *) data) > datalen) ++ { ++ /* We cannot fit another pointer in the buffer. */ ++ __set_errno (ERANGE); ++ return NULL; ++ } ++ if (*line == '\0') ++ break; ++ ++ /* Skip leading white space. This might not be portable but useful. */ ++ while (isspace (*line)) ++ ++line; ++ ++ elt = line; ++ while (1) ++ { ++ if (*line == '\0' || TRAILING_LIST_SEPARATOR_P (*line)) ++ { ++ /* End of the next entry. */ ++ if (line > elt) ++ /* We really found some data. */ ++ *p++ = elt; ++ ++ /* Terminate string if necessary. */ ++ if (*line != '\0') ++ *line++ = '\0'; ++ break; ++ } ++ ++line; ++ } ++ } ++ *p = NULL; ++ ++ return list; ++} ++ ++# endif /* TRAILING_LIST_MEMBER */ ++#endif /* EXTERN_PARSER */ ++ ++ ++#define LOOKUP_NAME(nameelt, aliaselt) \ ++{ \ ++ char **ap; \ ++ if (! strcmp (name, result->nameelt)) \ ++ break; \ ++ for (ap = result->aliaselt; *ap; ++ap) \ ++ if (! strcmp (name, *ap)) \ ++ break; \ ++ if (*ap) \ ++ break; \ ++} ++ ++#define LOOKUP_NAME_CASE(nameelt, aliaselt) \ ++{ \ ++ char **ap; \ ++ if (! __strcasecmp (name, result->nameelt)) \ ++ break; \ ++ for (ap = result->aliaselt; *ap; ++ap) \ ++ if (! __strcasecmp (name, *ap)) \ ++ break; \ ++ if (*ap) \ ++ break; \ ++} ++ ++ ++/* This is defined by db-*.c to include "../nss_db/db-XXX.c" instead. */ ++#ifndef GENERIC ++# define GENERIC "files-XXX.c" ++#endif +diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-proto.c glibc-2.1.3/glibc-compat/nss_files/files-proto.c +--- ../glibc-2.1.3/glibc-compat/nss_files/files-proto.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_files/files-proto.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,47 @@ ++/* Protocols file parser in nss_files module. ++ 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 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. */ ++ ++#include <netdb.h> ++ ++ ++#define ENTNAME protoent ++#define DATABASE "protocols" ++ ++struct protoent_data {}; ++ ++#define TRAILING_LIST_MEMBER p_aliases ++#define TRAILING_LIST_SEPARATOR_P isspace ++#include "files-parse.c" ++LINE_PARSER ++("#", ++ STRING_FIELD (result->p_name, isspace, 1); ++ INT_FIELD (result->p_proto, isspace, 1, 10,); ++ ) ++ ++#include GENERIC ++ ++DB_LOOKUP (protobyname, 1 + strlen (name), (".%s", name), ++ LOOKUP_NAME (p_name, p_aliases), ++ const char *name) ++ ++DB_LOOKUP (protobynumber, 20, ("=%d", proto), ++ { ++ if (result->p_proto == proto) ++ break; ++ }, int proto) +diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-pwd.c glibc-2.1.3/glibc-compat/nss_files/files-pwd.c +--- ../glibc-2.1.3/glibc-compat/nss_files/files-pwd.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_files/files-pwd.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,45 @@ ++/* User file parser in nss_files module. ++ 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 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. */ ++ ++#include <pwd.h> ++ ++#define STRUCTURE passwd ++#define ENTNAME pwent ++#define DATABASE "passwd" ++struct pwent_data {}; ++ ++/* Our parser function is already defined in fgetpwent_r.c, so use that ++ to parse lines from the database file. */ ++#define EXTERN_PARSER ++#include "files-parse.c" ++#include GENERIC ++ ++DB_LOOKUP (pwnam, 1 + strlen (name), (".%s", name), ++ { ++ if (name[0] != '+' && name[0] != '-' ++ && ! strcmp (name, result->pw_name)) ++ break; ++ }, const char *name) ++ ++DB_LOOKUP (pwuid, 20, ("=%lu", (unsigned long int) uid), ++ { ++ if (result->pw_uid == uid && result->pw_name[0] != '+' ++ && result->pw_name[0] != '-') ++ break; ++ }, uid_t uid) +diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-rpc.c glibc-2.1.3/glibc-compat/nss_files/files-rpc.c +--- ../glibc-2.1.3/glibc-compat/nss_files/files-rpc.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_files/files-rpc.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,47 @@ ++/* SunRPC program number file parser in nss_files module. ++ 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 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. */ ++ ++#include <rpc/netdb.h> ++ ++ ++#define ENTNAME rpcent ++#define DATABASE "rpc" ++ ++struct rpcent_data {}; ++ ++#define TRAILING_LIST_MEMBER r_aliases ++#define TRAILING_LIST_SEPARATOR_P isspace ++#include "files-parse.c" ++LINE_PARSER ++("#", ++ STRING_FIELD (result->r_name, isspace, 1); ++ INT_FIELD (result->r_number, isspace, 1, 10,); ++ ) ++ ++#include GENERIC ++ ++DB_LOOKUP (rpcbyname, 1 + strlen (name), (".%s", name), ++ LOOKUP_NAME (r_name, r_aliases), ++ const char *name) ++ ++DB_LOOKUP (rpcbynumber, 20, ("=%d", number), ++ { ++ if (result->r_number == number) ++ break; ++ }, int number) +diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-service.c glibc-2.1.3/glibc-compat/nss_files/files-service.c +--- ../glibc-2.1.3/glibc-compat/nss_files/files-service.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_files/files-service.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,60 @@ ++/* Services file parser in nss_files module. ++ Copyright (C) 1996, 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 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. */ ++ ++#include <netinet/in.h> ++#include <netdb.h> ++ ++ ++#define ENTNAME servent ++#define DATABASE "services" ++ ++struct servent_data {}; ++ ++#define TRAILING_LIST_MEMBER s_aliases ++#define TRAILING_LIST_SEPARATOR_P isspace ++#include "files-parse.c" ++#define ISSLASH(c) ((c) == '/') ++LINE_PARSER ++("#", ++ STRING_FIELD (result->s_name, isspace, 1); ++ INT_FIELD (result->s_port, ISSLASH, 10, 0, htons); ++ STRING_FIELD (result->s_proto, isspace, 1); ++ ) ++ ++#include GENERIC ++ ++DB_LOOKUP (servbyname, 2 + strlen (name) + (proto ? strlen (proto) : 0), ++ (".%s/%s", name, proto ?: ""), ++ { ++ /* Must match both protocol (if specified) and name. */ ++ if (proto != NULL && strcmp (result->s_proto, proto)) ++ continue; ++ LOOKUP_NAME (s_name, s_aliases) ++ }, ++ const char *name, const char *proto) ++ ++DB_LOOKUP (servbyport, 21 + (proto ? strlen (proto) : 0), ++ ("=%d/%s", ntohs (port), proto ?: ""), ++ { ++ /* Must match both port and protocol. */ ++ if (result->s_port == port ++ && (proto == NULL ++ || strcmp (result->s_proto, proto) == 0)) ++ break; ++ }, int port, const char *proto) +diff -Naur ../glibc-2.1.3/glibc-compat/nss_files/files-spwd.c glibc-2.1.3/glibc-compat/nss_files/files-spwd.c +--- ../glibc-2.1.3/glibc-compat/nss_files/files-spwd.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_files/files-spwd.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,38 @@ ++/* User file parser in nss_files module. ++ 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 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. */ ++ ++#include <shadow.h> ++ ++#define STRUCTURE spwd ++#define ENTNAME spent ++#define DATABASE "shadow" ++struct spent_data {}; ++ ++/* Our parser function is already defined in sgetspent_r.c, so use that ++ to parse lines from the database file. */ ++#define EXTERN_PARSER ++#include "files-parse.c" ++#include GENERIC ++ ++DB_LOOKUP (spnam, 1 + strlen (name), (".%s", name), ++ { ++ if (name[0] != '+' && name[0] != '-' ++ && ! strcmp (name, result->sp_namp)) ++ break; ++ }, const char *name) +diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-alias.c glibc-2.1.3/glibc-compat/nss_nis/nis-alias.c +--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-alias.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_nis/nis-alias.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,278 @@ ++/* Copyright (C) 1996, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996. ++ ++ 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. */ ++ ++#include <nss.h> ++#include <ctype.h> ++#include <errno.h> ++#include <string.h> ++#include <aliases.h> ++#include <bits/libc-lock.h> ++#include <rpcsvc/yp.h> ++#include <rpcsvc/ypclnt.h> ++ ++#include "nss-nis.h" ++ ++__libc_lock_define_initialized (static, lock) ++ ++static bool_t new_start = 1; ++static char *oldkey = NULL; ++static int oldkeylen = 0; ++ ++static int ++_nss_nis_parse_aliasent (const char *key, char *alias, struct aliasent *result, ++ char *buffer, size_t buflen) ++{ ++ char *first_unused = buffer + strlen (alias) + 1; ++ size_t room_left = ++ buflen - (buflen % __alignof__ (char *)) - strlen (alias) - 2; ++ char *line; ++ char *cp; ++ ++ result->alias_members_len = 0; ++ *first_unused = '\0'; ++ first_unused++; ++ strcpy (first_unused, key); ++ ++ if (first_unused[room_left - 1] != '\0') ++ { ++ /* The line is too long for our buffer. */ ++ no_more_room: ++ __set_errno (ERANGE); ++ return -1; ++ } ++ ++ result->alias_name = first_unused; ++ ++ /* Terminate the line for any case. */ ++ cp = strpbrk (alias, "#\n"); ++ if (cp != NULL) ++ *cp = '\0'; ++ ++ first_unused += strlen (result->alias_name) + 1; ++ /* Adjust the pointer so it is aligned for ++ storing pointers. */ ++ first_unused += __alignof__ (char *) - 1; ++ first_unused -= ((first_unused - (char *) 0) % __alignof__ (char *)); ++ result->alias_members = (char **) first_unused; ++ ++ line = alias; ++ ++ while (*line != '\0') ++ { ++ /* Skip leading blanks. */ ++ while (isspace (*line)) ++ line++; ++ ++ if (*line == '\0') ++ break; ++ ++ if (room_left < sizeof (char *)) ++ goto no_more_room; ++ room_left -= sizeof (char *); ++ result->alias_members[result->alias_members_len] = line; ++ ++ while (*line != '\0' && *line != ',') ++ line++; ++ ++ if (line != result->alias_members[result->alias_members_len]) ++ { ++ *line = '\0'; ++ line++; ++ result->alias_members_len++; ++ } ++ } ++ return result->alias_members_len == 0 ? 0 : 1; ++} ++ ++enum nss_status ++_nss_nis_setaliasent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ new_start = 1; ++ if (oldkey != NULL) ++ { ++ free (oldkey); ++ oldkey = NULL; ++ oldkeylen = 0; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_endaliasent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ new_start = 1; ++ if (oldkey != NULL) ++ { ++ free (oldkey); ++ oldkey = NULL; ++ oldkeylen = 0; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++static enum nss_status ++internal_nis_getaliasent_r (struct aliasent *alias, char *buffer, ++ size_t buflen) ++{ ++ char *domain; ++ char *result; ++ int len; ++ char *outkey; ++ int keylen; ++ char *p; ++ int parse_res; ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ alias->alias_local = 0; ++ ++ /* Get the next entry until we found a correct one. */ ++ do ++ { ++ enum nss_status retval; ++ ++ if (new_start) ++ retval = yperr2nss (yp_first (domain, "mail.aliases", ++ &outkey, &keylen, &result, &len)); ++ else ++ retval = yperr2nss ( yp_next (domain, "mail.aliases", oldkey, ++ oldkeylen, &outkey, &keylen, ++ &result, &len)); ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_nis_parse_aliasent (outkey, p, alias, buffer, buflen); ++ if (parse_res == -1) ++ { ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ free (oldkey); ++ oldkey = outkey; ++ oldkeylen = keylen; ++ new_start = 0; ++ } ++ while (!parse_res); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_getaliasent_r (struct aliasent *alias, char *buffer, size_t buflen) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_nis_getaliasent_r (alias, buffer, buflen); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++enum nss_status ++_nss_nis_getaliasbyname_r (const char *name, struct aliasent *alias, ++ char *buffer, size_t buflen) ++{ ++ enum nss_status retval; ++ int parse_res; ++ char *domain; ++ char *result; ++ int len; ++ char *p; ++ size_t namlen = strlen (name); ++ char name2[namlen + 1]; ++ int i; ++ ++ if (name == NULL) ++ { ++ __set_errno (EINVAL); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ /* Convert name to lowercase. */ ++ for (i = 0; i < namlen; ++i) ++ name2[i] = tolower (name[i]); ++ name2[i] = '\0'; ++ ++ retval = yperr2nss (yp_match (domain, "mail.aliases", name, namlen, ++ &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ alias->alias_local = 0; ++ parse_res = _nss_nis_parse_aliasent (name, p, alias, buffer, buflen); ++ if (parse_res == -1) ++ return NSS_STATUS_TRYAGAIN; ++ else ++ if (parse_res == 0) ++ return NSS_STATUS_NOTFOUND; ++ else ++ return NSS_STATUS_SUCCESS; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-ethers.c glibc-2.1.3/glibc-compat/nss_nis/nis-ethers.c +--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-ethers.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_nis/nis-ethers.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,299 @@ ++/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996. ++ ++ 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. */ ++ ++#include <nss.h> ++#include <ctype.h> ++#include <errno.h> ++#include <string.h> ++#include <bits/libc-lock.h> ++#include <rpcsvc/yp.h> ++#include <rpcsvc/ypclnt.h> ++#include <netinet/if_ether.h> ++ ++#include "nss-nis.h" ++ ++/* Protect global state against multiple changers */ ++__libc_lock_define_initialized (static, lock) ++ ++struct ether ++{ ++ const char *e_name; ++ struct ether_addr e_addr; ++}; ++ ++/* Get the declaration of the parser function. */ ++#define ENTNAME etherent ++#define STRUCTURE ether ++#define EXTERN_PARSER ++#include "../nss_files/files-parse.c" ++ ++struct response ++{ ++ char *val; ++ struct response *next; ++}; ++ ++static struct response *start = NULL; ++static struct response *next = NULL; ++ ++static int ++saveit (int instatus, char *inkey, int inkeylen, char *inval, ++ int invallen, char *indata) ++{ ++ if (instatus != YP_TRUE) ++ return instatus; ++ ++ if (inkey && inkeylen > 0 && inval && invallen > 0) ++ { ++ if (start == NULL) ++ { ++ start = malloc (sizeof (struct response)); ++ next = start; ++ } ++ else ++ { ++ next->next = malloc (sizeof (struct response)); ++ next = next->next; ++ } ++ next->next = NULL; ++ next->val = malloc (invallen + 1); ++ strncpy (next->val, inval, invallen); ++ next->val[invallen] = '\0'; ++ } ++ ++ return 0; ++} ++ ++enum nss_status ++internal_nis_setetherent (void) ++{ ++ char *domainname; ++ struct ypall_callback ypcb; ++ enum nss_status status; ++ ++ yp_get_default_domain (&domainname); ++ ++ while (start != NULL) ++ { ++ if (start->val != NULL) ++ free (start->val); ++ next = start; ++ start = start->next; ++ free (next); ++ } ++ start = NULL; ++ ++ ypcb.foreach = saveit; ++ ypcb.data = NULL; ++ status = yperr2nss (yp_all (domainname, "ethers.byname", &ypcb)); ++ next = start; ++ ++ return status; ++} ++ ++enum nss_status ++_nss_nis_setetherent (void) ++{ ++ enum nss_status result; ++ ++ __libc_lock_lock (lock); ++ ++ result = internal_nis_setetherent (); ++ ++ __libc_lock_unlock (lock); ++ ++ return result; ++} ++ ++enum nss_status ++_nss_nis_endetherent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ while (start != NULL) ++ { ++ if (start->val != NULL) ++ free (start->val); ++ next = start; ++ start = start->next; ++ free (next); ++ } ++ start = NULL; ++ next = NULL; ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++static enum nss_status ++internal_nis_getetherent_r (struct ether *eth, char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ int parse_res; ++ ++ if (start == NULL) ++ internal_nis_setetherent (); ++ ++ /* Get the next entry until we found a correct one. */ ++ do ++ { ++ char *p; ++ ++ if (next == NULL) ++ return NSS_STATUS_NOTFOUND; ++ p = strncpy (buffer, next->val, buflen); ++ next = next->next; ++ ++ while (isspace (*p)) ++ ++p; ++ ++ parse_res = _nss_files_parse_etherent (p, eth, data, buflen); ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ } ++ while (!parse_res); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_getetherent_r (struct ether *result, char *buffer, size_t buflen) ++{ ++ int status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_nis_getetherent_r (result, buffer, buflen); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++enum nss_status ++_nss_nis_gethostton_r (const char *name, struct ether *eth, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ enum nss_status retval; ++ char *domain, *result, *p; ++ int len, parse_res; ++ ++ if (name == NULL) ++ { ++ __set_errno (EINVAL); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ retval = yperr2nss (yp_match (domain, "ethers.byname", name, ++ strlen (name), &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_etherent (p, eth, data, buflen); ++ ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ else if (parse_res == 0) ++ return NSS_STATUS_NOTFOUND; ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_getntohost_r (struct ether_addr *addr, struct ether *eth, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ enum nss_status retval; ++ char *domain, *result, *p; ++ int len, nlen, parse_res; ++ char buf[33]; ++ ++ if (addr == NULL) ++ { ++ __set_errno (EINVAL); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ nlen = sprintf (buf, "%x:%x:%x:%x:%x:%x", ++ (int) addr->ether_addr_octet[0], ++ (int) addr->ether_addr_octet[1], ++ (int) addr->ether_addr_octet[2], ++ (int) addr->ether_addr_octet[3], ++ (int) addr->ether_addr_octet[4], ++ (int) addr->ether_addr_octet[5]); ++ ++ retval = yperr2nss (yp_match (domain, "ethers.byaddr", buf, ++ nlen, &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_etherent (p, eth, data, buflen); ++ ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ else if (parse_res == 0) ++ return NSS_STATUS_NOTFOUND; ++ ++ return NSS_STATUS_SUCCESS; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-grp.c glibc-2.1.3/glibc-compat/nss_nis/nis-grp.c +--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-grp.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_nis/nis-grp.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,249 @@ ++/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996. ++ ++ 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. */ ++ ++#include <nss.h> ++#include <grp.h> ++#include <ctype.h> ++#include <errno.h> ++#include <string.h> ++#include <bits/libc-lock.h> ++#include <rpcsvc/yp.h> ++#include <rpcsvc/ypclnt.h> ++ ++#include "nss-nis.h" ++ ++/* Get the declaration of the parser function. */ ++#define ENTNAME grent ++#define STRUCTURE group ++#define EXTERN_PARSER ++#include "../nss_files/files-parse.c" ++ ++/* Protect global state against multiple changers */ ++__libc_lock_define_initialized (static, lock) ++ ++static bool_t new_start = 1; ++static char *oldkey = NULL; ++static int oldkeylen = 0; ++ ++enum nss_status ++_nss_nis_setgrent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ new_start = 1; ++ if (oldkey != NULL) ++ { ++ free (oldkey); ++ oldkey = NULL; ++ oldkeylen = 0; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_endgrent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ new_start = 1; ++ if (oldkey != NULL) ++ { ++ free (oldkey); ++ oldkey = NULL; ++ oldkeylen = 0; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++static enum nss_status ++internal_nis_getgrent_r (struct group *grp, char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ char *domain, *result, *outkey; ++ int len, keylen, parse_res; ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ /* Get the next entry until we found a correct one. */ ++ do ++ { ++ enum nss_status retval; ++ char *p; ++ ++ if (new_start) ++ retval = yperr2nss (yp_first (domain, "group.byname", ++ &outkey, &keylen, &result, &len)); ++ else ++ retval = yperr2nss ( yp_next (domain, "group.byname", ++ oldkey, oldkeylen, ++ &outkey, &keylen, &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_grent (p, grp, data, buflen); ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ ++ free (oldkey); ++ oldkey = outkey; ++ oldkeylen = keylen; ++ new_start = 0; ++ } ++ while (!parse_res); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_getgrent_r (struct group *result, char *buffer, size_t buflen) ++{ ++ int status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_nis_getgrent_r (result, buffer, buflen); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++enum nss_status ++_nss_nis_getgrnam_r (const char *name, struct group *grp, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ enum nss_status retval; ++ char *domain, *result, *p; ++ int len, parse_res; ++ ++ if (name == NULL) ++ { ++ __set_errno (EINVAL); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ retval = yperr2nss (yp_match (domain, "group.byname", name, ++ strlen (name), &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_grent (p, grp, data, buflen); ++ ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ else if (parse_res == 0) ++ return NSS_STATUS_NOTFOUND; ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_getgrgid_r (gid_t gid, struct group *grp, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ enum nss_status retval; ++ char *domain, *result, *p; ++ int len, nlen, parse_res; ++ char buf[32]; ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ nlen = sprintf (buf, "%d", gid); ++ ++ retval = yperr2nss (yp_match (domain, "group.bygid", buf, ++ nlen, &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_grent (p, grp, data, buflen); ++ ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ else if (parse_res == 0) ++ return NSS_STATUS_NOTFOUND; ++ ++ return NSS_STATUS_SUCCESS; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-hosts.c glibc-2.1.3/glibc-compat/nss_nis/nis-hosts.c +--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-hosts.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_nis/nis-hosts.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,417 @@ ++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996. ++ ++ 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. */ ++ ++#include <nss.h> ++#include <ctype.h> ++#include <netdb.h> ++#include <string.h> ++#include <netinet/in.h> ++#include <arpa/inet.h> ++#include <resolv.h> ++#include <bits/libc-lock.h> ++#include <rpcsvc/yp.h> ++#include <rpcsvc/ypclnt.h> ++ ++#include "nss-nis.h" ++ ++/* Get implementation for some internal functions. */ ++#include "../../resolv/mapv4v6addr.h" ++#include "../../resolv/mapv4v6hostent.h" ++ ++#define ENTNAME hostent ++#define DATABASE "hosts" ++#define NEED_H_ERRNO ++ ++#define ENTDATA hostent_data ++struct hostent_data ++ { ++ unsigned char host_addr[16]; /* IPv4 or IPv6 address. */ ++ char *h_addr_ptrs[2]; /* Points to that and null terminator. */ ++ }; ++ ++#define TRAILING_LIST_MEMBER h_aliases ++#define TRAILING_LIST_SEPARATOR_P isspace ++#include "../nss_files/files-parse.c" ++LINE_PARSER ++("#", ++ { ++ char *addr; ++ ++ STRING_FIELD (addr, isspace, 1); ++ ++ /* Parse address. */ ++ if ((_res.options & RES_USE_INET6) ++ && inet_pton (AF_INET6, addr, entdata->host_addr) > 0) ++ { ++ result->h_addrtype = AF_INET6; ++ result->h_length = IN6ADDRSZ; ++ } ++ else ++ if (inet_pton (AF_INET, addr, entdata->host_addr) > 0) ++ { ++ if (_res.options & RES_USE_INET6) ++ { ++ map_v4v6_address ((char *) entdata->host_addr, ++ (char *) entdata->host_addr); ++ result->h_addrtype = AF_INET6; ++ result->h_length = IN6ADDRSZ; ++ } ++ else ++ { ++ result->h_addrtype = AF_INET; ++ result->h_length = INADDRSZ; ++ } ++ } ++ else ++ /* Illegal address: ignore line. */ ++ return 0; ++ ++ /* Store a pointer to the address in the expected form. */ ++ entdata->h_addr_ptrs[0] = entdata->host_addr; ++ entdata->h_addr_ptrs[1] = NULL; ++ result->h_addr_list = entdata->h_addr_ptrs; ++ ++ /* If we need the host entry in IPv6 form change it now. */ ++ if (_res.options & RES_USE_INET6) ++ { ++ char *bufptr = data->linebuffer; ++ size_t buflen = (char *) data + datalen - bufptr; ++ int ibuflen = buflen; /* Use this for machines with size_t > int. */ ++ map_v4v6_hostent (result, &bufptr, &ibuflen); ++ buflen = ibuflen; ++ } ++ ++ STRING_FIELD (result->h_name, isspace, 1); ++ } ++) ++ ++__libc_lock_define_initialized (static, lock) ++ ++static bool_t new_start = 1; ++static char *oldkey = NULL; ++static int oldkeylen = 0; ++ ++enum nss_status ++_nss_nis_sethostent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ new_start = 1; ++ if (oldkey != NULL) ++ { ++ free (oldkey); ++ oldkey = NULL; ++ oldkeylen = 0; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_endhostent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ new_start = 1; ++ if (oldkey != NULL) ++ { ++ free (oldkey); ++ oldkey = NULL; ++ oldkeylen = 0; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++static enum nss_status ++internal_nis_gethostent_r (struct hostent *host, char *buffer, ++ size_t buflen, int *h_errnop) ++{ ++ char *domain; ++ char *result; ++ int len, parse_res; ++ char *outkey; ++ int keylen; ++ struct parser_data *data = (void *) buffer; ++ size_t linebuflen = buffer + buflen - data->linebuffer; ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ if (buflen < sizeof *data + 1) ++ { ++ __set_errno (ERANGE); ++ *h_errnop = NETDB_INTERNAL; ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ /* Get the next entry until we found a correct one. */ ++ do ++ { ++ enum nss_status retval; ++ char *p; ++ ++ if (new_start) ++ retval = yperr2nss (yp_first (domain, "hosts.byname", ++ &outkey, &keylen, &result, &len)); ++ else ++ retval = yperr2nss ( yp_next (domain, "hosts.byname", ++ oldkey, oldkeylen, ++ &outkey, &keylen, &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ switch (retval) ++ { ++ case NSS_STATUS_TRYAGAIN: ++ __set_errno (EAGAIN); ++ *h_errnop = TRY_AGAIN; ++ break; ++ case NSS_STATUS_NOTFOUND: ++ *h_errnop = HOST_NOT_FOUND; ++ break; ++ default: ++ *h_errnop = NO_RECOVERY; ++ break; ++ } ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > linebuflen) ++ { ++ free (result); ++ *h_errnop = NETDB_INTERNAL; ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (data->linebuffer, result, len); ++ data->linebuffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = parse_line (p, host, data, buflen); ++ if (parse_res == -1 && errno == ERANGE) ++ { ++ *h_errnop = NETDB_INTERNAL;; ++ return NSS_STATUS_TRYAGAIN; ++ } ++ free (oldkey); ++ oldkey = outkey; ++ oldkeylen = keylen; ++ new_start = 0; ++ } ++ while (!parse_res); ++ ++ *h_errnop = NETDB_SUCCESS; ++ return NSS_STATUS_SUCCESS; ++} ++ ++int ++_nss_nis_gethostent_r (struct hostent *host, char *buffer, size_t buflen, ++ int *h_errnop) ++{ ++ int status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_nis_gethostent_r (host, buffer, buflen, h_errnop); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++enum nss_status ++_nss_nis_gethostbyname2_r (const char *name, int af, struct hostent *host, ++ char *buffer, size_t buflen, int *h_errnop) ++{ ++ enum nss_status retval; ++ char *domain, *result, *p; ++ int len, parse_res; ++ struct parser_data *data = (void *) buffer; ++ size_t linebuflen = buffer + buflen - data->linebuffer; ++ ++ if (name == NULL) ++ { ++ __set_errno (EINVAL); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ if (buflen < sizeof *data + 1) ++ { ++ *h_errnop = NETDB_INTERNAL; ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ else ++ { ++ /* Convert name to lowercase. */ ++ size_t namelen = strlen (name); ++ char name2[namelen + 1]; ++ int i; ++ ++ for (i = 0; i < namelen; ++i) ++ name2[i] = tolower (name[i]); ++ name2[i] = '\0'; ++ ++ retval = yperr2nss (yp_match (domain, "hosts.byname", name2, ++ namelen, &result, &len)); ++ ++ } ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ { ++ *h_errnop = TRY_AGAIN; ++ __set_errno (EAGAIN); ++ } ++ if (retval == NSS_STATUS_NOTFOUND) ++ *h_errnop = HOST_NOT_FOUND; ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > linebuflen) ++ { ++ free (result); ++ *h_errnop = NETDB_INTERNAL; ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (data->linebuffer, result, len); ++ data->linebuffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = parse_line (p, host, data, buflen); ++ ++ if (parse_res == -1 && errno == ERANGE) ++ { ++ *h_errnop = NETDB_INTERNAL; ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ if (parse_res == 0 || host->h_addrtype != af) ++ { ++ *h_errnop = HOST_NOT_FOUND; ++ return NSS_STATUS_NOTFOUND; ++ } ++ ++ *h_errnop = NETDB_SUCCESS; ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_gethostbyname_r (const char *name, struct hostent *host, ++ char *buffer, size_t buflen, int *h_errnop) ++{ ++ if (_res.options & RES_USE_INET6) ++ { ++ enum nss_status status; ++ ++ status = _nss_nis_gethostbyname2_r (name, AF_INET6, host, buffer, buflen, ++ h_errnop); ++ if (status == NSS_STATUS_SUCCESS) ++ return status; ++ } ++ ++ return _nss_nis_gethostbyname2_r (name, AF_INET, host, buffer, buflen, ++ h_errnop); ++} ++ ++enum nss_status ++_nss_nis_gethostbyaddr_r (char *addr, int addrlen, int type, ++ struct hostent *host, char *buffer, size_t buflen, ++ int *h_errnop) ++{ ++ enum nss_status retval; ++ char *domain, *result, *p; ++ int len, parse_res; ++ char *buf; ++ struct parser_data *data = (void *) buffer; ++ size_t linebuflen = buffer + buflen - data->linebuffer; ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ if (buflen < sizeof *data + 1) ++ { ++ __set_errno (ERANGE); ++ *h_errnop = NETDB_INTERNAL; ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ buf = inet_ntoa (*(struct in_addr *) addr); ++ ++ retval = yperr2nss (yp_match (domain, "hosts.byaddr", buf, ++ strlen (buf), &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ { ++ *h_errnop = TRY_AGAIN; ++ __set_errno (EAGAIN); ++ } ++ if (retval == NSS_STATUS_NOTFOUND) ++ *h_errnop = HOST_NOT_FOUND; ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > linebuflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ *h_errnop = NETDB_INTERNAL; ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (data->linebuffer, result, len); ++ data->linebuffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = parse_line (p, host, data, buflen); ++ ++ if (parse_res == -1 && errno == ERANGE) ++ { ++ *h_errnop = NETDB_INTERNAL; ++ return NSS_STATUS_TRYAGAIN; ++ } ++ else if (parse_res == 0) ++ { ++ *h_errnop = HOST_NOT_FOUND; ++ return NSS_STATUS_NOTFOUND; ++ } ++ ++ *h_errnop = NETDB_SUCCESS; ++ return NSS_STATUS_SUCCESS; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-netgrp.c glibc-2.1.3/glibc-compat/nss_nis/nis-netgrp.c +--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-netgrp.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_nis/nis-netgrp.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,128 @@ ++/* Copyright (C) 1996 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996. ++ ++ 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. */ ++ ++#include <nss.h> ++#include <ctype.h> ++#include <errno.h> ++#include <bits/libc-lock.h> ++#include <netdb.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <netgroup.h> ++#include <rpcsvc/yp.h> ++#include <rpcsvc/ypclnt.h> ++ ++#include "nss-nis.h" ++ ++/* Locks the static variables in this file. */ ++__libc_lock_define_initialized (static, lock) ++ ++static char *data = NULL; ++static size_t data_size = 0; ++static char *cursor = NULL;; ++ ++extern enum nss_status ++_nss_netgroup_parseline (char **cursor, struct __netgrent *result, ++ char *buffer, size_t buflen); ++ ++enum nss_status ++_nss_nis_setnetgrent (char *group) ++{ ++ char *domain; ++ char *result; ++ int len, group_len; ++ enum nss_status status; ++ ++ status = NSS_STATUS_SUCCESS; ++ ++ if (group[0] == '\0') ++ return NSS_STATUS_UNAVAIL; ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ __libc_lock_lock (lock); ++ ++ if (data != NULL) ++ { ++ free (data); ++ data = NULL; ++ data_size = 0; ++ cursor = NULL; ++ } ++ ++ group_len = strlen (group); ++ ++ status = yperr2nss (yp_match (domain, "netgroup", group, group_len, ++ &result, &len)); ++ if (status == NSS_STATUS_SUCCESS) ++ { ++ if (len > 0) ++ { ++ data = malloc (len + 1); ++ data_size = len; ++ cursor = strncpy (data, result, len + 1); ++ data[len] = '\0'; ++ free (result); ++ } ++ else ++ status = NSS_STATUS_NOTFOUND; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++ ++enum nss_status ++_nss_nis_endnetgrent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ if (data != NULL) ++ { ++ free (data); ++ data = NULL; ++ data_size = 0; ++ cursor = NULL; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_getnetgrent_r (struct __netgrent *result, char *buffer, size_t buflen) ++{ ++ enum nss_status status; ++ ++ if (cursor == NULL) ++ return NSS_STATUS_NOTFOUND; ++ ++ __libc_lock_lock (lock); ++ ++ status = _nss_netgroup_parseline (&cursor, result, buffer, buflen); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-network.c glibc-2.1.3/glibc-compat/nss_nis/nis-network.c +--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-network.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_nis/nis-network.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,318 @@ ++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996. ++ ++ 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. */ ++ ++#include <nss.h> ++#include <netdb.h> ++#include <ctype.h> ++#include <errno.h> ++#include <string.h> ++#include <netinet/in.h> ++#include <arpa/inet.h> ++#include <bits/libc-lock.h> ++#include <rpcsvc/yp.h> ++#include <rpcsvc/ypclnt.h> ++ ++#include "nss-nis.h" ++ ++/* Get the declaration of the parser function. */ ++#define ENTNAME netent ++#define EXTERN_PARSER ++#include "../nss_files/files-parse.c" ++ ++__libc_lock_define_initialized (static, lock) ++ ++static bool_t new_start = 1; ++static char *oldkey = NULL; ++static int oldkeylen = 0; ++ ++enum nss_status ++_nss_nis_setnetent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ new_start = 1; ++ if (oldkey != NULL) ++ { ++ free (oldkey); ++ oldkey = NULL; ++ oldkeylen = 0; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_endnetent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ new_start = 1; ++ if (oldkey != NULL) ++ { ++ free (oldkey); ++ oldkey = NULL; ++ oldkeylen = 0; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++static enum nss_status ++internal_nis_getnetent_r (struct netent *net, char *buffer, size_t buflen, ++ int *herrnop) ++{ ++ struct parser_data *data = (void *) buffer; ++ char *domain, *result, *outkey; ++ int len, keylen, parse_res; ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ /* Get the next entry until we found a correct one. */ ++ do ++ { ++ enum nss_status retval; ++ char *p; ++ ++ if (new_start) ++ retval = yperr2nss (yp_first (domain, "networks.byname", ++ &outkey, &keylen, &result, &len)); ++ else ++ retval = yperr2nss ( yp_next (domain, "networks.byname", ++ oldkey, oldkeylen, ++ &outkey, &keylen, &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ { ++ *herrnop = NETDB_INTERNAL; ++ __set_errno (EAGAIN); ++ } ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ *herrnop = NETDB_INTERNAL; ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_netent (p, net, data, buflen); ++ if (parse_res == -1 && errno == ERANGE) ++ { ++ *herrnop = NETDB_INTERNAL; ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ free (oldkey); ++ oldkey = outkey; ++ oldkeylen = keylen; ++ new_start = 0; ++ } ++ while (!parse_res); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_getnetent_r (struct netent *net, char *buffer, size_t buflen, ++ int *herrnop) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_nis_getnetent_r (net, buffer, buflen, herrnop); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++enum nss_status ++_nss_nis_getnetbyname_r (const char *name, struct netent *net, ++ char *buffer, size_t buflen, int *herrnop) ++{ ++ enum nss_status retval; ++ struct parser_data *data = (void *) buffer; ++ char *domain, *result, *p; ++ int len, parse_res; ++ ++ if (name == NULL) ++ { ++ __set_errno (EINVAL); ++ *herrnop = NETDB_INTERNAL; ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ if (buflen < sizeof *data + 1) ++ { ++ *herrnop = NETDB_INTERNAL; ++ __set_errno(ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ else ++ { ++ /* Convert name to lowercase. */ ++ size_t namlen = strlen (name); ++ char name2[namlen + 1]; ++ int i; ++ ++ for (i = 0; i < namlen; ++i) ++ name2[i] = tolower (name[i]); ++ name2[i] = '\0'; ++ ++ retval = yperr2nss (yp_match (domain, "networks.byname", name2, ++ namlen, &result, &len)); ++ } ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ { ++ __set_errno (EAGAIN); ++ *herrnop = NETDB_INTERNAL; ++ } ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ *herrnop = NETDB_INTERNAL; ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_netent (p, net, data, buflen); ++ ++ if (parse_res <= 0) ++ { ++ *herrnop = NETDB_INTERNAL; ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ else ++ return NSS_STATUS_NOTFOUND; ++ } ++ else ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_getnetbyaddr_r (unsigned long addr, int type, struct netent *net, ++ char *buffer, size_t buflen, int *herrnop) ++{ ++ struct parser_data *data = (void *) buffer; ++ char *domain; ++ char *result; ++ int len; ++ char buf[256]; ++ int blen; ++ struct in_addr in; ++ char *p; ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ in = inet_makeaddr (addr, 0); ++ strcpy (buf, inet_ntoa (in)); ++ blen = strlen (buf); ++ ++ while (1) ++ { ++ enum nss_status retval; ++ int parse_res; ++ ++ retval = yperr2nss (yp_match (domain, "networks.byaddr", buf, ++ strlen (buf), &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_NOTFOUND) ++ { ++ if (buf[blen - 2] == '.' && buf[blen - 1] == '0') ++ { ++ /* Try again, but with trailing dot(s) ++ removed (one by one) */ ++ buf[blen - 2] = '\0'; ++ blen -= 2; ++ continue; ++ } ++ else ++ return NSS_STATUS_NOTFOUND; ++ } ++ else ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ } ++ ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ *herrnop = NETDB_INTERNAL; ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_netent (p, net, data, buflen); ++ ++ ++ if (parse_res <= 0) ++ { ++ *herrnop = NETDB_INTERNAL; ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ else ++ return NSS_STATUS_NOTFOUND; ++ } ++ else ++ return NSS_STATUS_SUCCESS; ++ } ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-proto.c glibc-2.1.3/glibc-compat/nss_nis/nis-proto.c +--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-proto.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_nis/nis-proto.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,280 @@ ++/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996. ++ ++ 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. */ ++ ++#include <nss.h> ++#include <netdb.h> ++#include <ctype.h> ++#include <errno.h> ++#include <string.h> ++#include <bits/libc-lock.h> ++#include <rpcsvc/yp.h> ++#include <rpcsvc/ypclnt.h> ++ ++#include "nss-nis.h" ++ ++/* Get the declaration of the parser function. */ ++#define ENTNAME protoent ++#define EXTERN_PARSER ++#include "../nss_files/files-parse.c" ++ ++__libc_lock_define_initialized (static, lock) ++ ++struct response ++{ ++ char *val; ++ struct response *next; ++}; ++ ++static struct response *start = NULL; ++static struct response *next = NULL; ++ ++static int ++saveit (int instatus, char *inkey, int inkeylen, char *inval, ++ int invallen, char *indata) ++{ ++ if (instatus != YP_TRUE) ++ return instatus; ++ ++ if (inkey && inkeylen > 0 && inval && invallen > 0) ++ { ++ if (start == NULL) ++ { ++ start = malloc (sizeof (struct response)); ++ next = start; ++ } ++ else ++ { ++ next->next = malloc (sizeof (struct response)); ++ next = next->next; ++ } ++ next->next = NULL; ++ next->val = malloc (invallen + 1); ++ strncpy (next->val, inval, invallen); ++ next->val[invallen] = '\0'; ++ } ++ ++ return 0; ++} ++ ++enum nss_status ++internal_nis_setprotoent (void) ++{ ++ char *domainname; ++ struct ypall_callback ypcb; ++ enum nss_status status; ++ ++ yp_get_default_domain (&domainname); ++ ++ while (start != NULL) ++ { ++ if (start->val != NULL) ++ free (start->val); ++ next = start; ++ start = start->next; ++ free (next); ++ } ++ start = NULL; ++ ++ ypcb.foreach = saveit; ++ ypcb.data = NULL; ++ status = yperr2nss (yp_all (domainname, "protocols.bynumber", &ypcb)); ++ next = start; ++ ++ return status; ++} ++ ++enum nss_status ++_nss_nis_setprotoent (void) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_nis_setprotoent (); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++enum nss_status ++_nss_nis_endprotoent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ while (start != NULL) ++ { ++ if (start->val != NULL) ++ free (start->val); ++ next = start; ++ start = start->next; ++ free (next); ++ } ++ start = NULL; ++ next = NULL; ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++static enum nss_status ++internal_nis_getprotoent_r (struct protoent *proto, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ int parse_res; ++ ++ if (start == NULL) ++ internal_nis_setprotoent (); ++ ++ /* Get the next entry until we found a correct one. */ ++ do ++ { ++ char *p; ++ ++ if (next == NULL) ++ return NSS_STATUS_NOTFOUND; ++ p = strncpy (buffer, next->val, buflen); ++ next = next->next; ++ ++ while (isspace (*p)) ++ ++p; ++ ++ parse_res = _nss_files_parse_protoent (p, proto, data, buflen); ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ } ++ while (!parse_res); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_getprotoent_r (struct protoent *proto, char *buffer, size_t buflen) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_nis_getprotoent_r (proto, buffer, buflen); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++enum nss_status ++_nss_nis_getprotobyname_r (const char *name, struct protoent *proto, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ enum nss_status retval; ++ char *domain, *result, *p; ++ int len, parse_res; ++ ++ if (name == NULL) ++ { ++ __set_errno (EINVAL); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ retval = yperr2nss (yp_match (domain, "protocols.byname", name, ++ strlen (name), &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_protoent (p, proto, data, buflen); ++ ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ else if (parse_res == 0) ++ return NSS_STATUS_NOTFOUND; ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_getprotobynumber_r (int number, struct protoent *proto, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ enum nss_status retval; ++ char *domain, *result, *p; ++ int len, nlen, parse_res; ++ char buf[32]; ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ nlen = sprintf (buf, "%d", number); ++ ++ retval = yperr2nss (yp_match (domain, "protocols.bynumber", buf, ++ nlen, &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_protoent (p, proto, data, buflen); ++ ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ else if (parse_res == 0) ++ return NSS_STATUS_NOTFOUND; ++ ++ return NSS_STATUS_SUCCESS; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-pwd.c glibc-2.1.3/glibc-compat/nss_nis/nis-pwd.c +--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-pwd.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_nis/nis-pwd.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,407 @@ ++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996. ++ ++ 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. */ ++ ++#include <nss.h> ++#include <pwd.h> ++#include <ctype.h> ++#include <errno.h> ++#include <string.h> ++#include <bits/libc-lock.h> ++#include <rpcsvc/yp.h> ++#include <rpcsvc/ypclnt.h> ++ ++#include "nss-nis.h" ++ ++/* Get the declaration of the parser function. */ ++#define ENTNAME pwent ++#define STRUCTURE passwd ++#define EXTERN_PARSER ++#include "../nss_files/files-parse.c" ++ ++/* Protect global state against multiple changers */ ++__libc_lock_define_initialized (static, lock) ++ ++static bool_t new_start = 1; ++static char *oldkey = NULL; ++static int oldkeylen = 0; ++ ++enum nss_status ++_nss_nis_setpwent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ new_start = 1; ++ if (oldkey != NULL) ++ { ++ free (oldkey); ++ oldkey = NULL; ++ oldkeylen = 0; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_endpwent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ new_start = 1; ++ if (oldkey != NULL) ++ { ++ free (oldkey); ++ oldkey = NULL; ++ oldkeylen = 0; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++static enum nss_status ++internal_nis_getpwent_r (struct passwd *pwd, char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ char *domain; ++ int parse_res; ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ /* Get the next entry until we found a correct one. */ ++ do ++ { ++ enum nss_status retval; ++ char *result, *outkey, *result2, *p; ++ int len, keylen, len2; ++ size_t namelen; ++ ++ if (new_start) ++ retval = yperr2nss (yp_first (domain, "passwd.byname", ++ &outkey, &keylen, &result, &len)); ++ else ++ retval = yperr2nss ( yp_next (domain, "passwd.byname", ++ oldkey, oldkeylen, ++ &outkey, &keylen, &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ ++ /* Check for adjunct style secret passwords. They can be ++ recognized by a password starting with "##". */ ++ p = strchr (result, ':'); ++ if (p != NULL /* This better should be true in all cases. */ ++ && p[1] == '#' && p[2] == '#' ++ && (namelen = p - result, ++ yp_match (domain, "passwd.adjunct.byname", result, namelen, ++ &result2, &len2)) == YPERR_SUCCESS) ++ { ++ /* We found a passwd.adjunct entry. Merge encrypted ++ password therein into original result. */ ++ char *encrypted = strchr (result2, ':'); ++ char *endp, *tmp; ++ size_t restlen; ++ ++ if (encrypted == NULL ++ || (endp = strchr (++encrypted, ':')) == NULL ++ || (p = strchr (p + 1, ':')) == NULL) ++ { ++ /* Invalid format of the entry. This never should happen ++ unless the data from which the NIS table is generated is ++ wrong. We simply ignore it. */ ++ free (result2); ++ goto non_adjunct; ++ } ++ ++ restlen = len - (p - result); ++ if ((size_t) (namelen + (endp - encrypted) + restlen + 2) > buflen) ++ { ++ free (result2); ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ memcpy (buffer, result, namelen); ++ tmp = buffer + namelen; ++ *tmp++ = ':'; ++ memcpy (tmp, encrypted, endp - encrypted); ++ tmp += endp - encrypted; ++ memcpy (tmp, p, restlen + 1); ++ p = buffer; ++ ++ free (result2); ++ } ++ else ++ { ++ non_adjunct: ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_pwent (p, pwd, data, buflen); ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ ++ free (oldkey); ++ oldkey = outkey; ++ oldkeylen = keylen; ++ new_start = 0; ++ } ++ while (!parse_res); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_getpwent_r (struct passwd *result, char *buffer, size_t buflen) ++{ ++ int status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_nis_getpwent_r (result, buffer, buflen); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++enum nss_status ++_nss_nis_getpwnam_r (const char *name, struct passwd *pwd, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ enum nss_status retval; ++ char *domain, *result, *result2, *p; ++ int len, len2, parse_res; ++ size_t namelen; ++ ++ if (name == NULL) ++ { ++ __set_errno (EINVAL); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ namelen = strlen (name); ++ ++ retval = yperr2nss (yp_match (domain, "passwd.byname", name, ++ namelen, &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ ++ /* Check for adjunct style secret passwords. They can be recognized ++ by a password starting with "##". */ ++ p = strchr (result, ':'); ++ if (p != NULL /* This better should be true in all cases. */ ++ && p[1] == '#' && p[2] == '#' ++ && (namelen = p - result, ++ yp_match (domain, "passwd.adjunct.byname", name, namelen, ++ &result2, &len2)) == YPERR_SUCCESS) ++ { ++ /* We found a passwd.adjunct entry. Merge encrypted password ++ therein into original result. */ ++ char *encrypted = strchr (result2, ':'); ++ char *endp, *tmp; ++ size_t restlen; ++ ++ if (encrypted == NULL ++ || (endp = strchr (++encrypted, ':')) == NULL ++ || (p = strchr (p + 1, ':')) == NULL) ++ { ++ /* Invalid format of the entry. This never should happen ++ unless the data from which the NIS table is generated is ++ wrong. We simply ignore it. */ ++ free (result2); ++ goto non_adjunct; ++ } ++ ++ restlen = len - (p - result); ++ if ((size_t) (namelen + (endp - encrypted) + restlen + 2) > buflen) ++ { ++ free (result2); ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ memcpy (buffer, name, namelen); ++ tmp = buffer + namelen; ++ *tmp++ = ':'; ++ memcpy (tmp, encrypted, endp - encrypted); ++ tmp += endp - encrypted; ++ memcpy (tmp, p, restlen + 1); ++ p = buffer; ++ ++ free (result2); ++ } ++ else ++ { ++ non_adjunct: ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ } ++ ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_pwent (p, pwd, data, buflen); ++ ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ else if (parse_res == 0) ++ return NSS_STATUS_NOTFOUND; ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_getpwuid_r (uid_t uid, struct passwd *pwd, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ enum nss_status retval; ++ char *domain, *result, *p, *result2; ++ int len, nlen, parse_res, len2; ++ char buf[32]; ++ size_t namelen; ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ nlen = sprintf (buf, "%d", uid); ++ ++ retval = yperr2nss (yp_match (domain, "passwd.byuid", buf, ++ nlen, &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ ++ /* Check for adjunct style secret passwords. They can be recognized ++ by a password starting with "##". */ ++ p = strchr (result, ':'); ++ if (p != NULL /* This better should be true in all cases. */ ++ && p[1] == '#' && p[2] == '#' ++ && (namelen = p - result, ++ yp_match (domain, "passwd.adjunct.byname", result, namelen, ++ &result2, &len2)) == YPERR_SUCCESS) ++ { ++ /* We found a passwd.adjunct entry. Merge encrypted password ++ therein into original result. */ ++ char *encrypted = strchr (result2, ':'); ++ char *endp, *tmp; ++ size_t restlen; ++ ++ if (encrypted == NULL ++ || (endp = strchr (++encrypted, ':')) == NULL ++ || (p = strchr (p + 1, ':')) == NULL) ++ { ++ /* Invalid format of the entry. This never should happen ++ unless the data from which the NIS table is generated is ++ wrong. We simply ignore it. */ ++ free (result2); ++ goto non_adjunct; ++ } ++ ++ restlen = len - (p - result); ++ if ((size_t) (namelen + (endp - encrypted) + restlen + 2) > buflen) ++ { ++ free (result2); ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ memcpy (buffer, result, namelen); ++ tmp = buffer + namelen; ++ *tmp++ = ':'; ++ memcpy (tmp, encrypted, endp - encrypted); ++ tmp += endp - encrypted; ++ memcpy (tmp, p, restlen + 1); ++ p = buffer; ++ ++ free (result2); ++ } ++ else ++ { ++ non_adjunct: ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ } ++ ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_pwent (p, pwd, data, buflen); ++ ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ else if (parse_res == 0) ++ return NSS_STATUS_NOTFOUND; ++ ++ return NSS_STATUS_SUCCESS; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-rpc.c glibc-2.1.3/glibc-compat/nss_nis/nis-rpc.c +--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-rpc.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_nis/nis-rpc.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,295 @@ ++/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996. ++ ++ 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. */ ++ ++#include <nss.h> ++#include <netdb.h> ++#include <ctype.h> ++#include <errno.h> ++#include <string.h> ++#include <bits/libc-lock.h> ++#include <rpcsvc/yp.h> ++#include <rpcsvc/ypclnt.h> ++ ++#include "nss-nis.h" ++ ++/* Get the declaration of the parser function. */ ++#define ENTNAME rpcent ++#define EXTERN_PARSER ++#include "../nss_files/files-parse.c" ++ ++__libc_lock_define_initialized (static, lock) ++ ++struct response_t ++{ ++ char *val; ++ struct response_t *next; ++}; ++ ++struct intern_t ++{ ++ struct response_t *start; ++ struct response_t *next; ++}; ++typedef struct intern_t intern_t; ++ ++static intern_t intern = {NULL, NULL}; ++ ++static int ++saveit (int instatus, char *inkey, int inkeylen, char *inval, ++ int invallen, char *indata) ++{ ++ intern_t *intern = (intern_t *)indata; ++ ++ if (instatus != YP_TRUE) ++ return instatus; ++ ++ if (inkey && inkeylen > 0 && inval && invallen > 0) ++ { ++ if (intern->start == NULL) ++ { ++ intern->start = malloc (sizeof (struct response_t)); ++ intern->next = intern->start; ++ } ++ else ++ { ++ intern->next->next = malloc (sizeof (struct response_t)); ++ intern->next = intern->next->next; ++ } ++ intern->next->next = NULL; ++ intern->next->val = malloc (invallen + 1); ++ strncpy (intern->next->val, inval, invallen); ++ intern->next->val[invallen] = '\0'; ++ } ++ ++ return 0; ++} ++ ++static enum nss_status ++internal_nis_setrpcent (intern_t *intern) ++{ ++ char *domainname; ++ struct ypall_callback ypcb; ++ enum nss_status status; ++ ++ if (yp_get_default_domain (&domainname)) ++ return NSS_STATUS_UNAVAIL; ++ ++ while (intern->start != NULL) ++ { ++ if (intern->start->val != NULL) ++ free (intern->start->val); ++ intern->next = intern->start; ++ intern->start = intern->start->next; ++ free (intern->next); ++ } ++ intern->start = NULL; ++ ++ ypcb.foreach = saveit; ++ ypcb.data = (char *)intern; ++ status = yperr2nss (yp_all(domainname, "rpc.bynumber", &ypcb)); ++ intern->next = intern->start; ++ ++ return status; ++} ++ ++enum nss_status ++_nss_nis_setrpcent (void) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_nis_setrpcent (&intern); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++static enum nss_status ++internal_nis_endrpcent (intern_t *intern) ++{ ++ while (intern->start != NULL) ++ { ++ if (intern->start->val != NULL) ++ free (intern->start->val); ++ intern->next = intern->start; ++ intern->start = intern->start->next; ++ free (intern->next); ++ } ++ intern->start = NULL; ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_endrpcent (void) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_nis_endrpcent (&intern); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++static enum nss_status ++internal_nis_getrpcent_r (struct rpcent *rpc, char *buffer, size_t buflen, ++ intern_t *data) ++{ ++ struct parser_data *pdata = (void *) buffer; ++ int parse_res; ++ char *p; ++ ++ if (data->start == NULL) ++ internal_nis_setrpcent (data); ++ ++ /* Get the next entry until we found a correct one. */ ++ do ++ { ++ if (data->next == NULL) ++ return NSS_STATUS_NOTFOUND; ++ p = strncpy (buffer, data->next->val, buflen); ++ data->next = data->next->next; ++ while (isspace (*p)) ++ ++p; ++ ++ parse_res = _nss_files_parse_rpcent (p, rpc, pdata, buflen); ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ } ++ while (!parse_res); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_getrpcent_r (struct rpcent *rpc, char *buffer, size_t buflen) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_nis_getrpcent_r (rpc, buffer, buflen, &intern); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++enum nss_status ++_nss_nis_getrpcbyname_r (const char *name, struct rpcent *rpc, ++ char *buffer, size_t buflen) ++{ ++ intern_t data = {NULL, NULL}; ++ enum nss_status status; ++ int found; ++ ++ if (name == NULL) ++ { ++ __set_errno (EINVAL); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ status = internal_nis_setrpcent (&data); ++ if (status != NSS_STATUS_SUCCESS) ++ return status; ++ ++ found = 0; ++ while (!found && ++ ((status = internal_nis_getrpcent_r (rpc, buffer, buflen, &data)) ++ == NSS_STATUS_SUCCESS)) ++ { ++ if (strcmp (rpc->r_name, name) == 0) ++ found = 1; ++ else ++ { ++ int i = 0; ++ ++ while (rpc->r_aliases[i] != NULL) ++ { ++ if (strcmp (rpc->r_aliases[i], name) == 0) ++ { ++ found = 1; ++ break; ++ } ++ else ++ ++i; ++ } ++ } ++ } ++ ++ internal_nis_endrpcent (&data); ++ ++ if (!found && status == NSS_STATUS_SUCCESS) ++ return NSS_STATUS_NOTFOUND; ++ else ++ return status; ++} ++ ++enum nss_status ++_nss_nis_getrpcbynumber_r (int number, struct rpcent *rpc, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ enum nss_status retval; ++ char *domain, *result, *p; ++ int len, nlen, parse_res; ++ char buf[32]; ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ nlen = sprintf (buf, "%d", number); ++ ++ retval = yperr2nss (yp_match (domain, "rpc.bynumber", buf, ++ nlen, &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_rpcent (p, rpc, data, buflen); ++ ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ else if (parse_res == 0) ++ return NSS_STATUS_NOTFOUND; ++ ++ return NSS_STATUS_SUCCESS; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-service.c glibc-2.1.3/glibc-compat/nss_nis/nis-service.c +--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-service.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_nis/nis-service.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,280 @@ ++/* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996. ++ ++ 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. */ ++ ++#include <nss.h> ++#include <netdb.h> ++#include <ctype.h> ++#include <errno.h> ++#include <string.h> ++#include <bits/libc-lock.h> ++#include <rpcsvc/yp.h> ++#include <rpcsvc/ypclnt.h> ++ ++#include "nss-nis.h" ++ ++/* Get the declaration of the parser function. */ ++#define ENTNAME servent ++#define EXTERN_PARSER ++#include "../nss_files/files-parse.c" ++ ++__libc_lock_define_initialized (static, lock) ++ ++struct response_t ++{ ++ char *val; ++ struct response_t *next; ++}; ++ ++struct intern_t ++{ ++ struct response_t *start; ++ struct response_t *next; ++}; ++typedef struct intern_t intern_t; ++ ++static intern_t intern = { NULL, NULL }; ++ ++static int ++saveit (int instatus, char *inkey, int inkeylen, char *inval, ++ int invallen, char *indata) ++{ ++ intern_t *intern = (intern_t *) indata; ++ ++ if (instatus != YP_TRUE) ++ return instatus; ++ ++ if (inkey && inkeylen > 0 && inval && invallen > 0) ++ { ++ if (intern->start == NULL) ++ { ++ intern->start = malloc (sizeof (struct response_t)); ++ intern->next = intern->start; ++ } ++ else ++ { ++ intern->next->next = malloc (sizeof (struct response_t)); ++ intern->next = intern->next->next; ++ } ++ intern->next->next = NULL; ++ intern->next->val = malloc (invallen + 1); ++ strncpy (intern->next->val, inval, invallen); ++ intern->next->val[invallen] = '\0'; ++ } ++ ++ return 0; ++} ++ ++static enum nss_status ++internal_nis_setservent (intern_t *intern) ++{ ++ char *domainname; ++ struct ypall_callback ypcb; ++ enum nss_status status; ++ ++ if (yp_get_default_domain (&domainname)) ++ return NSS_STATUS_UNAVAIL; ++ ++ while (intern->start != NULL) ++ { ++ if (intern->start->val != NULL) ++ free (intern->start->val); ++ intern->next = intern->start; ++ intern->start = intern->start->next; ++ free (intern->next); ++ } ++ intern->start = NULL; ++ ++ ypcb.foreach = saveit; ++ ypcb.data = (char *) intern; ++ status = yperr2nss (yp_all (domainname, "services.byname", &ypcb)); ++ intern->next = intern->start; ++ ++ return status; ++} ++enum nss_status ++_nss_nis_setservent (void) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_nis_setservent (&intern); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++static enum nss_status ++internal_nis_endservent (intern_t * intern) ++{ ++ while (intern->start != NULL) ++ { ++ if (intern->start->val != NULL) ++ free (intern->start->val); ++ intern->next = intern->start; ++ intern->start = intern->start->next; ++ free (intern->next); ++ } ++ intern->start = NULL; ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_endservent (void) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_nis_endservent (&intern); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++static enum nss_status ++internal_nis_getservent_r (struct servent *serv, char *buffer, ++ size_t buflen, intern_t *data) ++{ ++ struct parser_data *pdata = (void *) buffer; ++ int parse_res; ++ char *p; ++ ++ if (data->start == NULL) ++ internal_nis_setservent (data); ++ ++ /* Get the next entry until we found a correct one. */ ++ do ++ { ++ if (data->next == NULL) ++ return NSS_STATUS_NOTFOUND; ++ p = strncpy (buffer, data->next->val, buflen); ++ data->next = data->next->next; ++ while (isspace (*p)) ++ ++p; ++ ++ parse_res = _nss_files_parse_servent (p, serv, pdata, buflen); ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ } ++ while (!parse_res); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_getservent_r (struct servent *serv, char *buffer, size_t buflen) ++{ ++ enum nss_status status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_nis_getservent_r (serv, buffer, buflen, &intern); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++enum nss_status ++_nss_nis_getservbyname_r (const char *name, char *protocol, ++ struct servent *serv, char *buffer, size_t buflen) ++{ ++ intern_t data = { NULL, NULL }; ++ enum nss_status status; ++ int found; ++ ++ if (name == NULL) ++ { ++ __set_errno (EINVAL); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ status = internal_nis_setservent (&data); ++ if (status != NSS_STATUS_SUCCESS) ++ return status; ++ ++ found = 0; ++ while (!found && ++ ((status = internal_nis_getservent_r (serv, buffer, buflen, &data)) ++ == NSS_STATUS_SUCCESS)) ++ { ++ if (protocol == NULL || strcmp (serv->s_proto, protocol) == 0) ++ { ++ char **cp; ++ ++ if (strcmp (serv->s_name, name) == 0) ++ found = 1; ++ else ++ for (cp = serv->s_aliases; *cp; cp++) ++ if (strcmp (name, *cp) == 0) ++ found = 1; ++ } ++ } ++ ++ internal_nis_endservent (&data); ++ ++ if (!found && status == NSS_STATUS_SUCCESS) ++ return NSS_STATUS_NOTFOUND; ++ else ++ return status; ++} ++ ++enum nss_status ++_nss_nis_getservbyport_r (int port, char *protocol, struct servent *serv, ++ char *buffer, size_t buflen) ++{ ++ intern_t data = { NULL, NULL }; ++ enum nss_status status; ++ int found; ++ ++ if (protocol == NULL) ++ { ++ __set_errno (EINVAL); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ status = internal_nis_setservent (&data); ++ if (status != NSS_STATUS_SUCCESS) ++ return status; ++ ++ found = 0; ++ while (!found && ++ ((status = internal_nis_getservent_r (serv, buffer, buflen, &data)) ++ == NSS_STATUS_SUCCESS)) ++ { ++ if (htons (serv->s_port) == port) ++ { ++ if (strcmp (serv->s_proto, protocol) == 0) ++ { ++ found = 1; ++ } ++ } ++ } ++ ++ internal_nis_endservent (&data); ++ ++ if (!found && status == NSS_STATUS_SUCCESS) ++ return NSS_STATUS_NOTFOUND; ++ else ++ return status; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/nss_nis/nis-spwd.c glibc-2.1.3/glibc-compat/nss_nis/nis-spwd.c +--- ../glibc-2.1.3/glibc-compat/nss_nis/nis-spwd.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/nss_nis/nis-spwd.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,201 @@ ++/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996. ++ ++ 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. */ ++ ++#include <nss.h> ++#include <ctype.h> ++#include <errno.h> ++#include <string.h> ++#include <shadow.h> ++#include <bits/libc-lock.h> ++#include <rpcsvc/yp.h> ++#include <rpcsvc/ypclnt.h> ++ ++#include "nss-nis.h" ++ ++/* Get the declaration of the parser function. */ ++#define ENTNAME spent ++#define STRUCTURE spwd ++#define EXTERN_PARSER ++#include "../nss_files/files-parse.c" ++ ++/* Protect global state against multiple changers */ ++__libc_lock_define_initialized (static, lock) ++ ++static bool_t new_start = 1; ++static char *oldkey = NULL; ++static int oldkeylen = 0; ++ ++enum nss_status ++_nss_nis_setspent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ new_start = 1; ++ if (oldkey != NULL) ++ { ++ free (oldkey); ++ oldkey = NULL; ++ oldkeylen = 0; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_endspent (void) ++{ ++ __libc_lock_lock (lock); ++ ++ new_start = 1; ++ if (oldkey != NULL) ++ { ++ free (oldkey); ++ oldkey = NULL; ++ oldkeylen = 0; ++ } ++ ++ __libc_lock_unlock (lock); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++static enum nss_status ++internal_nis_getspent_r (struct spwd *sp, char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ char *domain, *result, *outkey; ++ int len, keylen, parse_res; ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ /* Get the next entry until we found a correct one. */ ++ do ++ { ++ enum nss_status retval; ++ char *p; ++ ++ if (new_start) ++ retval = yperr2nss (yp_first (domain, "shadow.byname", ++ &outkey, &keylen, &result, &len)); ++ else ++ retval = yperr2nss ( yp_next (domain, "shadow.byname", ++ oldkey, oldkeylen, ++ &outkey, &keylen, &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_spent (p, sp, data, buflen); ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ ++ free (oldkey); ++ oldkey = outkey; ++ oldkeylen = keylen; ++ new_start = 0; ++ } ++ while (!parse_res); ++ ++ return NSS_STATUS_SUCCESS; ++} ++ ++enum nss_status ++_nss_nis_getspent_r (struct spwd *result, char *buffer, size_t buflen) ++{ ++ int status; ++ ++ __libc_lock_lock (lock); ++ ++ status = internal_nis_getspent_r (result, buffer, buflen); ++ ++ __libc_lock_unlock (lock); ++ ++ return status; ++} ++ ++enum nss_status ++_nss_nis_getspnam_r (const char *name, struct spwd *sp, ++ char *buffer, size_t buflen) ++{ ++ struct parser_data *data = (void *) buffer; ++ enum nss_status retval; ++ char *domain, *result, *p; ++ int len, parse_res; ++ ++ if (name == NULL) ++ { ++ __set_errno (EINVAL); ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ if (yp_get_default_domain (&domain)) ++ return NSS_STATUS_UNAVAIL; ++ ++ retval = yperr2nss (yp_match (domain, "shadow.byname", name, ++ strlen (name), &result, &len)); ++ ++ if (retval != NSS_STATUS_SUCCESS) ++ { ++ if (retval == NSS_STATUS_TRYAGAIN) ++ __set_errno (EAGAIN); ++ return retval; ++ } ++ ++ if ((size_t) (len + 1) > buflen) ++ { ++ free (result); ++ __set_errno (ERANGE); ++ return NSS_STATUS_TRYAGAIN; ++ } ++ ++ p = strncpy (buffer, result, len); ++ buffer[len] = '\0'; ++ while (isspace (*p)) ++ ++p; ++ free (result); ++ ++ parse_res = _nss_files_parse_spent (p, sp, data, buflen); ++ ++ if (parse_res == -1 && errno == ERANGE) ++ return NSS_STATUS_TRYAGAIN; ++ else if (parse_res == 0) ++ return NSS_STATUS_NOTFOUND; ++ ++ return NSS_STATUS_SUCCESS; ++} +diff -Naur ../glibc-2.1.3/glibc-compat/oldfileops.c glibc-2.1.3/glibc-compat/oldfileops.c +--- ../glibc-2.1.3/glibc-compat/oldfileops.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/oldfileops.c 2000-01-03 17:07:07.000000000 -0800 +@@ -0,0 +1,774 @@ ++/* Copyright (C) 1993, 1995, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU IO Library. ++ Written by Per Bothner <bothner@cygnus.com>. ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU General Public License as ++ published by the Free Software Foundation; either version 2, 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 ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this library; see the file COPYING. If not, write to ++ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, ++ MA 02111-1307, USA. ++ ++ As a special exception, if you link this library with files ++ compiled with a GNU compiler to produce an executable, this does ++ not cause the resulting executable to be covered by the GNU General ++ Public License. This exception does not however invalidate any ++ other reasons why the executable file might be covered by the GNU ++ General Public License. */ ++ ++/* This is a compatibility file. If we don't build the libc with ++ versioning don't compile this file. */ ++ ++#ifndef _POSIX_SOURCE ++# define _POSIX_SOURCE ++#endif ++#define _IO_USE_OLD_IO_FILE ++#include "libioP.h" ++#include <fcntl.h> ++#include <sys/types.h> ++#include <sys/stat.h> ++#include <string.h> ++#include <errno.h> ++#ifndef errno ++extern int errno; ++#endif ++#ifndef __set_errno ++# define __set_errno(Val) errno = (Val) ++#endif ++ ++ ++#ifdef _LIBC ++# define open(Name, Flags, Prot) __open (Name, Flags, Prot) ++# define close(FD) __close (FD) ++# define lseek(FD, Offset, Whence) __lseek (FD, Offset, Whence) ++# define read(FD, Buf, NBytes) __read (FD, Buf, NBytes) ++# define write(FD, Buf, NBytes) __write (FD, Buf, NBytes) ++#endif ++ ++/* An fstream can be in at most one of put mode, get mode, or putback mode. ++ Putback mode is a variant of get mode. ++ ++ In a filebuf, there is only one current position, instead of two ++ separate get and put pointers. In get mode, the current position ++ is that of gptr(); in put mode that of pptr(). ++ ++ The position in the buffer that corresponds to the position ++ in external file system is normally _IO_read_end, except in putback ++ mode, when it is _IO_save_end. ++ If the field _fb._offset is >= 0, it gives the offset in ++ the file as a whole corresponding to eGptr(). (?) ++ ++ PUT MODE: ++ If a filebuf is in put mode, then all of _IO_read_ptr, _IO_read_end, ++ and _IO_read_base are equal to each other. These are usually equal ++ to _IO_buf_base, though not necessarily if we have switched from ++ get mode to put mode. (The reason is to maintain the invariant ++ that _IO_read_end corresponds to the external file position.) ++ _IO_write_base is non-NULL and usually equal to _IO_base_base. ++ We also have _IO_write_end == _IO_buf_end, but only in fully buffered mode. ++ The un-flushed character are those between _IO_write_base and _IO_write_ptr. ++ ++ GET MODE: ++ If a filebuf is in get or putback mode, eback() != egptr(). ++ In get mode, the unread characters are between gptr() and egptr(). ++ The OS file position corresponds to that of egptr(). ++ ++ PUTBACK MODE: ++ Putback mode is used to remember "excess" characters that have ++ been sputbackc'd in a separate putback buffer. ++ In putback mode, the get buffer points to the special putback buffer. ++ The unread characters are the characters between gptr() and egptr() ++ in the putback buffer, as well as the area between save_gptr() ++ and save_egptr(), which point into the original reserve buffer. ++ (The pointers save_gptr() and save_egptr() are the values ++ of gptr() and egptr() at the time putback mode was entered.) ++ The OS position corresponds to that of save_egptr(). ++ ++ LINE BUFFERED OUTPUT: ++ During line buffered output, _IO_write_base==base() && epptr()==base(). ++ However, ptr() may be anywhere between base() and ebuf(). ++ This forces a call to filebuf::overflow(int C) on every put. ++ If there is more space in the buffer, and C is not a '\n', ++ then C is inserted, and pptr() incremented. ++ ++ UNBUFFERED STREAMS: ++ If a filebuf is unbuffered(), the _shortbuf[1] is used as the buffer. ++*/ ++ ++#define CLOSED_FILEBUF_FLAGS \ ++ (_IO_IS_FILEBUF+_IO_NO_READS+_IO_NO_WRITES+_IO_TIED_PUT_GET) ++ ++ ++void ++_IO_old_file_init (fp) ++ _IO_FILE *fp; ++{ ++ /* POSIX.1 allows another file handle to be used to change the position ++ of our file descriptor. Hence we actually don't know the actual ++ position before we do the first fseek (and until a following fflush). */ ++ fp->_old_offset = _IO_pos_BAD; ++ fp->_IO_file_flags |= CLOSED_FILEBUF_FLAGS; ++ ++ _IO_link_in(fp); ++ fp->_vtable_offset = ((int) sizeof (struct _IO_FILE) ++ - (int) sizeof (struct _IO_FILE_complete)); ++ fp->_fileno = -1; ++} ++ ++int ++_IO_old_file_close_it (fp) ++ _IO_FILE *fp; ++{ ++ int write_status, close_status; ++ if (!_IO_file_is_open (fp)) ++ return EOF; ++ ++ write_status = _IO_old_do_flush (fp); ++ ++ _IO_unsave_markers(fp); ++ ++ close_status = _IO_SYSCLOSE (fp); ++ ++ /* Free buffer. */ ++ _IO_setb (fp, NULL, NULL, 0); ++ _IO_setg (fp, NULL, NULL, NULL); ++ _IO_setp (fp, NULL, NULL); ++ ++ _IO_un_link (fp); ++ fp->_flags = _IO_MAGIC|CLOSED_FILEBUF_FLAGS; ++ fp->_fileno = EOF; ++ fp->_old_offset = _IO_pos_BAD; ++ ++ return close_status ? close_status : write_status; ++} ++ ++void ++_IO_old_file_finish (fp, dummy) ++ _IO_FILE *fp; ++ int dummy; ++{ ++ if (_IO_file_is_open (fp)) ++ { ++ _IO_old_do_flush (fp); ++ if (!(fp->_flags & _IO_DELETE_DONT_CLOSE)) ++ _IO_SYSCLOSE (fp); ++ } ++ _IO_default_finish (fp, 0); ++} ++ ++_IO_FILE * ++_IO_old_file_fopen (fp, filename, mode) ++ _IO_FILE *fp; ++ const char *filename; ++ const char *mode; ++{ ++ int oflags = 0, omode; ++ int read_write, fdesc; ++ int oprot = 0666; ++ if (_IO_file_is_open (fp)) ++ return 0; ++ switch (*mode++) ++ { ++ case 'r': ++ omode = O_RDONLY; ++ read_write = _IO_NO_WRITES; ++ break; ++ case 'w': ++ omode = O_WRONLY; ++ oflags = O_CREAT|O_TRUNC; ++ read_write = _IO_NO_READS; ++ break; ++ case 'a': ++ omode = O_WRONLY; ++ oflags = O_CREAT|O_APPEND; ++ read_write = _IO_NO_READS|_IO_IS_APPENDING; ++ break; ++ default: ++ __set_errno (EINVAL); ++ return NULL; ++ } ++ if (mode[0] == '+' || (mode[0] == 'b' && mode[1] == '+')) ++ { ++ omode = O_RDWR; ++ read_write &= _IO_IS_APPENDING; ++ } ++ fdesc = open (filename, omode|oflags, oprot); ++ if (fdesc < 0) ++ return NULL; ++ fp->_fileno = fdesc; ++ _IO_mask_flags (fp, read_write,_IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING); ++ if (read_write & _IO_IS_APPENDING) ++ if (_IO_SEEKOFF (fp, (_IO_off_t)0, _IO_seek_end, _IOS_INPUT|_IOS_OUTPUT) ++ == _IO_pos_BAD && errno != ESPIPE) ++ return NULL; ++ _IO_link_in (fp); ++ return fp; ++} ++ ++_IO_FILE * ++_IO_old_file_attach (fp, fd) ++ _IO_FILE *fp; ++ int fd; ++{ ++ if (_IO_file_is_open (fp)) ++ return NULL; ++ fp->_fileno = fd; ++ fp->_flags &= ~(_IO_NO_READS+_IO_NO_WRITES); ++ fp->_flags |= _IO_DELETE_DONT_CLOSE; ++ /* Get the current position of the file. */ ++ /* We have to do that since that may be junk. */ ++ fp->_old_offset = _IO_pos_BAD; ++ if (_IO_SEEKOFF (fp, (_IO_off_t)0, _IO_seek_cur, _IOS_INPUT|_IOS_OUTPUT) ++ == _IO_pos_BAD && errno != ESPIPE) ++ return NULL; ++ return fp; ++} ++ ++_IO_FILE * ++_IO_old_file_setbuf (fp, p, len) ++ _IO_FILE *fp; ++ char *p; ++ _IO_ssize_t len; ++{ ++ if (_IO_default_setbuf (fp, p, len) == NULL) ++ return NULL; ++ ++ fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_write_end ++ = fp->_IO_buf_base; ++ _IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base, fp->_IO_buf_base); ++ ++ return fp; ++} ++ ++static int old_do_write __P ((_IO_FILE *, const char *, _IO_size_t)); ++ ++/* Write TO_DO bytes from DATA to FP. ++ Then mark FP as having empty buffers. */ ++ ++int ++_IO_old_do_write (fp, data, to_do) ++ _IO_FILE *fp; ++ const char *data; ++ _IO_size_t to_do; ++{ ++ return (to_do == 0 || old_do_write (fp, data, to_do) == to_do) ++ ? 0 : EOF; ++} ++ ++static ++int ++old_do_write (fp, data, to_do) ++ _IO_FILE *fp; ++ const char *data; ++ _IO_size_t to_do; ++{ ++ _IO_size_t count; ++ if (fp->_flags & _IO_IS_APPENDING) ++ /* On a system without a proper O_APPEND implementation, ++ you would need to sys_seek(0, SEEK_END) here, but is ++ is not needed nor desirable for Unix- or Posix-like systems. ++ Instead, just indicate that offset (before and after) is ++ unpredictable. */ ++ fp->_old_offset = _IO_pos_BAD; ++ else if (fp->_IO_read_end != fp->_IO_write_base) ++ { ++ _IO_pos_t new_pos ++ = _IO_SYSSEEK (fp, fp->_IO_write_base - fp->_IO_read_end, 1); ++ if (new_pos == _IO_pos_BAD) ++ return 0; ++ fp->_old_offset = new_pos; ++ } ++ count = _IO_SYSWRITE (fp, data, to_do); ++ if (fp->_cur_column && count) ++ fp->_cur_column = _IO_adjust_column (fp->_cur_column - 1, data, count) + 1; ++ _IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base, fp->_IO_buf_base); ++ fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_buf_base; ++ fp->_IO_write_end = ((fp->_flags & (_IO_LINE_BUF+_IO_UNBUFFERED)) ++ ? fp->_IO_buf_base : fp->_IO_buf_end); ++ return count; ++} ++ ++int ++_IO_old_file_underflow (fp) ++ _IO_FILE *fp; ++{ ++ _IO_ssize_t count; ++#if 0 ++ /* SysV does not make this test; take it out for compatibility */ ++ if (fp->_flags & _IO_EOF_SEEN) ++ return (EOF); ++#endif ++ ++ if (fp->_flags & _IO_NO_READS) ++ { ++ __set_errno (EBADF); ++ return EOF; ++ } ++ if (fp->_IO_read_ptr < fp->_IO_read_end) ++ return *(unsigned char *) fp->_IO_read_ptr; ++ ++ if (fp->_IO_buf_base == NULL) ++ _IO_doallocbuf (fp); ++ ++ /* Flush all line buffered files before reading. */ ++ /* FIXME This can/should be moved to genops ?? */ ++ if (fp->_flags & (_IO_LINE_BUF|_IO_UNBUFFERED)) ++ _IO_flush_all_linebuffered (); ++ ++ _IO_switch_to_get_mode (fp); ++ ++ /* This is very tricky. We have to adjust those ++ pointers before we call _IO_SYSREAD () since ++ we may longjump () out while waiting for ++ input. Those pointers may be screwed up. H.J. */ ++ fp->_IO_read_base = fp->_IO_read_ptr = fp->_IO_buf_base; ++ fp->_IO_read_end = fp->_IO_buf_base; ++ fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_write_end ++ = fp->_IO_buf_base; ++ ++ count = _IO_SYSREAD (fp, fp->_IO_buf_base, ++ fp->_IO_buf_end - fp->_IO_buf_base); ++ if (count <= 0) ++ { ++ if (count == 0) ++ fp->_flags |= _IO_EOF_SEEN; ++ else ++ fp->_flags |= _IO_ERR_SEEN, count = 0; ++ } ++ fp->_IO_read_end += count; ++ if (count == 0) ++ return EOF; ++ if (fp->_old_offset != _IO_pos_BAD) ++ _IO_pos_adjust (fp->_old_offset, count); ++ return *(unsigned char *) fp->_IO_read_ptr; ++} ++ ++int ++_IO_old_file_overflow (f, ch) ++ _IO_FILE *f; ++ int ch; ++{ ++ if (f->_flags & _IO_NO_WRITES) /* SET ERROR */ ++ { ++ f->_flags |= _IO_ERR_SEEN; ++ __set_errno (EBADF); ++ return EOF; ++ } ++ /* If currently reading or no buffer allocated. */ ++ if ((f->_flags & _IO_CURRENTLY_PUTTING) == 0) ++ { ++ /* Allocate a buffer if needed. */ ++ if (f->_IO_write_base == 0) ++ { ++ _IO_doallocbuf (f); ++ _IO_setg (f, f->_IO_buf_base, f->_IO_buf_base, f->_IO_buf_base); ++ } ++ /* Otherwise must be currently reading. ++ If _IO_read_ptr (and hence also _IO_read_end) is at the buffer end, ++ logically slide the buffer forwards one block (by setting the ++ read pointers to all point at the beginning of the block). This ++ makes room for subsequent output. ++ Otherwise, set the read pointers to _IO_read_end (leaving that ++ alone, so it can continue to correspond to the external position). */ ++ if (f->_IO_read_ptr == f->_IO_buf_end) ++ f->_IO_read_end = f->_IO_read_ptr = f->_IO_buf_base; ++ f->_IO_write_ptr = f->_IO_read_ptr; ++ f->_IO_write_base = f->_IO_write_ptr; ++ f->_IO_write_end = f->_IO_buf_end; ++ f->_IO_read_base = f->_IO_read_ptr = f->_IO_read_end; ++ ++ if (f->_flags & (_IO_LINE_BUF+_IO_UNBUFFERED)) ++ f->_IO_write_end = f->_IO_write_ptr; ++ f->_flags |= _IO_CURRENTLY_PUTTING; ++ } ++ if (ch == EOF) ++ return _IO_old_do_flush (f); ++ if (f->_IO_write_ptr == f->_IO_buf_end ) /* Buffer is really full */ ++ if (_IO_old_do_flush (f) == EOF) ++ return EOF; ++ *f->_IO_write_ptr++ = ch; ++ if ((f->_flags & _IO_UNBUFFERED) ++ || ((f->_flags & _IO_LINE_BUF) && ch == '\n')) ++ if (_IO_old_do_flush (f) == EOF) ++ return EOF; ++ return (unsigned char) ch; ++} ++ ++int ++_IO_old_file_sync (fp) ++ _IO_FILE *fp; ++{ ++ _IO_size_t delta; ++ int retval = 0; ++ ++ _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp); ++ _IO_flockfile (fp); ++ /* char* ptr = cur_ptr(); */ ++ if (fp->_IO_write_ptr > fp->_IO_write_base) ++ if (_IO_old_do_flush(fp)) return EOF; ++ delta = fp->_IO_read_ptr - fp->_IO_read_end; ++ if (delta != 0) ++ { ++#ifdef TODO ++ if (_IO_in_backup (fp)) ++ delta -= eGptr () - Gbase (); ++#endif ++ _IO_off_t new_pos = _IO_SYSSEEK (fp, delta, 1); ++ if (new_pos != (_IO_off_t) EOF) ++ fp->_IO_read_end = fp->_IO_read_ptr; ++#ifdef ESPIPE ++ else if (errno == ESPIPE) ++ ; /* Ignore error from unseekable devices. */ ++#endif ++ else ++ retval = EOF; ++ } ++ if (retval != EOF) ++ fp->_old_offset = _IO_pos_BAD; ++ /* FIXME: Cleanup - can this be shared? */ ++ /* setg(base(), ptr, ptr); */ ++ _IO_funlockfile (fp); ++ _IO_cleanup_region_end (0); ++ return retval; ++} ++ ++_IO_fpos64_t ++_IO_old_file_seekoff (fp, offset, dir, mode) ++ _IO_FILE *fp; ++ _IO_off64_t offset; ++ int dir; ++ int mode; ++{ ++ _IO_pos_t result; ++ _IO_off64_t delta, new_offset; ++ long count; ++ /* POSIX.1 8.2.3.7 says that after a call the fflush() the file ++ offset of the underlying file must be exact. */ ++ int must_be_exact = (fp->_IO_read_base == fp->_IO_read_end ++ && fp->_IO_write_base == fp->_IO_write_ptr); ++ ++ if (mode == 0) ++ dir = _IO_seek_cur, offset = 0; /* Don't move any pointers. */ ++ ++ /* Flush unwritten characters. ++ (This may do an unneeded write if we seek within the buffer. ++ But to be able to switch to reading, we would need to set ++ egptr to ptr. That can't be done in the current design, ++ which assumes file_ptr() is eGptr. Anyway, since we probably ++ end up flushing when we close(), it doesn't make much difference.) ++ FIXME: simulate mem-papped files. */ ++ ++ if (fp->_IO_write_ptr > fp->_IO_write_base || _IO_in_put_mode (fp)) ++ if (_IO_switch_to_get_mode (fp)) ++ return EOF; ++ ++ if (fp->_IO_buf_base == NULL) ++ { ++ _IO_doallocbuf (fp); ++ _IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base); ++ _IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base, fp->_IO_buf_base); ++ } ++ ++ switch (dir) ++ { ++ case _IO_seek_cur: ++ /* Adjust for read-ahead (bytes is buffer). */ ++ offset -= fp->_IO_read_end - fp->_IO_read_ptr; ++ if (fp->_old_offset == _IO_pos_BAD) ++ goto dumb; ++ /* Make offset absolute, assuming current pointer is file_ptr(). */ ++ offset += _IO_pos_as_off (fp->_old_offset); ++ ++ dir = _IO_seek_set; ++ break; ++ case _IO_seek_set: ++ break; ++ case _IO_seek_end: ++ { ++ struct _G_stat64 st; ++ if (_IO_SYSSTAT (fp, &st) == 0 && S_ISREG (st.st_mode)) ++ { ++ offset += st.st_size; ++ dir = _IO_seek_set; ++ } ++ else ++ goto dumb; ++ } ++ } ++ /* At this point, dir==_IO_seek_set. */ ++ ++ /* If destination is within current buffer, optimize: */ ++ if (fp->_old_offset != _IO_pos_BAD && fp->_IO_read_base != NULL ++ && !_IO_in_backup (fp)) ++ { ++ /* Offset relative to start of main get area. */ ++ _IO_pos_t rel_offset = (offset - fp->_old_offset ++ + (fp->_IO_read_end - fp->_IO_read_base)); ++ if (rel_offset >= 0) ++ { ++#if 0 ++ if (_IO_in_backup (fp)) ++ _IO_switch_to_main_get_area (fp); ++#endif ++ if (rel_offset <= fp->_IO_read_end - fp->_IO_read_base) ++ { ++ _IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base + rel_offset, ++ fp->_IO_read_end); ++ _IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base); ++ goto resync; ++ } ++#ifdef TODO ++ /* If we have streammarkers, seek forward by reading ahead. */ ++ if (_IO_have_markers (fp)) ++ { ++ int to_skip = rel_offset ++ - (fp->_IO_read_ptr - fp->_IO_read_base); ++ if (ignore (to_skip) != to_skip) ++ goto dumb; ++ goto resync; ++ } ++#endif ++ } ++#ifdef TODO ++ if (rel_offset < 0 && rel_offset >= Bbase () - Bptr ()) ++ { ++ if (!_IO_in_backup (fp)) ++ _IO_switch_to_backup_area (fp); ++ gbump (fp->_IO_read_end + rel_offset - fp->_IO_read_ptr); ++ goto resync; ++ } ++#endif ++ } ++ ++#ifdef TODO ++ _IO_unsave_markers (fp); ++#endif ++ ++ if (fp->_flags & _IO_NO_READS) ++ goto dumb; ++ ++ /* Try to seek to a block boundary, to improve kernel page management. */ ++ new_offset = offset & ~(fp->_IO_buf_end - fp->_IO_buf_base - 1); ++ delta = offset - new_offset; ++ if (delta > fp->_IO_buf_end - fp->_IO_buf_base) ++ { ++ new_offset = offset; ++ delta = 0; ++ } ++ result = _IO_SYSSEEK (fp, new_offset, 0); ++ if (result < 0) ++ return EOF; ++ if (delta == 0) ++ count = 0; ++ else ++ { ++ count = _IO_SYSREAD (fp, fp->_IO_buf_base, ++ (must_be_exact ++ ? delta : fp->_IO_buf_end - fp->_IO_buf_base)); ++ if (count < delta) ++ { ++ /* We weren't allowed to read, but try to seek the remainder. */ ++ offset = count == EOF ? delta : delta-count; ++ dir = _IO_seek_cur; ++ goto dumb; ++ } ++ } ++ _IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base + delta, ++ fp->_IO_buf_base + count); ++ _IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base); ++ fp->_old_offset = result + count; ++ _IO_mask_flags (fp, 0, _IO_EOF_SEEN); ++ return offset; ++ dumb: ++ ++ _IO_unsave_markers (fp); ++ result = _IO_SYSSEEK (fp, offset, dir); ++ if (result != EOF) ++ { ++ _IO_mask_flags (fp, 0, _IO_EOF_SEEN); ++ fp->_old_offset = result; ++ _IO_setg (fp, fp->_IO_buf_base, fp->_IO_buf_base, fp->_IO_buf_base); ++ _IO_setp (fp, fp->_IO_buf_base, fp->_IO_buf_base); ++ } ++ return result; ++ ++resync: ++ /* We need to do it since it is possible that the file offset in ++ the kernel may be changed behind our back. It may happen when ++ we fopen a file and then do a fork. One process may access the ++ the file and the kernel file offset will be changed. */ ++ if (fp->_old_offset >= 0) ++ _IO_SYSSEEK (fp, fp->_old_offset, 0); ++ ++ return offset; ++} ++ ++_IO_ssize_t ++_IO_old_file_write (f, data, n) ++ _IO_FILE *f; ++ const void *data; ++ _IO_ssize_t n; ++{ ++ _IO_ssize_t to_do = n; ++ while (to_do > 0) ++ { ++ _IO_ssize_t count = write (f->_fileno, data, to_do); ++ if (count == EOF) ++ { ++ f->_flags |= _IO_ERR_SEEN; ++ break; ++ } ++ to_do -= count; ++ data = (void *) ((char *) data + count); ++ } ++ n -= to_do; ++ if (f->_old_offset >= 0) ++ f->_old_offset += n; ++ return n; ++} ++ ++_IO_size_t ++_IO_old_file_xsputn (f, data, n) ++ _IO_FILE *f; ++ const void *data; ++ _IO_size_t n; ++{ ++ register const char *s = (char *) data; ++ _IO_size_t to_do = n; ++ int must_flush = 0; ++ _IO_size_t count; ++ ++ if (n <= 0) ++ return 0; ++ /* This is an optimized implementation. ++ If the amount to be written straddles a block boundary ++ (or the filebuf is unbuffered), use sys_write directly. */ ++ ++ /* First figure out how much space is available in the buffer. */ ++ count = f->_IO_write_end - f->_IO_write_ptr; /* Space available. */ ++ if ((f->_flags & _IO_LINE_BUF) && (f->_flags & _IO_CURRENTLY_PUTTING)) ++ { ++ count = f->_IO_buf_end - f->_IO_write_ptr; ++ if (count >= n) ++ { ++ register const char *p; ++ for (p = s + n; p > s; ) ++ { ++ if (*--p == '\n') ++ { ++ count = p - s + 1; ++ must_flush = 1; ++ break; ++ } ++ } ++ } ++ } ++ /* Then fill the buffer. */ ++ if (count > 0) ++ { ++ if (count > to_do) ++ count = to_do; ++ if (count > 20) ++ { ++ memcpy (f->_IO_write_ptr, s, count); ++ s += count; ++ } ++ else ++ { ++ register char *p = f->_IO_write_ptr; ++ register int i = (int) count; ++ while (--i >= 0) ++ *p++ = *s++; ++ } ++ f->_IO_write_ptr += count; ++ to_do -= count; ++ } ++ if (to_do + must_flush > 0) ++ { ++ _IO_size_t block_size, do_write; ++ /* Next flush the (full) buffer. */ ++ if (__overflow (f, EOF) == EOF) ++ return n - to_do; ++ ++ /* Try to maintain alignment: write a whole number of blocks. ++ dont_write is what gets left over. */ ++ block_size = f->_IO_buf_end - f->_IO_buf_base; ++ do_write = to_do - (block_size >= 128 ? to_do % block_size : 0); ++ ++ if (do_write) ++ { ++ count = old_do_write (f, s, do_write); ++ to_do -= count; ++ if (count < do_write) ++ return n - to_do; ++ } ++ ++ /* Now write out the remainder. Normally, this will fit in the ++ buffer, but it's somewhat messier for line-buffered files, ++ so we let _IO_default_xsputn handle the general case. */ ++ if (to_do) ++ to_do -= _IO_default_xsputn (f, s+do_write, to_do); ++ } ++ return n - to_do; ++} ++ ++ ++struct _IO_jump_t _IO_old_file_jumps = ++{ ++ JUMP_INIT_DUMMY, ++ JUMP_INIT(finish, _IO_old_file_finish), ++ JUMP_INIT(overflow, _IO_old_file_overflow), ++ JUMP_INIT(underflow, _IO_old_file_underflow), ++ JUMP_INIT(uflow, _IO_default_uflow), ++ JUMP_INIT(pbackfail, _IO_default_pbackfail), ++ JUMP_INIT(xsputn, _IO_old_file_xsputn), ++ JUMP_INIT(xsgetn, _IO_default_xsgetn), ++ JUMP_INIT(seekoff, _IO_old_file_seekoff), ++ JUMP_INIT(seekpos, _IO_default_seekpos), ++ JUMP_INIT(setbuf, _IO_old_file_setbuf), ++ JUMP_INIT(sync, _IO_old_file_sync), ++ JUMP_INIT(doallocate, _IO_file_doallocate), ++ JUMP_INIT(read, _IO_file_read), ++ JUMP_INIT(write, _IO_old_file_write), ++ JUMP_INIT(seek, _IO_file_seek), ++ JUMP_INIT(close, _IO_file_close), ++ JUMP_INIT(stat, _IO_file_stat) ++}; ++ ++#ifdef SHARED ++symbol_version (_IO_old_do_write, _IO_do_write, GLIBC_2.0); ++symbol_version (_IO_old_file_attach, _IO_file_attach, GLIBC_2.0); ++symbol_version (_IO_old_file_close_it, _IO_file_close_it, GLIBC_2.0); ++symbol_version (_IO_old_file_finish, _IO_file_finish, GLIBC_2.0); ++symbol_version (_IO_old_file_fopen, _IO_file_fopen, GLIBC_2.0); ++symbol_version (_IO_old_file_init, _IO_file_init, GLIBC_2.0); ++symbol_version (_IO_old_file_setbuf, _IO_file_setbuf, GLIBC_2.0); ++symbol_version (_IO_old_file_sync, _IO_file_sync, GLIBC_2.0); ++symbol_version (_IO_old_file_overflow, _IO_file_overflow, GLIBC_2.0); ++symbol_version (_IO_old_file_seekoff, _IO_file_seekoff, GLIBC_2.0); ++symbol_version (_IO_old_file_underflow, _IO_file_underflow, GLIBC_2.0); ++symbol_version (_IO_old_file_write, _IO_file_write, GLIBC_2.0); ++symbol_version (_IO_old_file_xsputn, _IO_file_xsputn, GLIBC_2.0); ++#else ++strong_alias (_IO_old_do_write, _IO_do_write); ++strong_alias (_IO_old_file_attach, _IO_file_attach); ++strong_alias (_IO_old_file_close_it, _IO_file_close_it); ++strong_alias (_IO_old_file_finish, _IO_file_finish); ++strong_alias (_IO_old_file_fopen, _IO_file_fopen); ++strong_alias (_IO_old_file_init, _IO_file_init); ++strong_alias (_IO_old_file_setbuf, _IO_file_setbuf); ++strong_alias (_IO_old_file_sync, _IO_file_sync); ++strong_alias (_IO_old_file_overflow, _IO_file_overflow); ++strong_alias (_IO_old_file_seekoff, _IO_file_seekoff); ++strong_alias (_IO_old_file_underflow, _IO_file_underflow); ++strong_alias (_IO_old_file_write, _IO_file_write); ++strong_alias (_IO_old_file_xsputn, _IO_file_xsputn); ++#endif +diff -Naur ../glibc-2.1.3/glibc-compat/oldiofclose.c glibc-2.1.3/glibc-compat/oldiofclose.c +--- ../glibc-2.1.3/glibc-compat/oldiofclose.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/oldiofclose.c 2000-01-03 17:07:07.000000000 -0800 +@@ -0,0 +1,60 @@ ++/* Copyright (C) 1993, 1995, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU IO Library. ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU General Public License as ++ published by the Free Software Foundation; either version 2, 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 ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this library; see the file COPYING. If not, write to ++ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, ++ MA 02111-1307, USA. ++ ++ As a special exception, if you link this library with files ++ compiled with a GNU compiler to produce an executable, this does ++ not cause the resulting executable to be covered by the GNU General ++ Public License. This exception does not however invalidate any ++ other reasons why the executable file might be covered by the GNU ++ General Public License. */ ++ ++#define _IO_USE_OLD_IO_FILE ++#include "libioP.h" ++#ifdef __STDC__ ++#include <stdlib.h> ++#endif ++ ++int ++_IO_old_fclose (fp) ++ _IO_FILE *fp; ++{ ++ int status; ++ ++ CHECK_FILE(fp, EOF); ++ ++ _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp); ++ _IO_flockfile (fp); ++ if (fp->_IO_file_flags & _IO_IS_FILEBUF) ++ status = _IO_old_file_close_it (fp); ++ else ++ status = fp->_flags & _IO_ERR_SEEN ? -1 : 0; ++ _IO_FINISH (fp); ++ _IO_funlockfile (fp); ++ _IO_cleanup_region_end (0); ++ if (fp != _IO_stdin && fp != _IO_stdout && fp != _IO_stderr) ++ { ++ fp->_IO_file_flags = 0; ++ free(fp); ++ } ++ ++ return status; ++} ++ ++strong_alias (_IO_old_fclose, __old_fclose) ++symbol_version (_IO_old_fclose, _IO_fclose, GLIBC_2.0); ++symbol_version (__old_fclose, fclose, GLIBC_2.0); +diff -Naur ../glibc-2.1.3/glibc-compat/oldiofdopen.c glibc-2.1.3/glibc-compat/oldiofdopen.c +--- ../glibc-2.1.3/glibc-compat/oldiofdopen.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/oldiofdopen.c 2000-01-03 17:07:07.000000000 -0800 +@@ -0,0 +1,140 @@ ++/* Copyright (C) 1993, 1994, 1997 Free Software Foundation, Inc. ++ This file is part of the GNU IO Library. ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU General Public License as ++ published by the Free Software Foundation; either version 2, 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 ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this library; see the file COPYING. If not, write to ++ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, ++ MA 02111-1307, USA. ++ ++ As a special exception, if you link this library with files ++ compiled with a GNU compiler to produce an executable, this does ++ not cause the resulting executable to be covered by the GNU General ++ Public License. This exception does not however invalidate any ++ other reasons why the executable file might be covered by the GNU ++ General Public License. */ ++ ++#define _IO_USE_OLD_IO_FILE ++#ifdef __STDC__ ++# include <stdlib.h> ++#endif ++#include "libioP.h" ++#include <fcntl.h> ++ ++#ifndef _IO_fcntl ++# define _IO_fcntl __fcntl ++#endif ++ ++_IO_FILE * ++_IO_old_fdopen (fd, mode) ++ int fd; ++ const char *mode; ++{ ++ int read_write; ++ int posix_mode = 0; ++ struct locked_FILE ++ { ++ struct _IO_FILE_plus fp; ++#ifdef _IO_MTSAFE_IO ++ _IO_lock_t lock; ++#endif ++ } *new_f; ++ int fd_flags; ++ ++ switch (*mode++) ++ { ++ case 'r': ++ read_write = _IO_NO_WRITES; ++ break; ++ case 'w': ++ read_write = _IO_NO_READS; ++ break; ++ case 'a': ++ posix_mode = O_APPEND; ++ read_write = _IO_NO_READS|_IO_IS_APPENDING; ++ break; ++ default: ++ MAYBE_SET_EINVAL; ++ return NULL; ++ } ++ if (mode[0] == '+' || (mode[0] == 'b' && mode[1] == '+')) ++ read_write &= _IO_IS_APPENDING; ++#ifdef F_GETFL ++ fd_flags = _IO_fcntl (fd, F_GETFL); ++#ifndef O_ACCMODE ++#define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR) ++#endif ++ if (fd_flags == -1 ++ || ((fd_flags & O_ACCMODE) == O_RDONLY && !(read_write & _IO_NO_WRITES)) ++ || ((fd_flags & O_ACCMODE) == O_WRONLY && !(read_write & _IO_NO_READS))) ++ return NULL; ++ ++ /* The May 93 draft of P1003.4/D14.1 (redesignated as 1003.1b) ++ [System Application Program Interface (API) Amendment 1: ++ Realtime Extensions], Rationale B.8.3.3 ++ Open a Stream on a File Descriptor says: ++ ++ Although not explicitly required by POSIX.1, a good ++ implementation of append ("a") mode would cause the ++ O_APPEND flag to be set. ++ ++ (Historical implementations [such as Solaris2] do a one-time ++ seek in fdopen.) ++ ++ However, we do not turn O_APPEND off if the mode is "w" (even ++ though that would seem consistent) because that would be more ++ likely to break historical programs. ++ */ ++ if ((posix_mode & O_APPEND) && !(fd_flags & O_APPEND)) ++ { ++#ifdef F_SETFL ++ if (_IO_fcntl (fd, F_SETFL, fd_flags | O_APPEND) == -1) ++#endif ++ return NULL; ++ } ++#endif ++ ++ new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE)); ++ if (new_f == NULL) ++ return NULL; ++#ifdef _IO_MTSAFE_IO ++ new_f->fp.file._lock = &new_f->lock; ++#endif ++ _IO_init (&new_f->fp.file, 0); ++ _IO_JUMPS (&new_f->fp) = &_IO_old_file_jumps; ++ _IO_old_file_init (&new_f->fp.file); ++#if !_IO_UNIFIED_JUMPTABLES ++ new_f->fp.vtable = NULL; ++#endif ++ if (_IO_old_file_attach (&new_f->fp.file, fd) == NULL) ++ { ++ _IO_un_link (&new_f->fp.file); ++ free (new_f); ++ return NULL; ++ } ++ new_f->fp.file._flags &= ~_IO_DELETE_DONT_CLOSE; ++ ++ new_f->fp.file._IO_file_flags = ++ _IO_mask_flags (&new_f->fp.file, read_write, ++ _IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING); ++ ++ return (_IO_FILE *) &new_f->fp; ++} ++ ++#ifdef SHARED ++strong_alias (_IO_old_fdopen, __old_fdopen) ++symbol_version (_IO_old_fdopen, _IO_fdopen, GLIBC_2.0); ++symbol_version (__old_fdopen, fdopen, GLIBC_2.0); ++#else ++strong_alias (_IO_old_fdopen, _IO_fdopen); ++strong_alias (__old_fdopen, fdopen); ++#endif +diff -Naur ../glibc-2.1.3/glibc-compat/oldiofopen.c glibc-2.1.3/glibc-compat/oldiofopen.c +--- ../glibc-2.1.3/glibc-compat/oldiofopen.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/oldiofopen.c 2000-01-03 17:07:07.000000000 -0800 +@@ -0,0 +1,71 @@ ++/* Copyright (C) 1993, 1997 Free Software Foundation, Inc. ++ This file is part of the GNU IO Library. ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU General Public License as ++ published by the Free Software Foundation; either version 2, 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 ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this library; see the file COPYING. If not, write to ++ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, ++ MA 02111-1307, USA. ++ ++ As a special exception, if you link this library with files ++ compiled with a GNU compiler to produce an executable, this does ++ not cause the resulting executable to be covered by the GNU General ++ Public License. This exception does not however invalidate any ++ other reasons why the executable file might be covered by the GNU ++ General Public License. */ ++ ++#define _IO_USE_OLD_IO_FILE ++#include "libioP.h" ++#ifdef __STDC__ ++#include <stdlib.h> ++#endif ++ ++ ++_IO_FILE * ++_IO_old_fopen (filename, mode) ++ const char *filename; ++ const char *mode; ++{ ++ struct locked_FILE ++ { ++ struct _IO_FILE_plus fp; ++#ifdef _IO_MTSAFE_IO ++ _IO_lock_t lock; ++#endif ++ } *new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE)); ++ ++ if (new_f == NULL) ++ return NULL; ++#ifdef _IO_MTSAFE_IO ++ new_f->fp.file._lock = &new_f->lock; ++#endif ++ _IO_init (&new_f->fp.file, 0); ++ _IO_JUMPS (&new_f->fp.file) = &_IO_old_file_jumps; ++ _IO_old_file_init (&new_f->fp.file); ++#if !_IO_UNIFIED_JUMPTABLES ++ new_f->fp.vtable = NULL; ++#endif ++ if (_IO_old_file_fopen (&new_f->fp.file, filename, mode) != NULL) ++ return (_IO_FILE *) &new_f->fp; ++ _IO_un_link (&new_f->fp.file); ++ free (new_f); ++ return NULL; ++} ++ ++#ifdef SHARED ++strong_alias (_IO_old_fopen, __old_fopen) ++symbol_version (_IO_old_fopen, _IO_fopen, GLIBC_2.0); ++symbol_version (__old_fopen, fopen, GLIBC_2.0); ++#else ++strong_alias (_IO_old_fopen, _IO_fopen); ++strong_alias (__old_fopen, fopen); ++#endif +diff -Naur ../glibc-2.1.3/glibc-compat/oldiopopen.c glibc-2.1.3/glibc-compat/oldiopopen.c +--- ../glibc-2.1.3/glibc-compat/oldiopopen.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/oldiopopen.c 2000-01-03 17:07:07.000000000 -0800 +@@ -0,0 +1,289 @@ ++/* Copyright (C) 1998 Free Software Foundation, Inc. ++ This file is part of the GNU IO Library. ++ Written by Per Bothner <bothner@cygnus.com>. ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU General Public License as ++ published by the Free Software Foundation; either version 2, 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 ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this library; see the file COPYING. If not, write to ++ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, ++ MA 02111-1307, USA. ++ ++ As a special exception, if you link this library with files ++ compiled with a GNU compiler to produce an executable, this does ++ not cause the resulting executable to be covered by the GNU General ++ Public License. This exception does not however invalidate any ++ other reasons why the executable file might be covered by the GNU ++ General Public License. */ ++ ++#define _IO_USE_OLD_IO_FILE ++#ifndef _POSIX_SOURCE ++# define _POSIX_SOURCE ++#endif ++#include "libioP.h" ++#if _IO_HAVE_SYS_WAIT ++#include <signal.h> ++#include <unistd.h> ++#ifdef __STDC__ ++#include <stdlib.h> ++#endif ++#ifdef _LIBC ++# include <unistd.h> ++#endif ++#include <sys/types.h> ++#include <sys/wait.h> ++ ++#ifndef _IO_fork ++#ifdef _LIBC ++#define _IO_fork __vfork ++#else ++#define _IO_fork vfork /* defined in libiberty, if needed */ ++#endif ++extern _IO_pid_t _IO_fork __P ((void)); ++#endif ++ ++#endif /* _IO_HAVE_SYS_WAIT */ ++ ++#ifndef _IO_pipe ++#ifdef _LIBC ++#define _IO_pipe __pipe ++#else ++#define _IO_pipe pipe ++#endif ++extern int _IO_pipe __P ((int des[2])); ++#endif ++ ++#ifndef _IO_dup2 ++#ifdef _LIBC ++#define _IO_dup2 __dup2 ++#else ++#define _IO_dup2 dup2 ++#endif ++extern int _IO_dup2 __P ((int fd, int fd2)); ++#endif ++ ++#ifndef _IO_waitpid ++#ifdef _LIBC ++#define _IO_waitpid __waitpid ++#else ++#define _IO_waitpid waitpid ++#endif ++#endif ++ ++#ifndef _IO_execl ++#define _IO_execl execl ++#endif ++#ifndef _IO__exit ++#define _IO__exit _exit ++#endif ++ ++#ifndef _IO_close ++#ifdef _LIBC ++#define _IO_close __close ++#else ++#define _IO_close close ++#endif ++#endif ++ ++struct _IO_proc_file ++{ ++ struct _IO_FILE_plus file; ++ /* Following fields must match those in class procbuf (procbuf.h) */ ++ _IO_pid_t pid; ++ struct _IO_proc_file *next; ++}; ++typedef struct _IO_proc_file _IO_proc_file; ++ ++static struct _IO_proc_file *old_proc_file_chain = NULL; ++ ++_IO_FILE * ++_IO_old_proc_open (fp, command, mode) ++ _IO_FILE *fp; ++ const char *command; ++ const char *mode; ++{ ++#if _IO_HAVE_SYS_WAIT ++ volatile int read_or_write; ++ volatile int parent_end, child_end; ++ int pipe_fds[2]; ++ _IO_pid_t child_pid; ++ if (_IO_file_is_open (fp)) ++ return NULL; ++ if (_IO_pipe (pipe_fds) < 0) ++ return NULL; ++ if (mode[0] == 'r' && mode[1] == '\0') ++ { ++ parent_end = pipe_fds[0]; ++ child_end = pipe_fds[1]; ++ read_or_write = _IO_NO_WRITES; ++ } ++ else if (mode[0] == 'w' && mode[1] == '\0') ++ { ++ parent_end = pipe_fds[1]; ++ child_end = pipe_fds[0]; ++ read_or_write = _IO_NO_READS; ++ } ++ else ++ { ++ __set_errno (EINVAL); ++ return NULL; ++ } ++ ((_IO_proc_file *) fp)->pid = child_pid = _IO_fork (); ++ if (child_pid == 0) ++ { ++ int child_std_end = mode[0] == 'r' ? 1 : 0; ++ _IO_close (parent_end); ++ if (child_end != child_std_end) ++ { ++ _IO_dup2 (child_end, child_std_end); ++ _IO_close (child_end); ++ } ++ /* POSIX.2: "popen() shall ensure that any streams from previous ++ popen() calls that remain open in the parent process are closed ++ in the new child process." */ ++ while (old_proc_file_chain) ++ { ++ _IO_close (_IO_fileno ((_IO_FILE *) old_proc_file_chain)); ++ old_proc_file_chain = old_proc_file_chain->next; ++ } ++ ++ _IO_execl ("/bin/sh", "sh", "-c", command, (char *) 0); ++ _IO__exit (127); ++ } ++ _IO_close (child_end); ++ if (child_pid < 0) ++ { ++ _IO_close (parent_end); ++ return NULL; ++ } ++ _IO_fileno (fp) = parent_end; ++ ++ /* Link into old_proc_file_chain. */ ++ ((_IO_proc_file *) fp)->next = old_proc_file_chain; ++ old_proc_file_chain = (_IO_proc_file *) fp; ++ ++ _IO_mask_flags (fp, read_or_write, _IO_NO_READS|_IO_NO_WRITES); ++ return fp; ++#else /* !_IO_HAVE_SYS_WAIT */ ++ return NULL; ++#endif ++} ++ ++_IO_FILE * ++_IO_old_popen (command, mode) ++ const char *command; ++ const char *mode; ++{ ++ struct locked_FILE ++ { ++ struct _IO_proc_file fpx; ++#ifdef _IO_MTSAFE_IO ++ _IO_lock_t lock; ++#endif ++ } *new_f; ++ _IO_FILE *fp; ++ ++ new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE)); ++ if (new_f == NULL) ++ return NULL; ++#ifdef _IO_MTSAFE_IO ++ new_f->fpx.file.file._lock = &new_f->lock; ++#endif ++ fp = &new_f->fpx.file.file; ++ _IO_init (fp, 0); ++ _IO_JUMPS (fp) = &_IO_old_proc_jumps; ++ _IO_old_file_init (fp); ++#if !_IO_UNIFIED_JUMPTABLES ++ new_f->fpx.file.vtable = NULL; ++#endif ++ if (_IO_old_proc_open (fp, command, mode) != NULL) ++ return fp; ++ _IO_un_link (fp); ++ free (new_f); ++ return NULL; ++} ++ ++int ++_IO_old_proc_close (fp) ++ _IO_FILE *fp; ++{ ++ /* This is not name-space clean. FIXME! */ ++#if _IO_HAVE_SYS_WAIT ++ int wstatus; ++ _IO_proc_file **ptr = &old_proc_file_chain; ++ _IO_pid_t wait_pid; ++ int status = -1; ++ ++ /* Unlink from old_proc_file_chain. */ ++ for ( ; *ptr != NULL; ptr = &(*ptr)->next) ++ { ++ if (*ptr == (_IO_proc_file *) fp) ++ { ++ *ptr = (*ptr)->next; ++ status = 0; ++ break; ++ } ++ } ++ ++ if (status < 0 || _IO_close (_IO_fileno(fp)) < 0) ++ return -1; ++ /* POSIX.2 Rationale: "Some historical implementations either block ++ or ignore the signals SIGINT, SIGQUIT, and SIGHUP while waiting ++ for the child process to terminate. Since this behavior is not ++ described in POSIX.2, such implementations are not conforming." */ ++ do ++ { ++ wait_pid = _IO_waitpid (((_IO_proc_file *) fp)->pid, &wstatus, 0); ++ } ++ while (wait_pid == -1 && errno == EINTR); ++ if (wait_pid == -1) ++ return -1; ++ return wstatus; ++#else /* !_IO_HAVE_SYS_WAIT */ ++ return -1; ++#endif ++} ++ ++struct _IO_jump_t _IO_old_proc_jumps = { ++ JUMP_INIT_DUMMY, ++ JUMP_INIT(finish, _IO_old_file_finish), ++ JUMP_INIT(overflow, _IO_old_file_overflow), ++ JUMP_INIT(underflow, _IO_old_file_underflow), ++ JUMP_INIT(uflow, _IO_default_uflow), ++ JUMP_INIT(pbackfail, _IO_default_pbackfail), ++ JUMP_INIT(xsputn, _IO_old_file_xsputn), ++ JUMP_INIT(xsgetn, _IO_default_xsgetn), ++ JUMP_INIT(seekoff, _IO_old_file_seekoff), ++ JUMP_INIT(seekpos, _IO_default_seekpos), ++ JUMP_INIT(setbuf, _IO_old_file_setbuf), ++ JUMP_INIT(sync, _IO_old_file_sync), ++ JUMP_INIT(doallocate, _IO_file_doallocate), ++ JUMP_INIT(read, _IO_file_read), ++ JUMP_INIT(write, _IO_old_file_write), ++ JUMP_INIT(seek, _IO_file_seek), ++ JUMP_INIT(close, _IO_old_proc_close), ++ JUMP_INIT(stat, _IO_file_stat), ++ JUMP_INIT(showmanyc, _IO_default_showmanyc), ++ JUMP_INIT(imbue, _IO_default_imbue) ++}; ++ ++#ifdef SHARED ++strong_alias (_IO_old_popen, __old_popen) ++symbol_version (_IO_old_popen, _IO_popen, GLIBC_2.0); ++symbol_version (__old_popen, popen, GLIBC_2.0); ++symbol_version (_IO_old_proc_open, _IO_proc_open, GLIBC_2.0); ++symbol_version (_IO_old_proc_close, _IO_proc_close, GLIBC_2.0); ++#else ++strong_alias (_IO_old_popen, _IO_popen); ++strong_alias (__old_popen, popen); ++strong_alias (_IO_old_proc_open, _IO_proc_open); ++strong_alias (_IO_old_proc_close, _IO_proc_close); ++#endif +diff -Naur ../glibc-2.1.3/glibc-compat/oldpclose.c glibc-2.1.3/glibc-compat/oldpclose.c +--- ../glibc-2.1.3/glibc-compat/oldpclose.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/oldpclose.c 2000-01-03 17:07:07.000000000 -0800 +@@ -0,0 +1,48 @@ ++/* Copyright (C) 1998 Free Software Foundation, Inc. ++ This file is part of the GNU IO Library. ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU General Public License as ++ published by the Free Software Foundation; either version 2, 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 ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this library; see the file COPYING. If not, write to ++ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, ++ MA 02111-1307, USA. ++ ++ As a special exception, if you link this library with files ++ compiled with a GNU compiler to produce an executable, this does ++ not cause the resulting executable to be covered by the GNU General ++ Public License. This exception does not however invalidate any ++ other reasons why the executable file might be covered by the GNU ++ General Public License. */ ++ ++#define _IO_USE_OLD_IO_FILE ++#include "libioP.h" ++#include "stdio.h" ++#include <errno.h> ++ ++int ++__old_pclose (fp) ++ FILE *fp; ++{ ++#if 0 ++ /* Does not actually test that stream was created by popen(). Instead, ++ it depends on the filebuf::sys_close() virtual to Do The Right Thing. */ ++ if (fp is not a proc_file) ++ return -1; ++#endif ++ return _IO_old_fclose (fp); ++} ++ ++#ifdef SHARED ++symbol_version (__old_pclose, pclose, GLIBC_2.0); ++#else ++strong_alias (__old_pclose, pclose); ++#endif +diff -Naur ../glibc-2.1.3/glibc-compat/oldstdfiles.c glibc-2.1.3/glibc-compat/oldstdfiles.c +--- ../glibc-2.1.3/glibc-compat/oldstdfiles.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/oldstdfiles.c 2000-01-03 17:07:07.000000000 -0800 +@@ -0,0 +1,97 @@ ++/* Copyright (C) 1993, 1994, 1996, 1997 Free Software Foundation, Inc. ++ This file is part of the GNU IO Library. ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU General Public License as ++ published by the Free Software Foundation; either version 2, 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 ++ General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this library; see the file COPYING. If not, write to ++ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, ++ MA 02111-1307, USA. ++ ++ As a special exception, if you link this library with files ++ compiled with a GNU compiler to produce an executable, this does ++ not cause the resulting executable to be covered by the GNU General ++ Public License. This exception does not however invalidate any ++ other reasons why the executable file might be covered by the GNU ++ General Public License. */ ++ ++ ++/* This file provides definitions of _IO_stdin, _IO_stdout, and _IO_stderr ++ for C code. Compare stdstreams.cc. ++ (The difference is that here the vtable field is set to 0, ++ so the objects defined are not valid C++ objects. On the other ++ hand, we don't need a C++ compiler to build this file.) */ ++ ++#define _IO_USE_OLD_IO_FILE ++#include "libioP.h" ++ ++#ifdef _IO_MTSAFE_IO ++#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), &_IO_old_file_jumps}; ++#else ++#define DEF_STDFILE(NAME, FD, CHAIN, FLAGS) \ ++ struct _IO_FILE_plus NAME \ ++ = {FILEBUF_LITERAL(CHAIN, FLAGS, FD), &_IO_old_file_jumps}; ++#endif ++ ++DEF_STDFILE(_IO_stdin_, 0, 0, _IO_NO_WRITES); ++DEF_STDFILE(_IO_stdout_, 1, &_IO_stdin_.file, _IO_NO_READS); ++DEF_STDFILE(_IO_stderr_, 2, &_IO_stdout_.file, ++ _IO_NO_READS+_IO_UNBUFFERED); ++ ++#if defined __GNUC__ && __GNUC__ >= 2 ++ ++#include <stdio.h> ++ ++extern const int _IO_stdin_used; ++weak_extern (_IO_stdin_used); ++ ++#undef stdin ++#undef stdout ++#undef stderr ++ ++extern FILE *stdin; ++extern FILE *stdout; ++extern FILE *stderr; ++ ++#ifdef SHARED ++extern ++#endif ++FILE *_IO_list_all; ++ ++static void _IO_check_libio __P ((void)) __attribute__ ((constructor)); ++ ++/* This function determines which shared C library the application ++ was linked against. We then set up the stdin/stdout/stderr and ++ _IO_list_all accordingly. */ ++ ++static void ++_IO_check_libio () ++{ ++#ifdef SHARED ++ if (&_IO_stdin_used == NULL) ++#endif ++ { ++ /* We are using the old one. */ ++ _IO_stdin = stdin = &_IO_stdin_.file; ++ _IO_stdout = stdout = &_IO_stdout_.file; ++ _IO_stderr = stderr = _IO_list_all = &_IO_stderr_.file; ++ _IO_stdin->_vtable_offset = _IO_stdout->_vtable_offset = ++ _IO_stderr->_vtable_offset = stdin->_vtable_offset = ++ stdout->_vtable_offset = stderr->_vtable_offset = ++ ((int) sizeof (struct _IO_FILE) ++ - (int) sizeof (struct _IO_FILE_complete)); ++ } ++} ++ ++#endif +diff -Naur ../glibc-2.1.3/glibc-compat/oldtmpfile.c glibc-2.1.3/glibc-compat/oldtmpfile.c +--- ../glibc-2.1.3/glibc-compat/oldtmpfile.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/oldtmpfile.c 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,55 @@ ++/* Copyright (C) 1991, 1993, 1996, 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 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. */ ++ ++#define _IO_USE_OLD_IO_FILE ++#include <stdio.h> ++#include <unistd.h> ++#include <iolibio.h> ++ ++/* This returns a new stream opened on a temporary file (generated ++ by tmpnam). The file is opened with mode "w+b" (binary read/write). ++ If we couldn't generate a unique filename or the file couldn't ++ be opened, NULL is returned. */ ++FILE * ++__old_tmpfile (void) ++{ ++ char buf[FILENAME_MAX]; ++ int fd; ++ FILE *f; ++ ++ if (__path_search (buf, FILENAME_MAX, NULL, "tmpf", 0)) ++ return NULL; ++ fd = __gen_tempname (buf, 1, 0); ++ if (fd < 0) ++ return NULL; ++ ++ /* Note that this relies on the Unix semantics that ++ a file is not really removed until it is closed. */ ++ (void) remove (buf); ++ ++ if ((f = _IO_old_fdopen (fd, "w+b")) == NULL) ++ __close (fd); ++ ++ return f; ++} ++ ++#ifdef SHARED ++symbol_version (__old_tmpfile, tmpfile, GLIBC_2.0); ++#else ++strong_alias (__old_tmpfile, tmpfile); ++#endif +diff -Naur ../glibc-2.1.3/glibc-compat/rpcsvc/yp.h glibc-2.1.3/glibc-compat/rpcsvc/yp.h +--- ../glibc-2.1.3/glibc-compat/rpcsvc/yp.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/rpcsvc/yp.h 2000-01-03 18:17:33.000000000 -0800 +@@ -0,0 +1,621 @@ ++/* ++ * Sun RPC is a product of Sun Microsystems, Inc. and is provided for ++ * unrestricted use provided that this legend is included on all tape ++ * media and as a part of the software program in whole or part. Users ++ * may copy or modify Sun RPC without charge, but are not authorized ++ * to license or distribute it to anyone else except as part of a product or ++ * program developed by the user. ++ * ++ * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE ++ * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR ++ * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. ++ * ++ * Sun RPC is provided with no support and without any obligation on the ++ * part of Sun Microsystems, Inc. to assist in its use, correction, ++ * modification or enhancement. ++ * ++ * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE ++ * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC ++ * OR ANY PART THEREOF. ++ * ++ * In no event will Sun Microsystems, Inc. be liable for any lost revenue ++ * or profits or other special, indirect and consequential damages, even if ++ * Sun has been advised of the possibility of such damages. ++ * ++ * Sun Microsystems, Inc. ++ * 2550 Garcia Avenue ++ * Mountain View, California 94043 ++ */ ++ ++#ifndef __RPCSVC_YP_H__ ++#define __RPCSVC_YP_H__ ++ ++#include <rpc/rpc.h> ++ ++#define YPMAXRECORD 1024 ++#define YPMAXDOMAIN 64 ++#define YPMAXMAP 64 ++#define YPMAXPEER 64 ++ ++enum ypstat { ++ YP_TRUE = 1, ++ YP_NOMORE = 2, ++ YP_FALSE = 0, ++ YP_NOMAP = -1, ++ YP_NODOM = -2, ++ YP_NOKEY = -3, ++ YP_BADOP = -4, ++ YP_BADDB = -5, ++ YP_YPERR = -6, ++ YP_BADARGS = -7, ++ YP_VERS = -8, ++}; ++typedef enum ypstat ypstat; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypstat(XDR *, ypstat*); ++#elif __STDC__ ++extern bool_t xdr_ypstat(XDR *, ypstat*); ++#else /* Old Style C */ ++bool_t xdr_ypstat(); ++#endif /* Old Style C */ ++ ++ ++enum ypxfrstat { ++ YPXFR_SUCC = 1, ++ YPXFR_AGE = 2, ++ YPXFR_NOMAP = -1, ++ YPXFR_NODOM = -2, ++ YPXFR_RSRC = -3, ++ YPXFR_RPC = -4, ++ YPXFR_MADDR = -5, ++ YPXFR_YPERR = -6, ++ YPXFR_BADARGS = -7, ++ YPXFR_DBM = -8, ++ YPXFR_FILE = -9, ++ YPXFR_SKEW = -10, ++ YPXFR_CLEAR = -11, ++ YPXFR_FORCE = -12, ++ YPXFR_XFRERR = -13, ++ YPXFR_REFUSED = -14, ++}; ++typedef enum ypxfrstat ypxfrstat; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypxfrstat(XDR *, ypxfrstat*); ++#elif __STDC__ ++extern bool_t xdr_ypxfrstat(XDR *, ypxfrstat*); ++#else /* Old Style C */ ++bool_t xdr_ypxfrstat(); ++#endif /* Old Style C */ ++ ++ ++typedef char *domainname; ++#ifdef __cplusplus ++extern "C" bool_t xdr_domainname(XDR *, domainname*); ++#elif __STDC__ ++extern bool_t xdr_domainname(XDR *, domainname*); ++#else /* Old Style C */ ++bool_t xdr_domainname(); ++#endif /* Old Style C */ ++ ++ ++typedef char *mapname; ++#ifdef __cplusplus ++extern "C" bool_t xdr_mapname(XDR *, mapname*); ++#elif __STDC__ ++extern bool_t xdr_mapname(XDR *, mapname*); ++#else /* Old Style C */ ++bool_t xdr_mapname(); ++#endif /* Old Style C */ ++ ++ ++typedef char *peername; ++#ifdef __cplusplus ++extern "C" bool_t xdr_peername(XDR *, peername*); ++#elif __STDC__ ++extern bool_t xdr_peername(XDR *, peername*); ++#else /* Old Style C */ ++bool_t xdr_peername(); ++#endif /* Old Style C */ ++ ++ ++typedef struct { ++ u_int keydat_len; ++ char *keydat_val; ++} keydat; ++#ifdef __cplusplus ++extern "C" bool_t xdr_keydat(XDR *, keydat*); ++#elif __STDC__ ++extern bool_t xdr_keydat(XDR *, keydat*); ++#else /* Old Style C */ ++bool_t xdr_keydat(); ++#endif /* Old Style C */ ++ ++ ++typedef struct { ++ u_int valdat_len; ++ char *valdat_val; ++} valdat; ++#ifdef __cplusplus ++extern "C" bool_t xdr_valdat(XDR *, valdat*); ++#elif __STDC__ ++extern bool_t xdr_valdat(XDR *, valdat*); ++#else /* Old Style C */ ++bool_t xdr_valdat(); ++#endif /* Old Style C */ ++ ++ ++struct ypmap_parms { ++ domainname domain; ++ mapname map; ++ u_int ordernum; ++ peername peer; ++}; ++typedef struct ypmap_parms ypmap_parms; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypmap_parms(XDR *, ypmap_parms*); ++#elif __STDC__ ++extern bool_t xdr_ypmap_parms(XDR *, ypmap_parms*); ++#else /* Old Style C */ ++bool_t xdr_ypmap_parms(); ++#endif /* Old Style C */ ++ ++ ++struct ypreq_key { ++ domainname domain; ++ mapname map; ++ keydat key; ++}; ++typedef struct ypreq_key ypreq_key; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypreq_key(XDR *, ypreq_key*); ++#elif __STDC__ ++extern bool_t xdr_ypreq_key(XDR *, ypreq_key*); ++#else /* Old Style C */ ++bool_t xdr_ypreq_key(); ++#endif /* Old Style C */ ++ ++ ++struct ypreq_nokey { ++ domainname domain; ++ mapname map; ++}; ++typedef struct ypreq_nokey ypreq_nokey; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypreq_nokey(XDR *, ypreq_nokey*); ++#elif __STDC__ ++extern bool_t xdr_ypreq_nokey(XDR *, ypreq_nokey*); ++#else /* Old Style C */ ++bool_t xdr_ypreq_nokey(); ++#endif /* Old Style C */ ++ ++ ++struct ypreq_xfr { ++ ypmap_parms map_parms; ++ u_int transid; ++ u_int prog; ++ u_int port; ++}; ++typedef struct ypreq_xfr ypreq_xfr; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypreq_xfr(XDR *, ypreq_xfr*); ++#elif __STDC__ ++extern bool_t xdr_ypreq_xfr(XDR *, ypreq_xfr*); ++#else /* Old Style C */ ++bool_t xdr_ypreq_xfr(); ++#endif /* Old Style C */ ++ ++ ++struct ypresp_val { ++ ypstat stat; ++ valdat val; ++}; ++typedef struct ypresp_val ypresp_val; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypresp_val(XDR *, ypresp_val*); ++#elif __STDC__ ++extern bool_t xdr_ypresp_val(XDR *, ypresp_val*); ++#else /* Old Style C */ ++bool_t xdr_ypresp_val(); ++#endif /* Old Style C */ ++ ++ ++struct ypresp_key_val { ++ ypstat stat; ++#ifdef STUPID_SUN_BUG ++ /* This is the form as distributed by Sun. But even the Sun NIS ++ servers expect the values in the other order. So their ++ implementation somehow must change the order internally. We ++ don't want to follow this bad example since the user should be ++ able to use rpcgen on this file. */ ++ keydat key; ++ valdat val; ++#else ++ valdat val; ++ keydat key; ++#endif ++}; ++typedef struct ypresp_key_val ypresp_key_val; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypresp_key_val(XDR *, ypresp_key_val*); ++#elif __STDC__ ++extern bool_t xdr_ypresp_key_val(XDR *, ypresp_key_val*); ++#else /* Old Style C */ ++bool_t xdr_ypresp_key_val(); ++#endif /* Old Style C */ ++ ++ ++struct ypresp_master { ++ ypstat stat; ++ peername peer; ++}; ++typedef struct ypresp_master ypresp_master; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypresp_master(XDR *, ypresp_master*); ++#elif __STDC__ ++extern bool_t xdr_ypresp_master(XDR *, ypresp_master*); ++#else /* Old Style C */ ++bool_t xdr_ypresp_master(); ++#endif /* Old Style C */ ++ ++ ++struct ypresp_order { ++ ypstat stat; ++ u_int ordernum; ++}; ++typedef struct ypresp_order ypresp_order; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypresp_order(XDR *, ypresp_order*); ++#elif __STDC__ ++extern bool_t xdr_ypresp_order(XDR *, ypresp_order*); ++#else /* Old Style C */ ++bool_t xdr_ypresp_order(); ++#endif /* Old Style C */ ++ ++ ++struct ypresp_all { ++ bool_t more; ++ union { ++ ypresp_key_val val; ++ } ypresp_all_u; ++}; ++typedef struct ypresp_all ypresp_all; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypresp_all(XDR *, ypresp_all*); ++#elif __STDC__ ++extern bool_t xdr_ypresp_all(XDR *, ypresp_all*); ++#else /* Old Style C */ ++bool_t xdr_ypresp_all(); ++#endif /* Old Style C */ ++ ++ ++struct ypresp_xfr { ++ u_int transid; ++ ypxfrstat xfrstat; ++}; ++typedef struct ypresp_xfr ypresp_xfr; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypresp_xfr(XDR *, ypresp_xfr*); ++#elif __STDC__ ++extern bool_t xdr_ypresp_xfr(XDR *, ypresp_xfr*); ++#else /* Old Style C */ ++bool_t xdr_ypresp_xfr(); ++#endif /* Old Style C */ ++ ++ ++struct ypmaplist { ++ mapname map; ++ struct ypmaplist *next; ++}; ++typedef struct ypmaplist ypmaplist; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypmaplist(XDR *, ypmaplist*); ++#elif __STDC__ ++extern bool_t xdr_ypmaplist(XDR *, ypmaplist*); ++#else /* Old Style C */ ++bool_t xdr_ypmaplist(); ++#endif /* Old Style C */ ++ ++ ++struct ypresp_maplist { ++ ypstat stat; ++ ypmaplist *maps; ++}; ++typedef struct ypresp_maplist ypresp_maplist; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypresp_maplist(XDR *, ypresp_maplist*); ++#elif __STDC__ ++extern bool_t xdr_ypresp_maplist(XDR *, ypresp_maplist*); ++#else /* Old Style C */ ++bool_t xdr_ypresp_maplist(); ++#endif /* Old Style C */ ++ ++ ++enum yppush_status { ++ YPPUSH_SUCC = 1, ++ YPPUSH_AGE = 2, ++ YPPUSH_NOMAP = -1, ++ YPPUSH_NODOM = -2, ++ YPPUSH_RSRC = -3, ++ YPPUSH_RPC = -4, ++ YPPUSH_MADDR = -5, ++ YPPUSH_YPERR = -6, ++ YPPUSH_BADARGS = -7, ++ YPPUSH_DBM = -8, ++ YPPUSH_FILE = -9, ++ YPPUSH_SKEW = -10, ++ YPPUSH_CLEAR = -11, ++ YPPUSH_FORCE = -12, ++ YPPUSH_XFRERR = -13, ++ YPPUSH_REFUSED = -14, ++}; ++typedef enum yppush_status yppush_status; ++#ifdef __cplusplus ++extern "C" bool_t xdr_yppush_status(XDR *, yppush_status*); ++#elif __STDC__ ++extern bool_t xdr_yppush_status(XDR *, yppush_status*); ++#else /* Old Style C */ ++bool_t xdr_yppush_status(); ++#endif /* Old Style C */ ++ ++ ++struct yppushresp_xfr { ++ u_int transid; ++ yppush_status status; ++}; ++typedef struct yppushresp_xfr yppushresp_xfr; ++#ifdef __cplusplus ++extern "C" bool_t xdr_yppushresp_xfr(XDR *, yppushresp_xfr*); ++#elif __STDC__ ++extern bool_t xdr_yppushresp_xfr(XDR *, yppushresp_xfr*); ++#else /* Old Style C */ ++bool_t xdr_yppushresp_xfr(); ++#endif /* Old Style C */ ++ ++ ++enum ypbind_resptype { ++ YPBIND_SUCC_VAL = 1, ++ YPBIND_FAIL_VAL = 2, ++}; ++typedef enum ypbind_resptype ypbind_resptype; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypbind_resptype(XDR *, ypbind_resptype*); ++#elif __STDC__ ++extern bool_t xdr_ypbind_resptype(XDR *, ypbind_resptype*); ++#else /* Old Style C */ ++bool_t xdr_ypbind_resptype(); ++#endif /* Old Style C */ ++ ++ ++struct ypbind_binding { ++ char ypbind_binding_addr[4]; ++ char ypbind_binding_port[2]; ++}; ++typedef struct ypbind_binding ypbind_binding; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypbind_binding(XDR *, ypbind_binding*); ++#elif __STDC__ ++extern bool_t xdr_ypbind_binding(XDR *, ypbind_binding*); ++#else /* Old Style C */ ++bool_t xdr_ypbind_binding(); ++#endif /* Old Style C */ ++ ++ ++struct ypbind_resp { ++ ypbind_resptype ypbind_status; ++ union { ++ u_int ypbind_error; ++ ypbind_binding ypbind_bindinfo; ++ } ypbind_resp_u; ++}; ++typedef struct ypbind_resp ypbind_resp; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypbind_resp(XDR *, ypbind_resp*); ++#elif __STDC__ ++extern bool_t xdr_ypbind_resp(XDR *, ypbind_resp*); ++#else /* Old Style C */ ++bool_t xdr_ypbind_resp(); ++#endif /* Old Style C */ ++ ++#define YPBIND_ERR_ERR 1 ++#define YPBIND_ERR_NOSERV 2 ++#define YPBIND_ERR_RESC 3 ++ ++struct ypbind_setdom { ++ domainname ypsetdom_domain; ++ ypbind_binding ypsetdom_binding; ++ u_int ypsetdom_vers; ++}; ++typedef struct ypbind_setdom ypbind_setdom; ++#ifdef __cplusplus ++extern "C" bool_t xdr_ypbind_setdom(XDR *, ypbind_setdom*); ++#elif __STDC__ ++extern bool_t xdr_ypbind_setdom(XDR *, ypbind_setdom*); ++#else /* Old Style C */ ++bool_t xdr_ypbind_setdom(); ++#endif /* Old Style C */ ++ ++ ++#define YPPROG ((u_long)100004) ++#define YPVERS ((u_long)2) ++ ++#ifdef __cplusplus ++#define YPPROC_NULL ((u_long)0) ++extern "C" void * ypproc_null_2(void *, CLIENT *); ++extern "C" void * ypproc_null_2_svc(void *, struct svc_req *); ++#define YPPROC_DOMAIN ((u_long)1) ++extern "C" bool_t * ypproc_domain_2(domainname *, CLIENT *); ++extern "C" bool_t * ypproc_domain_2_svc(domainname *, struct svc_req *); ++#define YPPROC_DOMAIN_NONACK ((u_long)2) ++extern "C" bool_t * ypproc_domain_nonack_2(domainname *, CLIENT *); ++extern "C" bool_t * ypproc_domain_nonack_2_svc(domainname *, struct svc_req *); ++#define YPPROC_MATCH ((u_long)3) ++extern "C" ypresp_val * ypproc_match_2(ypreq_key *, CLIENT *); ++extern "C" ypresp_val * ypproc_match_2_svc(ypreq_key *, struct svc_req *); ++#define YPPROC_FIRST ((u_long)4) ++extern "C" ypresp_key_val * ypproc_first_2(ypreq_key *, CLIENT *); ++extern "C" ypresp_key_val * ypproc_first_2_svc(ypreq_key *, struct svc_req *); ++#define YPPROC_NEXT ((u_long)5) ++extern "C" ypresp_key_val * ypproc_next_2(ypreq_key *, CLIENT *); ++extern "C" ypresp_key_val * ypproc_next_2_svc(ypreq_key *, struct svc_req *); ++#define YPPROC_XFR ((u_long)6) ++extern "C" ypresp_xfr * ypproc_xfr_2(ypreq_xfr *, CLIENT *); ++extern "C" ypresp_xfr * ypproc_xfr_2_svc(ypreq_xfr *, struct svc_req *); ++#define YPPROC_CLEAR ((u_long)7) ++extern "C" void * ypproc_clear_2(void *, CLIENT *); ++extern "C" void * ypproc_clear_2_svc(void *, struct svc_req *); ++#define YPPROC_ALL ((u_long)8) ++extern "C" ypresp_all * ypproc_all_2(ypreq_nokey *, CLIENT *); ++extern "C" ypresp_all * ypproc_all_2_svc(ypreq_nokey *, struct svc_req *); ++#define YPPROC_MASTER ((u_long)9) ++extern "C" ypresp_master * ypproc_master_2(ypreq_nokey *, CLIENT *); ++extern "C" ypresp_master * ypproc_master_2_svc(ypreq_nokey *, struct svc_req *); ++#define YPPROC_ORDER ((u_long)10) ++extern "C" ypresp_order * ypproc_order_2(ypreq_nokey *, CLIENT *); ++extern "C" ypresp_order * ypproc_order_2_svc(ypreq_nokey *, struct svc_req *); ++#define YPPROC_MAPLIST ((u_long)11) ++extern "C" ypresp_maplist * ypproc_maplist_2(domainname *, CLIENT *); ++extern "C" ypresp_maplist * ypproc_maplist_2_svc(domainname *, struct svc_req *); ++ ++#elif __STDC__ ++#define YPPROC_NULL ((u_long)0) ++extern void * ypproc_null_2(void *, CLIENT *); ++extern void * ypproc_null_2_svc(void *, struct svc_req *); ++#define YPPROC_DOMAIN ((u_long)1) ++extern bool_t * ypproc_domain_2(domainname *, CLIENT *); ++extern bool_t * ypproc_domain_2_svc(domainname *, struct svc_req *); ++#define YPPROC_DOMAIN_NONACK ((u_long)2) ++extern bool_t * ypproc_domain_nonack_2(domainname *, CLIENT *); ++extern bool_t * ypproc_domain_nonack_2_svc(domainname *, struct svc_req *); ++#define YPPROC_MATCH ((u_long)3) ++extern ypresp_val * ypproc_match_2(ypreq_key *, CLIENT *); ++extern ypresp_val * ypproc_match_2_svc(ypreq_key *, struct svc_req *); ++#define YPPROC_FIRST ((u_long)4) ++extern ypresp_key_val * ypproc_first_2(ypreq_key *, CLIENT *); ++extern ypresp_key_val * ypproc_first_2_svc(ypreq_key *, struct svc_req *); ++#define YPPROC_NEXT ((u_long)5) ++extern ypresp_key_val * ypproc_next_2(ypreq_key *, CLIENT *); ++extern ypresp_key_val * ypproc_next_2_svc(ypreq_key *, struct svc_req *); ++#define YPPROC_XFR ((u_long)6) ++extern ypresp_xfr * ypproc_xfr_2(ypreq_xfr *, CLIENT *); ++extern ypresp_xfr * ypproc_xfr_2_svc(ypreq_xfr *, struct svc_req *); ++#define YPPROC_CLEAR ((u_long)7) ++extern void * ypproc_clear_2(void *, CLIENT *); ++extern void * ypproc_clear_2_svc(void *, struct svc_req *); ++#define YPPROC_ALL ((u_long)8) ++extern ypresp_all * ypproc_all_2(ypreq_nokey *, CLIENT *); ++extern ypresp_all * ypproc_all_2_svc(ypreq_nokey *, struct svc_req *); ++#define YPPROC_MASTER ((u_long)9) ++extern ypresp_master * ypproc_master_2(ypreq_nokey *, CLIENT *); ++extern ypresp_master * ypproc_master_2_svc(ypreq_nokey *, struct svc_req *); ++#define YPPROC_ORDER ((u_long)10) ++extern ypresp_order * ypproc_order_2(ypreq_nokey *, CLIENT *); ++extern ypresp_order * ypproc_order_2_svc(ypreq_nokey *, struct svc_req *); ++#define YPPROC_MAPLIST ((u_long)11) ++extern ypresp_maplist * ypproc_maplist_2(domainname *, CLIENT *); ++extern ypresp_maplist * ypproc_maplist_2_svc(domainname *, struct svc_req *); ++ ++#else /* Old Style C */ ++#define YPPROC_NULL ((u_long)0) ++extern void * ypproc_null_2(); ++extern void * ypproc_null_2_svc(); ++#define YPPROC_DOMAIN ((u_long)1) ++extern bool_t * ypproc_domain_2(); ++extern bool_t * ypproc_domain_2_svc(); ++#define YPPROC_DOMAIN_NONACK ((u_long)2) ++extern bool_t * ypproc_domain_nonack_2(); ++extern bool_t * ypproc_domain_nonack_2_svc(); ++#define YPPROC_MATCH ((u_long)3) ++extern ypresp_val * ypproc_match_2(); ++extern ypresp_val * ypproc_match_2_svc(); ++#define YPPROC_FIRST ((u_long)4) ++extern ypresp_key_val * ypproc_first_2(); ++extern ypresp_key_val * ypproc_first_2_svc(); ++#define YPPROC_NEXT ((u_long)5) ++extern ypresp_key_val * ypproc_next_2(); ++extern ypresp_key_val * ypproc_next_2_svc(); ++#define YPPROC_XFR ((u_long)6) ++extern ypresp_xfr * ypproc_xfr_2(); ++extern ypresp_xfr * ypproc_xfr_2_svc(); ++#define YPPROC_CLEAR ((u_long)7) ++extern void * ypproc_clear_2(); ++extern void * ypproc_clear_2_svc(); ++#define YPPROC_ALL ((u_long)8) ++extern ypresp_all * ypproc_all_2(); ++extern ypresp_all * ypproc_all_2_svc(); ++#define YPPROC_MASTER ((u_long)9) ++extern ypresp_master * ypproc_master_2(); ++extern ypresp_master * ypproc_master_2_svc(); ++#define YPPROC_ORDER ((u_long)10) ++extern ypresp_order * ypproc_order_2(); ++extern ypresp_order * ypproc_order_2_svc(); ++#define YPPROC_MAPLIST ((u_long)11) ++extern ypresp_maplist * ypproc_maplist_2(); ++extern ypresp_maplist * ypproc_maplist_2_svc(); ++#endif /* Old Style C */ ++ ++#define YPPUSH_XFRRESPPROG ((u_long)0x40000000) ++#define YPPUSH_XFRRESPVERS ((u_long)1) ++ ++#ifdef __cplusplus ++#define YPPUSHPROC_NULL ((u_long)0) ++extern "C" void * yppushproc_null_1(void *, CLIENT *); ++extern "C" void * yppushproc_null_1_svc(void *, struct svc_req *); ++#define YPPUSHPROC_XFRRESP ((u_long)1) ++extern "C" void * yppushproc_xfrresp_1(yppushresp_xfr *, CLIENT *); ++extern "C" void * yppushproc_xfrresp_1_svc(yppushresp_xfr *, struct svc_req *); ++ ++#elif __STDC__ ++#define YPPUSHPROC_NULL ((u_long)0) ++extern void * yppushproc_null_1(void *, CLIENT *); ++extern void * yppushproc_null_1_svc(void *, struct svc_req *); ++#define YPPUSHPROC_XFRRESP ((u_long)1) ++extern void * yppushproc_xfrresp_1(yppushresp_xfr *, CLIENT *); ++extern void * yppushproc_xfrresp_1_svc(yppushresp_xfr *, struct svc_req *); ++ ++#else /* Old Style C */ ++#define YPPUSHPROC_NULL ((u_long)0) ++extern void * yppushproc_null_1(); ++extern void * yppushproc_null_1_svc(); ++#define YPPUSHPROC_XFRRESP ((u_long)1) ++extern void * yppushproc_xfrresp_1(); ++extern void * yppushproc_xfrresp_1_svc(); ++#endif /* Old Style C */ ++ ++#define YPBINDPROG ((u_long)100007) ++#define YPBINDVERS ((u_long)2) ++ ++#ifdef __cplusplus ++#define YPBINDPROC_NULL ((u_long)0) ++extern "C" void * ypbindproc_null_2(void *, CLIENT *); ++extern "C" void * ypbindproc_null_2_svc(void *, struct svc_req *); ++#define YPBINDPROC_DOMAIN ((u_long)1) ++extern "C" ypbind_resp * ypbindproc_domain_2(domainname *, CLIENT *); ++extern "C" ypbind_resp * ypbindproc_domain_2_svc(domainname *, struct svc_req *); ++#define YPBINDPROC_SETDOM ((u_long)2) ++extern "C" void * ypbindproc_setdom_2(ypbind_setdom *, CLIENT *); ++extern "C" void * ypbindproc_setdom_2_svc(ypbind_setdom *, struct svc_req *); ++ ++#elif __STDC__ ++#define YPBINDPROC_NULL ((u_long)0) ++extern void * ypbindproc_null_2(void *, CLIENT *); ++extern void * ypbindproc_null_2_svc(void *, struct svc_req *); ++#define YPBINDPROC_DOMAIN ((u_long)1) ++extern ypbind_resp * ypbindproc_domain_2(domainname *, CLIENT *); ++extern ypbind_resp * ypbindproc_domain_2_svc(domainname *, struct svc_req *); ++#define YPBINDPROC_SETDOM ((u_long)2) ++extern void * ypbindproc_setdom_2(ypbind_setdom *, CLIENT *); ++extern void * ypbindproc_setdom_2_svc(ypbind_setdom *, struct svc_req *); ++ ++#else /* Old Style C */ ++#define YPBINDPROC_NULL ((u_long)0) ++extern void * ypbindproc_null_2(); ++extern void * ypbindproc_null_2_svc(); ++#define YPBINDPROC_DOMAIN ((u_long)1) ++extern ypbind_resp * ypbindproc_domain_2(); ++extern ypbind_resp * ypbindproc_domain_2_svc(); ++#define YPBINDPROC_SETDOM ((u_long)2) ++extern void * ypbindproc_setdom_2(); ++extern void * ypbindproc_setdom_2_svc(); ++#endif /* Old Style C */ ++ ++#endif /* !__RPCSVC_YP_H__ */ +diff -Naur ../glibc-2.1.3/glibc-compat/rpcsvc/ypclnt.h glibc-2.1.3/glibc-compat/rpcsvc/ypclnt.h +--- ../glibc-2.1.3/glibc-compat/rpcsvc/ypclnt.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/rpcsvc/ypclnt.h 2000-01-03 18:17:33.000000000 -0800 +@@ -0,0 +1,90 @@ ++/* ++** Copyright (c) 1996 Thorsten Kukuk, Germany ++** ++** This 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. ++** ++** 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 ++** Library General Public License for more details. ++** ++** You should have received a copy of the GNU Library General Public ++** License along with this library; if not, write to the Free ++** Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++** ++** Author: Thorsten Kukuk <kukuk@vt.uni-paderborn.de> ++** ++*/ ++ ++#ifndef __RPCSVC_YPCLNT_H__ ++#define __RPCSVC_YPCLNT_H__ ++ ++#include <features.h> ++ ++/* some defines */ ++#define YPERR_SUCCESS 0 /* There is no error */ ++#define YPERR_BADARGS 1 /* Args to function are bad */ ++#define YPERR_RPC 2 /* RPC failure */ ++#define YPERR_DOMAIN 3 /* Can't bind to a server with this domain */ ++#define YPERR_MAP 4 /* No such map in server's domain */ ++#define YPERR_KEY 5 /* No such key in map */ ++#define YPERR_YPERR 6 /* Internal yp server or client error */ ++#define YPERR_RESRC 7 /* Local resource allocation failure */ ++#define YPERR_NOMORE 8 /* No more records in map database */ ++#define YPERR_PMAP 9 /* Can't communicate with portmapper */ ++#define YPERR_YPBIND 10 /* Can't communicate with ypbind */ ++#define YPERR_YPSERV 11 /* Can't communicate with ypserv */ ++#define YPERR_NODOM 12 /* Local domain name not set */ ++#define YPERR_BADDB 13 /* yp data base is bad */ ++#define YPERR_VERS 14 /* YP version mismatch */ ++#define YPERR_ACCESS 15 /* Access violation */ ++#define YPERR_BUSY 16 /* Database is busy */ ++ ++/* Types of update operations */ ++#define YPOP_CHANGE 1 /* change, do not add */ ++#define YPOP_INSERT 2 /* add, do not change */ ++#define YPOP_DELETE 3 /* delete this entry */ ++#define YPOP_STORE 4 /* add, or change */ ++ ++__BEGIN_DECLS ++ ++/* struct ypall_callback * is the arg which must be passed to yp_all */ ++struct ypall_callback ++ { ++ int (*foreach) __P ((int __status, char *__key, int __keylen, ++ char *__val, int __vallen, char *__data)); ++ char *data; ++ }; ++ ++/* External NIS client function references. */ ++extern int yp_bind __P ((__const char *)); ++extern void yp_unbind __P ((__const char *)); ++extern int yp_get_default_domain __P ((char **)); ++extern int yp_match __P ((__const char *, __const char *, __const char *, ++ __const int, char **, int *)); ++extern int yp_first __P ((__const char *, __const char *, char **, ++ int *, char **, int *)); ++extern int yp_next __P ((__const char *, __const char *, __const char *, ++ __const int, char **, int *, char **, int *)); ++extern int yp_master __P ((__const char *, __const char *, char **)); ++extern int yp_order __P ((__const char *, __const char *, unsigned int *)); ++extern int yp_all __P ((__const char *, __const char *, ++ __const struct ypall_callback *)); ++extern __const char *yperr_string __P ((__const int)); ++extern __const char *ypbinderr_string __P ((__const int)); ++extern int ypprot_err __P ((__const int)); ++extern int yp_update __P ((char *, char *, unsigned, char *, ++ int, char *, int)); ++#if 0 ++extern int yp_maplist __P ((__const char *, struct ypmaplist **)); ++#endif ++ ++/* Exist only under BSD and Linux systems */ ++extern int __yp_check __P ((char **)); ++ ++__END_DECLS ++ ++#endif /* __RPCSVC_YPCLNT_H__ */ +diff -Naur ../glibc-2.1.3/glibc-compat/shlib-versions glibc-2.1.3/glibc-compat/shlib-versions +--- ../glibc-2.1.3/glibc-compat/shlib-versions 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/shlib-versions 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,19 @@ ++# Interface revision of the compat nss_* modules. ++# ++# This must match NSS_SHLIB_REVISION in nss/nsswitch.h, ++# which determines the library names used for service ++# names given in /etc/nsswitch.conf. ++alpha-.*-linux.* libnss1_files=1.1 ++alpha-.*-linux.* libnss1_dns=1.1 ++alpha-.*-linux.* libnss1_db=1.1 ++alpha-.*-linux.* libnss1_compat=1.1 ++alpha-.*-linux.* libnss1_nis=1.1 ++.*-.*-.* libnss1_files=1 ++.*-.*-.* libnss1_db=1 ++.*-.*-.* libnss1_dns=1 ++.*-.*-.* libnss1_compat=1 ++.*-.*-.* libnss1_nis=1 ++ ++# The libNoVersion revision number ++.*-.*-.* libNoVersion=1 ++ +diff -Naur ../glibc-2.1.3/glibc-compat/stubs.c glibc-2.1.3/glibc-compat/stubs.c +--- ../glibc-2.1.3/glibc-compat/stubs.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/glibc-compat/stubs.c 2000-02-23 17:59:39.000000000 -0800 +@@ -0,0 +1,54 @@ ++/* ++ * STAT stuff that breaks Applix ++ */ ++ ++#include <sys/stat.h> ++ ++/* 1 of 3: _xstat */ ++int ++_xstat (int vers, const char *name, struct stat *buf) ++{ ++ return __xstat (vers, name, buf); ++} ++ ++/* 2 of 3: _fxstat */ ++int ++_fxstat (int vers, int fd, struct stat *buf) ++{ ++ return __fxstat (vers, fd, buf); ++} ++ ++/* 3 of 3: _lxstat */ ++int ++_lxstat (int vers, const char *name, struct stat *buf) ++{ ++ return __lxstat (vers, name, buf); ++} ++ ++ ++/* ++ * __setjmp stuff that breaks again Applix ++ */ ++#include <setjmp.h> ++ ++int __setjmp(jmp_buf env) ++{ ++ return _setjmp(env); ++} ++ ++ ++/* ++ * __setfpucw break several math packages that ahve not heard of ++ * the standard _FPU_SETCW() way of setting the control word for the FPU ++ */ ++#include <fpu_control.h> ++void __setfpucw(fpu_control_t cw) ++{ ++ ++#if defined(_FPU_SETCW) ++ _FPU_SETCW(cw); ++#endif /* _FPU_SETCW */ ++ ++ /* others are a no-op. Why doesn't alpha has something like this? */ ++} ++ +diff -Naur ../glibc-2.1.3/hesiod/hesiod.c glibc-2.1.3/hesiod/hesiod.c +--- ../glibc-2.1.3/hesiod/hesiod.c 1998-05-25 01:40:13.000000000 -0700 ++++ glibc-2.1.3/hesiod/hesiod.c 1998-07-09 11:46:28.000000000 -0700 +@@ -41,7 +41,7 @@ + * it uses res_send() and accesses _res. + */ + +-static const char rcsid[] = "$Id: hesiod.c,v 1.5 1998/05/25 08:40:13 drepper Exp $"; ++static const char rcsid[] = "$Id: hesiod.c,v 1.1.1.1 1998/07/09 18:46:28 gafton Exp $"; + + #include <sys/types.h> + #include <netinet/in.h> +diff -Naur ../glibc-2.1.3/hesiod/hesiod.h glibc-2.1.3/hesiod/hesiod.h +--- ../glibc-2.1.3/hesiod/hesiod.h 1997-09-15 17:16:33.000000000 -0700 ++++ glibc-2.1.3/hesiod/hesiod.h 1998-02-07 12:04:52.000000000 -0800 +@@ -1,4 +1,4 @@ +-/* $Id: hesiod.h,v 1.1 1997/09/16 00:16:33 drepper Exp $ */ ++/* $Id: hesiod.h,v 1.1.1.1 1998/02/07 20:04:52 gafton Exp $ */ + + /* + * Copyright (c) 1996 by Internet Software Consortium. +diff -Naur ../glibc-2.1.3/hesiod/hesiod_p.h glibc-2.1.3/hesiod/hesiod_p.h +--- ../glibc-2.1.3/hesiod/hesiod_p.h 1997-09-15 17:16:33.000000000 -0700 ++++ glibc-2.1.3/hesiod/hesiod_p.h 1998-02-07 12:04:52.000000000 -0800 +@@ -16,7 +16,7 @@ + */ + + /* +- * $Id: hesiod_p.h,v 1.1 1997/09/16 00:16:33 drepper Exp $ ++ * $Id: hesiod_p.h,v 1.1.1.1 1998/02/07 20:04:52 gafton Exp $ + */ + + /* +diff -Naur ../glibc-2.1.3/hurd/hurdmalloc.c glibc-2.1.3/hurd/hurdmalloc.c +--- ../glibc-2.1.3/hurd/hurdmalloc.c 1996-12-19 17:32:01.000000000 -0800 ++++ glibc-2.1.3/hurd/hurdmalloc.c 1998-02-07 12:05:05.000000000 -0800 +@@ -37,6 +37,9 @@ + /* + * HISTORY + * $Log: hurdmalloc.c,v $ ++ * Revision 1.1.1.1 1998/02/07 20:05:05 gafton ++ * import from sourceware ++ * + * Revision 1.13 1996/12/20 01:32:01 drepper + * Update from main archive 961219 + * +diff -Naur ../glibc-2.1.3/include/nlist.h glibc-2.1.3/include/nlist.h +--- ../glibc-2.1.3/include/nlist.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/include/nlist.h 1998-02-07 12:07:02.000000000 -0800 +@@ -0,0 +1 @@ ++#include <misc/nlist.h> +diff -Naur ../glibc-2.1.3/linuxthreads/Banner glibc-2.1.3/linuxthreads/Banner +--- ../glibc-2.1.3/linuxthreads/Banner 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/Banner 1998-08-28 03:07:16.000000000 -0700 +@@ -0,0 +1 @@ ++linuxthreads-0.8 by Xavier Leroy +diff -Naur ../glibc-2.1.3/linuxthreads/ChangeLog glibc-2.1.3/linuxthreads/ChangeLog +--- ../glibc-2.1.3/linuxthreads/ChangeLog 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/ChangeLog 2000-02-23 13:17:31.000000000 -0800 +@@ -0,0 +1,1257 @@ ++2000-02-22 Ulrich Drepper <drepper@redhat.com> ++ ++ * semaphore.h (SEM_FAILED): Use 0 not NULL. ++ ++2000-02-14 Ulrich Drepper <drepper@redhat.com> ++ ++ * condvar.c (pthread_cond_timedwait_relative_old): Tight loop with ++ nanosleep does not work either. Get absolute time inside the ++ loop. ++ (pthread_cond_timedwait_relative_new): Likewise. ++ Patch by Kaz Kylheku <kaz@ashi.footprints.net>. ++ ++2000-02-13 Ulrich Drepper <drepper@redhat.com> ++ ++ * condvar.c (pthread_cond_timedwait_relative_old): Undo last patch ++ but keep the code around. A bug in the kernel prevent us from ++ using the code. ++ (pthread_cond_timedwait_relative_new): Likewise. ++ (PR libc/1597 and libc/1598). ++ ++2000-02-01 Kaz Kylheku <kaz@ashi.footprints.net> ++ ++ * condvar.c (pthread_cond_timedwait_relative_old): Do tight ++ loop around nanosleep calls instead of around most of the function ++ (pthread_cond_timedwait_relative_new): Likewise. ++ body. Got rid of backwards goto and one local. ++ ++2000-01-31 Ulrich Drepper <drepper@redhat.com> ++ ++ * condvar.c (pthread_cond_timedwait_relative_old): Recompute time ++ before every nanosleep call to account for time spent in the rest ++ of the function. ++ (pthread_cond_timedwait_relative_new): Likewise. ++ Patch by khendricks@ivey.uwo.ca (PR libc/1564). ++ ++2000-01-29 Ulrich Drepper <drepper@redhat.com> ++ ++ * condvar.c (pthread_cond_timedwait_relative_old): Get remaining time ++ from nanosleep call so that in case we restart we only wait for the ++ remaining time. ++ (pthread_cond_timedwait_relative_new): Likewise. ++ Patch by khendricks@ivey.uwo.ca (PR libc/1561). ++ ++2000-01-18 Ulrich Drepper <drepper@cygnus.com> ++ ++ * manager.c (pthread_allocate_stack): Compute guard page address ++ correctly. Patch by HJ Lu. ++ ++2000-01-12 Ulrich Drepper <drepper@cygnus.com> ++ ++ * internals.h (pthread_readlock_info): New structure. ++ (_pthread_descr_struct): Add p_readlock_list, p_readlock_free, and ++ p_untracked_readlock_count. ++ * pthread.c (__pthread_initial_thread, pthread_manager_thread): ++ Add initializers for new fields. ++ * manager.c (pthread_free): Free read/write lock lists. ++ * queue.h (queue_is_empty): New function. ++ * rwlock.c: Implement requirements about when readers should get ++ locks assigned. ++ * sysdeps/pthread/pthread.h ++ (PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP): New definition. ++ * sysdeps/pthread/bits/pthreadtypes.h (struct _pthread_rwlock_t): ++ Define this name as well. ++ Patches by Kaz Kylheku <kaz@ashi.footprints.net>. ++ ++2000-01-06 Andreas Jaeger <aj@suse.de> ++ ++ * pthread.c: Remove extra initializer. ++ ++2000-01-05 Ulrich Drepper <drepper@cygnus.com> ++ ++ * pthread.c (__pthread_initial_thread, pthread_manager_thread): ++ Adjust initializers for struct _pthread_descr_struct change. ++ * internals.h (struct _pthread_descr_struct): Move new elements to ++ the end. ++ ++2000-01-03 Kaz Kylheku <kaz@ashi.footprints.net> ++ ++ Redesigned how cancellation unblocks a thread from internal ++ cancellation points (sem_wait, pthread_join, ++ pthread_cond_{wait,timedwait}). ++ Cancellation won't eat a signal in any of these functions ++ (*required* by POSIX and Single Unix Spec!). ++ * condvar.c: Spontaneous wakeup on pthread_cond_timedwait won't eat a ++ simultaneous condition variable signal (not required by POSIX ++ or Single Unix Spec, but nice). ++ * spinlock.c: __pthread_lock queues back any received restarts ++ that don't belong to it instead of assuming ownership of lock ++ upon any restart; fastlock can no longer be acquired by two threads ++ simultaneously. ++ * restart.h: Restarts queue even on kernels that don't have ++ queued real time signals (2.0, early 2.1), thanks to atomic counter, ++ avoiding a rare race condition in pthread_cond_timedwait. ++ ++1999-12-28 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/alpha/pt-machine.h: Move stack_pointer definition to the ++ beginning. ++ ++ * manager.c (__pthread_start): Add one more cast to assignment of ++ arg to prevent warning on 64bit machines. ++ ++1999-12-21 Ulrich Drepper <drepper@cygnus.com> ++ ++ * manager.c (pthread_handle_create): Set p_pid of new thread ++ before calling the callback function to report a new thread. ++ ++1999-12-20 Andreas Jaeger <aj@suse.de> ++ ++ * pthread.c (pthread_initialize): Move getrlimit call after ++ setting of errno. ++ ++1999-12-01 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/i386/pt-machine.h: Move stack_pointer definition to the ++ beginning. ++ * sysdeps/i386/i686/pt-machine.h: Likewise. ++ Patches by Alan Modra <alan@SPRI.Levels.UniSA.Edu.Au>. ++ ++1999-11-23 Ulrich Drepper <drepper@cygnus.com> ++ ++ * manager.c (pthread_start_thread_event): Initialize p_pid already ++ here. ++ ++1999-11-22 Ulrich Drepper <drepper@cygnus.com> ++ ++ * internals.h: Add prototype for __pthread_manager_event. ++ * manager.c (__pthread_manager_event): New function. ++ (pthread_start_thread_event): Correct computation of self. ++ Use INIT_THREAD_SELF. ++ * pthread.c (__pthread_manager_thread): Initialize p_lock. ++ (__pthread_initialize_manager): Respect event flags also for creation ++ of the manager thread. ++ ++1999-11-08 Ulrich Drepper <drepper@cygnus.com> ++ ++ * pthread.c (__pthread_initialize_manager): Initialize ++ __pthread_manager_thread.p_tid. ++ ++1999-11-02 Ulrich Drepper <drepper@cygnus.com> ++ ++ * internals.h: Declare __pthread_last_event. ++ * manager.c: Define __pthread_last_event. ++ (pthread_handle_create): Set __pthread_last_event. ++ (pthread_exited): Likewise. ++ * join.c (pthread_exit): Likewise. ++ ++ * Makefile (libpthread-routines): Add events. ++ * events.c: New file. ++ * internals.h: Protect against multiple inclusion. ++ Include thread_dbP.h header. ++ (struct _pthread_descr_struct): Add new fields p_report_events and ++ p_eventbuf. ++ Declare event reporting functions. ++ * join.c (pthread_exit): Signal event if this is wanted. ++ * manager.c (__pthread_threads_events): New variable. ++ (pthread_handle_create): Take new parameters with event information. ++ Signal TD_CREATE event if wanted. ++ (__pthread_manager): Adjust pthread_handle_create call. ++ (pthread_start_thread_event): New function. Block until manager is ++ finished and then call pthread_start_thread. ++ (pthread_exited): Signal TD_REAP event if wanted. ++ ++1999-10-26 Ulrich Drepper <drepper@cygnus.com> ++ ++ * restart.h (suspend_with_cancellation): Rewrite as a macro. ++ ++ * condvar.c (pthread_cond_timedwait_relative): Don't mark as inline. ++ ++1999-10-21 Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++ * linuxthreads/pthread.c: For i386, wrap pthread_handle_sigrestart ++ and pthread_handle_sigcancel with functions that restore ++ %gs from the signal context. For each signal handling function, ++ two wrappers are required, one for a non-RT signal and one for ++ a RT signal. ++ * linuxthreads/signal.c: For i386, add code to restore %gs ++ from the signal context in pthread_sighandler and ++ pthread_sighandler_rt. ++ ++1999-10-09 Andreas Jaeger <aj@suse.de> ++ ++ * internals.h: Add __new_sem_post to get prototype in ++ manager.c; include semaphore.h for needed types. ++ ++1999-10-08 Ulrich Drepper <drepper@cygnus.com> ++ ++ * manager.c (__pthread_manager) [REQ_POST]: Use __new_sem_post ++ directly instead of calling sem_post which should not be necessary ++ but is faster and might help in some case to work around problems. ++ ++1999-09-25 Ulrich Drepper <drepper@cygnus.com> ++ ++ * condvar.c (pthread_cond_timedwait_relative): Never return with ++ EINTR. Patch by Andreas Schwab. ++ ++1999-09-19 Ulrich Drepper <drepper@cygnus.com> ++ ++ * signals.c (sigaction): Correct last patch. Don't select ++ pthread_sighandler_rt based on the signal number but instead of ++ the SA_SIGINFO flag. ++ ++1999-09-23 Ulrich Drepper <drepper@cygnus.com> ++ ++ * specific.c: Move definitions of struct pthread_key_struct and ++ destr_function to ... ++ * internals.h: ...here. ++ ++1999-09-03 Andreas Schwab <schwab@suse.de> ++ ++ * ptfork.c (__fork): Renamed from fork and use __libc_fork. Add ++ fork as weak alias. ++ (__vfork): New function, alias vfork. ++ * Versions: Export __fork, vfork, and __vfork in libpthread. ++ ++1999-08-23 Andreas Schwab <schwab@suse.de> ++ ++ * signals.c (pthread_sighandler): Add SIGCONTEXT_EXTRA_ARGS to ++ call to signal handler. ++ ++1999-08-20 Ulrich Drepper <drepper@cygnus.com> ++ ++ * pthread.c (__pthread_reset_main_thread): Undo last change. ++ (__pthread_kill_other_threads_np): Reset signal handlers for the ++ signals we used in the thread implementation here. ++ ++1999-08-19 Ulrich Drepper <drepper@cygnus.com> ++ ++ * pthread.c (__pthread_reset_main_thread): Reset signal handlers ++ for the signals we used in the thread implementation [PR libc/1234]. ++ ++ * Versions: Export __pthread_kill_other_threads_np from libpthread ++ for GLIBC_2.1.2. ++ ++ * signals.c: Pass sigcontext through wrapper to the user function. ++ ++1999-08-01 Ulrich Drepper <drepper@cygnus.com> ++ ++ * Versions [ld.so] (GLIBC_2.0): Export __libc_internal_tsd_get and ++ __libc_internal_tsd_set. ++ ++1999-07-29 Andreas Jaeger <aj@arthur.rhein-neckar.de> ++ ++ * manager.c: Remove inclusion of <linux/tasks.h> since it's not ++ needed anymore. ++ ++1999-07-16 Andreas Jaeger <aj@arthur.rhein-neckar.de> ++ ++ * internals.h: Align _pthread_descr_struct to 32 bytes. ++ Reported by Tim Hockin <thockin@cobaltnet.com>, close PR libc/1206. ++ ++1999-07-09 Ulrich Drepper <drepper@cygnus.com> ++ ++ * manager.c (pthread_handle_create): Free mmap region after stack ++ if clone failed. Patch by Kaz Kylheku <kaz@ashi.FootPrints.net>. ++ ++1999-07-09 Cristian Gafton <gafton@redhat.com> ++ ++ * Makefile (libpthread-routines): Add oldsemaphore routine. ++ * Versions: Add sem_destroy, sem_getvalue, sem_init, sem_post, ++ sem_trywait, and sem_wait to GLIBC_2.1. ++ * oldsemaphore.c: New file. ++ * semaphore.c: Add default_symbol_versions for the changed functions. ++ (__new_sem_init): Rename from sem_init. ++ (__new_sem_post): Rename from sem_post. ++ (__new_sem_wait): Rename from sem_wait. ++ (__new_sem_trywait): Rename from sem_trywait. ++ (__new_sem_getvalue): Rename from sem_getvalue. ++ (__new_sem_destroy): Rename from sem_destroy. ++ ++1999-06-23 Robey Pointer <robey@netscape.com> ++ ++ * internals.h: Added p_nextlock entry to separate queueing for a ++ lock from queueing for a CV (sometimes a thread queues on a lock ++ to serialize removing itself from a CV queue). ++ * pthread.c: Added p_nextlock to initializers. ++ * spinlock.c: Changed to use p_nextlock instead of p_nextwaiting. ++ ++1999-05-23 Andreas Jaeger <aj@arthur.rhein-neckar.de> ++ ++ * man/pthread_cond_init.man: Correct example. ++ Reported by Tomas Berndtsson <tomas@nocrew.org>. ++ ++ * linuxthreads.texi (Condition Variables): Likewise. ++ ++1999-05-18 Jakub Jelinek <jj@ultra.linux.cz> ++ ++ * sysdeps/sparc/sparc64/pt-machine.h (__compare_and_swap): Use ++ casx not cas, also successful casx returns the old value in rd ++ and not the new value. ++ ++1999-05-16 Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++ * manager.c: If pthread_create() is given a NULL attribute ++ and the thread manager runs with a realtime policy, set the ++ scheduling policy of the newly created thread back to SCHED_OTHER. ++ * manager.c: If the PTHREAD_INHERIT_SCHED attribute is given, ++ initialize the schedpolicy field of new_thread->p_start_args ++ to that of the calling thread. ++ ++1999-04-29 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/sparc/sparc64/pt-machine.h (__compare_and_swap): cas ++ instruction does not allow memory element to use offset. ++ ++1999-04-28 Ulrich Drepper <drepper@cygnus.com> ++ ++ * manager.c (pthread_allocate_stack): Optimize initialization of new ++ thread descriptor. ++ ++ * sysdeps/pthread/bits/libc-lock.h (__libc_lock_define_initialized): ++ Don't use initializer since it is all zeroes. ++ (__libc_once_define): Likewise. ++ ++1999-04-16 Andreas Jaeger <aj@arthur.rhein-neckar.de> ++ ++ * sysdeps/arm/Implies: Removed since cmpxchg/no-cmpxchg ++ doesn't exist anymore. ++ * sysdeps/i386/Implies: Likewise. ++ * sysdeps/m68k/Implies: Likewise. ++ * sysdeps/mips/Implies: Likewise. ++ * sysdeps/powerpc/Implies: Likewise. ++ * sysdeps/sparc/sparc32/Implies: Likewise. ++ * sysdeps/sparc/sparc64/Implies: Likewise. ++ ++1999-04-15 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/alpha/bits/semaphore.h: Removed. ++ * sysdeps/powerpc/bits/semaphore.h: Removed. ++ * sysdeps/pthread/cmpxchg/bits/semaphore.h: Removed. ++ * sysdeps/pthread/no-cmpxchg/bits/semaphore.h: Removed. ++ * Makefile (headers): Remove bits/semaphore.h. ++ ++ * semaphore.h: Define _pthread_descr if necessary. ++ Don't include limits.h. Define SEM_VALUE_MAX directly. ++ Define SEM_FAILED. ++ (sem_t): Protect element names with leading __. ++ Add declarations for sem_close, sem_open, and sem_unlink. ++ * semaphore.c: Adjust all functions for new element names. ++ Define sem_close, sem_open, and sem_unlink. ++ * Versions (libthread): Add sem_close, sem_open, and sem_unlink for ++ GLIBC_2.1.1. ++ * sysdeps/pthread/bits/pthreadtypes.h: Define _pthread_descr only if ++ necessary. ++ ++1999-03-16 H.J. Lu <hjl@gnu.org> ++ ++ * specific.c (pthread_key_delete): Check th->p_terminated to see ++ if the thread is running. ++ ++ * Versions (__libc_internal_tsd_get, __libc_internal_tsd_set): ++ Added to GLIBC_2.0 for libc.so. ++ ++1999-02-12 H.J. Lu <hjl@gnu.org> ++ ++ * Versions (__libc_current_sigrtmin, __libc_current_sigrtmax, ++ __libc_allocate_rtsig): Added to GLIBC_2.1. ++ ++ * internals.h (DEFAULT_SIG_RESTART): Removed. ++ (DEFAULT_SIG_CANCEL): Removed. ++ ++ * pthread.c (init_rtsigs, __libc_current_sigrtmin, ++ __libc_current_sigrtmax, __libc_allocate_rtsig): New functions. ++ (__pthread_sig_restart, __pthread_sig_cancel, ++ __pthread_sig_debug): Initialized. ++ (pthread_initialize): Call init_rtsigs () to initialize ++ real-time signals. ++ ++1999-02-03 H.J. Lu <hjl@gnu.org> ++ ++ * manager.c (__pthread_manager): Do block __pthread_sig_debug. ++ Don't restart the thread which sent REQ_DEBUG. ++ (pthread_start_thread): Check if __pthread_sig_debug > 0 ++ before debugging. ++ ++ * pthread.c (__pthread_initialize_manager): Suspend ourself ++ after sending __pthread_sig_debug to gdb instead of ++ __pthread_sig_cancel. ++ ++1999-01-24 H.J. Lu <hjl@gnu.org> ++ ++ * manager.c (__pthread_manager): Delete __pthread_sig_debug ++ from mask if __pthread_sig_debug > 0. ++ (pthread_handle_create): Increment __pthread_handles_num. ++ ++ * manager.c (pthread_handle_create): Don't pass CLONE_PTRACE to clone. ++ * pthread.c (__pthread_initialize_manager): Likewise. ++ ++ * pthread.c (pthread_initialize): Use __libc_allocate_rtsig (1) ++ instead of __libc_allocate_rtsig (2). ++ (__pthread_initialize_manager): Send __pthread_sig_debug to gdb ++ instead of __pthread_sig_cancel. ++ (pthread_handle_sigdebug): Fix comments. ++ ++1999-01-21 Ulrich Drepper <drepper@cygnus.com> ++ ++ * manager.c (pthread_allocate_stack): Set ++ __pthread_nonstandard_stacks if user-specified stack is used. ++ ++1999-01-16 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/unix/sysv/linux/bits/posix_opt.h: Add _LFS_ASYNCHRONOUS_IO, ++ _LFS_LARGEFILE, _LFS64_LARGEFILE, and _LFS64_STDIO from Unix98. ++ ++1999-01-07 Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++ * pthread.c: Use a third signal __pthread_sig_debug distinct ++ from __pthread_sig_cancel to notify gdb when a thread is ++ created ++ * manager.c: Likewise. ++ * internals.h: Likewise. ++ * signals.c: The implementation of sigwait(s) assumed that ++ all signals in s have signal handlers already attached. ++ This is not required by the standard, so make it work ++ also if some of the signals have no handlers. ++ ++1999-01-05 Andreas Schwab <schwab@issan.cs.uni-dortmund.de> ++ ++ * linuxthreads.texi: Remove pointers from first @node. Move old ++ @node spec inside comment. ++ ++1998-12-31 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/pthread/bits/stdio-lock.h: Define _IO_lock_lock and ++ _IO_lock_unlock. ++ ++1998-12-29 Ulrich Drepper <drepper@cygnus.com> ++ ++ * semaphore.c (sem_trywait): Don't forget to unlock the semaphore ++ lock. Patch by Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>. ++ ++1998-12-21 Ulrich Drepper <drepper@cygnus.com> ++ ++ * manager.c: Threads now send __pthread_sig_cancel on termination. ++ Change clone call and signal masks. ++ * thread.c (pthread_handle_sigrestart): Remove special code for ++ manager. ++ (pthread_handle_sigcancel): In manager thread call ++ __pthread_manager_sighandler. ++ * sysdeps/i386/pt-machine.h (__compare_and_swap): Add memory clobber. ++ * sysdeps/i386/i686/pt-machine.h: Likewise. ++ Patches by Xavier Leroy. ++ ++1998-12-14 Ulrich Drepper <drepper@cygnus.com> ++ ++ * spinlock.c (__pthread_unlock): Don't crash if called for an ++ untaken mutex. Reported by Ruslan V. Brushkoff <rus@Snif.Te.Net.UA>. ++ ++ * Examples/ex6.c: Unbuffer stdout and reduce sleep time to reduce ++ overall runtime. ++ ++1998-12-13 Ulrich Drepper <drepper@cygnus.com> ++ ++ * Examples/ex3.c: Wait until all threads are started before ++ searching for the number to avoid race condition on very fast ++ systems. ++ ++1998-12-08 Andreas Jaeger <aj@arthur.rhein-neckar.de> ++ ++ * sysdeps/pthread/pthread.h: Remove __pthread_setcanceltype ++ declaration since it's not needed. ++ ++ * sysdeps/pthread/pthread.h: Move internal functions to ... ++ * internals.h: ...here. ++ ++1998-12-02 H.J. Lu <hjl@gnu.org> ++ ++ * pthread.c (__pthread_sig_restart): Initiliaze to 0 if ++ SIGRTMIN is defined. ++ (__pthread_sig_cancel): Likewise. ++ ++1998-12-01 Andreas Jaeger <aj@arthur.rhein-neckar.de> ++ ++ * wrapsyscall.c: Include <sys/mman.h> for msync, ++ <stdlib.h> for system and <termios.h> for tcdrain prototype. ++ Correct msync declaration. ++ ++1998-11-29 Roland McGrath <roland@baalperazim.frob.com> ++ ++ * sysdeps/pthread/bits/libc-tsd.h (__libc_tsd_define, __libc_tsd_get, ++ __libc_tsd_set): New macros for new interface. ++ * no-tsd.c: New file, provide uninitialized defns of ++ __libc_internal_tsd_get and __libc_internal_tsd_set. ++ * Makefile (routines): Add no-tsd. ++ ++1998-10-12 Roland McGrath <roland@baalperazim.frob.com> ++ ++ * internals.h: Include <bits/libc-tsd.h>, not <bits/libc-lock.h>. ++ * sysdeps/pthread/bits/libc-lock.h (__libc_internal_tsd_get, ++ __libc_internal_tsd_set): Move decls to ... ++ * sysdeps/pthread/bits/libc-tsd.h: New file for __libc_internal_tsd_* ++ declarations. ++ ++ * sysdeps/pthread/bits/libc-lock.h (__libc_internal_tsd_get, ++ __libc_internal_tsd_set): Make these pointers to functions, not ++ functions; remove #pragma weak decls for them. ++ * specific.c (__libc_internal_tsd_get, __libc_internal_tsd_set): ++ Define static functions and initialized pointers to them. ++ ++1998-11-18 Ulrich Drepper <drepper@cygnus.com> ++ ++ * Makefile (CFLAGS-mutex.c): Define as -D__NO_WEAK_PTHREAD_ALIASES. ++ (CFLAGS-specific.c): Likewise. ++ (CFLAGS-pthread.c): Likewise. ++ (CFLAGS-ptfork.c): Likewise. ++ (CFLAGS-cancel.c): Likewise. ++ * sysdeps/pthread/bits/libc-lock.h: Don't mark __pthread_* functions ++ as weak references if __NO_WEAK_PTHREAD_ALIASES is defined. ++ ++ * mutex.c (pthread_mutex_init): Define as strong symbol. ++ (pthread_mutex_destroy): Likewise. ++ (pthread_mutex_trylock): Likewise. ++ (pthread_mutex_lock): Likewise. ++ (pthread_mutex_unlock): Likewise. ++ (pthread_mutexattr_init): Likewise. ++ (pthread_mutexattr_destroy): Likewise. ++ (pthread_once): Likewise. ++ * ptfork.c (pthread_atfork): Likewise. ++ * specific.c (pthread_key_create): Likewise. ++ (pthread_setspecific): Likewise. ++ (pthread_getspecific): Likewise. ++ ++1998-11-15 Andreas Schwab <schwab@issan.cs.uni-dortmund.de> ++ ++ * linuxthreads.texi: Fix punctuation after xref. ++ ++1998-11-10 H.J. Lu <hjl@gnu.org> ++ ++ * sysdeps/unix/sysv/linux/bits/local_lim.h: Undefine NR_OPEN ++ if it is defined in <linux/limits.h>. ++ ++1998-10-29 14:28 Ulrich Drepper <drepper@cygnus.com> ++ ++ * spinlock.h (__pthread_trylock): Define inline. ++ (__pthread_lock): Add extra parameter to declaration. Declare ++ using internal_function. ++ (__pthread_unlock): Declare using internal_function. ++ * spinlock.c (__pthread_lock): Add new parameter. Use it instead ++ of local variable self. Avoid recomputing self. Define using ++ internal_function. ++ (__pthread_trylock): Remove. ++ (__pthread_unlock): Define using internal_function. ++ * cancel.c: Adjust for __pthread_lock interface change. Use already ++ computed self value is possible. ++ * condvar.c: Likewise. ++ * join.c: Likewise. ++ * manager.c: Likewise. ++ * mutex.c: Likewise. ++ * pthread.c: Likewise. ++ * rwlock.c: Likewise. ++ * semaphore.c: Likewise. ++ * signals.c: Likewise. ++ ++1998-10-27 13:46 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/pthread/pthread.h (struct _pthread_cleanup_buffer): Prepend ++ __ to field names of the struct. ++ * sysdeps/pthread/bits/pthreadtypes.h (struct _pthread_fastlock): ++ Likewise. ++ (pthread_attr_t): Likewise. ++ (pthread_cond_t): Likewise. ++ (pthread_condattr_t): Likewise. ++ (pthread_mutex_t): Likewise. ++ (pthread_mutexattr_t): Likewise. ++ (pthread_rwlock_t): Likewise. ++ (pthread_rwlockattr_t): Likewise. ++ * attr.c: Adjust for pthread.h and pthreadtypes.h change. ++ * cancel.c: Likewise. ++ * condvar.c: Likewise. ++ * manager.c: Likewise. ++ * mutex.c: Likewise. ++ * pthread.c: Likewise. ++ * ptlongjmp.c: Likewise. ++ * rwlock.c: Likewise. ++ * spinlock.c: Likewise. ++ ++1998-10-09 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/i386/pt-machine.h (get_eflags, set_eflags): Mark these ++ also with PT_EI. ++ ++ * sysdeps/i386/i686/pt-machine.h: Remove unused inline ++ definitions. ++ ++ * Makefile (libpthread-routines): Add pt-machine. ++ * pt-machine.c: New file. ++ * sysdeps/alpha/pt-machine.h: Define PT_EI as extern inline is not ++ yet defined. Use PT_EI in extern inline definitions. ++ * sysdeps/arm/pt-machine.h: Likewise. ++ * sysdeps/i386/pt-machine.h: Likewise. ++ * sysdeps/i386/i686/pt-machine.h: Likewise. ++ * sysdeps/m68k/pt-machine.h: Likewise. ++ * sysdeps/mips/pt-machine.h: Likewise. ++ * sysdeps/powerpc/pt-machine.h: Likewise. ++ * sysdeps/sparc/sparc32/pt-machine.h: Likewise. ++ * sysdeps/sparc/sparc64/pt-machine.h: Likewise. ++ ++1998-10-02 Andreas Jaeger <aj@arthur.rhein-neckar.de> ++ ++ * semaphore.h: Include <sys/types.h> so that _pthread_descr ++ is declared. ++ ++1998-09-15 David S. Miller <davem@pierdol.cobaltmicro.com> ++ ++ * sysdeps/sparc/sparc32/pt-machine.h (INIT_THREAD_SELF): Add nr ++ argument. ++ * sysdeps/sparc/sparc64/pt-machine.h (INIT_THREAD_SELF): Likewise. ++ ++1998-09-12 14:24 -0400 Zack Weinberg <zack@rabi.phys.columbia.edu> ++ ++ * linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h: Add ++ multiple inclusion guard. ++ ++1998-09-02 11:08 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> ++ ++ * signals.c (sigaction): Check that sig is less than NSIG to avoid ++ array index overflow. ++ ++1998-09-06 10:56 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/pthread/semaphore.h: New file. ++ ++1998-09-06 09:08 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/pthread/bits/libc-lock.h (enum __libc_tsd_key_t): Add ++ _LIBC_TSD_KEY_DL_ERROR. ++ ++1998-08-31 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/i386/i686/pt-machine.h (testandset): Add memory clobber. ++ * sysdeps/i386/pt-machine.h: Likewise. ++ Suggested by Roland McGrath. ++ ++1998-08-28 13:58 Ulrich Drepper <drepper@cygnus.com> ++ ++ * internals.h: Also define THREAD_GETMEM_NC and THREAD_SETMEM_NC to ++ access thread data with non-constant offsets. ++ * specific.c: Use THREAD_GETMEM_NC and THREAD_SETMEM_NC where ++ necessary. ++ ++ * sysdeps/i386/useldt.h: Fix typo. Add THREAD_GETMEM_NC and ++ THREAD_SETMEM_NC definitions. ++ ++ * sysdeps/sparc/sparc32/pt-machine.h: Define THREAD_GETMEM_NC and ++ THREAD_SETMEM_NC. ++ * sysdeps/sparc/sparc64/pt-machine.h: Likewise. ++ ++1998-08-26 15:46 Ulrich Drepper <drepper@cygnus.com> ++ ++ * internals.h: Define THREAD_GETMEM and THREAD_SETMEM to default if ++ not already defined. ++ (struct _pthread_descr_struct): Add p_self and p_nr field. ++ * manager.c (__pthread_handles): Define second element to point ++ to manager thread. ++ (__pthread_handles_num): Initialize to 2. ++ (__pthread_manager): Use INIT_THREAD_SELF with two arguments. ++ (pthread_start_thread): Likewise. ++ (pthread_handle_create): Start search for free slot at entry 2. ++ Initialize new fields p_self and p_nr. ++ Call __clone with CLONE_PTRACE if available. ++ (pthread_free): Call FREE_THREAD_SELF if available. ++ * pthread.c (__pthread_initial_thread): Initialize new fields. ++ (__pthread_manager_thread): Likewise. ++ (__pthread_initialize_manager): Call __clone with CLONE_PTRACE. ++ ++ * cancel.c: Use THREAD_GETMEM and THREAD_SETMEM to access the ++ elements of the thread descriptor. ++ * condvar.c: Likewise. ++ * errno.c: Likewise. ++ * join.c: Likewise. ++ * manager.c: Likewise. ++ * pthread.c: Likewise. ++ * ptlongjmp.c: Likewise. ++ * semaphore.c: Likewise. ++ * signals.c: Likewise. ++ * specific.c: Likewise. ++ * spinlock.c: Likewise. ++ ++ * sysdeps/alpha/pt-machine.h (INIT_THREAD_SELF): Add extra parameter. ++ ++ * sysdeps/i386/useldt.h: New file. ++ * sysdeps/i386/i686/pt-machine.h: Show how to use this file. ++ ++ * sysdeps/sparc/sparc32/pt-machine.h: Define THREAD_GETMEM and ++ THREAD_SETMEM using __thread_self. ++ * sysdeps/sparc/sparc64/pt-machine.h: Likewise. ++ ++1998-08-24 Geoff Keating <geoffk@ozemail.com.au> ++ ++ * spinlock.c (__pthread_lock): Reset p_nextwaiting to NULL if it ++ turned out that we didn't need to queue after all. ++ ++1998-08-22 Geoff Keating <geoffk@ozemail.com.au> ++ ++ * sysdeps/powerpc/pt-machine.h: Remove testandset, it's not used ++ and wastes space; correct types. ++ ++1998-08-08 11:18 H.J. Lu <hjl@gnu.org> ++ ++ * signals.c (sigaction): Handle NULL argument. ++ ++1998-08-04 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/unix/sysv/linux/bits/sigthread.h: Use __sigset_t instead ++ of sigset_t. ++ ++1998-08-02 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> ++ ++ * Makefile (linuxthreads-version): Extract correct number from ++ Banner. ++ ++1998-07-29 Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++ * Banner: Bump version number to 0.8 ++ * FAQ.html: Many updates, in particular w.r.t. debugging. ++ * manager.c: Support for non-default stacksize for ++ LinuxThreads-allocated stacks; ++ don't use guard pages for stacks with default size, rely on ++ rlimit(RLIMIT_STACK) instead (it's cheaper). ++ * attr.c: Likewise. ++ * cancel.c: Use __pthread_sig_cancel and __pthread_sig_restart ++ everywhere instead of PTHREAD_SIG_CANCEL and PTHREAD_SIG_RESTART. ++ * condvar.c: Likewise. ++ * internals.h: Likewise. ++ * restart.h: Likewise. ++ * signals.c: Likewise. ++ * pthread.c: Likewise; set rlimit(RLIMIT_STACK) as we need it. ++ ++1998-07-23 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> ++ ++ * weaks.c: Define pthread_mutexattr_[sg]ettype instead of ++ __pthread_mutexattr_[sg]ettype. Add more weak aliases. ++ * Versions: Put __pthread_mutexattr_settype under version ++ GLIBC_2.0. Don't export __pthread_mutexattr_setkind_np and ++ __pthread_mutexattr_gettype. ++ ++1998-07-23 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> ++ ++ * sysdeps/pthread/bits/libc-lock.h: Make ++ __pthread_mutexattr_settype weak. Don't make ++ __pthread_mutexattr_setkind_np weak. ++ ++1998-07-16 10:52 Ulrich Drepper <drepper@cygnus.com> ++ ++ * manager.c (pthread_handle_create): Check whether sched_setscheduler ++ call can succeed here. ++ ++ * mutex.c: Define __pthread_mutexattr_settype and make ++ __pthread_mutexattr_setkind_np an alias. ++ Likewise for __pthread_mutexattr_gettype. ++ ++1998-07-15 11:00 -0400 Zack Weinberg <zack@rabi.phys.columbia.edu> ++ ++ * attr.c (pthread_attr_setschedpolicy): Don't check whether caller ++ is root. ++ ++1998-07-14 19:38 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/pthread/bits/libc-lock.h: Define __libc_cleanup_end. ++ ++1998-07-11 Andreas Jaeger <aj@arthur.rhein-neckar.de> ++ ++ * Examples/ex6.c: Include <unistd.h> for usleep. ++ ++1998-06-13 11:04 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> ++ ++ * Examples/ex4.c (main): Use exit, not pthread_exit. ++ ++1998-07-09 13:39 Ulrich Drepper <drepper@cygnus.com> ++ ++ * Versions: Add __pthread_mutexattr_gettype and ++ __pthread_mutexattr_settype. ++ * lockfile.c: Use __pthread_mutexattr_settype instead of ++ __pthread_mutexattr_setkind_np. ++ * mutex.c: Define __pthread_mutexattr_gettype and ++ __pthread_mutexattr_settype. ++ * weak.c: Likewise. ++ * sysdeps/pthread/pthread.h: Declare __pthread_mutexattr_gettype and ++ __pthread_mutexattr_settype. ++ * sysdeps/pthread/bits/libc-lock.h (__libc_lock_init_recursive): ++ Use __pthread_mutexattr_settype. ++ ++1998-07-08 22:26 Ulrich Drepper <drepper@cygnus.com> ++ ++ * Versions: Add pthread_mutexattr_gettype, pthread_mutexattr_settype. ++ * mutex.c: Define weak alias pthread_mutexattr_gettype and ++ pthread_mutexattr_settype. ++ * sysdeps/pthread/pthread.h: Declare these functions. ++ Move pthread_sigmask and pthread_kill declaration in separate header. ++ * sysdeps/unix/sysv/linux/bits/sigthread.h: New file. ++ ++1998-07-07 15:20 Ulrich Drepper <drepper@cygnus.com> ++ ++ * Makefile: Add rules to compile and run tests. ++ * Examples/ex1.c: Little changes to fix warnings. ++ * Examples/ex2.c: Likewise. ++ * Examples/ex3.c: Likewise. ++ * Examples/ex4.c: Likewise. ++ * Examples/ex5.c: Likewise. ++ * Examples/ex6.c: New file. ++ ++1998-07-05 11:54 Ulrich Drepper <drepper@cygnus.com> ++ ++ * Versions: Add pthread_attr_init to GLIBC_2.1 version in libc. ++ ++1998-07-01 Andreas Jaeger <aj@arthur.rhein-neckar.de> ++ ++ * attr.c: Include <string.h>. ++ ++1998-06-30 11:47 Ulrich Drepper <drepper@cygnus.com> ++ ++ * attr.c: Include errno.h. Use memcpy to copy sched_param. ++ * internals.h: Include limits.h. ++ * manager.c: Use memcpy to copy sched_param. ++ * ptfork.c: Include errno.h. ++ * pthread.c: Likewise. ++ * semaphore.c: Likewise. ++ * specific.c: Likewise. ++ * spinlock.h: Likewise. ++ * sysdeps/pthread/pthread.h: Include only allowed headers. Move ++ type definition to ... ++ * sysdeps/pthread/bits/pthreadtypes.h: ...here. New file. ++ ++1998-06-29 12:34 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/pthread/pthread.h: Use __PMT not __P for function pointers. ++ ++ * sysdeps/pthread/pthread.h: Define various PTHREAD_* symbols also ++ as macros as demanded in POSIX.1, Annex C. ++ ++1998-06-29 12:29 Ulrich Drepper <drepper@cygnus.com> ++ ++ * internals.h (struct pthread_request): For free use pthread_t ++ instead of pthread_descr. ++ * join.c (pthread_join): Pass thread_id, not th to manager. ++ (pthread_detach): Likewise. ++ * manager.c (__pthread_manager): Except thread ID in FREE_REQ case. ++ (pthread_exited): Remove detached queue code. ++ (pthread_handle_free): Expect thread ID parameter and use it to ++ validate the thread decsriptor. Don't use detached queue. ++ Patches by Xavier Leroy. ++ ++1998-06-27 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> ++ ++ * libpthread.map: Export accept, longjmp, sigaction, siglongjmp, ++ _IO_flockfile, _IO_ftrylockfile, _IO_funlockfile, ++ __pthread_atfork, __pthread_key_create, __pthread_once. ++ * internals.h: Doc fix. ++ * pthread.c (__pthread_initialize): Define again. ++ ++1998-06-26 Ulrich Drepper <drepper@cygnus.com> ++ ++ * manager.c (pthread_exited): If thread is not detached put it on ++ special list. ++ (pthread_handle_free): If thread is not on list with living threads ++ search on list with detached threads. ++ ++ * sysdeps/pthread/pthread.h (PTHREAD_RWLOCK_INITIALIZER): Correct ++ for new definition of pthread_rwlock_t. ++ ++ * spinlock.c: Correct test whether to compile ++ __pthread_compare_and_swap or not. ++ ++1998-06-25 19:27 Ulrich Drepper <drepper@cygnus.com> ++ ++ * attr.c: Finish user stack support. Change locking code to be safe ++ in situations with different priorities. ++ * cancel.c: Likewise. ++ * condvar.c: Likewise. ++ * internals.h: Likewise. ++ * join.c: Likewise. ++ * manager.c: Likewise. ++ * mutex.c: Likewise. ++ * pthread.c: Likewise. ++ * ptlongjmp.c: Likewise. ++ * queue.h: Likewise. ++ * rwlock.c: Likewise. ++ * semaphore.c: Likewise. ++ * semaphore.h: Likewise. ++ * signals.c: Likewise. ++ * spinlock.c: Likewise. ++ * spinlock.h: Likewise. ++ * sysdeps/pthread/pthread.h: Likewise. ++ Patches by Xavier Leroy. ++ ++ * sysdeps/i386/i686/pt-machine.h: New file. ++ ++1998-06-25 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/pthread/pthread.h: Make [sg]et_stacksize and ++ [sg]et_stackaddr prototypes always available. ++ ++ * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define ++ _POSIX_THREAD_ATTR_STACKSIZE and _POSIX_THREAD_ATTR_STACKADDR. ++ ++1998-06-24 Ulrich Drepper <drepper@cygnus.com> ++ ++ * manager.c (pthread_free): Undo patch from 980430. ++ Reported by David Wragg <dpw@doc.ic.ac.uk>. ++ ++1998-06-09 15:07 Ulrich Drepper <drepper@cygnus.com> ++ ++ * manager.c: Define __pthread_manager_adjust_prio and use it to ++ increase priority when needed. ++ * internals.h: Add prototype for __pthread_manager_adjust_prio. ++ * mutex.c: Optimize mutexes to wake up only one thread. ++ * pthread.c: Move PID of manager for global variable in structure ++ element. ++ Patches by Xavier Leroy. ++ ++1998-06-07 13:47 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/pthread/bits/libc-lock.h: Optimize cleanup handlers a bit. ++ ++1998-06-03 Andreas Jaeger <aj@arthur.rhein-neckar.de> ++ ++ * attr.c: Correct typo. ++ ++1998-05-01 Ulrich Drepper <drepper@cygnus.com> ++ ++ * manager.c (pthread_free): Unmap guard before the stack. ++ Patch by Matthias Urlichs. ++ ++1998-04-30 Ulrich Drepper <drepper@cygnus.com> ++ ++ * manager.c (pthread_free): Detect already free child. ++ Patch by Xavier Leroy, reported by Matthias Urlichs. ++ ++1998-04-23 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> ++ ++ * Makefile (linuxthreads-version): Renamed back from ++ libpthread-version. ++ ++1998-04-21 Ulrich Drepper <drepper@cygnus.com> ++ ++ * ptlongjmp.c: Add prototypes for __libc_siglongjmp and ++ __libc_longjmp. ++ ++1998-04-20 14:55 Ulrich Drepper <drepper@cygnus.com> ++ ++ * Makefile (libpthread-routines): Add ptlongjmp and spinlock. ++ * internals.h: Add definitions for new spinlock implementation. ++ * ptlongjmp.c: New file. ++ * spinlock.c: New file. ++ * spinlock.h (acquire): Don't reschedule using __sched_yield, use ++ new function __pthread_acquire to prevent deadlocks with thread ++ with different priorities. ++ Patches by Xavier Leroy <Xavier.Leroy@inria.fr>. ++ ++1998-03-16 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> ++ ++ * manager.c (__pthread_manager): Reduce first argument to select ++ to include just the needed file descriptor. ++ ++1998-03-17 00:06 Ulrich Drepper <drepper@cygnus.com> ++ ++ * manager.c: Fix last patch which caused core dumps. ++ ++ * pthread.c: Correctly handle missing SIGRTMIN. ++ ++1998-03-15 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> ++ ++ * libpthread.map: Add __libc_internal_tsd_get and ++ __libc_internal_tsd_set. Add missing cancelable functions. Export ++ libc internal versions of the cancelable functions. ++ ++1998-03-13 16:51 Ulrich Drepper <drepper@cygnus.com> ++ ++ * weaks.c: Define pthread_attr_init as GLIBC_2.0 and GLIBC_2.1. ++ ++1998-03-13 00:46 Ulrich Drepper <drepper@cygnus.com> ++ ++ * attr.c: Implement pthread_attr_[gs]etguardsize, ++ pthread_attr_[gs]setstackaddr, pthread_attr_[gs]etstacksize. ++ Change pthread_attr_init to have two interfaces. ++ * internals.h (struct _pthread_descr_struct): Add new fields for ++ above functions. ++ * libpthread.map: Add names in GLIBC_2.1 section. ++ * manager.c (pthread_handle_create): Implement guardsize and ++ user stack. ++ (pthread_free): Likewise. ++ * pthread.c (pthread_create): Add new interface for changed ++ pthread_attr_t. ++ * sysdeps/pthread/pthread.h: Add prototypes for new functions. ++ * sysdeps/unix/sysv/linux/bits/local_lim.h: Add definition of ++ PTHREAD_STACK_MIN. ++ ++1998-03-11 00:42 Wolfram Gloger <wmglo@dent.med.uni-muenchen.de> ++ ++ * manager.c: Enable resetting of the thread scheduling policy ++ to SCHED_OTHER when the parent thread has a different one. ++ ++1998-02-01 13:51 Ulrich Drepper <drepper@cygnus.com> ++ ++ * sysdeps/unix/sysv/linux/bits/posix_opt.h: Define ++ _POSIX_ASYNCHRONOUS_IO. ++ ++ * sysdeps/pthread/pthread.h: Define bits for Unix98 variants of ++ mutexes. ++ * mutex.c: Implement new mutex types. ++ ++ * internals.h: Include <signal.h>. ++ ++ * libpthread.map: Add __erno_location and __h_errno_location. ++ ++ * errno.c: Return pointer to variable actually in use. This might ++ not be the one in the thread structure. ++ * internals.h (struct _pthread_descr_struct): Add new fields p_errnop ++ and p_h_errnop. ++ * manager.c (__pthread_manager): Set p_errnop and p_h_errnop member ++ of manager thread structure. ++ (pthread_handle_create): Set p_errnop and p_h_errnop members for new ++ thread. ++ * pthread.c: Adapt initializer for thread structures. ++ (__pthread_initial_thread): Set p_errnop and p_h_errnop member. ++ (__pthread_reset_main_thread): Reset p_errnop and p_h_errnop of ++ current thread to global variables. ++ ++1998-01-31 17:27 Ulrich Drepper <drepper@cygnus.com> ++ ++ * rwlock.c: New file. ++ * Makefile (libpthread-routines): Add rwlock. ++ * sysdeps/pthread/pthread.h: Define data structures and declare ++ functions. ++ * libpthread.map: Add new functions. ++ ++1997-12-18 13:50 Philip Blundell <pb@nexus.co.uk> ++ ++ * sysdeps/arm/pt-machine.h: New file; add ARM support. ++ * sysdeps/arm/Implies: likewise. ++ * README: Document it. ++ ++1997-12-13 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> ++ ++ * signals.c: Remove unneeded initializer for sigwaited, saving a ++ warning. ++ ++1997-04-11 01:18 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> ++ ++ * semaphore.c (sem_init): Set sem_spinlock only if available. ++ ++1997-12-04 01:48 Ulrich Drepper <drepper@cygnus.com> ++ ++ * mutex.c: Implement PTHREAD_MUTEX_CHECKERROR. ++ * sysdeps/pthread/pthread.h: Define PTHREAD_MUTEX_CHECKERROR. ++ ++ * Makefile: Update from LinuxThreads 0.7. ++ * internals.h. Likewise. ++ * manager.c: Likewise. ++ * mutex.c: Likewise. ++ * pthread.c: Likewise. ++ * signals.c: Likewise. ++ * specific.c: Likewise. ++ * Examples/ex3.c: Likewise. ++ ++1997-11-20 18:13 Ulrich Drepper <drepper@cygnus.com> ++ ++ * pthread.c (__pthread_reset_main_thread): Close pipe only if still ++ open. ++ ++1997-10-29 05:38 Ulrich Drepper <drepper@cygnus.com> ++ ++ * wrapsyscall.c: Add socket functions which are also cancelation ++ points. ++ ++1997-10-19 21:40 Wolfram Gloger <wg@wolfram.dent.med.uni-muenchen.de> ++ ++ * specific.c (__libc_internal_tsd_set, __libc_internal_tsd_get): ++ New functions for fast thread specific data within libc. ++ ++ * internals.h: Add new array p_libc_specific to struct ++ _pthread_descr_struct. ++ ++ * sysdeps/pthread/bits/libc-lock.h: Declare new functions. ++ ++1997-10-13 05:39 Ulrich Drepper <drepper@cygnus.com> ++ ++ * semaphore.h: Add __BEGIN_DECLS/__END_DECLS. ++ Reported by Ralf Corsepius <corsepiu@faw.uni-ulm.de>. ++ ++1997-08-29 03:05 Ulrich Drepper <drepper@cygnus.com> ++ ++ * internals.h (struct _pthread_descr_struct): Add definitions for ++ two-level specific key handling. ++ * manager.c (pthread_handle_create): Initialize specific memory array. ++ * specific.c: Implement two-level key handling. ++ * weaks.c: Don't provide dummy key handling. ++ * sysdeps/pthread/bits/libc-lock.h: Typedef __libc_lock_t (no #define). ++ Add definition of __libc_key_t. ++ * sysdeps/unix/sysv/linux/bits/local_lim.h: Define PTHREAD_KEYS_MAX ++ as 1024. ++ Add definition of _POSIX_THREAD_DESTRUCTOR_ITERATIONS and ++ PTHREAD_DESTRUCTOR_ITERATIONS. ++ ++ * manager.c (pthread_handle_create): Compare mmap result with ++ MAP_FAILED. ++ ++ * ptfork.c: Rename to __pthread_atfork and make old name a weak alias. ++ * sysdeps/pthread/bits/pthread.h: Add prototype for __pthread_atfork. ++ ++1997-08-22 19:04 Richard Henderson <rth@cygnus.com> ++ ++ sysdeps/sparc -> sysdeps/sparc/sparc32 ++ sysdeps/sparc64 -> sysdeps/sparc/sparc64 ++ ++ * internals.h: Change definition of THREAD_SELF to be an expression, ++ not a statement that did a return. ++ * sysdeps/alpha/pt-machine.h (THREAD_SELF): Update accordingly. ++ * sysdeps/sparc/sparc32/pt-machine.h (THREAD_SELF, INIT_THREAD_SELF): ++ Follow Solaris and use a "system reserved" register (%g6) to hold ++ the thread descriptor. ++ * sysdeps/sparc/sparc64/pt-machine.h: Likewise. ++ ++1997-08-03 00:09 Ulrich Drepper <drepper@cygnus.com> ++ ++ * mutex.c: Correct pthread_once. Patch by Xavier Leroy. ++ * sysdeps/pthread/pthread.h: Add prototype for __pthread_once. ++ * sysdeps/pthread/bits/pthread.h: Add macros for __libc_once. ++ ++ * semaphore.c: Include spinlock.h only when needed. ++ ++ * specific.c (__pthread_setsepcific, __pthread_getspecific): Reject ++ keys for entries not in use. ++ ++ * weaks.c: Implement key handling functions for real. ++ ++1997-06-29 01:04 Richard Henderson <richard@gnu.ai.mit.edu> ++ ++ Initial sparc64-linux support: ++ * linuxthreads/sysdeps/sparc64/Implies: New file. ++ * linuxthreads/sysdeps/sparc64/pt-machine.h: Likewise. ++ ++1997-06-29 00:48 Ulrich Drepper <drepper@cygnus.com> ++ ++ * semaphore.c: Include spinlock.h at correct place. ++ Patch by HJ Lu. ++ ++1997-06-13 10:06 Richard Henderson <rth@tamu.edu> ++ ++ The Great Bit File Move: ++ * sysdeps/alpha/semaphorebits.h: -> .../bits/semaphore.h. ++ * sysdeps/powerpc/semaphorebits.h: Likewise. ++ * sysdeps/pthread/cmpxchg/semaphorebits.h: Likewise. ++ * sysdeps/pthread/no-cmpxchg/semaphorebits.h: Likewise. ++ * sysdeps/pthread/libc-lock.h: -> bits/ ++ * sysdeps/pthread/stdio-lock.h: Likewise. ++ * sysdeps/unix/sysv/linux/local_lim.h: Likewise. ++ * sysdeps/unix/sysv/linux/posix_opt.h: Likewise. ++ * semaphore.h: Likewise. ++ * sysdeps/pthread/pthread.h: Likewise. ++ ++ * lockfile.c: <foo.h> -> <bits/foo.h>. ++ * semaphore.h: Likewise. ++ ++ * Makefile: (headers): foo.h -> bits/foo.h. ++ * sysdeps/pthread/Makefile: Likewise. ++ ++1997-04-11 01:18 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> ++ ++ * semaphore.c (sem_init): Set sem_spinlock only if available. ++ ++ * sysdeps/m68k/pt-machine.h (testandset, __compare_and_swap): Fix ++ asm constraints. ++ ++1997-04-09 03:00 Ulrich Drepper <drepper@cygnus.com> ++ ++ Update from LinuxThreads 0.6. ++ ++ * attr.c (pthread_attr_getdetachstate): Use __sched_get_priority_max ++ and __sched_get_priority_min instead of names without `__'. ++ ++ * manager.c: Rewrite large parts to implement opaque pthread_t. ++ ++ * cancel.c: Adapt for opaque pthread_t type. ++ * condvar.c: Likewise. ++ * errno.c: Likewise. ++ * join.c: Likewise. ++ * mutex.c: Likewise. ++ * pthread.c: Likewise. ++ * signals.c: Likewise. ++ * specific.c: Likewise. ++ * restart.h: Likewise. ++ * queue.h: Likewise. ++ * Examples/ex3.c: Likewise. ++ * Examples/ex4.c: Likewise. ++ * sysdeps/pthread/pthread.h: Likewise. ++ ++ * pthread.c: Accumulate time for all threads in thread manager. ++ ++ * semaphore.c: Implement fallback implementation for architectures ++ sometimes missing compare-exchange operations. ++ ++ * cancel.c (pthread_cancel): Validate handle argument. ++ * join.c (pthread_join): Likewise. ++ (pthread_detach): Likewise. ++ * signals.c (pthread_kill): Likewise. ++ ++ * spinlock.h (acquire): Use __sched_yield not sched_yield. ++ ++ * queue.h (enqueue): Enqueue thread according to priority. ++ ++ * internals.c (struct pthread_start_args): New struct for passing ++ args to cloning function. ++ (struct _pthread): Rename to _pthread_descr_struct and adapt for ++ opaque pthread_t. ++ ++ * Examples/Makefile (clean): Pass -f option to rm. ++ ++ * sysdeps/i386/pt-machine.h: Add check for compare-exchange instruction ++ and define TEST_FOR_COMPARE_AND_SWAP. ++ * sysdeps/i386/i486/pt-machine.h: Removed. ++ ++ * sysdeps/unix/sysv/linux/local_lim.h (PTHREAD_THREADS_MAX): Increase ++ to 1024. ++ ++1997-04-04 16:38 Ulrich Drepper <drepper@cygnus.com> ++ ++ * restart.h (suspend): Clear p_signal before suspending. ++ (suspend_with_cancellation): Likewise. ++ Patch by Xavier Leroy <Xavier.Leroy@inria.fr>. ++ ++ * weaks.c: Make __pthread_key_create return 1. ++ * sysdeps/pthread/libc-lock.h: Define __libc_key_create, ++ __libc_getspecific, __libc_setspecific, and __libc_key_t. ++ * sysdeps/pthread/stdio-lock.h: Don't care for implementation not ++ using libio. ++ ++1997-03-19 15:13 Miguel de Icaza <miguel@nuclecu.unam.mx> ++ ++ * sysdeps/sparc/pt-machine (RELEASE): Fix. ++ ++1997-03-01 07:55 Geoff Keating <geoffk@ozemail.com.au> ++ ++ * sysdeps/powerpc/Implies: Added. ++ * sysdeps/powerpc/pt-machine.h: Added. ++ * sysdeps/powerpc/semaphorebits.h: Added. ++ ++1997-01-22 01:22 Ulrich Drepper <drepper@cygnus.com> ++ ++ * linuxtheads/pthread.c (__pthread_initial_thread): Correct ++ initializer. ++ (__pthread_manager_thread): Likewise. ++ Reported by Andreas Jaeger. ++ ++1997-01-18 22:15 Richard Henderson <rth@tamu.edu> ++ ++ Since sigset_t no longer fits in a register, we can't pass in the ++ thread's initial mask so easily. Take this opportunity to simplify ++ the clone implementation by only accepting a single void* argument. ++ ++ * linuxthreads/manager.c (__pthread_manager): Put thread vitals ++ in the thread struct instead of as arguments through clone. ++ (pthread_start_thread): Look for them there. ++ * linuxthreads/internals.h (struct _pthread): Add p_initial_fn, ++ p_initial_fn_arg, p_initial_mask. Fix __pthread_manager proto. ++ * linuxthreads/pthread.c (pthread_initialize_manager): Revise ++ clone invocation. +diff -Naur ../glibc-2.1.3/linuxthreads/Changes glibc-2.1.3/linuxthreads/Changes +--- ../glibc-2.1.3/linuxthreads/Changes 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/Changes 1998-08-28 03:07:17.000000000 -0700 +@@ -0,0 +1,73 @@ ++Release 0.7: ++- Destructors for thread-specific data now conform to the POSIX semantics ++ (call destructors again if non-NULL TSD remains after a round of ++ destruction). ++- Implemented thread-specific data as a sparse array, allows more TSD keys ++ and smaller thread descriptors (Ulrich Drepper). ++- Added "error checking" mutexes. ++- Protect against multiple sigwait() on the same signals. ++- Simplified implementation of semaphores when compare_and_swap is ++ not available. ++- Fixed bug in fork() where stdin was closed if fork() was called before ++ the first pthread_create(). ++- Fixed bug in the gethostby*_r functions (bad result if null bytes ++ in addresses). ++- Typos in manual pages corrected. ++- First cut at a PowerPC port (not working yet, runs into problems ++ with gcc and with the C library). ++ ++Release 0.6: ++- Validation of thread identifiers: no more crashes when operating on ++ a thread that has exited (based on Pavel Krauz's ideas). ++- Added fallback implementation of semaphores for the 386 and the ++ Sparc. ++- Fixed a bug in signal handling causing false restarts of suspended ++ threads. ++- Fixed a bug in realtime scheduling causing all threads to have ++ default scheduling on Ix86 with libc5. ++- With realtime scheduling, unlocking a mutex now restarts the ++ highest priority thread waiting on the mutex, not the ++ first-suspended thread (Richard Neitzel). ++- Timing a process now returns cumulative times for all threads, not ++ just times for the initial thread (suggested by Wolfram Gloger). ++- Cleaned up name space (internal defs prefixed by __, weak aliases ++ for non-portable extensions). ++- MIPS port (contributed by Ralf Baechle). ++ ++Release 0.5: ++- Signal-safe semaphores a la POSIX 1003.1b added. ++- Locking bug in pthread_mutex_trylock over recursive mutexes fixed. ++- Race conditions in thread cancellation fixed. ++- Sparc port (contributed by Miguel de Icaza). ++- Support for getpwnam_r and getpwuid_r. ++- Added pthread_kill_other_threads_np to be used in conjunction with ++ exec*(). ++ ++Release 0.4: ++- Manual pages for all functions. ++- Synchronization bug causing accumulation of zombie processes fixed. ++- Race condition in pthread_cond_timedwait fixed. ++- Recursive mutexes are back by popular demand. ++- Partial support for realtime scheduling (initiated by Richard Neitzel). ++- pthread.h cleaned up a lot: now C++ compatible, added missing "const" ++ qualifiers, added short documentation, put to GNU libc standards ++ for name space pollution (Ulrich Drepper). ++- Motorola 68k port (contributed by Andreas Schwab). ++- Interaction with fork(2) cleaned up a lot. ++ ++Release 0.3: ++- Thread creation and reclaimation now performed by a centralized ++ "thread manager" thread. ++- Removed recursive mutexes to make regular mutexes more efficient. ++- Now available as a shared library (contributed by Richard Henderson). ++- Alpha port (contributed by Richard Henderson). ++- Fixed many small discrepancies with Posix 1003.1c. ++- Put under the LGPL instead of the GPL. ++ ++Release 0.2: ++- Reentrant libc functions (adapted from libc 5.3.9 by Peeter Joot) ++- pthread_cond_wait did not reacquire the mutex correctly on return ++- More efficient pthread_cond_broadcast ++ ++Release 0.1: ++- First public release +diff -Naur ../glibc-2.1.3/linuxthreads/Examples/Makefile glibc-2.1.3/linuxthreads/Examples/Makefile +--- ../glibc-2.1.3/linuxthreads/Examples/Makefile 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/Examples/Makefile 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,15 @@ ++CC=gcc ++CFLAGS=-g -O -Wall -I.. -D_REENTRANT ++LIBPTHREAD=../libpthread.a ++ ++PROGS=ex1 ex2 ex3 ex4 ex5 proxy ++ ++all: $(PROGS) ++ ++.c: ++ $(CC) $(CFLAGS) -o $* $*.c $(LIBPTHREAD) ++ ++$(PROGS): ++ ++clean: ++ rm -f $(PROGS) +diff -Naur ../glibc-2.1.3/linuxthreads/Examples/ex1.c glibc-2.1.3/linuxthreads/Examples/ex1.c +--- ../glibc-2.1.3/linuxthreads/Examples/ex1.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/Examples/ex1.c 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,35 @@ ++/* Creates two threads, one printing 10000 "a"s, the other printing ++ 10000 "b"s. ++ Illustrates: thread creation, thread joining. */ ++ ++#include <stddef.h> ++#include <stdio.h> ++#include <unistd.h> ++#include "pthread.h" ++ ++void * process(void * arg) ++{ ++ int i; ++ fprintf(stderr, "Starting process %s\n", (char *) arg); ++ for (i = 0; i < 10000; i++) { ++ write(1, (char *) arg, 1); ++ } ++ return NULL; ++} ++ ++int main(void) ++{ ++ int retcode; ++ pthread_t th_a, th_b; ++ void * retval; ++ ++ retcode = pthread_create(&th_a, NULL, process, (void *) "a"); ++ if (retcode != 0) fprintf(stderr, "create a failed %d\n", retcode); ++ retcode = pthread_create(&th_b, NULL, process, (void *) "b"); ++ if (retcode != 0) fprintf(stderr, "create b failed %d\n", retcode); ++ retcode = pthread_join(th_a, &retval); ++ if (retcode != 0) fprintf(stderr, "join a failed %d\n", retcode); ++ retcode = pthread_join(th_b, &retval); ++ if (retcode != 0) fprintf(stderr, "join b failed %d\n", retcode); ++ return 0; ++} +diff -Naur ../glibc-2.1.3/linuxthreads/Examples/ex2.c glibc-2.1.3/linuxthreads/Examples/ex2.c +--- ../glibc-2.1.3/linuxthreads/Examples/ex2.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/Examples/ex2.c 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,113 @@ ++/* The classic producer-consumer example. ++ Illustrates mutexes and conditions. ++ All integers between 0 and 9999 should be printed exactly twice, ++ once to the right of the arrow and once to the left. */ ++ ++#include <stdio.h> ++#include "pthread.h" ++ ++#define BUFFER_SIZE 16 ++ ++/* Circular buffer of integers. */ ++ ++struct prodcons { ++ int buffer[BUFFER_SIZE]; /* the actual data */ ++ pthread_mutex_t lock; /* mutex ensuring exclusive access to buffer */ ++ int readpos, writepos; /* positions for reading and writing */ ++ pthread_cond_t notempty; /* signaled when buffer is not empty */ ++ pthread_cond_t notfull; /* signaled when buffer is not full */ ++}; ++ ++/* Initialize a buffer */ ++ ++void init(struct prodcons * b) ++{ ++ pthread_mutex_init(&b->lock, NULL); ++ pthread_cond_init(&b->notempty, NULL); ++ pthread_cond_init(&b->notfull, NULL); ++ b->readpos = 0; ++ b->writepos = 0; ++} ++ ++/* Store an integer in the buffer */ ++ ++void put(struct prodcons * b, int data) ++{ ++ pthread_mutex_lock(&b->lock); ++ /* Wait until buffer is not full */ ++ while ((b->writepos + 1) % BUFFER_SIZE == b->readpos) { ++ pthread_cond_wait(&b->notfull, &b->lock); ++ /* pthread_cond_wait reacquired b->lock before returning */ ++ } ++ /* Write the data and advance write pointer */ ++ b->buffer[b->writepos] = data; ++ b->writepos++; ++ if (b->writepos >= BUFFER_SIZE) b->writepos = 0; ++ /* Signal that the buffer is now not empty */ ++ pthread_cond_signal(&b->notempty); ++ pthread_mutex_unlock(&b->lock); ++} ++ ++/* Read and remove an integer from the buffer */ ++ ++int get(struct prodcons * b) ++{ ++ int data; ++ pthread_mutex_lock(&b->lock); ++ /* Wait until buffer is not empty */ ++ while (b->writepos == b->readpos) { ++ pthread_cond_wait(&b->notempty, &b->lock); ++ } ++ /* Read the data and advance read pointer */ ++ data = b->buffer[b->readpos]; ++ b->readpos++; ++ if (b->readpos >= BUFFER_SIZE) b->readpos = 0; ++ /* Signal that the buffer is now not full */ ++ pthread_cond_signal(&b->notfull); ++ pthread_mutex_unlock(&b->lock); ++ return data; ++} ++ ++/* A test program: one thread inserts integers from 1 to 10000, ++ the other reads them and prints them. */ ++ ++#define OVER (-1) ++ ++struct prodcons buffer; ++ ++void * producer(void * data) ++{ ++ int n; ++ for (n = 0; n < 10000; n++) { ++ printf("%d --->\n", n); ++ put(&buffer, n); ++ } ++ put(&buffer, OVER); ++ return NULL; ++} ++ ++void * consumer(void * data) ++{ ++ int d; ++ while (1) { ++ d = get(&buffer); ++ if (d == OVER) break; ++ printf("---> %d\n", d); ++ } ++ return NULL; ++} ++ ++int main(void) ++{ ++ pthread_t th_a, th_b; ++ void * retval; ++ ++ init(&buffer); ++ /* Create the threads */ ++ pthread_create(&th_a, NULL, producer, 0); ++ pthread_create(&th_b, NULL, consumer, 0); ++ /* Wait until producer and consumer finish. */ ++ pthread_join(th_a, &retval); ++ pthread_join(th_b, &retval); ++ return 0; ++} +diff -Naur ../glibc-2.1.3/linuxthreads/Examples/ex3.c glibc-2.1.3/linuxthreads/Examples/ex3.c +--- ../glibc-2.1.3/linuxthreads/Examples/ex3.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/Examples/ex3.c 1998-12-14 08:09:39.000000000 -0800 +@@ -0,0 +1,152 @@ ++/* Multi-thread searching. ++ Illustrates: thread cancellation, cleanup handlers. */ ++ ++#include <errno.h> ++#include <stdio.h> ++#include <unistd.h> ++#include <stdlib.h> ++#include <sys/types.h> ++#include <pthread.h> ++ ++/* Defines the number of searching threads */ ++#define NUM_THREADS 5 ++ ++/* Function prototypes */ ++void *search(void *); ++void print_it(void *); ++ ++/* Global variables */ ++pthread_t threads[NUM_THREADS]; ++pthread_mutex_t lock; ++int tries; ++volatile int started; ++ ++int main(int argc, char ** argv) ++{ ++ int i; ++ int pid; ++ ++ /* create a number to search for */ ++ pid = getpid(); ++ printf("Searching for the number = %d...\n", pid); ++ ++ /* Initialize the mutex lock */ ++ pthread_mutex_init(&lock, NULL); ++ ++ /* Create the searching threads */ ++ for (started=0; started<NUM_THREADS; started++) ++ pthread_create(&threads[started], NULL, search, (void *)pid); ++ ++ /* Wait for (join) all the searching threads */ ++ for (i=0; i<NUM_THREADS; i++) ++ pthread_join(threads[i], NULL); ++ ++ printf("It took %d tries to find the number.\n", tries); ++ ++ /* Exit the program */ ++ return 0; ++} ++ ++/* This is the cleanup function that is called ++ when the threads are cancelled */ ++ ++void print_it(void *arg) ++{ ++ int *try = (int *) arg; ++ pthread_t tid; ++ ++ /* Get the calling thread's ID */ ++ tid = pthread_self(); ++ ++ /* Print where the thread was in its search when it was cancelled */ ++ printf("Thread %lx was canceled on its %d try.\n", tid, *try); ++} ++ ++/* This is the search routine that is executed in each thread */ ++ ++void *search(void *arg) ++{ ++ int num = (int) arg; ++ int i, j, ntries; ++ pthread_t tid; ++ ++ /* get the calling thread ID */ ++ tid = pthread_self(); ++ ++ /* use the thread ID to set the seed for the random number generator */ ++ /* Since srand and rand are not thread-safe, serialize with lock */ ++ ++ /* Try to lock the mutex lock -- ++ if locked, check to see if the thread has been cancelled ++ if not locked then continue */ ++ while (pthread_mutex_trylock(&lock) == EBUSY) ++ pthread_testcancel(); ++ ++ srand((int)tid); ++ i = rand() & 0xFFFFFF; ++ pthread_mutex_unlock(&lock); ++ ntries = 0; ++ ++ /* Set the cancellation parameters -- ++ - Enable thread cancellation ++ - Defer the action of the cancellation */ ++ ++ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); ++ pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL); ++ ++ while (started < NUM_THREADS) ++ sched_yield (); ++ ++ /* Push the cleanup routine (print_it) onto the thread ++ cleanup stack. This routine will be called when the ++ thread is cancelled. Also note that the pthread_cleanup_push ++ call must have a matching pthread_cleanup_pop call. The ++ push and pop calls MUST be at the same lexical level ++ within the code */ ++ ++ /* Pass address of `ntries' since the current value of `ntries' is not ++ the one we want to use in the cleanup function */ ++ ++ pthread_cleanup_push(print_it, (void *)&ntries); ++ ++ /* Loop forever */ ++ while (1) { ++ i = (i + 1) & 0xFFFFFF; ++ ntries++; ++ ++ /* Does the random number match the target number? */ ++ if (num == i) { ++ /* Try to lock the mutex lock -- ++ if locked, check to see if the thread has been cancelled ++ if not locked then continue */ ++ while (pthread_mutex_trylock(&lock) == EBUSY) ++ pthread_testcancel(); ++ ++ /* Set the global variable for the number of tries */ ++ tries = ntries; ++ printf("Thread %lx found the number!\n", tid); ++ ++ /* Cancel all the other threads */ ++ for (j=0; j<NUM_THREADS; j++) ++ if (threads[j] != tid) pthread_cancel(threads[j]); ++ ++ /* Break out of the while loop */ ++ break; ++ } ++ ++ /* Every 100 tries check to see if the thread has been cancelled. */ ++ if (ntries % 100 == 0) { ++ pthread_testcancel(); ++ } ++ } ++ ++ /* The only way we can get here is when the thread breaks out ++ of the while loop. In this case the thread that makes it here ++ has found the number we are looking for and does not need to run ++ the thread cleanup function. This is why the pthread_cleanup_pop ++ function is called with a 0 argument; this will pop the cleanup ++ function off the stack without executing it */ ++ ++ pthread_cleanup_pop(0); ++ return((void *)0); ++} +diff -Naur ../glibc-2.1.3/linuxthreads/Examples/ex4.c glibc-2.1.3/linuxthreads/Examples/ex4.c +--- ../glibc-2.1.3/linuxthreads/Examples/ex4.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/Examples/ex4.c 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,107 @@ ++/* Making a library function that uses static variables thread-safe. ++ Illustrates: thread-specific data, pthread_once(). */ ++ ++#include <stddef.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <pthread.h> ++ ++/* This is a typical example of a library function that uses ++ static variables to accumulate results between calls. ++ Here, it just returns the concatenation of all string arguments ++ that were given to it. */ ++ ++#if 0 ++ ++char * str_accumulate(char * s) ++{ ++ static char accu[1024] = { 0 }; ++ strcat(accu, s); ++ return accu; ++} ++ ++#endif ++ ++/* Of course, this cannot be used in a multi-threaded program ++ because all threads store "accu" at the same location. ++ So, we'll use thread-specific data to have a different "accu" ++ for each thread. */ ++ ++/* Key identifying the thread-specific data */ ++static pthread_key_t str_key; ++/* "Once" variable ensuring that the key for str_alloc will be allocated ++ exactly once. */ ++static pthread_once_t str_alloc_key_once = PTHREAD_ONCE_INIT; ++ ++/* Forward functions */ ++static void str_alloc_key(void); ++static void str_alloc_destroy_accu(void * accu); ++ ++/* Thread-safe version of str_accumulate */ ++ ++char * str_accumulate(const char * s) ++{ ++ char * accu; ++ ++ /* Make sure the key is allocated */ ++ pthread_once(&str_alloc_key_once, str_alloc_key); ++ /* Get the thread-specific data associated with the key */ ++ accu = (char *) pthread_getspecific(str_key); ++ /* It's initially NULL, meaning that we must allocate the buffer first. */ ++ if (accu == NULL) { ++ accu = malloc(1024); ++ if (accu == NULL) return NULL; ++ accu[0] = 0; ++ /* Store the buffer pointer in the thread-specific data. */ ++ pthread_setspecific(str_key, (void *) accu); ++ printf("Thread %lx: allocating buffer at %p\n", pthread_self(), accu); ++ } ++ /* Now we can use accu just as in the non thread-safe code. */ ++ strcat(accu, s); ++ return accu; ++} ++ ++/* Function to allocate the key for str_alloc thread-specific data. */ ++ ++static void str_alloc_key(void) ++{ ++ pthread_key_create(&str_key, str_alloc_destroy_accu); ++ printf("Thread %lx: allocated key %d\n", pthread_self(), str_key); ++} ++ ++/* Function to free the buffer when the thread exits. */ ++/* Called only when the thread-specific data is not NULL. */ ++ ++static void str_alloc_destroy_accu(void * accu) ++{ ++ printf("Thread %lx: freeing buffer at %p\n", pthread_self(), accu); ++ free(accu); ++} ++ ++/* Test program */ ++ ++void * process(void * arg) ++{ ++ char * res; ++ res = str_accumulate("Result of "); ++ res = str_accumulate((char *) arg); ++ res = str_accumulate(" thread"); ++ printf("Thread %lx: \"%s\"\n", pthread_self(), res); ++ return NULL; ++} ++ ++int main(int argc, char ** argv) ++{ ++ char * res; ++ pthread_t th1, th2; ++ ++ res = str_accumulate("Result of "); ++ pthread_create(&th1, NULL, process, (void *) "first"); ++ pthread_create(&th2, NULL, process, (void *) "second"); ++ res = str_accumulate("initial thread"); ++ printf("Thread %lx: \"%s\"\n", pthread_self(), res); ++ pthread_join(th1, NULL); ++ pthread_join(th2, NULL); ++ exit(0); ++} +diff -Naur ../glibc-2.1.3/linuxthreads/Examples/ex5.c glibc-2.1.3/linuxthreads/Examples/ex5.c +--- ../glibc-2.1.3/linuxthreads/Examples/ex5.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/Examples/ex5.c 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,102 @@ ++/* The classic producer-consumer example, implemented with semaphores. ++ All integers between 0 and 9999 should be printed exactly twice, ++ once to the right of the arrow and once to the left. */ ++ ++#include <stdio.h> ++#include "pthread.h" ++#include "semaphore.h" ++ ++#define BUFFER_SIZE 16 ++ ++/* Circular buffer of integers. */ ++ ++struct prodcons { ++ int buffer[BUFFER_SIZE]; /* the actual data */ ++ int readpos, writepos; /* positions for reading and writing */ ++ sem_t sem_read; /* number of elements available for reading */ ++ sem_t sem_write; /* number of locations available for writing */ ++}; ++ ++/* Initialize a buffer */ ++ ++void init(struct prodcons * b) ++{ ++ sem_init(&b->sem_write, 0, BUFFER_SIZE - 1); ++ sem_init(&b->sem_read, 0, 0); ++ b->readpos = 0; ++ b->writepos = 0; ++} ++ ++/* Store an integer in the buffer */ ++ ++void put(struct prodcons * b, int data) ++{ ++ /* Wait until buffer is not full */ ++ sem_wait(&b->sem_write); ++ /* Write the data and advance write pointer */ ++ b->buffer[b->writepos] = data; ++ b->writepos++; ++ if (b->writepos >= BUFFER_SIZE) b->writepos = 0; ++ /* Signal that the buffer contains one more element for reading */ ++ sem_post(&b->sem_read); ++} ++ ++/* Read and remove an integer from the buffer */ ++ ++int get(struct prodcons * b) ++{ ++ int data; ++ /* Wait until buffer is not empty */ ++ sem_wait(&b->sem_read); ++ /* Read the data and advance read pointer */ ++ data = b->buffer[b->readpos]; ++ b->readpos++; ++ if (b->readpos >= BUFFER_SIZE) b->readpos = 0; ++ /* Signal that the buffer has now one more location for writing */ ++ sem_post(&b->sem_write); ++ return data; ++} ++ ++/* A test program: one thread inserts integers from 1 to 10000, ++ the other reads them and prints them. */ ++ ++#define OVER (-1) ++ ++struct prodcons buffer; ++ ++void * producer(void * data) ++{ ++ int n; ++ for (n = 0; n < 10000; n++) { ++ printf("%d --->\n", n); ++ put(&buffer, n); ++ } ++ put(&buffer, OVER); ++ return NULL; ++} ++ ++void * consumer(void * data) ++{ ++ int d; ++ while (1) { ++ d = get(&buffer); ++ if (d == OVER) break; ++ printf("---> %d\n", d); ++ } ++ return NULL; ++} ++ ++int main(void) ++{ ++ pthread_t th_a, th_b; ++ void * retval; ++ ++ init(&buffer); ++ /* Create the threads */ ++ pthread_create(&th_a, NULL, producer, 0); ++ pthread_create(&th_b, NULL, consumer, 0); ++ /* Wait until producer and consumer finish. */ ++ pthread_join(th_a, &retval); ++ pthread_join(th_b, &retval); ++ return 0; ++} +diff -Naur ../glibc-2.1.3/linuxthreads/Examples/ex6.c glibc-2.1.3/linuxthreads/Examples/ex6.c +--- ../glibc-2.1.3/linuxthreads/Examples/ex6.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/Examples/ex6.c 1998-12-14 14:24:16.000000000 -0800 +@@ -0,0 +1,41 @@ ++#include <errno.h> ++#include <stdio.h> ++#include <string.h> ++#include <pthread.h> ++#include <unistd.h> ++ ++void * ++test_thread (void *v_param) ++{ ++ return NULL; ++} ++ ++int ++main (void) ++{ ++ unsigned long count; ++ ++ setvbuf (stdout, NULL, _IONBF, 0); ++ ++ for (count = 0; count < 2000; ++count) ++ { ++ pthread_t thread; ++ int status; ++ ++ status = pthread_create (&thread, NULL, test_thread, NULL); ++ if (status != 0) ++ { ++ printf ("status = %d, count = %lu: %s\n", status, count, ++ strerror (errno)); ++ return 1; ++ } ++ else ++ { ++ printf ("count = %lu\n", count); ++ } ++ /* pthread_detach (thread); */ ++ pthread_join (thread, NULL); ++ usleep (10); ++ } ++ return 0; ++} +diff -Naur ../glibc-2.1.3/linuxthreads/FAQ.html glibc-2.1.3/linuxthreads/FAQ.html +--- ../glibc-2.1.3/linuxthreads/FAQ.html 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/FAQ.html 2000-02-01 14:11:26.000000000 -0800 +@@ -0,0 +1,1039 @@ ++<HTML> ++<HEAD> ++<TITLE>LinuxThreads Frequently Asked Questions</TITLE> ++</HEAD> ++<BODY> ++<H1 ALIGN=center>LinuxThreads Frequently Asked Questions <BR> ++ (with answers)</H1> ++<H2 ALIGN=center>[For LinuxThreads version 0.8]</H2> ++ ++<HR><P> ++ ++<A HREF="#A">A. The big picture</A><BR> ++<A HREF="#B">B. Getting more information</A><BR> ++<A HREF="#C">C. Issues related to the C library</A><BR> ++<A HREF="#D">D. Problems, weird behaviors, potential bugs</A><BR> ++<A HREF="#E">E. Missing functions, wrong types, etc</A><BR> ++<A HREF="#F">F. C++ issues</A><BR> ++<A HREF="#G">G. Debugging LinuxThreads programs</A><BR> ++<A HREF="#H">H. Compiling multithreaded code; errno madness</A><BR> ++<A HREF="#I">I. X-Windows and other libraries</A><BR> ++<A HREF="#J">J. Signals and threads</A><BR> ++<A HREF="#K">K. Internals of LinuxThreads</A><P> ++ ++<HR> ++<P> ++ ++<H2><A NAME="A">A. The big picture</A></H2> ++ ++<H4><A NAME="A.1">A.1: What is LinuxThreads?</A></H4> ++ ++LinuxThreads is a Linux library for multi-threaded programming. ++It implements the Posix 1003.1c API (Application Programming ++Interface) for threads. It runs on any Linux system with kernel 2.0.0 ++or more recent, and a suitable C library (see section <A HREF="C">C</A>). ++<P> ++ ++<H4><A NAME="A.2">A.2: What are threads?</A></H4> ++ ++A thread is a sequential flow of control through a program. ++Multi-threaded programming is, thus, a form of parallel programming ++where several threads of control are executing concurrently in the ++program. All threads execute in the same memory space, and can ++therefore work concurrently on shared data.<P> ++ ++Multi-threaded programming differs from Unix-style multi-processing in ++that all threads share the same memory space (and a few other system ++resources, such as file descriptors), instead of running in their own ++memory space as is the case with Unix processes.<P> ++ ++Threads are useful for two reasons. First, they allow a program to ++exploit multi-processor machines: the threads can run in parallel on ++several processors, allowing a single program to divide its work ++between several processors, thus running faster than a single-threaded ++program, which runs on only one processor at a time. Second, some ++programs are best expressed as several threads of control that ++communicate together, rather than as one big monolithic sequential ++program. Examples include server programs, overlapping asynchronous ++I/O, and graphical user interfaces.<P> ++ ++<H4><A NAME="A.3">A.3: What is POSIX 1003.1c?</A></H4> ++ ++It's an API for multi-threaded programming standardized by IEEE as ++part of the POSIX standards. Most Unix vendors have endorsed the ++POSIX 1003.1c standard. Implementations of the 1003.1c API are ++already available under Sun Solaris 2.5, Digital Unix 4.0, ++Silicon Graphics IRIX 6, and should soon be available from other ++vendors such as IBM and HP. More generally, the 1003.1c API is ++replacing relatively quickly the proprietary threads library that were ++developed previously under Unix, such as Mach cthreads, Solaris ++threads, and IRIX sprocs. Thus, multithreaded programs using the ++1003.1c API are likely to run unchanged on a wide variety of Unix ++platforms.<P> ++ ++<H4><A NAME="A.4">A.4: What is the status of LinuxThreads?</A></H4> ++ ++LinuxThreads implements almost all of Posix 1003.1c, as well as a few ++extensions. The only part of LinuxThreads that does not conform yet ++to Posix is signal handling (see section <A HREF="#J">J</A>). Apart ++from the signal stuff, all the Posix 1003.1c base functionality, ++as well as a number of optional extensions, are provided and conform ++to the standard (to the best of my knowledge). ++The signal stuff is hard to get right, at least without special kernel ++support, and while I'm definitely looking at ways to implement the ++Posix behavior for signals, this might take a long time before it's ++completed.<P> ++ ++<H4><A NAME="A.5">A.5: How stable is LinuxThreads?</A></H4> ++ ++The basic functionality (thread creation and termination, mutexes, ++conditions, semaphores) is very stable. Several industrial-strength ++programs, such as the AOL multithreaded Web server, use LinuxThreads ++and seem quite happy about it. There used to be some rough edges in ++the LinuxThreads / C library interface with libc 5, but glibc 2 ++fixes all of those problems and is now the standard C library on major ++Linux distributions (see section <A HREF="#C">C</A>). <P> ++ ++<HR> ++<P> ++ ++<H2><A NAME="B">B. Getting more information</A></H2> ++ ++<H4><A NAME="B.1">B.1: What are good books and other sources of ++information on POSIX threads?</A></H4> ++ ++The FAQ for comp.programming.threads lists several books: ++<A HREF="http://www.serpentine.com/~bos/threads-faq/">http://www.serpentine.com/~bos/threads-faq/</A>.<P> ++ ++There are also some online tutorials. Follow the links from the ++LinuxThreads web page: ++<A HREF="http://pauillac.inria.fr/~xleroy/linuxthreads">http://pauillac.inria.fr/~xleroy/linuxthreads</A>.<P> ++ ++<H4><A NAME="B.2">B.2: I'd like to be informed of future developments on ++LinuxThreads. Is there a mailing list for this purpose?</A></H4> ++ ++I post LinuxThreads-related announcements on the newsgroup ++<A HREF="news:comp.os.linux.announce">comp.os.linux.announce</A>, ++and also on the mailing list ++<code>linux-threads@magenet.com</code>. ++You can subscribe to the latter by writing ++<A HREF="mailto:majordomo@magenet.com">majordomo@magenet.com</A>.<P> ++ ++<H4><A NAME="B.3">B.3: What are good places for discussing ++LinuxThreads?</A></H4> ++ ++For questions about programming with POSIX threads in general, use ++the newsgroup ++<A HREF="news:comp.programming.threads">comp.programming.threads</A>. ++Be sure you read the ++<A HREF="http://www.serpentine.com/~bos/threads-faq/">FAQ</A> ++for this group before you post.<P> ++ ++For Linux-specific questions, use ++<A ++HREF="news:comp.os.linux.development.apps">comp.os.linux.development.apps</A> ++and <A ++HREF="news:comp.os.linux.development.kernel">comp.os.linux.development.kernel</A>. ++The latter is especially appropriate for questions relative to the ++interface between the kernel and LinuxThreads.<P> ++ ++<H4><A NAME="B.4">B.4: How should I report a possible bug in ++LinuxThreads?</A></H4> ++ ++If you're using glibc 2, the best way by far is to use the ++<code>glibcbug</code> script to mail a bug report to the glibc ++maintainers. <P> ++ ++If you're using an older libc, or don't have the <code>glibcbug</code> ++script on your machine, then e-mail me directly ++(<code>Xavier.Leroy@inria.fr</code>). <P> ++ ++In both cases, before sending the bug report, make sure that it is not ++addressed already in this FAQ. Also, try to send a short program that ++reproduces the weird behavior you observed. <P> ++ ++<H4><A NAME="B.5">B.5: I'd like to read the POSIX 1003.1c standard. Is ++it available online?</A></H4> ++ ++Unfortunately, no. POSIX standards are copyrighted by IEEE, and ++IEEE does not distribute them freely. You can buy paper copies from ++IEEE, but the price is fairly high ($120 or so). If you disagree with ++this policy and you're an IEEE member, be sure to let them know.<P> ++ ++On the other hand, you probably don't want to read the standard. It's ++very hard to read, written in standard-ese, and targeted to ++implementors who already know threads inside-out. A good book on ++POSIX threads provides the same information in a much more readable form. ++I can personally recommend Dave Butenhof's book, <CITE>Programming ++with POSIX threads</CITE> (Addison-Wesley). Butenhof was part of the ++POSIX committee and also designed the Digital Unix implementations of ++POSIX threads, and it shows.<P> ++ ++Another good source of information is the X/Open Group Single Unix ++specification which is available both ++<A HREF="http://www.rdg.opengroup.org/onlinepubs/7908799/index.html">on-line</A> ++and as a ++<A HREF="http://www.UNIX-systems.org/gosolo2/">book and CD/ROM</A>. ++That specification includes pretty much all the POSIX standards, ++including 1003.1c, with some extensions and clarifications.<P> ++ ++<HR> ++<P> ++ ++<H2><A NAME="C">C. Issues related to the C library</A></H2> ++ ++<H4><A NAME="C.1">C.1: Which version of the C library should I use ++with LinuxThreads?</A></H4> ++ ++The best choice by far is glibc 2, a.k.a. libc 6. It offers very good ++support for multi-threading, and LinuxThreads has been closely ++integrated with glibc 2. The glibc 2 distribution contains the ++sources of a specially adapted version of LinuxThreads.<P> ++ ++glibc 2 comes preinstalled as the default C library on several Linux ++distributions, such as RedHat 5 and up, and Debian 2. ++Those distributions include the version of LinuxThreads matching ++glibc 2.<P> ++ ++<H4><A NAME="C.2">C.2: My system has libc 5 preinstalled, not glibc ++2. Can I still use LinuxThreads?</H4> ++ ++Yes, but you're likely to run into some problems, as libc 5 only ++offers minimal support for threads and contains some bugs that affect ++multithreaded programs. <P> ++ ++The versions of libc 5 that work best with LinuxThreads are ++libc 5.2.18 on the one hand, and libc 5.4.12 or later on the other hand. ++Avoid 5.3.12 and 5.4.7: these have problems with the per-thread errno ++variable. <P> ++ ++<H4><A NAME="C.3">C.3: So, should I switch to glibc 2, or stay with a ++recent libc 5?</A></H4> ++ ++I'd recommend you switch to glibc 2. Even for single-threaded ++programs, glibc 2 is more solid and more standard-conformant than libc ++5. And the shortcomings of libc 5 almost preclude any serious ++multi-threaded programming.<P> ++ ++Switching an already installed ++system from libc 5 to glibc 2 is not completely straightforward. ++See the <A HREF="http://sunsite.unc.edu/LDP/HOWTO/Glibc2-HOWTO.html">Glibc2 ++HOWTO</A> for more information. Much easier is (re-)installing a ++Linux distribution based on glibc 2, such as RedHat 6.<P> ++ ++<H4><A NAME="C.4">C.4: Where can I find glibc 2 and the version of ++LinuxThreads that goes with it?</A></H4> ++ ++On <code>prep.ai.mit.edu</code> and its many, many mirrors around the world. ++See <A ++HREF="http://www.gnu.org/order/ftp.html">http://www.gnu.org/order/ftp.html</A> ++for a list of mirrors.<P> ++ ++<H4><A NAME="C.5">C.5: Where can I find libc 5 and the version of ++LinuxThreads that goes with it?</A></H4> ++ ++For libc 5, see <A HREF="ftp://sunsite.unc.edu/pub/Linux/devel/GCC/"><code>ftp://sunsite.unc.edu/pub/Linux/devel/GCC/</code></A>.<P> ++ ++For the libc 5 version of LinuxThreads, see ++<A HREF="ftp://ftp.inria.fr/INRIA/Projects/cristal/Xavier.Leroy/linuxthreads/">ftp://ftp.inria.fr/INRIA/Projects/cristal/Xavier.Leroy/linuxthreads/</A>.<P> ++ ++<H4><A NAME="C.6">C.6: How can I recompile the glibc 2 version of the ++LinuxThreads sources?</A></H4> ++ ++You must transfer the whole glibc sources, then drop the LinuxThreads ++sources in the <code>linuxthreads/</code> subdirectory, then recompile ++glibc as a whole. There are now too many inter-dependencies between ++LinuxThreads and glibc 2 to allow separate re-compilation of LinuxThreads. ++<P> ++ ++<H4><A NAME="C.7">C.7: What is the correspondence between LinuxThreads ++version numbers, libc version numbers, and RedHat version ++numbers?</A></H4> ++ ++Here is a summary. (Information on Linux distributions other than ++RedHat are welcome.)<P> ++ ++<TABLE> ++<TR><TD>LinuxThreads </TD> <TD>C library</TD> <TD>RedHat</TD></TR> ++<TR><TD>0.7, 0.71 (for libc 5)</TD> <TD>libc 5.x</TD> <TD>RH 4.2</TD></TR> ++<TR><TD>0.7, 0.71 (for glibc 2)</TD> <TD>glibc 2.0.x</TD> <TD>RH 5.x</TD></TR> ++<TR><TD>0.8</TD> <TD>glibc 2.1.1</TD> <TD>RH 6.0</TD></TR> ++<TR><TD>0.8</TD> <TD>glibc 2.1.2</TD> <TD>not yet released</TD></TR> ++</TABLE> ++<P> ++ ++<HR> ++<P> ++ ++<H2><A NAME="D">D. Problems, weird behaviors, potential bugs</A></H2> ++ ++<H4><A NAME="D.1">D.1: When I compile LinuxThreads, I run into problems in ++file <code>libc_r/dirent.c</code></A></H4> ++ ++You probably mean: ++<PRE> ++ libc_r/dirent.c:94: structure has no member named `dd_lock' ++</PRE> ++I haven't actually seen this problem, but several users reported it. ++My understanding is that something is wrong in the include files of ++your Linux installation (<code>/usr/include/*</code>). Make sure ++you're using a supported version of the libc 5 library. (See question <A ++HREF="#C.2">C.2</A>).<P> ++ ++<H4><A NAME="D.2">D.2: When I compile LinuxThreads, I run into problems with ++<CODE>/usr/include/sched.h</CODE>: there are several occurrences of ++<CODE>_p</CODE> that the C compiler does not understand</A></H4> ++ ++Yes, <CODE>/usr/include/sched.h</CODE> that comes with libc 5.3.12 is broken. ++Replace it with the <code>sched.h</code> file contained in the ++LinuxThreads distribution. But really you should not be using libc ++5.3.12 with LinuxThreads! (See question <A HREF="#C.2">C.1</A>.)<P> ++ ++<H4><A NAME="D.3">D.3: My program does <CODE>fdopen()</CODE> on a file ++descriptor opened on a pipe. When I link it with LinuxThreads, ++<CODE>fdopen()</CODE> always returns NULL!</A></H4> ++ ++You're using one of the buggy versions of libc (5.3.12, 5.4.7., etc). ++See question <A HREF="#C.1">C.1</A> above.<P> ++ ++<H4><A NAME="D.4">D.4: My program creates a lot of threads, and after ++a while <CODE>pthread_create()</CODE> no longer returns!</A></H4> ++ ++This is known bug in the version of LinuxThreads that comes with glibc ++2.1.1. An upgrade to 2.1.2 is recommended. <P> ++ ++<H4><A NAME="D.5">D.5: When I'm running a program that creates N ++threads, <code>top</code> or <code>ps</code> ++display N+2 processes that are running my program. What do all these ++processes correspond to?</A></H4> ++ ++Due to the general "one process per thread" model, there's one process ++for the initial thread and N processes for the threads it created ++using <CODE>pthread_create</CODE>. That leaves one process ++unaccounted for. That extra process corresponds to the "thread ++manager" thread, a thread created internally by LinuxThreads to handle ++thread creation and thread termination. This extra thread is asleep ++most of the time. ++ ++<H4><A NAME="D.6">D.6: Scheduling seems to be very unfair when there ++is strong contention on a mutex: instead of giving the mutex to each ++thread in turn, it seems that it's almost always the same thread that ++gets the mutex. Isn't this completely broken behavior?</A></H4> ++ ++That behavior has mostly disappeared in recent releases of ++LinuxThreads (version 0.8 and up). It was fairly common in older ++releases, though. ++ ++What happens in LinuxThreads 0.7 and before is the following: when a ++thread unlocks a mutex, all other threads that were waiting on the ++mutex are sent a signal which makes them runnable. However, the ++kernel scheduler may or may not restart them immediately. If the ++thread that unlocked the mutex tries to lock it again immediately ++afterwards, it is likely that it will succeed, because the threads ++haven't yet restarted. This results in an apparently very unfair ++behavior, when the same thread repeatedly locks and unlocks the mutex, ++while other threads can't lock the mutex.<P> ++ ++In LinuxThreads 0.8 and up, <code>pthread_unlock</code> restarts only ++one waiting thread, and pre-assign the mutex to that thread. Hence, ++if the thread that unlocked the mutex tries to lock it again ++immediately, it will block until other waiting threads have had a ++chance to lock and unlock the mutex. This results in much fairer ++scheduling.<P> ++ ++Notice however that even the old "unfair" behavior is perfectly ++acceptable with respect to the POSIX standard: for the default ++scheduling policy, POSIX makes no guarantees of fairness, such as "the ++thread waiting for the mutex for the longest time always acquires it ++first". Properly written multithreaded code avoids that kind of heavy ++contention on mutexes, and does not run into fairness problems. If ++you need scheduling guarantees, you should consider using the ++real-time scheduling policies <code>SCHED_RR</code> and ++<code>SCHED_FIFO</code>, which have precisely defined scheduling ++behaviors. <P> ++ ++<H4><A NAME="D.7">D.7: I have a simple test program with two threads ++that do nothing but <CODE>printf()</CODE> in tight loops, and from the ++printout it seems that only one thread is running, the other doesn't ++print anything!</A></H4> ++ ++Again, this behavior is characteristic of old releases of LinuxThreads ++(0.7 and before); more recent versions (0.8 and up) should not exhibit ++this behavior.<P> ++ ++The reason for this behavior is explained in ++question <A HREF="#D.6">D.6</A> above: <CODE>printf()</CODE> performs ++locking on <CODE>stdout</CODE>, and thus your two threads contend very ++heavily for the mutex associated with <CODE>stdout</CODE>. But if you ++do some real work between two calls to <CODE>printf()</CODE>, you'll ++see that scheduling becomes much smoother.<P> ++ ++<H4><A NAME="D.8">D.8: I've looked at <code><pthread.h></code> ++and there seems to be a gross error in the <code>pthread_cleanup_push</code> ++macro: it opens a block with <code>{</code> but does not close it! ++Surely you forgot a <code>}</code> at the end of the macro, right? ++</A></H4> ++ ++Nope. That's the way it should be. The closing brace is provided by ++the <code>pthread_cleanup_pop</code> macro. The POSIX standard ++requires <code>pthread_cleanup_push</code> and ++<code>pthread_cleanup_pop</code> to be used in matching pairs, at the ++same level of brace nesting. This allows ++<code>pthread_cleanup_push</code> to open a block in order to ++stack-allocate some data structure, and ++<code>pthread_cleanup_pop</code> to close that block. It's ugly, but ++it's the standard way of implementing cleanup handlers.<P> ++ ++<H4><A NAME="D.9">D.9: I tried to use real-time threads and my program ++loops like crazy and freezes the whole machine!</A></H4> ++ ++Versions of LinuxThreads prior to 0.8 are susceptible to ``livelocks'' ++(one thread loops, consuming 100% of the CPU time) in conjunction with ++real-time scheduling. Since real-time threads and processes have ++higher priority than normal Linux processes, all other processes on ++the machine, including the shell, the X server, etc, cannot run and ++the machine appears frozen.<P> ++ ++The problem is fixed in LinuxThreads 0.8.<P> ++ ++<H4><A NAME="D.10">D.10: My application needs to create thousands of ++threads, or maybe even more. Can I do this with ++LinuxThreads?</A></H4> ++ ++No. You're going to run into several hard limits: ++<UL> ++<LI>Each thread, from the kernel's standpoint, is one process. Stock ++Linux kernels are limited to at most 512 processes for the super-user, ++and half this number for regular users. This can be changed by ++changing <code>NR_TASKS</code> in <code>include/linux/tasks.h</code> ++and recompiling the kernel. On the x86 processors at least, ++architectural constraints seem to limit <code>NR_TASKS</code> to 4090 ++at most. ++<LI>LinuxThreads contains a table of all active threads. This table ++has room for 1024 threads at most. To increase this limit, you must ++change <code>PTHREAD_THREADS_MAX</code> in the LinuxThreads sources ++and recompile. ++<LI>By default, each thread reserves 2M of virtual memory space for ++its stack. This space is just reserved; actual memory is allocated ++for the stack on demand. But still, on a 32-bit processor, the total ++virtual memory space available for the stacks is on the order of 1G, ++meaning that more than 500 threads will have a hard time fitting in. ++You can overcome this limitation by moving to a 64-bit platform, or by ++allocating smaller stacks yourself using the <code>setstackaddr</code> ++attribute. ++<LI>Finally, the Linux kernel contains many algorithms that run in ++time proportional to the number of process table entries. Increasing ++this number drastically will slow down the kernel operations ++noticeably. ++</UL> ++(Other POSIX threads libraries have similar limitations, by the way.) ++For all those reasons, you'd better restructure your application so ++that it doesn't need more than, say, 100 threads. For instance, ++in the case of a multithreaded server, instead of creating a new ++thread for each connection, maintain a fixed-size pool of worker ++threads that pick incoming connection requests from a queue.<P> ++ ++<HR> ++<P> ++ ++<H2><A NAME="E">E. Missing functions, wrong types, etc</A></H2> ++ ++<H4><A NAME="E.1">E.1: Where is <CODE>pthread_yield()</CODE> ? How ++comes LinuxThreads does not implement it?</A></H4> ++ ++Because it's not part of the (final) POSIX 1003.1c standard. ++Several drafts of the standard contained <CODE>pthread_yield()</CODE>, ++but then the POSIX guys discovered it was redundant with ++<CODE>sched_yield()</CODE> and dropped it. So, just use ++<CODE>sched_yield()</CODE> instead. ++ ++<H4><A NAME="E.2">E.2: I've found some type errors in ++<code><pthread.h></code>. ++For instance, the second argument to <CODE>pthread_create()</CODE> ++should be a <CODE>pthread_attr_t</CODE>, not a ++<CODE>pthread_attr_t *</CODE>. Also, didn't you forget to declare ++<CODE>pthread_attr_default</CODE>?</A></H4> ++ ++No, I didn't. What you're describing is draft 4 of the POSIX ++standard, which is used in OSF DCE threads. LinuxThreads conforms to the ++final standard. Even though the functions have the same names as in ++draft 4 and DCE, their calling conventions are slightly different. In ++particular, attributes are passed by reference, not by value, and ++default attributes are denoted by the NULL pointer. Since draft 4/DCE ++will eventually disappear, you'd better port your program to use the ++standard interface.<P> ++ ++<H4><A NAME="E.3">E.3: I'm porting an application from Solaris and I ++have to rename all thread functions from <code>thr_blah</code> to ++<CODE>pthread_blah</CODE>. This is very annoying. Why did you change ++all the function names?</A></H4> ++ ++POSIX did it. The <code>thr_*</code> functions correspond to Solaris ++threads, an older thread interface that you'll find only under ++Solaris. The <CODE>pthread_*</CODE> functions correspond to POSIX ++threads, an international standard available for many, many platforms. ++Even Solaris 2.5 and later support the POSIX threads interface. So, ++do yourself a favor and rewrite your code to use POSIX threads: this ++way, it will run unchanged under Linux, Solaris, and quite a lot of ++other platforms.<P> ++ ++<H4><A NAME="E.4">E.4: How can I suspend and resume a thread from ++another thread? Solaris has the <CODE>thr_suspend()</CODE> and ++<CODE>thr_resume()</CODE> functions to do that; why don't you?</A></H4> ++ ++The POSIX standard provides <B>no</B> mechanism by which a thread A can ++suspend the execution of another thread B, without cooperation from B. ++The only way to implement a suspend/restart mechanism is to have B ++check periodically some global variable for a suspend request ++and then suspend itself on a condition variable, which another thread ++can signal later to restart B.<P> ++ ++Notice that <CODE>thr_suspend()</CODE> is inherently dangerous and ++prone to race conditions. For one thing, there is no control on where ++the target thread stops: it can very well be stopped in the middle of ++a critical section, while holding mutexes. Also, there is no ++guarantee on when the target thread will actually stop. For these ++reasons, you'd be much better off using mutexes and conditions ++instead. The only situations that really require the ability to ++suspend a thread are debuggers and some kind of garbage collectors.<P> ++ ++If you really must suspend a thread in LinuxThreads, you can send it a ++<CODE>SIGSTOP</CODE> signal with <CODE>pthread_kill</CODE>. Send ++<CODE>SIGCONT</CODE> for restarting it. ++Beware, this is specific to LinuxThreads and entirely non-portable. ++Indeed, a truly conforming POSIX threads implementation will stop all ++threads when one thread receives the <CODE>SIGSTOP</CODE> signal! ++One day, LinuxThreads will implement that behavior, and the ++non-portable hack with <CODE>SIGSTOP</CODE> won't work anymore.<P> ++ ++<H4><A NAME="E.5">E.5: Does LinuxThreads implement ++<CODE>pthread_attr_setstacksize()</CODE> and ++<CODE>pthread_attr_setstackaddr()</CODE>?</A></H4> ++ ++These optional functions are provided in recent versions of ++LinuxThreads (0.8 and up). Earlier releases did not provide these ++optional components of the POSIX standard.<P> ++ ++Even if <CODE>pthread_attr_setstacksize()</CODE> and ++<CODE>pthread_attr_setstackaddr()</CODE> are now provided, we still ++recommend that you do not use them unless you really have strong ++reasons for doing so. The default stack allocation strategy for ++LinuxThreads is nearly optimal: stacks start small (4k) and ++automatically grow on demand to a fairly large limit (2M). ++Moreover, there is no portable way to estimate the stack requirements ++of a thread, so setting the stack size yourself makes your program ++less reliable and non-portable.<P> ++ ++<H4><A NAME="E.6">E.6: LinuxThreads does not support the ++<CODE>PTHREAD_SCOPE_PROCESS</CODE> value of the "contentionscope" ++attribute. Why? </A></H4> ++ ++With a "one-to-one" model, as in LinuxThreads (one kernel execution ++context per thread), there is only one scheduler for all processes and ++all threads on the system. So, there is no way to obtain the behavior of ++<CODE>PTHREAD_SCOPE_PROCESS</CODE>. ++ ++<H4><A NAME="E.7">E.7: LinuxThreads does not implement process-shared ++mutexes, conditions, and semaphores. Why?</A></H4> ++ ++This is another optional component of the POSIX standard. Portable ++applications should test <CODE>_POSIX_THREAD_PROCESS_SHARED</CODE> ++before using this facility. ++<P> ++The goal of this extension is to allow different processes (with ++different address spaces) to synchronize through mutexes, conditions ++or semaphores allocated in shared memory (either SVR4 shared memory ++segments or <CODE>mmap()</CODE>ed files). ++<P> ++The reason why this does not work in LinuxThreads is that mutexes, ++conditions, and semaphores are not self-contained: their waiting ++queues contain pointers to linked lists of thread descriptors, and ++these pointers are meaningful only in one address space. ++<P> ++Matt Messier and I spent a significant amount of time trying to design a ++suitable mechanism for sharing waiting queues between processes. We ++came up with several solutions that combined two of the following ++three desirable features, but none that combines all three: ++<UL> ++<LI>allow sharing between processes having different UIDs ++<LI>supports cancellation ++<LI>supports <CODE>pthread_cond_timedwait</CODE> ++</UL> ++We concluded that kernel support is required to share mutexes, ++conditions and semaphores between processes. That's one place where ++Linus Torvalds's intuition that "all we need in the kernel is ++<CODE>clone()</CODE>" fails. ++<P> ++Until suitable kernel support is available, you'd better use ++traditional interprocess communications to synchronize different ++processes: System V semaphores and message queues, or pipes, or sockets. ++<P> ++ ++<HR> ++<P> ++ ++<H2><A NAME="F">F. C++ issues</A></H2> ++ ++<H4><A NAME="F.1">F.1: Are there C++ wrappers for LinuxThreads?</A></H4> ++ ++Douglas Schmidt's ACE library contains, among a lot of other ++things, C++ wrappers for LinuxThreads and quite a number of other ++thread libraries. Check out ++<A HREF="http://www.cs.wustl.edu/~schmidt/ACE.html">http://www.cs.wustl.edu/~schmidt/ACE.html</A><P> ++ ++<H4><A NAME="F.2">F.2: I'm trying to use LinuxThreads from a C++ ++program, and the compiler complains about the third argument to ++<CODE>pthread_create()</CODE> !</A></H4> ++ ++You're probably trying to pass a class member function or some ++other C++ thing as third argument to <CODE>pthread_create()</CODE>. ++Recall that <CODE>pthread_create()</CODE> is a C function, and it must ++be passed a C function as third argument.<P> ++ ++<H4><A NAME="F.3">F.3: I'm trying to use LinuxThreads in conjunction ++with libg++, and I'm having all sorts of trouble.</A></H4> ++ ++>From what I understand, thread support in libg++ is completely broken, ++especially with respect to locking of iostreams. H.J.Lu wrote: ++<BLOCKQUOTE> ++If you want to use thread, I can only suggest egcs and glibc. You ++can find egcs at ++<A HREF="http://www.cygnus.com/egcs">http://www.cygnus.com/egcs</A>. ++egcs has libsdtc++, which is MT safe under glibc 2. If you really ++want to use the libg++, I have a libg++ add-on for egcs. ++</BLOCKQUOTE> ++<HR> ++<P> ++ ++<H2><A NAME="G">G. Debugging LinuxThreads programs</A></H2> ++ ++<H4><A NAME="G.1">G.1: Can I debug LinuxThreads program using gdb?</A></H4> ++ ++Yes, but not with the stock gdb 4.17. You need a specially patched ++version of gdb 4.17 developed by Eric Paire and colleages at The Open ++Group, Grenoble. The patches against gdb 4.17 are available at ++<A HREF="http://www.gr.opengroup.org/java/jdk/linux/debug.htm"><code>http://www.gr.opengroup.org/java/jdk/linux/debug.htm</code></A>. ++Precompiled binaries of the patched gdb are available in RedHat's RPM ++format at <A ++HREF="http://odin.appliedtheory.com/"><code>http://odin.appliedtheory.com/</code></A>.<P> ++ ++Some Linux distributions provide an already-patched version of gdb; ++others don't. For instance, the gdb in RedHat 5.2 is thread-aware, ++but apparently not the one in RedHat 6.0. Just ask (politely) the ++makers of your Linux distributions to please make sure that they apply ++the correct patches to gdb.<P> ++ ++<H4><A NAME="G.2">G.2: Does it work with post-mortem debugging?</A></H4> ++ ++Not very well. Generally, the core file does not correspond to the ++thread that crashed. The reason is that the kernel will not dump core ++for a process that shares its memory with other processes, such as the ++other threads of your program. So, the thread that crashes silently ++disappears without generating a core file. Then, all other threads of ++your program die on the same signal that killed the crashing thread. ++(This is required behavior according to the POSIX standard.) The last ++one that dies is no longer sharing its memory with anyone else, so the ++kernel generates a core file for that thread. Unfortunately, that's ++not the thread you are interested in. ++ ++<H4><A NAME="G.3">G.3: Any other ways to debug multithreaded programs, then?</A></H4> ++ ++Assertions and <CODE>printf()</CODE> are your best friends. Try to debug ++sequential parts in a single-threaded program first. Then, put ++<CODE>printf()</CODE> statements all over the place to get execution traces. ++Also, check invariants often with the <CODE>assert()</CODE> macro. In truth, ++there is no other effective way (save for a full formal proof of your ++program) to track down concurrency bugs. Debuggers are not really ++effective for subtle concurrency problems, because they disrupt ++program execution too much.<P> ++ ++<HR> ++<P> ++ ++<H2><A NAME="H">H. Compiling multithreaded code; errno madness</A></H2> ++ ++<H4><A NAME="H.1">H.1: You say all multithreaded code must be compiled ++with <CODE>_REENTRANT</CODE> defined. What difference does it make?</A></H4> ++ ++It affects include files in three ways: ++<UL> ++<LI> The include files define prototypes for the reentrant variants of ++some of the standard library functions, ++e.g. <CODE>gethostbyname_r()</CODE> as a reentrant equivalent to ++<CODE>gethostbyname()</CODE>.<P> ++ ++<LI> If <CODE>_REENTRANT</CODE> is defined, some ++<code><stdio.h></code> functions are no longer defined as macros, ++e.g. <CODE>getc()</CODE> and <CODE>putc()</CODE>. In a multithreaded ++program, stdio functions require additional locking, which the macros ++don't perform, so we must call functions instead.<P> ++ ++<LI> More importantly, <code><errno.h></code> redefines errno when ++<CODE>_REENTRANT</CODE> is ++defined, so that errno refers to the thread-specific errno location ++rather than the global errno variable. This is achieved by the ++following <code>#define</code> in <code><errno.h></code>: ++<PRE> ++ #define errno (*(__errno_location())) ++</PRE> ++which causes each reference to errno to call the ++<CODE>__errno_location()</CODE> function for obtaining the location ++where error codes are stored. libc provides a default definition of ++<CODE>__errno_location()</CODE> that always returns ++<code>&errno</code> (the address of the global errno variable). Thus, ++for programs not linked with LinuxThreads, defining ++<CODE>_REENTRANT</CODE> makes no difference w.r.t. errno processing. ++But LinuxThreads redefines <CODE>__errno_location()</CODE> to return a ++location in the thread descriptor reserved for holding the current ++value of errno for the calling thread. Thus, each thread operates on ++a different errno location. ++</UL> ++<P> ++ ++<H4><A NAME="H.2">H.2: Why is it so important that each thread has its ++own errno variable? </A></H4> ++ ++If all threads were to store error codes in the same, global errno ++variable, then the value of errno after a system call or library ++function returns would be unpredictable: between the time a system ++call stores its error code in the global errno and your code inspects ++errno to see which error occurred, another thread might have stored ++another error code in the same errno location. <P> ++ ++<H4><A NAME="H.3">H.3: What happens if I link LinuxThreads with code ++not compiled with <CODE>-D_REENTRANT</CODE>?</A></H4> ++ ++Lots of trouble. If the code uses <CODE>getc()</CODE> or ++<CODE>putc()</CODE>, it will perform I/O without proper interlocking ++of the stdio buffers; this can cause lost output, duplicate output, or ++just crash other stdio functions. If the code consults errno, it will ++get back the wrong error code. The following code fragment is a ++typical example: ++<PRE> ++ do { ++ r = read(fd, buf, n); ++ if (r == -1) { ++ if (errno == EINTR) /* an error we can handle */ ++ continue; ++ else { /* other errors are fatal */ ++ perror("read failed"); ++ exit(100); ++ } ++ } ++ } while (...); ++</PRE> ++Assume this code is not compiled with <CODE>-D_REENTRANT</CODE>, and ++linked with LinuxThreads. At run-time, <CODE>read()</CODE> is ++interrupted. Since the C library was compiled with ++<CODE>-D_REENTRANT</CODE>, <CODE>read()</CODE> stores its error code ++in the location pointed to by <CODE>__errno_location()</CODE>, which ++is the thread-local errno variable. Then, the code above sees that ++<CODE>read()</CODE> returns -1 and looks up errno. Since ++<CODE>_REENTRANT</CODE> is not defined, the reference to errno ++accesses the global errno variable, which is most likely 0. Hence the ++code concludes that it cannot handle the error and stops.<P> ++ ++<H4><A NAME="H.4">H.4: With LinuxThreads, I can no longer use the signals ++<code>SIGUSR1</code> and <code>SIGUSR2</code> in my programs! Why? </A></H4> ++ ++The short answer is: because the Linux kernel you're using does not ++support realtime signals. <P> ++ ++LinuxThreads needs two signals for its internal operation. ++One is used to suspend and restart threads blocked on mutex, condition ++or semaphore operations. The other is used for thread ++cancellation.<P> ++ ++On ``old'' kernels (2.0 and early 2.1 kernels), there are only 32 ++signals available and the kernel reserves all of them but two: ++<code>SIGUSR1</code> and <code>SIGUSR2</code>. So, LinuxThreads has ++no choice but use those two signals.<P> ++ ++On recent kernels (2.2 and up), more than 32 signals are provided in ++the form of realtime signals. When run on one of those kernels, ++LinuxThreads uses two reserved realtime signals for its internal ++operation, thus leaving <code>SIGUSR1</code> and <code>SIGUSR2</code> ++free for user code. (This works only with glibc, not with libc 5.) <P> ++ ++<H4><A NAME="H.5">H.5: Is the stack of one thread visible from the ++other threads? Can I pass a pointer into my stack to other threads? ++</A></H4> ++ ++Yes, you can -- if you're very careful. The stacks are indeed visible ++from all threads in the system. Some non-POSIX thread libraries seem ++to map the stacks for all threads at the same virtual addresses and ++change the memory mapping when they switch from one thread to ++another. But this is not the case for LinuxThreads, as it would make ++context switching between threads more expensive, and at any rate ++might not conform to the POSIX standard.<P> ++ ++So, you can take the address of an "auto" variable and pass it to ++other threads via shared data structures. However, you need to make ++absolutely sure that the function doing this will not return as long ++as other threads need to access this address. It's the usual mistake ++of returning the address of an "auto" variable, only made much worse ++because of concurrency. It's much, much safer to systematically ++heap-allocate all shared data structures. <P> ++ ++<HR> ++<P> ++ ++<H2><A NAME="I">I. X-Windows and other libraries</A></H2> ++ ++<H4><A NAME="I.1">I.1: My program uses both Xlib and LinuxThreads. ++It stops very early with an "Xlib: unknown 0 error" message. What ++does this mean? </A></H4> ++ ++That's a prime example of the errno problem described in question <A ++HREF="#H.2">H.2</A>. The binaries for Xlib you're using have not been ++compiled with <CODE>-D_REENTRANT</CODE>. It happens Xlib contains a ++piece of code very much like the one in question <A ++HREF="#H.2">H.2</A>. So, your Xlib fetches the error code from the ++wrong errno location and concludes that an error it cannot handle ++occurred.<P> ++ ++<H4><A NAME="I.2">I.2: So, what can I do to build a multithreaded X ++Windows client? </A></H4> ++ ++The best solution is to use X libraries that have been compiled with ++multithreading options set. Linux distributions that come with glibc ++2 as the main C library generally provide thread-safe X libraries. ++At least, that seems to be the case for RedHat 5 and later.<P> ++ ++You can try to recompile yourself the X libraries with multithreading ++options set. They contain optional support for multithreading; it's ++just that the binaries provided by your Linux distribution were built ++without this support. See the file <code>README.Xfree3.3</code> in ++the LinuxThreads distribution for patches and info on how to compile ++thread-safe X libraries from the Xfree3.3 distribution. The Xfree3.3 ++sources are readily available in most Linux distributions, e.g. as a ++source RPM for RedHat. Be warned, however, that X Windows is a huge ++system, and recompiling even just the libraries takes a lot of time ++and disk space.<P> ++ ++Another, less involving solution is to call X functions only from the ++main thread of your program. Even if all threads have their own errno ++location, the main thread uses the global errno variable for its errno ++location. Thus, code not compiled with <code>-D_REENTRANT</code> ++still "sees" the right error values if it executes in the main thread ++only. <P> ++ ++<H4><A NAME="I.2">This is a lot of work. Don't you have precompiled ++thread-safe X libraries that you could distribute?</A></H4> ++ ++No, I don't. Sorry. But consider installing a Linux distribution ++that comes with thread-safe X libraries, such as RedHat 6.<P> ++ ++<H4><A NAME="I.3">I.3: Can I use library FOO in a multithreaded ++program?</A></H4> ++ ++Most libraries cannot be used "as is" in a multithreaded program. ++For one thing, they are not necessarily thread-safe: calling ++simultaneously two functions of the library from two threads might not ++work, due to internal use of global variables and the like. Second, ++the libraries must have been compiled with <CODE>-D_REENTRANT</CODE> to avoid ++the errno problems explained in question <A HREF="#H.2">H.2</A>. ++<P> ++ ++<H4><A NAME="I.4">I.4: What if I make sure that only one thread calls ++functions in these libraries?</A></H4> ++ ++This avoids problems with the library not being thread-safe. But ++you're still vulnerable to errno problems. At the very least, a ++recompile of the library with <CODE>-D_REENTRANT</CODE> is needed. ++<P> ++ ++<H4><A NAME="I.5">I.5: What if I make sure that only the main thread ++calls functions in these libraries?</A></H4> ++ ++That might actually work. As explained in question <A HREF="#I.1">I.1</A>, ++the main thread uses the global errno variable, and can therefore ++execute code not compiled with <CODE>-D_REENTRANT</CODE>.<P> ++ ++<H4><A NAME="I.6">I.6: SVGAlib doesn't work with LinuxThreads. Why? ++</A></H4> ++ ++Because both LinuxThreads and SVGAlib use the signals ++<code>SIGUSR1</code> and <code>SIGUSR2</code>. See question <A ++HREF="#H.4">H.4</A>. ++<P> ++ ++ ++<HR> ++<P> ++ ++<H2><A NAME="J">J. Signals and threads</A></H2> ++ ++<H4><A NAME="J.1">J.1: When it comes to signals, what is shared ++between threads and what isn't?</A></H4> ++ ++Signal handlers are shared between all threads: when a thread calls ++<CODE>sigaction()</CODE>, it sets how the signal is handled not only ++for itself, but for all other threads in the program as well.<P> ++ ++On the other hand, signal masks are per-thread: each thread chooses ++which signals it blocks independently of others. At thread creation ++time, the newly created thread inherits the signal mask of the thread ++calling <CODE>pthread_create()</CODE>. But afterwards, the new thread ++can modify its signal mask independently of its creator thread.<P> ++ ++<H4><A NAME="J.2">J.2: When I send a <CODE>SIGKILL</CODE> to a ++particular thread using <CODE>pthread_kill</CODE>, all my threads are ++killed!</A></H4> ++ ++That's how it should be. The POSIX standard mandates that all threads ++should terminate when the process (i.e. the collection of all threads ++running the program) receives a signal whose effect is to ++terminate the process (such as <CODE>SIGKILL</CODE> or <CODE>SIGINT</CODE> ++when no handler is installed on that signal). This behavior makes a ++lot of sense: when you type "ctrl-C" at the keyboard, or when a thread ++crashes on a division by zero or a segmentation fault, you really want ++all threads to stop immediately, not just the one that caused the ++segmentation violation or that got the <CODE>SIGINT</CODE> signal. ++(This assumes default behavior for those signals; see question ++<A HREF="#J.3">J.3</A> if you install handlers for those signals.)<P> ++ ++If you're trying to terminate a thread without bringing the whole ++process down, use <code>pthread_cancel()</code>.<P> ++ ++<H4><A NAME="J.3">J.3: I've installed a handler on a signal. Which ++thread executes the handler when the signal is received?</A></H4> ++ ++If the signal is generated by a thread during its execution (e.g. a ++thread executes a division by zero and thus generates a ++<CODE>SIGFPE</CODE> signal), then the handler is executed by that ++thread. This also applies to signals generated by ++<CODE>raise()</CODE>.<P> ++ ++If the signal is sent to a particular thread using ++<CODE>pthread_kill()</CODE>, then that thread executes the handler.<P> ++ ++If the signal is sent via <CODE>kill()</CODE> or the tty interface ++(e.g. by pressing ctrl-C), then the POSIX specs say that the handler ++is executed by any thread in the process that does not currently block ++the signal. In other terms, POSIX considers that the signal is sent ++to the process (the collection of all threads) as a whole, and any ++thread that is not blocking this signal can then handle it.<P> ++ ++The latter case is where LinuxThreads departs from the POSIX specs. ++In LinuxThreads, there is no real notion of ``the process as a whole'': ++in the kernel, each thread is really a distinct process with a ++distinct PID, and signals sent to the PID of a thread can only be ++handled by that thread. As long as no thread is blocking the signal, ++the behavior conforms to the standard: one (unspecified) thread of the ++program handles the signal. But if the thread to which PID the signal ++is sent blocks the signal, and some other thread does not block the ++signal, then LinuxThreads will simply queue in ++that thread and execute the handler only when that thread unblocks ++the signal, instead of executing the handler immediately in the other ++thread that does not block the signal.<P> ++ ++This is to be viewed as a LinuxThreads bug, but I currently don't see ++any way to implement the POSIX behavior without kernel support.<P> ++ ++<H4><A NAME="J.3">J.3: How shall I go about mixing signals and threads ++in my program? </A></H4> ++ ++The less you mix them, the better. Notice that all ++<CODE>pthread_*</CODE> functions are not async-signal safe, meaning ++that you should not call them from signal handlers. This ++recommendation is not to be taken lightly: your program can deadlock ++if you call a <CODE>pthread_*</CODE> function from a signal handler! ++<P> ++ ++The only sensible things you can do from a signal handler is set a ++global flag, or call <CODE>sem_post</CODE> on a semaphore, to record ++the delivery of the signal. The remainder of the program can then ++either poll the global flag, or use <CODE>sem_wait()</CODE> and ++<CODE>sem_trywait()</CODE> on the semaphore.<P> ++ ++Another option is to do nothing in the signal handler, and dedicate ++one thread (preferably the initial thread) to wait synchronously for ++signals, using <CODE>sigwait()</CODE>, and send messages to the other ++threads accordingly. ++ ++<H4><A NAME="J.4">J.4: When one thread is blocked in ++<CODE>sigwait()</CODE>, other threads no longer receive the signals ++<CODE>sigwait()</CODE> is waiting for! What happens? </A></H4> ++ ++It's an unfortunate consequence of how LinuxThreads implements ++<CODE>sigwait()</CODE>. Basically, it installs signal handlers on all ++signals waited for, in order to record which signal was received. ++Since signal handlers are shared with the other threads, this ++temporarily deactivates any signal handlers you might have previously ++installed on these signals.<P> ++ ++Though surprising, this behavior actually seems to conform to the ++POSIX standard. According to POSIX, <CODE>sigwait()</CODE> is ++guaranteed to work as expected only if all other threads in the ++program block the signals waited for (otherwise, the signals could be ++delivered to other threads than the one doing <CODE>sigwait()</CODE>, ++which would make <CODE>sigwait()</CODE> useless). In this particular ++case, the problem described in this question does not appear.<P> ++ ++One day, <CODE>sigwait()</CODE> will be implemented in the kernel, ++along with others POSIX 1003.1b extensions, and <CODE>sigwait()</CODE> ++will have a more natural behavior (as well as better performances).<P> ++ ++<HR> ++<P> ++ ++<H2><A NAME="K">K. Internals of LinuxThreads</A></H2> ++ ++<H4><A NAME="K.1">K.1: What is the implementation model for ++LinuxThreads?</A></H4> ++ ++LinuxThreads follows the so-called "one-to-one" model: each thread is ++actually a separate process in the kernel. The kernel scheduler takes ++care of scheduling the threads, just like it schedules regular ++processes. The threads are created with the Linux ++<code>clone()</code> system call, which is a generalization of ++<code>fork()</code> allowing the new process to share the memory ++space, file descriptors, and signal handlers of the parent.<P> ++ ++Advantages of the "one-to-one" model include: ++<UL> ++<LI> minimal overhead on CPU-intensive multiprocessing (with ++about one thread per processor); ++<LI> minimal overhead on I/O operations; ++<LI> a simple and robust implementation (the kernel scheduler does ++most of the hard work for us). ++</UL> ++The main disadvantage is more expensive context switches on mutex and ++condition operations, which must go through the kernel. This is ++mitigated by the fact that context switches in the Linux kernel are ++pretty efficient.<P> ++ ++<H4><A NAME="K.2">K.2: Have you considered other implementation ++models?</A></H4> ++ ++There are basically two other models. The "many-to-one" model ++relies on a user-level scheduler that context-switches between the ++threads entirely in user code; viewed from the kernel, there is only ++one process running. This model is completely out of the question for ++me, since it does not take advantage of multiprocessors, and require ++unholy magic to handle blocking I/O operations properly. There are ++several user-level thread libraries available for Linux, but I found ++all of them deficient in functionality, performance, and/or robustness. ++<P> ++ ++The "many-to-many" model combines both kernel-level and user-level ++scheduling: several kernel-level threads run concurrently, each ++executing a user-level scheduler that selects between user threads. ++Most commercial Unix systems (Solaris, Digital Unix, IRIX) implement ++POSIX threads this way. This model combines the advantages of both ++the "many-to-one" and the "one-to-one" model, and is attractive ++because it avoids the worst-case behaviors of both models -- ++especially on kernels where context switches are expensive, such as ++Digital Unix. Unfortunately, it is pretty complex to implement, and ++requires kernel support which Linux does not provide. Linus Torvalds ++and other Linux kernel developers have always been pushing the ++"one-to-one" model in the name of overall simplicity, and are doing a ++pretty good job of making kernel-level context switches between ++threads efficient. LinuxThreads is just following the general ++direction they set.<P> ++ ++<HR> ++<ADDRESS>Xavier.Leroy@inria.fr</ADDRESS> ++</BODY> ++</HTML> +diff -Naur ../glibc-2.1.3/linuxthreads/LICENSE glibc-2.1.3/linuxthreads/LICENSE +--- ../glibc-2.1.3/linuxthreads/LICENSE 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/LICENSE 1998-08-28 03:07:17.000000000 -0700 +@@ -0,0 +1,501 @@ ++GNU LIBRARY GENERAL PUBLIC LICENSE ++********************************** ++ ++ Version 2, June 1991 ++ ++ Copyright (C) 1991 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 library GPL. It is ++ numbered 2 because it goes with version 2 of the ordinary GPL.] ++ ++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 Library General Public License, applies to some ++specially designated Free Software Foundation software, and to any ++other libraries whose authors decide to use it. You can use it for ++your libraries, too. ++ ++ When we speak of free software, we are referring to freedom, 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 or use pieces of it in ++new free programs; and that you know you can do these things. ++ ++ To protect your rights, we need to make restrictions that forbid ++anyone to deny you these rights or to ask you to surrender the 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 a program 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. ++ ++ Our method of protecting your rights has two steps: (1) copyright ++the library, and (2) offer you this license which gives you legal ++permission to copy, distribute and/or modify the library. ++ ++ Also, for each distributor's protection, we want to make certain ++that everyone understands that there is no warranty for this free ++library. If the library is modified by someone else and passed on, we ++want its recipients to know that what they have is not the original ++version, so that any problems introduced by others will not reflect on ++the original authors' reputations. ++ ++ Finally, any free program is threatened constantly by software ++patents. We wish to avoid the danger that companies distributing free ++software will individually obtain patent licenses, thus in effect ++transforming the program into proprietary software. To prevent this, ++we have made it clear that any patent must be licensed for everyone's ++free use or not licensed at all. ++ ++ Most GNU software, including some libraries, is covered by the ++ordinary GNU General Public License, which was designed for utility ++programs. This license, the GNU Library General Public License, ++applies to certain designated libraries. This license is quite ++different from the ordinary one; be sure to read it in full, and don't ++assume that anything in it is the same as in the ordinary license. ++ ++ The reason we have a separate public license for some libraries is ++that they blur the distinction we usually make between modifying or ++adding to a program and simply using it. Linking a program with a ++library, without changing the library, is in some sense simply using ++the library, and is analogous to running a utility program or ++application program. However, in a textual and legal sense, the linked ++executable is a combined work, a derivative of the original library, ++and the ordinary General Public License treats it as such. ++ ++ Because of this blurred distinction, using the ordinary General ++Public License for libraries did not effectively promote software ++sharing, because most developers did not use the libraries. We ++concluded that weaker conditions might promote sharing better. ++ ++ However, unrestricted linking of non-free programs would deprive the ++users of those programs of all benefit from the free status of the ++libraries themselves. This Library General Public License is intended ++to permit developers of non-free programs to use free libraries, while ++preserving your freedom as a user of such programs to change the free ++libraries that are incorporated in them. (We have not seen how to ++achieve this as regards changes in header files, but we have achieved ++it as regards changes in the actual functions of the Library.) The ++hope is that this will lead to faster development of free libraries. ++ ++ 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, while the latter only ++works together with the library. ++ ++ Note that it is possible for a library to be covered by the ordinary ++General Public License rather than by this special one. ++ ++ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION ++ ++ 0. This License Agreement applies to any software library which ++ contains a notice placed by the copyright holder or other ++ authorized party saying it may be distributed under the terms of ++ this Library 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 compile 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. 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. ++ ++ c. 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. ++ ++ d. 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 source code 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 to 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 Library 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 Library General Public License as published ++ by the Free Software Foundation; either version 2 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 ++ Library General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License along ++ with this program; 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 -Naur ../glibc-2.1.3/linuxthreads/Makefile glibc-2.1.3/linuxthreads/Makefile +--- ../glibc-2.1.3/linuxthreads/Makefile 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/Makefile 1999-12-07 08:50:23.000000000 -0800 +@@ -0,0 +1,68 @@ ++# Copyright (C) 1996, 1997, 1998, 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 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. ++ ++# ++# Sub-makefile for linuxthreads portion of the library. ++# ++subdir := linuxthreads ++ ++linuxthreads-version := $(shell sed -n 's/^.*$(subdir)-\([0-9.]*\).*$$/\1/p' \ ++ Banner) ++ ++headers := pthread.h semaphore.h ++distribute := internals.h queue.h restart.h spinlock.h ++ ++routines := weaks no-tsd ++ ++extra-libs := libpthread ++extra-libs-others := $(extra-libs) ++ ++libpthread-routines := attr cancel condvar join manager mutex ptfork \ ++ ptlongjmp pthread signals specific errno lockfile \ ++ semaphore spinlock wrapsyscall rwlock pt-machine \ ++ oldsemaphore events ++ ++vpath %.c Examples ++tests = ex1 ex2 ex3 ex4 ex5 ex6 ++ ++include ../Rules ++ ++CFLAGS-mutex.c += -D__NO_WEAK_PTHREAD_ALIASES ++CFLAGS-specific.c += -D__NO_WEAK_PTHREAD_ALIASES ++CFLAGS-pthread.c += -D__NO_WEAK_PTHREAD_ALIASES ++CFLAGS-ptfork.c += -D__NO_WEAK_PTHREAD_ALIASES ++CFLAGS-cancel.c += -D__NO_WEAK_PTHREAD_ALIASES ++ ++# Depend on libc.so so a DT_NEEDED is generated in the shared objects. ++# This ensures they will load libc.so for needed symbols if loaded by ++# a statically-linked program that hasn't already loaded it. ++$(objpfx)libpthread.so: $(common-objpfx)libc.so ++ ++# Make sure we link with the thread library. ++ifeq ($(build-shared),yes) ++libpthread = $(objpfx)libpthread.so ++else ++libpthread = $(objpfx)libpthread.a ++endif ++ ++$(objpfx)ex1: $(libpthread) ++$(objpfx)ex2: $(libpthread) ++$(objpfx)ex3: $(libpthread) ++$(objpfx)ex4: $(libpthread) ++$(objpfx)ex5: $(libpthread) ++$(objpfx)ex6: $(libpthread) +diff -Naur ../glibc-2.1.3/linuxthreads/README glibc-2.1.3/linuxthreads/README +--- ../glibc-2.1.3/linuxthreads/README 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/README 1998-08-28 03:07:17.000000000 -0700 +@@ -0,0 +1,166 @@ ++ Linuxthreads - POSIX 1003.1c kernel threads for Linux ++ ++ Copyright 1996, 1997 Xavier Leroy (Xavier.Leroy@inria.fr) ++ ++ ++DESCRIPTION: ++ ++This is release 0.7 (late beta) of LinuxThreads, a BiCapitalized ++implementation of the Posix 1003.1c "pthread" interface for Linux. ++ ++LinuxThreads provides kernel-level threads: each thread is a separate ++Unix process, sharing its address space with the other threads through ++the new system call clone(). Scheduling between threads is handled by ++the kernel scheduler, just like scheduling between Unix processes. ++ ++ ++REQUIREMENTS: ++ ++- Linux version 2.0 and up (requires the new clone() system call ++ and the new realtime scheduler). ++ ++- For Intel platforms: libc 5.2.18 or later is required. ++ 5.2.18 or 5.4.12 or later are recommended; ++ 5.3.12 and 5.4.7 have problems (see the FAQ.html file for more info). ++ ++- Also supports glibc 2 (a.k.a. libc 6), which actually comes with ++ a specially-adapted version of this library. ++ ++- Currently supports Intel, Alpha, Sparc, Motorola 68k, ARM and MIPS ++ platforms. ++ ++- Multiprocessors are supported. ++ ++ ++INSTALLATION: ++ ++- Edit the Makefile, set the variables in the "Configuration" section. ++ ++- Do "make". ++ ++- Do "make install". ++ ++ ++USING LINUXTHREADS: ++ ++ gcc -D_REENTRANT ... -lpthread ++ ++A complete set of manual pages is included. Also see the subdirectory ++Examples/ for some sample programs. ++ ++ ++STATUS: ++ ++- All functions in the Posix 1003.1c base interface implemented. ++ Also supports priority scheduling. ++ ++- For users of libc 5 (H.J.Lu's libc), a number of C library functions ++ are reimplemented or wrapped to make them thread-safe, including: ++ * malloc functions ++ * stdio functions (define _REENTRANT before including <stdio.h>) ++ * per-thread errno variable (define _REENTRANT before including <errno.h>) ++ * directory reading functions (opendir(), etc) ++ * sleep() ++ * gmtime(), localtime() ++ ++ New library functions provided: ++ * flockfile(), funlockfile(), ftrylockfile() ++ * reentrant versions of network database functions (gethostbyname_r(), etc) ++ and password functions (getpwnam_r(), etc). ++ ++- libc 6 (glibc 2) provides much better thread support than libc 5, ++ and comes with a specially-adapted version of LinuxThreads. ++ For serious multithreaded programming, you should consider switching ++ to glibc 2. It is available from ftp.gnu.org:/pub/gnu and its mirrors. ++ ++ ++WARNING: ++ ++Many existing libraries are not compatible with LinuxThreads, ++either because they are not inherently thread-safe, or because they ++have not been compiled with the -D_REENTRANT. For more info, see the ++FAQ.html file in this directory. ++ ++A prime example of the latter is Xlib. If you link it with ++LinuxThreads, you'll probably get an "unknown 0 error" very ++early. This is just a consequence of the Xlib binaries using the ++global variable "errno" to fetch error codes, while LinuxThreads and ++the C library use the per-thread "errno" location. ++ ++See the file README.Xfree3.3 for info on how to compile the Xfree 3.3 ++libraries to make them compatible with LinuxThreads. ++ ++ ++KNOWN BUGS AND LIMITATIONS: ++ ++- Threads share pretty much everything they should share according ++ to the standard: memory space, file descriptors, signal handlers, ++ current working directory, etc. One thing that they do not share ++ is their pid's and parent pid's. According to the standard, they ++ should have the same, but that's one thing we cannot achieve ++ in this implementation (until the CLONE_PID flag to clone() becomes ++ usable). ++ ++- The current implementation uses the two signals SIGUSR1 and SIGUSR2, ++ so user-level code cannot employ them. Ideally, there should be two ++ signals reserved for this library. One signal is used for restarting ++ threads blocked on mutexes or conditions; the other is for thread ++ cancellation. ++ ++ *** This is not anymore true when the application runs on a kernel ++ newer than approximately 2.1.60. ++ ++- The stacks for the threads are allocated high in the memory space, ++ below the stack of the initial process, and spaced 2M apart. ++ Stacks are allocated with the "grow on demand" flag, so they don't ++ use much virtual space initially (4k, currently), but can grow ++ up to 2M if needed. ++ ++ Reserving such a large address space for each thread means that, ++ on a 32-bit architecture, no more than about 1000 threads can ++ coexist (assuming a 2Gb address space for user processes), ++ but this is reasonable, since each thread uses up one entry in the ++ kernel's process table, which is usually limited to 512 processes. ++ ++ Another potential problem of the "grow on demand" scheme is that ++ nothing prevents the user from mmap'ing something in the 2M address ++ window reserved for a thread stack, possibly causing later extensions of ++ that stack to fail. Mapping at fixed addresses should be avoided ++ when using this library. ++ ++- Signal handling does not fully conform to the Posix standard, ++ due to the fact that threads are here distinct processes that can be ++ sent signals individually, so there's no notion of sending a signal ++ to "the" process (the collection of all threads). ++ More precisely, here is a summary of the standard requirements ++ and how they are met by the implementation: ++ ++ 1- Synchronous signals (generated by the thread execution, e.g. SIGFPE) ++ are delivered to the thread that raised them. ++ (OK.) ++ ++ 2- A fatal asynchronous signal terminates all threads in the process. ++ (OK. The thread manager notices when a thread dies on a signal ++ and kills all other threads with the same signal.) ++ ++ 3- An asynchronous signal will be delivered to one of the threads ++ of the program which does not block the signal (it is unspecified ++ which). ++ (No, the signal is delivered to the thread it's been sent to, ++ based on the pid of the thread. If that thread is currently ++ blocking the signal, the signal remains pending.) ++ ++ 4- The signal will be delivered to at most one thread. ++ (OK, except for signals generated from the terminal or sent to ++ the process group, which will be delivered to all threads.) ++ ++- The current implementation of the MIPS support assumes a MIPS ISA II ++ processor or better. These processors support atomic operations by ++ ll/sc instructions. Older R2000/R3000 series processors are not ++ supported yet; support for these will have higher overhead. ++ ++- The current implementation of the ARM support assumes that the SWP ++ (atomic swap register with memory) instruction is available. This is ++ the case for all processors except for the ARM1 and ARM2. On StrongARM, ++ the SWP instruction does not bypass the cache, so multi-processor support ++ will be more troublesome. +diff -Naur ../glibc-2.1.3/linuxthreads/README.Xfree3.2 glibc-2.1.3/linuxthreads/README.Xfree3.2 +--- ../glibc-2.1.3/linuxthreads/README.Xfree3.2 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/README.Xfree3.2 1998-08-28 03:07:17.000000000 -0700 +@@ -0,0 +1,352 @@ ++This file describes how to make a threaded X11R6. ++ ++You need the source-code of XFree-3.2. I used the sources of X11R6.1 ++(files: xc-1.tar.gz xc-2.tar.gz xc-3.tar.gz) and the patches to ++XFree-3.2 (files: README.X11.patch R6.1pl1-3.2.diff.gz cfont32.tgz). ++ ++Untar the xc-?.tar.gz files in a directory called XF3.2 and apply ++the XFree-3.2 patches as described in README.X11.patch or use the ++whole XFree86 source. ++ ++Now apply the thread patch with ++ ++patch -p0 < XF3.2.xc.diff ++ ++Go to the XF3.2/xc directory and make the whole thing: ++nice make World >& world.log & ++tail -f world.log ++ ++Wait a few hours or interrupt the process after the shared libs ++are made. The shared libs are: ++ ++XF3.2/xc/lib/ICE/libICE.so.6.0* ++XF3.2/xc/lib/PEX5/libPEX5.so.6.0* ++XF3.2/xc/lib/SM/libSM.so.6.0* ++XF3.2/xc/lib/X11/libX11.so.6.1* ++XF3.2/xc/lib/XIE/libXIE.so.6.0* ++XF3.2/xc/lib/XThrStub/libXThrStub.so.6.0* ++XF3.2/xc/lib/Xaw/libXaw.so.6.1* ++XF3.2/xc/lib/Xext/libXext.so.6.1* ++XF3.2/xc/lib/Xi/libXi.so.6.0* ++XF3.2/xc/lib/Xmu/libXmu.so.6.0* ++XF3.2/xc/lib/Xt/libXt.so.6.0* ++XF3.2/xc/lib/Xtst/libXtst.so.6.1* ++ ++(The Program dga didn't compile, but I have not check out why.) ++ ++Now you can copy the resulting libs ++ ++cp XF3.2/xc/lib/*/*.so.?.? /usr/X11R6/lib/ ++ ++and create some links ++ ++cd /usr/X11R6/lib/ ++ln -s libXThrStub.so.6.0 libXThrStub.so.6 ++ln -s libXThrStub.so.6 libXThrStub.so ++ ++or use make install (not tested, and needs new configuration). ++ ++It is possible with the libXThrSub to compile X11 programs without linking ++libpthread to them and not necessary to recompile already installed ++unthreaded X11 programs, because libXThrSub keeps the dynamic linker quit. ++On the other hand you can link libpthread to a X11 program to use threads. ++ ++I used linux 2.0.23 and libc 5.4.7 . ++ ++Hans-Helmut B�hmann hans@expmech.ing.tu-bs.de ++ ++---------------------------------------------------------------------------- ++ ++XF3.2.xc.diff: ++----------------------------------------------------------------------------- ++diff -u --recursive XF3.2.orig/xc/config/cf/linux.cf XF3.2/xc/config/cf/linux.cf ++--- XF3.2.orig/xc/config/cf/linux.cf Sun Nov 10 17:05:30 1996 +++++ XF3.2/xc/config/cf/linux.cf Sun Nov 10 16:30:55 1996 ++@@ -61,6 +61,14 @@ ++ #define HasSnprintf YES ++ #endif ++ +++#define HasPosixThreads YES +++#define ThreadedX YES +++#define BuildThreadStubLibrary YES +++#define NeedUIThrStubs YES +++#define HasThreadSafeAPI NO +++#define SystemMTDefines -D_REENTRANT +++#define ThreadsLibraries -lpthread +++ ++ #define AvoidNullMakeCommand YES ++ #define StripInstalledPrograms YES ++ #define CompressAllFonts YES ++@@ -158,7 +166,7 @@ ++ #define LdPostLib /* Never needed */ ++ ++ #ifdef i386Architecture ++-#define OptimizedCDebugFlags DefaultGcc2i386Opt -m486 +++#define OptimizedCDebugFlags DefaultGcc2i386Opt -m486 -pipe ++ #define StandardDefines -Dlinux -D__i386__ -D_POSIX_SOURCE \ ++ -D_BSD_SOURCE -D_SVID_SOURCE -DX_LOCALE ++ #define XawI18nDefines -DUSE_XWCHAR_STRING -DUSE_XMBTOWC ++diff -u --recursive XF3.2.orig/xc/config/cf/lnxLib.tmpl XF3.2/xc/config/cf/lnxLib.tmpl ++--- XF3.2.orig/xc/config/cf/lnxLib.tmpl Sun Nov 10 17:05:30 1996 +++++ XF3.2/xc/config/cf/lnxLib.tmpl Sat Nov 9 14:52:39 1996 ++@@ -19,7 +19,7 @@ ++ ++ #define CplusplusLibC ++ ++-#define SharedX11Reqs +++#define SharedX11Reqs -L$(BUILDLIBDIR) -lXThrStub ++ #define SharedOldXReqs $(LDPRELIB) $(XLIBONLY) ++ #define SharedXtReqs $(LDPRELIB) $(XLIBONLY) $(SMLIB) $(ICELIB) ++ #define SharedXawReqs $(LDPRELIB) $(XMULIB) $(XTOOLLIB) $(XLIB) ++diff -u --recursive XF3.2.orig/xc/include/Xthreads.h XF3.2/xc/include/Xthreads.h ++--- XF3.2.orig/xc/include/Xthreads.h Thu Dec 7 02:19:09 1995 +++++ XF3.2/xc/include/Xthreads.h Sat Nov 9 01:04:55 1996 ++@@ -229,12 +229,12 @@ ++ #define xcondition_wait(c,m) pthread_cond_wait(c,m) ++ #define xcondition_signal(c) pthread_cond_signal(c) ++ #define xcondition_broadcast(c) pthread_cond_broadcast(c) ++-#ifdef _DECTHREADS_ +++#if defined(_DECTHREADS_) || defined(linux) ++ static xthread_t _X_no_thread_id; ++ #define xthread_have_id(id) !pthread_equal(id, _X_no_thread_id) ++ #define xthread_clear_id(id) id = _X_no_thread_id ++ #define xthread_equal(id1,id2) pthread_equal(id1, id2) ++-#endif /* _DECTHREADS_ */ +++#endif /* _DECTHREADS_ || linux */ ++ #if _CMA_VENDOR_ == _CMA__IBM ++ #ifdef DEBUG /* too much of a hack to enable normally */ ++ /* see also cma__obj_set_name() */ ++diff -u --recursive XF3.2.orig/xc/lib/X11/util/makekeys.c XF3.2/xc/lib/X11/util/makekeys.c ++--- XF3.2.orig/xc/lib/X11/util/makekeys.c Mon Apr 18 02:22:22 1994 +++++ XF3.2/xc/lib/X11/util/makekeys.c Sat Nov 9 00:44:14 1996 ++@@ -73,7 +73,7 @@ ++ register char c; ++ int first; ++ int best_max_rehash; ++- int best_z; +++ int best_z = 0; ++ int num_found; ++ KeySym val; ++ ++diff -u --recursive XF3.2.orig/xc/lib/XThrStub/Imakefile XF3.2/xc/lib/XThrStub/Imakefile ++--- XF3.2.orig/xc/lib/XThrStub/Imakefile Sun Nov 10 17:08:12 1996 +++++ XF3.2/xc/lib/XThrStub/Imakefile Sat Nov 9 19:04:51 1996 ++@@ -25,7 +25,7 @@ ++ DEFINES = $(ALLOC_DEFINES) ++ INCLUDES = ++ SRCS = $(STUBSRCS) ++- OBJS = $(STUBOBJS +++ OBJS = $(STUBOBJS) ++ LINTLIBS = $(LINTXLIB) ++ ++ #include <Library.tmpl> ++diff -u --recursive XF3.2.orig/xc/lib/XThrStub/UIThrStubs.c XF3.2/xc/lib/XThrStub/UIThrStubs.c ++--- XF3.2.orig/xc/lib/XThrStub/UIThrStubs.c Sun Nov 10 17:08:12 1996 +++++ XF3.2/xc/lib/XThrStub/UIThrStubs.c Sun Nov 10 15:14:55 1996 ++@@ -37,16 +37,43 @@ ++ * specificies the thread library on the link line. ++ */ ++ +++#if defined(linux) +++#include <pthread.h> +++#else ++ #include <thread.h> ++ #include <synch.h> +++#endif ++ +++#if defined(linux) +++static pthread_t no_thread_id; +++#endif /* defined(linux) */ +++ +++#if defined(linux) +++#pragma weak pthread_self = _Xthr_self_stub_ +++pthread_t +++_Xthr_self_stub_() +++{ +++ return(no_thread_id); +++} +++#else /* defined(linux) */ ++ #pragma weak thr_self = _Xthr_self_stub_ ++ thread_t ++ _Xthr_self_stub_() ++ { ++ return((thread_t)0); ++ } +++#endif /* defined(linux) */ ++ +++#if defined(linux) +++#pragma weak pthread_mutex_init = _Xmutex_init_stub_ +++int +++_Xmutex_init_stub_(m, a) +++ pthread_mutex_t *m; +++ __const pthread_mutexattr_t *a; +++{ +++ return(0); +++} +++#else /* defined(linux) */ ++ #pragma weak mutex_init = _Xmutex_init_stub_ ++ int ++ _Xmutex_init_stub_(m, t, a) ++@@ -56,7 +83,17 @@ ++ { ++ return(0); ++ } +++#endif /* defined(linux) */ ++ +++#if defined(linux) +++#pragma weak pthread_mutex_destroy = _Xmutex_destroy_stub_ +++int +++_Xmutex_destroy_stub_(m) +++ pthread_mutex_t *m; +++{ +++ return(0); +++} +++#else /* defined(linux) */ ++ #pragma weak mutex_destroy = _Xmutex_destroy_stub_ ++ int ++ _Xmutex_destroy_stub_(m) ++@@ -64,7 +101,17 @@ ++ { ++ return(0); ++ } +++#endif /* defined(linux) */ ++ +++#if defined(linux) +++#pragma weak pthread_mutex_lock = _Xmutex_lock_stub_ +++int +++_Xmutex_lock_stub_(m) +++ pthread_mutex_t *m; +++{ +++ return(0); +++} +++#else /* defined(linux) */ ++ #pragma weak mutex_lock = _Xmutex_lock_stub_ ++ int ++ _Xmutex_lock_stub_(m) ++@@ -72,7 +119,17 @@ ++ { ++ return(0); ++ } +++#endif /* defined(linux) */ ++ +++#if defined(linux) +++#pragma weak pthread_mutex_unlock = _Xmutex_unlock_stub_ +++int +++_Xmutex_unlock_stub_(m) +++ pthread_mutex_t *m; +++{ +++ return(0); +++} +++#else /* defined(linux) */ ++ #pragma weak mutex_unlock = _Xmutex_unlock_stub_ ++ int ++ _Xmutex_unlock_stub_(m) ++@@ -80,7 +137,18 @@ ++ { ++ return(0); ++ } +++#endif /* defined(linux) */ ++ +++#if defined(linux) +++#pragma weak pthread_cond_init = _Xcond_init_stub_ +++int +++_Xcond_init_stub_(c, a) +++ pthread_cond_t *c; +++ __const pthread_condattr_t *a; +++{ +++ return(0); +++} +++#else /* defined(linux) */ ++ #pragma weak cond_init = _Xcond_init_stub_ ++ int ++ _Xcond_init_stub_(c, t, a) ++@@ -90,7 +158,17 @@ ++ { ++ return(0); ++ } +++#endif /* defined(linux) */ ++ +++#if defined(linux) +++#pragma weak pthread_cond_destroy = _Xcond_destroy_stub_ +++int +++_Xcond_destroy_stub_(c) +++ pthread_cond_t *c; +++{ +++ return(0); +++} +++#else /* defined(linux) */ ++ #pragma weak cond_destroy = _Xcond_destroy_stub_ ++ int ++ _Xcond_destroy_stub_(c) ++@@ -98,7 +176,18 @@ ++ { ++ return(0); ++ } +++#endif /* defined(linux) */ ++ +++#if defined(linux) +++#pragma weak pthread_cond_wait = _Xcond_wait_stub_ +++int +++_Xcond_wait_stub_(c,m) +++ pthread_cond_t *c; +++ pthread_mutex_t *m; +++{ +++ return(0); +++} +++#else /* defined(linux) */ ++ #pragma weak cond_wait = _Xcond_wait_stub_ ++ int ++ _Xcond_wait_stub_(c,m) ++@@ -107,7 +196,17 @@ ++ { ++ return(0); ++ } +++#endif /* defined(linux) */ ++ +++#if defined(linux) +++#pragma weak pthread_cond_signal = _Xcond_signal_stub_ +++int +++_Xcond_signal_stub_(c) +++ pthread_cond_t *c; +++{ +++ return(0); +++} +++#else /* defined(linux) */ ++ #pragma weak cond_signal = _Xcond_signal_stub_ ++ int ++ _Xcond_signal_stub_(c) ++@@ -115,7 +214,17 @@ ++ { ++ return(0); ++ } +++#endif /* defined(linux) */ ++ +++#if defined(linux) +++#pragma weak pthread_cond_broadcast = _Xcond_broadcast_stub_ +++int +++_Xcond_broadcast_stub_(c) +++ pthread_cond_t *c; +++{ +++ return(0); +++} +++#else /* defined(linux) */ ++ #pragma weak cond_broadcast = _Xcond_broadcast_stub_ ++ int ++ _Xcond_broadcast_stub_(c) ++@@ -123,3 +232,15 @@ ++ { ++ return(0); ++ } +++#endif /* defined(linux) */ +++ +++#if defined(linux) +++#pragma weak pthread_equal = _Xthr_equal_stub_ +++int +++_Xthr_equal_stub_(t1, t2) +++ pthread_t t1; +++ pthread_t t2; +++{ +++ return(1); +++} +++#endif /* defined(linux) */ ++------------------------------------------------------------------------- +diff -Naur ../glibc-2.1.3/linuxthreads/Versions glibc-2.1.3/linuxthreads/Versions +--- ../glibc-2.1.3/linuxthreads/Versions 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/Versions 1999-09-07 01:05:19.000000000 -0700 +@@ -0,0 +1,121 @@ ++libc { ++ GLIBC_2.0 { ++ pthread_attr_destroy; pthread_attr_getdetachstate; ++ pthread_attr_getinheritsched; pthread_attr_getschedparam; ++ pthread_attr_getschedpolicy; pthread_attr_getscope; pthread_attr_init; ++ pthread_attr_setdetachstate; pthread_attr_setinheritsched; ++ pthread_attr_setschedparam; pthread_attr_setschedpolicy; ++ pthread_attr_setscope; pthread_cond_broadcast; pthread_cond_destroy; ++ pthread_cond_init; pthread_cond_signal; pthread_cond_wait; ++ pthread_condattr_destroy; pthread_condattr_init; pthread_equal; ++ pthread_exit; pthread_getschedparam; pthread_mutex_destroy; ++ pthread_mutex_init; pthread_mutex_lock; pthread_mutex_unlock; ++ pthread_mutexattr_getkind_np; pthread_mutexattr_setkind_np; ++ pthread_self; pthread_setcancelstate; pthread_setcanceltype; ++ pthread_setschedparam; ++ ++ # Internal libc interface to libpthread ++ __libc_internal_tsd_get; __libc_internal_tsd_set; ++ } ++ GLIBC_2.1 { ++ pthread_attr_init; ++ } ++} ++ ++ld.so { ++ GLIBC_2.0 { ++ # Internal libc interface to libpthread ++ __libc_internal_tsd_get; __libc_internal_tsd_set; ++ } ++} ++ ++libpthread { ++ GLIBC_2.0 { ++ # Hidden entry point (through macros). ++ _pthread_cleanup_pop; _pthread_cleanup_pop_restore; _pthread_cleanup_push; ++ _pthread_cleanup_push_defer; ++ ++ # Internal libc interface to libpthread ++ __libc_internal_tsd_get; __libc_internal_tsd_set; ++ ++ # Overwritten libc functions. ++ accept; close; connect; fcntl; fork; fsync; longjmp; lseek; msync; ++ nanosleep; open; pause; raise; read; recv; recvfrom; recvmsg; send; ++ sendmsg; sendto; sigaction; siglongjmp; system; tcdrain; wait; ++ waitpid; write; ++ __close; __connect; __fcntl; __lseek; __open; __read; __send; __wait; ++ __write; ++ _IO_flockfile; _IO_ftrylockfile; _IO_funlockfile; ++ vfork; __fork; ++ ++ # POSIX.1c extensions to libc. ++ flockfile; funlockfile; ftrylockfile; ++ ++ # Non-standard POSIX1.x functions. ++ pthread_kill_other_threads_np; pthread_mutexattr_getkind_np; ++ pthread_mutexattr_setkind_np; ++ ++ # Real POSIX.1c functions. ++ pthread_atfork; pthread_attr_destroy; pthread_attr_getdetachstate; ++ pthread_attr_getinheritsched; pthread_attr_getschedparam; ++ pthread_attr_getschedpolicy; pthread_attr_getscope; pthread_attr_init; ++ pthread_attr_setdetachstate; pthread_attr_setinheritsched; ++ pthread_attr_setschedparam; pthread_attr_setschedpolicy; ++ pthread_attr_setscope; pthread_cancel; pthread_cond_broadcast; ++ pthread_cond_destroy; pthread_cond_init; pthread_cond_signal; ++ pthread_cond_timedwait; pthread_cond_wait; pthread_condattr_destroy; ++ pthread_condattr_init; pthread_create; pthread_detach; pthread_equal; ++ pthread_exit; pthread_getschedparam; pthread_getspecific; pthread_join; ++ pthread_key_create; pthread_key_delete; pthread_kill; ++ pthread_mutex_destroy; pthread_mutex_init; pthread_mutex_lock; ++ pthread_mutex_trylock; pthread_mutex_unlock; pthread_mutexattr_destroy; ++ pthread_mutexattr_init; pthread_once; pthread_self; pthread_setcancelstate; ++ pthread_setcanceltype; pthread_setschedparam; pthread_setspecific; ++ pthread_sigmask; pthread_testcancel; ++ ++ sem_destroy; sem_getvalue; sem_init; sem_post; sem_trywait; sem_wait; ++ sigwait; ++ ++ # Protected names for functions used in other shared objects. ++ __pthread_atfork; __pthread_initialize; __pthread_getspecific; ++ __pthread_key_create; __pthread_mutex_destroy; __pthread_mutex_init; ++ __pthread_mutex_lock; __pthread_mutex_trylock; __pthread_mutex_unlock; ++ __pthread_mutexattr_destroy; __pthread_mutexattr_init; ++ __pthread_mutexattr_settype; __pthread_once; __pthread_setspecific; ++ ++ # The error functions. ++ __errno_location; __h_errno_location; ++ } ++ GLIBC_2.1 { ++ # Functions with changed interface. ++ pthread_attr_init; pthread_create; ++ ++ # Unix98 extensions. ++ pthread_rwlock_init; pthread_rwlock_destroy; pthread_rwlock_rdlock; ++ pthread_rwlock_tryrdlock; pthread_rwlock_wrlock; pthread_rwlock_trywrlock; ++ pthread_rwlock_unlock; pthread_rwlockattr_init; pthread_rwlockattr_destroy; ++ pthread_rwlockattr_getpshared; pthread_rwlockattr_setpshared; ++ pthread_rwlockattr_getkind_np; pthread_rwlockattr_setkind_np; ++ ++ pthread_attr_getguardsize; pthread_attr_setguardsize; ++ pthread_attr_getstackaddr; pthread_attr_setstackaddr; ++ pthread_attr_getstacksize; pthread_attr_setstacksize; ++ ++ pthread_getconcurrency; pthread_setconcurrency; ++ ++ pthread_mutexattr_gettype; pthread_mutexattr_settype; ++ ++ sem_destroy; sem_getvalue; sem_init; sem_post; sem_trywait; sem_wait; ++ ++ # helper functions ++ __libc_current_sigrtmin; __libc_current_sigrtmax; ++ __libc_allocate_rtsig; ++ } ++ GLIBC_2.1.1 { ++ sem_close; sem_open; sem_unlink; ++ } ++ GLIBC_2.1.2 { ++ __pthread_kill_other_threads_np; ++ __vfork; ++ } ++} +diff -Naur ../glibc-2.1.3/linuxthreads/attr.c glibc-2.1.3/linuxthreads/attr.c +--- ../glibc-2.1.3/linuxthreads/attr.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/attr.c 1998-10-28 08:30:49.000000000 -0800 +@@ -0,0 +1,199 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* Handling of thread attributes */ ++ ++#include <errno.h> ++#include <string.h> ++#include <unistd.h> ++#include <sys/param.h> ++#include "pthread.h" ++#include "internals.h" ++ ++int __pthread_attr_init_2_1(pthread_attr_t *attr) ++{ ++ size_t ps = __getpagesize (); ++ ++ attr->__detachstate = PTHREAD_CREATE_JOINABLE; ++ attr->__schedpolicy = SCHED_OTHER; ++ attr->__schedparam.sched_priority = 0; ++ attr->__inheritsched = PTHREAD_EXPLICIT_SCHED; ++ attr->__scope = PTHREAD_SCOPE_SYSTEM; ++ attr->__guardsize = ps; ++ attr->__stackaddr = NULL; ++ attr->__stackaddr_set = 0; ++ attr->__stacksize = STACK_SIZE - ps; ++ return 0; ++} ++#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING ++default_symbol_version (__pthread_attr_init_2_1, pthread_attr_init, GLIBC_2.1); ++ ++int __pthread_attr_init_2_0(pthread_attr_t *attr) ++{ ++ attr->__detachstate = PTHREAD_CREATE_JOINABLE; ++ attr->__schedpolicy = SCHED_OTHER; ++ attr->__schedparam.sched_priority = 0; ++ attr->__inheritsched = PTHREAD_EXPLICIT_SCHED; ++ attr->__scope = PTHREAD_SCOPE_SYSTEM; ++ return 0; ++} ++symbol_version (__pthread_attr_init_2_0, pthread_attr_init, GLIBC_2.0); ++#else ++strong_alias (__pthread_attr_init_2_1, pthread_attr_init) ++#endif ++ ++int pthread_attr_destroy(pthread_attr_t *attr) ++{ ++ return 0; ++} ++ ++int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate) ++{ ++ if (detachstate < PTHREAD_CREATE_JOINABLE || ++ detachstate > PTHREAD_CREATE_DETACHED) ++ return EINVAL; ++ attr->__detachstate = detachstate; ++ return 0; ++} ++ ++int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate) ++{ ++ *detachstate = attr->__detachstate; ++ return 0; ++} ++ ++int pthread_attr_setschedparam(pthread_attr_t *attr, ++ const struct sched_param *param) ++{ ++ int max_prio = __sched_get_priority_max(attr->__schedpolicy); ++ int min_prio = __sched_get_priority_min(attr->__schedpolicy); ++ ++ if (param->sched_priority < min_prio || param->sched_priority > max_prio) ++ return EINVAL; ++ memcpy (&attr->__schedparam, param, sizeof (struct sched_param)); ++ return 0; ++} ++ ++int pthread_attr_getschedparam(const pthread_attr_t *attr, ++ struct sched_param *param) ++{ ++ memcpy (param, &attr->__schedparam, sizeof (struct sched_param)); ++ return 0; ++} ++ ++int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy) ++{ ++ if (policy != SCHED_OTHER && policy != SCHED_FIFO && policy != SCHED_RR) ++ return EINVAL; ++ attr->__schedpolicy = policy; ++ return 0; ++} ++ ++int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy) ++{ ++ *policy = attr->__schedpolicy; ++ return 0; ++} ++ ++int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit) ++{ ++ if (inherit != PTHREAD_INHERIT_SCHED && inherit != PTHREAD_EXPLICIT_SCHED) ++ return EINVAL; ++ attr->__inheritsched = inherit; ++ return 0; ++} ++ ++int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit) ++{ ++ *inherit = attr->__inheritsched; ++ return 0; ++} ++ ++int pthread_attr_setscope(pthread_attr_t *attr, int scope) ++{ ++ switch (scope) { ++ case PTHREAD_SCOPE_SYSTEM: ++ attr->__scope = scope; ++ return 0; ++ case PTHREAD_SCOPE_PROCESS: ++ return ENOTSUP; ++ default: ++ return EINVAL; ++ } ++} ++ ++int pthread_attr_getscope(const pthread_attr_t *attr, int *scope) ++{ ++ *scope = attr->__scope; ++ return 0; ++} ++ ++int __pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize) ++{ ++ size_t ps = __getpagesize (); ++ ++ /* First round up the guard size. */ ++ guardsize = roundup (guardsize, ps); ++ ++ /* The guard size must not be larger than the stack itself */ ++ if (guardsize >= attr->__stacksize) return EINVAL; ++ ++ attr->__guardsize = guardsize; ++ ++ return 0; ++} ++weak_alias (__pthread_attr_setguardsize, pthread_attr_setguardsize) ++ ++int __pthread_attr_getguardsize(const pthread_attr_t *attr, size_t *guardsize) ++{ ++ *guardsize = attr->__guardsize; ++ return 0; ++} ++weak_alias (__pthread_attr_getguardsize, pthread_attr_getguardsize) ++ ++int __pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr) ++{ ++ attr->__stackaddr = stackaddr; ++ attr->__stackaddr_set = 1; ++ return 0; ++} ++weak_alias (__pthread_attr_setstackaddr, pthread_attr_setstackaddr) ++ ++int __pthread_attr_getstackaddr(const pthread_attr_t *attr, void **stackaddr) ++{ ++ /* XXX This function has a stupid definition. The standard specifies ++ no error value but what is if no stack address was set? We simply ++ return the value we have in the member. */ ++ *stackaddr = attr->__stackaddr; ++ return 0; ++} ++weak_alias (__pthread_attr_getstackaddr, pthread_attr_getstackaddr) ++ ++int __pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize) ++{ ++ /* We don't accept value smaller than PTHREAD_STACK_MIN. */ ++ if (stacksize < PTHREAD_STACK_MIN) ++ return EINVAL; ++ ++ attr->__stacksize = stacksize; ++ return 0; ++} ++weak_alias (__pthread_attr_setstacksize, pthread_attr_setstacksize) ++ ++int __pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize) ++{ ++ *stacksize = attr->__stacksize; ++ return 0; ++} ++weak_alias (__pthread_attr_getstacksize, pthread_attr_getstacksize) +diff -Naur ../glibc-2.1.3/linuxthreads/cancel.c glibc-2.1.3/linuxthreads/cancel.c +--- ../glibc-2.1.3/linuxthreads/cancel.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/cancel.c 2000-01-06 15:40:57.000000000 -0800 +@@ -0,0 +1,171 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* Thread cancellation */ ++ ++#include <errno.h> ++#include "pthread.h" ++#include "internals.h" ++#include "spinlock.h" ++#include "restart.h" ++ ++int pthread_setcancelstate(int state, int * oldstate) ++{ ++ pthread_descr self = thread_self(); ++ if (state < PTHREAD_CANCEL_ENABLE || state > PTHREAD_CANCEL_DISABLE) ++ return EINVAL; ++ if (oldstate != NULL) *oldstate = THREAD_GETMEM(self, p_cancelstate); ++ THREAD_SETMEM(self, p_cancelstate, state); ++ if (THREAD_GETMEM(self, p_canceled) && ++ THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE && ++ THREAD_GETMEM(self, p_canceltype) == PTHREAD_CANCEL_ASYNCHRONOUS) ++ pthread_exit(PTHREAD_CANCELED); ++ return 0; ++} ++ ++int pthread_setcanceltype(int type, int * oldtype) ++{ ++ pthread_descr self = thread_self(); ++ if (type < PTHREAD_CANCEL_DEFERRED || type > PTHREAD_CANCEL_ASYNCHRONOUS) ++ return EINVAL; ++ if (oldtype != NULL) *oldtype = THREAD_GETMEM(self, p_canceltype); ++ THREAD_SETMEM(self, p_canceltype, type); ++ if (THREAD_GETMEM(self, p_canceled) && ++ THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE && ++ THREAD_GETMEM(self, p_canceltype) == PTHREAD_CANCEL_ASYNCHRONOUS) ++ pthread_exit(PTHREAD_CANCELED); ++ return 0; ++} ++ ++int pthread_cancel(pthread_t thread) ++{ ++ pthread_handle handle = thread_handle(thread); ++ int pid; ++ int dorestart = 0; ++ pthread_descr th; ++ pthread_extricate_if *pextricate; ++ ++ __pthread_lock(&handle->h_lock, NULL); ++ if (invalid_handle(handle, thread)) { ++ __pthread_unlock(&handle->h_lock); ++ return ESRCH; ++ } ++ ++ th = handle->h_descr; ++ ++ if (th->p_canceled) { ++ __pthread_unlock(&handle->h_lock); ++ return 0; ++ } ++ ++ pextricate = th->p_extricate; ++ th->p_canceled = 1; ++ pid = th->p_pid; ++ ++ /* If the thread has registered an extrication interface, then ++ invoke the interface. If it returns 1, then we succeeded in ++ dequeuing the thread from whatever waiting object it was enqueued ++ with. In that case, it is our responsibility to wake it up. ++ And also to set the p_woken_by_cancel flag so the woken thread ++ can tell that it was woken by cancellation. */ ++ ++ if (pextricate != NULL) { ++ dorestart = pextricate->pu_extricate_func(pextricate->pu_object, th); ++ th->p_woken_by_cancel = dorestart; ++ } ++ ++ __pthread_unlock(&handle->h_lock); ++ ++ /* If the thread has suspended or is about to, then we unblock it by ++ issuing a restart, instead of a cancel signal. Otherwise we send ++ the cancel signal to unblock the thread from a cancellation point, ++ or to initiate asynchronous cancellation. The restart is needed so ++ we have proper accounting of restarts; suspend decrements the thread's ++ resume count, and restart() increments it. This also means that suspend's ++ handling of the cancel signal is obsolete. */ ++ ++ if (dorestart) ++ restart(th); ++ else ++ kill(pid, __pthread_sig_cancel); ++ ++ return 0; ++} ++ ++void pthread_testcancel(void) ++{ ++ pthread_descr self = thread_self(); ++ if (THREAD_GETMEM(self, p_canceled) ++ && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) ++ pthread_exit(PTHREAD_CANCELED); ++} ++ ++void _pthread_cleanup_push(struct _pthread_cleanup_buffer * buffer, ++ void (*routine)(void *), void * arg) ++{ ++ pthread_descr self = thread_self(); ++ buffer->__routine = routine; ++ buffer->__arg = arg; ++ buffer->__prev = THREAD_GETMEM(self, p_cleanup); ++ THREAD_SETMEM(self, p_cleanup, buffer); ++} ++ ++void _pthread_cleanup_pop(struct _pthread_cleanup_buffer * buffer, ++ int execute) ++{ ++ pthread_descr self = thread_self(); ++ if (execute) buffer->__routine(buffer->__arg); ++ THREAD_SETMEM(self, p_cleanup, buffer->__prev); ++} ++ ++void _pthread_cleanup_push_defer(struct _pthread_cleanup_buffer * buffer, ++ void (*routine)(void *), void * arg) ++{ ++ pthread_descr self = thread_self(); ++ buffer->__routine = routine; ++ buffer->__arg = arg; ++ buffer->__canceltype = THREAD_GETMEM(self, p_canceltype); ++ buffer->__prev = THREAD_GETMEM(self, p_cleanup); ++ THREAD_SETMEM(self, p_canceltype, PTHREAD_CANCEL_DEFERRED); ++ THREAD_SETMEM(self, p_cleanup, buffer); ++} ++ ++void _pthread_cleanup_pop_restore(struct _pthread_cleanup_buffer * buffer, ++ int execute) ++{ ++ pthread_descr self = thread_self(); ++ if (execute) buffer->__routine(buffer->__arg); ++ THREAD_SETMEM(self, p_cleanup, buffer->__prev); ++ THREAD_SETMEM(self, p_canceltype, buffer->__canceltype); ++ if (THREAD_GETMEM(self, p_canceled) && ++ THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE && ++ THREAD_GETMEM(self, p_canceltype) == PTHREAD_CANCEL_ASYNCHRONOUS) ++ pthread_exit(PTHREAD_CANCELED); ++} ++ ++void __pthread_perform_cleanup(void) ++{ ++ pthread_descr self = thread_self(); ++ struct _pthread_cleanup_buffer * c; ++ for (c = THREAD_GETMEM(self, p_cleanup); c != NULL; c = c->__prev) ++ c->__routine(c->__arg); ++} ++ ++#ifndef PIC ++/* We need a hook to force the cancelation wrappers to be linked in when ++ static libpthread is used. */ ++extern const int __pthread_provide_wrappers; ++static const int * const __pthread_require_wrappers = ++ &__pthread_provide_wrappers; ++#endif +diff -Naur ../glibc-2.1.3/linuxthreads/condvar.c glibc-2.1.3/linuxthreads/condvar.c +--- ../glibc-2.1.3/linuxthreads/condvar.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/condvar.c 2000-02-16 17:44:56.000000000 -0800 +@@ -0,0 +1,417 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* and Pavel Krauz (krauz@fsid.cvut.cz). */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* Condition variables */ ++ ++#include <errno.h> ++#include <sched.h> ++#include <stddef.h> ++#include <sys/time.h> ++#include "pthread.h" ++#include "internals.h" ++#include "spinlock.h" ++#include "queue.h" ++#include "restart.h" ++ ++static int pthread_cond_timedwait_relative_old(pthread_cond_t *, ++ pthread_mutex_t *, const struct timespec *); ++ ++static int pthread_cond_timedwait_relative_new(pthread_cond_t *, ++ pthread_mutex_t *, const struct timespec *); ++ ++static int (*pthread_cond_tw_rel)(pthread_cond_t *, pthread_mutex_t *, ++ const struct timespec *) = pthread_cond_timedwait_relative_old; ++ ++/* initialize this module */ ++void __pthread_init_condvar(int rt_sig_available) ++{ ++ if (rt_sig_available) ++ pthread_cond_tw_rel = pthread_cond_timedwait_relative_new; ++} ++ ++int pthread_cond_init(pthread_cond_t *cond, ++ const pthread_condattr_t *cond_attr) ++{ ++ __pthread_init_lock(&cond->__c_lock); ++ cond->__c_waiting = NULL; ++ return 0; ++} ++ ++int pthread_cond_destroy(pthread_cond_t *cond) ++{ ++ if (cond->__c_waiting != NULL) return EBUSY; ++ return 0; ++} ++ ++/* Function called by pthread_cancel to remove the thread from ++ waiting on a condition variable queue. */ ++ ++static int cond_extricate_func(void *obj, pthread_descr th) ++{ ++ volatile pthread_descr self = thread_self(); ++ pthread_cond_t *cond = obj; ++ int did_remove = 0; ++ ++ __pthread_lock(&cond->__c_lock, self); ++ did_remove = remove_from_queue(&cond->__c_waiting, th); ++ __pthread_unlock(&cond->__c_lock); ++ ++ return did_remove; ++} ++ ++int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex) ++{ ++ volatile pthread_descr self = thread_self(); ++ pthread_extricate_if extr; ++ int already_canceled = 0; ++ ++ /* Set up extrication interface */ ++ extr.pu_object = cond; ++ extr.pu_extricate_func = cond_extricate_func; ++ ++ /* Register extrication interface */ ++ __pthread_set_own_extricate_if(self, &extr); ++ ++ /* Atomically enqueue thread for waiting, but only if it is not ++ canceled. If the thread is canceled, then it will fall through the ++ suspend call below, and then call pthread_exit without ++ having to worry about whether it is still on the condition variable queue. ++ This depends on pthread_cancel setting p_canceled before calling the ++ extricate function. */ ++ ++ __pthread_lock(&cond->__c_lock, self); ++ if (!(THREAD_GETMEM(self, p_canceled) ++ && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE)) ++ enqueue(&cond->__c_waiting, self); ++ else ++ already_canceled = 1; ++ __pthread_unlock(&cond->__c_lock); ++ ++ if (already_canceled) { ++ __pthread_set_own_extricate_if(self, 0); ++ pthread_exit(PTHREAD_CANCELED); ++ } ++ ++ pthread_mutex_unlock(mutex); ++ ++ suspend(self); ++ __pthread_set_own_extricate_if(self, 0); ++ ++ /* Check for cancellation again, to provide correct cancellation ++ point behavior */ ++ ++ if (THREAD_GETMEM(self, p_woken_by_cancel) ++ && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) { ++ THREAD_SETMEM(self, p_woken_by_cancel, 0); ++ pthread_mutex_lock(mutex); ++ pthread_exit(PTHREAD_CANCELED); ++ } ++ ++ pthread_mutex_lock(mutex); ++ return 0; ++} ++ ++/* The following function is used on kernels that don't have rt signals. ++ SIGUSR1 is used as the restart signal. The different code is needed ++ because that ordinary signal does not queue. */ ++ ++static int ++pthread_cond_timedwait_relative_old(pthread_cond_t *cond, ++ pthread_mutex_t *mutex, ++ const struct timespec * abstime) ++{ ++ volatile pthread_descr self = thread_self(); ++ sigset_t unblock, initial_mask; ++ int already_canceled = 0; ++ int was_signalled = 0; ++ sigjmp_buf jmpbuf; ++ pthread_extricate_if extr; ++ ++ /* Set up extrication interface */ ++ extr.pu_object = cond; ++ extr.pu_extricate_func = cond_extricate_func; ++ ++ /* Register extrication interface */ ++ __pthread_set_own_extricate_if(self, &extr); ++ ++ /* Enqueue to wait on the condition and check for cancellation. */ ++ __pthread_lock(&cond->__c_lock, self); ++ if (!(THREAD_GETMEM(self, p_canceled) ++ && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE)) ++ enqueue(&cond->__c_waiting, self); ++ else ++ already_canceled = 1; ++ __pthread_unlock(&cond->__c_lock); ++ ++ if (already_canceled) { ++ __pthread_set_own_extricate_if(self, 0); ++ pthread_exit(PTHREAD_CANCELED); ++ } ++ ++ pthread_mutex_unlock(mutex); ++ ++ if (atomic_decrement(&self->p_resume_count) == 0) { ++ /* Set up a longjmp handler for the restart signal, unblock ++ the signal and sleep. */ ++ ++ if (sigsetjmp(jmpbuf, 1) == 0) { ++ THREAD_SETMEM(self, p_signal_jmp, &jmpbuf); ++ THREAD_SETMEM(self, p_signal, 0); ++ /* Unblock the restart signal */ ++ sigemptyset(&unblock); ++ sigaddset(&unblock, __pthread_sig_restart); ++ sigprocmask(SIG_UNBLOCK, &unblock, &initial_mask); ++ ++ while (1) { ++ struct timeval now; ++ struct timespec reltime; ++ ++ /* Compute a time offset relative to now. */ ++ __gettimeofday (&now, NULL); ++ reltime.tv_nsec = abstime->tv_nsec - now.tv_usec * 1000; ++ reltime.tv_sec = abstime->tv_sec - now.tv_sec; ++ if (reltime.tv_nsec < 0) { ++ reltime.tv_nsec += 1000000000; ++ reltime.tv_sec -= 1; ++ } ++ ++ /* Sleep for the required duration. If woken by a signal, resume waiting ++ as required by Single Unix Specification. */ ++ if (reltime.tv_sec < 0 || __libc_nanosleep(&reltime, NULL) == 0) ++ break; ++ } ++ ++ /* Block the restart signal again */ ++ sigprocmask(SIG_SETMASK, &initial_mask, NULL); ++ was_signalled = 0; ++ } else { ++ was_signalled = 1; ++ } ++ THREAD_SETMEM(self, p_signal_jmp, NULL); ++ } ++ ++ /* Now was_signalled is true if we exited the above code ++ due to the delivery of a restart signal. In that case, ++ we know we have been dequeued and resumed and that the ++ resume count is balanced. Otherwise, there are some ++ cases to consider. First, try to bump up the resume count ++ back to zero. If it goes to 1, it means restart() was ++ invoked on this thread. The signal must be consumed ++ and the count bumped down and everything is cool. ++ Otherwise, no restart was delivered yet, so we remove ++ the thread from the queue. If this succeeds, it's a clear ++ case of timeout. If we fail to remove from the queue, then we ++ must wait for a restart. */ ++ ++ if (!was_signalled) { ++ if (atomic_increment(&self->p_resume_count) != -1) { ++ __pthread_wait_for_restart_signal(self); ++ atomic_decrement(&self->p_resume_count); /* should be zero now! */ ++ } else { ++ int was_on_queue; ++ __pthread_lock(&cond->__c_lock, self); ++ was_on_queue = remove_from_queue(&cond->__c_waiting, self); ++ __pthread_unlock(&cond->__c_lock); ++ ++ if (was_on_queue) { ++ __pthread_set_own_extricate_if(self, 0); ++ pthread_mutex_lock(mutex); ++ return ETIMEDOUT; ++ } ++ ++ suspend(self); ++ } ++ } ++ ++ __pthread_set_own_extricate_if(self, 0); ++ ++ /* The remaining logic is the same as in other cancellable waits, ++ such as pthread_join sem_wait or pthread_cond wait. */ ++ ++ if (THREAD_GETMEM(self, p_woken_by_cancel) ++ && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) { ++ THREAD_SETMEM(self, p_woken_by_cancel, 0); ++ pthread_mutex_lock(mutex); ++ pthread_exit(PTHREAD_CANCELED); ++ } ++ ++ pthread_mutex_lock(mutex); ++ return 0; ++} ++ ++/* The following function is used on new (late 2.1 and 2.2 and higher) kernels ++ that have rt signals which queue. */ ++ ++static int ++pthread_cond_timedwait_relative_new(pthread_cond_t *cond, ++ pthread_mutex_t *mutex, ++ const struct timespec * abstime) ++{ ++ volatile pthread_descr self = thread_self(); ++ sigset_t unblock, initial_mask; ++ int already_canceled = 0; ++ int was_signalled = 0; ++ sigjmp_buf jmpbuf; ++ pthread_extricate_if extr; ++ ++ /* Set up extrication interface */ ++ extr.pu_object = cond; ++ extr.pu_extricate_func = cond_extricate_func; ++ ++ /* Register extrication interface */ ++ __pthread_set_own_extricate_if(self, &extr); ++ ++ /* Enqueue to wait on the condition and check for cancellation. */ ++ __pthread_lock(&cond->__c_lock, self); ++ if (!(THREAD_GETMEM(self, p_canceled) ++ && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE)) ++ enqueue(&cond->__c_waiting, self); ++ else ++ already_canceled = 1; ++ __pthread_unlock(&cond->__c_lock); ++ ++ if (already_canceled) { ++ __pthread_set_own_extricate_if(self, 0); ++ pthread_exit(PTHREAD_CANCELED); ++ } ++ ++ pthread_mutex_unlock(mutex); ++ ++ /* Set up a longjmp handler for the restart signal, unblock ++ the signal and sleep. */ ++ ++ if (sigsetjmp(jmpbuf, 1) == 0) { ++ THREAD_SETMEM(self, p_signal_jmp, &jmpbuf); ++ THREAD_SETMEM(self, p_signal, 0); ++ /* Unblock the restart signal */ ++ sigemptyset(&unblock); ++ sigaddset(&unblock, __pthread_sig_restart); ++ sigprocmask(SIG_UNBLOCK, &unblock, &initial_mask); ++ ++ while (1) { ++ struct timeval now; ++ struct timespec reltime; ++ ++ /* Compute a time offset relative to now. */ ++ __gettimeofday (&now, NULL); ++ reltime.tv_nsec = abstime->tv_nsec - now.tv_usec * 1000; ++ reltime.tv_sec = abstime->tv_sec - now.tv_sec; ++ if (reltime.tv_nsec < 0) { ++ reltime.tv_nsec += 1000000000; ++ reltime.tv_sec -= 1; ++ } ++ ++ /* Sleep for the required duration. If woken by a signal, ++ resume waiting as required by Single Unix Specification. */ ++ if (reltime.tv_sec < 0 || __libc_nanosleep(&reltime, NULL) == 0) ++ break; ++ } ++ ++ /* Block the restart signal again */ ++ sigprocmask(SIG_SETMASK, &initial_mask, NULL); ++ was_signalled = 0; ++ } else { ++ was_signalled = 1; ++ } ++ THREAD_SETMEM(self, p_signal_jmp, NULL); ++ ++ /* Now was_signalled is true if we exited the above code ++ due to the delivery of a restart signal. In that case, ++ everything is cool. We have been removed from the queue ++ by the other thread, and consumed its signal. ++ ++ Otherwise we this thread woke up spontaneously, or due to a signal other ++ than restart. The next thing to do is to try to remove the thread ++ from the queue. This may fail due to a race against another thread ++ trying to do the same. In the failed case, we know we were signalled, ++ and we may also have to consume a restart signal. */ ++ ++ if (!was_signalled) { ++ int was_on_queue; ++ ++ /* __pthread_lock will queue back any spurious restarts that ++ may happen to it. */ ++ ++ __pthread_lock(&cond->__c_lock, self); ++ was_on_queue = remove_from_queue(&cond->__c_waiting, self); ++ __pthread_unlock(&cond->__c_lock); ++ ++ if (was_on_queue) { ++ __pthread_set_own_extricate_if(self, 0); ++ pthread_mutex_lock(mutex); ++ return ETIMEDOUT; ++ } ++ ++ /* Eat the outstanding restart() from the signaller */ ++ suspend(self); ++ } ++ ++ __pthread_set_own_extricate_if(self, 0); ++ ++ /* The remaining logic is the same as in other cancellable waits, ++ such as pthread_join sem_wait or pthread_cond wait. */ ++ ++ if (THREAD_GETMEM(self, p_woken_by_cancel) ++ && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) { ++ THREAD_SETMEM(self, p_woken_by_cancel, 0); ++ pthread_mutex_lock(mutex); ++ pthread_exit(PTHREAD_CANCELED); ++ } ++ ++ pthread_mutex_lock(mutex); ++ return 0; ++} ++ ++int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, ++ const struct timespec * abstime) ++{ ++ /* Indirect call through pointer! */ ++ return pthread_cond_tw_rel(cond, mutex, abstime); ++} ++ ++int pthread_cond_signal(pthread_cond_t *cond) ++{ ++ pthread_descr th; ++ ++ __pthread_lock(&cond->__c_lock, NULL); ++ th = dequeue(&cond->__c_waiting); ++ __pthread_unlock(&cond->__c_lock); ++ if (th != NULL) restart(th); ++ return 0; ++} ++ ++int pthread_cond_broadcast(pthread_cond_t *cond) ++{ ++ pthread_descr tosignal, th; ++ ++ __pthread_lock(&cond->__c_lock, NULL); ++ /* Copy the current state of the waiting queue and empty it */ ++ tosignal = cond->__c_waiting; ++ cond->__c_waiting = NULL; ++ __pthread_unlock(&cond->__c_lock); ++ /* Now signal each process in the queue */ ++ while ((th = dequeue(&tosignal)) != NULL) restart(th); ++ return 0; ++} ++ ++int pthread_condattr_init(pthread_condattr_t *attr) ++{ ++ return 0; ++} ++ ++int pthread_condattr_destroy(pthread_condattr_t *attr) ++{ ++ return 0; ++} +diff -Naur ../glibc-2.1.3/linuxthreads/configure glibc-2.1.3/linuxthreads/configure +--- ../glibc-2.1.3/linuxthreads/configure 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/configure 1998-08-28 03:07:17.000000000 -0700 +@@ -0,0 +1,5 @@ ++# This is only to keep the GNU C library configure mechanism happy. ++# ++# Perhaps some day we need a real configuration script for different ++# kernel versions or so. ++exit 0 +diff -Naur ../glibc-2.1.3/linuxthreads/errno.c glibc-2.1.3/linuxthreads/errno.c +--- ../glibc-2.1.3/linuxthreads/errno.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/errno.c 1998-08-28 03:07:17.000000000 -0700 +@@ -0,0 +1,32 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* Define the location of errno for the remainder of the C library */ ++ ++#include <errno.h> ++#include <netdb.h> ++#include "pthread.h" ++#include "internals.h" ++ ++int * __errno_location() ++{ ++ pthread_descr self = thread_self(); ++ return THREAD_GETMEM (self, p_errnop); ++} ++ ++int * __h_errno_location() ++{ ++ pthread_descr self = thread_self(); ++ return THREAD_GETMEM (self, p_h_errnop); ++} +diff -Naur ../glibc-2.1.3/linuxthreads/events.c glibc-2.1.3/linuxthreads/events.c +--- ../glibc-2.1.3/linuxthreads/events.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/events.c 1999-11-09 22:56:11.000000000 -0800 +@@ -0,0 +1,35 @@ ++/* Event functions used while debugging. ++ 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 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. */ ++ ++/* The functions contained here do nothing, they just return. */ ++ ++void ++__linuxthreads_create_event (void) ++{ ++} ++ ++void ++__linuxthreads_death_event (void) ++{ ++} ++ ++void ++__linuxthreads_reap_event (void) ++{ ++} +diff -Naur ../glibc-2.1.3/linuxthreads/internals.h glibc-2.1.3/linuxthreads/internals.h +--- ../glibc-2.1.3/linuxthreads/internals.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/internals.h 2000-01-20 18:32:38.000000000 -0800 +@@ -0,0 +1,444 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++#ifndef _INTERNALS_H ++#define _INTERNALS_H 1 ++ ++/* Internal data structures */ ++ ++/* Includes */ ++ ++#include <bits/libc-tsd.h> /* for _LIBC_TSD_KEY_N */ ++#include <limits.h> ++#include <setjmp.h> ++#include <signal.h> ++#include <unistd.h> ++#include <sys/types.h> ++#include "pt-machine.h" ++#include "semaphore.h" ++#include "../linuxthreads_db/thread_dbP.h" ++ ++#ifndef THREAD_GETMEM ++# define THREAD_GETMEM(descr, member) descr->member ++#endif ++#ifndef THREAD_GETMEM_NC ++# define THREAD_GETMEM_NC(descr, member) descr->member ++#endif ++#ifndef THREAD_SETMEM ++# define THREAD_SETMEM(descr, member, value) descr->member = (value) ++#endif ++#ifndef THREAD_SETMEM_NC ++# define THREAD_SETMEM_NC(descr, member, value) descr->member = (value) ++#endif ++ ++/* Arguments passed to thread creation routine */ ++ ++struct pthread_start_args { ++ void * (*start_routine)(void *); /* function to run */ ++ void * arg; /* its argument */ ++ sigset_t mask; /* initial signal mask for thread */ ++ int schedpolicy; /* initial scheduling policy (if any) */ ++ struct sched_param schedparam; /* initial scheduling parameters (if any) */ ++}; ++ ++ ++/* We keep thread specific data in a special data structure, a two-level ++ array. The top-level array contains pointers to dynamically allocated ++ arrays of a certain number of data pointers. So we can implement a ++ sparse array. Each dynamic second-level array has ++ PTHREAD_KEY_2NDLEVEL_SIZE ++ entries. This value shouldn't be too large. */ ++#define PTHREAD_KEY_2NDLEVEL_SIZE 32 ++ ++/* We need to address PTHREAD_KEYS_MAX key with PTHREAD_KEY_2NDLEVEL_SIZE ++ keys in each subarray. */ ++#define PTHREAD_KEY_1STLEVEL_SIZE \ ++ ((PTHREAD_KEYS_MAX + PTHREAD_KEY_2NDLEVEL_SIZE - 1) \ ++ / PTHREAD_KEY_2NDLEVEL_SIZE) ++ ++typedef void (*destr_function)(void *); ++ ++struct pthread_key_struct { ++ int in_use; /* already allocated? */ ++ destr_function destr; /* destruction routine */ ++}; ++ ++ ++#define PTHREAD_START_ARGS_INITIALIZER { NULL, NULL, {{0, }}, 0, { 0 } } ++ ++/* The type of thread descriptors */ ++ ++typedef struct _pthread_descr_struct * pthread_descr; ++ ++/* Callback interface for removing the thread from waiting on an ++ object if it is cancelled while waiting or about to wait. ++ This hold a pointer to the object, and a pointer to a function ++ which ``extricates'' the thread from its enqueued state. ++ The function takes two arguments: pointer to the wait object, ++ and a pointer to the thread. It returns 1 if an extrication ++ actually occured, and hence the thread must also be signalled. ++ It returns 0 if the thread had already been extricated. */ ++ ++typedef struct _pthread_extricate_struct { ++ void *pu_object; ++ int (*pu_extricate_func)(void *, pthread_descr); ++} pthread_extricate_if; ++ ++/* Atomic counter made possible by compare_and_swap */ ++ ++struct pthread_atomic { ++ long p_count; ++ int p_spinlock; ++}; ++ ++/* Context info for read write locks. The pthread_rwlock_info structure ++ is information about a lock that has been read-locked by the thread ++ in whose list this structure appears. The pthread_rwlock_context ++ is embedded in the thread context and contains a pointer to the ++ head of the list of lock info structures, as well as a count of ++ read locks that are untracked, because no info structure could be ++ allocated for them. */ ++ ++struct _pthread_rwlock_t; ++ ++typedef struct _pthread_rwlock_info { ++ struct _pthread_rwlock_info *pr_next; ++ struct _pthread_rwlock_t *pr_lock; ++ int pr_lock_count; ++} pthread_readlock_info; ++ ++struct _pthread_descr_struct { ++ pthread_descr p_nextlive, p_prevlive; ++ /* Double chaining of active threads */ ++ pthread_descr p_nextwaiting; /* Next element in the queue holding the thr */ ++ pthread_descr p_nextlock; /* can be on a queue and waiting on a lock */ ++ pthread_t p_tid; /* Thread identifier */ ++ int p_pid; /* PID of Unix process */ ++ int p_priority; /* Thread priority (== 0 if not realtime) */ ++ struct _pthread_fastlock * p_lock; /* Spinlock for synchronized accesses */ ++ int p_signal; /* last signal received */ ++ sigjmp_buf * p_signal_jmp; /* where to siglongjmp on a signal or NULL */ ++ sigjmp_buf * p_cancel_jmp; /* where to siglongjmp on a cancel or NULL */ ++ char p_terminated; /* true if terminated e.g. by pthread_exit */ ++ char p_detached; /* true if detached */ ++ char p_exited; /* true if the assoc. process terminated */ ++ void * p_retval; /* placeholder for return value */ ++ int p_retcode; /* placeholder for return code */ ++ pthread_descr p_joining; /* thread joining on that thread or NULL */ ++ struct _pthread_cleanup_buffer * p_cleanup; /* cleanup functions */ ++ char p_cancelstate; /* cancellation state */ ++ char p_canceltype; /* cancellation type (deferred/async) */ ++ char p_canceled; /* cancellation request pending */ ++ int * p_errnop; /* pointer to used errno variable */ ++ int p_errno; /* error returned by last system call */ ++ int * p_h_errnop; /* pointer to used h_errno variable */ ++ int p_h_errno; /* error returned by last netdb function */ ++ char * p_in_sighandler; /* stack address of sighandler, or NULL */ ++ char p_sigwaiting; /* true if a sigwait() is in progress */ ++ struct pthread_start_args p_start_args; /* arguments for thread creation */ ++ void ** p_specific[PTHREAD_KEY_1STLEVEL_SIZE]; /* thread-specific data */ ++ void * p_libc_specific[_LIBC_TSD_KEY_N]; /* thread-specific data for libc */ ++ int p_userstack; /* nonzero if the user provided the stack */ ++ void *p_guardaddr; /* address of guard area or NULL */ ++ size_t p_guardsize; /* size of guard area */ ++ pthread_descr p_self; /* Pointer to this structure */ ++ int p_nr; /* Index of descriptor in __pthread_handles */ ++ int p_report_events; /* Nonzero if events must be reported. */ ++ td_eventbuf_t p_eventbuf; /* Data for event. */ ++ struct pthread_atomic p_resume_count; /* number of times restart() was ++ called on thread */ ++ char p_woken_by_cancel; /* cancellation performed wakeup */ ++ pthread_extricate_if *p_extricate; /* See above */ ++ pthread_readlock_info *p_readlock_list; /* List of readlock info structs */ ++ pthread_readlock_info *p_readlock_free; /* Free list of structs */ ++ int p_untracked_readlock_count; /* Readlocks not tracked by list */ ++ /* New elements must be added at the end. */ ++} __attribute__ ((aligned(32))); /* We need to align the structure so that ++ doubles are aligned properly. This is 8 ++ bytes on MIPS and 16 bytes on MIPS64. ++ 32 bytes might give better cache ++ utilization. */ ++ ++/* The type of thread handles. */ ++ ++typedef struct pthread_handle_struct * pthread_handle; ++ ++struct pthread_handle_struct { ++ struct _pthread_fastlock h_lock; /* Fast lock for sychronized access */ ++ pthread_descr h_descr; /* Thread descriptor or NULL if invalid */ ++ char * h_bottom; /* Lowest address in the stack thread */ ++}; ++ ++/* The type of messages sent to the thread manager thread */ ++ ++struct pthread_request { ++ pthread_descr req_thread; /* Thread doing the request */ ++ enum { /* Request kind */ ++ REQ_CREATE, REQ_FREE, REQ_PROCESS_EXIT, REQ_MAIN_THREAD_EXIT, ++ REQ_POST, REQ_DEBUG ++ } req_kind; ++ union { /* Arguments for request */ ++ struct { /* For REQ_CREATE: */ ++ const pthread_attr_t * attr; /* thread attributes */ ++ void * (*fn)(void *); /* start function */ ++ void * arg; /* argument to start function */ ++ sigset_t mask; /* signal mask */ ++ } create; ++ struct { /* For REQ_FREE: */ ++ pthread_t thread_id; /* identifier of thread to free */ ++ } free; ++ struct { /* For REQ_PROCESS_EXIT: */ ++ int code; /* exit status */ ++ } exit; ++ void * post; /* For REQ_POST: the semaphore */ ++ } req_args; ++}; ++ ++ ++/* Signals used for suspend/restart and for cancellation notification. */ ++ ++extern int __pthread_sig_restart; ++extern int __pthread_sig_cancel; ++ ++/* Signal used for interfacing with gdb */ ++ ++extern int __pthread_sig_debug; ++ ++/* Global array of thread handles, used for validating a thread id ++ and retrieving the corresponding thread descriptor. Also used for ++ mapping the available stack segments. */ ++ ++extern struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX]; ++ ++/* Descriptor of the initial thread */ ++ ++extern struct _pthread_descr_struct __pthread_initial_thread; ++ ++/* Descriptor of the manager thread */ ++ ++extern struct _pthread_descr_struct __pthread_manager_thread; ++ ++/* Descriptor of the main thread */ ++ ++extern pthread_descr __pthread_main_thread; ++ ++/* Limit between the stack of the initial thread (above) and the ++ stacks of other threads (below). Aligned on a STACK_SIZE boundary. ++ Initially 0, meaning that the current thread is (by definition) ++ the initial thread. */ ++ ++extern char *__pthread_initial_thread_bos; ++ ++/* Indicate whether at least one thread has a user-defined stack (if 1), ++ or all threads have stacks supplied by LinuxThreads (if 0). */ ++ ++extern int __pthread_nonstandard_stacks; ++ ++/* File descriptor for sending requests to the thread manager. ++ Initially -1, meaning that __pthread_initialize_manager must be called. */ ++ ++extern int __pthread_manager_request; ++ ++/* Other end of the pipe for sending requests to the thread manager. */ ++ ++extern int __pthread_manager_reader; ++ ++/* Limits of the thread manager stack. */ ++ ++extern char *__pthread_manager_thread_bos; ++extern char *__pthread_manager_thread_tos; ++ ++/* Pending request for a process-wide exit */ ++ ++extern int __pthread_exit_requested, __pthread_exit_code; ++ ++/* Set to 1 by gdb if we're debugging */ ++ ++extern volatile int __pthread_threads_debug; ++ ++/* Globally enabled events. */ ++extern volatile td_thr_events_t __pthread_threads_events; ++ ++/* Pointer to descriptor of thread with last event. */ ++extern volatile pthread_descr __pthread_last_event; ++ ++/* Return the handle corresponding to a thread id */ ++ ++static inline pthread_handle thread_handle(pthread_t id) ++{ ++ return &__pthread_handles[id % PTHREAD_THREADS_MAX]; ++} ++ ++/* Validate a thread handle. Must have acquired h->h_spinlock before. */ ++ ++static inline int invalid_handle(pthread_handle h, pthread_t id) ++{ ++ return h->h_descr == NULL || h->h_descr->p_tid != id; ++} ++ ++/* Fill in defaults left unspecified by pt-machine.h. */ ++ ++/* The page size we can get from the system. This should likely not be ++ changed by the machine file but, you never know. */ ++#ifndef PAGE_SIZE ++#define PAGE_SIZE (sysconf (_SC_PAGE_SIZE)) ++#endif ++ ++/* The max size of the thread stack segments. If the default ++ THREAD_SELF implementation is used, this must be a power of two and ++ a multiple of PAGE_SIZE. */ ++#ifndef STACK_SIZE ++#define STACK_SIZE (2 * 1024 * 1024) ++#endif ++ ++/* The initial size of the thread stack. Must be a multiple of PAGE_SIZE. */ ++#ifndef INITIAL_STACK_SIZE ++#define INITIAL_STACK_SIZE (4 * PAGE_SIZE) ++#endif ++ ++/* Size of the thread manager stack. The "- 32" avoids wasting space ++ with some malloc() implementations. */ ++#ifndef THREAD_MANAGER_STACK_SIZE ++#define THREAD_MANAGER_STACK_SIZE (2 * PAGE_SIZE - 32) ++#endif ++ ++/* The base of the "array" of thread stacks. The array will grow down from ++ here. Defaults to the calculated bottom of the initial application ++ stack. */ ++#ifndef THREAD_STACK_START_ADDRESS ++#define THREAD_STACK_START_ADDRESS __pthread_initial_thread_bos ++#endif ++ ++/* Get some notion of the current stack. Need not be exactly the top ++ of the stack, just something somewhere in the current frame. */ ++#ifndef CURRENT_STACK_FRAME ++#define CURRENT_STACK_FRAME ({ char __csf; &__csf; }) ++#endif ++ ++/* Recover thread descriptor for the current thread */ ++ ++extern pthread_descr __pthread_find_self (void) __attribute__ ((const)); ++ ++static inline pthread_descr thread_self (void) __attribute__ ((const)); ++static inline pthread_descr thread_self (void) ++{ ++#ifdef THREAD_SELF ++ return THREAD_SELF; ++#else ++ char *sp = CURRENT_STACK_FRAME; ++ if (sp >= __pthread_initial_thread_bos) ++ return &__pthread_initial_thread; ++ else if (sp >= __pthread_manager_thread_bos ++ && sp < __pthread_manager_thread_tos) ++ return &__pthread_manager_thread; ++ else if (__pthread_nonstandard_stacks) ++ return __pthread_find_self(); ++ else ++ return (pthread_descr)(((unsigned long)sp | (STACK_SIZE-1))+1) - 1; ++#endif ++} ++ ++/* Max number of times we must spin on a spinlock calling sched_yield(). ++ After MAX_SPIN_COUNT iterations, we put the calling thread to sleep. */ ++ ++#ifndef MAX_SPIN_COUNT ++#define MAX_SPIN_COUNT 50 ++#endif ++ ++/* Duration of sleep (in nanoseconds) when we can't acquire a spinlock ++ after MAX_SPIN_COUNT iterations of sched_yield(). ++ With the 2.0 and 2.1 kernels, this MUST BE > 2ms. ++ (Otherwise the kernel does busy-waiting for realtime threads, ++ giving other threads no chance to run.) */ ++ ++#ifndef SPIN_SLEEP_DURATION ++#define SPIN_SLEEP_DURATION 2000001 ++#endif ++ ++/* Debugging */ ++ ++#ifdef DEBUG ++#include <assert.h> ++#define ASSERT assert ++#define MSG __pthread_message ++#else ++#define ASSERT(x) ++#define MSG(msg,arg...) ++#endif ++ ++/* Internal global functions */ ++ ++void __pthread_destroy_specifics(void); ++void __pthread_perform_cleanup(void); ++int __pthread_initialize_manager(void); ++void __pthread_message(char * fmt, ...); ++int __pthread_manager(void *reqfd); ++int __pthread_manager_event(void *reqfd); ++void __pthread_manager_sighandler(int sig); ++void __pthread_reset_main_thread(void); ++void __fresetlockfiles(void); ++void __pthread_manager_adjust_prio(int thread_prio); ++void __pthread_set_own_extricate_if(pthread_descr self, pthread_extricate_if *peif); ++ ++extern int __pthread_attr_setguardsize __P ((pthread_attr_t *__attr, ++ size_t __guardsize)); ++extern int __pthread_attr_getguardsize __P ((__const pthread_attr_t *__attr, ++ size_t *__guardsize)); ++extern int __pthread_attr_setstackaddr __P ((pthread_attr_t *__attr, ++ void *__stackaddr)); ++extern int __pthread_attr_getstackaddr __P ((__const pthread_attr_t *__attr, ++ void **__stackaddr)); ++extern int __pthread_attr_setstacksize __P ((pthread_attr_t *__attr, ++ size_t __stacksize)); ++extern int __pthread_attr_getstacksize __P ((__const pthread_attr_t *__attr, ++ size_t *__stacksize)); ++extern int __pthread_getconcurrency __P ((void)); ++extern int __pthread_setconcurrency __P ((int __level)); ++extern int __pthread_mutexattr_gettype __P ((__const pthread_mutexattr_t *__attr, ++ int *__kind)); ++extern void __pthread_kill_other_threads_np __P ((void)); ++ ++void __pthread_restart_old(pthread_descr th); ++void __pthread_suspend_old(pthread_descr self); ++ ++void __pthread_restart_new(pthread_descr th); ++void __pthread_suspend_new(pthread_descr self); ++ ++void __pthread_wait_for_restart_signal(pthread_descr self); ++ ++void __pthread_init_condvar(int rt_sig_available); ++ ++/* Global pointers to old or new suspend functions */ ++ ++extern void (*__pthread_restart)(pthread_descr); ++extern void (*__pthread_suspend)(pthread_descr); ++ ++/* Prototypes for the function without cancelation support when the ++ normal version has it. */ ++extern int __libc_close (int fd); ++extern int __libc_nanosleep (const struct timespec *requested_time, ++ struct timespec *remaining); ++extern ssize_t __libc_read (int fd, void *buf, size_t count); ++extern pid_t __libc_waitpid (pid_t pid, int *stat_loc, int options); ++extern ssize_t __libc_write (int fd, const void *buf, size_t count); ++ ++/* Prototypes for some of the new semaphore functions. */ ++extern int __new_sem_post (sem_t * sem); ++ ++/* The functions called the signal events. */ ++extern void __linuxthreads_create_event (void); ++extern void __linuxthreads_death_event (void); ++extern void __linuxthreads_reap_event (void); ++ ++#endif /* internals.h */ +diff -Naur ../glibc-2.1.3/linuxthreads/join.c glibc-2.1.3/linuxthreads/join.c +--- ../glibc-2.1.3/linuxthreads/join.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/join.c 2000-01-06 15:40:57.000000000 -0800 +@@ -0,0 +1,207 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* Thread termination and joining */ ++ ++#include <errno.h> ++#include <sched.h> ++#include <unistd.h> ++#include "pthread.h" ++#include "internals.h" ++#include "spinlock.h" ++#include "restart.h" ++ ++void pthread_exit(void * retval) ++{ ++ pthread_descr self = thread_self(); ++ pthread_descr joining; ++ struct pthread_request request; ++ ++ /* Reset the cancellation flag to avoid looping if the cleanup handlers ++ contain cancellation points */ ++ THREAD_SETMEM(self, p_canceled, 0); ++ /* Call cleanup functions and destroy the thread-specific data */ ++ __pthread_perform_cleanup(); ++ __pthread_destroy_specifics(); ++ /* Store return value */ ++ __pthread_lock(THREAD_GETMEM(self, p_lock), self); ++ THREAD_SETMEM(self, p_retval, retval); ++ /* Say that we've terminated */ ++ THREAD_SETMEM(self, p_terminated, 1); ++ /* See whether we have to signal the death. */ ++ if (THREAD_GETMEM(self, p_report_events)) ++ { ++ /* See whether TD_DEATH is in any of the mask. */ ++ int idx = __td_eventword (TD_DEATH); ++ uint32_t mask = __td_eventmask (TD_DEATH); ++ ++ if ((mask & (__pthread_threads_events.event_bits[idx] ++ | THREAD_GETMEM(self, ++ p_eventbuf.eventmask).event_bits[idx])) ++ != 0) ++ { ++ /* Yep, we have to signal the death. */ ++ THREAD_SETMEM(self, p_eventbuf.eventnum, TD_DEATH); ++ THREAD_SETMEM(self, p_eventbuf.eventdata, self); ++ __pthread_last_event = self; ++ ++ /* Now call the function to signal the event. */ ++ __linuxthreads_death_event(); ++ } ++ } ++ /* See if someone is joining on us */ ++ joining = THREAD_GETMEM(self, p_joining); ++ __pthread_unlock(THREAD_GETMEM(self, p_lock)); ++ /* Restart joining thread if any */ ++ if (joining != NULL) restart(joining); ++ /* If this is the initial thread, block until all threads have terminated. ++ If another thread calls exit, we'll be terminated from our signal ++ handler. */ ++ if (self == __pthread_main_thread && __pthread_manager_request >= 0) { ++ request.req_thread = self; ++ request.req_kind = REQ_MAIN_THREAD_EXIT; ++ __libc_write(__pthread_manager_request, (char *)&request, sizeof(request)); ++ suspend(self); ++ } ++ /* Exit the process (but don't flush stdio streams, and don't run ++ atexit functions). */ ++ _exit(0); ++} ++ ++/* Function called by pthread_cancel to remove the thread from ++ waiting on a condition variable queue. */ ++ ++static int join_extricate_func(void *obj, pthread_descr th) ++{ ++ volatile pthread_descr self = thread_self(); ++ pthread_handle handle = obj; ++ pthread_descr jo; ++ int did_remove = 0; ++ ++ __pthread_lock(&handle->h_lock, self); ++ jo = handle->h_descr; ++ did_remove = jo->p_joining != NULL; ++ jo->p_joining = NULL; ++ __pthread_unlock(&handle->h_lock); ++ ++ return did_remove; ++} ++ ++int pthread_join(pthread_t thread_id, void ** thread_return) ++{ ++ volatile pthread_descr self = thread_self(); ++ struct pthread_request request; ++ pthread_handle handle = thread_handle(thread_id); ++ pthread_descr th; ++ pthread_extricate_if extr; ++ int already_canceled = 0; ++ ++ /* Set up extrication interface */ ++ extr.pu_object = handle; ++ extr.pu_extricate_func = join_extricate_func; ++ ++ __pthread_lock(&handle->h_lock, self); ++ if (invalid_handle(handle, thread_id)) { ++ __pthread_unlock(&handle->h_lock); ++ return ESRCH; ++ } ++ th = handle->h_descr; ++ if (th == self) { ++ __pthread_unlock(&handle->h_lock); ++ return EDEADLK; ++ } ++ /* If detached or already joined, error */ ++ if (th->p_detached || th->p_joining != NULL) { ++ __pthread_unlock(&handle->h_lock); ++ return EINVAL; ++ } ++ /* If not terminated yet, suspend ourselves. */ ++ if (! th->p_terminated) { ++ /* Register extrication interface */ ++ __pthread_set_own_extricate_if(self, &extr); ++ if (!(THREAD_GETMEM(self, p_canceled) ++ && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE)) ++ th->p_joining = self; ++ else ++ already_canceled = 1; ++ __pthread_unlock(&handle->h_lock); ++ ++ if (already_canceled) { ++ __pthread_set_own_extricate_if(self, 0); ++ pthread_exit(PTHREAD_CANCELED); ++ } ++ ++ suspend(self); ++ /* Deregister extrication interface */ ++ __pthread_set_own_extricate_if(self, 0); ++ ++ /* This is a cancellation point */ ++ if (THREAD_GETMEM(self, p_woken_by_cancel) ++ && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) { ++ THREAD_SETMEM(self, p_woken_by_cancel, 0); ++ pthread_exit(PTHREAD_CANCELED); ++ } ++ __pthread_lock(&handle->h_lock, self); ++ } ++ /* Get return value */ ++ if (thread_return != NULL) *thread_return = th->p_retval; ++ __pthread_unlock(&handle->h_lock); ++ /* Send notification to thread manager */ ++ if (__pthread_manager_request >= 0) { ++ request.req_thread = self; ++ request.req_kind = REQ_FREE; ++ request.req_args.free.thread_id = thread_id; ++ __libc_write(__pthread_manager_request, ++ (char *) &request, sizeof(request)); ++ } ++ return 0; ++} ++ ++int pthread_detach(pthread_t thread_id) ++{ ++ int terminated; ++ struct pthread_request request; ++ pthread_handle handle = thread_handle(thread_id); ++ pthread_descr th; ++ ++ __pthread_lock(&handle->h_lock, NULL); ++ if (invalid_handle(handle, thread_id)) { ++ __pthread_unlock(&handle->h_lock); ++ return ESRCH; ++ } ++ th = handle->h_descr; ++ /* If already detached, error */ ++ if (th->p_detached) { ++ __pthread_unlock(&handle->h_lock); ++ return EINVAL; ++ } ++ /* If already joining, don't do anything. */ ++ if (th->p_joining != NULL) { ++ __pthread_unlock(&handle->h_lock); ++ return 0; ++ } ++ /* Mark as detached */ ++ th->p_detached = 1; ++ terminated = th->p_terminated; ++ __pthread_unlock(&handle->h_lock); ++ /* If already terminated, notify thread manager to reclaim resources */ ++ if (terminated && __pthread_manager_request >= 0) { ++ request.req_thread = thread_self(); ++ request.req_kind = REQ_FREE; ++ request.req_args.free.thread_id = thread_id; ++ __libc_write(__pthread_manager_request, ++ (char *) &request, sizeof(request)); ++ } ++ return 0; ++} +diff -Naur ../glibc-2.1.3/linuxthreads/linuxthreads.texi glibc-2.1.3/linuxthreads/linuxthreads.texi +--- ../glibc-2.1.3/linuxthreads/linuxthreads.texi 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/linuxthreads.texi 1999-06-16 15:34:04.000000000 -0700 +@@ -0,0 +1,1428 @@ ++@node POSIX Threads ++@c @node POSIX Threads, , Top, Top ++@chapter POSIX Threads ++@c %MENU% The standard threads library ++ ++@c This chapter needs more work bigtime. -zw ++ ++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 (@samp{pthread_*}) do not use @var{errno}. ++Instead they return an error code directly. The semaphore operations do ++use @var{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 ++ cancelled. ++* 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. ++* Miscellaneous Thread Functions:: A grab bag of utility routines. ++@end menu ++ ++@node Basic Thread Operations ++@section Basic Thread Operations ++ ++These functions are the thread equivalents of @code{fork}, @code{exit}, ++and @code{wait}. ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_create (pthread_t * @var{thread}, pthread_attr_t * @var{attr}, void * (*@var{start_routine})(void *), void * @var{arg}) ++@code{pthread_create} creates a new thread of control that executes ++concurrently with the calling thread. The new thread calls the ++function @var{start_routine}, passing it @var{arg} as first argument. The ++new thread terminates either explicitly, by calling @code{pthread_exit}, ++or implicitly, by returning from the @var{start_routine} function. The ++latter case is equivalent to calling @code{pthread_exit} with the result ++returned by @var{start_routine} as exit code. ++ ++The @var{attr} argument specifies thread attributes to be applied to the ++new thread. @xref{Thread Attributes}, for details. The @var{attr} ++argument can also be @code{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 @var{thread} argument, and a 0 is returned. On ++error, a non-zero error code is returned. ++ ++This function may return the following errors: ++@table @code ++@item EAGAIN ++Not enough system resources to create a process for the new thread, ++or more than @code{PTHREAD_THREADS_MAX} threads are already active. ++@end table ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun void pthread_exit (void *@var{retval}) ++@code{pthread_exit} terminates the execution of the calling thread. All ++cleanup handlers (@pxref{Cleanup Handlers}) that have been set for the ++calling thread with @code{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-@code{NULL} values associated with them in the calling thread ++(@pxref{Thread-Specific Data}). Finally, execution of the calling ++thread is stopped. ++ ++The @var{retval} argument is the return value of the thread. It can be ++retrieved from another thread using @code{pthread_join}. ++ ++The @code{pthread_exit} function never returns. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_cancel (pthread_t @var{thread}) ++ ++@code{pthread_cancel} sends a cancellation request to the thread denoted ++by the @var{thread} argument. If there is no such thread, ++@code{pthread_cancel} fails and returns @code{ESRCH}. Otherwise it ++returns 0. @xref{Cancellation}, for details. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_join (pthread_t @var{th}, void **thread_@var{return}) ++@code{pthread_join} suspends the execution of the calling thread until ++the thread identified by @var{th} terminates, either by calling ++@code{pthread_exit} or by being cancelled. ++ ++If @var{thread_return} is not @code{NULL}, the return value of @var{th} ++is stored in the location pointed to by @var{thread_return}. The return ++value of @var{th} is either the argument it gave to @code{pthread_exit}, ++or @code{PTHREAD_CANCELED} if @var{th} was cancelled. ++ ++The joined thread @code{th} must be in the joinable state: it must not ++have been detached using @code{pthread_detach} or the ++@code{PTHREAD_CREATE_DETACHED} attribute to @code{pthread_create}. ++ ++When a joinable thread terminates, its memory resources (thread ++descriptor and stack) are not deallocated until another thread performs ++@code{pthread_join} on it. Therefore, @code{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 @code{pthread_join} on a thread @var{th} on which ++another thread is already waiting for termination returns an error. ++ ++@code{pthread_join} is a cancellation point. If a thread is canceled ++while suspended in @code{pthread_join}, the thread execution resumes ++immediately and the cancellation is executed without waiting for the ++@var{th} thread to terminate. If cancellation occurs during ++@code{pthread_join}, the @var{th} thread remains not joined. ++ ++On success, the return value of @var{th} is stored in the location ++pointed to by @var{thread_return}, and 0 is returned. On error, one of ++the following values is returned: ++@table @code ++@item ESRCH ++No thread could be found corresponding to that specified by @var{th}. ++@item EINVAL ++The @var{th} thread has been detached, or another thread is already ++waiting on termination of @var{th}. ++@item EDEADLK ++The @var{th} argument refers to the calling thread. ++@end table ++@end deftypefun ++ ++@node Thread Attributes ++@section Thread Attributes ++ ++@comment pthread.h ++@comment POSIX ++ ++Threads have a number of attributes that may be set at creation time. ++This is done by filling a thread attribute object @var{attr} of type ++@code{pthread_attr_t}, then passing it as second argument to ++@code{pthread_create}. Passing @code{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 @code{pthread_create} does ++not change the attributes of the thread previously created. ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_attr_init (pthread_attr_t *@var{attr}) ++@code{pthread_attr_init} initializes the thread attribute object ++@var{attr} and fills it with default values for the attributes. (The ++default values are listed below for each attribute.) ++ ++Each attribute @var{attrname} (see below for a list of all attributes) ++can be individually set using the function ++@code{pthread_attr_set@var{attrname}} and retrieved using the function ++@code{pthread_attr_get@var{attrname}}. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_attr_destroy (pthread_attr_t *@var{attr}) ++@code{pthread_attr_destroy} destroys the attribute object pointed to by ++@var{attr} releasing any resources associated with it. @var{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. ++@end deftypefun ++ ++@findex pthread_attr_setinheritsched ++@findex pthread_attr_setschedparam ++@findex pthread_attr_setschedpolicy ++@findex pthread_attr_setscope ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_attr_set@var{attr} (pthread_attr_t *@var{obj}, int @var{value}) ++Set attribute @var{attr} to @var{value} in the attribute object pointed ++to by @var{obj}. See below for a list of possible attributes and the ++values they can take. ++ ++On success, these functions return 0. If @var{value} is not meaningful ++for the @var{attr} being modified, they will return the error code ++@code{EINVAL}. Some of the functions have other failure modes; see ++below. ++@end deftypefun ++ ++@findex pthread_attr_getinheritsched ++@findex pthread_attr_getschedparam ++@findex pthread_attr_getschedpolicy ++@findex pthread_attr_getscope ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_attr_get@var{attr} (const pthread_attr_t *@var{obj}, int *@var{value}) ++Store the current setting of @var{attr} in @var{obj} into the variable ++pointed to by @var{value}. ++ ++These functions always return 0. ++@end deftypefun ++ ++The following thread attributes are supported: ++@table @samp ++@item detachstate ++Choose whether the thread is created in the joinable state (value ++@code{PTHREAD_CREATE_JOINABLE}) or in the detached state ++(@code{PTHREAD_CREATE_DETACHED}). The default is ++@code{PTHREAD_CREATE_JOINABLE}. ++ ++In the joinable state, another thread can synchronize on the thread ++termination and recover its termination code using @code{pthread_join}, ++but some of the thread resources are kept allocated after the thread ++terminates, and reclaimed only when another thread performs ++@code{pthread_join} on that thread. ++ ++In the detached state, the thread resources are immediately freed when ++it terminates, but @code{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 @code{pthread_detach}. ++ ++@item schedpolicy ++Select the scheduling policy for the thread: one of @code{SCHED_OTHER} ++(regular, non-realtime scheduling), @code{SCHED_RR} (realtime, ++round-robin) or @code{SCHED_FIFO} (realtime, first-in first-out). ++The default is @code{SCHED_OTHER}. ++@c Not doc'd in our manual: FIXME. ++@c See @code{sched_setpolicy} for more information on scheduling policies. ++ ++The realtime scheduling policies @code{SCHED_RR} and @code{SCHED_FIFO} ++are available only to processes with superuser privileges. ++@code{pthread_attr_setschedparam} will fail and return @code{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 ++@code{pthread_setschedparam}. ++ ++@item 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 ++@code{SCHED_OTHER}; it only matters for the realtime policies ++@code{SCHED_RR} and @code{SCHED_FIFO}. ++ ++The scheduling priority of a thread can be changed after creation with ++@code{pthread_setschedparam}. ++ ++@item inheritsched ++Choose whether the scheduling policy and scheduling parameter for the ++newly created thread are determined by the values of the ++@var{schedpolicy} and @var{schedparam} attributes (value ++@code{PTHREAD_EXPLICIT_SCHED}) or are inherited from the parent thread ++(value @code{PTHREAD_INHERIT_SCHED}). The default is ++@code{PTHREAD_EXPLICIT_SCHED}. ++ ++@item scope ++Choose the scheduling contention scope for the created thread. The ++default is @code{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, ++@code{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. ++ ++@code{PTHREAD_SCOPE_PROCESS} is not supported in LinuxThreads. If you ++try to set the scope to this value @code{pthread_attr_setscope} will ++fail and return @code{ENOTSUP}. ++@end table ++ ++@node Cancellation ++@section 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 @code{pthread_create}, they always defer cancellation ++requests. ++ ++When a thread eventually honors a cancellation request, it behaves as if ++@code{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 cancelled thread was joinable, the return value ++@code{PTHREAD_CANCELED} is provided to whichever thread calls ++@var{pthread_join} on it. See @code{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 ++@code{pthread_join}, @code{pthread_cond_wait}, ++@code{pthread_cond_timedwait}, @code{pthread_testcancel}, ++@code{sem_wait}, and @code{sigwait} are cancellation points. In ++addition, these system calls are cancellation points: ++ ++@multitable @columnfractions .33 .33 .33 ++@item @t{accept} @tab @t{open} @tab @t{sendmsg} ++@item @t{close} @tab @t{pause} @tab @t{sendto} ++@item @t{connect} @tab @t{read} @tab @t{system} ++@item @t{fcntl} @tab @t{recv} @tab @t{tcdrain} ++@item @t{fsync} @tab @t{recvfrom} @tab @t{wait} ++@item @t{lseek} @tab @t{recvmsg} @tab @t{waitpid} ++@item @t{msync} @tab @t{send} @tab @t{write} ++@item @t{nanosleep} ++@end multitable ++ ++@noindent ++All library functions that call these functions (such as ++@code{printf}) are also cancellation points. ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_setcancelstate (int @var{state}, int *@var{oldstate}) ++@code{pthread_setcancelstate} changes the cancellation state for the ++calling thread -- that is, whether cancellation requests are ignored or ++not. The @var{state} argument is the new cancellation state: either ++@code{PTHREAD_CANCEL_ENABLE} to enable cancellation, or ++@code{PTHREAD_CANCEL_DISABLE} to disable cancellation (cancellation ++requests are ignored). ++ ++If @var{oldstate} is not @code{NULL}, the previous cancellation state is ++stored in the location pointed to by @var{oldstate}, and can thus be ++restored later by another call to @code{pthread_setcancelstate}. ++ ++If the @var{state} argument is not @code{PTHREAD_CANCEL_ENABLE} or ++@code{PTHREAD_CANCEL_DISABLE}, @code{pthread_setcancelstate} fails and ++returns @code{EINVAL}. Otherwise it returns 0. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_setcanceltype (int @var{type}, int *@var{oldtype}) ++@code{pthread_setcanceltype} changes the type of responses to ++cancellation requests for the calling thread: asynchronous (immediate) ++or deferred. The @var{type} argument is the new cancellation type: ++either @code{PTHREAD_CANCEL_ASYNCHRONOUS} to cancel the calling thread ++as soon as the cancellation request is received, or ++@code{PTHREAD_CANCEL_DEFERRED} to keep the cancellation request pending ++until the next cancellation point. If @var{oldtype} is not @code{NULL}, ++the previous cancellation state is stored in the location pointed to by ++@var{oldtype}, and can thus be restored later by another call to ++@code{pthread_setcanceltype}. ++ ++If the @var{type} argument is not @code{PTHREAD_CANCEL_DEFERRED} or ++@code{PTHREAD_CANCEL_ASYNCHRONOUS}, @code{pthread_setcanceltype} fails ++and returns @code{EINVAL}. Otherwise it returns 0. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun void pthread_testcancel (@var{void}) ++@code{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. ++@end deftypefun ++ ++@node Cleanup Handlers ++@section Cleanup Handlers ++ ++Cleanup handlers are functions that get called when a thread terminates, ++either by calling @code{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 cancelled 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 @code{malloc} or close file ++descriptors on thread termination. ++ ++Here is how to lock a mutex @var{mut} in such a way that it will be ++unlocked if the thread is canceled while @var{mut} is locked: ++ ++@smallexample ++pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut); ++pthread_mutex_lock(&mut); ++/* do some work */ ++pthread_mutex_unlock(&mut); ++pthread_cleanup_pop(0); ++@end smallexample ++ ++Equivalently, the last two lines can be replaced by ++ ++@smallexample ++pthread_cleanup_pop(1); ++@end smallexample ++ ++Notice that the code above is safe only in deferred cancellation mode ++(see @code{pthread_setcanceltype}). In asynchronous cancellation mode, a ++cancellation can occur between @code{pthread_cleanup_push} and ++@code{pthread_mutex_lock}, or between @code{pthread_mutex_unlock} and ++@code{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: ++ ++@smallexample ++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); ++@end smallexample ++ ++The code above can be rewritten in a more compact and efficient way, ++using the non-portable functions @code{pthread_cleanup_push_defer_np} ++and @code{pthread_cleanup_pop_restore_np}: ++ ++@smallexample ++pthread_cleanup_push_defer_np(pthread_mutex_unlock, (void *) &mut); ++pthread_mutex_lock(&mut); ++/* do some work */ ++pthread_cleanup_pop_restore_np(1); ++@end smallexample ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun void pthread_cleanup_push (void (*@var{routine}) (void *), void *@var{arg}) ++ ++@code{pthread_cleanup_push} installs the @var{routine} function with ++argument @var{arg} as a cleanup handler. From this point on to the ++matching @code{pthread_cleanup_pop}, the function @var{routine} will be ++called with arguments @var{arg} when the thread terminates, either ++through @code{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. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun void pthread_cleanup_pop (int @var{execute}) ++@code{pthread_cleanup_pop} removes the most recently installed cleanup ++handler. If the @var{execute} argument is not 0, it also executes the ++handler, by calling the @var{routine} function with arguments ++@var{arg}. If the @var{execute} argument is 0, the handler is only ++removed but not executed. ++@end deftypefun ++ ++Matching pairs of @code{pthread_cleanup_push} and ++@code{pthread_cleanup_pop} must occur in the same function, at the same ++level of block nesting. Actually, @code{pthread_cleanup_push} and ++@code{pthread_cleanup_pop} are macros, and the expansion of ++@code{pthread_cleanup_push} introduces an open brace @code{@{} with the ++matching closing brace @code{@}} being introduced by the expansion of the ++matching @code{pthread_cleanup_pop}. ++ ++@comment pthread.h ++@comment GNU ++@deftypefun void pthread_cleanup_push_defer_np (void (*@var{routine}) (void *), void *@var{arg}) ++@code{pthread_cleanup_push_defer_np} is a non-portable extension that ++combines @code{pthread_cleanup_push} and @code{pthread_setcanceltype}. ++It pushes a cleanup handler just as @code{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. ++@end deftypefun ++ ++@comment pthread.h ++@comment GNU ++@deftypefun void pthread_cleanup_pop_restore_np (int @var{execute}) ++@code{pthread_cleanup_pop_restore_np} pops a cleanup handler introduced ++by @code{pthread_cleanup_push_defer_np}, and restores the cancellation ++type to its value at the time @code{pthread_cleanup_push_defer_np} was ++called. ++@end deftypefun ++ ++@code{pthread_cleanup_push_defer_np} and ++@code{pthread_cleanup_pop_restore_np} must occur in matching pairs, at ++the same level of block nesting. ++ ++The sequence ++ ++@smallexample ++pthread_cleanup_push_defer_np(routine, arg); ++... ++pthread_cleanup_pop_defer_np(execute); ++@end smallexample ++ ++@noindent ++is functionally equivalent to (but more compact and efficient than) ++ ++@smallexample ++@{ ++ int oldtype; ++ pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype); ++ pthread_cleanup_push(routine, arg); ++ ... ++ pthread_cleanup_pop(execute); ++ pthread_setcanceltype(oldtype, NULL); ++@} ++@end smallexample ++ ++ ++@node Mutexes ++@section 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 ++@code{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 @code{pthread_mutex_lock} or ++@code{pthread_mutex_unlock} from a signal handler may deadlock the ++calling thread. ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_mutex_init (pthread_mutex_t *@var{mutex}, const pthread_mutexattr_t *@var{mutexattr}) ++ ++@code{pthread_mutex_init} initializes the mutex object pointed to by ++@var{mutex} according to the mutex attributes specified in @var{mutexattr}. ++If @var{mutexattr} is @code{NULL}, default attributes are used instead. ++ ++The LinuxThreads implementation supports only one mutex attribute, ++the @var{mutex kind}, which is either ``fast'', ``recursive'', or ++``error checking''. The kind of a mutex determines whether ++it can be locked again by a thread that already owns it. ++The default kind is ``fast''. ++ ++Variables of type @code{pthread_mutex_t} can also be initialized ++statically, using the constants @code{PTHREAD_MUTEX_INITIALIZER} (for ++fast mutexes), @code{PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP} (for ++recursive mutexes), and @code{PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP} ++(for error checking mutexes). ++ ++@code{pthread_mutex_init} always returns 0. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_mutex_lock (pthread_mutex_t *mutex)) ++@code{pthread_mutex_lock} locks the given mutex. If the mutex is ++currently unlocked, it becomes locked and owned by the calling thread, ++and @code{pthread_mutex_lock} returns immediately. If the mutex is ++already locked by another thread, @code{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 ++@code{pthread_mutex_lock} depends on the kind of the mutex. If the mutex ++is of the ``fast'' kind, 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'' kind, @code{pthread_mutex_lock} ++returns immediately with the error code @code{EDEADLK}. If the mutex is ++of the ``recursive'' kind, @code{pthread_mutex_lock} succeeds and ++returns immediately, recording the number of times the calling thread ++has locked the mutex. An equal number of @code{pthread_mutex_unlock} ++operations must be performed before the mutex returns to the unlocked ++state. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_mutex_trylock (pthread_mutex_t *@var{mutex}) ++@code{pthread_mutex_trylock} behaves identically to ++@code{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, ++@code{pthread_mutex_trylock} returns immediately with the error code ++@code{EBUSY}. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_mutex_unlock (pthread_mutex_t *@var{mutex}) ++@code{pthread_mutex_unlock} unlocks the given mutex. The mutex is ++assumed to be locked and owned by the calling thread on entrance to ++@code{pthread_mutex_unlock}. If the mutex is of the ``fast'' kind, ++@code{pthread_mutex_unlock} always returns it to the unlocked state. If ++it is of the ``recursive'' kind, it decrements the locking count of the ++mutex (number of @code{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, @code{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 ++@code{pthread_mutex_unlock}. If these conditions are not met, ++@code{pthread_mutex_unlock} returns @code{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. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_mutex_destroy (pthread_mutex_t *@var{mutex}) ++@code{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 @code{pthread_mutex_destroy} actually does nothing except ++checking that the mutex is unlocked. ++ ++If the mutex is locked by some thread, @code{pthread_mutex_destroy} ++returns @code{EBUSY}. Otherwise it returns 0. ++@end deftypefun ++ ++If any of the above functions (except @code{pthread_mutex_init}) ++is applied to an uninitialized mutex, they will simply return ++@code{EINVAL} and do nothing. ++ ++A shared global variable @var{x} can be protected by a mutex as follows: ++ ++@smallexample ++int x; ++pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; ++@end smallexample ++ ++All accesses and modifications to @var{x} should be bracketed by calls to ++@code{pthread_mutex_lock} and @code{pthread_mutex_unlock} as follows: ++ ++@smallexample ++pthread_mutex_lock(&mut); ++/* operate on x */ ++pthread_mutex_unlock(&mut); ++@end smallexample ++ ++Mutex attributes can be specified at mutex creation time, by passing a ++mutex attribute object as second argument to @code{pthread_mutex_init}. ++Passing @code{NULL} is equivalent to passing a mutex attribute object ++with all attributes set to their default values. ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_mutexattr_init (pthread_mutexattr_t *@var{attr}) ++@code{pthread_mutexattr_init} initializes the mutex attribute object ++@var{attr} and fills it with default values for the attributes. ++ ++This function always returns 0. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_mutexattr_destroy (pthread_mutexattr_t *@var{attr}) ++@code{pthread_mutexattr_destroy} destroys a mutex attribute object, ++which must not be reused until it is ++reinitialized. @code{pthread_mutexattr_destroy} does nothing in the ++LinuxThreads implementation. ++ ++This function always returns 0. ++@end deftypefun ++ ++LinuxThreads supports only one mutex attribute: the mutex kind, which is ++either @code{PTHREAD_MUTEX_FAST_NP} for ``fast'' mutexes, ++@code{PTHREAD_MUTEX_RECURSIVE_NP} for ``recursive'' mutexes, or ++@code{PTHREAD_MUTEX_ERRORCHECK_NP} for ``error checking'' mutexes. As ++the @code{NP} suffix indicates, this is a non-portable extension to the ++POSIX standard and should not be employed in portable programs. ++ ++The mutex kind determines what happens if a thread attempts to lock a ++mutex it already owns with @code{pthread_mutex_lock}. If the mutex is of ++the ``fast'' kind, @code{pthread_mutex_lock} simply suspends the calling ++thread forever. If the mutex is of the ``error checking'' kind, ++@code{pthread_mutex_lock} returns immediately with the error code ++@code{EDEADLK}. If the mutex is of the ``recursive'' kind, the call to ++@code{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 ++@code{pthread_mutex_unlock} the same number of times before the mutex ++returns to the unlocked state. ++ ++The default mutex kind is ``fast'', that is, @code{PTHREAD_MUTEX_FAST_NP}. ++ ++@comment pthread.h ++@comment GNU ++@deftypefun int pthread_mutexattr_setkind_np (pthread_mutexattr_t *@var{attr}, int @var{kind}) ++@code{pthread_mutexattr_setkind_np} sets the mutex kind attribute in ++@var{attr} to the value specified by @var{kind}. ++ ++If @var{kind} is not @code{PTHREAD_MUTEX_FAST_NP}, ++@code{PTHREAD_MUTEX_RECURSIVE_NP}, or ++@code{PTHREAD_MUTEX_ERRORCHECK_NP}, this function will return ++@code{EINVAL} and leave @var{attr} unchanged. ++@end deftypefun ++ ++@comment pthread.h ++@comment GNU ++@deftypefun int pthread_mutexattr_getkind_np (const pthread_mutexattr_t *@var{attr}, int *@var{kind}) ++@code{pthread_mutexattr_getkind_np} retrieves the current value of the ++mutex kind attribute in @var{attr} and stores it in the location pointed ++to by @var{kind}. ++ ++This function always returns 0. ++@end deftypefun ++ ++@node Condition Variables ++@section 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. ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_cond_init (pthread_cond_t *@var{cond}, pthread_condattr_t *cond_@var{attr}) ++ ++@code{pthread_cond_init} initializes the condition variable @var{cond}, ++using the condition attributes specified in @var{cond_attr}, or default ++attributes if @var{cond_attr} is @code{NULL}. The LinuxThreads ++implementation supports no attributes for conditions, hence the ++@var{cond_attr} parameter is actually ignored. ++ ++Variables of type @code{pthread_cond_t} can also be initialized ++statically, using the constant @code{PTHREAD_COND_INITIALIZER}. ++ ++This function always returns 0. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_cond_signal (pthread_cond_t *@var{cond}) ++@code{pthread_cond_signal} restarts one of the threads that are waiting ++on the condition variable @var{cond}. If no threads are waiting on ++@var{cond}, nothing happens. If several threads are waiting on ++@var{cond}, exactly one is restarted, but it is not specified which. ++ ++This function always returns 0. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_cond_broadcast (pthread_cond_t *@var{cond}) ++@code{pthread_cond_broadcast} restarts all the threads that are waiting ++on the condition variable @var{cond}. Nothing happens if no threads are ++waiting on @var{cond}. ++ ++This function always returns 0. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_cond_wait (pthread_cond_t *@var{cond}, pthread_mutex_t *@var{mutex}) ++@code{pthread_cond_wait} atomically unlocks the @var{mutex} (as per ++@code{pthread_unlock_mutex}) and waits for the condition variable ++@var{cond} to be signaled. The thread execution is suspended and does ++not consume any CPU time until the condition variable is signaled. The ++@var{mutex} must be locked by the calling thread on entrance to ++@code{pthread_cond_wait}. Before returning to the calling thread, ++@code{pthread_cond_wait} re-acquires @var{mutex} (as per ++@code{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. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_cond_timedwait (pthread_cond_t *@var{cond}, pthread_mutex_t *@var{mutex}, const struct timespec *@var{abstime}) ++@code{pthread_cond_timedwait} atomically unlocks @var{mutex} and waits ++on @var{cond}, as @code{pthread_cond_wait} does, but it also bounds the ++duration of the wait. If @var{cond} has not been signaled before time ++@var{abstime}, the mutex @var{mutex} is re-acquired and ++@code{pthread_cond_timedwait} returns the error code @code{ETIMEDOUT}. ++The wait can also be interrupted by a signal; in that case ++@code{pthread_cond_timedwait} returns @code{EINTR}. ++ ++The @var{abstime} parameter specifies an absolute time, with the same ++origin as @code{time} and @code{gettimeofday}: an @var{abstime} of 0 ++corresponds to 00:00:00 GMT, January 1, 1970. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_cond_destroy (pthread_cond_t *@var{cond}) ++@code{pthread_cond_destroy} destroys the condition variable @var{cond}, ++freeing the resources it might hold. If any threads are waiting on the ++condition variable, @code{pthread_cond_destroy} leaves @var{cond} ++untouched and returns @code{EBUSY}. Otherwise it returns 0, and ++@var{cond} must not be used again until it is reinitialized. ++ ++In the LinuxThreads implementation, no resources are associated with ++condition variables, so @code{pthread_cond_destroy} actually does ++nothing. ++@end deftypefun ++ ++@code{pthread_cond_wait} and @code{pthread_cond_timedwait} are ++cancellation points. If a thread is cancelled while suspended in one of ++these functions, the thread immediately resumes execution, relocks the ++mutex specified by @var{mutex}, and finally executes the cancellation. ++Consequently, cleanup handlers are assured that @var{mutex} is locked ++when they are called. ++ ++It is not safe to call the condition variable functions from a signal ++handler. In particular, calling @code{pthread_cond_signal} or ++@code{pthread_cond_broadcast} from a signal handler may deadlock the ++calling thread. ++ ++Consider two shared variables @var{x} and @var{y}, protected by the ++mutex @var{mut}, and a condition variable @var{cond} that is to be ++signaled whenever @var{x} becomes greater than @var{y}. ++ ++@smallexample ++int x,y; ++pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; ++pthread_cond_t cond = PTHREAD_COND_INITIALIZER; ++@end smallexample ++ ++Waiting until @var{x} is greater than @var{y} is performed as follows: ++ ++@smallexample ++pthread_mutex_lock(&mut); ++while (x <= y) @{ ++ pthread_cond_wait(&cond, &mut); ++@} ++/* operate on x and y */ ++pthread_mutex_unlock(&mut); ++@end smallexample ++ ++Modifications on @var{x} and @var{y} that may cause @var{x} to become greater than ++@var{y} should signal the condition if needed: ++ ++@smallexample ++pthread_mutex_lock(&mut); ++/* modify x and y */ ++if (x > y) pthread_cond_broadcast(&cond); ++pthread_mutex_unlock(&mut); ++@end smallexample ++ ++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 ++@var{x} and @var{y}), @code{pthread_cond_signal} can be used as a slightly more ++efficient alternative to @code{pthread_cond_broadcast}. In doubt, use ++@code{pthread_cond_broadcast}. ++ ++To wait for @var{x} to becomes greater than @var{y} with a timeout of 5 ++seconds, do: ++ ++@smallexample ++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); ++@end smallexample ++ ++Condition attributes can be specified at condition creation time, by ++passing a condition attribute object as second argument to ++@code{pthread_cond_init}. Passing @code{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. ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_condattr_init (pthread_condattr_t *@var{attr}) ++@deftypefunx int pthread_condattr_destroy (pthread_condattr_t *@var{attr}) ++@code{pthread_condattr_init} initializes the condition attribute object ++@var{attr} and fills it with default values for the attributes. ++@code{pthread_condattr_destroy} destroys the condition attribute object ++@var{attr}. ++ ++Both functions do nothing in the LinuxThreads implementation. ++ ++@code{pthread_condattr_init} and @code{pthread_condattr_destroy} always ++return 0. ++@end deftypefun ++ ++@node POSIX Semaphores ++@section POSIX Semaphores ++ ++@vindex SEM_VALUE_MAX ++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 @code{SEM_VALUE_MAX} is defined to be this maximum value. In ++the GNU C library, @code{SEM_VALUE_MAX} is equal to @code{INT_MAX} ++(@pxref{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 (@code{ipc}, @code{semctl} and ++@code{semop}). ++@c !!! SysV IPC is not doc'd at all in our manual ++ ++All the semaphore functions and macros are defined in @file{semaphore.h}. ++ ++@comment semaphore.h ++@comment POSIX ++@deftypefun int sem_init (sem_t *@var{sem}, int @var{pshared}, unsigned int @var{value}) ++@code{sem_init} initializes the semaphore object pointed to by ++@var{sem}. The count associated with the semaphore is set initially to ++@var{value}. The @var{pshared} argument indicates whether the semaphore ++is local to the current process (@var{pshared} is zero) or is to be ++shared between several processes (@var{pshared} is not zero). ++ ++On success @code{sem_init} returns 0. On failure it returns -1 and sets ++@var{errno} to one of the following values: ++ ++@table @code ++@item EINVAL ++@var{value} exceeds the maximal counter value @code{SEM_VALUE_MAX} ++ ++@item ENOSYS ++@var{pshared} is not zero. LinuxThreads currently does not support ++process-shared semaphores. (This will eventually change.) ++@end table ++@end deftypefun ++ ++@comment semaphore.h ++@comment POSIX ++@deftypefun int sem_destroy (sem_t * @var{sem}) ++@code{sem_destroy} destroys a semaphore object, freeing the resources it ++might hold. If any threads are waiting on the semaphore when ++@code{sem_destroy} is called, it fails and sets @var{errno} to ++@code{EBUSY}. ++ ++In the LinuxThreads implementation, no resources are associated with ++semaphore objects, thus @code{sem_destroy} actually does nothing except ++checking that no thread is waiting on the semaphore. This will change ++when process-shared semaphores are implemented. ++@end deftypefun ++ ++@comment semaphore.h ++@comment POSIX ++@deftypefun int sem_wait (sem_t * @var{sem}) ++@code{sem_wait} suspends the calling thread until the semaphore pointed ++to by @var{sem} has non-zero count. It then atomically decreases the ++semaphore count. ++ ++@code{sem_wait} is a cancellation point. It always returns 0. ++@end deftypefun ++ ++@comment semaphore.h ++@comment POSIX ++@deftypefun int sem_trywait (sem_t * @var{sem}) ++@code{sem_trywait} is a non-blocking variant of @code{sem_wait}. If the ++semaphore pointed to by @var{sem} has non-zero count, the count is ++atomically decreased and @code{sem_trywait} immediately returns 0. If ++the semaphore count is zero, @code{sem_trywait} immediately returns -1 ++and sets errno to @code{EAGAIN}. ++@end deftypefun ++ ++@comment semaphore.h ++@comment POSIX ++@deftypefun int sem_post (sem_t * @var{sem}) ++@code{sem_post} atomically increases the count of the semaphore pointed to ++by @var{sem}. This function never blocks. ++ ++@c !!! This para appears not to agree with the code. ++On processors supporting atomic compare-and-swap (Intel 486, Pentium and ++later, Alpha, PowerPC, MIPS II, Motorola 68k, Ultrasparc), the ++@code{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 @code{sem_post} is not ++async-signal safe, because the hardware does not support the required ++atomic operations. ++ ++@code{sem_post} always succeeds and returns 0, unless the semaphore ++count would exceed @code{SEM_VALUE_MAX} after being incremented. In ++that case @code{sem_post} returns -1 and sets @var{errno} to ++@code{EINVAL}. The semaphore count is left unchanged. ++@end deftypefun ++ ++@comment semaphore.h ++@comment POSIX ++@deftypefun int sem_getvalue (sem_t * @var{sem}, int * @var{sval}) ++@code{sem_getvalue} stores in the location pointed to by @var{sval} the ++current count of the semaphore @var{sem}. It always returns 0. ++@end deftypefun ++ ++@node Thread-Specific Data ++@section 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 @code{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 @code{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 @code{NULL} ++with all keys. ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_key_create (pthread_key_t *@var{key}, void (*destr_function) (void *)) ++@code{pthread_key_create} allocates a new TSD key. The key is stored in ++the location pointed to by @var{key}. There is a limit of ++@code{PTHREAD_KEYS_MAX} on the number of keys allocated at a given ++time. The value initially associated with the returned key is ++@code{NULL} in all currently executing threads. ++ ++The @var{destr_function} argument, if not @code{NULL}, specifies a ++destructor function associated with the key. When a thread terminates ++via @code{pthread_exit} or by cancellation, @var{destr_function} is ++called on the value associated with the key in that thread. The ++@var{destr_function} is not called if a key is deleted with ++@code{pthread_key_delete} or a value is changed with ++@code{pthread_setspecific}. The order in which destructor functions are ++called at thread termination time is unspecified. ++ ++Before the destructor function is called, the @code{NULL} value is ++associated with the key in the current thread. A destructor function ++might, however, re-associate non-@code{NULL} values to that key or some ++other key. To deal with this, if after all the destructors have been ++called for all non-@code{NULL} values, there are still some ++non-@code{NULL} values with associated destructors, then the process is ++repeated. The LinuxThreads implementation stops the process after ++@code{PTHREAD_DESTRUCTOR_ITERATIONS} iterations, even if some ++non-@code{NULL} values with associated descriptors remain. Other ++implementations may loop indefinitely. ++ ++@code{pthread_key_create} returns 0 unless @code{PTHREAD_KEYS_MAX} keys ++have already been allocated, in which case it fails and returns ++@code{EAGAIN}. ++@end deftypefun ++ ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_key_delete (pthread_key_t @var{key}) ++@code{pthread_key_delete} deallocates a TSD key. It does not check ++whether non-@code{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 @var{key}, it returns @code{EINVAL}. Otherwise ++it returns 0. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_setspecific (pthread_key_t @var{key}, const void *@var{pointer}) ++@code{pthread_setspecific} changes the value associated with @var{key} ++in the calling thread, storing the given @var{pointer} instead. ++ ++If there is no such key @var{key}, it returns @code{EINVAL}. Otherwise ++it returns 0. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun {void *} pthread_getspecific (pthread_key_t @var{key}) ++@code{pthread_getspecific} returns the value currently associated with ++@var{key} in the calling thread. ++ ++If there is no such key @var{key}, it returns @code{NULL}. ++@end deftypefun ++ ++The following code fragment allocates a thread-specific array of 100 ++characters, with automatic reclaimation at thread exit: ++ ++@smallexample ++/* 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); ++@} ++@end smallexample ++ ++@node Threads and Signal Handling ++@section Threads and Signal Handling ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_sigmask (int @var{how}, const sigset_t *@var{newmask}, sigset_t *@var{oldmask}) ++@code{pthread_sigmask} changes the signal mask for the calling thread as ++described by the @var{how} and @var{newmask} arguments. If @var{oldmask} ++is not @code{NULL}, the previous signal mask is stored in the location ++pointed to by @var{oldmask}. ++ ++The meaning of the @var{how} and @var{newmask} arguments is the same as ++for @code{sigprocmask}. If @var{how} is @code{SIG_SETMASK}, the signal ++mask is set to @var{newmask}. If @var{how} is @code{SIG_BLOCK}, the ++signals specified to @var{newmask} are added to the current signal mask. ++If @var{how} is @code{SIG_UNBLOCK}, the signals specified to ++@var{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 @code{sigaction}, are shared ++between all threads. ++ ++The @code{pthread_sigmask} function returns 0 on success, and one of the ++following error codes on error: ++@table @code ++@item EINVAL ++@var{how} is not one of @code{SIG_SETMASK}, @code{SIG_BLOCK}, or @code{SIG_UNBLOCK} ++ ++@item EFAULT ++@var{newmask} or @var{oldmask} point to invalid addresses ++@end table ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_kill (pthread_t @var{thread}, int @var{signo}) ++@code{pthread_kill} sends signal number @var{signo} to the thread ++@var{thread}. The signal is delivered and handled as described in ++@ref{Signal Handling}. ++ ++@code{pthread_kill} returns 0 on success, one of the following error codes ++on error: ++@table @code ++@item EINVAL ++@var{signo} is not a valid signal number ++ ++@item ESRCH ++The thread @var{thread} does not exist (e.g. it has already terminated) ++@end table ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int sigwait (const sigset_t *@var{set}, int *@var{sig}) ++@code{sigwait} suspends the calling thread until one of the signals in ++@var{set} is delivered to the calling thread. It then stores the number ++of the signal received in the location pointed to by @var{sig} and ++returns. The signals in @var{set} must be blocked and not ignored on ++entrance to @code{sigwait}. If the delivered signal has a signal handler ++function attached, that function is @emph{not} called. ++ ++@code{sigwait} is a cancellation point. It always returns 0. ++@end deftypefun ++ ++For @code{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 @code{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 @code{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 @code{sigwait} on that ++signal, it will not be restarted. ++ ++The LinuxThreads implementation of @code{sigwait} installs dummy signal ++handlers for the signals in @var{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). ++ ++@node Miscellaneous Thread Functions ++@section Miscellaneous Thread Functions ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun {pthread_t} pthread_self (@var{void}) ++@code{pthread_self} returns the thread identifier for the calling thread. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_equal (pthread_t thread1, pthread_t thread2) ++@code{pthread_equal} determines if two thread identifiers refer to the same ++thread. ++ ++A non-zero value is returned if @var{thread1} and @var{thread2} refer to ++the same thread. Otherwise, 0 is returned. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_detach (pthread_t @var{th}) ++@code{pthread_detach} puts the thread @var{th} in the detached ++state. This guarantees that the memory resources consumed by @var{th} ++will be freed immediately when @var{th} terminates. However, this ++prevents other threads from synchronizing on the termination of @var{th} ++using @code{pthread_join}. ++ ++A thread can be created initially in the detached state, using the ++@code{detachstate} attribute to @code{pthread_create}. In contrast, ++@code{pthread_detach} applies to threads created in the joinable state, ++and which need to be put in the detached state later. ++ ++After @code{pthread_detach} completes, subsequent attempts to perform ++@code{pthread_join} on @var{th} will fail. If another thread is already ++joining the thread @var{th} at the time @code{pthread_detach} is called, ++@code{pthread_detach} does nothing and leaves @var{th} in the joinable ++state. ++ ++On success, 0 is returned. On error, one of the following codes is ++returned: ++@table @code ++@item ESRCH ++No thread could be found corresponding to that specified by @var{th} ++@item EINVAL ++The thread @var{th} is already in the detached state ++@end table ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_atfork (void (*@var{prepare})(void), void (*@var{parent})(void), void (*@var{child})(void)) ++ ++@code{pthread_atfork} registers handler functions to be called just ++before and just after a new process is created with @code{fork}. The ++@var{prepare} handler will be called from the parent process, just ++before the new process is created. The @var{parent} handler will be ++called from the parent process, just before @code{fork} returns. The ++@var{child} handler will be called from the child process, just before ++@code{fork} returns. ++ ++@code{pthread_atfork} returns 0 on success and a non-zero error code on ++error. ++ ++One or more of the three handlers @var{prepare}, @var{parent} and ++@var{child} can be given as @code{NULL}, meaning that no handler needs ++to be called at the corresponding point. ++ ++@code{pthread_atfork} can be called several times to install several ++sets of handlers. At @code{fork} time, the @var{prepare} handlers are ++called in LIFO order (last added with @code{pthread_atfork}, first ++called before @code{fork}), while the @var{parent} and @var{child} ++handlers are called in FIFO order (first added, first called). ++ ++If there is insufficient memory available to register the handlers, ++@code{pthread_atfork} fails and returns @code{ENOMEM}. Otherwise it ++returns 0. ++@end deftypefun ++ ++To understand the purpose of @code{pthread_atfork}, recall that ++@code{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. Thus, if a mutex is locked by a ++thread other than the thread calling @code{fork}, that mutex will remain ++locked forever in the child process, possibly blocking the execution of ++the child process. To avoid this, install handlers with ++@code{pthread_atfork} as follows: the @var{prepare} handler locks the ++global mutexes (in locking order), and the @var{parent} and @var{child} ++handlers unlock them (in reverse order). Alternatively, @var{prepare} ++and @var{parent} can be set to @code{NULL} and @var{child} to a function ++that calls @code{pthread_mutex_init} on the global mutexes. ++ ++@comment pthread.h ++@comment GNU ++@deftypefun void pthread_kill_other_threads_np (@var{void}) ++@code{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 @code{exec} functions, ++e.g. @code{execve}. ++ ++Termination of the other threads is not performed through ++@code{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 @code{exec*} in one of the ++threads should automatically terminate all other threads in the program. ++This behavior is not yet implemented in LinuxThreads. Calling ++@code{pthread_kill_other_threads_np} before @code{exec*} achieves much ++of the same behavior, except that if @code{exec*} ultimately fails, then ++all other threads are already killed. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_once (pthread_once_t *once_@var{control}, void (*@var{init_routine}) (void)) ++ ++The purpose of @code{pthread_once} is to ensure that a piece of ++initialization code is executed at most once. The @var{once_control} ++argument points to a static or extern variable statically initialized ++to @code{PTHREAD_ONCE_INIT}. ++ ++The first time @code{pthread_once} is called with a given ++@var{once_control} argument, it calls @var{init_routine} with no ++argument and changes the value of the @var{once_control} variable to ++record that initialization has been performed. Subsequent calls to ++@code{pthread_once} with the same @code{once_control} argument do ++nothing. ++ ++@code{pthread_once} always returns 0. ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_setschedparam (pthread_t target_@var{thread}, int @var{policy}, const struct sched_param *@var{param}) ++ ++@code{pthread_setschedparam} sets the scheduling parameters for the ++thread @var{target_thread} as indicated by @var{policy} and ++@var{param}. @var{policy} can be either @code{SCHED_OTHER} (regular, ++non-realtime scheduling), @code{SCHED_RR} (realtime, round-robin) or ++@code{SCHED_FIFO} (realtime, first-in first-out). @var{param} specifies ++the scheduling priority for the two realtime policies. See ++@code{sched_setpolicy} for more information on scheduling policies. ++ ++The realtime scheduling policies @code{SCHED_RR} and @code{SCHED_FIFO} ++are available only to processes with superuser privileges. ++ ++On success, @code{pthread_setschedparam} returns 0. On error it returns ++one of the following codes: ++@table @code ++@item EINVAL ++@var{policy} is not one of @code{SCHED_OTHER}, @code{SCHED_RR}, ++@code{SCHED_FIFO}, or the priority value specified by @var{param} is not ++valid for the specified policy ++ ++@item EPERM ++Realtime scheduling was requested but the calling process does not have ++sufficient privileges. ++ ++@item ESRCH ++The @var{target_thread} is invalid or has already terminated ++ ++@item EFAULT ++@var{param} points outside the process memory space ++@end table ++@end deftypefun ++ ++@comment pthread.h ++@comment POSIX ++@deftypefun int pthread_getschedparam (pthread_t target_@var{thread}, int *@var{policy}, struct sched_param *@var{param}) ++ ++@code{pthread_getschedparam} retrieves the scheduling policy and ++scheduling parameters for the thread @var{target_thread} and stores them ++in the locations pointed to by @var{policy} and @var{param}, ++respectively. ++ ++@code{pthread_getschedparam} returns 0 on success, or one of the ++following error codes on failure: ++@table @code ++@item ESRCH ++The @var{target_thread} is invalid or has already terminated. ++ ++@item EFAULT ++@var{policy} or @var{param} point outside the process memory space. ++ ++@end table ++@end deftypefun +diff -Naur ../glibc-2.1.3/linuxthreads/lockfile.c glibc-2.1.3/linuxthreads/lockfile.c +--- ../glibc-2.1.3/linuxthreads/lockfile.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/lockfile.c 1999-12-27 08:10:10.000000000 -0800 +@@ -0,0 +1,88 @@ ++/* lockfile - Handle locking and unlocking of stream. ++ Copyright (C) 1996, 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 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. */ ++ ++#include <bits/libc-lock.h> ++#include <stdio.h> ++#include <pthread.h> ++ ++#ifdef USE_IN_LIBIO ++#include "../libio/libioP.h" ++#endif ++ ++void ++__flockfile (FILE *stream) ++{ ++#ifdef USE_IN_LIBIO ++ __pthread_mutex_lock (stream->_lock); ++#else ++#endif ++} ++#ifdef USE_IN_LIBIO ++#undef _IO_flockfile ++strong_alias (__flockfile, _IO_flockfile) ++#endif ++weak_alias (__flockfile, flockfile); ++ ++ ++void ++__funlockfile (FILE *stream) ++{ ++#ifdef USE_IN_LIBIO ++ __pthread_mutex_unlock (stream->_lock); ++#else ++#endif ++} ++#ifdef USE_IN_LIBIO ++#undef _IO_funlockfile ++strong_alias (__funlockfile, _IO_funlockfile) ++#endif ++weak_alias (__funlockfile, funlockfile); ++ ++ ++int ++__ftrylockfile (FILE *stream) ++{ ++#ifdef USE_IN_LIBIO ++ return __pthread_mutex_trylock (stream->_lock); ++#else ++#endif ++} ++#ifdef USE_IN_LIBIO ++strong_alias (__ftrylockfile, _IO_ftrylockfile) ++#endif ++weak_alias (__ftrylockfile, ftrylockfile); ++ ++ ++void ++__fresetlockfiles (void) ++{ ++#ifdef USE_IN_LIBIO ++ _IO_FILE *fp; ++ pthread_mutexattr_t attr; ++ ++ __pthread_mutexattr_init (&attr); ++ __pthread_mutexattr_settype (&attr, PTHREAD_MUTEX_RECURSIVE_NP); ++ ++ for (fp = _IO_list_all; fp != NULL; fp = fp->_chain) ++ if (fp->_lock) ++ __pthread_mutex_init (fp->_lock, &attr); ++ ++ __pthread_mutexattr_destroy (&attr); ++#endif ++} +diff -Naur ../glibc-2.1.3/linuxthreads/man/Makefile glibc-2.1.3/linuxthreads/man/Makefile +--- ../glibc-2.1.3/linuxthreads/man/Makefile 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/Makefile 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,31 @@ ++SOURCES=pthread_atfork.man pthread_attr_init.man pthread_cancel.man \ ++ pthread_cleanup_push.man pthread_cond_init.man \ ++ pthread_condattr_init.man pthread_create.man pthread_detach.man \ ++ pthread_equal.man pthread_exit.man pthread_join.man \ ++ pthread_key_create.man pthread_mutex_init.man \ ++ pthread_mutexattr_init.man pthread_once.man pthread_self.man \ ++ pthread_setschedparam.man pthread_sigmask.man sem_init.man \ ++ pthread_kill_other_threads_np.man ++ ++MANPAGES=$(SOURCES:.man=.3thr) ++ ++PREPRO=perl troffprepro ++ ++MANDIR=/usr/man/man3 ++ ++all: $(MANPAGES) ++ ++.SUFFIXES: .man .3thr ++ ++.man.3thr: ++ $(PREPRO) $*.man $*.3thr ++ ++$(MANPAGES): troffprepro ++ ++clean: ++ rm -f *.3thr ++ rm -f *~ ++ ++install: ++ install *.3thr $(MANDIR) ++ @echo "*** Remember to run /usr/sbin/makewhatis `dirname $(MANDIR)` at some point" +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_atfork.man glibc-2.1.3/linuxthreads/man/pthread_atfork.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_atfork.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_atfork.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,58 @@ ++.TH PTHREAD_ATFORK 3 LinuxThreads ++ ++.SH NAME ++pthread_atfork \- register handlers to be called at fork(2) time ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void)); ++ ++.SH DESCRIPTION ++ ++!pthread_atfork! registers handler functions to be called just before ++and just after a new process is created with !fork!(2). 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!(2) returns. The |child| handler will be ++called from the child process, just before !fork!(2) returns. ++ ++One or several 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!(2) 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). ++ ++To understand the purpose of !pthread_atfork!, recall that !fork!(2) ++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. Thus, if a mutex is locked by a thread ++other than the thread calling !fork!, that mutex will remain locked ++forever in the child process, possibly blocking the execution of the ++child process. To avoid this, install handlers with !pthread_atfork! ++as follows: the |prepare| handler locks the global mutexes (in locking ++order), and the |parent| and |child| handlers unlock them (in ++reverse order). Alternatively, |prepare| and |parent| can be set to ++!NULL! and |child| to a function that calls !pthread_mutex_init! on ++the global mutexes. ++ ++.SH "RETURN VALUE" ++ ++!pthread_atfork! returns 0 on success and a non-zero error code on error. ++ ++.SH ERRORS ++.TP ++!ENOMEM! ++insufficient memory available to register the handlers. ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!fork!(2), ++!pthread_mutex_lock!(3), ++!pthread_mutex_unlock!(3). +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_attr_init.man glibc-2.1.3/linuxthreads/man/pthread_attr_init.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_attr_init.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_attr_init.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,221 @@ ++.TH PTHREAD_ATTR_INIT 3 LinuxThreads ++ ++.XREF pthread_attr_destroy ++.XREF pthread_attr_setdetachstate ++.XREF pthread_attr_getdetachstate ++.XREF pthread_attr_setschedparam ++.XREF pthread_attr_getschedparam ++.XREF pthread_attr_setschedpolicy ++.XREF pthread_attr_getschedpolicy ++.XREF pthread_attr_setinheritsched ++.XREF pthread_attr_getinheritsched ++.XREF pthread_attr_setscope ++.XREF pthread_attr_getscope ++ ++.SH NAME ++pthread_attr_init, pthread_attr_destroy, pthread_attr_setdetachstate, pthread_attr_getdetachstate, pthread_attr_setschedparam, pthread_attr_getschedparam, pthread_attr_setschedpolicy, pthread_attr_getschedpolicy, pthread_attr_setinheritsched, pthread_attr_getinheritsched, pthread_attr_setscope, pthread_attr_getscope \- thread creation attributes ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++int pthread_attr_init(pthread_attr_t *attr); ++ ++int pthread_attr_destroy(pthread_attr_t *attr); ++ ++int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); ++ ++int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate); ++ ++int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy); ++ ++int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy); ++ ++int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param); ++ ++int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param); ++ ++int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit); ++ ++int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit); ++ ++int pthread_attr_setscope(pthread_attr_t *attr, int scope); ++ ++int pthread_attr_getscope(const pthread_attr_t *attr, int *scope); ++ ++.SH DESCRIPTION ++ ++Setting attributes for threads is achieved by filling a ++thread attribute object |attr| of type !pthread_attr_t!, then passing it as ++second argument to !pthread_create!(3). Passing !NULL! is equivalent to ++passing a thread attribute object with all attributes set to their ++default values. ++ ++!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_set!|attrname| ++and retrieved using the function !pthread_attr_get!|attrname|. ++ ++!pthread_attr_destroy! destroys a thread attribute object, which ++must not be reused until it is reinitialized. !pthread_attr_destroy! ++does nothing in the LinuxThreads implementation. ++ ++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. ++ ++The following thread attributes are supported: ++ ++.SS detachstate ++ ++Control whether the thread is created in the joinable state (value ++!PTHREAD_CREATE_JOINABLE!) or in the detached state ++(!PTHREAD_CREATE_DETACHED!). ++ ++Default value: !PTHREAD_CREATE_JOINABLE!. ++ ++In the joinable state, another thread can synchronize on the thread ++termination and recover its termination code using !pthread_join!(3), ++but some of the thread resources are kept allocated after the thread ++terminates, and reclaimed only when another thread performs ++!pthread_join!(3) on that thread. ++ ++In the detached state, the thread resources are immediately freed when ++it terminates, but !pthread_join!(3) 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!(3). ++ ++.SS 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). See ++!sched_setpolicy!(2) for more information on scheduling policies. ++ ++Default value: !SCHED_OTHER!. ++ ++The realtime scheduling policies !SCHED_RR! and !SCHED_FIFO! are ++available only to processes with superuser privileges. ++ ++The scheduling policy of a thread can be changed after creation with ++!pthread_setschedparam!(3). ++ ++.SS schedparam ++ ++Contain the scheduling parameters (essentially, the scheduling ++priority) for the thread. See !sched_setparam!(2) for more information ++on scheduling parameters. ++ ++Default value: priority 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!(3). ++ ++.SS inheritsched ++ ++Indicate whether the scheduling policy and scheduling parameters 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!). ++ ++Default value: !PTHREAD_EXPLICIT_SCHED!. ++ ++.SS scope ++ ++Define the scheduling contention scope for the created thread. The ++only value supported in the LinuxThreads implementation 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 value specified by the standard, ++!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. ++ ++Default value: !PTHREAD_SCOPE_SYSTEM!. ++ ++.SH "RETURN VALUE" ++ ++All functions return 0 on success and a non-zero error code on error. ++On success, the !pthread_attr_get!|attrname| functions also store the ++current value of the attribute |attrname| in the location pointed to ++by their second argument. ++ ++.SH ERRORS ++ ++The !pthread_attr_setdetachstate! function returns the following error ++codes on error: ++.RS ++.TP ++!EINVAL! ++the specified |detachstate| is not one of !PTHREAD_CREATE_JOINABLE! or ++!PTHREAD_CREATE_DETACHED!. ++.RE ++ ++The !pthread_attr_setschedparam! function returns the following error ++codes on error: ++.RS ++.TP ++!EINVAL! ++the priority specified in |param| is outside the range of allowed ++priorities for the scheduling policy currently in |attr| ++(1 to 99 for !SCHED_FIFO! and !SCHED_RR!; 0 for !SCHED_OTHER!). ++.RE ++ ++The !pthread_attr_setschedpolicy! function returns the following error ++codes on error: ++.RS ++.TP ++!EINVAL! ++the specified |policy| is not one of !SCHED_OTHER!, !SCHED_FIFO!, or ++!SCHED_RR!. ++ ++.TP ++!ENOTSUP! ++|policy| is !SCHED_FIFO! or !SCHED_RR!, and the effective user of the ++calling process is not super-user. ++.RE ++ ++The !pthread_attr_setinheritsched! function returns the following error ++codes on error: ++.RS ++.TP ++!EINVAL! ++the specified |inherit| is not one of !PTHREAD_INHERIT_SCHED! or ++!PTHREAD_EXPLICIT_SCHED!. ++.RE ++ ++The !pthread_attr_setscope! function returns the following error ++codes on error: ++.RS ++.TP ++!EINVAL! ++the specified |scope| is not one of !PTHREAD_SCOPE_SYSTEM! or ++!PTHREAD_SCOPE_PROCESS!. ++ ++.TP ++!ENOTSUP! ++the specified |scope| is !PTHREAD_SCOPE_PROCESS! (not supported). ++.RE ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!pthread_create!(3), ++!pthread_join!(3), ++!pthread_detach!(3), ++!pthread_setschedparam!(3). +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_cancel.man glibc-2.1.3/linuxthreads/man/pthread_cancel.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_cancel.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_cancel.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,155 @@ ++.TH PTHREAD_CANCEL 3 LinuxThreads ++ ++.XREF pthread_setcancelstate ++.XREF pthread_setcanceltype ++.XREF pthread_testcancel ++ ++.SH NAME ++pthread_cancel, pthread_setcancelstate, pthread_setcanceltype, pthread_testcancel \- thread cancellation ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++int pthread_cancel(pthread_t thread); ++ ++int pthread_setcancelstate(int state, int *oldstate); ++ ++int pthread_setcanceltype(int type, int *oldtype); ++ ++void pthread_testcancel(void); ++ ++.SH DESCRIPTION ++ ++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 a thread eventually honors a cancellation request, it performs as ++if !pthread_exit(PTHREAD_CANCELED)! has been called at that point: ++all cleanup handlers are executed in reverse order, finalization ++functions for thread-specific data are called, and finally the thread ++stops executing with the return value !PTHREAD_CANCELED!. See ++!pthread_exit!(3) for more information. ++ ++!pthread_cancel! sends a cancellation request to the thread denoted ++by the |thread| argument. ++ ++!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!. ++ ++!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!. ++ ++Threads are always created by !pthread_create!(3) with cancellation ++enabled and deferred. That is, the initial cancellation state is ++!PTHREAD_CANCEL_ENABLE! and the initial type is ++!PTHREAD_CANCEL_DEFERRED!. ++ ++Cancellation points are those points in the program execution where a ++test for pending cancellation requests is performed and cancellation ++is executed if positive. The following POSIX threads functions ++are cancellation points: ++ ++!pthread_join!(3) ++.br ++!pthread_cond_wait!(3) ++.br ++!pthread_cond_timedwait!(3) ++.br ++!pthread_testcancel!(3) ++.br ++!sem_wait!(3) ++.br ++!sigwait!(3) ++ ++All other POSIX threads functions are guaranteed not to be ++cancellation points. That is, they never perform cancellation in ++deferred cancellation mode. ++ ++!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. ++ ++.SH "RETURN VALUE" ++ ++!pthread_cancel!, !pthread_setcancelstate! and ++!pthread_setcanceltype! return 0 on success and a non-zero error code ++on error. ++ ++.SH ERRORS ++!pthread_cancel! returns the following error code on error: ++.RS ++.TP ++!ESRCH! ++no thread could be found corresponding to that specified by the |thread| ID. ++.RE ++ ++!pthread_setcancelstate! returns the following error code on error: ++.RS ++.TP ++!EINVAL! ++the |state| argument is not !PTHREAD_CANCEL_ENABLE! nor ++!PTHREAD_CANCEL_DISABLE! ++.RE ++ ++!pthread_setcanceltype! returns the following error code on error: ++.RS ++.TP ++!EINVAL! ++the |type| argument is not !PTHREAD_CANCEL_DEFERRED! nor ++!PTHREAD_CANCEL_ASYNCHRONOUS! ++.RE ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!pthread_exit!(3), ++!pthread_cleanup_push!(3), ++!pthread_cleanup_pop!(3). ++ ++.SH BUGS ++ ++POSIX specifies that a number of system calls (basically, all ++system calls that may block, such as !read!(2), !write!(2), !wait!(2), ++etc.) and library functions that may call these system calls (e.g. ++!fprintf!(3)) are cancellation points. LinuxThreads is not yet ++integrated enough with the C library to implement this, and thus none ++of the C library functions is a cancellation point. ++ ++For system calls at least, there is a workaround. Cancellation ++requests are transmitted to the target thread by sending it a ++signal. That signal will interrupt all blocking system calls, causing ++them to return immediately with the !EINTR! error. So, checking for ++cancellation during a !read! system call, for instance, can be ++achieved as follows: ++ ++.RS ++.ft 3 ++.nf ++.sp ++pthread_testcancel(); ++retcode = read(fd, buffer, length); ++pthread_testcancel(); ++.ft ++.LP ++.RE ++.fi +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_cleanup_push.man glibc-2.1.3/linuxthreads/man/pthread_cleanup_push.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_cleanup_push.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_cleanup_push.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,194 @@ ++.TH PTHREAD_CLEANUP 3 LinuxThreads ++ ++.XREF pthread_cleanup_pop ++.XREF pthread_cleanup_push_defer_np ++.XREF pthread_cleanup_pop_restore_np ++ ++.SH NAME ++pthread_cleanup_push, pthread_cleanup_pop, pthread_cleanup_push_defer_np, pthread_cleanup_pop_restore_np \- install and remove cleanup handlers ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++void pthread_cleanup_push(void (*routine) (void *), void *arg); ++ ++void pthread_cleanup_pop(int execute); ++ ++void pthread_cleanup_push_defer_np(void (*routine) (void *), void *arg); ++ ++void pthread_cleanup_pop_restore_np(int execute); ++ ++.SH DESCRIPTION ++ ++Cleanup handlers are functions that get called when a thread ++terminates, either by calling !pthread_exit!(3) 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 cancelled 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!(3) or close file descriptors on thread termination. ++ ++!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!(3) ++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. ++ ++!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!. ++ ++!pthread_cleanup_push_defer_np! is a non-portable extension that ++combines !pthread_cleanup_push! and !pthread_setcanceltype!(3). ++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. ++ ++!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 following sequence ++ ++.RS ++.ft 3 ++.nf ++.sp ++pthread_cleanup_push_defer_np(routine, arg); ++... ++pthread_cleanup_pop_defer_np(execute); ++.ft ++.LP ++.RE ++.fi ++ ++is functionally equivalent to (but more compact and more efficient than) ++ ++.RS ++.ft 3 ++.nf ++.sp ++{ int oldtype; ++ pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &oldtype); ++ pthread_cleanup_push(routine, arg); ++ ... ++ pthread_cleanup_pop(execute); ++ pthread_setcanceltype(oldtype, NULL); ++} ++.ft ++.LP ++.RE ++.fi ++ ++.SH "RETURN VALUE" ++ ++None. ++ ++.SH ERRORS ++ ++None. ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!pthread_exit!(3), ++!pthread_cancel!(3), ++!pthread_setcanceltype!(3). ++ ++.SH EXAMPLE ++ ++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: ++ ++.RS ++.ft 3 ++.nf ++.sp ++pthread_cleanup_push(pthread_mutex_unlock, (void *) &mut); ++pthread_mutex_lock(&mut); ++/* do some work */ ++pthread_mutex_unlock(&mut); ++pthread_cleanup_pop(0); ++.ft ++.LP ++.RE ++.fi ++ ++Equivalently, the last two lines can be replaced by ++ ++.RS ++.ft 3 ++.nf ++.sp ++pthread_cleanup_pop(1); ++.ft ++.LP ++.RE ++.fi ++ ++Notice that the code above is safe only in deferred cancellation mode ++(see !pthread_setcanceltype!(3)). 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: ++ ++.RS ++.ft 3 ++.nf ++.sp ++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); ++.ft ++.LP ++.RE ++.fi ++ ++The code above can be rewritten in a more compact and more ++efficient way, using the non-portable functions ++!pthread_cleanup_push_defer_np! and !pthread_cleanup_pop_restore_np!: ++ ++.RS ++.ft 3 ++.nf ++.sp ++pthread_cleanup_push_restore_np(pthread_mutex_unlock, (void *) &mut); ++pthread_mutex_lock(&mut); ++/* do some work */ ++pthread_cleanup_pop_restore_np(1); ++.ft ++.LP ++.RE ++.fi ++ +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_cond_init.man glibc-2.1.3/linuxthreads/man/pthread_cond_init.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_cond_init.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_cond_init.man 1999-06-16 15:34:07.000000000 -0700 +@@ -0,0 +1,234 @@ ++.TH PTHREAD_COND 3 LinuxThreads ++ ++.XREF pthread_cond_signal ++.XREF pthread_cond_broadcast ++.XREF pthread_cond_wait ++.XREF pthread_cond_timedwait ++.XREF pthread_cond_destroy ++ ++.SH NAME ++pthread_cond_init, pthread_cond_destroy, pthread_cond_signal, pthread_cond_broadcast, pthread_cond_wait, pthread_cond_timedwait \- operations on conditions ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++pthread_cond_t cond = PTHREAD_COND_INITIALIZER; ++ ++int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr); ++ ++int pthread_cond_signal(pthread_cond_t *cond); ++ ++int pthread_cond_broadcast(pthread_cond_t *cond); ++ ++int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex); ++ ++int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime); ++ ++int pthread_cond_destroy(pthread_cond_t *cond); ++ ++.SH DESCRIPTION ++ ++A condition (short for ``condition variable'') is a synchronization ++device that allows threads to suspend execution and relinquish the ++processors 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. ++ ++!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!. ++ ++!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. ++ ++!pthread_cond_broadcast! restarts all the threads that are waiting on ++the condition variable |cond|. Nothing happens if no threads are ++waiting on |cond|. ++ ++!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. ++ ++!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 within the amount of time ++specified by |abstime|, the mutex |mutex| is re-acquired and ++!pthread_cond_timedwait! returns the error !ETIMEDOUT!. ++The |abstime| parameter specifies an absolute time, with the same ++origin as !time!(2) and !gettimeofday!(2): an |abstime| of 0 ++corresponds to 00:00:00 GMT, January 1, 1970. ++ ++!pthread_cond_destroy! destroys a condition variable, freeing the ++resources it might hold. No threads must be waiting on the condition ++variable on entrance to !pthread_cond_destroy!. In the LinuxThreads ++implementation, no resources are associated with condition variables, ++thus !pthread_cond_destroy! actually does nothing except checking that ++the condition has no waiting threads. ++ ++.SH CANCELLATION ++ ++!pthread_cond_wait! and !pthread_cond_timedwait! are cancellation ++points. If a thread is cancelled while suspended in one of these ++functions, the thread immediately resumes execution, then locks again ++the |mutex| argument to !pthread_cond_wait! and ++!pthread_cond_timedwait!, and finally executes the cancellation. ++Consequently, cleanup handlers are assured that |mutex| is locked when ++they are called. ++ ++.SH "ASYNC-SIGNAL SAFETY" ++ ++The condition functions are not async-signal safe, and should not be ++called from a signal handler. In particular, calling ++!pthread_cond_signal! or !pthread_cond_broadcast! from a signal ++handler may deadlock the calling thread. ++ ++.SH "RETURN VALUE" ++ ++All condition variable functions return 0 on success and a non-zero ++error code on error. ++ ++.SH ERRORS ++ ++!pthread_cond_init!, !pthread_cond_signal!, !pthread_cond_broadcast!, ++and !pthread_cond_wait! never return an error code. ++ ++The !pthread_cond_timedwait! function returns the following error codes ++on error: ++.RS ++.TP ++!ETIMEDOUT! ++the condition variable was not signaled until the timeout specified by ++|abstime| ++ ++.TP ++!EINTR! ++!pthread_cond_timedwait! was interrupted by a signal ++.RE ++ ++The !pthread_cond_destroy! function returns the following error code ++on error: ++.RS ++.TP ++!EBUSY! ++some threads are currently waiting on |cond|. ++.RE ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!pthread_condattr_init!(3), ++!pthread_mutex_lock!(3), ++!pthread_mutex_unlock!(3), ++!gettimeofday!(2), ++!nanosleep!(2). ++ ++.SH EXAMPLE ++ ++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|. ++ ++.RS ++.ft 3 ++.nf ++.sp ++int x,y; ++pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; ++pthread_cond_t cond = PTHREAD_COND_INITIALIZER; ++.ft ++.LP ++.RE ++.fi ++ ++Waiting until |x| is greater than |y| is performed as follows: ++ ++.RS ++.ft 3 ++.nf ++.sp ++pthread_mutex_lock(&mut); ++while (x <= y) { ++ pthread_cond_wait(&cond, &mut); ++} ++/* operate on x and y */ ++pthread_mutex_unlock(&mut); ++.ft ++.LP ++.RE ++.fi ++ ++Modifications on |x| and |y| that may cause |x| to become greater than ++|y| should signal the condition if needed: ++ ++.RS ++.ft 3 ++.nf ++.sp ++pthread_mutex_lock(&mut); ++/* modify x and y */ ++if (x > y) pthread_cond_broadcast(&cond); ++pthread_mutex_unlock(&mut); ++.ft ++.LP ++.RE ++.fi ++ ++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: ++ ++.RS ++.ft 3 ++.nf ++.sp ++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); ++.ft ++.LP ++.RE ++.fi +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_condattr_init.man glibc-2.1.3/linuxthreads/man/pthread_condattr_init.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_condattr_init.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_condattr_init.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,39 @@ ++.TH PTHREAD_CONDATTR 3 LinuxThreads ++ ++.XREF pthread_condattr_destroy ++ ++.SH NAME ++pthread_condattr_init, pthread_condattr_destroy \- condition creation attributes ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++int pthread_condattr_init(pthread_condattr_t *attr); ++ ++int pthread_condattr_destroy(pthread_condattr_t *attr); ++ ++.SH DESCRIPTION ++ ++Condition attributes can be specified at condition creation time, by passing a ++condition attribute object as second argument to !pthread_cond_init!(3). ++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. ++ ++!pthread_condattr_init! initializes the condition attribute object ++|attr| and fills it with default values for the attributes. ++!pthread_condattr_destroy! destroys a condition attribute object, ++which must not be reused until it is reinitialized. Both functions do ++nothing in the LinuxThreads implementation. ++ ++.SH "RETURN VALUE" ++!pthread_condattr_init! and !pthread_condattr_destroy! always return 0. ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!pthread_cond_init!(3). +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_create.man glibc-2.1.3/linuxthreads/man/pthread_create.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_create.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_create.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,46 @@ ++.TH PTHREAD_CREATE 3 LinuxThreads ++ ++.SH NAME ++pthread_create \- create a new thread ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start_routine)(void *), void * arg); ++ ++.SH DESCRIPTION ++!pthread_create! creates a new thread of control that executes ++concurrently with the calling thread. The new thread applies the ++function |start_routine| passing it |arg| as first argument. The new ++thread terminates either explicitly, by calling !pthread_exit!(3), ++or implicitly, by returning from the |start_routine| function. The ++latter case is equivalent to calling !pthread_exit!(3) with the result ++returned by |start_routine| as exit code. ++ ++The |attr| argument specifies thread attributes to be applied to the ++new thread. See !pthread_attr_init!(3) for a complete list of thread ++attributes. The |attr| argument can also be !NULL!, in which case ++default attributes are used: the created thread is joinable (not ++detached) and has default (non real-time) scheduling policy. ++ ++.SH "RETURN VALUE" ++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. ++ ++.SH ERRORS ++.TP ++!EAGAIN! ++not enough system resources to create a process for the new thread. ++.TP ++!EAGAIN! ++more than !PTHREAD_THREADS_MAX! threads are already active. ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!pthread_exit!(3), ++!pthread_join!(3), ++!pthread_detach!(3), ++!pthread_attr_init!(3). +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_detach.man glibc-2.1.3/linuxthreads/man/pthread_detach.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_detach.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_detach.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,44 @@ ++.TH PTHREAD_DETACH 3 LinuxThreads ++ ++.SH NAME ++pthread_detach \- put a running thread in the detached state ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++int pthread_detach(pthread_t th); ++ ++.SH DESCRIPTION ++!pthread_detach! put 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!(3). 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. ++ ++.SH "RETURN VALUE" ++On success, 0 is returned. On error, a non-zero error code is returned. ++ ++.SH ERRORS ++.TP ++!ESRCH! ++No thread could be found corresponding to that specified by |th| ++.TP ++!EINVAL! ++the thread |th| is already in the detached state ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!pthread_create!(3), ++!pthread_join!(3), ++!pthread_attr_setdetachstate!(3). +\ No newline at end of file +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_equal.man glibc-2.1.3/linuxthreads/man/pthread_equal.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_equal.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_equal.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,23 @@ ++.TH PTHREAD_EQUAL 3 LinuxThreads ++ ++.SH NAME ++pthread_equal \- compare two thread identifiers ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++int pthread_equal(pthread_t thread1, pthread_t thread2); ++ ++.SH DESCRIPTION ++!pthread_equal! determines if two thread identifiers refer to the same ++thread. ++ ++.SH "RETURN VALUE" ++A non-zero value is returned if |thread1| and |thread2| refer to the ++same thread. Otherwise, 0 is returned. ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!pthread_self!(3). +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_exit.man glibc-2.1.3/linuxthreads/man/pthread_exit.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_exit.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_exit.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,32 @@ ++.TH PTHREAD_EXIT 3 LinuxThreads ++ ++.SH NAME ++pthread_exit \- terminate the calling thread ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++void pthread_exit(void *retval); ++ ++.SH DESCRIPTION ++!pthread_exit! terminates the execution of the calling thread. ++All cleanup handlers that have been set for the calling thread with ++!pthread_cleanup_push!(3) 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 (see ++!pthread_key_create!(3)). Finally, execution of the calling thread is ++stopped. ++ ++The |retval| argument is the return value of the thread. It can be ++consulted from another thread using !pthread_join!(3). ++ ++.SH "RETURN VALUE" ++The !pthread_exit! function never returns. ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!pthread_create!(3), ++!pthread_join!(3). +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_join.man glibc-2.1.3/linuxthreads/man/pthread_join.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_join.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_join.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,70 @@ ++.TH PTHREAD_JOIN 3 LinuxThreads ++ ++.SH NAME ++pthread_join \- wait for termination of another thread ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++int pthread_join(pthread_t th, void **thread_return); ++ ++.SH DESCRIPTION ++!pthread_join! suspends the execution of the calling thread until the ++thread identified by |th| terminates, either by calling !pthread_exit!(3) ++or by being cancelled. ++ ++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!(3), or ++!PTHREAD_CANCELED! if |th| was cancelled. ++ ++The joined thread !th! must be in the joinable state: it must not have ++been detached using !pthread_detach!(3) or the ++!PTHREAD_CREATE_DETACHED! attribute to !pthread_create!(3). ++ ++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. ++ ++.SH CANCELLATION ++ ++!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. ++ ++.SH "RETURN VALUE" ++On success, the return value of |th| is stored in the location pointed ++to by |thread_return|, and 0 is returned. On error, a non-zero error ++code is returned. ++ ++.SH ERRORS ++.TP ++!ESRCH! ++No thread could be found corresponding to that specified by |th|. ++.TP ++!EINVAL! ++The |th| thread has been detached. ++.TP ++!EINVAL! ++Another thread is already waiting on termination of |th|. ++.TP ++!EDEADLK! ++The |th| argument refers to the calling thread. ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!pthread_exit!(3), ++!pthread_detach!(3), ++!pthread_create!(3), ++!pthread_attr_setdetachstate!(3), ++!pthread_cleanup_push!(3), ++!pthread_key_create!(3). +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_key_create.man glibc-2.1.3/linuxthreads/man/pthread_key_create.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_key_create.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_key_create.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,151 @@ ++.TH PTHREAD_SPECIFIC 3 LinuxThreads ++ ++.SH NAME ++pthread_key_create, pthread_key_delete, pthread_setspecific, pthread_getspecific \- management of thread-specific data ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++int pthread_key_create(pthread_key_t *key, void (*destr_function) (void *)); ++ ++int pthread_key_delete(pthread_key_t key); ++ ++int pthread_setspecific(pthread_key_t key, const void *pointer); ++ ++void * pthread_getspecific(pthread_key_t key); ++ ++.SH DESCRIPTION ++ ++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. ++ ++!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 with ++arguments the value associated with the key in that thread. The ++|destr_function| is not called if that value is !NULL!. 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_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. ++ ++!pthread_setspecific! changes the value associated with |key| in the ++calling thread, storing the given |pointer| instead. ++ ++!pthread_getspecific! returns the value currently associated with ++|key| in the calling thread. ++ ++.SH "RETURN VALUE" ++ ++!pthread_key_create!, !pthread_key_delete!, and !pthread_setspecific! ++return 0 on success and a non-zero error code on failure. If ++successful, !pthread_key_create! stores the newly allocated key in the ++location pointed to by its |key| argument. ++ ++!pthread_getspecific! returns the value associated with |key| on ++success, and !NULL! on error. ++ ++.SH ERRORS ++!pthread_key_create! returns the following error code on error: ++.RS ++.TP ++!EAGAIN! ++!PTHREAD_KEYS_MAX! keys are already allocated ++.RE ++ ++!pthread_key_delete! and !pthread_setspecific! return the following ++error code on error: ++.RS ++.TP ++!EINVAL! ++|key| is not a valid, allocated TSD key ++.RE ++ ++!pthread_getspecific! returns !NULL! if |key| is not a valid, ++allocated TSD key. ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++pthread_create(3), pthread_exit(3), pthread_testcancel(3). ++ ++.SH EXAMPLE ++ ++The following code fragment allocates a thread-specific array of 100 ++characters, with automatic reclaimation at thread exit: ++ ++.RS ++.ft 3 ++.nf ++.sp ++/* 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); ++} ++.ft ++.LP ++.RE ++.fi +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_kill_other_threads_np.man glibc-2.1.3/linuxthreads/man/pthread_kill_other_threads_np.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_kill_other_threads_np.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_kill_other_threads_np.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,40 @@ ++.TH PTHREAD_KILL_OTHER_THREADS_NP 3 LinuxThreads ++ ++.SH NAME ++pthread_kill_other_threads_np \- terminate all threads in program except calling thread ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++void pthread_kill_other_threads_np(void); ++ ++.SH DESCRIPTION ++!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!(2). ++ ++Termination of the other threads is not performed through ++!pthread_cancel!(3) 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. ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!execve!(2), ++!pthread_setcancelstate!(3), ++!pthread_setcanceltype!(3), ++!pthread_cancel!(3). ++ ++.SH BUGS ++ ++According to POSIX 1003.1c, a successful !exec*! in one of the threads ++should terminate automatically 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. +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_mutex_init.man glibc-2.1.3/linuxthreads/man/pthread_mutex_init.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_mutex_init.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_mutex_init.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,213 @@ ++.TH PTHREAD_MUTEX 3 LinuxThreads ++ ++.XREF pthread_mutex_lock ++.XREF pthread_mutex_unlock ++.XREF pthread_mutex_trylock ++.XREF pthread_mutex_destroy ++ ++.SH NAME ++pthread_mutex_init, pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_unlock, pthread_mutex_destroy \- operations on mutexes ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++pthread_mutex_t fastmutex = PTHREAD_MUTEX_INITIALIZER; ++ ++pthread_mutex_t recmutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; ++ ++pthread_mutex_t errchkmutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP; ++ ++int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr); ++ ++int pthread_mutex_lock(pthread_mutex_t *mutex)); ++ ++int pthread_mutex_trylock(pthread_mutex_t *mutex); ++ ++int pthread_mutex_unlock(pthread_mutex_t *mutex); ++ ++int pthread_mutex_destroy(pthread_mutex_t *mutex); ++ ++.SH DESCRIPTION ++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. ++ ++!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 attributes, ++the |mutex kind|, which is either ``fast'', ``recursive'', or ++``error checking''. The kind of a mutex determines whether ++it can be locked again by a thread that already owns it. ++The default kind is ``fast''. See !pthread_mutexattr_init!(3) for more ++information on mutex attributes. ++ ++Variables of type !pthread_mutex_t! can also be initialized ++statically, using the constants !PTHREAD_MUTEX_INITIALIZER! (for fast ++mutexes), !PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP! (for recursive ++mutexes), and !PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP! (for error checking ++mutexes). ++ ++!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 kind of the mutex. If the mutex is ++of the ``fast'' kind, the calling thread is suspended until the mutex ++is unlocked, thus effectively causing the calling thread to ++deadlock. If the mutex is of the ``error checking'' kind, ++!pthread_mutex_lock! returns immediately with the error code !EDEADLK!. ++If the mutex is of the ``recursive'' kind, !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. ++ ++!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!. ++ ++!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'' kind, ++!pthread_mutex_unlock! always returns it to the unlocked state. If it ++is of the ``recursive'' kind, 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, an error code is returned 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. ++ ++!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. ++ ++.SH CANCELLATION ++ ++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. ++ ++.SH "ASYNC-SIGNAL SAFETY" ++ ++The mutex functions are not async-signal safe. What this means is that ++they should not be called from a signal handler. In particular, ++calling !pthread_mutex_lock! or !pthread_mutex_unlock! from a signal ++handler may deadlock the calling thread. ++ ++.SH "RETURN VALUE" ++ ++!pthread_mutex_init! always returns 0. The other mutex functions ++return 0 on success and a non-zero error code on error. ++ ++.SH ERRORS ++ ++The !pthread_mutex_lock! function returns the following error code ++on error: ++.RS ++.TP ++!EINVAL! ++the mutex has not been properly initialized. ++ ++.TP ++!EDEADLK! ++the mutex is already locked by the calling thread ++(``error checking'' mutexes only). ++.RE ++ ++The !pthread_mutex_trylock! function returns the following error codes ++on error: ++.RS ++.TP ++!EBUSY! ++the mutex could not be acquired because it was currently locked. ++ ++.TP ++!EINVAL! ++the mutex has not been properly initialized. ++.RE ++ ++The !pthread_mutex_unlock! function returns the following error code ++on error: ++.RS ++.TP ++!EINVAL! ++the mutex has not been properly initialized. ++ ++.TP ++!EPERM! ++the calling thread does not own the mutex (``error checking'' mutexes only). ++.RE ++ ++The !pthread_mutex_destroy! function returns the following error code ++on error: ++.RS ++.TP ++!EBUSY! ++the mutex is currently locked. ++.RE ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!pthread_mutexattr_init!(3), ++!pthread_mutexattr_setkind_np!(3), ++!pthread_cancel!(3). ++ ++.SH EXAMPLE ++ ++A shared global variable |x| can be protected by a mutex as follows: ++ ++.RS ++.ft 3 ++.nf ++.sp ++int x; ++pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER; ++.ft ++.LP ++.RE ++.fi ++ ++All accesses and modifications to |x| should be bracketed by calls to ++!pthread_mutex_lock! and !pthread_mutex_unlock! as follows: ++ ++.RS ++.ft 3 ++.nf ++.sp ++pthread_mutex_lock(&mut); ++/* operate on x */ ++pthread_mutex_unlock(&mut); ++.ft ++.LP ++.RE ++.fi ++ ++ +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_mutexattr_init.man glibc-2.1.3/linuxthreads/man/pthread_mutexattr_init.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_mutexattr_init.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_mutexattr_init.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,84 @@ ++.TH PTHREAD_MUTEXATTR 3 LinuxThreads ++ ++.XREF pthread_mutexattr_destroy ++.XREF pthread_mutexattr_setkind_np ++.XREF pthread_mutexattr_getkind_np ++ ++.SH NAME ++pthread_mutexattr_init, pthread_mutexattr_destroy, pthread_mutexattr_setkind_np, pthread_mutexattr_getkind_np \- mutex creation attributes ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++int pthread_mutexattr_init(pthread_mutexattr_t *attr); ++ ++int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); ++ ++int pthread_mutexattr_setkind_np(pthread_mutexattr_t *attr, int kind); ++ ++int pthread_mutexattr_getkind_np(const pthread_mutexattr_t *attr, int *kind); ++ ++.SH DESCRIPTION ++ ++Mutex attributes can be specified at mutex creation time, by passing a ++mutex attribute object as second argument to !pthread_mutex_init!(3). ++Passing !NULL! is equivalent to passing a mutex attribute object with ++all attributes set to their default values. ++ ++!pthread_mutexattr_init! initializes the mutex attribute object |attr| ++and fills it with default values for the attributes. ++ ++!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. ++ ++LinuxThreads supports only one mutex attribute: the mutex kind, which ++is either !PTHREAD_MUTEX_FAST_NP! for ``fast'' mutexes, ++!PTHREAD_MUTEX_RECURSIVE_NP! for ``recursive'' 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 kind determines what happens if a thread attempts to lock a ++mutex it already owns with !pthread_mutex_lock!(3). If the mutex is of ++the ``fast'' kind, !pthread_mutex_lock!(3) simply suspends the calling ++thread forever. If the mutex is of the ``error checking'' kind, ++!pthread_mutex_lock!(3) returns immediately with the error code ++!EDEADLK!. If the mutex is of the ``recursive'' kind, the call to ++!pthread_mutex_lock!(3) 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!(3) the same number of times before the mutex ++returns to the unlocked state. ++ ++The default mutex kind is ``fast'', that is, !PTHREAD_MUTEX_FAST_NP!. ++ ++!pthread_mutexattr_setkind_np! sets the mutex kind attribute in |attr| ++to the value specified by |kind|. ++ ++!pthread_mutexattr_getkind_np! retrieves the current value of the ++mutex kind attribute in |attr| and stores it in the location pointed ++to by |kind|. ++ ++.SH "RETURN VALUE" ++!pthread_mutexattr_init!, !pthread_mutexattr_destroy! and ++!pthread_mutexattr_getkind_np! always return 0. ++ ++!pthread_mutexattr_setkind_np! returns 0 on success and a non-zero ++error code on error. ++ ++.SH ERRORS ++ ++On error, !pthread_mutexattr_setkind_np! returns the following error code: ++.TP ++!EINVAL! ++|kind| is neither !PTHREAD_MUTEX_FAST_NP! nor !PTHREAD_MUTEX_RECURSIVE_NP! ++nor !PTHREAD_MUTEX_ERRORCHECK_NP! ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!pthread_mutex_init!(3), ++!pthread_mutex_lock!(3), ++!pthread_mutex_unlock!(3). +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_once.man glibc-2.1.3/linuxthreads/man/pthread_once.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_once.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_once.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,34 @@ ++.TH PTHREAD_ONCE 3 LinuxThreads ++ ++.SH NAME ++pthread_once \- once-only initialization ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++pthread_once_t once_control = PTHREAD_ONCE_INIT; ++ ++int pthread_once(pthread_once_t *once_control, void (*init_routine) (void)); ++ ++.SH DESCRIPTION ++ ++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. ++ ++.SH "RETURN VALUE" ++!pthread_once! always returns 0. ++ ++.SH ERRORS ++None. ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_self.man glibc-2.1.3/linuxthreads/man/pthread_self.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_self.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_self.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,23 @@ ++.TH PTHREAD_SELF 3 LinuxThreads ++ ++.SH NAME ++pthread_self \- return identifier of current thread ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++pthread_t pthread_self(void); ++ ++.SH DESCRIPTION ++!pthread_self! return the thread identifier for the calling thread. ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!pthread_equal!(3), ++!pthread_join!(3), ++!pthread_detach!(3), ++!pthread_setschedparam!(3), ++!pthread_getschedparam!(3). ++ +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_setschedparam.man glibc-2.1.3/linuxthreads/man/pthread_setschedparam.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_setschedparam.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_setschedparam.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,79 @@ ++.TH PTHREAD_SETSCHEDPARAM 3 LinuxThreads ++ ++.XREF pthread_getschedparam ++ ++.SH NAME ++pthread_setschedparam, pthread_getschedparam \- control thread scheduling parameters ++ ++.SH SYNOPSIS ++#include <pthread.h> ++ ++int pthread_setschedparam(pthread_t target_thread, int policy, const struct sched_param *param); ++ ++int pthread_getschedparam(pthread_t target_thread, int *policy, struct sched_param *param); ++ ++.SH DESCRIPTION ++ ++!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!(2) for more information on ++scheduling policies. ++ ++The realtime scheduling policies !SCHED_RR! and !SCHED_FIFO! are ++available only to processes with superuser privileges. ++ ++!pthread_getschedparam! retrieves the scheduling policy and scheduling ++parameters for the thread |target_thread| and store them in the ++locations pointed to by |policy| and |param|, respectively. ++ ++.SH "RETURN VALUE" ++!pthread_setschedparam! and !pthread_getschedparam! return 0 on ++success and a non-zero error code on error. ++ ++.SH ERRORS ++On error, !pthread_setschedparam! returns the following error codes: ++.RS ++.TP ++!EINVAL! ++|policy| is not one of !SCHED_OTHER!, !SCHED_RR!, !SCHED_FIFO! ++ ++.TP ++!EINVAL! ++the priority value specified by |param| is not valid for the specified policy ++ ++.TP ++!EPERM! ++the calling process does not have superuser permissions ++ ++.TP ++!ESRCH! ++the |target_thread| is invalid or has already terminated ++ ++.TP ++!EFAULT! ++|param| points outside the process memory space ++.RE ++ ++On error, !pthread_getschedparam! returns the following error codes: ++.RS ++.TP ++!ESRCH! ++the |target_thread| is invalid or has already terminated ++ ++.TP ++!EFAULT! ++|policy| or |param| point outside the process memory space ++.RE ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!sched_setscheduler!(2), ++!sched_getscheduler!(2), ++!sched_getparam!(2), ++!pthread_attr_setschedpolicy!(3), ++!pthread_attr_setschedparam!(3). +diff -Naur ../glibc-2.1.3/linuxthreads/man/pthread_sigmask.man glibc-2.1.3/linuxthreads/man/pthread_sigmask.man +--- ../glibc-2.1.3/linuxthreads/man/pthread_sigmask.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/pthread_sigmask.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,123 @@ ++.TH PTHREAD_SIGNAL 3 LinuxThreads ++ ++.XREF pthread_kill ++.XREF sigwait ++ ++.SH NAME ++pthread_sigmask, pthread_kill, sigwait \- handling of signals in threads ++ ++.SH SYNOPSIS ++#include <pthread.h> ++.br ++#include <signal.h> ++ ++int pthread_sigmask(int how, const sigset_t *newmask, sigset_t *oldmask); ++ ++int pthread_kill(pthread_t thread, int signo); ++ ++int sigwait(const sigset_t *set, int *sig); ++ ++.SH DESCRIPTION ++ ++!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!(2). 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!(2), are shared ++between all threads. ++ ++!pthread_kill! send signal number |signo| to the thread ++|thread|. The signal is delivered and handled as described in ++!kill!(2). ++ ++!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. ++ ++.SH CANCELLATION ++ ++!sigwait! is a cancellation point. ++ ++.SH "RETURN VALUE" ++ ++On success, 0 is returned. On failure, a non-zero error code is returned. ++ ++.SH ERRORS ++ ++The !pthread_sigmask! function returns the following error codes ++on error: ++.RS ++.TP ++!EINVAL! ++|how| is not one of !SIG_SETMASK!, !SIG_BLOCK!, or !SIG_UNBLOCK! ++ ++.TP ++!EFAULT! ++|newmask| or |oldmask| point to invalid addresses ++.RE ++ ++The !pthread_kill! function returns the following error codes ++on error: ++.RS ++.TP ++!EINVAL! ++|signo| is not a valid signal number ++ ++.TP ++!ESRCH! ++the thread |thread| does not exist (e.g. it has already terminated) ++.RE ++ ++The !sigwait! function never returns an error. ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!sigprocmask!(2), ++!kill!(2), ++!sigaction!(2), ++!sigsuspend!(2). ++ ++.SH NOTES ++ ++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!. ++ ++.SH BUGS ++ ++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 -- ++see the Notes section). +diff -Naur ../glibc-2.1.3/linuxthreads/man/sem_init.man glibc-2.1.3/linuxthreads/man/sem_init.man +--- ../glibc-2.1.3/linuxthreads/man/sem_init.man 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/sem_init.man 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,132 @@ ++.TH SEMAPHORES 3 LinuxThreads ++ ++.XREF sem_wait ++.XREF sem_trywait ++.XREF sem_post ++.XREF sem_getvalue ++.XREF sem_destroy ++ ++.SH NAME ++sem_init, sem_wait, sem_trywait, sem_post, sem_getvalue, sem_destroy \- operations on semaphores ++ ++.SH SYNOPSIS ++#include <semaphore.h> ++ ++int sem_init(sem_t *sem, int pshared, unsigned int value); ++ ++int sem_wait(sem_t * sem); ++ ++int sem_trywait(sem_t * sem); ++ ++int sem_post(sem_t * sem); ++ ++int sem_getvalue(sem_t * sem, int * sval); ++ ++int sem_destroy(sem_t * sem); ++ ++.SH DESCRIPTION ++This manual page documents POSIX 1003.1b semaphores, not to be ++confused with SystemV semaphores as described in !ipc!(5), !semctl!(2) ++and !semop!(2). ++ ++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. ++ ++!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). LinuxThreads currently does not ++support process-shared semaphores, thus !sem_init! always returns with ++error !ENOSYS! if |pshared| is not zero. ++ ++!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_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 with ++error !EAGAIN!. ++ ++!sem_post! atomically increases the count of the semaphore pointed to ++by |sem|. This function never blocks and can safely be used in ++asynchronous signal handlers. ++ ++!sem_getvalue! stores in the location pointed to by |sval| the current ++count of the semaphore |sem|. ++ ++!sem_destroy! destroys a semaphore object, freeing the resources it ++might hold. No threads should be waiting on the semaphore at the time ++!sem_destroy! is called. 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. ++ ++.SH CANCELLATION ++ ++!sem_wait! is a cancellation point. ++ ++.SH "ASYNC-SIGNAL SAFETY" ++ ++On processors supporting atomic compare-and-swap (Intel 486, Pentium ++and later, Alpha, PowerPC, MIPS II, Motorola 68k), the !sem_post! ++function is async-signal safe and can therefore 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 the Sparc, the current LinuxThreads ++implementation of !sem_post! is not async-signal safe by lack of the ++required atomic operations. ++ ++.SH "RETURN VALUE" ++ ++The !sem_wait! and !sem_getvalue! functions always return 0. ++All other semaphore functions return 0 on success and -1 on error, in ++addition to writing an error code in !errno!. ++ ++.SH ERRORS ++ ++The !sem_init! function sets !errno! to the following codes on error: ++.RS ++.TP ++!EINVAL! ++|value| exceeds the maximal counter value !SEM_VALUE_MAX! ++.TP ++!ENOSYS! ++|pshared| is not zero ++.RE ++ ++The !sem_trywait! function sets !errno! to the following error code on error: ++.RS ++.TP ++!EAGAIN! ++the semaphore count is currently 0 ++.RE ++ ++The !sem_post! function sets !errno! to the following error code on error: ++.RS ++.TP ++!ERANGE! ++after incrementation, the semaphore value would exceed !SEM_VALUE_MAX! ++(the semaphore count is left unchanged in this case) ++.RE ++ ++The !sem_destroy! function sets !errno! to the following error code on error: ++.RS ++.TP ++!EBUSY! ++some threads are currently blocked waiting on the semaphore. ++.RE ++ ++.SH AUTHOR ++Xavier Leroy <Xavier.Leroy@inria.fr> ++ ++.SH "SEE ALSO" ++!pthread_mutex_init!(3), ++!pthread_cond_init!(3), ++!pthread_cancel!(3), ++!ipc!(5). ++ +diff -Naur ../glibc-2.1.3/linuxthreads/man/troffprepro glibc-2.1.3/linuxthreads/man/troffprepro +--- ../glibc-2.1.3/linuxthreads/man/troffprepro 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/man/troffprepro 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,68 @@ ++#!/usr/local/bin/perl ++ ++$insynopsis = 0; ++ ++open(INPUT, $ARGV[0]) || die("cannot open $ARGV[0]"); ++open(OUTPUT, "> $ARGV[1]") || die("cannot create $ARGV[1]"); ++ ++select(OUTPUT); ++ ++line: ++while(<INPUT>) { ++ if (/^\.XREF (.*)$/) { ++ $xref = $1; ++ $_ = $ARGV[1]; ++ m/^.*\.(([1-8]).*)$/; ++ $suffix = $1; ++ $extension = $2; ++ open(XREF, "> $xref.$suffix"); ++ print XREF ".so man$extension/$ARGV[1]\n"; ++ close(XREF); ++ next line; ++ } ++ if (/^\.SH/) { ++ $insynopsis = /SYNOPSIS/; ++ print $_; ++ next; ++ } ++ if ($insynopsis) { ++ if (/^#/) { ++ print ".B ", $_; ++ } ++ elsif (/^[a-z]/) { ++ chop; ++# if (m/^([a-zA-Z][a-zA-Z0-9_]*\s+[a-zA-Z][a-zA-Z0-9_]*)\(/) { ++# print ".B \"", $1, "\"\n"; ++# $_ = '(' . $'; ++# } ++# s/([a-zA-Z][a-zA-Z0-9_]*)(\s*[,()=])/" \1 "\2/g; ++ s/([ *])([a-zA-Z][a-zA-Z0-9_]*)(\s*[,)=])/\1" \2 "\3/g; ++ print ".BI \"", $_, "\"\n"; ++ } ++ else { ++ print $_; ++ } ++ next; ++ } ++ chop; ++ s/!([^!]+)!\|([^|]+)\|([^\s]*)\s*/\n.BI "\1" "\2\3"\n/g; ++ s/([!|])([^!|]+)\1([^\s]*)\s*/do subst($1,$2,$3)/eg; ++ s/^\n+//; ++ s/\n+$//; ++ s/\n\n+/\n/g; ++ print $_, "\n"; ++} ++ ++close(INPUT); ++close(OUTPUT); ++ ++sub subst { ++ local ($a, $b, $c) = @_; ++ if ($c) { ++ "\n" . ($a eq "!" ? ".BR " : ".IR ") . "\"$b\" $c\n" ++ } else { ++ "\n" . ($a eq "!" ? ".B " : ".I ") . "\"$b\"\n" ++ } ++} ++ ++ +diff -Naur ../glibc-2.1.3/linuxthreads/manager.c glibc-2.1.3/linuxthreads/manager.c +--- ../glibc-2.1.3/linuxthreads/manager.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/manager.c 2000-01-20 18:32:38.000000000 -0800 +@@ -0,0 +1,699 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* The "thread manager" thread: manages creation and termination of threads */ ++ ++#include <errno.h> ++#include <sched.h> ++#include <stddef.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <unistd.h> ++#include <sys/poll.h> /* for poll */ ++#include <sys/mman.h> /* for mmap */ ++#include <sys/param.h> ++#include <sys/time.h> ++#include <sys/wait.h> /* for waitpid macros */ ++ ++#include "pthread.h" ++#include "internals.h" ++#include "spinlock.h" ++#include "restart.h" ++#include "semaphore.h" ++ ++/* Array of active threads. Entry 0 is reserved for the initial thread. */ ++struct pthread_handle_struct __pthread_handles[PTHREAD_THREADS_MAX] = ++{ { LOCK_INITIALIZER, &__pthread_initial_thread, 0}, ++ { LOCK_INITIALIZER, &__pthread_manager_thread, 0}, /* All NULLs */ }; ++ ++/* For debugging purposes put the maximum number of threads in a variable. */ ++const int __linuxthreads_pthread_threads_max = PTHREAD_THREADS_MAX; ++ ++/* Indicate whether at least one thread has a user-defined stack (if 1), ++ or if all threads have stacks supplied by LinuxThreads (if 0). */ ++int __pthread_nonstandard_stacks; ++ ++/* Number of active entries in __pthread_handles (used by gdb) */ ++volatile int __pthread_handles_num = 2; ++ ++/* Whether to use debugger additional actions for thread creation ++ (set to 1 by gdb) */ ++volatile int __pthread_threads_debug; ++ ++/* Globally enabled events. */ ++volatile td_thr_events_t __pthread_threads_events; ++ ++/* Pointer to thread descriptor with last event. */ ++volatile pthread_descr __pthread_last_event; ++ ++/* Mapping from stack segment to thread descriptor. */ ++/* Stack segment numbers are also indices into the __pthread_handles array. */ ++/* Stack segment number 0 is reserved for the initial thread. */ ++ ++static inline pthread_descr thread_segment(int seg) ++{ ++ return (pthread_descr)(THREAD_STACK_START_ADDRESS - (seg - 1) * STACK_SIZE) ++ - 1; ++} ++ ++/* Flag set in signal handler to record child termination */ ++ ++static volatile int terminated_children = 0; ++ ++/* Flag set when the initial thread is blocked on pthread_exit waiting ++ for all other threads to terminate */ ++ ++static int main_thread_exiting = 0; ++ ++/* Counter used to generate unique thread identifier. ++ Thread identifier is pthread_threads_counter + segment. */ ++ ++static pthread_t pthread_threads_counter = 0; ++ ++/* Forward declarations */ ++ ++static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr, ++ void * (*start_routine)(void *), void *arg, ++ sigset_t *mask, int father_pid, ++ int report_events, ++ td_thr_events_t *event_maskp); ++static void pthread_handle_free(pthread_t th_id); ++static void pthread_handle_exit(pthread_descr issuing_thread, int exitcode); ++static void pthread_reap_children(void); ++static void pthread_kill_all_threads(int sig, int main_thread_also); ++ ++/* The server thread managing requests for thread creation and termination */ ++ ++int __pthread_manager(void *arg) ++{ ++ int reqfd = (int) (long int) arg; ++ struct pollfd ufd; ++ sigset_t mask; ++ int n; ++ struct pthread_request request; ++ ++ /* If we have special thread_self processing, initialize it. */ ++#ifdef INIT_THREAD_SELF ++ INIT_THREAD_SELF(&__pthread_manager_thread, 1); ++#endif ++ /* Set the error variable. */ ++ __pthread_manager_thread.p_errnop = &__pthread_manager_thread.p_errno; ++ __pthread_manager_thread.p_h_errnop = &__pthread_manager_thread.p_h_errno; ++ /* Block all signals except __pthread_sig_cancel and SIGTRAP */ ++ sigfillset(&mask); ++ sigdelset(&mask, __pthread_sig_cancel); /* for thread termination */ ++ sigdelset(&mask, SIGTRAP); /* for debugging purposes */ ++ sigprocmask(SIG_SETMASK, &mask, NULL); ++ /* Raise our priority to match that of main thread */ ++ __pthread_manager_adjust_prio(__pthread_main_thread->p_priority); ++ /* Synchronize debugging of the thread manager */ ++ n = __libc_read(reqfd, (char *)&request, sizeof(request)); ++ ASSERT(n == sizeof(request) && request.req_kind == REQ_DEBUG); ++ ufd.fd = reqfd; ++ ufd.events = POLLIN; ++ /* Enter server loop */ ++ while(1) { ++ n = __poll(&ufd, 1, 2000); ++ ++ /* Check for termination of the main thread */ ++ if (getppid() == 1) { ++ pthread_kill_all_threads(SIGKILL, 0); ++ _exit(0); ++ } ++ /* Check for dead children */ ++ if (terminated_children) { ++ terminated_children = 0; ++ pthread_reap_children(); ++ } ++ /* Read and execute request */ ++ if (n == 1 && (ufd.revents & POLLIN)) { ++ n = __libc_read(reqfd, (char *)&request, sizeof(request)); ++ ASSERT(n == sizeof(request)); ++ switch(request.req_kind) { ++ case REQ_CREATE: ++ request.req_thread->p_retcode = ++ pthread_handle_create((pthread_t *) &request.req_thread->p_retval, ++ request.req_args.create.attr, ++ request.req_args.create.fn, ++ request.req_args.create.arg, ++ &request.req_args.create.mask, ++ request.req_thread->p_pid, ++ request.req_thread->p_report_events, ++ &request.req_thread->p_eventbuf.eventmask); ++ restart(request.req_thread); ++ break; ++ case REQ_FREE: ++ pthread_handle_free(request.req_args.free.thread_id); ++ break; ++ case REQ_PROCESS_EXIT: ++ pthread_handle_exit(request.req_thread, ++ request.req_args.exit.code); ++ break; ++ case REQ_MAIN_THREAD_EXIT: ++ main_thread_exiting = 1; ++ if (__pthread_main_thread->p_nextlive == __pthread_main_thread) { ++ restart(__pthread_main_thread); ++ return 0; ++ } ++ break; ++ case REQ_POST: ++ __new_sem_post(request.req_args.post); ++ break; ++ case REQ_DEBUG: ++ /* Make gdb aware of new thread and gdb will restart the ++ new thread when it is ready to handle the new thread. */ ++ if (__pthread_threads_debug && __pthread_sig_debug > 0) ++ raise(__pthread_sig_debug); ++ break; ++ } ++ } ++ } ++} ++ ++int __pthread_manager_event(void *arg) ++{ ++ /* If we have special thread_self processing, initialize it. */ ++#ifdef INIT_THREAD_SELF ++ INIT_THREAD_SELF(&__pthread_manager_thread, 1); ++#endif ++ ++ /* Get the lock the manager will free once all is correctly set up. */ ++ __pthread_lock (THREAD_GETMEM((&__pthread_manager_thread), p_lock), NULL); ++ /* Free it immediately. */ ++ __pthread_unlock (THREAD_GETMEM((&__pthread_manager_thread), p_lock)); ++ ++ return __pthread_manager(arg); ++} ++ ++/* Process creation */ ++ ++static int pthread_start_thread(void *arg) ++{ ++ pthread_descr self = (pthread_descr) arg; ++ struct pthread_request request; ++ void * outcome; ++ /* Initialize special thread_self processing, if any. */ ++#ifdef INIT_THREAD_SELF ++ INIT_THREAD_SELF(self, self->p_nr); ++#endif ++ /* Make sure our pid field is initialized, just in case we get there ++ before our father has initialized it. */ ++ THREAD_SETMEM(self, p_pid, __getpid()); ++ /* Initial signal mask is that of the creating thread. (Otherwise, ++ we'd just inherit the mask of the thread manager.) */ ++ sigprocmask(SIG_SETMASK, &self->p_start_args.mask, NULL); ++ /* Set the scheduling policy and priority for the new thread, if needed */ ++ if (THREAD_GETMEM(self, p_start_args.schedpolicy) >= 0) ++ /* Explicit scheduling attributes were provided: apply them */ ++ __sched_setscheduler(THREAD_GETMEM(self, p_pid), ++ THREAD_GETMEM(self, p_start_args.schedpolicy), ++ &self->p_start_args.schedparam); ++ else if (__pthread_manager_thread.p_priority > 0) ++ /* Default scheduling required, but thread manager runs in realtime ++ scheduling: switch new thread to SCHED_OTHER policy */ ++ { ++ struct sched_param default_params; ++ default_params.sched_priority = 0; ++ __sched_setscheduler(THREAD_GETMEM(self, p_pid), ++ SCHED_OTHER, &default_params); ++ } ++ /* Make gdb aware of new thread */ ++ if (__pthread_threads_debug && __pthread_sig_debug > 0) { ++ request.req_thread = self; ++ request.req_kind = REQ_DEBUG; ++ __libc_write(__pthread_manager_request, ++ (char *) &request, sizeof(request)); ++ suspend(self); ++ } ++ /* Run the thread code */ ++ outcome = self->p_start_args.start_routine(THREAD_GETMEM(self, ++ p_start_args.arg)); ++ /* Exit with the given return value */ ++ pthread_exit(outcome); ++ return 0; ++} ++ ++static int pthread_start_thread_event(void *arg) ++{ ++ pthread_descr self = (pthread_descr) arg; ++ ++#ifdef INIT_THREAD_SELF ++ INIT_THREAD_SELF(self, self->p_nr); ++#endif ++ /* Make sure our pid field is initialized, just in case we get there ++ before our father has initialized it. */ ++ THREAD_SETMEM(self, p_pid, __getpid()); ++ /* Get the lock the manager will free once all is correctly set up. */ ++ __pthread_lock (THREAD_GETMEM(self, p_lock), NULL); ++ /* Free it immediately. */ ++ __pthread_unlock (THREAD_GETMEM(self, p_lock)); ++ ++ /* Continue with the real function. */ ++ return pthread_start_thread (arg); ++} ++ ++static int pthread_allocate_stack(const pthread_attr_t *attr, ++ pthread_descr default_new_thread, ++ int pagesize, ++ pthread_descr * out_new_thread, ++ char ** out_new_thread_bottom, ++ char ** out_guardaddr, ++ size_t * out_guardsize) ++{ ++ pthread_descr new_thread; ++ char * new_thread_bottom; ++ char * guardaddr; ++ size_t stacksize, guardsize; ++ ++ if (attr != NULL && attr->__stackaddr_set) ++ { ++ /* The user provided a stack. */ ++ new_thread = ++ (pthread_descr) ((long)(attr->__stackaddr) & -sizeof(void *)) - 1; ++ new_thread_bottom = (char *) attr->__stackaddr - attr->__stacksize; ++ guardaddr = NULL; ++ guardsize = 0; ++ __pthread_nonstandard_stacks = 1; ++ } ++ else ++ { ++ stacksize = STACK_SIZE - pagesize; ++ if (attr != NULL) ++ stacksize = MIN (stacksize, roundup(attr->__stacksize, pagesize)); ++ /* Allocate space for stack and thread descriptor at default address */ ++ new_thread = default_new_thread; ++ new_thread_bottom = (char *) (new_thread + 1) - stacksize; ++ if (mmap((caddr_t)((char *)(new_thread + 1) - INITIAL_STACK_SIZE), ++ INITIAL_STACK_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, ++ MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED | MAP_GROWSDOWN, ++ -1, 0) == MAP_FAILED) ++ /* Bad luck, this segment is already mapped. */ ++ return -1; ++ /* We manage to get a stack. Now see whether we need a guard ++ and allocate it if necessary. Notice that the default ++ attributes (stack_size = STACK_SIZE - pagesize) do not need ++ a guard page, since the RLIMIT_STACK soft limit prevents stacks ++ from running into one another. */ ++ if (stacksize == STACK_SIZE - pagesize) ++ { ++ /* We don't need a guard page. */ ++ guardaddr = NULL; ++ guardsize = 0; ++ } ++ else ++ { ++ /* Put a bad page at the bottom of the stack */ ++ guardsize = attr->__guardsize; ++ guardaddr = (void *)new_thread_bottom - guardsize; ++ if (mmap ((caddr_t) guardaddr, guardsize, 0, MAP_FIXED, -1, 0) ++ == MAP_FAILED) ++ { ++ /* We don't make this an error. */ ++ guardaddr = NULL; ++ guardsize = 0; ++ } ++ } ++ } ++ /* Clear the thread data structure. */ ++ memset (new_thread, '\0', sizeof (*new_thread)); ++ *out_new_thread = new_thread; ++ *out_new_thread_bottom = new_thread_bottom; ++ *out_guardaddr = guardaddr; ++ *out_guardsize = guardsize; ++ return 0; ++} ++ ++static int pthread_handle_create(pthread_t *thread, const pthread_attr_t *attr, ++ void * (*start_routine)(void *), void *arg, ++ sigset_t * mask, int father_pid, ++ int report_events, ++ td_thr_events_t *event_maskp) ++{ ++ size_t sseg; ++ int pid; ++ pthread_descr new_thread; ++ char * new_thread_bottom; ++ pthread_t new_thread_id; ++ char *guardaddr = NULL; ++ size_t guardsize = 0; ++ int pagesize = __getpagesize(); ++ ++ /* First check whether we have to change the policy and if yes, whether ++ we can do this. Normally this should be done by examining the ++ return value of the __sched_setscheduler call in pthread_start_thread ++ but this is hard to implement. FIXME */ ++ if (attr != NULL && attr->__schedpolicy != SCHED_OTHER && geteuid () != 0) ++ return EPERM; ++ /* Find a free segment for the thread, and allocate a stack if needed */ ++ for (sseg = 2; ; sseg++) ++ { ++ if (sseg >= PTHREAD_THREADS_MAX) ++ return EAGAIN; ++ if (__pthread_handles[sseg].h_descr != NULL) ++ continue; ++ if (pthread_allocate_stack(attr, thread_segment(sseg), pagesize, ++ &new_thread, &new_thread_bottom, ++ &guardaddr, &guardsize) == 0) ++ break; ++ } ++ __pthread_handles_num++; ++ /* Allocate new thread identifier */ ++ pthread_threads_counter += PTHREAD_THREADS_MAX; ++ new_thread_id = sseg + pthread_threads_counter; ++ /* Initialize the thread descriptor. Elements which have to be ++ initialized to zero already have this value. */ ++ new_thread->p_tid = new_thread_id; ++ new_thread->p_lock = &(__pthread_handles[sseg].h_lock); ++ new_thread->p_cancelstate = PTHREAD_CANCEL_ENABLE; ++ new_thread->p_canceltype = PTHREAD_CANCEL_DEFERRED; ++ new_thread->p_errnop = &new_thread->p_errno; ++ new_thread->p_h_errnop = &new_thread->p_h_errno; ++ new_thread->p_guardaddr = guardaddr; ++ new_thread->p_guardsize = guardsize; ++ new_thread->p_self = new_thread; ++ new_thread->p_nr = sseg; ++ /* Initialize the thread handle */ ++ __pthread_init_lock(&__pthread_handles[sseg].h_lock); ++ __pthread_handles[sseg].h_descr = new_thread; ++ __pthread_handles[sseg].h_bottom = new_thread_bottom; ++ /* Determine scheduling parameters for the thread */ ++ new_thread->p_start_args.schedpolicy = -1; ++ if (attr != NULL) { ++ new_thread->p_detached = attr->__detachstate; ++ new_thread->p_userstack = attr->__stackaddr_set; ++ ++ switch(attr->__inheritsched) { ++ case PTHREAD_EXPLICIT_SCHED: ++ new_thread->p_start_args.schedpolicy = attr->__schedpolicy; ++ memcpy (&new_thread->p_start_args.schedparam, &attr->__schedparam, ++ sizeof (struct sched_param)); ++ break; ++ case PTHREAD_INHERIT_SCHED: ++ new_thread->p_start_args.schedpolicy = __sched_getscheduler(father_pid); ++ __sched_getparam(father_pid, &new_thread->p_start_args.schedparam); ++ break; ++ } ++ new_thread->p_priority = ++ new_thread->p_start_args.schedparam.sched_priority; ++ } ++ /* Finish setting up arguments to pthread_start_thread */ ++ new_thread->p_start_args.start_routine = start_routine; ++ new_thread->p_start_args.arg = arg; ++ new_thread->p_start_args.mask = *mask; ++ /* Raise priority of thread manager if needed */ ++ __pthread_manager_adjust_prio(new_thread->p_priority); ++ /* Do the cloning. We have to use two different functions depending ++ on whether we are debugging or not. */ ++ pid = 0; /* Note that the thread never can have PID zero. */ ++ if (report_events) ++ { ++ /* See whether the TD_CREATE event bit is set in any of the ++ masks. */ ++ int idx = __td_eventword (TD_CREATE); ++ uint32_t mask = __td_eventmask (TD_CREATE); ++ ++ if ((mask & (__pthread_threads_events.event_bits[idx] ++ | event_maskp->event_bits[idx])) != 0) ++ { ++ /* Lock the mutex the child will use now so that it will stop. */ ++ __pthread_lock(new_thread->p_lock, NULL); ++ ++ /* We have to report this event. */ ++ pid = __clone(pthread_start_thread_event, (void **) new_thread, ++ CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | ++ __pthread_sig_cancel, new_thread); ++ if (pid != -1) ++ { ++ /* Now fill in the information about the new thread in ++ the newly created thread's data structure. We cannot let ++ the new thread do this since we don't know whether it was ++ already scheduled when we send the event. */ ++ new_thread->p_eventbuf.eventdata = new_thread; ++ new_thread->p_eventbuf.eventnum = TD_CREATE; ++ __pthread_last_event = new_thread; ++ ++ /* We have to set the PID here since the callback function ++ in the debug library will need it and we cannot guarantee ++ the child got scheduled before the debugger. */ ++ new_thread->p_pid = pid; ++ ++ /* Now call the function which signals the event. */ ++ __linuxthreads_create_event (); ++ ++ /* Now restart the thread. */ ++ __pthread_unlock(new_thread->p_lock); ++ } ++ } ++ } ++ if (pid == 0) ++ pid = __clone(pthread_start_thread, (void **) new_thread, ++ CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | ++ __pthread_sig_cancel, new_thread); ++ /* Check if cloning succeeded */ ++ if (pid == -1) { ++ /* Free the stack if we allocated it */ ++ if (attr == NULL || !attr->__stackaddr_set) ++ { ++ if (new_thread->p_guardsize != 0) ++ munmap(new_thread->p_guardaddr, new_thread->p_guardsize); ++ munmap((caddr_t)((char *)(new_thread+1) - INITIAL_STACK_SIZE), ++ INITIAL_STACK_SIZE); ++ } ++ __pthread_handles[sseg].h_descr = NULL; ++ __pthread_handles[sseg].h_bottom = NULL; ++ __pthread_handles_num--; ++ return errno; ++ } ++ /* Insert new thread in doubly linked list of active threads */ ++ new_thread->p_prevlive = __pthread_main_thread; ++ new_thread->p_nextlive = __pthread_main_thread->p_nextlive; ++ __pthread_main_thread->p_nextlive->p_prevlive = new_thread; ++ __pthread_main_thread->p_nextlive = new_thread; ++ /* Set pid field of the new thread, in case we get there before the ++ child starts. */ ++ new_thread->p_pid = pid; ++ /* We're all set */ ++ *thread = new_thread_id; ++ return 0; ++} ++ ++ ++/* Try to free the resources of a thread when requested by pthread_join ++ or pthread_detach on a terminated thread. */ ++ ++static void pthread_free(pthread_descr th) ++{ ++ pthread_handle handle; ++ pthread_readlock_info *iter, *next; ++ ++ ASSERT(th->p_exited); ++ /* Make the handle invalid */ ++ handle = thread_handle(th->p_tid); ++ __pthread_lock(&handle->h_lock, NULL); ++ handle->h_descr = NULL; ++ handle->h_bottom = (char *)(-1L); ++ __pthread_unlock(&handle->h_lock); ++#ifdef FREE_THREAD_SELF ++ FREE_THREAD_SELF(th, th->p_nr); ++#endif ++ /* One fewer threads in __pthread_handles */ ++ __pthread_handles_num--; ++ ++ /* Destroy read lock list, and list of free read lock structures. ++ If the former is not empty, it means the thread exited while ++ holding read locks! */ ++ ++ for (iter = th->p_readlock_list; iter != NULL; iter = next) ++ { ++ next = iter->pr_next; ++ free(iter); ++ } ++ ++ for (iter = th->p_readlock_free; iter != NULL; iter = next) ++ { ++ next = iter->pr_next; ++ free(iter); ++ } ++ ++ /* If initial thread, nothing to free */ ++ if (th == &__pthread_initial_thread) return; ++ if (!th->p_userstack) ++ { ++ /* Free the stack and thread descriptor area */ ++ if (th->p_guardsize != 0) ++ munmap(th->p_guardaddr, th->p_guardsize); ++ munmap((caddr_t) ((char *)(th+1) - STACK_SIZE), STACK_SIZE); ++ } ++} ++ ++/* Handle threads that have exited */ ++ ++static void pthread_exited(pid_t pid) ++{ ++ pthread_descr th; ++ int detached; ++ /* Find thread with that pid */ ++ for (th = __pthread_main_thread->p_nextlive; ++ th != __pthread_main_thread; ++ th = th->p_nextlive) { ++ if (th->p_pid == pid) { ++ /* Remove thread from list of active threads */ ++ th->p_nextlive->p_prevlive = th->p_prevlive; ++ th->p_prevlive->p_nextlive = th->p_nextlive; ++ /* Mark thread as exited, and if detached, free its resources */ ++ __pthread_lock(th->p_lock, NULL); ++ th->p_exited = 1; ++ /* If we have to signal this event do it now. */ ++ if (th->p_report_events) ++ { ++ /* See whether TD_DEATH is in any of the mask. */ ++ int idx = __td_eventword (TD_REAP); ++ uint32_t mask = __td_eventmask (TD_REAP); ++ ++ if ((mask & (__pthread_threads_events.event_bits[idx] ++ | th->p_eventbuf.eventmask.event_bits[idx])) != 0) ++ { ++ /* Yep, we have to signal the death. */ ++ th->p_eventbuf.eventnum = TD_DEATH; ++ th->p_eventbuf.eventdata = th; ++ __pthread_last_event = th; ++ ++ /* Now call the function to signal the event. */ ++ __linuxthreads_reap_event(); ++ } ++ } ++ detached = th->p_detached; ++ __pthread_unlock(th->p_lock); ++ if (detached) ++ pthread_free(th); ++ break; ++ } ++ } ++ /* If all threads have exited and the main thread is pending on a ++ pthread_exit, wake up the main thread and terminate ourselves. */ ++ if (main_thread_exiting && ++ __pthread_main_thread->p_nextlive == __pthread_main_thread) { ++ restart(__pthread_main_thread); ++ _exit(0); ++ } ++} ++ ++static void pthread_reap_children(void) ++{ ++ pid_t pid; ++ int status; ++ ++ while ((pid = __libc_waitpid(-1, &status, WNOHANG | __WCLONE)) > 0) { ++ pthread_exited(pid); ++ if (WIFSIGNALED(status)) { ++ /* If a thread died due to a signal, send the same signal to ++ all other threads, including the main thread. */ ++ pthread_kill_all_threads(WTERMSIG(status), 1); ++ _exit(0); ++ } ++ } ++} ++ ++/* Try to free the resources of a thread when requested by pthread_join ++ or pthread_detach on a terminated thread. */ ++ ++static void pthread_handle_free(pthread_t th_id) ++{ ++ pthread_handle handle = thread_handle(th_id); ++ pthread_descr th; ++ ++ __pthread_lock(&handle->h_lock, NULL); ++ if (invalid_handle(handle, th_id)) { ++ /* pthread_reap_children has deallocated the thread already, ++ nothing needs to be done */ ++ __pthread_unlock(&handle->h_lock); ++ return; ++ } ++ th = handle->h_descr; ++ if (th->p_exited) { ++ __pthread_unlock(&handle->h_lock); ++ pthread_free(th); ++ } else { ++ /* The Unix process of the thread is still running. ++ Mark the thread as detached so that the thread manager will ++ deallocate its resources when the Unix process exits. */ ++ th->p_detached = 1; ++ __pthread_unlock(&handle->h_lock); ++ } ++} ++ ++/* Send a signal to all running threads */ ++ ++static void pthread_kill_all_threads(int sig, int main_thread_also) ++{ ++ pthread_descr th; ++ for (th = __pthread_main_thread->p_nextlive; ++ th != __pthread_main_thread; ++ th = th->p_nextlive) { ++ kill(th->p_pid, sig); ++ } ++ if (main_thread_also) { ++ kill(__pthread_main_thread->p_pid, sig); ++ } ++} ++ ++/* Process-wide exit() */ ++ ++static void pthread_handle_exit(pthread_descr issuing_thread, int exitcode) ++{ ++ pthread_descr th; ++ __pthread_exit_requested = 1; ++ __pthread_exit_code = exitcode; ++ /* Send the CANCEL signal to all running threads, including the main ++ thread, but excluding the thread from which the exit request originated ++ (that thread must complete the exit, e.g. calling atexit functions ++ and flushing stdio buffers). */ ++ for (th = issuing_thread->p_nextlive; ++ th != issuing_thread; ++ th = th->p_nextlive) { ++ kill(th->p_pid, __pthread_sig_cancel); ++ } ++ /* Now, wait for all these threads, so that they don't become zombies ++ and their times are properly added to the thread manager's times. */ ++ for (th = issuing_thread->p_nextlive; ++ th != issuing_thread; ++ th = th->p_nextlive) { ++ waitpid(th->p_pid, NULL, __WCLONE); ++ } ++ restart(issuing_thread); ++ _exit(0); ++} ++ ++/* Handler for __pthread_sig_cancel in thread manager thread */ ++ ++void __pthread_manager_sighandler(int sig) ++{ ++ terminated_children = 1; ++} ++ ++/* Adjust priority of thread manager so that it always run at a priority ++ higher than all threads */ ++ ++void __pthread_manager_adjust_prio(int thread_prio) ++{ ++ struct sched_param param; ++ ++ if (thread_prio <= __pthread_manager_thread.p_priority) return; ++ param.sched_priority = ++ thread_prio < __sched_get_priority_max(SCHED_FIFO) ++ ? thread_prio + 1 : thread_prio; ++ __sched_setscheduler(__pthread_manager_thread.p_pid, SCHED_FIFO, ¶m); ++ __pthread_manager_thread.p_priority = thread_prio; ++} +diff -Naur ../glibc-2.1.3/linuxthreads/mutex.c glibc-2.1.3/linuxthreads/mutex.c +--- ../glibc-2.1.3/linuxthreads/mutex.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/mutex.c 1998-11-19 09:03:45.000000000 -0800 +@@ -0,0 +1,199 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* Mutexes */ ++ ++#include <errno.h> ++#include <sched.h> ++#include <stddef.h> ++#include "pthread.h" ++#include "internals.h" ++#include "spinlock.h" ++#include "queue.h" ++#include "restart.h" ++ ++int __pthread_mutex_init(pthread_mutex_t * mutex, ++ const pthread_mutexattr_t * mutex_attr) ++{ ++ __pthread_init_lock(&mutex->__m_lock); ++ mutex->__m_kind = ++ mutex_attr == NULL ? PTHREAD_MUTEX_FAST_NP : mutex_attr->__mutexkind; ++ mutex->__m_count = 0; ++ mutex->__m_owner = NULL; ++ return 0; ++} ++strong_alias (__pthread_mutex_init, pthread_mutex_init) ++ ++int __pthread_mutex_destroy(pthread_mutex_t * mutex) ++{ ++ if (mutex->__m_lock.__status != 0) return EBUSY; ++ return 0; ++} ++strong_alias (__pthread_mutex_destroy, pthread_mutex_destroy) ++ ++int __pthread_mutex_trylock(pthread_mutex_t * mutex) ++{ ++ pthread_descr self; ++ int retcode; ++ ++ switch(mutex->__m_kind) { ++ case PTHREAD_MUTEX_FAST_NP: ++ retcode = __pthread_trylock(&mutex->__m_lock); ++ return retcode; ++ case PTHREAD_MUTEX_RECURSIVE_NP: ++ self = thread_self(); ++ if (mutex->__m_owner == self) { ++ mutex->__m_count++; ++ return 0; ++ } ++ retcode = __pthread_trylock(&mutex->__m_lock); ++ if (retcode == 0) { ++ mutex->__m_owner = self; ++ mutex->__m_count = 0; ++ } ++ return retcode; ++ case PTHREAD_MUTEX_ERRORCHECK_NP: ++ retcode = __pthread_trylock(&mutex->__m_lock); ++ if (retcode == 0) { ++ mutex->__m_owner = thread_self(); ++ } ++ return retcode; ++ default: ++ return EINVAL; ++ } ++} ++strong_alias (__pthread_mutex_trylock, pthread_mutex_trylock) ++ ++int __pthread_mutex_lock(pthread_mutex_t * mutex) ++{ ++ pthread_descr self; ++ ++ switch(mutex->__m_kind) { ++ case PTHREAD_MUTEX_FAST_NP: ++ __pthread_lock(&mutex->__m_lock, NULL); ++ return 0; ++ case PTHREAD_MUTEX_RECURSIVE_NP: ++ self = thread_self(); ++ if (mutex->__m_owner == self) { ++ mutex->__m_count++; ++ return 0; ++ } ++ __pthread_lock(&mutex->__m_lock, self); ++ mutex->__m_owner = self; ++ mutex->__m_count = 0; ++ return 0; ++ case PTHREAD_MUTEX_ERRORCHECK_NP: ++ self = thread_self(); ++ if (mutex->__m_owner == self) return EDEADLK; ++ __pthread_lock(&mutex->__m_lock, self); ++ mutex->__m_owner = self; ++ return 0; ++ default: ++ return EINVAL; ++ } ++} ++strong_alias (__pthread_mutex_lock, pthread_mutex_lock) ++ ++int __pthread_mutex_unlock(pthread_mutex_t * mutex) ++{ ++ switch (mutex->__m_kind) { ++ case PTHREAD_MUTEX_FAST_NP: ++ __pthread_unlock(&mutex->__m_lock); ++ return 0; ++ case PTHREAD_MUTEX_RECURSIVE_NP: ++ if (mutex->__m_count > 0) { ++ mutex->__m_count--; ++ return 0; ++ } ++ mutex->__m_owner = NULL; ++ __pthread_unlock(&mutex->__m_lock); ++ return 0; ++ case PTHREAD_MUTEX_ERRORCHECK_NP: ++ if (mutex->__m_owner != thread_self() || mutex->__m_lock.__status == 0) ++ return EPERM; ++ mutex->__m_owner = NULL; ++ __pthread_unlock(&mutex->__m_lock); ++ return 0; ++ default: ++ return EINVAL; ++ } ++} ++strong_alias (__pthread_mutex_unlock, pthread_mutex_unlock) ++ ++int __pthread_mutexattr_init(pthread_mutexattr_t *attr) ++{ ++ attr->__mutexkind = PTHREAD_MUTEX_FAST_NP; ++ return 0; ++} ++strong_alias (__pthread_mutexattr_init, pthread_mutexattr_init) ++ ++int __pthread_mutexattr_destroy(pthread_mutexattr_t *attr) ++{ ++ return 0; ++} ++strong_alias (__pthread_mutexattr_destroy, pthread_mutexattr_destroy) ++ ++int __pthread_mutexattr_settype(pthread_mutexattr_t *attr, int kind) ++{ ++ if (kind != PTHREAD_MUTEX_FAST_NP ++ && kind != PTHREAD_MUTEX_RECURSIVE_NP ++ && kind != PTHREAD_MUTEX_ERRORCHECK_NP) ++ return EINVAL; ++ attr->__mutexkind = kind; ++ return 0; ++} ++weak_alias (__pthread_mutexattr_settype, pthread_mutexattr_settype) ++strong_alias ( __pthread_mutexattr_settype, __pthread_mutexattr_setkind_np) ++weak_alias (__pthread_mutexattr_setkind_np, pthread_mutexattr_setkind_np) ++ ++int __pthread_mutexattr_gettype(const pthread_mutexattr_t *attr, int *kind) ++{ ++ *kind = attr->__mutexkind; ++ return 0; ++} ++weak_alias (__pthread_mutexattr_gettype, pthread_mutexattr_gettype) ++strong_alias (__pthread_mutexattr_gettype, __pthread_mutexattr_getkind_np) ++weak_alias (__pthread_mutexattr_getkind_np, pthread_mutexattr_getkind_np) ++ ++/* Once-only execution */ ++ ++static pthread_mutex_t once_masterlock = PTHREAD_MUTEX_INITIALIZER; ++static pthread_cond_t once_finished = PTHREAD_COND_INITIALIZER; ++ ++enum { NEVER = 0, IN_PROGRESS = 1, DONE = 2 }; ++ ++int __pthread_once(pthread_once_t * once_control, void (*init_routine)(void)) ++{ ++ /* Test without locking first for speed */ ++ if (*once_control == DONE) return 0; ++ /* Lock and test again */ ++ pthread_mutex_lock(&once_masterlock); ++ /* If init_routine is being called from another routine, wait until ++ it completes. */ ++ while (*once_control == IN_PROGRESS) { ++ pthread_cond_wait(&once_finished, &once_masterlock); ++ } ++ /* Here *once_control is stable and either NEVER or DONE. */ ++ if (*once_control == NEVER) { ++ *once_control = IN_PROGRESS; ++ pthread_mutex_unlock(&once_masterlock); ++ init_routine(); ++ pthread_mutex_lock(&once_masterlock); ++ *once_control = DONE; ++ pthread_cond_broadcast(&once_finished); ++ } ++ pthread_mutex_unlock(&once_masterlock); ++ return 0; ++} ++strong_alias (__pthread_once, pthread_once) +diff -Naur ../glibc-2.1.3/linuxthreads/no-tsd.c glibc-2.1.3/linuxthreads/no-tsd.c +--- ../glibc-2.1.3/linuxthreads/no-tsd.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/no-tsd.c 1999-06-30 08:55:08.000000000 -0700 +@@ -0,0 +1,33 @@ ++/* libc-internal interface for thread-specific data. ++ Copyright (C) 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 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. */ ++ ++#include <bits/libc-tsd.h> ++ ++/* This file provides uinitialized (common) definitions for the ++ hooks used internally by libc to access thread-specific data. ++ ++ When -lpthread is used, it provides initialized definitions for these ++ variables (in specific.c), which override these uninitialized definitions. ++ ++ If -lpthread is not used, these uninitialized variables default to zero, ++ which the __libc_tsd_* macros check for. */ ++ ++void *(*__libc_internal_tsd_get) __P ((enum __libc_tsd_key_t)); ++int (*__libc_internal_tsd_set) __P ((enum __libc_tsd_key_t, ++ __const void *)); +diff -Naur ../glibc-2.1.3/linuxthreads/oldsemaphore.c glibc-2.1.3/linuxthreads/oldsemaphore.c +--- ../glibc-2.1.3/linuxthreads/oldsemaphore.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/oldsemaphore.c 2000-01-06 15:40:57.000000000 -0800 +@@ -0,0 +1,235 @@ ++/* ++ * This file contains the old semaphore code that we need to ++ * preserve for glibc-2.0 backwards compatibility. Port to glibc 2.1 ++ * done by Cristian Gafton. ++ */ ++ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* Semaphores a la POSIX 1003.1b */ ++ ++#include <errno.h> ++#include "pthread.h" ++#include "internals.h" ++#include "spinlock.h" ++#include "restart.h" ++#include "queue.h" ++ ++typedef struct { ++ long int sem_status; ++ int sem_spinlock; ++} old_sem_t; ++ ++/* Maximum value the semaphore can have. */ ++#define SEM_VALUE_MAX ((int) ((~0u) >> 1)) ++ ++static inline int sem_compare_and_swap(old_sem_t *sem, long oldval, long newval) ++{ ++ return compare_and_swap(&sem->sem_status, oldval, newval, &sem->sem_spinlock); ++} ++ ++/* The state of a semaphore is represented by a long int encoding ++ either the semaphore count if >= 0 and no thread is waiting on it, ++ or the head of the list of threads waiting for the semaphore. ++ To distinguish the two cases, we encode the semaphore count N ++ as 2N+1, so that it has the lowest bit set. ++ ++ A sequence of sem_wait operations on a semaphore initialized to N ++ result in the following successive states: ++ 2N+1, 2N-1, ..., 3, 1, &first_waiting_thread, &second_waiting_thread, ... ++*/ ++ ++static void sem_restart_list(pthread_descr waiting); ++ ++int __old_sem_init(old_sem_t *sem, int pshared, unsigned int value) ++{ ++ if (value > SEM_VALUE_MAX) { ++ errno = EINVAL; ++ return -1; ++ } ++ if (pshared) { ++ errno = ENOSYS; ++ return -1; ++ } ++ sem->sem_spinlock = 0; ++ sem->sem_status = ((long)value << 1) + 1; ++ return 0; ++} ++ ++/* Function called by pthread_cancel to remove the thread from ++ waiting inside __old_sem_wait. Here we simply unconditionally ++ indicate that the thread is to be woken, by returning 1. */ ++ ++static int old_sem_extricate_func(void *obj, pthread_descr th) ++{ ++ return 1; ++} ++ ++int __old_sem_wait(old_sem_t * sem) ++{ ++ long oldstatus, newstatus; ++ volatile pthread_descr self = thread_self(); ++ pthread_descr * th; ++ pthread_extricate_if extr; ++ ++ /* Set up extrication interface */ ++ extr.pu_object = 0; ++ extr.pu_extricate_func = old_sem_extricate_func; ++ ++ while (1) { ++ /* Register extrication interface */ ++ __pthread_set_own_extricate_if(self, &extr); ++ do { ++ oldstatus = sem->sem_status; ++ if ((oldstatus & 1) && (oldstatus != 1)) ++ newstatus = oldstatus - 2; ++ else { ++ newstatus = (long) self; ++ self->p_nextwaiting = (pthread_descr) oldstatus; ++ } ++ } ++ while (! sem_compare_and_swap(sem, oldstatus, newstatus)); ++ if (newstatus & 1) { ++ /* We got the semaphore. */ ++ __pthread_set_own_extricate_if(self, 0); ++ return 0; ++ } ++ /* Wait for sem_post or cancellation */ ++ suspend(self); ++ __pthread_set_own_extricate_if(self, 0); ++ ++ /* This is a cancellation point */ ++ if (self->p_canceled && self->p_cancelstate == PTHREAD_CANCEL_ENABLE) { ++ /* Remove ourselves from the waiting list if we're still on it */ ++ /* First check if we're at the head of the list. */ ++ do { ++ oldstatus = sem->sem_status; ++ if (oldstatus != (long) self) break; ++ newstatus = (long) self->p_nextwaiting; ++ } ++ while (! sem_compare_and_swap(sem, oldstatus, newstatus)); ++ /* Now, check if we're somewhere in the list. ++ There's a race condition with sem_post here, but it does not matter: ++ the net result is that at the time pthread_exit is called, ++ self is no longer reachable from sem->sem_status. */ ++ if (oldstatus != (long) self && (oldstatus & 1) == 0) { ++ for (th = &(((pthread_descr) oldstatus)->p_nextwaiting); ++ *th != NULL && *th != (pthread_descr) 1; ++ th = &((*th)->p_nextwaiting)) { ++ if (*th == self) { ++ *th = self->p_nextwaiting; ++ break; ++ } ++ } ++ } ++ pthread_exit(PTHREAD_CANCELED); ++ } ++ } ++} ++ ++int __old_sem_trywait(old_sem_t * sem) ++{ ++ long oldstatus, newstatus; ++ ++ do { ++ oldstatus = sem->sem_status; ++ if ((oldstatus & 1) == 0 || (oldstatus == 1)) { ++ errno = EAGAIN; ++ return -1; ++ } ++ newstatus = oldstatus - 2; ++ } ++ while (! sem_compare_and_swap(sem, oldstatus, newstatus)); ++ return 0; ++} ++ ++int __old_sem_post(old_sem_t * sem) ++{ ++ long oldstatus, newstatus; ++ ++ do { ++ oldstatus = sem->sem_status; ++ if ((oldstatus & 1) == 0) ++ newstatus = 3; ++ else { ++ if (oldstatus >= SEM_VALUE_MAX) { ++ /* Overflow */ ++ errno = ERANGE; ++ return -1; ++ } ++ newstatus = oldstatus + 2; ++ } ++ } ++ while (! sem_compare_and_swap(sem, oldstatus, newstatus)); ++ if ((oldstatus & 1) == 0) ++ sem_restart_list((pthread_descr) oldstatus); ++ return 0; ++} ++ ++int __old_sem_getvalue(old_sem_t * sem, int * sval) ++{ ++ long status = sem->sem_status; ++ if (status & 1) ++ *sval = (int)((unsigned long) status >> 1); ++ else ++ *sval = 0; ++ return 0; ++} ++ ++int __old_sem_destroy(old_sem_t * sem) ++{ ++ if ((sem->sem_status & 1) == 0) { ++ errno = EBUSY; ++ return -1; ++ } ++ return 0; ++} ++ ++/* Auxiliary function for restarting all threads on a waiting list, ++ in priority order. */ ++ ++static void sem_restart_list(pthread_descr waiting) ++{ ++ pthread_descr th, towake, *p; ++ ++ /* Sort list of waiting threads by decreasing priority (insertion sort) */ ++ towake = NULL; ++ while (waiting != (pthread_descr) 1) { ++ th = waiting; ++ waiting = waiting->p_nextwaiting; ++ p = &towake; ++ while (*p != NULL && th->p_priority < (*p)->p_priority) ++ p = &((*p)->p_nextwaiting); ++ th->p_nextwaiting = *p; ++ *p = th; ++ } ++ /* Wake up threads in priority order */ ++ while (towake != NULL) { ++ th = towake; ++ towake = towake->p_nextwaiting; ++ th->p_nextwaiting = NULL; ++ restart(th); ++ } ++} ++ ++#if defined PIC && DO_VERSIONING ++symbol_version (__old_sem_init, sem_init, GLIBC_2.0); ++symbol_version (__old_sem_wait, sem_wait, GLIBC_2.0); ++symbol_version (__old_sem_trywait, sem_trywait, GLIBC_2.0); ++symbol_version (__old_sem_post, sem_post, GLIBC_2.0); ++symbol_version (__old_sem_getvalue, sem_getvalue, GLIBC_2.0); ++symbol_version (__old_sem_destroy, sem_destroy, GLIBC_2.0); ++#endif ++ +diff -Naur ../glibc-2.1.3/linuxthreads/pt-machine.c glibc-2.1.3/linuxthreads/pt-machine.c +--- ../glibc-2.1.3/linuxthreads/pt-machine.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/pt-machine.c 1998-10-09 04:19:05.000000000 -0700 +@@ -0,0 +1,22 @@ ++/* "Instantiation of machine-dependent pthreads inline functions. ++ Copyright (C) 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 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. */ ++ ++#define PT_EI ++ ++#include <pt-machine.h> +diff -Naur ../glibc-2.1.3/linuxthreads/ptfork.c glibc-2.1.3/linuxthreads/ptfork.c +--- ../glibc-2.1.3/linuxthreads/ptfork.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/ptfork.c 1999-09-07 01:05:20.000000000 -0700 +@@ -0,0 +1,105 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* The "atfork" stuff */ ++ ++#include <errno.h> ++#include <stddef.h> ++#include <stdlib.h> ++#include <unistd.h> ++#include "pthread.h" ++#include "internals.h" ++ ++struct handler_list { ++ void (*handler)(void); ++ struct handler_list * next; ++}; ++ ++static pthread_mutex_t pthread_atfork_lock = PTHREAD_MUTEX_INITIALIZER; ++static struct handler_list * pthread_atfork_prepare = NULL; ++static struct handler_list * pthread_atfork_parent = NULL; ++static struct handler_list * pthread_atfork_child = NULL; ++ ++static void pthread_insert_list(struct handler_list ** list, ++ void (*handler)(void), ++ struct handler_list * newlist, ++ int at_end) ++{ ++ if (handler == NULL) return; ++ if (at_end) { ++ while(*list != NULL) list = &((*list)->next); ++ } ++ newlist->handler = handler; ++ newlist->next = *list; ++ *list = newlist; ++} ++ ++struct handler_list_block { ++ struct handler_list prepare, parent, child; ++}; ++ ++int __pthread_atfork(void (*prepare)(void), ++ void (*parent)(void), ++ void (*child)(void)) ++{ ++ struct handler_list_block * block = ++ (struct handler_list_block *) malloc(sizeof(struct handler_list_block)); ++ if (block == NULL) return ENOMEM; ++ pthread_mutex_lock(&pthread_atfork_lock); ++ /* "prepare" handlers are called in LIFO */ ++ pthread_insert_list(&pthread_atfork_prepare, prepare, &block->prepare, 0); ++ /* "parent" handlers are called in FIFO */ ++ pthread_insert_list(&pthread_atfork_parent, parent, &block->parent, 1); ++ /* "child" handlers are called in FIFO */ ++ pthread_insert_list(&pthread_atfork_child, child, &block->child, 1); ++ pthread_mutex_unlock(&pthread_atfork_lock); ++ return 0; ++} ++strong_alias (__pthread_atfork, pthread_atfork) ++ ++static inline void pthread_call_handlers(struct handler_list * list) ++{ ++ for (/*nothing*/; list != NULL; list = list->next) (list->handler)(); ++} ++ ++extern int __libc_fork(void); ++ ++pid_t __fork(void) ++{ ++ pid_t pid; ++ struct handler_list * prepare, * child, * parent; ++ ++ pthread_mutex_lock(&pthread_atfork_lock); ++ prepare = pthread_atfork_prepare; ++ child = pthread_atfork_child; ++ parent = pthread_atfork_parent; ++ pthread_mutex_unlock(&pthread_atfork_lock); ++ pthread_call_handlers(prepare); ++ pid = __libc_fork(); ++ if (pid == 0) { ++ __pthread_reset_main_thread(); ++ __fresetlockfiles(); ++ pthread_call_handlers(child); ++ } else { ++ pthread_call_handlers(parent); ++ } ++ return pid; ++} ++weak_alias (__fork, fork); ++ ++pid_t __vfork(void) ++{ ++ return __fork(); ++} ++weak_alias (__vfork, vfork); +diff -Naur ../glibc-2.1.3/linuxthreads/pthread.c glibc-2.1.3/linuxthreads/pthread.c +--- ../glibc-2.1.3/linuxthreads/pthread.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/pthread.c 2000-01-20 18:32:38.000000000 -0800 +@@ -0,0 +1,840 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* Thread creation, initialization, and basic low-level routines */ ++ ++#include <errno.h> ++#include <stddef.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <unistd.h> ++#include <fcntl.h> ++#include <sys/wait.h> ++#include <sys/resource.h> ++#include "pthread.h" ++#include "internals.h" ++#include "spinlock.h" ++#include "restart.h" ++ ++/* Descriptor of the initial thread */ ++ ++struct _pthread_descr_struct __pthread_initial_thread = { ++ &__pthread_initial_thread, /* pthread_descr p_nextlive */ ++ &__pthread_initial_thread, /* pthread_descr p_prevlive */ ++ NULL, /* pthread_descr p_nextwaiting */ ++ NULL, /* pthread_descr p_nextlock */ ++ PTHREAD_THREADS_MAX, /* pthread_t p_tid */ ++ 0, /* int p_pid */ ++ 0, /* int p_priority */ ++ &__pthread_handles[0].h_lock, /* struct _pthread_fastlock * p_lock */ ++ 0, /* int p_signal */ ++ NULL, /* sigjmp_buf * p_signal_buf */ ++ NULL, /* sigjmp_buf * p_cancel_buf */ ++ 0, /* char p_terminated */ ++ 0, /* char p_detached */ ++ 0, /* char p_exited */ ++ NULL, /* void * p_retval */ ++ 0, /* int p_retval */ ++ NULL, /* pthread_descr p_joining */ ++ NULL, /* struct _pthread_cleanup_buffer * p_cleanup */ ++ 0, /* char p_cancelstate */ ++ 0, /* char p_canceltype */ ++ 0, /* char p_canceled */ ++ NULL, /* int *p_errnop */ ++ 0, /* int p_errno */ ++ NULL, /* int *p_h_errnop */ ++ 0, /* int p_h_errno */ ++ NULL, /* char * p_in_sighandler */ ++ 0, /* char p_sigwaiting */ ++ PTHREAD_START_ARGS_INITIALIZER, /* struct pthread_start_args p_start_args */ ++ {NULL}, /* void ** p_specific[PTHREAD_KEY_1STLEVEL_SIZE] */ ++ {NULL}, /* void * p_libc_specific[_LIBC_TSD_KEY_N] */ ++ 0, /* int p_userstack */ ++ NULL, /* void * p_guardaddr */ ++ 0, /* size_t p_guardsize */ ++ &__pthread_initial_thread, /* pthread_descr p_self */ ++ 0, /* Always index 0 */ ++ 0, /* int p_report_events */ ++ {{{0, }}, 0, NULL}, /* td_eventbuf_t p_eventbuf */ ++ ATOMIC_INITIALIZER, /* struct pthread_atomic p_resume_count */ ++ 0, /* char p_woken_by_cancel */ ++ NULL, /* struct pthread_extricate_if *p_extricate */ ++ NULL, /* pthread_readlock_info *p_readlock_list; */ ++ NULL, /* pthread_readlock_info *p_readlock_free; */ ++ 0 /* int p_untracked_readlock_count; */ ++}; ++ ++/* Descriptor of the manager thread; none of this is used but the error ++ variables, the p_pid and p_priority fields, ++ and the address for identification. */ ++ ++struct _pthread_descr_struct __pthread_manager_thread = { ++ NULL, /* pthread_descr p_nextlive */ ++ NULL, /* pthread_descr p_prevlive */ ++ NULL, /* pthread_descr p_nextwaiting */ ++ NULL, /* pthread_descr p_nextlock */ ++ 0, /* int p_tid */ ++ 0, /* int p_pid */ ++ 0, /* int p_priority */ ++ &__pthread_handles[1].h_lock, /* struct _pthread_fastlock * p_lock */ ++ 0, /* int p_signal */ ++ NULL, /* sigjmp_buf * p_signal_buf */ ++ NULL, /* sigjmp_buf * p_cancel_buf */ ++ 0, /* char p_terminated */ ++ 0, /* char p_detached */ ++ 0, /* char p_exited */ ++ NULL, /* void * p_retval */ ++ 0, /* int p_retval */ ++ NULL, /* pthread_descr p_joining */ ++ NULL, /* struct _pthread_cleanup_buffer * p_cleanup */ ++ 0, /* char p_cancelstate */ ++ 0, /* char p_canceltype */ ++ 0, /* char p_canceled */ ++ &__pthread_manager_thread.p_errno, /* int *p_errnop */ ++ 0, /* int p_errno */ ++ NULL, /* int *p_h_errnop */ ++ 0, /* int p_h_errno */ ++ NULL, /* char * p_in_sighandler */ ++ 0, /* char p_sigwaiting */ ++ PTHREAD_START_ARGS_INITIALIZER, /* struct pthread_start_args p_start_args */ ++ {NULL}, /* void ** p_specific[PTHREAD_KEY_1STLEVEL_SIZE] */ ++ {NULL}, /* void * p_libc_specific[_LIBC_TSD_KEY_N] */ ++ 0, /* int p_userstack */ ++ NULL, /* void * p_guardaddr */ ++ 0, /* size_t p_guardsize */ ++ &__pthread_manager_thread, /* pthread_descr p_self */ ++ 1, /* Always index 1 */ ++ 0, /* int p_report_events */ ++ {{{0, }}, 0, NULL}, /* td_eventbuf_t p_eventbuf */ ++ ATOMIC_INITIALIZER, /* struct pthread_atomic p_resume_count */ ++ 0, /* char p_woken_by_cancel */ ++ NULL, /* struct pthread_extricate_if *p_extricate */ ++ NULL, /* pthread_readlock_info *p_readlock_list; */ ++ NULL, /* pthread_readlock_info *p_readlock_free; */ ++ 0 /* int p_untracked_readlock_count; */ ++}; ++ ++/* Pointer to the main thread (the father of the thread manager thread) */ ++/* Originally, this is the initial thread, but this changes after fork() */ ++ ++pthread_descr __pthread_main_thread = &__pthread_initial_thread; ++ ++/* Limit between the stack of the initial thread (above) and the ++ stacks of other threads (below). Aligned on a STACK_SIZE boundary. */ ++ ++char *__pthread_initial_thread_bos = NULL; ++ ++/* File descriptor for sending requests to the thread manager. */ ++/* Initially -1, meaning that the thread manager is not running. */ ++ ++int __pthread_manager_request = -1; ++ ++/* Other end of the pipe for sending requests to the thread manager. */ ++ ++int __pthread_manager_reader; ++ ++/* Limits of the thread manager stack */ ++ ++char *__pthread_manager_thread_bos = NULL; ++char *__pthread_manager_thread_tos = NULL; ++ ++/* For process-wide exit() */ ++ ++int __pthread_exit_requested = 0; ++int __pthread_exit_code = 0; ++ ++/* Pointers that select new or old suspend/resume functions ++ based on availability of rt signals. */ ++ ++void (*__pthread_restart)(pthread_descr) = __pthread_restart_old; ++void (*__pthread_suspend)(pthread_descr) = __pthread_suspend_old; ++ ++/* Communicate relevant LinuxThreads constants to gdb */ ++ ++const int __pthread_threads_max = PTHREAD_THREADS_MAX; ++const int __pthread_sizeof_handle = sizeof(struct pthread_handle_struct); ++const int __pthread_offsetof_descr = offsetof(struct pthread_handle_struct, ++ h_descr); ++const int __pthread_offsetof_pid = offsetof(struct _pthread_descr_struct, ++ p_pid); ++ ++/* These variables are used by the setup code. */ ++extern int _errno; ++extern int _h_errno; ++ ++/* Forward declarations */ ++ ++static void pthread_exit_process(int retcode, void *arg); ++#ifndef __i386__ ++static void pthread_handle_sigcancel(int sig); ++static void pthread_handle_sigrestart(int sig); ++#else ++static void pthread_handle_sigcancel(int sig, struct sigcontext ctx); ++static void pthread_handle_sigrestart(int sig, struct sigcontext ctx); ++#endif ++static void pthread_handle_sigdebug(int sig); ++ ++/* Signal numbers used for the communication. ++ In these variables we keep track of the used variables. If the ++ platform does not support any real-time signals we will define the ++ values to some unreasonable value which will signal failing of all ++ the functions below. */ ++#ifndef __SIGRTMIN ++static int current_rtmin = -1; ++static int current_rtmax = -1; ++int __pthread_sig_restart = SIGUSR1; ++int __pthread_sig_cancel = SIGUSR2; ++int __pthread_sig_debug = 0; ++#else ++static int current_rtmin; ++static int current_rtmax; ++ ++#if __SIGRTMAX - __SIGRTMIN >= 3 ++int __pthread_sig_restart = __SIGRTMIN; ++int __pthread_sig_cancel = __SIGRTMIN + 1; ++int __pthread_sig_debug = __SIGRTMIN + 2; ++#else ++int __pthread_sig_restart = SIGUSR1; ++int __pthread_sig_cancel = SIGUSR2; ++int __pthread_sig_debug = 0; ++#endif ++ ++static int rtsigs_initialized; ++ ++#include "testrtsig.h" ++ ++static void ++init_rtsigs (void) ++{ ++ if (!kernel_has_rtsig ()) ++ { ++ current_rtmin = -1; ++ current_rtmax = -1; ++#if __SIGRTMAX - __SIGRTMIN >= 3 ++ __pthread_sig_restart = SIGUSR1; ++ __pthread_sig_cancel = SIGUSR2; ++ __pthread_sig_debug = 0; ++#endif ++ __pthread_init_condvar(0); ++ } ++ else ++ { ++#if __SIGRTMAX - __SIGRTMIN >= 3 ++ current_rtmin = __SIGRTMIN + 3; ++ __pthread_restart = __pthread_restart_new; ++ __pthread_suspend = __pthread_wait_for_restart_signal; ++ __pthread_init_condvar(1); ++#else ++ current_rtmin = __SIGRTMIN; ++ __pthread_init_condvar(0); ++#endif ++ ++ current_rtmax = __SIGRTMAX; ++ } ++ ++ rtsigs_initialized = 1; ++} ++#endif ++ ++/* Return number of available real-time signal with highest priority. */ ++int ++__libc_current_sigrtmin (void) ++{ ++#ifdef __SIGRTMIN ++ if (!rtsigs_initialized) ++ init_rtsigs (); ++#endif ++ return current_rtmin; ++} ++ ++/* Return number of available real-time signal with lowest priority. */ ++int ++__libc_current_sigrtmax (void) ++{ ++#ifdef __SIGRTMIN ++ if (!rtsigs_initialized) ++ init_rtsigs (); ++#endif ++ return current_rtmax; ++} ++ ++/* Allocate real-time signal with highest/lowest available ++ priority. Please note that we don't use a lock since we assume ++ this function to be called at program start. */ ++int ++__libc_allocate_rtsig (int high) ++{ ++#ifndef __SIGRTMIN ++ return -1; ++#else ++ if (!rtsigs_initialized) ++ init_rtsigs (); ++ if (current_rtmin == -1 || current_rtmin > current_rtmax) ++ /* We don't have anymore signal available. */ ++ return -1; ++ ++ return high ? current_rtmin++ : current_rtmax--; ++#endif ++} ++ ++/* Initialize the pthread library. ++ Initialization is split in two functions: ++ - a constructor function that blocks the __pthread_sig_restart signal ++ (must do this very early, since the program could capture the signal ++ mask with e.g. sigsetjmp before creating the first thread); ++ - a regular function called from pthread_create when needed. */ ++ ++static void pthread_initialize(void) __attribute__((constructor)); ++ ++static void pthread_initialize(void) ++{ ++ struct sigaction sa; ++ sigset_t mask; ++ struct rlimit limit; ++ int max_stack; ++ ++ /* If already done (e.g. by a constructor called earlier!), bail out */ ++ if (__pthread_initial_thread_bos != NULL) return; ++#ifdef TEST_FOR_COMPARE_AND_SWAP ++ /* Test if compare-and-swap is available */ ++ __pthread_has_cas = compare_and_swap_is_available(); ++#endif ++ /* For the initial stack, reserve at least STACK_SIZE bytes of stack ++ below the current stack address, and align that on a ++ STACK_SIZE boundary. */ ++ __pthread_initial_thread_bos = ++ (char *)(((long)CURRENT_STACK_FRAME - 2 * STACK_SIZE) & ~(STACK_SIZE - 1)); ++ /* Update the descriptor for the initial thread. */ ++ __pthread_initial_thread.p_pid = __getpid(); ++ /* If we have special thread_self processing, initialize that for the ++ main thread now. */ ++#ifdef INIT_THREAD_SELF ++ INIT_THREAD_SELF(&__pthread_initial_thread, 0); ++#endif ++ /* The errno/h_errno variable of the main thread are the global ones. */ ++ __pthread_initial_thread.p_errnop = &_errno; ++ __pthread_initial_thread.p_h_errnop = &_h_errno; ++ /* Play with the stack size limit to make sure that no stack ever grows ++ beyond STACK_SIZE minus two pages (one page for the thread descriptor ++ immediately beyond, and one page to act as a guard page). */ ++ getrlimit(RLIMIT_STACK, &limit); ++ max_stack = STACK_SIZE - 2 * __getpagesize(); ++ if (limit.rlim_cur > max_stack) { ++ limit.rlim_cur = max_stack; ++ setrlimit(RLIMIT_STACK, &limit); ++ } ++#ifdef __SIGRTMIN ++ /* Initialize real-time signals. */ ++ init_rtsigs (); ++#endif ++ /* Setup signal handlers for the initial thread. ++ Since signal handlers are shared between threads, these settings ++ will be inherited by all other threads. */ ++#ifndef __i386__ ++ sa.sa_handler = pthread_handle_sigrestart; ++#else ++ sa.sa_handler = (__sighandler_t) pthread_handle_sigrestart; ++#endif ++ sigemptyset(&sa.sa_mask); ++ sa.sa_flags = 0; ++ __sigaction(__pthread_sig_restart, &sa, NULL); ++#ifndef __i386__ ++ sa.sa_handler = pthread_handle_sigcancel; ++#else ++ sa.sa_handler = (__sighandler_t) pthread_handle_sigcancel; ++#endif ++ sa.sa_flags = 0; ++ __sigaction(__pthread_sig_cancel, &sa, NULL); ++ if (__pthread_sig_debug > 0) { ++ sa.sa_handler = pthread_handle_sigdebug; ++ sigemptyset(&sa.sa_mask); ++ sa.sa_flags = 0; ++ __sigaction(__pthread_sig_debug, &sa, NULL); ++ } ++ /* Initially, block __pthread_sig_restart. Will be unblocked on demand. */ ++ sigemptyset(&mask); ++ sigaddset(&mask, __pthread_sig_restart); ++ sigprocmask(SIG_BLOCK, &mask, NULL); ++ /* Register an exit function to kill all other threads. */ ++ /* Do it early so that user-registered atexit functions are called ++ before pthread_exit_process. */ ++ __on_exit(pthread_exit_process, NULL); ++} ++ ++void __pthread_initialize(void) ++{ ++ pthread_initialize(); ++} ++ ++int __pthread_initialize_manager(void) ++{ ++ int manager_pipe[2]; ++ int pid; ++ struct pthread_request request; ++ ++ /* If basic initialization not done yet (e.g. we're called from a ++ constructor run before our constructor), do it now */ ++ if (__pthread_initial_thread_bos == NULL) pthread_initialize(); ++ /* Setup stack for thread manager */ ++ __pthread_manager_thread_bos = malloc(THREAD_MANAGER_STACK_SIZE); ++ if (__pthread_manager_thread_bos == NULL) return -1; ++ __pthread_manager_thread_tos = ++ __pthread_manager_thread_bos + THREAD_MANAGER_STACK_SIZE; ++ /* Setup pipe to communicate with thread manager */ ++ if (pipe(manager_pipe) == -1) { ++ free(__pthread_manager_thread_bos); ++ return -1; ++ } ++ /* Start the thread manager */ ++ pid = 0; ++ if (__pthread_initial_thread.p_report_events) ++ { ++ /* It's a bit more complicated. We have to report the creation of ++ the manager thread. */ ++ int idx = __td_eventword (TD_CREATE); ++ uint32_t mask = __td_eventmask (TD_CREATE); ++ ++ if ((mask & (__pthread_threads_events.event_bits[idx] ++ | __pthread_initial_thread.p_eventbuf.eventmask.event_bits[idx])) ++ != 0) ++ { ++ pid = __clone(__pthread_manager_event, ++ (void **) __pthread_manager_thread_tos, ++ CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, ++ (void *)(long)manager_pipe[0]); ++ ++ if (pid != -1) ++ { ++ /* Now fill in the information about the new thread in ++ the newly created thread's data structure. We cannot let ++ the new thread do this since we don't know whether it was ++ already scheduled when we send the event. */ ++ __pthread_manager_thread.p_eventbuf.eventdata = ++ &__pthread_manager_thread; ++ __pthread_manager_thread.p_eventbuf.eventnum = TD_CREATE; ++ __pthread_last_event = &__pthread_manager_thread; ++ __pthread_manager_thread.p_tid = 2* PTHREAD_THREADS_MAX + 1; ++ __pthread_manager_thread.p_pid = pid; ++ ++ /* Now call the function which signals the event. */ ++ __linuxthreads_create_event (); ++ ++ /* Now restart the thread. */ ++ __pthread_unlock(__pthread_manager_thread.p_lock); ++ } ++ } ++ } ++ ++ if (pid == 0) ++ pid = __clone(__pthread_manager, (void **) __pthread_manager_thread_tos, ++ CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, ++ (void *)(long)manager_pipe[0]); ++ if (pid == -1) { ++ free(__pthread_manager_thread_bos); ++ __libc_close(manager_pipe[0]); ++ __libc_close(manager_pipe[1]); ++ return -1; ++ } ++ __pthread_manager_request = manager_pipe[1]; /* writing end */ ++ __pthread_manager_reader = manager_pipe[0]; /* reading end */ ++ __pthread_manager_thread.p_tid = 2* PTHREAD_THREADS_MAX + 1; ++ __pthread_manager_thread.p_pid = pid; ++ /* Make gdb aware of new thread manager */ ++ if (__pthread_threads_debug && __pthread_sig_debug > 0) ++ { ++ raise(__pthread_sig_debug); ++ /* We suspend ourself and gdb will wake us up when it is ++ ready to handle us. */ ++ __pthread_wait_for_restart_signal(thread_self()); ++ } ++ /* Synchronize debugging of the thread manager */ ++ request.req_kind = REQ_DEBUG; ++ __libc_write(__pthread_manager_request, (char *) &request, sizeof(request)); ++ return 0; ++} ++ ++/* Thread creation */ ++ ++int __pthread_create_2_1(pthread_t *thread, const pthread_attr_t *attr, ++ void * (*start_routine)(void *), void *arg) ++{ ++ pthread_descr self = thread_self(); ++ struct pthread_request request; ++ if (__pthread_manager_request < 0) { ++ if (__pthread_initialize_manager() < 0) return EAGAIN; ++ } ++ request.req_thread = self; ++ request.req_kind = REQ_CREATE; ++ request.req_args.create.attr = attr; ++ request.req_args.create.fn = start_routine; ++ request.req_args.create.arg = arg; ++ sigprocmask(SIG_SETMASK, (const sigset_t *) NULL, ++ &request.req_args.create.mask); ++ __libc_write(__pthread_manager_request, (char *) &request, sizeof(request)); ++ suspend(self); ++ if (THREAD_GETMEM(self, p_retcode) == 0) ++ *thread = (pthread_t) THREAD_GETMEM(self, p_retval); ++ return THREAD_GETMEM(self, p_retcode); ++} ++ ++#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING ++default_symbol_version (__pthread_create_2_1, pthread_create, GLIBC_2.1); ++ ++int __pthread_create_2_0(pthread_t *thread, const pthread_attr_t *attr, ++ void * (*start_routine)(void *), void *arg) ++{ ++ /* The ATTR attribute is not really of type `pthread_attr_t *'. It has ++ the old size and access to the new members might crash the program. ++ We convert the struct now. */ ++ pthread_attr_t new_attr; ++ ++ if (attr != NULL) ++ { ++ size_t ps = __getpagesize (); ++ ++ memcpy (&new_attr, attr, ++ (size_t) &(((pthread_attr_t*)NULL)->__guardsize)); ++ new_attr.__guardsize = ps; ++ new_attr.__stackaddr_set = 0; ++ new_attr.__stackaddr = NULL; ++ new_attr.__stacksize = STACK_SIZE - ps; ++ attr = &new_attr; ++ } ++ return __pthread_create_2_1 (thread, attr, start_routine, arg); ++} ++symbol_version (__pthread_create_2_0, pthread_create, GLIBC_2.0); ++#else ++strong_alias (__pthread_create_2_1, pthread_create) ++#endif ++ ++/* Simple operations on thread identifiers */ ++ ++pthread_t pthread_self(void) ++{ ++ pthread_descr self = thread_self(); ++ return THREAD_GETMEM(self, p_tid); ++} ++ ++int pthread_equal(pthread_t thread1, pthread_t thread2) ++{ ++ return thread1 == thread2; ++} ++ ++/* Helper function for thread_self in the case of user-provided stacks */ ++ ++#ifndef THREAD_SELF ++ ++pthread_descr __pthread_find_self() ++{ ++ char * sp = CURRENT_STACK_FRAME; ++ pthread_handle h; ++ ++ /* __pthread_handles[0] is the initial thread, __pthread_handles[1] is ++ the manager threads handled specially in thread_self(), so start at 2 */ ++ h = __pthread_handles + 2; ++ while (! (sp <= (char *) h->h_descr && sp >= h->h_bottom)) h++; ++ return h->h_descr; ++} ++ ++#endif ++ ++/* Thread scheduling */ ++ ++int pthread_setschedparam(pthread_t thread, int policy, ++ const struct sched_param *param) ++{ ++ pthread_handle handle = thread_handle(thread); ++ pthread_descr th; ++ ++ __pthread_lock(&handle->h_lock, NULL); ++ if (invalid_handle(handle, thread)) { ++ __pthread_unlock(&handle->h_lock); ++ return ESRCH; ++ } ++ th = handle->h_descr; ++ if (__sched_setscheduler(th->p_pid, policy, param) == -1) { ++ __pthread_unlock(&handle->h_lock); ++ return errno; ++ } ++ th->p_priority = policy == SCHED_OTHER ? 0 : param->sched_priority; ++ __pthread_unlock(&handle->h_lock); ++ if (__pthread_manager_request >= 0) ++ __pthread_manager_adjust_prio(th->p_priority); ++ return 0; ++} ++ ++int pthread_getschedparam(pthread_t thread, int *policy, ++ struct sched_param *param) ++{ ++ pthread_handle handle = thread_handle(thread); ++ int pid, pol; ++ ++ __pthread_lock(&handle->h_lock, NULL); ++ if (invalid_handle(handle, thread)) { ++ __pthread_unlock(&handle->h_lock); ++ return ESRCH; ++ } ++ pid = handle->h_descr->p_pid; ++ __pthread_unlock(&handle->h_lock); ++ pol = __sched_getscheduler(pid); ++ if (pol == -1) return errno; ++ if (__sched_getparam(pid, param) == -1) return errno; ++ *policy = pol; ++ return 0; ++} ++ ++/* Process-wide exit() request */ ++ ++static void pthread_exit_process(int retcode, void *arg) ++{ ++ struct pthread_request request; ++ pthread_descr self = thread_self(); ++ ++ if (__pthread_manager_request >= 0) { ++ request.req_thread = self; ++ request.req_kind = REQ_PROCESS_EXIT; ++ request.req_args.exit.code = retcode; ++ __libc_write(__pthread_manager_request, ++ (char *) &request, sizeof(request)); ++ suspend(self); ++ /* Main thread should accumulate times for thread manager and its ++ children, so that timings for main thread account for all threads. */ ++ if (self == __pthread_main_thread) ++ waitpid(__pthread_manager_thread.p_pid, NULL, __WCLONE); ++ } ++} ++ ++/* The handler for the RESTART signal just records the signal received ++ in the thread descriptor, and optionally performs a siglongjmp ++ (for pthread_cond_timedwait). */ ++ ++#ifndef __i386__ ++static void pthread_handle_sigrestart(int sig) ++{ ++ pthread_descr self = thread_self(); ++#else ++static void pthread_handle_sigrestart(int sig, struct sigcontext ctx) ++{ ++ pthread_descr self; ++ asm volatile ("movw %w0,%%gs" : : "r" (ctx.gs)); ++ self = thread_self(); ++#endif ++ THREAD_SETMEM(self, p_signal, sig); ++ if (THREAD_GETMEM(self, p_signal_jmp) != NULL) ++ siglongjmp(*THREAD_GETMEM(self, p_signal_jmp), 1); ++} ++ ++/* The handler for the CANCEL signal checks for cancellation ++ (in asynchronous mode), for process-wide exit and exec requests. ++ For the thread manager thread, redirect the signal to ++ __pthread_manager_sighandler. */ ++ ++#ifndef __i386__ ++static void pthread_handle_sigcancel(int sig) ++{ ++ pthread_descr self = thread_self(); ++ sigjmp_buf * jmpbuf; ++#else ++static void pthread_handle_sigcancel(int sig, struct sigcontext ctx) ++{ ++ pthread_descr self; ++ sigjmp_buf * jmpbuf; ++ asm volatile ("movw %w0,%%gs" : : "r" (ctx.gs)); ++ self = thread_self(); ++#endif ++ ++ if (self == &__pthread_manager_thread) ++ { ++ __pthread_manager_sighandler(sig); ++ return; ++ } ++ if (__pthread_exit_requested) { ++ /* Main thread should accumulate times for thread manager and its ++ children, so that timings for main thread account for all threads. */ ++ if (self == __pthread_main_thread) ++ waitpid(__pthread_manager_thread.p_pid, NULL, __WCLONE); ++ _exit(__pthread_exit_code); ++ } ++ if (THREAD_GETMEM(self, p_canceled) ++ && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) { ++ if (THREAD_GETMEM(self, p_canceltype) == PTHREAD_CANCEL_ASYNCHRONOUS) ++ pthread_exit(PTHREAD_CANCELED); ++ jmpbuf = THREAD_GETMEM(self, p_cancel_jmp); ++ if (jmpbuf != NULL) { ++ THREAD_SETMEM(self, p_cancel_jmp, NULL); ++ siglongjmp(*jmpbuf, 1); ++ } ++ } ++} ++ ++/* Handler for the DEBUG signal. ++ The debugging strategy is as follows: ++ On reception of a REQ_DEBUG request (sent by new threads created to ++ the thread manager under debugging mode), the thread manager throws ++ __pthread_sig_debug to itself. The debugger (if active) intercepts ++ this signal, takes into account new threads and continue execution ++ of the thread manager by propagating the signal because it doesn't ++ know what it is specifically done for. In the current implementation, ++ the thread manager simply discards it. */ ++ ++static void pthread_handle_sigdebug(int sig) ++{ ++ /* Nothing */ ++} ++ ++/* Reset the state of the thread machinery after a fork(). ++ Close the pipe used for requests and set the main thread to the forked ++ thread. ++ Notice that we can't free the stack segments, as the forked thread ++ may hold pointers into them. */ ++ ++void __pthread_reset_main_thread() ++{ ++ pthread_descr self = thread_self(); ++ ++ if (__pthread_manager_request != -1) { ++ /* Free the thread manager stack */ ++ free(__pthread_manager_thread_bos); ++ __pthread_manager_thread_bos = __pthread_manager_thread_tos = NULL; ++ /* Close the two ends of the pipe */ ++ __libc_close(__pthread_manager_request); ++ __libc_close(__pthread_manager_reader); ++ __pthread_manager_request = __pthread_manager_reader = -1; ++ } ++ ++ /* Update the pid of the main thread */ ++ THREAD_SETMEM(self, p_pid, __getpid()); ++ /* Make the forked thread the main thread */ ++ __pthread_main_thread = self; ++ THREAD_SETMEM(self, p_nextlive, self); ++ THREAD_SETMEM(self, p_prevlive, self); ++ /* Now this thread modifies the global variables. */ ++ THREAD_SETMEM(self, p_errnop, &_errno); ++ THREAD_SETMEM(self, p_h_errnop, &_h_errno); ++} ++ ++/* Process-wide exec() request */ ++ ++void __pthread_kill_other_threads_np(void) ++{ ++ struct sigaction sa; ++ /* Terminate all other threads and thread manager */ ++ pthread_exit_process(0, NULL); ++ /* Make current thread the main thread in case the calling thread ++ changes its mind, does not exec(), and creates new threads instead. */ ++ __pthread_reset_main_thread(); ++ /* Reset the signal handlers behaviour for the signals the ++ implementation uses since this would be passed to the new ++ process. */ ++ sigemptyset(&sa.sa_mask); ++ sa.sa_flags = 0; ++ sa.sa_handler = SIG_DFL; ++ __sigaction(__pthread_sig_restart, &sa, NULL); ++ __sigaction(__pthread_sig_cancel, &sa, NULL); ++ if (__pthread_sig_debug > 0) ++ __sigaction(__pthread_sig_debug, &sa, NULL); ++} ++weak_alias (__pthread_kill_other_threads_np, pthread_kill_other_threads_np) ++ ++/* Concurrency symbol level. */ ++static int current_level; ++ ++int __pthread_setconcurrency(int level) ++{ ++ /* We don't do anything unless we have found a useful interpretation. */ ++ current_level = level; ++ return 0; ++} ++weak_alias (__pthread_setconcurrency, pthread_setconcurrency) ++ ++int __pthread_getconcurrency(void) ++{ ++ return current_level; ++} ++weak_alias (__pthread_getconcurrency, pthread_getconcurrency) ++ ++void __pthread_set_own_extricate_if(pthread_descr self, pthread_extricate_if *peif) ++{ ++ __pthread_lock(self->p_lock, self); ++ THREAD_SETMEM(self, p_extricate, peif); ++ __pthread_unlock(self->p_lock); ++} ++ ++/* Primitives for controlling thread execution */ ++ ++void __pthread_wait_for_restart_signal(pthread_descr self) ++{ ++ sigset_t mask; ++ ++ sigprocmask(SIG_SETMASK, NULL, &mask); /* Get current signal mask */ ++ sigdelset(&mask, __pthread_sig_restart); /* Unblock the restart signal */ ++ do { ++ self->p_signal = 0; ++ sigsuspend(&mask); /* Wait for signal */ ++ } while (self->p_signal !=__pthread_sig_restart ); ++} ++ ++/* The _old variants are for 2.0 and early 2.1 kernels which don't have RT signals. ++ On these kernels, we use SIGUSR1 and SIGUSR2 for restart and cancellation. ++ Since the restart signal does not queue, we use an atomic counter to create ++ queuing semantics. This is needed to resolve a rare race condition in ++ pthread_cond_timedwait_relative. */ ++ ++void __pthread_restart_old(pthread_descr th) ++{ ++ if (atomic_increment(&th->p_resume_count) == -1) ++ kill(th->p_pid, __pthread_sig_restart); ++} ++ ++void __pthread_suspend_old(pthread_descr self) ++{ ++ if (atomic_decrement(&self->p_resume_count) <= 0) ++ __pthread_wait_for_restart_signal(self); ++} ++ ++void __pthread_restart_new(pthread_descr th) ++{ ++ kill(th->p_pid, __pthread_sig_restart); ++} ++ ++/* There is no __pthread_suspend_new because it would just ++ be a wasteful wrapper for __pthread_wait_for_restart_signal */ ++ ++/* Debugging aid */ ++ ++#ifdef DEBUG ++#include <stdarg.h> ++ ++void __pthread_message(char * fmt, ...) ++{ ++ char buffer[1024]; ++ va_list args; ++ sprintf(buffer, "%05d : ", __getpid()); ++ va_start(args, fmt); ++ vsnprintf(buffer + 8, sizeof(buffer) - 8, fmt, args); ++ va_end(args); ++ __libc_write(2, buffer, strlen(buffer)); ++} ++ ++#endif ++ ++ ++#ifndef PIC ++/* We need a hook to force the cancelation wrappers to be linked in when ++ static libpthread is used. */ ++extern const int __pthread_provide_wrappers; ++static const int *const __pthread_require_wrappers = ++ &__pthread_provide_wrappers; ++#endif +diff -Naur ../glibc-2.1.3/linuxthreads/ptlongjmp.c glibc-2.1.3/linuxthreads/ptlongjmp.c +--- ../glibc-2.1.3/linuxthreads/ptlongjmp.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/ptlongjmp.c 1998-10-28 08:30:49.000000000 -0800 +@@ -0,0 +1,55 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1998 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* Redefine siglongjmp and longjmp so that they interact correctly ++ with cleanup handlers */ ++ ++#include <setjmp.h> ++#include "pthread.h" ++#include "internals.h" ++ ++/* These functions are not declared anywhere since they shouldn't be ++ used at another place but here. */ ++extern void __libc_siglongjmp (sigjmp_buf env, int val) ++ __attribute__ ((noreturn)); ++extern void __libc_longjmp (sigjmp_buf env, int val) ++ __attribute__ ((noreturn)); ++ ++ ++static void pthread_cleanup_upto(__jmp_buf target) ++{ ++ pthread_descr self = thread_self(); ++ struct _pthread_cleanup_buffer * c; ++ ++ for (c = THREAD_GETMEM(self, p_cleanup); ++ c != NULL && _JMPBUF_UNWINDS(target, c); ++ c = c->__prev) ++ c->__routine(c->__arg); ++ THREAD_SETMEM(self, p_cleanup, c); ++ if (THREAD_GETMEM(self, p_in_sighandler) ++ && _JMPBUF_UNWINDS(target, THREAD_GETMEM(self, p_in_sighandler))) ++ THREAD_SETMEM(self, p_in_sighandler, NULL); ++} ++ ++void siglongjmp(sigjmp_buf env, int val) ++{ ++ pthread_cleanup_upto(env->__jmpbuf); ++ __libc_siglongjmp(env, val); ++} ++ ++void longjmp(jmp_buf env, int val) ++{ ++ pthread_cleanup_upto(env->__jmpbuf); ++ __libc_longjmp(env, val); ++} +diff -Naur ../glibc-2.1.3/linuxthreads/queue.h glibc-2.1.3/linuxthreads/queue.h +--- ../glibc-2.1.3/linuxthreads/queue.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/queue.h 2000-01-20 18:32:38.000000000 -0800 +@@ -0,0 +1,61 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* Waiting queues */ ++ ++/* Waiting queues are represented by lists of thread descriptors ++ linked through their p_nextwaiting field. The lists are kept ++ sorted by decreasing priority, and then decreasing waiting time. */ ++ ++static inline void enqueue(pthread_descr * q, pthread_descr th) ++{ ++ int prio = th->p_priority; ++ ASSERT(th->p_nextwaiting == NULL); ++ for (; *q != NULL; q = &((*q)->p_nextwaiting)) { ++ if (prio > (*q)->p_priority) { ++ th->p_nextwaiting = *q; ++ *q = th; ++ return; ++ } ++ } ++ *q = th; ++} ++ ++static inline pthread_descr dequeue(pthread_descr * q) ++{ ++ pthread_descr th; ++ th = *q; ++ if (th != NULL) { ++ *q = th->p_nextwaiting; ++ th->p_nextwaiting = NULL; ++ } ++ return th; ++} ++ ++static inline int remove_from_queue(pthread_descr * q, pthread_descr th) ++{ ++ for (; *q != NULL; q = &((*q)->p_nextwaiting)) { ++ if (*q == th) { ++ *q = th->p_nextwaiting; ++ th->p_nextwaiting = NULL; ++ return 1; ++ } ++ } ++ return 0; ++} ++ ++static inline int queue_is_empty(pthread_descr * q) ++{ ++ return *q == NULL; ++} +diff -Naur ../glibc-2.1.3/linuxthreads/restart.h glibc-2.1.3/linuxthreads/restart.h +--- ../glibc-2.1.3/linuxthreads/restart.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/restart.h 2000-01-06 15:40:57.000000000 -0800 +@@ -0,0 +1,27 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++#include <signal.h> ++ ++/* Primitives for controlling thread execution */ ++ ++static inline void restart(pthread_descr th) ++{ ++ __pthread_restart(th); /* see pthread.c */ ++} ++ ++static inline void suspend(pthread_descr self) ++{ ++ __pthread_suspend(self); /* see pthread.c */ ++} +diff -Naur ../glibc-2.1.3/linuxthreads/rwlock.c glibc-2.1.3/linuxthreads/rwlock.c +--- ../glibc-2.1.3/linuxthreads/rwlock.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/rwlock.c 2000-01-20 18:32:38.000000000 -0800 +@@ -0,0 +1,486 @@ ++/* Read-write lock implementation. ++ Copyright (C) 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Xavier Leroy <Xavier.Leroy@inria.fr> ++ and Ulrich Drepper <drepper@cygnus.com>, 1998. ++ ++ 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. */ ++ ++#include <errno.h> ++#include <pthread.h> ++#include <stdlib.h> ++#include "internals.h" ++#include "queue.h" ++#include "spinlock.h" ++#include "restart.h" ++ ++/* ++ * Check whether the calling thread already owns one or more read locks on the ++ * specified lock. If so, return a pointer to the read lock info structure ++ * corresponding to that lock. ++ */ ++ ++static pthread_readlock_info * ++rwlock_is_in_list(pthread_descr self, pthread_rwlock_t *rwlock) ++{ ++ pthread_readlock_info *info; ++ ++ for (info = self->p_readlock_list; info != NULL; info = info->pr_next) ++ { ++ if (info->pr_lock == rwlock) ++ return info; ++ } ++ ++ return NULL; ++} ++ ++/* ++ * Add a new lock to the thread's list of locks for which it has a read lock. ++ * A new info node must be allocated for this, which is taken from the thread's ++ * free list, or by calling malloc. If malloc fails, a null pointer is ++ * returned. Otherwise the lock info structure is initialized and pushed ++ * onto the thread's list. ++ */ ++ ++static pthread_readlock_info * ++rwlock_add_to_list(pthread_descr self, pthread_rwlock_t *rwlock) ++{ ++ pthread_readlock_info *info = self->p_readlock_free; ++ ++ if (info != NULL) ++ self->p_readlock_free = info->pr_next; ++ else ++ info = malloc(sizeof *info); ++ ++ if (info == NULL) ++ return NULL; ++ ++ info->pr_lock_count = 1; ++ info->pr_lock = rwlock; ++ info->pr_next = self->p_readlock_list; ++ self->p_readlock_list = info; ++ ++ return info; ++} ++ ++/* ++ * If the thread owns a read lock over the given pthread_rwlock_t, ++ * and this read lock is tracked in the thread's lock list, ++ * this function returns a pointer to the info node in that list. ++ * It also decrements the lock count within that node, and if ++ * it reaches zero, it removes the node from the list. ++ * If nothing is found, it returns a null pointer. ++ */ ++ ++static pthread_readlock_info * ++rwlock_remove_from_list(pthread_descr self, pthread_rwlock_t *rwlock) ++{ ++ pthread_readlock_info **pinfo; ++ ++ for (pinfo = &self->p_readlock_list; *pinfo != NULL; pinfo = &(*pinfo)->pr_next) ++ { ++ if ((*pinfo)->pr_lock == rwlock) ++ { ++ pthread_readlock_info *info = *pinfo; ++ if (--info->pr_lock_count == 0) ++ *pinfo = info->pr_next; ++ return info; ++ } ++ } ++ ++ return NULL; ++} ++ ++/* ++ * This function checks whether the conditions are right to place a read lock. ++ * It returns 1 if so, otherwise zero. The rwlock's internal lock must be ++ * locked upon entry. ++ */ ++ ++static int ++rwlock_can_rdlock(pthread_rwlock_t *rwlock, int have_lock_already) ++{ ++ /* Can't readlock; it is write locked. */ ++ if (rwlock->__rw_writer != NULL) ++ return 0; ++ ++ /* Lock prefers readers; get it. */ ++ if (rwlock->__rw_kind == PTHREAD_RWLOCK_PREFER_READER_NP) ++ return 1; ++ ++ /* Lock prefers writers, but none are waiting. */ ++ if (queue_is_empty(&rwlock->__rw_write_waiting)) ++ return 1; ++ ++ /* Writers are waiting, but this thread already has a read lock */ ++ if (have_lock_already) ++ return 1; ++ ++ /* Writers are waiting, and this is a new lock */ ++ return 0; ++} ++ ++/* ++ * This function helps support brain-damaged recursive read locking ++ * semantics required by Unix 98, while maintaining write priority. ++ * This basically determines whether this thread already holds a read lock ++ * already. It returns 1 if so, otherwise it returns 0. ++ * ++ * If the thread has any ``untracked read locks'' then it just assumes ++ * that this lock is among them, just to be safe, and returns 1. ++ * ++ * Also, if it finds the thread's lock in the list, it sets the pointer ++ * referenced by pexisting to refer to the list entry. ++ * ++ * If the thread has no untracked locks, and the lock is not found ++ * in its list, then it is added to the list. If this fails, ++ * then *pout_of_mem is set to 1. ++ */ ++ ++static int ++rwlock_have_already(pthread_descr *pself, pthread_rwlock_t *rwlock, ++ pthread_readlock_info **pexisting, int *pout_of_mem) ++{ ++ pthread_readlock_info *existing = NULL; ++ int out_of_mem = 0, have_lock_already = 0; ++ pthread_descr self = *pself; ++ ++ if (rwlock->__rw_kind == PTHREAD_RWLOCK_PREFER_WRITER_NP) ++ { ++ if (!self) ++ self = thread_self(); ++ ++ existing = rwlock_is_in_list(self, rwlock); ++ ++ if (existing != NULL || self->p_untracked_readlock_count > 0) ++ have_lock_already = 1; ++ else ++ { ++ existing = rwlock_add_to_list(self, rwlock); ++ if (existing == NULL) ++ out_of_mem = 1; ++ } ++ } ++ ++ *pout_of_mem = out_of_mem; ++ *pexisting = existing; ++ *pself = self; ++ ++ return have_lock_already; ++} ++ ++int ++pthread_rwlock_init (pthread_rwlock_t *rwlock, ++ const pthread_rwlockattr_t *attr) ++{ ++ __pthread_init_lock(&rwlock->__rw_lock); ++ rwlock->__rw_readers = 0; ++ rwlock->__rw_writer = NULL; ++ rwlock->__rw_read_waiting = NULL; ++ rwlock->__rw_write_waiting = NULL; ++ ++ if (attr == NULL) ++ { ++ rwlock->__rw_kind = PTHREAD_RWLOCK_DEFAULT_NP; ++ rwlock->__rw_pshared = PTHREAD_PROCESS_PRIVATE; ++ } ++ else ++ { ++ rwlock->__rw_kind = attr->__lockkind; ++ rwlock->__rw_pshared = attr->__pshared; ++ } ++ ++ return 0; ++} ++ ++ ++int ++pthread_rwlock_destroy (pthread_rwlock_t *rwlock) ++{ ++ int readers; ++ _pthread_descr writer; ++ ++ __pthread_lock (&rwlock->__rw_lock, NULL); ++ readers = rwlock->__rw_readers; ++ writer = rwlock->__rw_writer; ++ __pthread_unlock (&rwlock->__rw_lock); ++ ++ if (readers > 0 || writer != NULL) ++ return EBUSY; ++ ++ return 0; ++} ++ ++int ++pthread_rwlock_rdlock (pthread_rwlock_t *rwlock) ++{ ++ pthread_descr self = NULL; ++ pthread_readlock_info *existing; ++ int out_of_mem, have_lock_already; ++ ++ have_lock_already = rwlock_have_already(&self, rwlock, ++ &existing, &out_of_mem); ++ ++ for (;;) ++ { ++ if (self == NULL) ++ self = thread_self (); ++ ++ __pthread_lock (&rwlock->__rw_lock, self); ++ ++ if (rwlock_can_rdlock(rwlock, have_lock_already)) ++ break; ++ ++ enqueue (&rwlock->__rw_read_waiting, self); ++ __pthread_unlock (&rwlock->__rw_lock); ++ suspend (self); /* This is not a cancellation point */ ++ } ++ ++ ++rwlock->__rw_readers; ++ __pthread_unlock (&rwlock->__rw_lock); ++ ++ if (have_lock_already || out_of_mem) ++ { ++ if (existing != NULL) ++ existing->pr_lock_count++; ++ else ++ self->p_untracked_readlock_count++; ++ } ++ ++ return 0; ++} ++ ++int ++pthread_rwlock_tryrdlock (pthread_rwlock_t *rwlock) ++{ ++ pthread_descr self = thread_self(); ++ pthread_readlock_info *existing; ++ int out_of_mem, have_lock_already; ++ int retval = EBUSY; ++ ++ have_lock_already = rwlock_have_already(&self, rwlock, ++ &existing, &out_of_mem); ++ ++ __pthread_lock (&rwlock->__rw_lock, self); ++ ++ /* 0 is passed to here instead of have_lock_already. ++ This is to meet Single Unix Spec requirements: ++ if writers are waiting, pthread_rwlock_tryrdlock ++ does not acquire a read lock, even if the caller has ++ one or more read locks already. */ ++ ++ if (rwlock_can_rdlock(rwlock, 0)) ++ { ++ ++rwlock->__rw_readers; ++ retval = 0; ++ } ++ ++ __pthread_unlock (&rwlock->__rw_lock); ++ ++ if (retval == 0) ++ { ++ if (have_lock_already || out_of_mem) ++ { ++ if (existing != NULL) ++ existing->pr_lock_count++; ++ else ++ self->p_untracked_readlock_count++; ++ } ++ } ++ ++ return retval; ++} ++ ++ ++int ++pthread_rwlock_wrlock (pthread_rwlock_t *rwlock) ++{ ++ pthread_descr self = thread_self (); ++ ++ while(1) ++ { ++ __pthread_lock (&rwlock->__rw_lock, self); ++ if (rwlock->__rw_readers == 0 && rwlock->__rw_writer == NULL) ++ { ++ rwlock->__rw_writer = self; ++ __pthread_unlock (&rwlock->__rw_lock); ++ return 0; ++ } ++ ++ /* Suspend ourselves, then try again */ ++ enqueue (&rwlock->__rw_write_waiting, self); ++ __pthread_unlock (&rwlock->__rw_lock); ++ suspend (self); /* This is not a cancellation point */ ++ } ++} ++ ++ ++int ++pthread_rwlock_trywrlock (pthread_rwlock_t *rwlock) ++{ ++ int result = EBUSY; ++ ++ __pthread_lock (&rwlock->__rw_lock, NULL); ++ if (rwlock->__rw_readers == 0 && rwlock->__rw_writer == NULL) ++ { ++ rwlock->__rw_writer = thread_self (); ++ result = 0; ++ } ++ __pthread_unlock (&rwlock->__rw_lock); ++ ++ return result; ++} ++ ++ ++int ++pthread_rwlock_unlock (pthread_rwlock_t *rwlock) ++{ ++ pthread_descr torestart; ++ pthread_descr th; ++ ++ __pthread_lock (&rwlock->__rw_lock, NULL); ++ if (rwlock->__rw_writer != NULL) ++ { ++ /* Unlocking a write lock. */ ++ if (rwlock->__rw_writer != thread_self ()) ++ { ++ __pthread_unlock (&rwlock->__rw_lock); ++ return EPERM; ++ } ++ rwlock->__rw_writer = NULL; ++ ++ if (rwlock->__rw_kind == PTHREAD_RWLOCK_PREFER_READER_NP ++ || (th = dequeue (&rwlock->__rw_write_waiting)) == NULL) ++ { ++ /* Restart all waiting readers. */ ++ torestart = rwlock->__rw_read_waiting; ++ rwlock->__rw_read_waiting = NULL; ++ __pthread_unlock (&rwlock->__rw_lock); ++ while ((th = dequeue (&torestart)) != NULL) ++ restart (th); ++ } ++ else ++ { ++ /* Restart one waiting writer. */ ++ __pthread_unlock (&rwlock->__rw_lock); ++ restart (th); ++ } ++ } ++ else ++ { ++ /* Unlocking a read lock. */ ++ if (rwlock->__rw_readers == 0) ++ { ++ __pthread_unlock (&rwlock->__rw_lock); ++ return EPERM; ++ } ++ ++ --rwlock->__rw_readers; ++ if (rwlock->__rw_readers == 0) ++ /* Restart one waiting writer, if any. */ ++ th = dequeue (&rwlock->__rw_write_waiting); ++ else ++ th = NULL; ++ ++ __pthread_unlock (&rwlock->__rw_lock); ++ if (th != NULL) ++ restart (th); ++ ++ /* Recursive lock fixup */ ++ ++ if (rwlock->__rw_kind == PTHREAD_RWLOCK_PREFER_WRITER_NP) ++ { ++ pthread_descr self = thread_self(); ++ pthread_readlock_info *victim = rwlock_remove_from_list(self, rwlock); ++ ++ if (victim != NULL) ++ { ++ if (victim->pr_lock_count == 0) ++ { ++ victim->pr_next = self->p_readlock_free; ++ self->p_readlock_free = victim; ++ } ++ } ++ else ++ { ++ if (self->p_untracked_readlock_count > 0) ++ self->p_untracked_readlock_count--; ++ } ++ } ++ } ++ ++ return 0; ++} ++ ++ ++ ++int ++pthread_rwlockattr_init (pthread_rwlockattr_t *attr) ++{ ++ attr->__lockkind = 0; ++ attr->__pshared = 0; ++ ++ return 0; ++} ++ ++ ++int ++pthread_rwlockattr_destroy (pthread_rwlockattr_t *attr) ++{ ++ return 0; ++} ++ ++ ++int ++pthread_rwlockattr_getpshared (const pthread_rwlockattr_t *attr, int *pshared) ++{ ++ *pshared = attr->__pshared; ++ return 0; ++} ++ ++ ++int ++pthread_rwlockattr_setpshared (pthread_rwlockattr_t *attr, int pshared) ++{ ++ if (pshared != PTHREAD_PROCESS_PRIVATE && pshared != PTHREAD_PROCESS_SHARED) ++ return EINVAL; ++ ++ attr->__pshared = pshared; ++ ++ return 0; ++} ++ ++ ++int ++pthread_rwlockattr_getkind_np (const pthread_rwlockattr_t *attr, int *pref) ++{ ++ *pref = attr->__lockkind; ++ return 0; ++} ++ ++ ++int ++pthread_rwlockattr_setkind_np (pthread_rwlockattr_t *attr, int pref) ++{ ++ if (pref != PTHREAD_RWLOCK_PREFER_READER_NP ++ && pref != PTHREAD_RWLOCK_PREFER_WRITER_NP ++ && pref != PTHREAD_RWLOCK_DEFAULT_NP) ++ return EINVAL; ++ ++ attr->__lockkind = pref; ++ ++ return 0; ++} +diff -Naur ../glibc-2.1.3/linuxthreads/semaphore.c glibc-2.1.3/linuxthreads/semaphore.c +--- ../glibc-2.1.3/linuxthreads/semaphore.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/semaphore.c 2000-01-06 15:40:57.000000000 -0800 +@@ -0,0 +1,209 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* Semaphores a la POSIX 1003.1b */ ++ ++#include <errno.h> ++#include "pthread.h" ++#include "semaphore.h" ++#include "internals.h" ++#include "spinlock.h" ++#include "restart.h" ++#include "queue.h" ++ ++int __new_sem_init(sem_t *sem, int pshared, unsigned int value) ++{ ++ if (value > SEM_VALUE_MAX) { ++ errno = EINVAL; ++ return -1; ++ } ++ if (pshared) { ++ errno = ENOSYS; ++ return -1; ++ } ++ __pthread_init_lock((struct _pthread_fastlock *) &sem->__sem_lock); ++ sem->__sem_value = value; ++ sem->__sem_waiting = NULL; ++ return 0; ++} ++ ++/* Function called by pthread_cancel to remove the thread from ++ waiting inside __new_sem_wait. */ ++ ++static int new_sem_extricate_func(void *obj, pthread_descr th) ++{ ++ volatile pthread_descr self = thread_self(); ++ sem_t *sem = obj; ++ int did_remove = 0; ++ ++ __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self); ++ did_remove = remove_from_queue(&sem->__sem_waiting, th); ++ __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); ++ ++ return did_remove; ++} ++ ++int __new_sem_wait(sem_t * sem) ++{ ++ volatile pthread_descr self = thread_self(); ++ pthread_extricate_if extr; ++ int already_canceled = 0; ++ ++ /* Set up extrication interface */ ++ extr.pu_object = sem; ++ extr.pu_extricate_func = new_sem_extricate_func; ++ ++ __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self); ++ if (sem->__sem_value > 0) { ++ sem->__sem_value--; ++ __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); ++ return 0; ++ } ++ /* Register extrication interface */ ++ __pthread_set_own_extricate_if(self, &extr); ++ /* Enqueue only if not already cancelled. */ ++ if (!(THREAD_GETMEM(self, p_canceled) ++ && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE)) ++ enqueue(&sem->__sem_waiting, self); ++ else ++ already_canceled = 1; ++ __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); ++ ++ if (already_canceled) { ++ __pthread_set_own_extricate_if(self, 0); ++ pthread_exit(PTHREAD_CANCELED); ++ } ++ ++ /* Wait for sem_post or cancellation, or fall through if already canceled */ ++ suspend(self); ++ __pthread_set_own_extricate_if(self, 0); ++ ++ /* Terminate only if the wakeup came from cancellation. */ ++ /* Otherwise ignore cancellation because we got the semaphore. */ ++ ++ if (THREAD_GETMEM(self, p_woken_by_cancel) ++ && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE) { ++ THREAD_SETMEM(self, p_woken_by_cancel, 0); ++ pthread_exit(PTHREAD_CANCELED); ++ } ++ /* We got the semaphore */ ++ return 0; ++} ++ ++int __new_sem_trywait(sem_t * sem) ++{ ++ int retval; ++ ++ __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, NULL); ++ if (sem->__sem_value == 0) { ++ errno = EAGAIN; ++ retval = -1; ++ } else { ++ sem->__sem_value--; ++ retval = 0; ++ } ++ __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); ++ return retval; ++} ++ ++int __new_sem_post(sem_t * sem) ++{ ++ pthread_descr self = thread_self(); ++ pthread_descr th; ++ struct pthread_request request; ++ ++ if (THREAD_GETMEM(self, p_in_sighandler) == NULL) { ++ __pthread_lock((struct _pthread_fastlock *) &sem->__sem_lock, self); ++ if (sem->__sem_waiting == NULL) { ++ if (sem->__sem_value >= SEM_VALUE_MAX) { ++ /* Overflow */ ++ errno = ERANGE; ++ __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); ++ return -1; ++ } ++ sem->__sem_value++; ++ __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); ++ } else { ++ th = dequeue(&sem->__sem_waiting); ++ __pthread_unlock((struct _pthread_fastlock *) &sem->__sem_lock); ++ restart(th); ++ } ++ } else { ++ /* If we're in signal handler, delegate post operation to ++ the thread manager. */ ++ if (__pthread_manager_request < 0) { ++ if (__pthread_initialize_manager() < 0) { ++ errno = EAGAIN; ++ return -1; ++ } ++ } ++ request.req_kind = REQ_POST; ++ request.req_args.post = sem; ++ __libc_write(__pthread_manager_request, ++ (char *) &request, sizeof(request)); ++ } ++ return 0; ++} ++ ++int __new_sem_getvalue(sem_t * sem, int * sval) ++{ ++ *sval = sem->__sem_value; ++ return 0; ++} ++ ++int __new_sem_destroy(sem_t * sem) ++{ ++ if (sem->__sem_waiting != NULL) { ++ __set_errno (EBUSY); ++ return -1; ++ } ++ return 0; ++} ++ ++sem_t *sem_open(const char *name, int oflag, ...) ++{ ++ __set_errno (ENOSYS); ++ return SEM_FAILED; ++} ++ ++int sem_close(sem_t *sem) ++{ ++ __set_errno (ENOSYS); ++ return -1; ++} ++ ++int sem_unlink(const char *name) ++{ ++ __set_errno (ENOSYS); ++ return -1; ++} ++ ++#if defined PIC && DO_VERSIONING ++default_symbol_version (__new_sem_init, sem_init, GLIBC_2.1); ++default_symbol_version (__new_sem_wait, sem_wait, GLIBC_2.1); ++default_symbol_version (__new_sem_trywait, sem_trywait, GLIBC_2.1); ++default_symbol_version (__new_sem_post, sem_post, GLIBC_2.1); ++default_symbol_version (__new_sem_getvalue, sem_getvalue, GLIBC_2.1); ++default_symbol_version (__new_sem_destroy, sem_destroy, GLIBC_2.1); ++#else ++# ifdef weak_alias ++weak_alias (__new_sem_init, sem_init) ++weak_alias (__new_sem_wait, sem_wait) ++weak_alias (__new_sem_trywait, sem_trywait) ++weak_alias (__new_sem_post, sem_post) ++weak_alias (__new_sem_getvalue, sem_getvalue) ++weak_alias (__new_sem_destroy, sem_destroy) ++# endif ++#endif ++ +diff -Naur ../glibc-2.1.3/linuxthreads/semaphore.h glibc-2.1.3/linuxthreads/semaphore.h +--- ../glibc-2.1.3/linuxthreads/semaphore.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/semaphore.h 2000-02-23 13:17:31.000000000 -0800 +@@ -0,0 +1,80 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++#ifndef _SEMAPHORE_H ++#define _SEMAPHORE_H 1 ++ ++#include <features.h> ++#include <sys/types.h> ++ ++#ifndef _PTHREAD_DESCR_DEFINED ++/* Thread descriptors. Needed for `sem_t' definition. */ ++typedef struct _pthread_descr_struct *_pthread_descr; ++# define _PTHREAD_DESCR_DEFINED ++#endif ++ ++/* System specific semaphore definition. */ ++typedef struct ++{ ++ struct ++ { ++ long int status; ++ int spinlock; ++ } __sem_lock; ++ int __sem_value; ++ _pthread_descr __sem_waiting; ++} sem_t; ++ ++ ++ ++/* Value returned if `sem_open' failed. */ ++#define SEM_FAILED ((sem_t *) 0) ++ ++/* Maximum value the semaphore can have. */ ++#define SEM_VALUE_MAX ((int) ((~0u) >> 1)) ++ ++ ++__BEGIN_DECLS ++ ++/* Initialize semaphore object SEM to VALUE. If PSHARED then share it ++ with other processes. */ ++extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value)); ++ ++/* Free resources associated with semaphore object SEM. */ ++extern int sem_destroy __P ((sem_t *__sem)); ++ ++/* Open a named semaphore NAME with open flaot OFLAG. */ ++extern sem_t *sem_open __P ((__const char *__name, int __oflag, ...)); ++ ++/* Close descriptor for named semaphore SEM. */ ++extern int sem_close __P ((sem_t *__sem)); ++ ++/* Remove named semaphore NAME. */ ++extern int sem_unlink __P ((__const char *__name)); ++ ++/* Wait for SEM being posted. */ ++extern int sem_wait __P ((sem_t *__sem)); ++ ++/* Test whether SEM is posted. */ ++extern int sem_trywait __P ((sem_t *__sem)); ++ ++/* Post SEM. */ ++extern int sem_post __P ((sem_t *__sem)); ++ ++/* Get current value of SEM and store it in *SVAL. */ ++extern int sem_getvalue __P ((sem_t *__sem, int *__sval)); ++ ++__END_DECLS ++ ++#endif /* semaphore.h */ +diff -Naur ../glibc-2.1.3/linuxthreads/shlib-versions glibc-2.1.3/linuxthreads/shlib-versions +--- ../glibc-2.1.3/linuxthreads/shlib-versions 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/shlib-versions 1998-08-28 03:07:18.000000000 -0700 +@@ -0,0 +1,2 @@ ++# Xavier Leroy's Linux clone based thread library. ++.*-.*-linux.* libpthread=0 +diff -Naur ../glibc-2.1.3/linuxthreads/signals.c glibc-2.1.3/linuxthreads/signals.c +--- ../glibc-2.1.3/linuxthreads/signals.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/signals.c 1999-09-28 08:29:01.000000000 -0700 +@@ -0,0 +1,233 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* Handling of signals */ ++ ++#include <errno.h> ++#include <signal.h> ++#include "pthread.h" ++#include "internals.h" ++#include "spinlock.h" ++#include <ucontext.h> ++#include <sigcontextinfo.h> ++ ++int pthread_sigmask(int how, const sigset_t * newmask, sigset_t * oldmask) ++{ ++ sigset_t mask; ++ ++ if (newmask != NULL) { ++ mask = *newmask; ++ /* Don't allow __pthread_sig_restart to be unmasked. ++ Don't allow __pthread_sig_cancel to be masked. */ ++ switch(how) { ++ case SIG_SETMASK: ++ sigaddset(&mask, __pthread_sig_restart); ++ sigdelset(&mask, __pthread_sig_cancel); ++ break; ++ case SIG_BLOCK: ++ sigdelset(&mask, __pthread_sig_cancel); ++ break; ++ case SIG_UNBLOCK: ++ sigdelset(&mask, __pthread_sig_restart); ++ break; ++ } ++ newmask = &mask; ++ } ++ if (sigprocmask(how, newmask, oldmask) == -1) ++ return errno; ++ else ++ return 0; ++} ++ ++int pthread_kill(pthread_t thread, int signo) ++{ ++ pthread_handle handle = thread_handle(thread); ++ int pid; ++ ++ __pthread_lock(&handle->h_lock, NULL); ++ if (invalid_handle(handle, thread)) { ++ __pthread_unlock(&handle->h_lock); ++ return ESRCH; ++ } ++ pid = handle->h_descr->p_pid; ++ __pthread_unlock(&handle->h_lock); ++ if (kill(pid, signo) == -1) ++ return errno; ++ else ++ return 0; ++} ++ ++/* User-provided signal handlers */ ++typedef void (*arch_sighandler_t) __PMT ((int, SIGCONTEXT)); ++static union ++{ ++ arch_sighandler_t old; ++ void (*rt) (int, struct siginfo *, struct ucontext *); ++} sighandler[NSIG]; ++ ++/* The wrapper around user-provided signal handlers */ ++static void pthread_sighandler(int signo, SIGCONTEXT ctx) ++{ ++ pthread_descr self = thread_self(); ++ char * in_sighandler; ++ /* If we're in a sigwait operation, just record the signal received ++ and return without calling the user's handler */ ++ if (THREAD_GETMEM(self, p_sigwaiting)) { ++ THREAD_SETMEM(self, p_sigwaiting, 0); ++ THREAD_SETMEM(self, p_signal, signo); ++ return; ++ } ++ /* Record that we're in a signal handler and call the user's ++ handler function */ ++ in_sighandler = THREAD_GETMEM(self, p_in_sighandler); ++ if (in_sighandler == NULL) ++ THREAD_SETMEM(self, p_in_sighandler, CURRENT_STACK_FRAME); ++ sighandler[signo].old(signo, SIGCONTEXT_EXTRA_ARGS ctx); ++ if (in_sighandler == NULL) ++ THREAD_SETMEM(self, p_in_sighandler, NULL); ++} ++ ++/* The same, this time for real-time signals. */ ++static void pthread_sighandler_rt(int signo, struct siginfo *si, ++ struct ucontext *uc) ++{ ++ pthread_descr self = thread_self(); ++ char * in_sighandler; ++ /* If we're in a sigwait operation, just record the signal received ++ and return without calling the user's handler */ ++ if (THREAD_GETMEM(self, p_sigwaiting)) { ++ THREAD_SETMEM(self, p_sigwaiting, 0); ++ THREAD_SETMEM(self, p_signal, signo); ++ return; ++ } ++ /* Record that we're in a signal handler and call the user's ++ handler function */ ++ in_sighandler = THREAD_GETMEM(self, p_in_sighandler); ++ if (in_sighandler == NULL) ++ THREAD_SETMEM(self, p_in_sighandler, CURRENT_STACK_FRAME); ++ sighandler[signo].rt(signo, si, uc); ++ if (in_sighandler == NULL) ++ THREAD_SETMEM(self, p_in_sighandler, NULL); ++} ++ ++/* The wrapper around sigaction. Install our own signal handler ++ around the signal. */ ++int sigaction(int sig, const struct sigaction * act, ++ struct sigaction * oact) ++{ ++ struct sigaction newact; ++ struct sigaction *newactp; ++ ++ if (sig == __pthread_sig_restart || ++ sig == __pthread_sig_cancel || ++ (sig == __pthread_sig_debug && __pthread_sig_debug > 0)) ++ return EINVAL; ++ if (act) ++ { ++ newact = *act; ++ if (act->sa_handler != SIG_IGN && act->sa_handler != SIG_DFL ++ && sig > 0 && sig < NSIG) ++ { ++ if (act->sa_flags & SA_SIGINFO) ++ newact.sa_handler = (__sighandler_t) pthread_sighandler_rt; ++ else ++ newact.sa_handler = (__sighandler_t) pthread_sighandler; ++ } ++ newactp = &newact; ++ } ++ else ++ newactp = NULL; ++ if (__sigaction(sig, newactp, oact) == -1) ++ return -1; ++ if (sig > 0 && sig < NSIG) ++ { ++ if (oact != NULL) ++ oact->sa_handler = (__sighandler_t) sighandler[sig].old; ++ if (act) ++ /* For the assignment is does not matter whether it's a normal ++ or real-time signal. */ ++ sighandler[sig].old = (arch_sighandler_t) act->sa_handler; ++ } ++ return 0; ++} ++ ++/* A signal handler that does nothing */ ++static void pthread_null_sighandler(int sig) { } ++ ++/* sigwait -- synchronously wait for a signal */ ++int sigwait(const sigset_t * set, int * sig) ++{ ++ volatile pthread_descr self = thread_self(); ++ sigset_t mask; ++ int s; ++ sigjmp_buf jmpbuf; ++ struct sigaction sa; ++ ++ /* Get ready to block all signals except those in set ++ and the cancellation signal. ++ Also check that handlers are installed on all signals in set, ++ and if not, install our dummy handler. This is conformant to ++ POSIX: "The effect of sigwait() on the signal actions for the ++ signals in set is unspecified." */ ++ sigfillset(&mask); ++ sigdelset(&mask, __pthread_sig_cancel); ++ for (s = 1; s <= NSIG; s++) { ++ if (sigismember(set, s) && ++ s != __pthread_sig_restart && ++ s != __pthread_sig_cancel && ++ s != __pthread_sig_debug) { ++ sigdelset(&mask, s); ++ if (sighandler[s].old == NULL || ++ sighandler[s].old == (arch_sighandler_t) SIG_DFL || ++ sighandler[s].old == (arch_sighandler_t) SIG_IGN) { ++ sa.sa_handler = pthread_null_sighandler; ++ sigemptyset(&sa.sa_mask); ++ sa.sa_flags = 0; ++ sigaction(s, &sa, NULL); ++ } ++ } ++ } ++ /* Test for cancellation */ ++ if (sigsetjmp(jmpbuf, 1) == 0) { ++ THREAD_SETMEM(self, p_cancel_jmp, &jmpbuf); ++ if (! (THREAD_GETMEM(self, p_canceled) ++ && THREAD_GETMEM(self, p_cancelstate) == PTHREAD_CANCEL_ENABLE)) { ++ /* Reset the signal count */ ++ THREAD_SETMEM(self, p_signal, 0); ++ /* Say we're in sigwait */ ++ THREAD_SETMEM(self, p_sigwaiting, 1); ++ /* Unblock the signals and wait for them */ ++ sigsuspend(&mask); ++ } ++ } ++ THREAD_SETMEM(self, p_cancel_jmp, NULL); ++ /* The signals are now reblocked. Check for cancellation */ ++ pthread_testcancel(); ++ /* We should have self->p_signal != 0 and equal to the signal received */ ++ *sig = THREAD_GETMEM(self, p_signal); ++ return 0; ++} ++ ++/* Redefine raise() to send signal to calling thread only, ++ as per POSIX 1003.1c */ ++int raise (int sig) ++{ ++ int retcode = pthread_kill(pthread_self(), sig); ++ if (retcode == 0) ++ return 0; ++ else { ++ errno = retcode; ++ return -1; ++ } ++} +diff -Naur ../glibc-2.1.3/linuxthreads/specific.c glibc-2.1.3/linuxthreads/specific.c +--- ../glibc-2.1.3/linuxthreads/specific.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/specific.c 1999-09-28 08:29:01.000000000 -0700 +@@ -0,0 +1,177 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* Thread-specific data */ ++ ++#include <errno.h> ++#include <stddef.h> ++#include <stdlib.h> ++#include "pthread.h" ++#include "internals.h" ++ ++/* Table of keys. */ ++ ++static struct pthread_key_struct pthread_keys[PTHREAD_KEYS_MAX] = ++ { { 0, NULL } }; ++ ++/* Mutex to protect access to pthread_keys */ ++ ++static pthread_mutex_t pthread_keys_mutex = PTHREAD_MUTEX_INITIALIZER; ++ ++/* Create a new key */ ++ ++int __pthread_key_create(pthread_key_t * key, destr_function destr) ++{ ++ int i; ++ ++ pthread_mutex_lock(&pthread_keys_mutex); ++ for (i = 0; i < PTHREAD_KEYS_MAX; i++) { ++ if (! pthread_keys[i].in_use) { ++ /* Mark key in use */ ++ pthread_keys[i].in_use = 1; ++ pthread_keys[i].destr = destr; ++ pthread_mutex_unlock(&pthread_keys_mutex); ++ *key = i; ++ return 0; ++ } ++ } ++ pthread_mutex_unlock(&pthread_keys_mutex); ++ return EAGAIN; ++} ++strong_alias (__pthread_key_create, pthread_key_create) ++ ++/* Delete a key */ ++ ++int pthread_key_delete(pthread_key_t key) ++{ ++ pthread_descr self = thread_self(); ++ pthread_descr th; ++ unsigned int idx1st, idx2nd; ++ ++ pthread_mutex_lock(&pthread_keys_mutex); ++ if (key >= PTHREAD_KEYS_MAX || !pthread_keys[key].in_use) { ++ pthread_mutex_unlock(&pthread_keys_mutex); ++ return EINVAL; ++ } ++ pthread_keys[key].in_use = 0; ++ pthread_keys[key].destr = NULL; ++ /* Set the value of the key to NULL in all running threads, so ++ that if the key is reallocated later by pthread_key_create, its ++ associated values will be NULL in all threads. */ ++ idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE; ++ idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE; ++ th = self; ++ do { ++ /* If the thread already is terminated don't modify the memory. */ ++ if (!th->p_terminated && th->p_specific[idx1st] != NULL) ++ th->p_specific[idx1st][idx2nd] = NULL; ++ th = th->p_nextlive; ++ } while (th != self); ++ pthread_mutex_unlock(&pthread_keys_mutex); ++ return 0; ++} ++ ++/* Set the value of a key */ ++ ++int __pthread_setspecific(pthread_key_t key, const void * pointer) ++{ ++ pthread_descr self = thread_self(); ++ unsigned int idx1st, idx2nd; ++ ++ if (key >= PTHREAD_KEYS_MAX || !pthread_keys[key].in_use) ++ return EINVAL; ++ idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE; ++ idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE; ++ if (THREAD_GETMEM_NC(self, p_specific[idx1st]) == NULL) { ++ void *newp = calloc(PTHREAD_KEY_2NDLEVEL_SIZE, sizeof (void *)); ++ if (newp == NULL) ++ return ENOMEM; ++ THREAD_SETMEM_NC(self, p_specific[idx1st], newp); ++ } ++ THREAD_GETMEM_NC(self, p_specific[idx1st])[idx2nd] = (void *) pointer; ++ return 0; ++} ++strong_alias (__pthread_setspecific, pthread_setspecific) ++ ++/* Get the value of a key */ ++ ++void * __pthread_getspecific(pthread_key_t key) ++{ ++ pthread_descr self = thread_self(); ++ unsigned int idx1st, idx2nd; ++ ++ if (key >= PTHREAD_KEYS_MAX) ++ return NULL; ++ idx1st = key / PTHREAD_KEY_2NDLEVEL_SIZE; ++ idx2nd = key % PTHREAD_KEY_2NDLEVEL_SIZE; ++ if (THREAD_GETMEM_NC(self, p_specific[idx1st]) == NULL ++ || !pthread_keys[key].in_use) ++ return NULL; ++ return THREAD_GETMEM_NC(self, p_specific[idx1st])[idx2nd]; ++} ++strong_alias (__pthread_getspecific, pthread_getspecific) ++ ++/* Call the destruction routines on all keys */ ++ ++void __pthread_destroy_specifics() ++{ ++ pthread_descr self = thread_self(); ++ int i, j, round, found_nonzero; ++ destr_function destr; ++ void * data; ++ ++ for (round = 0, found_nonzero = 1; ++ found_nonzero && round < PTHREAD_DESTRUCTOR_ITERATIONS; ++ round++) { ++ found_nonzero = 0; ++ for (i = 0; i < PTHREAD_KEY_1STLEVEL_SIZE; i++) ++ if (THREAD_GETMEM_NC(self, p_specific[i]) != NULL) ++ for (j = 0; j < PTHREAD_KEY_2NDLEVEL_SIZE; j++) { ++ destr = pthread_keys[i * PTHREAD_KEY_2NDLEVEL_SIZE + j].destr; ++ data = THREAD_GETMEM_NC(self, p_specific[i])[j]; ++ if (destr != NULL && data != NULL) { ++ THREAD_GETMEM_NC(self, p_specific[i])[j] = NULL; ++ destr(data); ++ found_nonzero = 1; ++ } ++ } ++ } ++ for (i = 0; i < PTHREAD_KEY_1STLEVEL_SIZE; i++) { ++ if (THREAD_GETMEM_NC(self, p_specific[i]) != NULL) ++ free(THREAD_GETMEM_NC(self, p_specific[i])); ++ } ++} ++ ++/* Thread-specific data for libc. */ ++ ++static int ++libc_internal_tsd_set(enum __libc_tsd_key_t key, const void * pointer) ++{ ++ pthread_descr self = thread_self(); ++ ++ THREAD_SETMEM_NC(self, p_libc_specific[key], (void *) pointer); ++ return 0; ++} ++int (*__libc_internal_tsd_set)(enum __libc_tsd_key_t key, const void * pointer) ++ = libc_internal_tsd_set; ++ ++static void * ++libc_internal_tsd_get(enum __libc_tsd_key_t key) ++{ ++ pthread_descr self = thread_self(); ++ ++ return THREAD_GETMEM_NC(self, p_libc_specific[key]); ++} ++void * (*__libc_internal_tsd_get)(enum __libc_tsd_key_t key) ++ = libc_internal_tsd_get; +diff -Naur ../glibc-2.1.3/linuxthreads/spinlock.c glibc-2.1.3/linuxthreads/spinlock.c +--- ../glibc-2.1.3/linuxthreads/spinlock.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/spinlock.c 2000-01-06 15:40:57.000000000 -0800 +@@ -0,0 +1,195 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1998 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++/* Internal locks */ ++ ++#include <errno.h> ++#include <sched.h> ++#include <time.h> ++#include "pthread.h" ++#include "internals.h" ++#include "spinlock.h" ++#include "restart.h" ++ ++/* The status field of a fastlock has the following meaning: ++ 0: fastlock is free ++ 1: fastlock is taken, no thread is waiting on it ++ ADDR: fastlock is taken, ADDR is address of thread descriptor for ++ first waiting thread, other waiting threads are linked via ++ their p_nextlock field. ++ The waiting list is not sorted by priority order. ++ Actually, we always insert at top of list (sole insertion mode ++ that can be performed without locking). ++ For __pthread_unlock, we perform a linear search in the list ++ to find the highest-priority, oldest waiting thread. ++ This is safe because there are no concurrent __pthread_unlock ++ operations -- only the thread that locked the mutex can unlock it. */ ++ ++void internal_function __pthread_lock(struct _pthread_fastlock * lock, ++ pthread_descr self) ++{ ++ long oldstatus, newstatus; ++ int spurious_wakeup_count = 0; ++ ++ do { ++ oldstatus = lock->__status; ++ if (oldstatus == 0) { ++ newstatus = 1; ++ } else { ++ if (self == NULL) ++ self = thread_self(); ++ newstatus = (long) self; ++ } ++ if (self != NULL) { ++ ASSERT(self->p_nextlock == NULL); ++ THREAD_SETMEM(self, p_nextlock, (pthread_descr) oldstatus); ++ } ++ } while(! compare_and_swap(&lock->__status, oldstatus, newstatus, ++ &lock->__spinlock)); ++ ++ /* Suspend with guard against spurious wakeup. ++ This can happen in pthread_cond_timedwait_relative, when the thread ++ wakes up due to timeout and is still on the condvar queue, and then ++ locks the queue to remove itself. At that point it may still be on the ++ queue, and may be resumed by a condition signal. */ ++ ++ if (oldstatus != 0) { ++ for (;;) { ++ suspend(self); ++ if (self->p_nextlock != NULL) { ++ /* Count resumes that don't belong to us. */ ++ spurious_wakeup_count++; ++ continue; ++ } ++ break; ++ } ++ } ++ ++ /* Put back any resumes we caught that don't belong to us. */ ++ while (spurious_wakeup_count--) ++ restart(self); ++} ++ ++void internal_function __pthread_unlock(struct _pthread_fastlock * lock) ++{ ++ long oldstatus; ++ pthread_descr thr, * ptr, * maxptr; ++ int maxprio; ++ ++again: ++ oldstatus = lock->__status; ++ if (oldstatus == 0 || oldstatus == 1) { ++ /* No threads are waiting for this lock. Please note that we also ++ enter this case if the lock is not taken at all. If this wouldn't ++ be done here we would crash further down. */ ++ if (! compare_and_swap(&lock->__status, oldstatus, 0, &lock->__spinlock)) ++ goto again; ++ return; ++ } ++ /* Find thread in waiting queue with maximal priority */ ++ ptr = (pthread_descr *) &lock->__status; ++ thr = (pthread_descr) oldstatus; ++ maxprio = 0; ++ maxptr = ptr; ++ while (thr != (pthread_descr) 1) { ++ if (thr->p_priority >= maxprio) { ++ maxptr = ptr; ++ maxprio = thr->p_priority; ++ } ++ ptr = &(thr->p_nextlock); ++ thr = *ptr; ++ } ++ /* Remove max prio thread from waiting list. */ ++ if (maxptr == (pthread_descr *) &lock->__status) { ++ /* If max prio thread is at head, remove it with compare-and-swap ++ to guard against concurrent lock operation */ ++ thr = (pthread_descr) oldstatus; ++ if (! compare_and_swap(&lock->__status, ++ oldstatus, (long)(thr->p_nextlock), ++ &lock->__spinlock)) ++ goto again; ++ } else { ++ /* No risk of concurrent access, remove max prio thread normally */ ++ thr = *maxptr; ++ *maxptr = thr->p_nextlock; ++ } ++ /* Wake up the selected waiting thread */ ++ thr->p_nextlock = NULL; ++ restart(thr); ++} ++ ++/* Compare-and-swap emulation with a spinlock */ ++ ++#ifdef TEST_FOR_COMPARE_AND_SWAP ++int __pthread_has_cas = 0; ++#endif ++ ++#if !defined HAS_COMPARE_AND_SWAP || defined TEST_FOR_COMPARE_AND_SWAP ++ ++static void __pthread_acquire(int * spinlock); ++ ++int __pthread_compare_and_swap(long * ptr, long oldval, long newval, ++ int * spinlock) ++{ ++ int res; ++ if (testandset(spinlock)) __pthread_acquire(spinlock); ++ if (*ptr == oldval) { ++ *ptr = newval; res = 1; ++ } else { ++ res = 0; ++ } ++ *spinlock = 0; ++ return res; ++} ++ ++/* This function is called if the inlined test-and-set ++ in __pthread_compare_and_swap() failed */ ++ ++/* The retry strategy is as follows: ++ - We test and set the spinlock MAX_SPIN_COUNT times, calling ++ sched_yield() each time. This gives ample opportunity for other ++ threads with priority >= our priority to make progress and ++ release the spinlock. ++ - If a thread with priority < our priority owns the spinlock, ++ calling sched_yield() repeatedly is useless, since we're preventing ++ the owning thread from making progress and releasing the spinlock. ++ So, after MAX_SPIN_LOCK attemps, we suspend the calling thread ++ using nanosleep(). This again should give time to the owning thread ++ for releasing the spinlock. ++ Notice that the nanosleep() interval must not be too small, ++ since the kernel does busy-waiting for short intervals in a realtime ++ process (!). The smallest duration that guarantees thread ++ suspension is currently 2ms. ++ - When nanosleep() returns, we try again, doing MAX_SPIN_COUNT ++ sched_yield(), then sleeping again if needed. */ ++ ++static void __pthread_acquire(int * spinlock) ++{ ++ int cnt = 0; ++ struct timespec tm; ++ ++ while (testandset(spinlock)) { ++ if (cnt < MAX_SPIN_COUNT) { ++ sched_yield(); ++ cnt++; ++ } else { ++ tm.tv_sec = 0; ++ tm.tv_nsec = SPIN_SLEEP_DURATION; ++ nanosleep(&tm, NULL); ++ cnt = 0; ++ } ++ } ++} ++ ++#endif +diff -Naur ../glibc-2.1.3/linuxthreads/spinlock.h glibc-2.1.3/linuxthreads/spinlock.h +--- ../glibc-2.1.3/linuxthreads/spinlock.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/spinlock.h 2000-01-06 15:40:57.000000000 -0800 +@@ -0,0 +1,102 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1998 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++#if defined(TEST_FOR_COMPARE_AND_SWAP) ++ ++extern int __pthread_has_cas; ++extern int __pthread_compare_and_swap(long * ptr, long oldval, long newval, ++ int * spinlock); ++ ++static inline int compare_and_swap(long * ptr, long oldval, long newval, ++ int * spinlock) ++{ ++ if (__builtin_expect (__pthread_has_cas, 1)) ++ return __compare_and_swap(ptr, oldval, newval); ++ else ++ return __pthread_compare_and_swap(ptr, oldval, newval, spinlock); ++} ++ ++#elif defined(HAS_COMPARE_AND_SWAP) ++ ++static inline int compare_and_swap(long * ptr, long oldval, long newval, ++ int * spinlock) ++{ ++ return __compare_and_swap(ptr, oldval, newval); ++} ++ ++#else ++ ++extern int __pthread_compare_and_swap(long * ptr, long oldval, long newval, ++ int * spinlock); ++ ++static inline int compare_and_swap(long * ptr, long oldval, long newval, ++ int * spinlock) ++{ ++ return __pthread_compare_and_swap(ptr, oldval, newval, spinlock); ++} ++ ++#endif ++ ++/* Internal locks */ ++ ++extern void internal_function __pthread_lock(struct _pthread_fastlock * lock, ++ pthread_descr self); ++extern void internal_function __pthread_unlock(struct _pthread_fastlock *lock); ++ ++static inline void __pthread_init_lock(struct _pthread_fastlock * lock) ++{ ++ lock->__status = 0; ++ lock->__spinlock = 0; ++} ++ ++static inline int __pthread_trylock (struct _pthread_fastlock * lock) ++{ ++ long oldstatus; ++ ++ do { ++ oldstatus = lock->__status; ++ if (oldstatus != 0) return EBUSY; ++ } while(! compare_and_swap(&lock->__status, 0, 1, &lock->__spinlock)); ++ return 0; ++} ++ ++#define LOCK_INITIALIZER {0, 0} ++ ++/* Operations on pthread_atomic, which is defined in internals.h */ ++ ++static inline long atomic_increment(struct pthread_atomic *pa) ++{ ++ long oldval; ++ ++ do { ++ oldval = pa->p_count; ++ } while (!compare_and_swap(&pa->p_count, oldval, oldval + 1, &pa->p_spinlock)); ++ ++ return oldval; ++} ++ ++ ++static inline long atomic_decrement(struct pthread_atomic *pa) ++{ ++ long oldval; ++ ++ do { ++ oldval = pa->p_count; ++ } while (!compare_and_swap(&pa->p_count, oldval, oldval - 1, &pa->p_spinlock)); ++ ++ return oldval; ++} ++ ++#define ATOMIC_INITIALIZER { 0, 0 } ++ +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/alpha/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/alpha/pt-machine.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/alpha/pt-machine.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/alpha/pt-machine.h 2000-01-03 16:06:52.000000000 -0800 +@@ -0,0 +1,108 @@ ++/* Machine-dependent pthreads configuration and inline functions. ++ Alpha version. ++ Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Richard Henderson <rth@tamu.edu>. ++ ++ 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 PT_EI ++# define PT_EI extern inline ++#endif ++ ++#include <asm/pal.h> ++ ++ ++/* Get some notion of the current stack. Need not be exactly the top ++ of the stack, just something somewhere in the current frame. */ ++#define CURRENT_STACK_FRAME stack_pointer ++register char *stack_pointer __asm__("$30"); ++ ++ ++/* Spinlock implementation; required. */ ++PT_EI long int ++testandset (int *spinlock) ++{ ++ long int ret, temp; ++ ++ __asm__ __volatile__( ++ "/* Inline spinlock test & set */\n" ++ "1:\t" ++ "ldl_l %0,%3\n\t" ++ "bne %0,2f\n\t" ++ "or $31,1,%1\n\t" ++ "stl_c %1,%2\n\t" ++ "beq %1,1b\n" ++ "2:\tmb\n" ++ "/* End spinlock test & set */" ++ : "=&r"(ret), "=&r"(temp), "=m"(*spinlock) ++ : "m"(*spinlock) ++ : "memory"); ++ ++ return ret; ++} ++ ++/* Spinlock release; default is just set to zero. */ ++#define RELEASE(spinlock) \ ++ __asm__ __volatile__("mb" : : : "memory"); \ ++ *spinlock = 0 ++ ++ ++/* Begin allocating thread stacks at this address. Default is to allocate ++ them just below the initial program stack. */ ++#define THREAD_STACK_START_ADDRESS 0x40000000000 ++ ++ ++/* Return the thread descriptor for the current thread. */ ++#define THREAD_SELF \ ++({ \ ++ register pthread_descr __self __asm__("$0"); \ ++ __asm__ ("call_pal %1" : "=r"(__self) : "i"(PAL_rduniq) : "$0"); \ ++ __self; \ ++}) ++ ++/* Initialize the thread-unique value. */ ++#define INIT_THREAD_SELF(descr, nr) \ ++{ \ ++ register pthread_descr __self __asm__("$16") = (descr); \ ++ __asm__ __volatile__ ("call_pal %1" : : "r"(__self), "i"(PAL_wruniq)); \ ++} ++ ++ ++/* Compare-and-swap for semaphores. */ ++ ++#define HAS_COMPARE_AND_SWAP ++PT_EI int ++__compare_and_swap (long int *p, long int oldval, long int newval) ++{ ++ long int ret; ++ ++ __asm__ __volatile__ ( ++ "/* Inline compare & swap */\n" ++ "1:\t" ++ "ldq_l %0,%4\n\t" ++ "cmpeq %0,%2,%0\n\t" ++ "beq %0,2f\n\t" ++ "mov %3,%0\n\t" ++ "stq_c %0,%1\n\t" ++ "beq %0,1b\n\t" ++ "2:\tmb\n" ++ "/* End compare & swap */" ++ : "=&r"(ret), "=m"(*p) ++ : "r"(oldval), "r"(newval), "m"(*p)); ++ ++ return ret; ++} +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/arm/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/arm/pt-machine.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/arm/pt-machine.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/arm/pt-machine.h 1998-10-09 11:34:00.000000000 -0700 +@@ -0,0 +1,48 @@ ++/* Machine-dependent pthreads configuration and inline functions. ++ ARM version. ++ Copyright (C) 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Philip Blundell <philb@gnu.org>. ++ ++ 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 PT_EI ++# define PT_EI extern inline ++#endif ++ ++ ++/* This will not work on ARM1 or ARM2 because SWP is lacking on those ++ machines. Unfortunately we have no way to detect this at compile ++ time; let's hope nobody tries to use one. */ ++ ++/* Spinlock implementation; required. */ ++PT_EI int ++testandset (int *spinlock) ++{ ++ register unsigned int ret; ++ ++ __asm__ __volatile__("swp %0, %1, [%2]" ++ : "=r"(ret) ++ : "0"(1), "r"(spinlock)); ++ ++ return ret; ++} ++ ++ ++/* Get some notion of the current stack. Need not be exactly the top ++ of the stack, just something somewhere in the current frame. */ ++#define CURRENT_STACK_FRAME stack_pointer ++register char * stack_pointer __asm__ ("sp"); +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/i386/i686/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/i386/i686/pt-machine.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/i386/i686/pt-machine.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/i386/i686/pt-machine.h 1999-12-07 08:50:25.000000000 -0800 +@@ -0,0 +1,67 @@ ++/* Machine-dependent pthreads configuration and inline functions. ++ i686 version. ++ Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Richard Henderson <rth@tamu.edu>. ++ ++ 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 PT_EI ++# define PT_EI extern inline ++#endif ++ ++ ++/* Get some notion of the current stack. Need not be exactly the top ++ of the stack, just something somewhere in the current frame. */ ++#define CURRENT_STACK_FRAME stack_pointer ++register char * stack_pointer __asm__ ("%esp"); ++ ++ ++/* Spinlock implementation; required. */ ++PT_EI int ++testandset (int *spinlock) ++{ ++ int ret; ++ ++ __asm__ __volatile__ ( ++ "xchgl %0, %1" ++ : "=r"(ret), "=m"(*spinlock) ++ : "0"(1), "m"(*spinlock) ++ : "memory"); ++ ++ return ret; ++} ++ ++ ++/* Compare-and-swap for semaphores. It's always available on i686. */ ++#define HAS_COMPARE_AND_SWAP ++ ++PT_EI int ++__compare_and_swap (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), "m" (*p), "a" (oldval) ++ : "memory"); ++ return ret; ++} ++ ++ ++/* Use the LDT implementation only if the kernel is fixed. */ ++//#include "../useldt.h" +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/i386/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/i386/pt-machine.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/i386/pt-machine.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/i386/pt-machine.h 1999-12-07 08:50:25.000000000 -0800 +@@ -0,0 +1,99 @@ ++/* Machine-dependent pthreads configuration and inline functions. ++ i386 version. ++ Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Richard Henderson <rth@tamu.edu>. ++ ++ 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 PT_EI ++# define PT_EI extern inline ++#endif ++ ++/* Get some notion of the current stack. Need not be exactly the top ++ of the stack, just something somewhere in the current frame. */ ++#define CURRENT_STACK_FRAME stack_pointer ++register char * stack_pointer __asm__ ("%esp"); ++ ++ ++/* Spinlock implementation; required. */ ++PT_EI int ++testandset (int *spinlock) ++{ ++ int ret; ++ ++ __asm__ __volatile__( ++ "xchgl %0, %1" ++ : "=r"(ret), "=m"(*spinlock) ++ : "0"(1), "m"(*spinlock) ++ : "memory"); ++ ++ return ret; ++} ++ ++ ++/* Compare-and-swap for semaphores. ++ Available on the 486 and above, but not on the 386. ++ We test dynamically whether it's available or not. */ ++ ++#define HAS_COMPARE_AND_SWAP ++#define TEST_FOR_COMPARE_AND_SWAP ++ ++PT_EI int ++__compare_and_swap (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), "m" (*p), "a" (oldval) ++ : "memory"); ++ return ret; ++} ++ ++ ++PT_EI int ++get_eflags (void) ++{ ++ int res; ++ __asm__ __volatile__ ("pushfl; popl %0" : "=r" (res) : ); ++ return res; ++} ++ ++ ++PT_EI void ++set_eflags (int newflags) ++{ ++ __asm__ __volatile__ ("pushl %0; popfl" : : "r" (newflags) : "cc"); ++} ++ ++ ++PT_EI int ++compare_and_swap_is_available (void) ++{ ++ int oldflags = get_eflags (); ++ int changed; ++ /* Flip AC bit in EFLAGS. */ ++ set_eflags (oldflags ^ 0x40000); ++ /* See if bit changed. */ ++ changed = (get_eflags () ^ oldflags) & 0x40000; ++ /* Restore EFLAGS. */ ++ set_eflags (oldflags); ++ /* If the AC flag did not change, it's a 386 and it lacks cmpxchg. ++ Otherwise, it's a 486 or above and it has cmpxchg. */ ++ return changed != 0; ++} +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/i386/useldt.h glibc-2.1.3/linuxthreads/sysdeps/i386/useldt.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/i386/useldt.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/i386/useldt.h 1998-08-31 11:34:00.000000000 -0700 +@@ -0,0 +1,170 @@ ++/* Special definitions for ix86 machine using segment register based ++ thread descriptor. ++ Copyright (C) 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>. ++ ++ 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. */ ++ ++#include <stddef.h> /* For offsetof. */ ++ ++ ++/* We don't want to include the kernel header. So duplicate the ++ information. */ ++ ++/* Structure passed on `modify_ldt' call. */ ++struct modify_ldt_ldt_s ++{ ++ unsigned int entry_number; ++ unsigned long int base_addr; ++ unsigned int limit; ++ unsigned int seg_32bit:1; ++ unsigned int contents:2; ++ unsigned int read_exec_only:1; ++ unsigned int limit_in_pages:1; ++ unsigned int seg_not_present:1; ++ unsigned int useable:1; ++ unsigned int empty:25; ++}; ++ ++/* System call to set LDT entry. */ ++extern int __modify_ldt (int, struct modify_ldt_ldt_s *, size_t); ++ ++ ++/* Return the thread descriptor for the current thread. ++ ++ The contained asm must *not* be marked volatile since otherwise ++ assignments like ++ pthread_descr self = thread_self(); ++ do not get optimized away. */ ++#define THREAD_SELF \ ++({ \ ++ register pthread_descr __self; \ ++ __asm__ ("movl %%gs:%c1,%0" : "=r" (__self) \ ++ : "i" (offsetof (struct _pthread_descr_struct, p_self))); \ ++ __self; \ ++}) ++ ++/* Initialize the thread-unique value. */ ++#define INIT_THREAD_SELF(descr, nr) \ ++{ \ ++ struct modify_ldt_ldt_s ldt_entry = \ ++ { nr, (unsigned long int) descr, sizeof (*descr), 1, 0, 0, 0, 0, 1, 0 }; \ ++ if (__modify_ldt (1, &ldt_entry, sizeof (ldt_entry)) != 0) \ ++ abort (); \ ++ __asm__ __volatile__ ("movw %w0, %%gs" : : "r" (nr * 8 + 7)); \ ++} ++ ++/* Free resources associated with thread descriptor. */ ++#define FREE_THREAD_SELF(descr, nr) \ ++{ \ ++ struct modify_ldt_ldt_s ldt_entry = \ ++ { nr, 0, 0, 0, 0, 1, 0, 1, 0, 0 }; \ ++ __asm__ __volatile__ ("movw %w0,%%gs" : : "r" (0)); \ ++ __modify_ldt (1, &ldt_entry, sizeof (ldt_entry)); \ ++} ++ ++/* Read member of the thread descriptor directly. */ ++#define THREAD_GETMEM(descr, member) \ ++({ \ ++ __typeof__ (descr->member) __value; \ ++ if (sizeof (__value) == 1) \ ++ __asm__ __volatile__ ("movb %%gs:%P2,%b0" \ ++ : "=r" (__value) \ ++ : "0" (0), \ ++ "i" (offsetof (struct _pthread_descr_struct, \ ++ member))); \ ++ else \ ++ { \ ++ if (sizeof (__value) != 4) \ ++ /* There should not be any value with a size other than 1 or 4. */ \ ++ abort (); \ ++ \ ++ __asm__ __volatile__ ("movl %%gs:%P1,%0" \ ++ : "=r" (__value) \ ++ : "i" (offsetof (struct _pthread_descr_struct, \ ++ member))); \ ++ } \ ++ __value; \ ++}) ++ ++/* Same as THREAD_GETMEM, but the member offset can be non-constant. */ ++#define THREAD_GETMEM_NC(descr, member) \ ++({ \ ++ __typeof__ (descr->member) __value; \ ++ if (sizeof (__value) == 1) \ ++ __asm__ __volatile__ ("movb %%gs:(%2),%b0" \ ++ : "=r" (__value) \ ++ : "0" (0), \ ++ "r" (offsetof (struct _pthread_descr_struct, \ ++ member))); \ ++ else \ ++ { \ ++ if (sizeof (__value) != 4) \ ++ /* There should not be any value with a size other than 1 or 4. */ \ ++ abort (); \ ++ \ ++ __asm__ __volatile__ ("movl %%gs:(%1),%0" \ ++ : "=r" (__value) \ ++ : "r" (offsetof (struct _pthread_descr_struct, \ ++ member))); \ ++ } \ ++ __value; \ ++}) ++ ++/* Same as THREAD_SETMEM, but the member offset can be non-constant. */ ++#define THREAD_SETMEM(descr, member, value) \ ++({ \ ++ __typeof__ (descr->member) __value = (value); \ ++ if (sizeof (__value) == 1) \ ++ __asm__ __volatile__ ("movb %0,%%gs:%P1" : \ ++ : "r" (__value), \ ++ "i" (offsetof (struct _pthread_descr_struct, \ ++ member))); \ ++ else \ ++ { \ ++ if (sizeof (__value) != 4) \ ++ /* There should not be any value with a size other than 1 or 4. */ \ ++ abort (); \ ++ \ ++ __asm__ __volatile__ ("movl %0,%%gs:%P1" : \ ++ : "r" (__value), \ ++ "i" (offsetof (struct _pthread_descr_struct, \ ++ member))); \ ++ } \ ++}) ++ ++/* Set member of the thread descriptor directly. */ ++#define THREAD_SETMEM_NC(descr, member, value) \ ++({ \ ++ __typeof__ (descr->member) __value = (value); \ ++ if (sizeof (__value) == 1) \ ++ __asm__ __volatile__ ("movb %0,%%gs:(%1)" : \ ++ : "r" (__value), \ ++ "r" (offsetof (struct _pthread_descr_struct, \ ++ member))); \ ++ else \ ++ { \ ++ if (sizeof (__value) != 4) \ ++ /* There should not be any value with a size other than 1 or 4. */ \ ++ abort (); \ ++ \ ++ __asm__ __volatile__ ("movl %0,%%gs:(%1)" : \ ++ : "r" (__value), \ ++ "r" (offsetof (struct _pthread_descr_struct, \ ++ member))); \ ++ } \ ++}) +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/m68k/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/m68k/pt-machine.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/m68k/pt-machine.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/m68k/pt-machine.h 1998-10-09 11:34:04.000000000 -0700 +@@ -0,0 +1,62 @@ ++/* Machine-dependent pthreads configuration and inline functions. ++ m68k version. ++ Copyright (C) 1996, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Richard Henderson <rth@tamu.edu>. ++ ++ 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 PT_EI ++# define PT_EI extern inline ++#endif ++ ++ ++/* Spinlock implementation; required. */ ++PT_EI int ++testandset (int *spinlock) ++{ ++ char ret; ++ ++ __asm__ __volatile__("tas %1; sne %0" ++ : "=dm"(ret), "=m"(*spinlock) ++ : "m"(*spinlock) ++ : "cc"); ++ ++ return ret; ++} ++ ++ ++/* Get some notion of the current stack. Need not be exactly the top ++ of the stack, just something somewhere in the current frame. */ ++#define CURRENT_STACK_FRAME stack_pointer ++register char * stack_pointer __asm__ ("%sp"); ++ ++ ++/* Compare-and-swap for semaphores. */ ++ ++#define HAS_COMPARE_AND_SWAP ++PT_EI int ++__compare_and_swap (long int *p, long int oldval, long int newval) ++{ ++ char ret; ++ long int readval; ++ ++ __asm__ __volatile__ ("casl %2, %3, %1; seq %0" ++ : "=dm" (ret), "=m" (*p), "=d" (readval) ++ : "d" (newval), "m" (*p), "2" (oldval)); ++ ++ return ret; ++} +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/mips/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/mips/pt-machine.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/mips/pt-machine.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/mips/pt-machine.h 1998-10-09 11:34:05.000000000 -0700 +@@ -0,0 +1,90 @@ ++/* Machine-dependent pthreads configuration and inline functions. ++ ++ Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ralf Baechle <ralf@gnu.ai.mit.edu>. ++ Based on the Alpha version by Richard Henderson <rth@tamu.edu>. ++ ++ 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. ++ ++ TODO: This version makes use of MIPS ISA 2 features. It won't ++ work on ISA 1. These machines will have to take the overhead of ++ a sysmips(MIPS_ATOMIC_SET, ...) syscall which isn't implemented ++ yet correctly. There is however a better solution for R3000 ++ uniprocessor machines possible. */ ++ ++#ifndef PT_EI ++# define PT_EI extern inline ++#endif ++ ++ ++/* Spinlock implementation; required. */ ++PT_EI long int ++testandset (int *spinlock) ++{ ++ long int ret, temp; ++ ++ __asm__ __volatile__( ++ "# Inline spinlock test & set\n\t" ++ ".set\tmips2\n" ++ "1:\tll\t%0,%3\n\t" ++ "bnez\t%0,2f\n\t" ++ ".set\tnoreorder\n\t" ++ "li\t%1,1\n\t" ++ ".set\treorder\n\t" ++ "sc\t%1,%2\n\t" ++ "beqz\t%1,1b\n" ++ "2:\t.set\tmips0\n\t" ++ "/* End spinlock test & set */" ++ : "=&r"(ret), "=&r" (temp), "=m"(*spinlock) ++ : "m"(*spinlock) ++ : "memory"); ++ ++ return ret; ++} ++ ++ ++/* Get some notion of the current stack. Need not be exactly the top ++ of the stack, just something somewhere in the current frame. */ ++#define CURRENT_STACK_FRAME stack_pointer ++register char * stack_pointer __asm__ ("$29"); ++ ++ ++/* Compare-and-swap for semaphores. */ ++ ++#define HAS_COMPARE_AND_SWAP ++PT_EI int ++__compare_and_swap (long int *p, long int oldval, long int newval) ++{ ++ long ret; ++ ++ __asm__ __volatile__ ( ++ "/* Inline compare & swap */\n\t" ++ ".set\tmips2\n" ++ "1:\tll\t%0,%4\n\t" ++ ".set\tnoreorder\n\t" ++ "bne\t%0,%2,2f\n\t" ++ "move\t%0,%3\n\t" ++ ".set\treorder\n\t" ++ "sc\t%0,%1\n\t" ++ "beqz\t%0,1b\n" ++ "2:\t.set\tmips0\n\t" ++ "/* End compare & swap */" ++ : "=&r"(ret), "=m"(*p) ++ : "r"(oldval), "r"(newval), "m"(*p)); ++ ++ return ret; ++} +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/powerpc/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/powerpc/pt-machine.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/powerpc/pt-machine.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/powerpc/pt-machine.h 1998-10-09 11:34:06.000000000 -0700 +@@ -0,0 +1,69 @@ ++/* Machine-dependent pthreads configuration and inline functions. ++ powerpc version. ++ Copyright (C) 1996, 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 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. */ ++ ++/* These routines are from Appendix G of the 'PowerPC 601 RISC Microprocessor ++ User's Manual', by IBM and Motorola. */ ++ ++#ifndef PT_EI ++# define PT_EI extern inline ++#endif ++ ++/* For multiprocessor systems, we want to ensure all memory accesses ++ are completed before we reset a lock. */ ++#if 0 ++/* on non multiprocessor systems, you can just: */ ++#define sync() /* nothing */ ++#else ++#define sync() __asm__ __volatile__ ("sync") ++#endif ++ ++/* Get some notion of the current stack. Need not be exactly the top ++ of the stack, just something somewhere in the current frame. */ ++#define CURRENT_STACK_FRAME stack_pointer ++register char * stack_pointer __asm__ ("r1"); ++ ++/* Compare-and-swap for semaphores. */ ++/* note that test-and-set(x) is the same as compare-and-swap(x, 0, 1) */ ++ ++#define HAS_COMPARE_AND_SWAP ++#if BROKEN_PPC_ASM_CR0 ++static ++#else ++PT_EI ++#endif ++int ++__compare_and_swap (long int *p, long int oldval, long int newval) ++{ ++ int ret; ++ ++ sync(); ++ __asm__ __volatile__( ++ "0: lwarx %0,0,%1 ;" ++ " xor. %0,%3,%0;" ++ " bne 1f;" ++ " stwcx. %2,0,%1;" ++ " bne- 0b;" ++ "1: " ++ : "=&r"(ret) ++ : "r"(p), "r"(newval), "r"(oldval) ++ : "cr0", "memory"); ++ sync(); ++ return ret == 0; ++} +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/Makefile glibc-2.1.3/linuxthreads/sysdeps/pthread/Makefile +--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/Makefile 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/Makefile 1998-08-28 03:07:20.000000000 -0700 +@@ -0,0 +1,3 @@ ++ifeq ($(subdir),libio) ++sysdep_headers += bits/stdio-lock.h ++endif +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/Subdirs glibc-2.1.3/linuxthreads/sysdeps/pthread/Subdirs +--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/Subdirs 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/Subdirs 1999-11-09 23:02:08.000000000 -0800 +@@ -0,0 +1 @@ ++linuxthreads_db +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-lock.h glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-lock.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-lock.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-lock.h 1999-05-07 07:34:29.000000000 -0700 +@@ -0,0 +1,214 @@ ++/* libc-internal interface for mutex locks. LinuxThreads version. ++ Copyright (C) 1996, 1997, 1998, 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 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 _BITS_LIBC_LOCK_H ++#define _BITS_LIBC_LOCK_H 1 ++ ++#include <pthread.h> ++ ++/* Mutex type. */ ++#ifdef _LIBC ++typedef pthread_mutex_t __libc_lock_t; ++#else ++typedef struct __libc_lock_opaque__ __libc_lock_t; ++#endif ++ ++/* Type for key to thread-specific data. */ ++typedef pthread_key_t __libc_key_t; ++ ++/* Define a lock variable NAME with storage class CLASS. The lock must be ++ initialized with __libc_lock_init before it can be used (or define it ++ with __libc_lock_define_initialized, below). Use `extern' for CLASS to ++ declare a lock defined in another module. In public structure ++ definitions you must use a pointer to the lock structure (i.e., NAME ++ begins with a `*'), because its storage size will not be known outside ++ of libc. */ ++#define __libc_lock_define(CLASS,NAME) \ ++ CLASS __libc_lock_t NAME; ++ ++/* Define an initialized lock variable NAME with storage class CLASS. ++ ++ For the C library we take a deeper look at the initializer. For this ++ implementation all fields are initialized to zero. Therefore we ++ don't initialize the variable which allows putting it into the BSS ++ section. */ ++#define __libc_lock_define_initialized(CLASS,NAME) \ ++ CLASS __libc_lock_t NAME; ++ ++/* Define an initialized recursive lock variable NAME with storage ++ class CLASS. */ ++#define __libc_lock_define_initialized_recursive(CLASS,NAME) \ ++ CLASS __libc_lock_t NAME = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; ++ ++/* Initialize the named lock variable, leaving it in a consistent, unlocked ++ state. */ ++#define __libc_lock_init(NAME) \ ++ (__pthread_mutex_init != NULL ? __pthread_mutex_init (&(NAME), NULL) : 0); ++ ++/* Same as last but this time we initialize a recursive mutex. */ ++#define __libc_lock_init_recursive(NAME) \ ++ do { \ ++ if (__pthread_mutex_init != NULL) \ ++ { \ ++ pthread_mutexattr_t __attr; \ ++ __pthread_mutexattr_init (&__attr); \ ++ __pthread_mutexattr_settype (&__attr, PTHREAD_MUTEX_RECURSIVE_NP); \ ++ __pthread_mutex_init (&(NAME), &__attr); \ ++ __pthread_mutexattr_destroy (&__attr); \ ++ } \ ++ } while (0); ++ ++/* Finalize the named lock variable, which must be locked. It cannot be ++ used again until __libc_lock_init is called again on it. This must be ++ called on a lock variable before the containing storage is reused. */ ++#define __libc_lock_fini(NAME) \ ++ (__pthread_mutex_destroy != NULL ? __pthread_mutex_destroy (&(NAME)) : 0); ++ ++/* Finalize recursive named lock. */ ++#define __libc_lock_fini_recursive(NAME) __libc_lock_fini (NAME) ++ ++/* Lock the named lock variable. */ ++#define __libc_lock_lock(NAME) \ ++ (__pthread_mutex_lock != NULL ? __pthread_mutex_lock (&(NAME)) : 0); ++ ++/* Lock the recursive named lock variable. */ ++#define __libc_lock_lock_recursive(NAME) __libc_lock_lock (NAME) ++ ++/* Try to lock the named lock variable. */ ++#define __libc_lock_trylock(NAME) \ ++ (__pthread_mutex_trylock != NULL ? __pthread_mutex_trylock (&(NAME)) : 0) ++ ++/* Try to lock the recursive named lock variable. */ ++#define __libc_lock_trylock_recursive(NAME) __libc_lock_trylock (NAME) ++ ++/* Unlock the named lock variable. */ ++#define __libc_lock_unlock(NAME) \ ++ (__pthread_mutex_unlock != NULL ? __pthread_mutex_unlock (&(NAME)) : 0); ++ ++/* Unlock the recursive named lock variable. */ ++#define __libc_lock_unlock_recursive(NAME) __libc_lock_unlock (NAME) ++ ++ ++/* Define once control variable. */ ++#if PTHREAD_ONCE_INIT == 0 ++/* Special case for static variables where we can avoid the initialization ++ if it is zero. */ ++# define __libc_once_define(CLASS, NAME) \ ++ CLASS pthread_once_t NAME ++#else ++# define __libc_once_define(CLASS, NAME) \ ++ CLASS pthread_once_t NAME = PTHREAD_ONCE_INIT ++#endif ++ ++/* Call handler iff the first call. */ ++#define __libc_once(ONCE_CONTROL, INIT_FUNCTION) \ ++ do { \ ++ if (__pthread_once != NULL) \ ++ __pthread_once (&(ONCE_CONTROL), (INIT_FUNCTION)); \ ++ else if ((ONCE_CONTROL) == 0) { \ ++ INIT_FUNCTION (); \ ++ (ONCE_CONTROL) = 1; \ ++ } \ ++ } while (0) ++ ++ ++/* Start critical region with cleanup. */ ++#define __libc_cleanup_region_start(FCT, ARG) \ ++ { struct _pthread_cleanup_buffer _buffer; \ ++ int _avail = _pthread_cleanup_push_defer != NULL; \ ++ if (_avail) { \ ++ _pthread_cleanup_push_defer (&_buffer, (FCT), (ARG)); \ ++ } ++ ++/* End critical region with cleanup. */ ++#define __libc_cleanup_region_end(DOIT) \ ++ if (_avail) { \ ++ _pthread_cleanup_pop_restore (&_buffer, (DOIT)); \ ++ } \ ++ } ++ ++/* Sometimes we have to exit the block in the middle. */ ++#define __libc_cleanup_end(DOIT) \ ++ if (_avail) { \ ++ _pthread_cleanup_pop_restore (&_buffer, (DOIT)); \ ++ } ++ ++/* Create thread-specific key. */ ++#define __libc_key_create(KEY, DESTRUCTOR) \ ++ (__pthread_key_create != NULL ? __pthread_key_create (KEY, DESTRUCTOR) : 1) ++ ++/* Get thread-specific data. */ ++#define __libc_getspecific(KEY) \ ++ (__pthread_getspecific != NULL ? __pthread_getspecific (KEY) : NULL) ++ ++/* Set thread-specific data. */ ++#define __libc_setspecific(KEY, VALUE) \ ++ (__pthread_setspecific != NULL ? __pthread_setspecific (KEY, VALUE) : 0) ++ ++ ++/* Register handlers to execute before and after `fork'. */ ++#define __libc_atfork(PREPARE, PARENT, CHILD) \ ++ (__pthread_atfork != NULL ? __pthread_atfork (PREPARE, PARENT, CHILD) : 0) ++ ++ ++/* Make the pthread functions weak so that we can elide them from ++ single-threaded processes. */ ++#ifndef __NO_WEAK_PTHREAD_ALIASES ++# ifdef weak_extern ++weak_extern (__pthread_mutex_init) ++weak_extern (__pthread_mutex_destroy) ++weak_extern (__pthread_mutex_lock) ++weak_extern (__pthread_mutex_trylock) ++weak_extern (__pthread_mutex_unlock) ++weak_extern (__pthread_mutexattr_init) ++weak_extern (__pthread_mutexattr_destroy) ++weak_extern (__pthread_mutexattr_settype) ++weak_extern (__pthread_key_create) ++weak_extern (__pthread_setspecific) ++weak_extern (__pthread_getspecific) ++weak_extern (__pthread_once) ++weak_extern (__pthread_initialize) ++weak_extern (__pthread_atfork) ++weak_extern (_pthread_cleanup_push_defer) ++weak_extern (_pthread_cleanup_pop_restore) ++# else ++# pragma weak __pthread_mutex_init ++# pragma weak __pthread_mutex_destroy ++# pragma weak __pthread_mutex_lock ++# pragma weak __pthread_mutex_trylock ++# pragma weak __pthread_mutex_unlock ++# pragma weak __pthread_mutexattr_init ++# pragma weak __pthread_mutexattr_destroy ++# pragma weak __pthread_mutexattr_settype ++# pragma weak __pthread_key_create ++# pragma weak __pthread_setspecific ++# pragma weak __pthread_getspecific ++# pragma weak __pthread_once ++# pragma weak __pthread_initialize ++# pragma weak __pthread_atfork ++# pragma weak _pthread_cleanup_push_defer ++# pragma weak _pthread_cleanup_pop_restore ++# endif ++#endif ++ ++/* We need portable names for some functions. E.g., when they are ++ used as argument to __libc_cleanup_region_start. */ ++#define __libc_mutex_unlock __pthread_mutex_unlock ++ ++#endif /* bits/libc-lock.h */ +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-tsd.h glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-tsd.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-tsd.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/libc-tsd.h 1998-11-30 06:18:52.000000000 -0800 +@@ -0,0 +1,43 @@ ++/* libc-internal interface for thread-specific data. LinuxThreads version. ++ 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 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 _BITS_LIBC_TSD_H ++#define _BITS_LIBC_TSD_H 1 ++ ++ ++/* Fast thread-specific data internal to libc. */ ++enum __libc_tsd_key_t { _LIBC_TSD_KEY_MALLOC = 0, ++ _LIBC_TSD_KEY_DL_ERROR, ++ _LIBC_TSD_KEY_N }; ++ ++extern void *(*__libc_internal_tsd_get) __P ((enum __libc_tsd_key_t)); ++extern int (*__libc_internal_tsd_set) __P ((enum __libc_tsd_key_t, ++ __const void *)); ++ ++#define __libc_tsd_define(CLASS, KEY) CLASS void *__libc_tsd_##KEY##_data; ++#define __libc_tsd_get(KEY) \ ++ (__libc_internal_tsd_get != NULL \ ++ ? __libc_internal_tsd_get (_LIBC_TSD_KEY_##KEY) \ ++ : __libc_tsd_##KEY##_data) ++#define __libc_tsd_set(KEY, VALUE) \ ++ (__libc_internal_tsd_set != NULL \ ++ ? __libc_internal_tsd_set (_LIBC_TSD_KEY_##KEY, (VALUE)) \ ++ : ((__libc_tsd_##KEY##_data = (VALUE)), 0)) ++ ++#endif /* bits/libc-tsd.h */ +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/pthreadtypes.h 2000-01-20 18:32:38.000000000 -0800 +@@ -0,0 +1,122 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++#if !defined _BITS_TYPES_H && !defined _PTHREAD_H ++# error "Never include <bits/pthreadtypes.h> directly; use <sys/types.h> instead." ++#endif ++ ++#ifndef _BITS_PTHREADTYPES_H ++#define _BITS_PTHREADTYPES_H 1 ++ ++#define __need_schedparam ++#include <bits/sched.h> ++ ++/* Fast locks (not abstract because mutexes and conditions aren't abstract). */ ++struct _pthread_fastlock ++{ ++ long int __status; /* "Free" or "taken" or head of waiting list */ ++ int __spinlock; /* For compare-and-swap emulation */ ++}; ++ ++#ifndef _PTHREAD_DESCR_DEFINED ++/* Thread descriptors */ ++typedef struct _pthread_descr_struct *_pthread_descr; ++# define _PTHREAD_DESCR_DEFINED ++#endif ++ ++ ++/* Attributes for threads. */ ++typedef struct ++{ ++ int __detachstate; ++ int __schedpolicy; ++ struct __sched_param __schedparam; ++ int __inheritsched; ++ int __scope; ++ size_t __guardsize; ++ int __stackaddr_set; ++ void *__stackaddr; ++ size_t __stacksize; ++} pthread_attr_t; ++ ++ ++/* Conditions (not abstract because of PTHREAD_COND_INITIALIZER */ ++typedef struct ++{ ++ struct _pthread_fastlock __c_lock; /* Protect against concurrent access */ ++ _pthread_descr __c_waiting; /* Threads waiting on this condition */ ++} pthread_cond_t; ++ ++ ++/* Attribute for conditionally variables. */ ++typedef struct ++{ ++ int __dummy; ++} pthread_condattr_t; ++ ++/* Keys for thread-specific data */ ++typedef unsigned int pthread_key_t; ++ ++ ++/* Mutexes (not abstract because of PTHREAD_MUTEX_INITIALIZER). */ ++/* (The layout is unnatural to maintain binary compatibility ++ with earlier releases of LinuxThreads.) */ ++typedef struct ++{ ++ int __m_reserved; /* Reserved for future use */ ++ int __m_count; /* Depth of recursive locking */ ++ _pthread_descr __m_owner; /* Owner thread (if recursive or errcheck) */ ++ int __m_kind; /* Mutex kind: fast, recursive or errcheck */ ++ struct _pthread_fastlock __m_lock; /* Underlying fast lock */ ++} pthread_mutex_t; ++ ++ ++/* Attribute for mutex. */ ++typedef struct ++{ ++ int __mutexkind; ++} pthread_mutexattr_t; ++ ++ ++/* Once-only execution */ ++typedef int pthread_once_t; ++ ++ ++#ifdef __USE_UNIX98 ++/* Read-write locks. */ ++typedef struct _pthread_rwlock_t ++{ ++ struct _pthread_fastlock __rw_lock; /* Lock to guarantee mutual exclusion */ ++ int __rw_readers; /* Number of readers */ ++ _pthread_descr __rw_writer; /* Identity of writer, or NULL if none */ ++ _pthread_descr __rw_read_waiting; /* Threads waiting for reading */ ++ _pthread_descr __rw_write_waiting; /* Threads waiting for writing */ ++ int __rw_kind; /* Reader/Writer preference selection */ ++ int __rw_pshared; /* Shared between processes or not */ ++} pthread_rwlock_t; ++ ++ ++/* Attribute for read-write locks. */ ++typedef struct ++{ ++ int __lockkind; ++ int __pshared; ++} pthread_rwlockattr_t; ++#endif ++ ++ ++/* Thread identifiers */ ++typedef unsigned long int pthread_t; ++ ++#endif /* bits/pthreadtypes.h */ +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/stdio-lock.h glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/stdio-lock.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/stdio-lock.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/bits/stdio-lock.h 1999-01-04 07:42:03.000000000 -0800 +@@ -0,0 +1,39 @@ ++/* Thread package specific definitions of stream lock type. ++ Copyright (C) 1996, 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 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. */ ++ ++#include <pthread.h> ++ ++typedef pthread_mutex_t _IO_lock_t; ++ ++/* We need recursive (counting) mutexes. */ ++#define _IO_lock_initializer PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP ++ ++ ++#define _IO_cleanup_region_start(_fct, _fp) \ ++ __libc_cleanup_region_start (_fct, _fp) ++#define _IO_cleanup_region_end(_doit) \ ++ __libc_cleanup_region_end (_doit) ++#define _IO_lock_init(_name) \ ++ __libc_lock_init_recursive (_name) ++#define _IO_lock_fini(_name) \ ++ __libc_lock_fini_recursive (_name) ++#define _IO_lock_lock(_name) \ ++ __libc_lock_lock (_name) ++#define _IO_lock_unlock(_name) \ ++ __libc_lock_unlock (_name) +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/pthread.h glibc-2.1.3/linuxthreads/sysdeps/pthread/pthread.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/pthread.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/pthread.h 2000-01-20 18:32:38.000000000 -0800 +@@ -0,0 +1,552 @@ ++/* Linuxthreads - a simple clone()-based implementation of Posix */ ++/* threads for Linux. */ ++/* Copyright (C) 1996 Xavier Leroy (Xavier.Leroy@inria.fr) */ ++/* */ ++/* This program 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. */ ++/* */ ++/* This program 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. */ ++ ++#ifndef _PTHREAD_H ++#define _PTHREAD_H 1 ++ ++#include <features.h> ++ ++#include <sched.h> ++#include <time.h> ++ ++#define __need_sigset_t ++#include <signal.h> ++#include <bits/pthreadtypes.h> ++ ++ ++__BEGIN_DECLS ++ ++/* Initializers. */ ++ ++#define PTHREAD_MUTEX_INITIALIZER \ ++ {0, 0, 0, PTHREAD_MUTEX_FAST_NP, {0, 0}} ++#ifdef __USE_GNU ++# define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP \ ++ {0, 0, 0, PTHREAD_MUTEX_RECURSIVE_NP, {0, 0}} ++#endif ++ ++#define PTHREAD_COND_INITIALIZER {{0, 0}, 0} ++ ++#ifdef __USE_UNIX98 ++# define PTHREAD_RWLOCK_INITIALIZER \ ++ { {0, 0}, 0, NULL, NULL, NULL, \ ++ PTHREAD_RWLOCK_DEFAULT_NP, PTHREAD_PROCESS_PRIVATE } ++#endif ++ ++/* Values for attributes. */ ++ ++enum ++{ ++ PTHREAD_CREATE_JOINABLE, ++#define PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_JOINABLE ++ PTHREAD_CREATE_DETACHED ++#define PTHREAD_CREATE_DETACHED PTHREAD_CREATE_DETACHED ++}; ++ ++enum ++{ ++ PTHREAD_INHERIT_SCHED, ++#define PTHREAD_INHERIT_SCHED PTHREAD_INHERIT_SCHED ++ PTHREAD_EXPLICIT_SCHED ++#define PTHREAD_EXPLICIT_SCHED PTHREAD_EXPLICIT_SCHED ++}; ++ ++enum ++{ ++ PTHREAD_SCOPE_SYSTEM, ++#define PTHREAD_SCOPE_SYSTEM PTHREAD_SCOPE_SYSTEM ++ PTHREAD_SCOPE_PROCESS ++#define PTHREAD_SCOPE_PROCESS PTHREAD_SCOPE_PROCESS ++}; ++ ++enum ++{ ++ PTHREAD_MUTEX_FAST_NP, ++ PTHREAD_MUTEX_RECURSIVE_NP, ++ PTHREAD_MUTEX_ERRORCHECK_NP ++#ifdef __USE_UNIX98 ++ , ++ PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP, ++ PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP, ++ PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP, ++ PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL ++#endif ++}; ++ ++enum ++{ ++ PTHREAD_PROCESS_PRIVATE, ++#define PTHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE ++ PTHREAD_PROCESS_SHARED ++#define PTHREAD_PROCESS_SHARED PTHREAD_PROCESS_SHARED ++}; ++ ++#ifdef __USE_UNIX98 ++enum ++{ ++ PTHREAD_RWLOCK_PREFER_READER_NP, ++ PTHREAD_RWLOCK_PREFER_WRITER_NP, ++ PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, ++ PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_WRITER_NP ++}; ++#endif /* Unix98 */ ++ ++#define PTHREAD_ONCE_INIT 0 ++ ++/* Cleanup buffers */ ++ ++struct _pthread_cleanup_buffer ++{ ++ void (*__routine) __PMT ((void *)); /* Function to call. */ ++ void *__arg; /* Its argument. */ ++ int __canceltype; /* Saved cancellation type. */ ++ struct _pthread_cleanup_buffer *__prev; /* Chaining of cleanup functions. */ ++}; ++ ++/* Cancellation */ ++ ++enum ++{ ++ PTHREAD_CANCEL_ENABLE, ++#define PTHREAD_CANCEL_ENABLE PTHREAD_CANCEL_ENABLE ++ PTHREAD_CANCEL_DISABLE ++#define PTHREAD_CANCEL_DISABLE PTHREAD_CANCEL_DISABLE ++}; ++enum ++{ ++ PTHREAD_CANCEL_DEFERRED, ++#define PTHREAD_CANCEL_DEFERRED PTHREAD_CANCEL_DEFERRED ++ PTHREAD_CANCEL_ASYNCHRONOUS ++#define PTHREAD_CANCEL_ASYNCHRONOUS PTHREAD_CANCEL_ASYNCHRONOUS ++}; ++#define PTHREAD_CANCELED ((void *) -1) ++ ++ ++/* Function for handling threads. */ ++ ++/* Create a thread with given attributes ATTR (or default attributes ++ if ATTR is NULL), and call function START_ROUTINE with given ++ arguments ARG. */ ++extern int pthread_create __P ((pthread_t *__thread, ++ __const pthread_attr_t *__attr, ++ void *(*__start_routine) (void *), ++ void *__arg)); ++ ++/* Obtain the identifier of the current thread. */ ++extern pthread_t pthread_self __P ((void)); ++ ++/* Compare two thread identifiers. */ ++extern int pthread_equal __P ((pthread_t __thread1, pthread_t __thread2)); ++ ++/* Terminate calling thread. */ ++extern void pthread_exit __P ((void *__retval)) __attribute__ ((__noreturn__)); ++ ++/* Make calling thread wait for termination of the thread TH. The ++ exit status of the thread is stored in *THREAD_RETURN, if THREAD_RETURN ++ is not NULL. */ ++extern int pthread_join __P ((pthread_t __th, void **__thread_return)); ++ ++/* Indicate that the thread TH is never to be joined with PTHREAD_JOIN. ++ The resources of TH will therefore be freed immediately when it ++ terminates, instead of waiting for another thread to perform PTHREAD_JOIN ++ on it. */ ++extern int pthread_detach __P ((pthread_t __th)); ++ ++ ++/* Functions for handling attributes. */ ++ ++/* Initialize thread attribute *ATTR with default attributes ++ (detachstate is PTHREAD_JOINABLE, scheduling policy is SCHED_OTHER, ++ no user-provided stack). */ ++extern int pthread_attr_init __P ((pthread_attr_t *__attr)); ++ ++/* Destroy thread attribute *ATTR. */ ++extern int pthread_attr_destroy __P ((pthread_attr_t *__attr)); ++ ++/* Set the `detachstate' attribute in *ATTR according to DETACHSTATE. */ ++extern int pthread_attr_setdetachstate __P ((pthread_attr_t *__attr, ++ int __detachstate)); ++ ++/* Return in *DETACHSTATE the `detachstate' attribute in *ATTR. */ ++extern int pthread_attr_getdetachstate __P ((__const pthread_attr_t *__attr, ++ int *__detachstate)); ++ ++/* Set scheduling parameters (priority, etc) in *ATTR according to PARAM. */ ++extern int pthread_attr_setschedparam __P ((pthread_attr_t *__attr, ++ __const struct sched_param *__param)); ++ ++/* Return in *PARAM the scheduling parameters of *ATTR. */ ++extern int pthread_attr_getschedparam __P ((__const pthread_attr_t *__attr, ++ struct sched_param *__param)); ++ ++/* Set scheduling policy in *ATTR according to POLICY. */ ++extern int pthread_attr_setschedpolicy __P ((pthread_attr_t *__attr, ++ int __policy)); ++ ++/* Return in *POLICY the scheduling policy of *ATTR. */ ++extern int pthread_attr_getschedpolicy __P ((__const pthread_attr_t *__attr, ++ int *__policy)); ++ ++/* Set scheduling inheritance mode in *ATTR according to INHERIT. */ ++extern int pthread_attr_setinheritsched __P ((pthread_attr_t *__attr, ++ int __inherit)); ++ ++/* Return in *INHERIT the scheduling inheritance mode of *ATTR. */ ++extern int pthread_attr_getinheritsched __P ((__const pthread_attr_t *__attr, ++ int *__inherit)); ++ ++/* Set scheduling contention scope in *ATTR according to SCOPE. */ ++extern int pthread_attr_setscope __P ((pthread_attr_t *__attr, int __scope)); ++ ++/* Return in *SCOPE the scheduling contention scope of *ATTR. */ ++extern int pthread_attr_getscope __P ((__const pthread_attr_t *__attr, ++ int *__scope)); ++ ++#ifdef __USE_UNIX98 ++/* Set the size of the guard area at the bottom of the thread. */ ++extern int pthread_attr_setguardsize __P ((pthread_attr_t *__attr, ++ size_t __guardsize)); ++ ++/* Get the size of the guard area at the bottom of the thread. */ ++extern int pthread_attr_getguardsize __P ((__const pthread_attr_t *__attr, ++ size_t *__guardsize)); ++#endif ++ ++/* Set the starting address of the stack of the thread to be created. ++ Depending on whether the stack grows up or doen the value must either ++ be higher or lower than all the address in the memory block. The ++ minimal size of the block must be PTHREAD_STACK_SIZE. */ ++extern int pthread_attr_setstackaddr __P ((pthread_attr_t *__attr, ++ void *__stackaddr)); ++ ++/* Return the previously set address for the stack. */ ++extern int pthread_attr_getstackaddr __P ((__const pthread_attr_t *__attr, ++ void **__stackaddr)); ++ ++/* Add information about the minimum stack size needed for the thread ++ to be started. This size must never be less than PTHREAD_STACK_SIZE ++ and must also not exceed the system limits. */ ++extern int pthread_attr_setstacksize __P ((pthread_attr_t *__attr, ++ size_t __stacksize)); ++ ++/* Return the currently used minimal stack size. */ ++extern int pthread_attr_getstacksize __P ((__const pthread_attr_t *__attr, ++ size_t *__stacksize)); ++ ++/* Functions for scheduling control. */ ++ ++/* Set the scheduling parameters for TARGET_THREAD according to POLICY ++ and *PARAM. */ ++extern int pthread_setschedparam __P ((pthread_t __target_thread, int __policy, ++ __const struct sched_param *__param)); ++ ++/* Return in *POLICY and *PARAM the scheduling parameters for TARGET_THREAD. */ ++extern int pthread_getschedparam __P ((pthread_t __target_thread, ++ int *__policy, ++ struct sched_param *__param)); ++ ++#ifdef __USE_UNIX98 ++/* Determine level of concurrency. */ ++extern int pthread_getconcurrency __P ((void)); ++ ++/* Set new concurrency level to LEVEL. */ ++extern int pthread_setconcurrency __P ((int __level)); ++#endif ++ ++/* Functions for mutex handling. */ ++ ++/* Initialize MUTEX using attributes in *MUTEX_ATTR, or use the ++ default values if later is NULL. */ ++extern int __pthread_mutex_init __P ((pthread_mutex_t *__mutex, ++ __const pthread_mutexattr_t *__mutex_attr)); ++extern int pthread_mutex_init __P ((pthread_mutex_t *__mutex, ++ __const pthread_mutexattr_t *__mutex_attr)); ++ ++/* Destroy MUTEX. */ ++extern int __pthread_mutex_destroy __P ((pthread_mutex_t *__mutex)); ++extern int pthread_mutex_destroy __P ((pthread_mutex_t *__mutex)); ++ ++/* Try to lock MUTEX. */ ++extern int __pthread_mutex_trylock __P ((pthread_mutex_t *__mutex)); ++extern int pthread_mutex_trylock __P ((pthread_mutex_t *__mutex)); ++ ++/* Wait until lock for MUTEX becomes available and lock it. */ ++extern int __pthread_mutex_lock __P ((pthread_mutex_t *__mutex)); ++extern int pthread_mutex_lock __P ((pthread_mutex_t *__mutex)); ++ ++/* Unlock MUTEX. */ ++extern int __pthread_mutex_unlock __P ((pthread_mutex_t *__mutex)); ++extern int pthread_mutex_unlock __P ((pthread_mutex_t *__mutex)); ++ ++ ++/* Functions for handling mutex attributes. */ ++ ++/* Initialize mutex attribute object ATTR with default attributes ++ (kind is PTHREAD_MUTEX_FAST_NP). */ ++extern int __pthread_mutexattr_init __P ((pthread_mutexattr_t *__attr)); ++extern int pthread_mutexattr_init __P ((pthread_mutexattr_t *__attr)); ++ ++/* Destroy mutex attribute object ATTR. */ ++extern int __pthread_mutexattr_destroy __P ((pthread_mutexattr_t *__attr)); ++extern int pthread_mutexattr_destroy __P ((pthread_mutexattr_t *__attr)); ++ ++#ifdef __USE_UNIX98 ++/* Set the mutex kind attribute in *ATTR to KIND (either PTHREAD_MUTEX_NORMAL, ++ PTHREAD_MUTEX_RECURSIVE, PTHREAD_MUTEX_ERRORCHECK, or ++ PTHREAD_MUTEX_DEFAULT). */ ++extern int __pthread_mutexattr_settype __P ((pthread_mutexattr_t *__attr, ++ int __kind)); ++extern int pthread_mutexattr_settype __P ((pthread_mutexattr_t *__attr, ++ int __kind)); ++ ++/* Return in *KIND the mutex kind attribute in *ATTR. */ ++extern int pthread_mutexattr_gettype __P ((__const pthread_mutexattr_t *__attr, ++ int *__kind)); ++#endif ++ ++ ++/* Functions for handling conditional variables. */ ++ ++/* Initialize condition variable COND using attributes ATTR, or use ++ the default values if later is NULL. */ ++extern int pthread_cond_init __P ((pthread_cond_t *__cond, ++ __const pthread_condattr_t *__cond_attr)); ++ ++/* Destroy condition variable COND. */ ++extern int pthread_cond_destroy __P ((pthread_cond_t *__cond)); ++ ++/* Wake up one thread waiting for condition variable COND. */ ++extern int pthread_cond_signal __P ((pthread_cond_t *__cond)); ++ ++/* Wake up all threads waiting for condition variables COND. */ ++extern int pthread_cond_broadcast __P ((pthread_cond_t *__cond)); ++ ++/* Wait for condition variable COND to be signaled or broadcast. ++ MUTEX is assumed to be locked before. */ ++extern int pthread_cond_wait __P ((pthread_cond_t *__cond, ++ pthread_mutex_t *__mutex)); ++ ++/* Wait for condition variable COND to be signaled or broadcast until ++ ABSTIME. MUTEX is assumed to be locked before. ABSTIME is an ++ absolute time specification; zero is the beginning of the epoch ++ (00:00:00 GMT, January 1, 1970). */ ++extern int pthread_cond_timedwait __P ((pthread_cond_t *__cond, ++ pthread_mutex_t *__mutex, ++ __const struct timespec *__abstime)); ++ ++/* Functions for handling condition variable attributes. */ ++ ++/* Initialize condition variable attribute ATTR. */ ++extern int pthread_condattr_init __P ((pthread_condattr_t *__attr)); ++ ++/* Destroy condition variable attribute ATTR. */ ++extern int pthread_condattr_destroy __P ((pthread_condattr_t *__attr)); ++ ++ ++#ifdef __USE_UNIX98 ++/* Functions for handling read-write locks. */ ++ ++/* Initialize read-write lock RWLOCK using attributes ATTR, or use ++ the default values if later is NULL. */ ++extern int pthread_rwlock_init __P ((pthread_rwlock_t *__rwlock, ++ __const pthread_rwlockattr_t *__attr)); ++ ++/* Destroy read-write lock RWLOCK. */ ++extern int pthread_rwlock_destroy __P ((pthread_rwlock_t *__rwlock)); ++ ++/* Acquire read lock for RWLOCK. */ ++extern int pthread_rwlock_rdlock __P ((pthread_rwlock_t *__rwlock)); ++ ++/* Try to acquire read lock for RWLOCK. */ ++extern int pthread_rwlock_tryrdlock __P ((pthread_rwlock_t *__rwlock)); ++ ++/* Acquire write lock for RWLOCK. */ ++extern int pthread_rwlock_wrlock __P ((pthread_rwlock_t *__rwlock)); ++ ++/* Try to acquire writelock for RWLOCK. */ ++extern int pthread_rwlock_trywrlock __P ((pthread_rwlock_t *__rwlock)); ++ ++/* Unlock RWLOCK. */ ++extern int pthread_rwlock_unlock __P ((pthread_rwlock_t *__rwlock)); ++ ++ ++/* Functions for handling read-write lock attributes. */ ++ ++/* Initialize attribute object ATTR with default values. */ ++extern int pthread_rwlockattr_init __P ((pthread_rwlockattr_t *__attr)); ++ ++/* Destroy attribute object ATTR. */ ++extern int pthread_rwlockattr_destroy __P ((pthread_rwlockattr_t *__attr)); ++ ++/* Return current setting of process-shared attribute of ATTR in PSHARED. */ ++extern int pthread_rwlockattr_getpshared __P ((__const ++ pthread_rwlockattr_t *__attr, ++ int *__pshared)); ++ ++/* Set process-shared attribute of ATTR to PSHARED. */ ++extern int pthread_rwlockattr_setpshared __P ((pthread_rwlockattr_t *__attr, ++ int __pshared)); ++ ++/* Return current setting of reader/writer preference. */ ++extern int pthread_rwlockattr_getkind_np __P ((__const ++ pthread_rwlockattr_t *__attr, ++ int *__pref)); ++ ++/* Set reader/write preference. */ ++extern int pthread_rwlockattr_setkind_np __P ((pthread_rwlockattr_t *__attr, ++ int __pref)); ++#endif ++ ++ ++/* Functions for handling thread-specific data */ ++ ++/* Create a key value identifying a location in the thread-specific data ++ area. Each thread maintains a distinct thread-specific data area. ++ DESTR_FUNCTION, if non-NULL, is called with ++ the value associated to that key when the key is destroyed. ++ DESTR_FUNCTION is not called if the value associated is NULL ++ when the key is destroyed. */ ++extern int __pthread_key_create __P ((pthread_key_t *__key, ++ void (*__destr_function) (void *))); ++extern int pthread_key_create __P ((pthread_key_t *__key, ++ void (*__destr_function) (void *))); ++ ++/* Destroy KEY. */ ++extern int pthread_key_delete __P ((pthread_key_t __key)); ++ ++/* Store POINTER in the thread-specific data slot identified by KEY. */ ++extern int __pthread_setspecific __P ((pthread_key_t __key, ++ __const void *__pointer)); ++extern int pthread_setspecific __P ((pthread_key_t __key, ++ __const void *__pointer)); ++ ++/* Return current value of the thread-specific data slot identified by KEY. */ ++extern void *__pthread_getspecific __P ((pthread_key_t __key)); ++extern void *pthread_getspecific __P ((pthread_key_t __key)); ++ ++ ++/* Functions for handling initialization */ ++ ++/* Guarantee that the initialization function INIT_ROUTINE will be called ++ only once, even if pthread_once is executed several times with the ++ same ONCE_CONTROL argument. ONCE_CONTROL must point to a static or ++ extern variable initialized to PTHREAD_ONCE_INIT. */ ++extern int __pthread_once __P ((pthread_once_t *__once_control, ++ void (*__init_routine) (void))); ++extern int pthread_once __P ((pthread_once_t *__once_control, ++ void (*__init_routine) (void))); ++ ++ ++/* Functions for handling cancellation. */ ++ ++/* Set cancelability state of current thread to STATE, returning old ++ state in *OLDSTATE if OLDSTATE is not NULL. */ ++extern int pthread_setcancelstate __P ((int __state, int *__oldstate)); ++ ++/* Set cancellation state of current thread to TYPE, returning the old ++ type in *OLDTYPE if OLDTYPE is not NULL. */ ++extern int pthread_setcanceltype __P ((int __type, int *__oldtype)); ++ ++/* Cancel THREAD immediately or at the next possibility. */ ++extern int pthread_cancel __P ((pthread_t __thread)); ++ ++/* Test for pending cancellation for the current thread and terminate ++ the thread as per pthread_exit(PTHREAD_CANCELED) if it has been ++ cancelled. */ ++extern void pthread_testcancel __P ((void)); ++ ++ ++/* Install a cleanup handler: ROUTINE will be called with arguments ARG ++ when the thread is cancelled or calls pthread_exit. ROUTINE will also ++ be called with arguments ARG when the matching pthread_cleanup_pop ++ is executed with non-zero EXECUTE argument. ++ pthread_cleanup_push and pthread_cleanup_pop are macros and must always ++ be used in matching pairs at the same nesting level of braces. */ ++ ++#define pthread_cleanup_push(routine,arg) \ ++ { struct _pthread_cleanup_buffer _buffer; \ ++ _pthread_cleanup_push (&_buffer, (routine), (arg)); ++ ++extern void _pthread_cleanup_push __P ((struct _pthread_cleanup_buffer *__buffer, ++ void (*__routine) (void *), ++ void *__arg)); ++ ++/* Remove a cleanup handler installed by the matching pthread_cleanup_push. ++ If EXECUTE is non-zero, the handler function is called. */ ++ ++#define pthread_cleanup_pop(execute) \ ++ _pthread_cleanup_pop (&_buffer, (execute)); } ++ ++extern void _pthread_cleanup_pop __P ((struct _pthread_cleanup_buffer *__buffer, ++ int __execute)); ++ ++/* Install a cleanup handler as pthread_cleanup_push does, but also ++ saves the current cancellation type and set it to deferred cancellation. */ ++ ++#ifdef __USE_GNU ++# define pthread_cleanup_push_defer_np(routine,arg) \ ++ { struct _pthread_cleanup_buffer _buffer; \ ++ _pthread_cleanup_push_defer (&_buffer, (routine), (arg)); ++ ++extern void _pthread_cleanup_push_defer __P ((struct _pthread_cleanup_buffer *__buffer, ++ void (*__routine) (void *), ++ void *__arg)); ++ ++/* Remove a cleanup handler as pthread_cleanup_pop does, but also ++ restores the cancellation type that was in effect when the matching ++ pthread_cleanup_push_defer was called. */ ++ ++# define pthread_cleanup_pop_restore_np(execute) \ ++ _pthread_cleanup_pop_restore (&_buffer, (execute)); } ++ ++extern void _pthread_cleanup_pop_restore __P ((struct _pthread_cleanup_buffer *__buffer, ++ int __execute)); ++#endif ++ ++/* Functions for handling signals. */ ++#include <bits/sigthread.h> ++ ++ ++/* Functions for handling process creation and process execution. */ ++ ++/* Install handlers to be called when a new process is created with FORK. ++ The PREPARE handler is called in the parent process just before performing ++ FORK. The PARENT handler is called in the parent process just after FORK. ++ The CHILD handler is called in the child process. Each of the three ++ handlers can be NULL, meaning that no handler needs to be called at that ++ point. ++ PTHREAD_ATFORK can be called several times, in which case the PREPARE ++ handlers are called in LIFO order (last added with PTHREAD_ATFORK, ++ first called before FORK), and the PARENT and CHILD handlers are called ++ in FIFO (first added, first called). */ ++ ++extern int __pthread_atfork __P ((void (*__prepare) (void), ++ void (*__parent) (void), ++ void (*__child) (void))); ++extern int pthread_atfork __P ((void (*__prepare) (void), ++ void (*__parent) (void), ++ void (*__child) (void))); ++ ++/* Terminate all threads in the program except the calling process. ++ Should be called just before invoking one of the exec*() functions. */ ++ ++extern void pthread_kill_other_threads_np __P ((void)); ++ ++ ++/* This function is called to initialize the pthread library. */ ++extern void __pthread_initialize __P ((void)); ++ ++__END_DECLS ++ ++#endif /* pthread.h */ +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/pthread/semaphore.h glibc-2.1.3/linuxthreads/sysdeps/pthread/semaphore.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/pthread/semaphore.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/semaphore.h 1998-09-10 21:32:08.000000000 -0700 +@@ -0,0 +1 @@ ++#include <linuxthreads/semaphore.h> +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc32/pt-machine.h 1998-10-09 11:34:08.000000000 -0700 +@@ -0,0 +1,66 @@ ++/* Machine-dependent pthreads configuration and inline functions. ++ sparc version. ++ Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Richard Henderson <rth@tamu.edu>. ++ ++ 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 PT_EI ++# define PT_EI extern inline ++#endif ++ ++/* Spinlock implementation; required. */ ++PT_EI int ++testandset (int *spinlock) ++{ ++ int ret; ++ ++ __asm__ __volatile__("ldstub %1,%0" ++ : "=r"(ret), "=m"(*spinlock) ++ : "m"(*spinlock)); ++ ++ return ret; ++} ++ ++ ++/* Spinlock release; default is just set to zero. */ ++#define RELEASE(spinlock) \ ++ __asm__ __volatile__("stbar; stb %1,%0" : "=m"(*(spinlock)) : "r"(0)); ++ ++ ++/* Get some notion of the current stack. Need not be exactly the top ++ of the stack, just something somewhere in the current frame. */ ++#define CURRENT_STACK_FRAME stack_pointer ++register char * stack_pointer __asm__("%sp"); ++ ++ ++/* Registers %g6 and %g7 are reserved by the ABI for "system use". It ++ happens that Solaris uses %g6 for the thread pointer -- we do the same. */ ++struct _pthread_descr_struct; ++register struct _pthread_descr_struct *__thread_self __asm__("%g6"); ++ ++/* Return the thread descriptor for the current thread. */ ++#define THREAD_SELF __thread_self ++ ++/* Initialize the thread-unique value. */ ++#define INIT_THREAD_SELF(descr, nr) (__thread_self = (descr)) ++ ++/* Access to data in the thread descriptor is easy. */ ++#define THREAD_GETMEM(descr, member) __thread_self->member ++#define THREAD_GETMEM_NC(descr, member) __thread_self->member ++#define THREAD_SETMEM(descr, member, value) __thread_self->member = (value) ++#define THREAD_SETMEM_NC(descr, member, value) __thread_self->member = (value) +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/sparc/sparc64/pt-machine.h 1999-06-16 15:34:10.000000000 -0700 +@@ -0,0 +1,77 @@ ++/* Machine-dependent pthreads configuration and inline functions. ++ Sparc v9 version. ++ Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Richard Henderson <rth@tamu.edu>. ++ ++ 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 PT_EI ++# define PT_EI extern inline ++#endif ++ ++ ++/* Spinlock implementation; required. */ ++PT_EI int ++testandset (int *spinlock) ++{ ++ int ret; ++ ++ __asm__ __volatile__("ldstub %1,%0" ++ : "=r"(ret), "=m"(*spinlock) : "m"(*spinlock)); ++ ++ return ret; ++} ++ ++ ++/* Get some notion of the current stack. Need not be exactly the top ++ of the stack, just something somewhere in the current frame. */ ++#define CURRENT_STACK_FRAME stack_pointer ++register char *stack_pointer __asm__ ("%sp"); ++ ++ ++/* Registers %g6 and %g7 are reserved by the ABI for "system use". It ++ happens that Solaris uses %g6 for the thread pointer -- we do the same. */ ++struct _pthread_descr_struct; ++register struct _pthread_descr_struct *__thread_self __asm__("%g6"); ++ ++/* Return the thread descriptor for the current thread. */ ++#define THREAD_SELF __thread_self ++ ++/* Initialize the thread-unique value. */ ++#define INIT_THREAD_SELF(descr, nr) (__thread_self = (descr)) ++ ++ ++/* Compare-and-swap for semaphores. */ ++ ++#define HAS_COMPARE_AND_SWAP ++PT_EI int ++__compare_and_swap (long int *p, long int oldval, long int newval) ++{ ++ long int readval; ++ ++ __asm__ __volatile__ ("casx [%4], %2, %0" ++ : "=r"(readval), "=m"(*p) ++ : "r"(oldval), "m"(*p), "r"(p), "0"(newval)); ++ ++ return readval == oldval; ++} ++ ++/* Access to data in the thread descriptor is easy. */ ++#define THREAD_GETMEM(descr, member) __thread_self->member ++#define THREAD_GETMEM_NC(descr, member) __thread_self->member ++#define THREAD_SETMEM(descr, member, value) __thread_self->member = (value) ++#define THREAD_SETMEM_NC(descr, member, value) __thread_self->member = (value) +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/Implies glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/Implies +--- ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/Implies 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/Implies 1998-08-28 03:07:20.000000000 -0700 +@@ -0,0 +1 @@ ++pthread +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/local_lim.h 1998-11-13 10:10:46.000000000 -0800 +@@ -0,0 +1,55 @@ ++/* Minimum guaranteed maximum values for system limits. Linux version. ++ Copyright (C) 1993, 94, 95, 96, 97, 98 Free Software 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. */ ++ ++/* The kernel header pollutes the namespace with the NR_OPEN symbol. ++ Remove this after including the header if necessary. */ ++#ifndef NR_OPEN ++# define __undef_NR_OPEN ++#endif ++ ++/* The kernel sources contain a file with all the needed information. */ ++#include <linux/limits.h> ++ ++/* Have to remove NR_OPEN? */ ++#ifdef __undef_NR_OPEN ++# undef NR_OPEN ++# undef __undef_NR_OPEN ++#endif ++ ++/* The number of data keys per process. */ ++#define _POSIX_THREAD_KEYS_MAX 128 ++/* This is the value this implementation supports. */ ++#define PTHREAD_KEYS_MAX 1024 ++ ++/* Controlling the iterations of destructors for thread-specific data. */ ++#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS 4 ++/* Number of iterations this implementation does. */ ++#define PTHREAD_DESTRUCTOR_ITERATIONS _POSIX_THREAD_DESTRUCTOR_ITERATIONS ++ ++/* The number of threads per process. */ ++#define _POSIX_THREAD_THREADS_MAX 64 ++/* This is the value this implementation supports. */ ++#define PTHREAD_THREADS_MAX 1024 ++ ++/* Maximum amount by which a process can descrease its asynchronous I/O ++ priority level. */ ++#define AIO_PRIO_DELTA_MAX 20 ++ ++/* Minimum size for a thread. We are free to choose a reasonable value. */ ++#define PTHREAD_STACK_MIN 16384 +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/posix_opt.h glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/posix_opt.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/posix_opt.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/posix_opt.h 1999-01-18 13:32:42.000000000 -0800 +@@ -0,0 +1,110 @@ ++/* Define POSIX options for Linux. ++ Copyright (C) 1996, 1997, 1998, 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 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 _POSIX_OPT_H ++#define _POSIX_OPT_H 1 ++ ++/* Job control is supported. */ ++#define _POSIX_JOB_CONTROL 1 ++ ++/* Processes have a saved set-user-ID and a saved set-group-ID. */ ++#define _POSIX_SAVED_IDS 1 ++ ++/* Priority scheduling is supported. */ ++#define _POSIX_PRIORITY_SCHEDULING 1 ++ ++/* Synchronizing file data is supported. */ ++#define _POSIX_SYNCHRONIZED_IO 1 ++ ++/* The fsync function is present. */ ++#define _POSIX_FSYNC 1 ++ ++/* Mapping of files to memory is supported. */ ++#define _POSIX_MAPPED_FILES 1 ++ ++/* Locking of all memory is supported. */ ++#define _POSIX_MEMLOCK 1 ++ ++/* Locking of ranges of memory is supported. */ ++#define _POSIX_MEMLOCK_RANGE 1 ++ ++/* Setting of memory protections is supported. */ ++#define _POSIX_MEMORY_PROTECTION 1 ++ ++/* Implementation supports `poll' function. */ ++#define _POSIX_POLL 1 ++ ++/* Implementation supports `select' and `pselect' functions. */ ++#define _POSIX_SELECT 1 ++ ++/* Only root can change owner of file. */ ++#define _POSIX_CHOWN_RESTRICTED 1 ++ ++/* `c_cc' member of 'struct termios' structure can be disabled by ++ using the value _POSIX_VDISABLE. */ ++#define _POSIX_VDISABLE '\0' ++ ++/* Filenames are not silently truncated. */ ++#define _POSIX_NO_TRUNC 1 ++ ++/* X/Open realtime support is available. */ ++#define _XOPEN_REALTIME 1 ++ ++/* X/Open realtime thread support is available. */ ++#define _XOPEN_REALTIME_THREADS 1 ++ ++/* XPG4.2 shared memory is supported. */ ++#define _XOPEN_SHM 1 ++ ++/* Tell we have POSIX threads. */ ++#define _POSIX_THREADS 1 ++ ++/* We have the reentrant functions described in POSIX. */ ++#define _POSIX_REENTRANT_FUNCTIONS 1 ++#define _POSIX_THREAD_SAFE_FUNCTIONS 1 ++ ++/* We provide priority scheduling for threads. */ ++#define _POSIX_THREAD_PRIORITY_SCHEDULING 1 ++ ++/* We support user-defined stack sizes. */ ++#define _POSIX_THREAD_ATTR_STACKSIZE 1 ++ ++/* We support user-defined stacks. */ ++#define _POSIX_THREAD_ATTR_STACKADDR 1 ++ ++/* We support POSIX.1b semaphores, but only the non-shared form for now. */ ++/*#define _POSIX_SEMAPHORES 1 XXX We are not quite there now. */ ++ ++/* Real-time signals are supported. */ ++#define _POSIX_REALTIME_SIGNALS 1 ++ ++/* We support asynchronous I/O. */ ++#define _POSIX_ASYNCHRONOUS_IO 1 ++/* Alternative name for Unix98. */ ++#define _LFS_ASYNCHRONOUS_IO 1 ++ ++/* The LFS support in asynchronous I/O is also available. */ ++#define _LFS64_ASYNCHRONOUS_IO 1 ++ ++/* The rest of the LFS is also available. */ ++#define _LFS_LARGEFILE 1 ++#define _LFS64_LARGEFILE 1 ++#define _LFS64_STDIO 1 ++ ++#endif /* posix_opt.h */ +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h +--- ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h 1998-09-13 09:25:31.000000000 -0700 +@@ -0,0 +1,37 @@ ++/* Signal handling function for threaded programs. ++ Copyright (C) 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 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 _BITS_SIGTHREAD_H ++#define _BITS_SIGTHREAD_H 1 ++ ++#if !defined _SIGNAL_H && !defined _PTHREAD_H ++# error "Never include this file directly. Use <pthread.h> instead" ++#endif ++ ++/* Functions for handling signals. */ ++ ++/* Modify the signal mask for the calling thread. The arguments have ++ the same meaning as for sigprocmask(2). */ ++extern int pthread_sigmask __P ((int __how, __const __sigset_t *__newmask, ++ __sigset_t *__oldmask)); ++ ++/* Send signal SIGNO to the given thread. */ ++extern int pthread_kill __P ((pthread_t __thread, int __signo)); ++ ++#endif /* bits/sigthread.h */ +diff -Naur ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/configure glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/configure +--- ../glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/configure 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/configure 1998-08-28 03:07:20.000000000 -0700 +@@ -0,0 +1,3 @@ ++# Local configure fragment for sysdeps/unix/sysv/linux. ++ ++DEFINES="$DEFINES -D_LIBC_REENTRANT" +diff -Naur ../glibc-2.1.3/linuxthreads/weaks.c glibc-2.1.3/linuxthreads/weaks.c +--- ../glibc-2.1.3/linuxthreads/weaks.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/weaks.c 1998-08-28 03:07:19.000000000 -0700 +@@ -0,0 +1,117 @@ ++/* The weak pthread functions for Linux. ++ Copyright (C) 1996, 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 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. */ ++ ++#include <errno.h> ++#include <limits.h> ++#include <stdlib.h> ++ ++extern int __pthread_return_0 __P ((void)); ++extern int __pthread_return_1 __P ((void)); ++extern void __pthread_return_void __P ((void)); ++ ++/* Those are pthread functions which return 0 if successful. */ ++#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING ++weak_alias (__pthread_return_0, __libc_pthread_attr_init_2_0) ++symbol_version (__libc_pthread_attr_init_2_0, pthread_attr_init, GLIBC_2.0); ++weak_alias (__pthread_return_0, __libc_pthread_attr_init_2_1) ++default_symbol_version (__libc_pthread_attr_init_2_1, pthread_attr_init, ++ GLIBC_2.1); ++#else ++weak_alias (__pthread_return_0, pthread_attr_init) ++#endif ++weak_alias (__pthread_return_0, pthread_attr_destroy) ++weak_alias (__pthread_return_0, pthread_attr_setdetachstate) ++weak_alias (__pthread_return_0, pthread_attr_getdetachstate) ++weak_alias (__pthread_return_0, pthread_attr_setschedparam) ++weak_alias (__pthread_return_0, pthread_attr_getschedparam) ++weak_alias (__pthread_return_0, pthread_attr_setschedpolicy) ++weak_alias (__pthread_return_0, pthread_attr_getschedpolicy) ++weak_alias (__pthread_return_0, pthread_attr_setinheritsched) ++weak_alias (__pthread_return_0, pthread_attr_getinheritsched) ++weak_alias (__pthread_return_0, pthread_attr_setscope) ++weak_alias (__pthread_return_0, pthread_attr_getscope) ++weak_alias (__pthread_return_0, pthread_attr_setstackaddr) ++weak_alias (__pthread_return_0, pthread_attr_getstackaddr) ++weak_alias (__pthread_return_0, pthread_attr_setstacksize) ++weak_alias (__pthread_return_0, pthread_attr_getstacksize) ++weak_alias (__pthread_return_0, pthread_mutex_init) ++weak_alias (__pthread_return_0, pthread_mutex_destroy) ++weak_alias (__pthread_return_0, pthread_mutex_lock) ++weak_alias (__pthread_return_0, pthread_mutex_trylock) ++weak_alias (__pthread_return_0, pthread_mutex_unlock) ++weak_alias (__pthread_return_0, pthread_mutexattr_init) ++weak_alias (__pthread_return_0, pthread_mutexattr_destroy) ++weak_alias (__pthread_return_0, pthread_mutexattr_settype) ++weak_alias (__pthread_return_0, pthread_mutexattr_gettype) ++weak_alias (__pthread_return_0, pthread_condattr_init) ++weak_alias (__pthread_return_0, pthread_condattr_destroy) ++weak_alias (__pthread_return_0, pthread_setschedparam) ++weak_alias (__pthread_return_0, pthread_getschedparam) ++weak_alias (__pthread_return_0, pthread_getcancelstate) ++weak_alias (__pthread_return_0, pthread_setcancelstate) ++weak_alias (__pthread_return_0, pthread_setcanceltype) ++weak_alias (__pthread_return_0, pthread_setconcurrency) ++weak_alias (__pthread_return_0, pthread_getconcurrency) ++weak_alias (__pthread_return_0, pthread_self) ++weak_alias (__pthread_return_0, pthread_cond_init) ++weak_alias (__pthread_return_0, pthread_cond_destroy) ++weak_alias (__pthread_return_0, pthread_cond_wait) ++weak_alias (__pthread_return_0, pthread_cond_timedwait) ++weak_alias (__pthread_return_0, pthread_cond_signal) ++weak_alias (__pthread_return_0, pthread_cond_broadcast) ++weak_alias (__pthread_return_0, pthread_rwlock_init) ++weak_alias (__pthread_return_0, pthread_rwlock_destroy) ++weak_alias (__pthread_return_0, pthread_rwlock_rdlock) ++weak_alias (__pthread_return_0, pthread_rwlock_wrlock) ++weak_alias (__pthread_return_0, pthread_rwlock_tryrdlock) ++weak_alias (__pthread_return_0, pthread_rwlock_trywrlock) ++weak_alias (__pthread_return_0, pthread_rwlock_unlock) ++weak_alias (__pthread_return_0, pthread_rwlockattr_init) ++weak_alias (__pthread_return_0, pthread_rwlockattr_destroy) ++weak_alias (__pthread_return_0, pthread_rwlockattr_setpshared) ++weak_alias (__pthread_return_0, pthread_rwlockattr_getpshared) ++ ++ ++/* Those are pthread functions which return 1 if successful. */ ++weak_alias (__pthread_return_1, pthread_equal) ++ ++/* pthread_exit () is a special case. */ ++void ++weak_function ++pthread_exit (void *retval) ++{ ++ exit (EXIT_SUCCESS); ++} ++ ++int ++__pthread_return_0 (void) ++{ ++ return 0; ++} ++ ++int ++__pthread_return_1 (void) ++{ ++ return 1; ++} ++ ++void ++__pthread_return_void (void) ++{ ++} +diff -Naur ../glibc-2.1.3/linuxthreads/wrapsyscall.c glibc-2.1.3/linuxthreads/wrapsyscall.c +--- ../glibc-2.1.3/linuxthreads/wrapsyscall.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/wrapsyscall.c 1998-12-02 11:03:25.000000000 -0800 +@@ -0,0 +1,186 @@ ++/* Wrapper arpund system calls to provide cancelation points. ++ Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. ++ ++ 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. */ ++ ++#include <fcntl.h> ++#include <sys/mman.h> ++#include <pthread.h> ++#include <unistd.h> ++#include <stdarg.h> ++#include <stddef.h> ++#include <stdlib.h> ++#include <termios.h> ++#include <sys/resource.h> ++#include <sys/wait.h> ++#include <sys/socket.h> ++ ++ ++#ifndef PIC ++/* We need a hook to force this file to be linked in when static ++ libpthread is used. */ ++const int __pthread_provide_wrappers = 0; ++#endif ++ ++ ++#define CANCELABLE_SYSCALL(res_type, name, param_list, params) \ ++res_type __libc_##name param_list; \ ++res_type \ ++name param_list \ ++{ \ ++ res_type result; \ ++ int oldtype; \ ++ pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype); \ ++ result = __libc_##name params; \ ++ pthread_setcanceltype (oldtype, NULL); \ ++ return result; \ ++} ++ ++#define CANCELABLE_SYSCALL_VA(res_type, name, param_list, params, last_arg) \ ++res_type __libc_##name param_list; \ ++res_type \ ++name param_list \ ++{ \ ++ res_type result; \ ++ int oldtype; \ ++ va_list ap; \ ++ pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, &oldtype); \ ++ va_start (ap, last_arg); \ ++ result = __libc_##name params; \ ++ va_end (ap); \ ++ pthread_setcanceltype (oldtype, NULL); \ ++ return result; \ ++} ++ ++ ++/* close(2). */ ++CANCELABLE_SYSCALL (int, close, (int fd), (fd)) ++strong_alias (close, __close) ++ ++ ++/* fcntl(2). */ ++CANCELABLE_SYSCALL_VA (int, fcntl, (int fd, int cmd, ...), ++ (fd, cmd, va_arg (ap, long int)), cmd) ++strong_alias (fcntl, __fcntl) ++ ++ ++/* fsync(2). */ ++CANCELABLE_SYSCALL (int, fsync, (int fd), (fd)) ++ ++ ++/* lseek(2). */ ++CANCELABLE_SYSCALL (off_t, lseek, (int fd, off_t offset, int whence), ++ (fd, offset, whence)) ++strong_alias (lseek, __lseek) ++ ++ ++/* msync(2). */ ++CANCELABLE_SYSCALL (int, msync, (__ptr_t addr, size_t length, int flags), ++ (addr, length, flags)) ++ ++ ++/* nanosleep(2). */ ++CANCELABLE_SYSCALL (int, nanosleep, (const struct timespec *requested_time, ++ struct timespec *remaining), ++ (requested_time, remaining)) ++ ++ ++/* open(2). */ ++CANCELABLE_SYSCALL_VA (int, open, (const char *pathname, int flags, ...), ++ (pathname, flags, va_arg (ap, mode_t)), flags) ++strong_alias (open, __open) ++ ++ ++/* pause(2). */ ++CANCELABLE_SYSCALL (int, pause, (void), ()) ++ ++ ++/* read(2). */ ++CANCELABLE_SYSCALL (ssize_t, read, (int fd, void *buf, size_t count), ++ (fd, buf, count)) ++strong_alias (read, __read) ++ ++ ++/* system(3). */ ++CANCELABLE_SYSCALL (int, system, (const char *line), (line)) ++ ++ ++/* tcdrain(2). */ ++CANCELABLE_SYSCALL (int, tcdrain, (int fd), (fd)) ++ ++ ++/* wait(2). */ ++CANCELABLE_SYSCALL (__pid_t, wait, (__WAIT_STATUS_DEFN stat_loc), (stat_loc)) ++strong_alias (wait, __wait) ++ ++ ++/* waitpid(2). */ ++CANCELABLE_SYSCALL (__pid_t, waitpid, (__pid_t pid, int *stat_loc, ++ int options), ++ (pid, stat_loc, options)) ++ ++ ++/* write(2). */ ++CANCELABLE_SYSCALL (ssize_t, write, (int fd, const void *buf, size_t n), ++ (fd, buf, n)) ++strong_alias (write, __write) ++ ++ ++/* The following system calls are thread cancellation points specified ++ in XNS. */ ++ ++/* accept(2). */ ++CANCELABLE_SYSCALL (int, accept, (int fd, __SOCKADDR_ARG addr, ++ socklen_t *addr_len), ++ (fd, addr, addr_len)) ++ ++/* connect(2). */ ++CANCELABLE_SYSCALL (int, connect, (int fd, __CONST_SOCKADDR_ARG addr, ++ socklen_t len), ++ (fd, addr, len)) ++strong_alias (connect, __connect) ++ ++/* recv(2). */ ++CANCELABLE_SYSCALL (int, recv, (int fd, __ptr_t buf, size_t n, int flags), ++ (fd, buf, n, flags)) ++ ++/* recvfrom(2). */ ++CANCELABLE_SYSCALL (int, recvfrom, (int fd, __ptr_t buf, size_t n, int flags, ++ __SOCKADDR_ARG addr, socklen_t *addr_len), ++ (fd, buf, n, flags, addr, addr_len)) ++ ++/* recvmsg(2). */ ++CANCELABLE_SYSCALL (int, recvmsg, (int fd, struct msghdr *message, int flags), ++ (fd, message, flags)) ++ ++/* send(2). */ ++CANCELABLE_SYSCALL (int, send, (int fd, const __ptr_t buf, size_t n, ++ int flags), ++ (fd, buf, n, flags)) ++strong_alias (send, __send) ++ ++/* sendmsg(2). */ ++CANCELABLE_SYSCALL (int, sendmsg, (int fd, const struct msghdr *message, ++ int flags), ++ (fd, message, flags)) ++ ++/* sendto(2). */ ++CANCELABLE_SYSCALL (int, sendto, (int fd, const __ptr_t buf, size_t n, ++ int flags, __CONST_SOCKADDR_ARG addr, ++ socklen_t addr_len), ++ (fd, buf, n, flags, addr, addr_len)) +diff -Naur ../glibc-2.1.3/linuxthreads_db/Banner glibc-2.1.3/linuxthreads_db/Banner +--- ../glibc-2.1.3/linuxthreads_db/Banner 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/Banner 1999-11-12 10:51:03.000000000 -0800 +@@ -0,0 +1 @@ ++libthread_db work sponsored by Alpha Processor Inc +diff -Naur ../glibc-2.1.3/linuxthreads_db/ChangeLog glibc-2.1.3/linuxthreads_db/ChangeLog +--- ../glibc-2.1.3/linuxthreads_db/ChangeLog 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/ChangeLog 2000-01-20 18:16:37.000000000 -0800 +@@ -0,0 +1,208 @@ ++2000-01-19 Ulrich Drepper <drepper@cygnus.com> ++ ++ * td_thr_getgregs.c: Correct size parameter of memset call. ++ ++1999-12-02 Ulrich Drepper <drepper@cygnus.com> ++ ++ * proc_service.h: Fix typoes in last added declaractions. ++ ++1999-12-01 Ulrich Drepper <drepper@cygnus.com> ++ ++ * proc_service.h: Add ps_pstop, ps_pcontinue, ps_lstop, and ++ ps_lcontinue prototypes. ++ ++1999-11-23 Ulrich Drepper <drepper@cygnus.com> ++ ++ * Makefile: Correct dependency for shared object. ++ ++1999-11-22 Ulrich Drepper <drepper@cygnus.com> ++ ++ * td_ta_map_lwp2thr.c: Add missing brace in comparison. ++ ++ * thread_dbP.h (LOG): Only print message if __td_debug is nonzero. ++ * td_init.c: Add __td_debug. ++ ++1999-11-12 Ulrich Drepper <drepper@cygnus.com> ++ ++ * td_ta_thr_iter.c: Start copying list of descriptors from right ++ position in target process. ++ ++ * td_ta_thr_iter.c: Fix loop starting point over all but main and ++ manager thread. ++ ++ * td_ta_thr_iter.c: Read descriptors for main and manager thread ++ special since after this we can assume that no new threads will be ++ created anymore (at least in the gdb implementation). ++ ++ * Makefile: Define version correctly. ++ ++1999-11-10 Ulrich Drepper <drepper@cygnus.com> ++ ++ * td_ta_map_lwp2thr.c: If p_pid field is zero, this is before the ++ thread library is initialized and we get the PID from the ++ debugger. ++ ++1999-11-08 Ulrich Drepper <drepper@cygnus.com> ++ ++ * td_thr_get_info.c: Make sure ti_lid is never zero. ++ ++ * proc_service.h: Add ps_getpid prototype. ++ ++1999-11-03 Ulrich Drepper <drepper@cygnus.com> ++ ++ * thread_dbP.h (ta_ok): New function. ++ * td_ta_new.c: Add new handle to list. ++ * td_ta_delete.c: Remove handle from list. ++ * td_ta_clear_event.c: Use ta_ok to check for correct ta parameter. ++ * td_ta_enable_stats.c: Likewise. ++ * td_ta_event_addr.c: Likewise. ++ * td_ta_event_getmsg.c: Likewise. ++ * td_ta_get_nthreads.c: Likewise. ++ * td_ta_get_ph.c: Likewise. ++ * td_ta_get_stats.c: Likewise. ++ * td_ta_map_id2thr.c: Likewise. ++ * td_ta_map_lwp2thr.c: Likewise. ++ * td_ta_reset_stats.c: Likewise. ++ * td_ta_set_event.c: Likewise. ++ * td_ta_setconcurrency.c: Likewise. ++ * td_ta_thr_iter.c: Likewise. ++ ++ * td_ta_tsd_iter.c: Optimize memory retrieving. ++ ++ * Versions: New file. ++ ++ * td_thr_get_info.c (td_thr_get_info): Initialize ti_traceme. ++ ++1999-11-02 Ulrich Drepper <drepper@cygnus.com> ++ ++ * td_ta_thr_iter.c (td_ta_thr_iter): Optimize a bit. Read all ++ handles at once. ++ ++ * thread_dbP.h (struct th_thragent): Add pthread_handle_num. ++ * td_ta_new.c: Initialize pthread_handle_num. ++ * td_ta_event_getmsg.c: If last event was already reported search ++ for another unreported event. ++ ++ * td_thr_get_info.c (td_thr_get_info): Initialize ti_events. ++ ++ * Makefile (libthread_db-routines): Add td_ta_set_event, ++ td_ta_event_getmsg, and td_ta_clear_event. ++ * td_ta_clear_event.c: New file. ++ * td_ta_event_getmsg.c: New file. ++ * td_ta_new.c: Get address of __pthread_last_event in target. ++ * td_ta_set_event.c: Don't overwrite old mask, set additional bits. ++ * td_thr_set_event.c: Likewise. ++ * td_thr_clear_event.c: Implement. ++ * thread_db.h: Declare td_ta_clear_event and td_ta_event_getmsg. ++ * thread_dbP.h (struct td_thragent): Add pthread_last_event. ++ ++ * td_ta_new.c: Don't test for __pthread_threads_debug. Get address ++ of __pthread_threads_events and fail if this is not possible. ++ * td_ta_event_addr.c: Implement. ++ * td_thr_event_enable.c: Implement. ++ * td_thr_event_getmsg.c: Implement. ++ * td_thr_set_event.c: Implement. ++ * td_ta_set_event.c: New file. ++ * thread_db.h (td_eventbuf_t): Define. ++ Declare td_ta_set_event. ++ * thread_dbP.h (struct td_thragent): Add pthread_threads_eventsp. ++ ++ * td_thr_getfpregs.c: For terminated threads return empty structure. ++ * td_thr_getgregs.c: Likewise. ++ * td_thr_setfpregs.c: Likewise. ++ * td_thr_setgregs.c: Likewise. ++ ++1999-11-01 Ulrich Drepper <drepper@cygnus.com> ++ ++ * thread_db.h: Shuffle types around to make things work for gdb. ++ * thread_dbP.h: Include proc_service.h before thread_db.h. ++ ++ * thread_db.h: It's TD_NOLIBTHREAD, not TD_LIBTHREAD. ++ * td_ta_new.c: Likewise. ++ ++1999-10-14 Ulrich Drepper <drepper@cygnus.com> ++ ++ * td_ta_new.c: p_startfct does not exist anymore. ++ ++ * td_thr_get_info.c: Always initialize start function. ++ ++ * td_ta_thr_iter.c: Don't return threads which exited (but are not ++ joined). ++ ++ * td_thr_validate.c: Don't skip manager thread. ++ ++1999-10-13 Ulrich Drepper <drepper@cygnus.com> ++ ++ * td_ta_thr_iter.c: Use size of descriptor from *TA. ++ Don't return manager thread before it's actually running. ++ Actually use state parameter to distingusih at least a few states. ++ ++ * td_thr_get_info.c: Handle manager thread special. Fill in ti_lid, ++ ti_state, and ti_startfunc fields. ++ ++1999-10-12 Andreas Jaeger <aj@suse.de> ++ ++ * thread_dbP.h: Include <string.h> for strlen declaration. Remove ++ __libc_write prototype since this is already declared in ++ linuxthreads/internals.h. ++ ++1999-10-11 Ulrich Drepper <drepper@cygnus.com> ++ ++ * thread_db.h: Fix comment for ti_type. ++ ++ * td_thr_get_info.c: Initialize ti_type field. ++ ++ * td_ta_thr_iter.c: Also report the manager thread. ++ ++1999-10-08 Andreas Jaeger <aj@suse.de> ++ ++ * thread_db.h: Fix typos in comments. ++ ++ * td_ta_get_nthreads.c (td_ta_get_nthreads): Don't hardcode ++ libpthread library name, get it from <gnu/lib-names.h> instead. ++ * td_ta_new.c (td_ta_new): Likewise. ++ ++1999-10-08 Ulrich Drepper <drepper@cygnus.com> ++ ++ * shlib-versions: New file. ++ ++1999-10-07 Ulrich Drepper <drepper@cygnus.com> ++ ++ * Makefile: New file. ++ * proc_service.h: New file. ++ * td_init.c: New file. ++ * td_log.c: New file. ++ * td_ta_delete.c: New file. ++ * td_ta_enable_stats.c: New file. ++ * td_ta_event_addr.c: New file. ++ * td_ta_get_nthreads.c: New file. ++ * td_ta_get_ph.c: New file. ++ * td_ta_get_stats.c: New file. ++ * td_ta_map_id2thr.c: New file. ++ * td_ta_map_lwp2thr.c: New file. ++ * td_ta_new.c: New file. ++ * td_ta_reset_stats.c: New file. ++ * td_ta_setconcurrency.c: New file. ++ * td_ta_thr_iter.c: New file. ++ * td_ta_tsd_iter.c: New file. ++ * td_thr_clear_event.c: New file. ++ * td_thr_dbresume.c: New file. ++ * td_thr_dbsuspend.c: New file. ++ * td_thr_event_enable.c: New file. ++ * td_thr_event_getmsg.c: New file. ++ * td_thr_get_info.c: New file. ++ * td_thr_getfpregs.c: New file. ++ * td_thr_getgregs.c: New file. ++ * td_thr_getxregs.c: New file. ++ * td_thr_getxregsize.c: New file. ++ * td_thr_set_event.c: New file. ++ * td_thr_setfpregs.c: New file. ++ * td_thr_setgregs.c: New file. ++ * td_thr_setprio.c: New file. ++ * td_thr_setsigpending.c: New file. ++ * td_thr_setxregs.c: New file. ++ * td_thr_sigsetmask.c: New file. ++ * td_thr_tsd.c: New file. ++ * td_thr_validate.c: New file. ++ * thread_db.h: New file. ++ * thread_dbP.h: New file. +diff -Naur ../glibc-2.1.3/linuxthreads_db/Makefile glibc-2.1.3/linuxthreads_db/Makefile +--- ../glibc-2.1.3/linuxthreads_db/Makefile 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/Makefile 1999-11-23 09:46:56.000000000 -0800 +@@ -0,0 +1,51 @@ ++# 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 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. ++ ++# Makefile for linuxthreads debug library subdirectory of GNU C Library. ++ ++subdir := linuxthreads_db ++ ++linuxthreads_db-version = 1.0 ++ ++extra-libs = libthread_db ++extra-libs-others := $(extra-libs) ++ ++headers = thread_db.h ++libthread_db-routines = td_init td_log td_ta_delete td_ta_get_nthreads \ ++ td_ta_get_ph td_ta_map_id2thr td_ta_map_lwp2thr \ ++ td_ta_new td_ta_thr_iter td_ta_tsd_iter \ ++ td_thr_get_info td_thr_getfpregs td_thr_getgregs \ ++ td_thr_getxregs td_thr_getxregsize td_thr_setfpregs \ ++ td_thr_setgregs td_thr_setprio td_thr_setsigpending \ ++ td_thr_setxregs td_thr_sigsetmask td_thr_tsd \ ++ td_thr_validate td_thr_dbsuspend td_thr_dbresume \ ++ td_ta_setconcurrency td_ta_enable_stats \ ++ td_ta_reset_stats td_ta_get_stats td_ta_event_addr \ ++ td_thr_event_enable td_thr_set_event \ ++ td_thr_clear_event td_thr_event_getmsg \ ++ td_ta_set_event td_ta_event_getmsg \ ++ td_ta_clear_event ++ ++libthread_db-inhibit-o = $(filter-out .os,$(object-suffixes)) ++ ++include ../Rules ++ ++# Depend on libc.so so a DT_NEEDED is generated in the shared objects. ++# This ensures they will load libc.so for needed symbols if loaded by ++# a statically-linked program that hasn't already loaded it. ++$(objpfx)libthread_db.so: $(common-objpfx)libc.so +diff -Naur ../glibc-2.1.3/linuxthreads_db/Versions glibc-2.1.3/linuxthreads_db/Versions +--- ../glibc-2.1.3/linuxthreads_db/Versions 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/Versions 1999-11-09 23:03:06.000000000 -0800 +@@ -0,0 +1,15 @@ ++libthread_db { ++ GLIBC_2.1.3 { ++ # t* ++ td_init; td_log; td_ta_clear_event; td_ta_delete; td_ta_enable_stats; ++ td_ta_event_addr; td_ta_event_getmsg; td_ta_get_nthreads; td_ta_get_ph; ++ td_ta_get_stats; td_ta_map_id2thr; td_ta_map_lwp2thr; td_ta_new; ++ td_ta_reset_stats; td_ta_set_event; td_ta_setconcurrency; ++ td_ta_thr_iter; td_ta_tsd_iter; td_thr_clear_event; td_thr_dbresume; ++ td_thr_dbsuspend; td_thr_event_enable; td_thr_event_getmsg; ++ td_thr_get_info; td_thr_getfpregs; td_thr_getgregs; td_thr_getxregs; ++ td_thr_getxregsize; td_thr_set_event; td_thr_setfpregs; td_thr_setgregs; ++ td_thr_setprio; td_thr_setsigpending; td_thr_setxregs; td_thr_sigsetmask; ++ td_thr_tsd; td_thr_validate; ++ } ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/proc_service.h glibc-2.1.3/linuxthreads_db/proc_service.h +--- ../glibc-2.1.3/linuxthreads_db/proc_service.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/proc_service.h 1999-12-02 00:07:56.000000000 -0800 +@@ -0,0 +1,70 @@ ++/* 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 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. */ ++ ++/* The definitions in this file must correspond to those in the debugger. */ ++#include <sys/procfs.h> ++ ++typedef enum ++{ ++ PS_OK, /* generic "call succeeded" */ ++ PS_ERR, /* generic. */ ++ PS_BADPID, /* bad process handle */ ++ PS_BADLID, /* bad lwp identifier */ ++ PS_BADADDR, /* bad address */ ++ PS_NOSYM, /* p_lookup() could not find given symbol */ ++ PS_NOFREGS ++ /* ++ * FPU register set not available for given ++ * lwp ++ */ ++} ps_err_e; ++ ++ ++struct ps_prochandle; /* user defined. */ ++ ++ ++extern ps_err_e ps_pdread(struct ps_prochandle *, ++ psaddr_t, void *, size_t); ++extern ps_err_e ps_pdwrite(struct ps_prochandle *, ++ psaddr_t, const void *, size_t); ++extern ps_err_e ps_ptread(struct ps_prochandle *, ++ psaddr_t, void *, size_t); ++extern ps_err_e ps_ptwrite(struct ps_prochandle *, ++ psaddr_t, const void *, size_t); ++ ++extern ps_err_e ps_pglobal_lookup(struct ps_prochandle *, ++ const char *object_name, const char *sym_name, psaddr_t *sym_addr); ++ ++ ++extern ps_err_e ps_lgetregs(struct ps_prochandle *, ++ lwpid_t, prgregset_t); ++extern ps_err_e ps_lsetregs(struct ps_prochandle *, ++ lwpid_t, const prgregset_t); ++extern ps_err_e ps_lgetfpregs(struct ps_prochandle *, ++ lwpid_t, prfpregset_t *); ++extern ps_err_e ps_lsetfpregs(struct ps_prochandle *, ++ lwpid_t, const prfpregset_t *); ++ ++extern pid_t ps_getpid (struct ps_prochandle *); ++ ++ ++extern ps_err_e ps_pstop (const struct ps_prochandle *); ++extern ps_err_e ps_pcontinue (const struct ps_prochandle *); ++ ++extern ps_err_e ps_lstop (const struct ps_prochandle *, lwpid_t); ++extern ps_err_e ps_lcontinue (const struct ps_prochandle *, lwpid_t); +diff -Naur ../glibc-2.1.3/linuxthreads_db/shlib-versions glibc-2.1.3/linuxthreads_db/shlib-versions +--- ../glibc-2.1.3/linuxthreads_db/shlib-versions 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/shlib-versions 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,2 @@ ++# The thread debug library ++.*-.*-linux.* libthread_db=1 +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_init.c glibc-2.1.3/linuxthreads_db/td_init.c +--- ../glibc-2.1.3/linuxthreads_db/td_init.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_init.c 1999-11-22 12:50:11.000000000 -0800 +@@ -0,0 +1,32 @@ ++/* Initialization function of thread debugger support library. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++int __td_debug; ++ ++ ++td_err_e ++td_init (void) ++{ ++ /* XXX We have to figure out what has to be done. */ ++ LOG (__FUNCTION__); ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_log.c glibc-2.1.3/linuxthreads_db/td_log.c +--- ../glibc-2.1.3/linuxthreads_db/td_log.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_log.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,32 @@ ++/* Noop, left for historical reasons. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_log (void) ++{ ++ /* This interface is deprecated in the Sun interface. We provide it ++ for compatibility but don't do anyhting ourself. We might in ++ future do some logging if this seems reasonable. */ ++ LOG (__FUNCTION__); ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_clear_event.c glibc-2.1.3/linuxthreads_db/td_ta_clear_event.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_clear_event.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_clear_event.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,53 @@ ++/* Globally disable events. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_ta_clear_event (ta, event) ++ const td_thragent_t *ta; ++ td_thr_events_t *event; ++{ ++ td_thr_events_t old_event; ++ int i; ++ ++ LOG (__FUNCTION__); ++ ++ /* Test whether the TA parameter is ok. */ ++ if (! ta_ok (ta)) ++ return TD_BADTA; ++ ++ /* Write the new value into the thread data structure. */ ++ if (ps_pdread (ta->ph, ta->pthread_threads_eventsp, ++ &old_event, sizeof (td_thrhandle_t)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ /* Remove the set bits in. */ ++ for (i = 0; i < TD_EVENTSIZE; ++i) ++ old_event.event_bits[i] &= ~event->event_bits[i]; ++ ++ /* Write the new value into the thread data structure. */ ++ if (ps_pdwrite (ta->ph, ta->pthread_threads_eventsp, ++ &old_event, sizeof (td_thrhandle_t)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_delete.c glibc-2.1.3/linuxthreads_db/td_ta_delete.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_delete.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_delete.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,58 @@ ++/* Detach to target process. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include <stdlib.h> ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_ta_delete (td_thragent_t *ta) ++{ ++ LOG (__FUNCTION__); ++ ++ /* Safety check. */ ++ if (ta == NULL || __td_agent_list == NULL) ++ return TD_BADTA; ++ ++ /* Remove the handle from the list. */ ++ if (ta == __td_agent_list->ta) ++ /* It's the first element of the list. */ ++ __td_agent_list = __td_agent_list->next; ++ else ++ { ++ /* We have to search for it. */ ++ struct agent_list *runp = __td_agent_list; ++ ++ while (runp->next != NULL && runp->next->ta != ta) ++ runp = runp->next; ++ ++ if (runp->next == NULL) ++ /* It's not a valid decriptor since it is not in the list. */ ++ return TD_BADTA; ++ ++ runp->next = runp->next->next; ++ } ++ ++ /* The handle was allocated in `td_ta_new'. */ ++ free (ta); ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_enable_stats.c glibc-2.1.3/linuxthreads_db/td_ta_enable_stats.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_enable_stats.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_enable_stats.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,35 @@ ++/* Enable collection of statistics for process. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_ta_enable_stats (const td_thragent_t *ta, int enable) ++{ ++ /* XXX We have to figure out what has to be done. */ ++ LOG (__FUNCTION__); ++ ++ /* Test whether the TA parameter is ok. */ ++ if (! ta_ok (ta)) ++ return TD_BADTA; ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_event_addr.c glibc-2.1.3/linuxthreads_db/td_ta_event_addr.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_event_addr.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_event_addr.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,75 @@ ++/* Get event address. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include <gnu/lib-names.h> ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_ta_event_addr (const td_thragent_t *ta, td_event_e event, td_notify_t *addr) ++{ ++ td_err_e res = TD_NOEVENT; ++ const char *symbol = NULL; ++ ++ LOG (__FUNCTION__); ++ ++ /* Test whether the TA parameter is ok. */ ++ if (! ta_ok (ta)) ++ return TD_BADTA; ++ ++ switch (event) ++ { ++ case TD_CREATE: ++ symbol = "__linuxthreads_create_event"; ++ break; ++ ++ case TD_DEATH: ++ symbol = "__linuxthreads_death_event"; ++ break; ++ ++ case TD_REAP: ++ symbol = "__linuxthreads_reap_event"; ++ break; ++ ++ default: ++ /* Event cannot be handled. */ ++ break; ++ } ++ ++ /* Now get the address. */ ++ if (symbol != NULL) ++ { ++ psaddr_t taddr; ++ ++ if (ps_pglobal_lookup (ta->ph, LIBPTHREAD_SO, symbol, &taddr) == PS_OK) ++ { ++ /* Success, we got the address. */ ++ addr->type = NOTIFY_BPT; ++ addr->u.bptaddr = taddr; ++ ++ res = TD_OK; ++ } ++ else ++ res = TD_ERR; ++ } ++ ++ return res; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_event_getmsg.c glibc-2.1.3/linuxthreads_db/td_ta_event_getmsg.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_event_getmsg.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_event_getmsg.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,128 @@ ++/* Retrieve event. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include <stddef.h> ++#include <string.h> ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_ta_event_getmsg (const td_thragent_t *ta, td_event_msg_t *msg) ++{ ++ /* XXX I cannot think of another way but using a static variable. */ ++ static td_thrhandle_t th; ++ td_eventbuf_t event; ++ psaddr_t addr; ++ ++ LOG (__FUNCTION__); ++ ++ /* Test whether the TA parameter is ok. */ ++ if (! ta_ok (ta)) ++ return TD_BADTA; ++ ++ /* Get the pointer to the thread descriptor with the last event. */ ++ if (ps_pdread (ta->ph, ta->pthread_last_event, ++ &addr, sizeof (void *)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ /* If the pointer is NULL no event occurred. */ ++ if (addr == 0) ++ return TD_NOMSG; ++ ++ /* Read the even structure from the target. */ ++ if (ps_pdread (ta->ph, ++ ((char *) addr ++ + offsetof (struct _pthread_descr_struct, p_eventbuf)), ++ &event, sizeof (td_eventbuf_t)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ /* Check whether an event occurred. */ ++ if (event.eventnum == TD_EVENT_NONE) ++ { ++ /* Oh well, this means the last event was already read. So ++ we have to look for any other event. */ ++ struct pthread_handle_struct handles[ta->pthread_threads_max]; ++ int num; ++ int i; ++ ++ /* Read the number of currently active threads. */ ++ if (ps_pdread (ta->ph, ta->pthread_handles_num, &num, sizeof (int)) ++ != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ /* Now read the handles. */ ++ if (ps_pdread (ta->ph, ta->handles, handles, ++ ta->pthread_threads_max * sizeof (handles[0])) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ for (i = 0; i < ta->pthread_threads_max && num > 0; ++i) ++ { ++ if (handles[i].h_descr == NULL) ++ /* No entry here. */ ++ continue; ++ ++ /* First count this active thread. */ ++ --num; ++ ++ if (handles[i].h_descr == addr) ++ /* We already handled this. */ ++ continue; ++ ++ /* Read the event data for this thread. */ ++ if (ps_pdread (ta->ph, ++ ((char *) handles[i].h_descr ++ + offsetof (struct _pthread_descr_struct, ++ p_eventbuf)), ++ &event, sizeof (td_eventbuf_t)) != PS_OK) ++ return TD_ERR; ++ ++ if (event.eventnum != TD_EVENT_NONE) ++ { ++ /* We found a thread with an unreported event. */ ++ addr = handles[i].h_descr; ++ break; ++ } ++ } ++ ++ /* If we haven't found any other event signal this to the user. */ ++ if (event.eventnum == TD_EVENT_NONE) ++ return TD_NOMSG; ++ } ++ ++ /* Generate the thread descriptor. */ ++ th.th_ta_p = (td_thragent_t *) ta; ++ th.th_unique = addr; ++ ++ /* Fill the user's data structure. */ ++ msg->event = event.eventnum; ++ msg->th_p = &th; ++ msg->msg.data = (uintptr_t) event.eventdata; ++ ++ /* And clear the event message in the target. */ ++ memset (&event, '\0', sizeof (td_eventbuf_t)); ++ if (ps_pdwrite (ta->ph, ++ ((char *) addr ++ + offsetof (struct _pthread_descr_struct, p_eventbuf)), ++ &event, sizeof (td_eventbuf_t)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_get_nthreads.c glibc-2.1.3/linuxthreads_db/td_ta_get_nthreads.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_get_nthreads.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_get_nthreads.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,44 @@ ++/* Get the number of threads in the process. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++#include <gnu/lib-names.h> ++ ++td_err_e ++td_ta_get_nthreads (const td_thragent_t *ta, int *np) ++{ ++ psaddr_t addr; ++ ++ LOG (__FUNCTION__); ++ ++ /* Test whether the TA parameter is ok. */ ++ if (! ta_ok (ta)) ++ return TD_BADTA; ++ ++ /* Access the variable `__pthread_handles_num'. */ ++ if (ps_pglobal_lookup (ta->ph, LIBPTHREAD_SO, "__pthread_handles_num", ++ &addr) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ if (ps_pdread (ta->ph, addr, np, sizeof (int)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_get_ph.c glibc-2.1.3/linuxthreads_db/td_ta_get_ph.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_get_ph.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_get_ph.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,36 @@ ++/* Get external process handle. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_ta_get_ph (const td_thragent_t *ta, struct ps_prochandle **ph) ++{ ++ LOG (__FUNCTION__); ++ ++ /* Test whether the TA parameter is ok. */ ++ if (! ta_ok (ta)) ++ return TD_BADTA; ++ ++ *ph = ta->ph; ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_get_stats.c glibc-2.1.3/linuxthreads_db/td_ta_get_stats.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_get_stats.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_get_stats.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,35 @@ ++/* Retrieve statistics for process. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_ta_get_stats (const td_thragent_t *ta, td_ta_stats_t *statsp) ++{ ++ /* XXX We have to figure out what has to be done. */ ++ LOG (__FUNCTION__); ++ ++ /* Test whether the TA parameter is ok. */ ++ if (! ta_ok (ta)) ++ return TD_BADTA; ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_map_id2thr.c glibc-2.1.3/linuxthreads_db/td_ta_map_id2thr.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_map_id2thr.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_map_id2thr.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,63 @@ ++/* Map thread ID to thread handle. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_ta_map_id2thr (const td_thragent_t *ta, pthread_t pt, td_thrhandle_t *th) ++{ ++ struct pthread_handle_struct phc; ++ struct _pthread_descr_struct pds; ++ int pthread_threads_max; ++ ++ LOG (__FUNCTION__); ++ ++ /* Test whether the TA parameter is ok. */ ++ if (! ta_ok (ta)) ++ return TD_BADTA; ++ ++ /* Make the following expression a bit smaller. */ ++ pthread_threads_max = ta->pthread_threads_max; ++ ++ /* We can compute the entry in the handle array we want. */ ++ if (ps_pdread (ta->ph, ta->handles + pt % pthread_threads_max, &phc, ++ sizeof (struct pthread_handle_struct)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ /* Test whether this entry is in use. */ ++ if (phc.h_descr == NULL) ++ return TD_BADTH; ++ ++ /* Next test: get the descriptor to see whether this is not an old ++ thread handle. */ ++ if (ps_pdread (ta->ph, phc.h_descr, &pds, ++ sizeof (struct _pthread_descr_struct)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ if (pds.p_tid != pt) ++ return TD_BADTH; ++ ++ /* Create the `td_thrhandle_t' object. */ ++ th->th_ta_p = (td_thragent_t *) ta; ++ th->th_unique = phc.h_descr; ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_map_lwp2thr.c glibc-2.1.3/linuxthreads_db/td_ta_map_lwp2thr.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_map_lwp2thr.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_map_lwp2thr.c 1999-11-22 18:24:56.000000000 -0800 +@@ -0,0 +1,81 @@ ++/* Which thread is running on an lwp? ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_ta_map_lwp2thr (const td_thragent_t *ta, lwpid_t lwpid, td_thrhandle_t *th) ++{ ++ int pthread_threads_max = ta->pthread_threads_max; ++ size_t sizeof_descr = ta->sizeof_descr; ++ struct pthread_handle_struct phc[pthread_threads_max]; ++ size_t cnt; ++#ifdef ALL_THREADS_STOPPED ++ int num; ++#else ++# define num 1 ++#endif ++ ++ LOG (__FUNCTION__); ++ ++ /* Test whether the TA parameter is ok. */ ++ if (! ta_ok (ta)) ++ return TD_BADTA; ++ ++ /* Read all the descriptors. */ ++ if (ps_pdread (ta->ph, ta->handles, phc, ++ sizeof (struct pthread_handle_struct) * pthread_threads_max) ++ != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++#ifdef ALL_THREADS_STOPPED ++ /* Read the number of currently active threads. */ ++ if (ps_pdread (ta->ph, ta->pthread_handles_num, &num, sizeof (int)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++#endif ++ ++ /* Get the entries one after the other and find out whether the ID ++ matches. */ ++ for (cnt = 0; cnt < pthread_threads_max && num > 0; ++cnt) ++ if (phc[cnt].h_descr != NULL) ++ { ++ struct _pthread_descr_struct pds; ++ ++#ifdef ALL_THREADS_STOPPED ++ /* First count this active thread. */ ++ --num; ++#endif ++ ++ if (ps_pdread (ta->ph, phc[cnt].h_descr, &pds, sizeof_descr) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ if ((pds.p_pid ?: ps_getpid (ta->ph)) == lwpid) ++ { ++ /* Found it. Now fill in the `td_thrhandle_t' object. */ ++ th->th_ta_p = (td_thragent_t *) ta; ++ th->th_unique = phc[cnt].h_descr; ++ ++ return TD_OK; ++ } ++ } ++ ++ return TD_NOLWP; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_new.c glibc-2.1.3/linuxthreads_db/td_ta_new.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_new.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_new.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,154 @@ ++/* Attach to target process. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include <stddef.h> ++#include <stdlib.h> ++#include <gnu/lib-names.h> ++ ++#include "thread_dbP.h" ++ ++ ++/* Datatype for the list of known thread agents. Normally there will ++ be exactly one so we don't spend much though on making it fast. */ ++struct agent_list *__td_agent_list; ++ ++ ++td_err_e ++td_ta_new (struct ps_prochandle *ps, td_thragent_t **ta) ++{ ++ psaddr_t addr; ++ struct agent_list *elemp; ++ ++ LOG (__FUNCTION__); ++ ++ /* Get the global event mask. This is one of the variables which ++ are new in the thread library to enable debugging. If it is ++ not available we cannot debug. */ ++ if (ps_pglobal_lookup (ps, LIBPTHREAD_SO, ++ "__pthread_threads_events", &addr) != PS_OK) ++ return TD_NOLIBTHREAD; ++ ++ /* Fill in the appropriate information. */ ++ *ta = (td_thragent_t *) malloc (sizeof (td_thragent_t)); ++ if (*ta == NULL) ++ return TD_MALLOC; ++ ++ /* Store the proc handle which we will pass to the callback functions ++ back into the debugger. */ ++ (*ta)->ph = ps; ++ ++ /* Remember the address. */ ++ (*ta)->pthread_threads_eventsp = (td_thr_events_t *) addr; ++ ++ /* Get the pointer to the variable pointing to the thread descriptor ++ with the last event. */ ++ if (ps_pglobal_lookup (ps, LIBPTHREAD_SO, ++ "__pthread_last_event", ++ &(*ta)->pthread_last_event) != PS_OK) ++ { ++ free_return: ++ free (*ta); ++ return TD_ERR; ++ } ++ ++ /* Get the pointer to the variable containing the number of active ++ threads. */ ++ if (ps_pglobal_lookup (ps, LIBPTHREAD_SO, ++ "__pthread_handles_num", ++ &(*ta)->pthread_handles_num) != PS_OK) ++ goto free_return; ++ ++ /* See whether the library contains the necessary symbols. */ ++ if (ps_pglobal_lookup (ps, LIBPTHREAD_SO, "__pthread_handles", ++ &addr) != PS_OK) ++ goto free_return; ++ ++ (*ta)->handles = (struct pthread_handle_struct *) addr; ++ ++ ++ if (ps_pglobal_lookup (ps, LIBPTHREAD_SO, "pthread_keys", ++ &addr) != PS_OK) ++ goto free_return; ++ ++ /* Cast to the right type. */ ++ (*ta)->keys = (struct pthread_key_struct *) addr; ++ ++ /* Find out about the maximum number of threads. Old implementations ++ don't provide this information. In this case we assume that the ++ debug library is compiled with the same values. */ ++ if (ps_pglobal_lookup (ps, LIBPTHREAD_SO, ++ "__linuxthreads_pthread_threads_max", &addr) != PS_OK) ++ (*ta)->pthread_threads_max = PTHREAD_THREADS_MAX; ++ else ++ { ++ if (ps_pdread (ps, addr, &(*ta)->pthread_threads_max, sizeof (int)) ++ != PS_OK) ++ goto free_return; ++ } ++ ++ /* Similar for the maximum number of thread local data keys. */ ++ if (ps_pglobal_lookup (ps, LIBPTHREAD_SO, ++ "__linuxthreads_pthread_keys_max", &addr) != PS_OK) ++ (*ta)->pthread_keys_max = PTHREAD_KEYS_MAX; ++ else ++ { ++ if (ps_pdread (ps, addr, &(*ta)->pthread_keys_max, sizeof (int)) ++ != PS_OK) ++ goto free_return; ++ } ++ ++ /* And for the size of the second level arrays for the keys. */ ++ if (ps_pglobal_lookup (ps, LIBPTHREAD_SO, ++ "__linuxthreads_pthread_sizeof_descr", &addr) ++ != PS_OK) ++ (*ta)->sizeof_descr = sizeof (struct _pthread_descr_struct); ++ else ++ { ++ if (ps_pdread (ps, addr, &(*ta)->sizeof_descr, sizeof (int)) != PS_OK) ++ goto free_return; ++ } ++ ++ /* Similar for the maximum number of thread local data keys. */ ++ if (ps_pglobal_lookup (ps, LIBPTHREAD_SO, ++ "__linuxthreads_pthread_keys_max", &addr) != PS_OK) ++ (*ta)->pthread_keys_max = PTHREAD_KEYS_MAX; ++ else ++ { ++ if (ps_pdread (ps, addr, &(*ta)->pthread_keys_max, sizeof (int)) ++ != PS_OK) ++ goto free_return; ++ } ++ ++ /* Now add the new agent descriptor to the list. */ ++ elemp = (struct agent_list *) malloc (sizeof (struct agent_list)); ++ if (elemp == NULL) ++ { ++ /* Argh, now that everything else worked... */ ++ free (*ta); ++ return TD_MALLOC; ++ } ++ ++ /* We don't care for thread-safety here. */ ++ elemp->ta = *ta; ++ elemp->next = __td_agent_list; ++ __td_agent_list = elemp; ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_reset_stats.c glibc-2.1.3/linuxthreads_db/td_ta_reset_stats.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_reset_stats.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_reset_stats.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,35 @@ ++/* Reset statistics. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_ta_reset_stats (const td_thragent_t *ta) ++{ ++ /* XXX We have to figure out what has to be done. */ ++ LOG (__FUNCTION__); ++ ++ /* Test whether the TA parameter is ok. */ ++ if (! ta_ok (ta)) ++ return TD_BADTA; ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_set_event.c glibc-2.1.3/linuxthreads_db/td_ta_set_event.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_set_event.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_set_event.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,53 @@ ++/* Globally enable events. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_ta_set_event (ta, event) ++ const td_thragent_t *ta; ++ td_thr_events_t *event; ++{ ++ td_thr_events_t old_event; ++ int i; ++ ++ LOG (__FUNCTION__); ++ ++ /* Test whether the TA parameter is ok. */ ++ if (! ta_ok (ta)) ++ return TD_BADTA; ++ ++ /* Write the new value into the thread data structure. */ ++ if (ps_pdread (ta->ph, ta->pthread_threads_eventsp, ++ &old_event, sizeof (td_thrhandle_t)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ /* Or the new bits in. */ ++ for (i = 0; i < TD_EVENTSIZE; ++i) ++ old_event.event_bits[i] |= event->event_bits[i]; ++ ++ /* Write the new value into the thread data structure. */ ++ if (ps_pdwrite (ta->ph, ta->pthread_threads_eventsp, ++ &old_event, sizeof (td_thrhandle_t)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_setconcurrency.c glibc-2.1.3/linuxthreads_db/td_ta_setconcurrency.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_setconcurrency.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_setconcurrency.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,35 @@ ++/* Set suggested concurrency level for process. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_ta_setconcurrency (const td_thragent_t *ta, int level) ++{ ++ /* This is something LinuxThreads does not support. */ ++ LOG (__FUNCTION__); ++ ++ /* Test whether the TA parameter is ok. */ ++ if (! ta_ok (ta)) ++ return TD_BADTA; ++ ++ return TD_NOCAPAB; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_thr_iter.c glibc-2.1.3/linuxthreads_db/td_ta_thr_iter.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_thr_iter.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_thr_iter.c 1999-11-12 15:26:24.000000000 -0800 +@@ -0,0 +1,142 @@ ++/* Iterate over a process's threads. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++static int ++handle_descr (const td_thragent_t *ta, td_thr_iter_f *callback, ++ void *cbdata_p, td_thr_state_e state, int ti_pri, ++ size_t cnt, pthread_descr descr) ++{ ++ struct _pthread_descr_struct pds; ++ size_t sizeof_descr = ta->sizeof_descr; ++ td_thrhandle_t th; ++ ++ if (ps_pdread (ta->ph, descr, &pds, sizeof_descr) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ /* The manager thread must be handled special. The descriptor ++ exists but the thread only gets created when the first ++ `pthread_create' call is issued. A clear indication that this ++ happened is when the p_pid field is non-zero. */ ++ if (cnt == 1 && pds.p_pid == 0) ++ return TD_OK; ++ ++ /* Now test whether this thread matches the specified ++ conditions. */ ++ ++ /* Only if the priority level is as high or higher. */ ++ if (pds.p_priority < ti_pri) ++ return TD_OK; ++ ++ /* Test the state. ++ XXX This is incomplete. */ ++ if (state != TD_THR_ANY_STATE) ++ return TD_OK; ++ ++ /* XXX For now we ignore threads which are not running anymore. ++ The reason is that gdb tries to get the registers and fails. ++ In future we should have a special mode of the thread library ++ in which we keep the process around until the actual join ++ operation happened. */ ++ if (pds.p_exited != 0) ++ return TD_OK; ++ ++ /* Yep, it matches. Call the callback function. */ ++ th.th_ta_p = (td_thragent_t *) ta; ++ th.th_unique = descr; ++ if (callback (&th, cbdata_p) != 0) ++ return TD_DBERR; ++ ++ /* All done successfully. */ ++ return TD_OK; ++} ++ ++ ++td_err_e ++td_ta_thr_iter (const td_thragent_t *ta, td_thr_iter_f *callback, ++ void *cbdata_p, td_thr_state_e state, int ti_pri, ++ sigset_t *ti_sigmask_p, unsigned int ti_user_flags) ++{ ++ int pthread_threads_max; ++ struct pthread_handle_struct *phc; ++ td_err_e result = TD_OK; ++ int cnt; ++#ifdef ALL_THREADS_STOPPED ++ int num; ++#else ++# define num 1 ++#endif ++ ++ LOG (__FUNCTION__); ++ ++ /* Test whether the TA parameter is ok. */ ++ if (! ta_ok (ta)) ++ return TD_BADTA; ++ ++ pthread_threads_max = ta->pthread_threads_max; ++ phc = (struct pthread_handle_struct *) alloca (sizeof (phc[0]) ++ * pthread_threads_max); ++ ++ /* First read only the main thread and manager thread information. */ ++ if (ps_pdread (ta->ph, ta->handles, phc, ++ sizeof (struct pthread_handle_struct) * 2) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ /* Now handle these descriptors. */ ++ result = handle_descr (ta, callback, cbdata_p, state, ti_pri, 0, ++ phc[0].h_descr); ++ if (result != TD_OK) ++ return result; ++ result = handle_descr (ta, callback, cbdata_p, state, ti_pri, 1, ++ phc[1].h_descr); ++ if (result != TD_OK) ++ return result; ++ ++ /* Read all the descriptors. */ ++ if (ps_pdread (ta->ph, ta->handles + 2, &phc[2], ++ (sizeof (struct pthread_handle_struct) ++ * (pthread_threads_max - 2))) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++#ifdef ALL_THREADS_STOPPED ++ /* Read the number of currently active threads. */ ++ if (ps_pdread (ta->ph, ta->pthread_handles_num, &num, sizeof (int)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++#endif ++ ++ /* Now get all descriptors, one after the other. */ ++ for (cnt = 2; cnt < pthread_threads_max && num > 0; ++cnt) ++ if (phc[cnt].h_descr != NULL) ++ { ++#ifdef ALL_THREADS_STOPPED ++ /* First count this active thread. */ ++ --num; ++#endif ++ ++ result = handle_descr (ta, callback, cbdata_p, state, ti_pri, cnt, ++ phc[cnt].h_descr); ++ if (result != TD_OK) ++ break; ++ } ++ ++ return result; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_ta_tsd_iter.c glibc-2.1.3/linuxthreads_db/td_ta_tsd_iter.c +--- ../glibc-2.1.3/linuxthreads_db/td_ta_tsd_iter.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_ta_tsd_iter.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,55 @@ ++/* Iterate over a process's thread-specific data. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_ta_tsd_iter (const td_thragent_t *ta, td_key_iter_f *callback, ++ void *cbdata_p) ++{ ++ struct pthread_key_struct *keys; ++ int pthread_keys_max; ++ int cnt; ++ ++ LOG (__FUNCTION__); ++ ++ /* Test whether the TA parameter is ok. */ ++ if (! ta_ok (ta)) ++ return TD_BADTA; ++ ++ pthread_keys_max = ta->pthread_keys_max; ++ keys = (struct pthread_key_struct *) alloca (sizeof (keys[0]) ++ * pthread_keys_max); ++ ++ /* Read all the information about the keys. */ ++ if (ps_pdread (ta->ph, ta->keys, keys, ++ sizeof (keys[0]) * pthread_keys_max) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ /* Now get all descriptors, one after the other. */ ++ for (cnt = 0; cnt < pthread_keys_max; ++cnt) ++ if (keys[cnt].in_use ++ /* Return with an error if the callback returns a nonzero value. */ ++ && callback (cnt, keys[cnt].destr, cbdata_p) != 0) ++ return TD_DBERR; ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_clear_event.c glibc-2.1.3/linuxthreads_db/td_thr_clear_event.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_clear_event.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_clear_event.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,57 @@ ++/* Disable specific event for thread. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include <stddef.h> ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_clear_event (th, event) ++ const td_thrhandle_t *th; ++ td_thr_events_t *event; ++{ ++ td_thr_events_t old_event; ++ int i; ++ ++ LOG (__FUNCTION__); ++ ++ /* Write the new value into the thread data structure. */ ++ if (ps_pdread (th->th_ta_p->ph, ++ ((char *) th->th_unique ++ + offsetof (struct _pthread_descr_struct, ++ p_eventbuf.eventmask)), ++ &old_event, sizeof (td_thrhandle_t)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ /* Remove the set bits in. */ ++ for (i = 0; i < TD_EVENTSIZE; ++i) ++ old_event.event_bits[i] &= ~event->event_bits[i]; ++ ++ /* Write the new value into the thread data structure. */ ++ if (ps_pdwrite (th->th_ta_p->ph, ++ ((char *) th->th_unique ++ + offsetof (struct _pthread_descr_struct, ++ p_eventbuf.eventmask)), ++ &old_event, sizeof (td_thrhandle_t)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_dbresume.c glibc-2.1.3/linuxthreads_db/td_thr_dbresume.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_dbresume.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_dbresume.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,30 @@ ++/* Resume execution of given thread. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_dbresume (const td_thrhandle_t *th) ++{ ++ /* XXX We have to figure out what has to be done. */ ++ LOG (__FUNCTION__); ++ return TD_NOCAPAB; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_dbsuspend.c glibc-2.1.3/linuxthreads_db/td_thr_dbsuspend.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_dbsuspend.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_dbsuspend.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,30 @@ ++/* Suspend execution of given thread. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_dbsuspend (const td_thrhandle_t *th) ++{ ++ /* XXX We have to figure out what has to be done. */ ++ LOG (__FUNCTION__); ++ return TD_NOCAPAB; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_event_enable.c glibc-2.1.3/linuxthreads_db/td_thr_event_enable.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_event_enable.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_event_enable.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,41 @@ ++/* Enable event process-wide. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include <stddef.h> ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_event_enable (th, onoff) ++ const td_thrhandle_t *th; ++ int onoff; ++{ ++ LOG (__FUNCTION__); ++ ++ /* Write the new value into the thread data structure. */ ++ if (ps_pdwrite (th->th_ta_p->ph, ++ ((char *) th->th_unique ++ + offsetof (struct _pthread_descr_struct, p_report_events)), ++ &onoff, sizeof (int)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_event_getmsg.c glibc-2.1.3/linuxthreads_db/td_thr_event_getmsg.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_event_getmsg.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_event_getmsg.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,60 @@ ++/* Retrieve event. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include <stddef.h> ++#include <string.h> ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_event_getmsg (const td_thrhandle_t *th, td_event_msg_t *msg) ++{ ++ td_eventbuf_t event; ++ ++ LOG (__FUNCTION__); ++ ++ /* Read the even structure from the target. */ ++ if (ps_pdread (th->th_ta_p->ph, ++ ((char *) th->th_unique ++ + offsetof (struct _pthread_descr_struct, p_eventbuf)), ++ &event, sizeof (td_eventbuf_t)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ /* Check whether an event occurred. */ ++ if (event.eventnum == TD_EVENT_NONE) ++ /* Nothing. */ ++ return TD_NOMSG; ++ ++ /* Fill the user's data structure. */ ++ msg->event = event.eventnum; ++ msg->th_p = th; ++ msg->msg.data = (uintptr_t) event.eventdata; ++ ++ /* And clear the event message in the target. */ ++ memset (&event, '\0', sizeof (td_eventbuf_t)); ++ if (ps_pdwrite (th->th_ta_p->ph, ++ ((char *) th->th_unique ++ + offsetof (struct _pthread_descr_struct, p_eventbuf)), ++ &event, sizeof (td_eventbuf_t)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_get_info.c glibc-2.1.3/linuxthreads_db/td_thr_get_info.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_get_info.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_get_info.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,75 @@ ++/* Get thread information. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include <stddef.h> ++#include <string.h> ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_get_info (const td_thrhandle_t *th, td_thrinfo_t *infop) ++{ ++ struct _pthread_descr_struct pds; ++ ++ LOG (__FUNCTION__); ++ ++ /* Get the thread descriptor. */ ++ if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, ++ th->th_ta_p->sizeof_descr) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ /* Fill in information. Clear first to provide reproducable ++ results for the fields we do not fill in. */ ++ memset (infop, '\0', sizeof (td_thrinfo_t)); ++ ++ /* We have to handle the manager thread special since the thread ++ descriptor in older versions is not fully initialized. */ ++ if (pds.p_nr == 1) ++ { ++ infop->ti_tid = th->th_ta_p->pthread_threads_max * 2 + 1; ++ infop->ti_type = TD_THR_SYSTEM; ++ infop->ti_state = TD_THR_RUN; ++ } ++ else ++ { ++ infop->ti_tid = pds.p_tid; ++ infop->ti_tls = (char *) pds.p_specific; ++ infop->ti_pri = pds.p_priority; ++ infop->ti_type = TD_THR_USER; ++ ++ if (pds.p_exited) ++ /* This should not happen. */ ++ infop->ti_state = TD_THR_ZOMBIE; ++ else ++ /* XXX For now there is no way to get more information. */ ++ infop->ti_state = TD_THR_RUN; ++ } ++ ++ /* Initialization which are the same in both cases. */ ++ infop->ti_lid = pds.p_pid ?: ps_getpid (th->th_ta_p->ph); ++ infop->ti_ta_p = th->th_ta_p; ++ infop->ti_startfunc = pds.p_start_args.start_routine; ++ memcpy (&infop->ti_events, &pds.p_eventbuf.eventmask, ++ sizeof (td_thr_events_t)); ++ infop->ti_traceme = pds.p_report_events != 0; ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_getfpregs.c glibc-2.1.3/linuxthreads_db/td_thr_getfpregs.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_getfpregs.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_getfpregs.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,44 @@ ++/* Get a thread's floating-point register set. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_getfpregs (const td_thrhandle_t *th, prfpregset_t *regset) ++{ ++ struct _pthread_descr_struct pds; ++ ++ LOG (__FUNCTION__); ++ ++ /* We have to get the state and the PID for this thread. */ ++ if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, ++ sizeof (struct _pthread_descr_struct)) != PS_OK) ++ return TD_ERR; ++ ++ /* If the thread already terminated we return all zeroes. */ ++ if (pds.p_terminated) ++ memset (regset, '\0', sizeof (*regset)); ++ /* Otherwise get the register content through the callback. */ ++ else if (ps_lgetfpregs (th->th_ta_p->ph, pds.p_pid, regset) != PS_OK) ++ return TD_ERR; ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_getgregs.c glibc-2.1.3/linuxthreads_db/td_thr_getgregs.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_getgregs.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_getgregs.c 2000-01-20 18:16:37.000000000 -0800 +@@ -0,0 +1,44 @@ ++/* Get a thread's general register set. ++ Copyright (C) 1999, 2000 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_getgregs (const td_thrhandle_t *th, prgregset_t gregs) ++{ ++ struct _pthread_descr_struct pds; ++ ++ LOG (__FUNCTION__); ++ ++ /* We have to get the state and the PID for this thread. */ ++ if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, ++ sizeof (struct _pthread_descr_struct)) != PS_OK) ++ return TD_ERR; ++ ++ /* If the thread already terminated we return all zeroes. */ ++ if (pds.p_terminated) ++ memset (gregs, '\0', sizeof (prgregset_t)); ++ /* Otherwise get the register content through the callback. */ ++ else if (ps_lgetregs (th->th_ta_p->ph, pds.p_pid, gregs) != PS_OK) ++ return TD_ERR; ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_getxregs.c glibc-2.1.3/linuxthreads_db/td_thr_getxregs.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_getxregs.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_getxregs.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,30 @@ ++/* Get a thread's extra state register set. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_getxregs (const td_thrhandle_t *th, void *xregs) ++{ ++ /* XXX This might be platform specific. */ ++ LOG (__FUNCTION__); ++ return TD_NOXREGS; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_getxregsize.c glibc-2.1.3/linuxthreads_db/td_thr_getxregsize.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_getxregsize.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_getxregsize.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,30 @@ ++/* Get the size of the extra state register set for this architecture. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_getxregsize (const td_thrhandle_t *th, int *sizep) ++{ ++ /* XXX This might be platform specific. */ ++ LOG (__FUNCTION__); ++ return TD_NOXREGS; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_set_event.c glibc-2.1.3/linuxthreads_db/td_thr_set_event.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_set_event.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_set_event.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,57 @@ ++/* Enable specific event for thread. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include <stddef.h> ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_set_event (th, event) ++ const td_thrhandle_t *th; ++ td_thr_events_t *event; ++{ ++ td_thr_events_t old_event; ++ int i; ++ ++ LOG (__FUNCTION__); ++ ++ /* Write the new value into the thread data structure. */ ++ if (ps_pdread (th->th_ta_p->ph, ++ ((char *) th->th_unique ++ + offsetof (struct _pthread_descr_struct, ++ p_eventbuf.eventmask)), ++ &old_event, sizeof (td_thrhandle_t)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ /* Or the new bits in. */ ++ for (i = 0; i < TD_EVENTSIZE; ++i) ++ old_event.event_bits[i] |= event->event_bits[i]; ++ ++ /* Write the new value into the thread data structure. */ ++ if (ps_pdwrite (th->th_ta_p->ph, ++ ((char *) th->th_unique ++ + offsetof (struct _pthread_descr_struct, ++ p_eventbuf.eventmask)), ++ &old_event, sizeof (td_thrhandle_t)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_setfpregs.c glibc-2.1.3/linuxthreads_db/td_thr_setfpregs.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_setfpregs.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_setfpregs.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,42 @@ ++/* Set a thread's floating-point register set. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_setfpregs (const td_thrhandle_t *th, const prfpregset_t *fpregs) ++{ ++ struct _pthread_descr_struct pds; ++ ++ LOG (__FUNCTION__); ++ ++ /* We have to get the state and the PID for this thread. */ ++ if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, ++ sizeof (struct _pthread_descr_struct)) != PS_OK) ++ return TD_ERR; ++ ++ /* Only set the registers if the thread hasn't yet terminated. */ ++ if (pds.p_terminated == 0 ++ && ps_lsetfpregs (th->th_ta_p->ph, pds.p_pid, fpregs) != PS_OK) ++ return TD_ERR; ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_setgregs.c glibc-2.1.3/linuxthreads_db/td_thr_setgregs.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_setgregs.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_setgregs.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,42 @@ ++/* Set a thread's general register set. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_setgregs (const td_thrhandle_t *th, prgregset_t gregs) ++{ ++ struct _pthread_descr_struct pds; ++ ++ LOG (__FUNCTION__); ++ ++ /* We have to get the state and the PID for this thread. */ ++ if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, ++ sizeof (struct _pthread_descr_struct)) != PS_OK) ++ return TD_ERR; ++ ++ /* Only set the registers if the thread hasn't yet terminated. */ ++ if (pds.p_terminated == 0 ++ && ps_lsetregs (th->th_ta_p->ph, pds.p_pid, gregs) != PS_OK) ++ return TD_ERR; ++ ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_setprio.c glibc-2.1.3/linuxthreads_db/td_thr_setprio.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_setprio.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_setprio.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,30 @@ ++/* Set a thread's priority. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_setprio (const td_thrhandle_t *th, int prio) ++{ ++ /* XXX We have to figure out what has to be done. */ ++ LOG (__FUNCTION__); ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_setsigpending.c glibc-2.1.3/linuxthreads_db/td_thr_setsigpending.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_setsigpending.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_setsigpending.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,31 @@ ++/* Raise a signal for a thread. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_setsigpending (const td_thrhandle_t *th, unsigned char n, ++ const sigset_t *ss) ++{ ++ /* XXX We have to figure out what has to be done. */ ++ LOG (__FUNCTION__); ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_setxregs.c glibc-2.1.3/linuxthreads_db/td_thr_setxregs.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_setxregs.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_setxregs.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,30 @@ ++/* Set a thread's extra state register set. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_setxregs (const td_thrhandle_t *ta, const void *addr) ++{ ++ /* XXX This might have to be platform specific. */ ++ LOG (__FUNCTION__); ++ return TD_NOXREGS; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_sigsetmask.c glibc-2.1.3/linuxthreads_db/td_thr_sigsetmask.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_sigsetmask.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_sigsetmask.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,30 @@ ++/* Set a thread's signal mask. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_sigsetmask (const td_thrhandle_t *th, const sigset_t *ss) ++{ ++ /* XXX We have to figure out what has to be done. */ ++ LOG (__FUNCTION__); ++ return TD_OK; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_tsd.c glibc-2.1.3/linuxthreads_db/td_thr_tsd.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_tsd.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_tsd.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,76 @@ ++/* Get a thread-specific data pointer for a thread. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_tsd (const td_thrhandle_t *th, const thread_key_t tk, void **data) ++{ ++ struct _pthread_descr_struct pds; ++ struct pthread_key_struct *keys = th->th_ta_p->keys; ++ struct pthread_key_struct key; ++ int pthread_keys_max = th->th_ta_p->pthread_keys_max; ++ int pthread_key_2ndlevel_size = th->th_ta_p->pthread_key_2ndlevel_size; ++ unsigned int idx1st; ++ unsigned int idx2nd; ++ void *p; ++ ++ LOG (__FUNCTION__); ++ ++ /* Get the thread descriptor. */ ++ if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, ++ sizeof (struct _pthread_descr_struct)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ /* Check correct value of key. */ ++ if (tk >= pthread_keys_max) ++ return TD_BADKEY; ++ ++ /* Get the key entry. */ ++ if (ps_pdread (th->th_ta_p->ph, keys, &key, ++ sizeof (struct pthread_key_struct)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ /* Fail if this key is not at all used. */ ++ if (! key.in_use) ++ return TD_BADKEY; ++ ++ /* Compute the indeces. */ ++ idx1st = tk / pthread_key_2ndlevel_size; ++ idx2nd = tk % pthread_key_2ndlevel_size; ++ ++ /* Check the pointer to the second level array. */ ++ if (pds.p_specific[idx1st] == NULL) ++ return TD_NOTSD; ++ ++ /* Now get the real key. ++ XXX I don't know whether it's correct but there is currently no ++ easy way to determine whether a key was never set or the value ++ is NULL. We return an error whenever the value is NULL. */ ++ if (ps_pdread (th->th_ta_p->ph, &pds.p_specific[idx1st][idx2nd], &p, ++ sizeof (void *)) != PS_OK) ++ return TD_ERR; ++ ++ if (p != NULL) ++ *data = p; ++ ++ return p != NULL ? TD_OK : TD_NOTSD; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/td_thr_validate.c glibc-2.1.3/linuxthreads_db/td_thr_validate.c +--- ../glibc-2.1.3/linuxthreads_db/td_thr_validate.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/td_thr_validate.c 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,51 @@ ++/* Validate a thread handle. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. ++ ++ 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. */ ++ ++#include "thread_dbP.h" ++ ++ ++td_err_e ++td_thr_validate (const td_thrhandle_t *th) ++{ ++ struct pthread_handle_struct *handles = th->th_ta_p->handles; ++ int pthread_threads_max = th->th_ta_p->pthread_threads_max; ++ int cnt; ++ ++ LOG (__FUNCTION__); ++ ++ /* Now get all descriptors, one after the other. */ ++ for (cnt = 0; cnt < pthread_threads_max; ++cnt, ++handles) ++ { ++ struct pthread_handle_struct phc; ++ ++ if (ps_pdread (th->th_ta_p->ph, handles, &phc, ++ sizeof (struct pthread_handle_struct)) != PS_OK) ++ return TD_ERR; /* XXX Other error value? */ ++ ++ if (phc.h_descr != NULL && phc.h_descr == th->th_unique) ++ { ++ /* XXX There should be another test using the TID but this is ++ currently not available. */ ++ return TD_OK; ++ } ++ } ++ ++ return TD_ERR; ++} +diff -Naur ../glibc-2.1.3/linuxthreads_db/thread_db.h glibc-2.1.3/linuxthreads_db/thread_db.h +--- ../glibc-2.1.3/linuxthreads_db/thread_db.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/thread_db.h 1999-11-09 21:05:07.000000000 -0800 +@@ -0,0 +1,436 @@ ++/* 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 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 _THREAD_DB_H ++#define _THREAD_DB_H 1 ++ ++/* This is the debugger interface for the LinuxThreads library. It is ++ modelled closely after the interface with same names in Solaris with ++ the goal to share the same code in the debugger. */ ++#include <pthread.h> ++#include <stdint.h> ++#include <sys/types.h> ++#include <sys/procfs.h> ++ ++ ++/* Error codes of the library. */ ++typedef enum ++{ ++ TD_OK, /* No error. */ ++ TD_ERR, /* No further specified error. */ ++ TD_NOTHR, /* No matching thread found. */ ++ TD_NOSV, /* No matching synchronization handle found. */ ++ TD_NOLWP, /* No matching light-weighted process found. */ ++ TD_BADPH, /* Invalid process handle. */ ++ TD_BADTH, /* Invalid thread handle. */ ++ TD_BADSH, /* Invalid synchronization handle. */ ++ TD_BADTA, /* Invalid thread agent. */ ++ TD_BADKEY, /* Invalid key. */ ++ TD_NOMSG, /* No event available. */ ++ TD_NOFPREGS, /* No floating-point register content available. */ ++ TD_NOLIBTHREAD, /* Application not linked with thread library. */ ++ TD_NOEVENT, /* Requested event is not supported. */ ++ TD_NOCAPAB, /* Capability not available. */ ++ TD_DBERR, /* Internal debug library error. */ ++ TD_NOAPLIC, /* Operation is not applicable. */ ++ TD_NOTSD, /* No thread-specific data available. */ ++ TD_MALLOC, /* Out of memory. */ ++ TD_PARTIALREG, /* Not entire register set was read or written. */ ++ TD_NOXREGS /* X register set not available for given thread. */ ++} td_err_e; ++ ++ ++/* Possible thread states. TD_THR_ANY_STATE is a pseudo-state used to ++ select threads regardless of state in td_ta_thr_iter(). */ ++typedef enum ++{ ++ TD_THR_ANY_STATE, ++ TD_THR_UNKNOWN, ++ TD_THR_STOPPED, ++ TD_THR_RUN, ++ TD_THR_ACTIVE, ++ TD_THR_ZOMBIE, ++ TD_THR_SLEEP, ++ TD_THR_STOPPED_ASLEEP ++} td_thr_state_e; ++ ++/* Thread type: user or system. TD_THR_ANY_TYPE is a pseudo-type used ++ to select threads regardless of type in td_ta_thr_iter(). */ ++typedef enum ++{ ++ TD_THR_ANY_TYPE, ++ TD_THR_USER, ++ TD_THR_SYSTEM ++} td_thr_type_e; ++ ++ ++/* Types of the debugging library. */ ++ ++/* Handle for a process. This type is opaque. */ ++typedef struct td_thragent td_thragent_t; ++ ++/* The actual thread handle type. This is also opaque. */ ++typedef struct td_thrhandle ++{ ++ td_thragent_t *th_ta_p; ++ psaddr_t th_unique; ++} td_thrhandle_t; ++ ++ ++/* Flags for `td_ta_thr_iter'. */ ++#define TD_THR_ANY_USER_FLAGS 0xffffffff ++#define TD_THR_LOWEST_PRIORITY -20 ++#define TD_SIGNO_MASK NULL ++ ++ ++#define TD_EVENTSIZE 2 ++#define BT_UISHIFT 5 /* log base 2 of BT_NBIPUI, to extract word index */ ++#define BT_NBIPUI (1 << BT_UISHIFT) /* n bits per uint */ ++#define BT_UIMASK (BT_NBIPUI - 1) /* to extract bit index */ ++ ++/* Bitmask of enabled events. */ ++typedef struct td_thr_events ++{ ++ uint32_t event_bits[TD_EVENTSIZE]; ++} td_thr_events_t; ++ ++/* Event set manipulation macros. */ ++#define __td_eventmask(n) \ ++ (UINT32_C (1) << (((n) - 1) & BT_UIMASK)) ++#define __td_eventword(n) \ ++ ((UINT32_C ((n) - 1)) >> BT_UISHIFT) ++ ++#define td_event_emptyset(setp) \ ++ do { \ ++ int __i; \ ++ for (__i = TD_EVENTSIZE; __i > 0; --__i) \ ++ (setp)->event_bits[__i - 1] = 0; \ ++ } while (0) ++ ++#define td_event_fillset(setp) \ ++ do { \ ++ int __i; \ ++ for (__i = TD_EVENTSIZE; __i > 0; --__i) \ ++ (setp)->event_bits[__i - 1] = UINT32_C (0xffffffff); \ ++ } while (0) ++ ++#define td_event_addset(setp, n) \ ++ (((setp)->event_bits[__td_eventword (n)]) |= __td_eventmask (n)) ++#define td_event_delset(setp, n) \ ++ (((setp)->event_bits[__td_eventword (n)]) &= ~__td_eventmask (n)) ++#define td_eventismember(setp, n) \ ++ (__td_eventmask (n) & ((setp)->event_bits[__td_eventword (n)])) ++#if TD_EVENTSIZE == 2 ++# define td_eventisempty(setp) \ ++ (!((setp)->event_bits[0]) && !((setp)->event_bits[1])) ++#else ++# error "td_eventisempty must be changed to match TD_EVENTSIZE" ++#endif ++ ++/* Events reportable by the thread implementation. */ ++typedef enum ++{ ++ TD_ALL_EVENTS, /* Pseudo-event number. */ ++ TD_EVENT_NONE = TD_ALL_EVENTS, /* Depends on context. */ ++ TD_READY, /* Is executable now. */ ++ TD_SLEEP, /* Blocked in a synchronization obj. */ ++ TD_SWITCHTO, /* Now assigned to a process. */ ++ TD_SWITCHFROM, /* Not anymore assigned to a process. */ ++ TD_LOCK_TRY, /* Trying to get an unavailable lock. */ ++ TD_CATCHSIG, /* Signal posted to the thread. */ ++ TD_IDLE, /* Process getting idle. */ ++ TD_CREATE, /* New thread created. */ ++ TD_DEATH, /* Thread terminated. */ ++ TD_PREEMPT, /* Preempted. */ ++ TD_PRI_INHERIT, /* Inherited elevated priority. */ ++ TD_REAP, /* Reaped. */ ++ TD_CONCURRENCY, /* Number of processes changing. */ ++ TD_TIMEOUT, /* Conditional variable wait timed out. */ ++ TD_MIN_EVENT_NUM = TD_READY, ++ TD_MAX_EVENT_NUM = TD_TIMEOUT, ++ TD_EVENTS_ENABLE = 31 /* Event reporting enabled. */ ++} td_event_e; ++ ++/* Values representing the different ways events are reported. */ ++typedef enum ++{ ++ NOTIFY_BPT, /* User must insert breakpoint at u.bptaddr. */ ++ NOTIFY_AUTOBPT, /* Breakpoint at u.bptaddr is automatically ++ inserted. */ ++ NOTIFY_SYSCALL /* System call u.syscallno will be invoked. */ ++} td_notify_e; ++ ++/* Description how event type is reported. */ ++typedef struct td_notify ++{ ++ td_notify_e type; /* Way the event is reported. */ ++ union ++ { ++ psaddr_t bptaddr; /* Address of breakpoint. */ ++ int syscallno; /* Number of system call used. */ ++ } u; ++} td_notify_t; ++ ++/* Structure used to report event. */ ++typedef struct td_event_msg ++{ ++ td_event_e event; /* Event type being reported. */ ++ const td_thrhandle_t *th_p; /* Thread reporting the event. */ ++ union ++ { ++# if 0 ++ td_synchandle_t *sh; /* Handle of synchronization object. */ ++#endif ++ uintptr_t data; /* Event specific data. */ ++ } msg; ++} td_event_msg_t; ++ ++/* Structure containing event data available in each thread structure. */ ++typedef struct ++{ ++ td_thr_events_t eventmask; /* Mask of enabled events. */ ++ td_event_e eventnum; /* Number of last event. */ ++ void *eventdata; /* Data associated with event. */ ++} td_eventbuf_t; ++ ++ ++/* Gathered statistics about the process. */ ++typedef struct td_ta_stats ++{ ++ int nthreads; /* Total number of threads in use. */ ++ int r_concurrency; /* Concurrency level requested by user. */ ++ int nrunnable_num; /* Average runnable threads, numerator. */ ++ int nrunnable_den; /* Average runnable threads, denominator. */ ++ int a_concurrency_num; /* Achieved concurrency level, numerator. */ ++ int a_concurrency_den; /* Achieved concurrency level, denominator. */ ++ int nlwps_num; /* Average number of processes in use, ++ numerator. */ ++ int nlwps_den; /* Average number of processes in use, ++ denominator. */ ++ int nidle_num; /* Average number of idling processes, ++ numerator. */ ++ int nidle_den; /* Average number of idling processes, ++ denominator. */ ++} td_ta_stats_t; ++ ++ ++/* Since Sun's library is based on Solaris threads we have to define a few ++ types to map them to POSIX threads. */ ++typedef pthread_t thread_t; ++typedef pthread_key_t thread_key_t; ++ ++ ++/* Callback for iteration over threads. */ ++typedef int td_thr_iter_f (const td_thrhandle_t *, void *); ++ ++/* Callback for iteration over thread local data. */ ++typedef int td_key_iter_f (thread_key_t, void (*) (void *), void *); ++ ++ ++ ++/* Forward declaration. This has to be defined by the user. */ ++struct ps_prochandle; ++ ++ ++/* Information about the thread. */ ++typedef struct td_thrinfo ++{ ++ td_thragent_t *ti_ta_p; /* Process handle. */ ++ unsigned int ti_user_flags; /* Unused. */ ++ thread_t ti_tid; /* Thread ID returned by ++ pthread_create(). */ ++ char *ti_tls; /* Pointer to thread-local data. */ ++ psaddr_t ti_startfunc; /* Start function passed to ++ pthread_create(). */ ++ psaddr_t ti_stkbase; /* Base of thread's stack. */ ++ long int ti_stksize; /* Size of thread's stack. */ ++ psaddr_t ti_ro_area; /* Unused. */ ++ int ti_ro_size; /* Unused. */ ++ td_thr_state_e ti_state; /* Thread state. */ ++ unsigned char ti_db_suspended; /* Nonzero if suspended by debugger. */ ++ td_thr_type_e ti_type; /* Type of the thread (system vs ++ user thread). */ ++ intptr_t ti_pc; /* Unused. */ ++ intptr_t ti_sp; /* Unused. */ ++ short int ti_flags; /* Unused. */ ++ int ti_pri; /* Thread priority. */ ++ lwpid_t ti_lid; /* Unused. */ ++ sigset_t ti_sigmask; /* Signal mask. */ ++ unsigned char ti_traceme; /* Nonzero if event reporting ++ enabled. */ ++ unsigned char ti_preemptflag; /* Unused. */ ++ unsigned char ti_pirecflag; /* Unused. */ ++ sigset_t ti_pending; /* Set of pending signals. */ ++ td_thr_events_t ti_events; /* Set of enabled events. */ ++} td_thrinfo_t; ++ ++ ++ ++/* Prototypes for exported library functions. */ ++ ++/* Initialize the thread debug support library. */ ++extern td_err_e td_init (void); ++ ++/* Historical relict. Should not be used anymore. */ ++extern td_err_e td_log (void); ++ ++/* Generate new thread debug library handle for process PS. */ ++extern td_err_e td_ta_new (struct ps_prochandle *__ps, td_thragent_t **__ta); ++ ++/* Free resources allocated for TA. */ ++extern td_err_e td_ta_delete (td_thragent_t *__ta); ++ ++/* Get number of currently running threads in process associated with TA. */ ++extern td_err_e td_ta_get_nthreads (const td_thragent_t *__ta, int *__np); ++ ++/* Return process handle passed in `td_ta_new' for process associated with ++ TA. */ ++extern td_err_e td_ta_get_ph (const td_thragent_t *__ta, ++ struct ps_prochandle **__ph); ++ ++/* Map thread library handle PT to thread debug library handle for process ++ associated with TA and store result in *TH. */ ++extern td_err_e td_ta_map_id2thr (const td_thragent_t *__ta, pthread_t __pt, ++ td_thrhandle_t *__th); ++ ++/* Map process ID LWPID to thread debug library handle for process ++ associated with TA and store result in *TH. */ ++extern td_err_e td_ta_map_lwp2thr (const td_thragent_t *__ta, lwpid_t __lwpid, ++ td_thrhandle_t *__th); ++ ++ ++/* Call for each thread in a process associated with TA the callback function ++ CALLBACK. */ ++extern td_err_e td_ta_thr_iter (const td_thragent_t *__ta, ++ td_thr_iter_f *__callback, void *__cbdata_p, ++ td_thr_state_e __state, int __ti_pri, ++ sigset_t *__ti_sigmask_p, ++ unsigned int __ti_user_flags); ++ ++/* Call for each defined thread local data entry the callback function KI. */ ++extern td_err_e td_ta_tsd_iter (const td_thragent_t *__ta, td_key_iter_f *__ki, ++ void *__p); ++ ++ ++/* Get event address for EVENT. */ ++extern td_err_e td_ta_event_addr (const td_thragent_t *__ta, ++ td_event_e __event, td_notify_t *__ptr); ++ ++/* Enable EVENT in global mask. */ ++extern td_err_e td_ta_set_event (const td_thragent_t *__ta, ++ td_thr_events_t *__event); ++ ++/* Disable EVENT in global mask. */ ++extern td_err_e td_ta_clear_event (const td_thragent_t *__ta, ++ td_thr_events_t *__event); ++ ++/* Return information about last event. */ ++extern td_err_e td_ta_event_getmsg (const td_thragent_t *__ta, ++ td_event_msg_t *msg); ++ ++ ++/* Set suggested concurrency level for process associated with TA. */ ++extern td_err_e td_ta_setconcurrency (const td_thragent_t *__ta, int __level); ++ ++ ++/* Enable collecting statistics for process associated with TA. */ ++extern td_err_e td_ta_enable_stats (const td_thragent_t *__ta, int __enable); ++ ++/* Reset statistics. */ ++extern td_err_e td_ta_reset_stats (const td_thragent_t *__ta); ++ ++/* Retrieve statistics from process associated with TA. */ ++extern td_err_e td_ta_get_stats (const td_thragent_t *__ta, ++ td_ta_stats_t *__statsp); ++ ++ ++/* Validate that TH is a thread handle. */ ++extern td_err_e td_thr_validate (const td_thrhandle_t *__th); ++ ++/* Return information about thread TH. */ ++extern td_err_e td_thr_get_info (const td_thrhandle_t *__th, ++ td_thrinfo_t *__infop); ++ ++/* Retrieve floating-point register contents of process running thread TH. */ ++extern td_err_e td_thr_getfpregs (const td_thrhandle_t *__th, ++ prfpregset_t *__regset); ++ ++/* Retrieve general register contents of process running thread TH. */ ++extern td_err_e td_thr_getgregs (const td_thrhandle_t *__th, ++ prgregset_t __gregs); ++ ++/* Retrieve extended register contents of process running thread TH. */ ++extern td_err_e td_thr_getxregs (const td_thrhandle_t *__th, void *__xregs); ++ ++/* Get size of extended register set of process running thread TH. */ ++extern td_err_e td_thr_getxregsize (const td_thrhandle_t *__th, int *__sizep); ++ ++/* Set floating-point register contents of process running thread TH. */ ++extern td_err_e td_thr_setfpregs (const td_thrhandle_t *__th, ++ const prfpregset_t *__fpregs); ++ ++/* Set general register contents of process running thread TH. */ ++extern td_err_e td_thr_setgregs (const td_thrhandle_t *__th, ++ prgregset_t __gregs); ++ ++/* Set extended register contents of process running thread TH. */ ++extern td_err_e td_thr_setxregs (const td_thrhandle_t *__th, ++ const void *__addr); ++ ++ ++/* Enable reporting for EVENT for thread TH. */ ++extern td_err_e td_thr_event_enable (const td_thrhandle_t *__th, int __event); ++ ++/* Enable EVENT for thread TH. */ ++extern td_err_e td_thr_set_event (const td_thrhandle_t *__th, ++ td_thr_events_t *__event); ++ ++/* Disable EVENT for thread TH. */ ++extern td_err_e td_thr_clear_event (const td_thrhandle_t *__th, ++ td_thr_events_t *__event); ++ ++/* Get event message for thread TH. */ ++extern td_err_e td_thr_event_getmsg (const td_thrhandle_t *__th, ++ td_event_msg_t *__msg); ++ ++ ++/* Set priority of thread TH. */ ++extern td_err_e td_thr_setprio (const td_thrhandle_t *__th, int __prio); ++ ++ ++/* Set pending signals for thread TH. */ ++extern td_err_e td_thr_setsigpending (const td_thrhandle_t *__th, ++ unsigned char __n, const sigset_t *__ss); ++ ++/* Set signal mask for thread TH. */ ++extern td_err_e td_thr_sigsetmask (const td_thrhandle_t *__th, ++ const sigset_t *__ss); ++ ++ ++/* Return thread local data associated with key TK in thread TH. */ ++extern td_err_e td_thr_tsd (const td_thrhandle_t *__th, ++ const thread_key_t __tk, void **__data); ++ ++ ++/* Suspend execution of thread TH. */ ++extern td_err_e td_thr_dbsuspend (const td_thrhandle_t *__th); ++ ++/* Resume execution of thread TH. */ ++extern td_err_e td_thr_dbresume (const td_thrhandle_t *__th); ++ ++#endif /* thread_db.h */ +diff -Naur ../glibc-2.1.3/linuxthreads_db/thread_dbP.h glibc-2.1.3/linuxthreads_db/thread_dbP.h +--- ../glibc-2.1.3/linuxthreads_db/thread_dbP.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/linuxthreads_db/thread_dbP.h 1999-11-22 12:50:45.000000000 -0800 +@@ -0,0 +1,83 @@ ++/* Private header for thread debug library. */ ++#ifndef _THREAD_DBP_H ++#define _THREAD_DBP_H 1 ++ ++#include <string.h> ++#include "proc_service.h" ++#include "thread_db.h" ++#include "../linuxthreads/internals.h" ++ ++ ++/* Comment out the following for less verbose output. */ ++#ifndef NDEBUG ++# define LOG(c) if (__td_debug) __libc_write (2, c "\n", strlen (c "\n")) ++extern int __td_debug; ++#else ++# define LOG(c) ++#endif ++ ++ ++/* Handle for a process. This type is opaque. */ ++struct td_thragent ++{ ++ /* Delivered by the debugger and we have to pass it back in the ++ proc callbacks. */ ++ struct ps_prochandle *ph; ++ ++ /* Some cached information. */ ++ ++ /* Address of the `__pthread_handles' array. */ ++ struct pthread_handle_struct *handles; ++ ++ /* Address of the `pthread_kyes' array. */ ++ struct pthread_key_struct *keys; ++ ++ /* Maximum number of threads. */ ++ int pthread_threads_max; ++ ++ /* Maximum number of thread-local data keys. */ ++ int pthread_keys_max; ++ ++ /* Size of 2nd level array for thread-local data keys. */ ++ int pthread_key_2ndlevel_size; ++ ++ /* Sizeof struct _pthread_descr_struct. */ ++ int sizeof_descr; ++ ++ /* Pointer to the `__pthread_threads_events' variable in the target. */ ++ psaddr_t pthread_threads_eventsp; ++ ++ /* Pointer to the `__pthread_last_event' variable in the target. */ ++ psaddr_t pthread_last_event; ++ ++ /* Pointer to the `__pthread_handles_num' variable. */ ++ psaddr_t pthread_handles_num; ++}; ++ ++ ++/* Type used internally to keep track of thread agent descriptors. */ ++struct agent_list ++{ ++ td_thragent_t *ta; ++ struct agent_list *next; ++}; ++ ++/* List of all known descriptors. */ ++extern struct agent_list *__td_agent_list; ++ ++/* Function used to test for correct thread agent pointer. */ ++static inline int ++ta_ok (const td_thragent_t *ta) ++{ ++ struct agent_list *runp = __td_agent_list; ++ ++ if (ta == NULL) ++ return 0; ++ ++ while (runp != NULL && runp->ta != ta) ++ runp = runp->next; ++ ++ return runp != NULL; ++} ++ ++#endif /* thread_dbP.h */ +diff -Naur ../glibc-2.1.3/locale/C-ctype.c glibc-2.1.3/locale/C-ctype.c +--- ../glibc-2.1.3/locale/C-ctype.c 2000-02-24 14:48:02.000000000 -0800 ++++ glibc-2.1.3/locale/C-ctype.c 2000-02-25 15:43:32.000000000 -0800 +@@ -376,7 +376,7 @@ + { string: NULL }, + { string: (const char *) (_nl_C_LC_CTYPE_tolower + 128) } + #if BYTE_ORDER == BIG_ENDIAN +- { string: NULL }, ++ , { string: NULL } + #endif + } + }; +diff -Naur ../glibc-2.1.3/locale/programs/ld-ctype.c glibc-2.1.3/locale/programs/ld-ctype.c +--- ../glibc-2.1.3/locale/programs/ld-ctype.c 2000-02-24 11:19:02.000000000 -0800 ++++ glibc-2.1.3/locale/programs/ld-ctype.c 2000-02-24 11:32:16.000000000 -0800 +@@ -493,12 +493,19 @@ + if (elem < _NL_ITEM_INDEX (_NL_NUM_LC_CTYPE)) + switch (elem) + { +-#define CTYPE_DATA(name, base, len) \ +- case _NL_ITEM_INDEX (name): \ +- iov[2 + elem + offset].iov_base = (base); \ +- iov[2 + elem + offset].iov_len = (len); \ +- if (elem + 1 < nelems) \ +- idx[elem + 1] = idx[elem] + iov[2 + elem + offset].iov_len; \ ++#define CTYPE_DATA(name, base, len) \ ++ case _NL_ITEM_INDEX (name): \ ++ if ( (len) % 4 == 0) { \ ++ iov[2 + elem + offset].iov_base = (base); \ ++ iov[2 + elem + offset].iov_len = (len); \ ++ } else { \ ++ iov[2 + elem + offset].iov_base = alloca (((len) + 3) & ~3); \ ++ memset (mempcpy (iov[2 + elem + offset].iov_base, (base), (len)), \ ++ '\0', 4 - ((len) & 3)); \ ++ iov[2 + elem + offset].iov_len = ((len) + 3) & ~3; \ ++ } \ ++ if (elem + 1 < nelems) \ ++ idx[elem + 1] = idx[elem] + iov[2 + elem + offset].iov_len; \ + break + + CTYPE_DATA (_NL_CTYPE_CLASS, +diff -Naur ../glibc-2.1.3/localedata/Makefile glibc-2.1.3/localedata/Makefile +--- ../glibc-2.1.3/localedata/Makefile 1999-06-18 19:05:36.000000000 -0700 ++++ glibc-2.1.3/localedata/Makefile 2000-02-23 17:10:51.000000000 -0800 +@@ -90,6 +90,7 @@ + install-locales: + while read locale charset; do \ + case $$locale in \#*) continue;; esac; \ ++ set -x ; \ + $(LOCALEDEF) -i locales/`echo $$locale | sed 's/\([^.]*\).*/\1/'` \ + -c -f charmaps/$$charset \ + -u repertoiremaps/mnemonic.ds \ +diff -Naur ../glibc-2.1.3/mach/err_boot.sub glibc-2.1.3/mach/err_boot.sub +--- ../glibc-2.1.3/mach/err_boot.sub 1992-10-06 11:29:52.000000000 -0700 ++++ glibc-2.1.3/mach/err_boot.sub 1998-02-07 12:15:20.000000000 -0800 +@@ -26,6 +26,9 @@ + /* + * HISTORY + * $Log: err_boot.sub,v $ ++ * Revision 1.1.1.1 1998/02/07 20:15:20 gafton ++ * import from sourceware ++ * + * Revision 1.1 1992/10/06 18:29:52 roland + * entered into RCS + * +diff -Naur ../glibc-2.1.3/mach/err_ipc.sub glibc-2.1.3/mach/err_ipc.sub +--- ../glibc-2.1.3/mach/err_ipc.sub 1992-10-06 11:29:52.000000000 -0700 ++++ glibc-2.1.3/mach/err_ipc.sub 1998-02-07 12:15:20.000000000 -0800 +@@ -26,6 +26,9 @@ + /* + * HISTORY + * $Log: err_ipc.sub,v $ ++ * Revision 1.1.1.1 1998/02/07 20:15:20 gafton ++ * import from sourceware ++ * + * Revision 1.1 1992/10/06 18:29:52 roland + * entered into RCS + * +diff -Naur ../glibc-2.1.3/mach/err_kern.sub glibc-2.1.3/mach/err_kern.sub +--- ../glibc-2.1.3/mach/err_kern.sub 1996-12-19 17:32:34.000000000 -0800 ++++ glibc-2.1.3/mach/err_kern.sub 1998-02-07 12:15:21.000000000 -0800 +@@ -26,6 +26,9 @@ + /* + * HISTORY + * $Log: err_kern.sub,v $ ++ * Revision 1.1.1.1 1998/02/07 20:15:21 gafton ++ * import from sourceware ++ * + * Revision 1.5 1996/12/20 01:32:34 drepper + * Update from main archive 961219 + * +diff -Naur ../glibc-2.1.3/mach/err_mach.sub glibc-2.1.3/mach/err_mach.sub +--- ../glibc-2.1.3/mach/err_mach.sub 1992-10-06 11:29:52.000000000 -0700 ++++ glibc-2.1.3/mach/err_mach.sub 1998-02-07 12:15:21.000000000 -0800 +@@ -26,6 +26,9 @@ + /* + * HISTORY + * $Log: err_mach.sub,v $ ++ * Revision 1.1.1.1 1998/02/07 20:15:21 gafton ++ * import from sourceware ++ * + * Revision 1.1 1992/10/06 18:29:52 roland + * entered into RCS + * +diff -Naur ../glibc-2.1.3/mach/err_server.sub glibc-2.1.3/mach/err_server.sub +--- ../glibc-2.1.3/mach/err_server.sub 1992-10-06 11:29:53.000000000 -0700 ++++ glibc-2.1.3/mach/err_server.sub 1998-02-07 12:15:22.000000000 -0800 +@@ -26,6 +26,9 @@ + /* + * HISTORY + * $Log: err_server.sub,v $ ++ * Revision 1.1.1.1 1998/02/07 20:15:22 gafton ++ * import from sourceware ++ * + * Revision 1.1 1992/10/06 18:29:53 roland + * entered into RCS + * +diff -Naur ../glibc-2.1.3/mach/err_us.sub glibc-2.1.3/mach/err_us.sub +--- ../glibc-2.1.3/mach/err_us.sub 1993-11-23 13:14:05.000000000 -0800 ++++ glibc-2.1.3/mach/err_us.sub 1998-02-07 12:15:22.000000000 -0800 +@@ -26,6 +26,9 @@ + /* + * HISTORY + * $Log: err_us.sub,v $ ++ * Revision 1.1.1.1 1998/02/07 20:15:22 gafton ++ * import from sourceware ++ * + * Revision 1.2 1993/11/23 21:14:05 mib + * entered into RCS + * +diff -Naur ../glibc-2.1.3/mach/error_compat.c glibc-2.1.3/mach/error_compat.c +--- ../glibc-2.1.3/mach/error_compat.c 1997-03-16 09:41:36.000000000 -0800 ++++ glibc-2.1.3/mach/error_compat.c 1998-02-07 12:15:22.000000000 -0800 +@@ -26,6 +26,9 @@ + + /* This file was broken out from: + $Log: error_compat.c,v $ ++ Revision 1.1.1.1 1998/02/07 20:15:22 gafton ++ import from sourceware ++ + Revision 1.2 1997/03/16 17:41:36 drepper + (__mach_error_map_compat): Give full prototype. + +diff -Naur ../glibc-2.1.3/mach/errorlib.h glibc-2.1.3/mach/errorlib.h +--- ../glibc-2.1.3/mach/errorlib.h 1995-03-10 15:57:44.000000000 -0800 ++++ glibc-2.1.3/mach/errorlib.h 1998-02-07 12:15:23.000000000 -0800 +@@ -26,6 +26,9 @@ + /* + * HISTORY + * $Log: errorlib.h,v $ ++ * Revision 1.1.1.1 1998/02/07 20:15:23 gafton ++ * import from sourceware ++ * + * Revision 1.5 1995/03/10 23:57:44 roland + * (errors): Use const for decl. + * +diff -Naur ../glibc-2.1.3/mach/errstring.c glibc-2.1.3/mach/errstring.c +--- ../glibc-2.1.3/mach/errstring.c 1997-03-16 09:41:48.000000000 -0800 ++++ glibc-2.1.3/mach/errstring.c 1998-02-07 12:15:23.000000000 -0800 +@@ -26,6 +26,9 @@ + /* + * HISTORY + * $Log: errstring.c,v $ ++ * Revision 1.1.1.1 1998/02/07 20:15:23 gafton ++ * import from sourceware ++ * + * Revision 1.2 1997/03/16 17:41:48 drepper + * (mach_error_string_int): Give full prototype. + * +diff -Naur ../glibc-2.1.3/mach/mach/error.h glibc-2.1.3/mach/mach/error.h +--- ../glibc-2.1.3/mach/mach/error.h 1997-03-16 09:43:08.000000000 -0800 ++++ glibc-2.1.3/mach/mach/error.h 1998-02-07 12:15:28.000000000 -0800 +@@ -27,6 +27,9 @@ + /* + * HISTORY + * $Log: error.h,v $ ++ * Revision 1.1.1.1 1998/02/07 20:15:28 gafton ++ * import from sourceware ++ * + * Revision 1.3 1997/03/16 17:43:08 drepper + * (mach_error_fn_t): Comment out declaration; it appears to be entirely + * unused dead code. +diff -Naur ../glibc-2.1.3/mach/mach_error.c glibc-2.1.3/mach/mach_error.c +--- ../glibc-2.1.3/mach/mach_error.c 1997-03-16 09:42:02.000000000 -0800 ++++ glibc-2.1.3/mach/mach_error.c 1998-02-07 12:15:25.000000000 -0800 +@@ -26,6 +26,9 @@ + /* + * HISTORY + * $Log: mach_error.c,v $ ++ * Revision 1.1.1.1 1998/02/07 20:15:25 gafton ++ * import from sourceware ++ * + * Revision 1.2 1997/03/16 17:42:02 drepper + * (mach_error_string_int): Give full prototype. + * +diff -Naur ../glibc-2.1.3/mach/mach_error.h glibc-2.1.3/mach/mach_error.h +--- ../glibc-2.1.3/mach/mach_error.h 1997-03-16 09:42:25.000000000 -0800 ++++ glibc-2.1.3/mach/mach_error.h 1998-02-07 12:15:25.000000000 -0800 +@@ -26,6 +26,9 @@ + /* + * HISTORY + * $Log: mach_error.h,v $ ++ * Revision 1.1.1.1 1998/02/07 20:15:25 gafton ++ * import from sourceware ++ * + * Revision 1.3 1997/03/16 17:42:25 drepper + * (mach_error_string, mach_error, mach_error_type): Always provide + * prototypes. +diff -Naur ../glibc-2.1.3/mach/msg-destroy.c glibc-2.1.3/mach/msg-destroy.c +--- ../glibc-2.1.3/mach/msg-destroy.c 1997-06-20 18:40:07.000000000 -0700 ++++ glibc-2.1.3/mach/msg-destroy.c 1998-02-07 12:15:26.000000000 -0800 +@@ -26,6 +26,9 @@ + /* + * HISTORY + * $Log: msg-destroy.c,v $ ++ * Revision 1.1.1.1 1998/02/07 20:15:26 gafton ++ * import from sourceware ++ * + * Revision 1.5 1997/06/21 01:40:07 drepper + * More 64bit changes. + * +diff -Naur ../glibc-2.1.3/mach/msgserver.c glibc-2.1.3/mach/msgserver.c +--- ../glibc-2.1.3/mach/msgserver.c 1996-12-19 17:32:35.000000000 -0800 ++++ glibc-2.1.3/mach/msgserver.c 1998-02-07 12:15:26.000000000 -0800 +@@ -49,6 +49,9 @@ + /* + * HISTORY + * $Log: msgserver.c,v $ ++ * Revision 1.1.1.1 1998/02/07 20:15:26 gafton ++ * import from sourceware ++ * + * Revision 1.5 1996/12/20 01:32:35 drepper + * Update from main archive 961219 + * +diff -Naur ../glibc-2.1.3/malloc/malloc.c glibc-2.1.3/malloc/malloc.c +--- ../glibc-2.1.3/malloc/malloc.c 2000-02-22 23:02:55.000000000 -0800 ++++ glibc-2.1.3/malloc/malloc.c 2000-02-21 21:29:32.000000000 -0800 +@@ -19,7 +19,7 @@ + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +-/* $Id: malloc.c,v 1.40.2.9 2000/02/22 04:48:48 drepper Exp $ ++/* $Id: malloc.c,v 1.1.1.2 2000/02/22 05:29:32 gafton Exp $ + + This work is mainly derived from malloc-2.6.4 by Doug Lea + <dl@cs.oswego.edu>, which is available from: +diff -Naur ../glibc-2.1.3/malloc/thread-m.h glibc-2.1.3/malloc/thread-m.h +--- ../glibc-2.1.3/malloc/thread-m.h 1999-12-10 10:28:54.000000000 -0800 ++++ glibc-2.1.3/malloc/thread-m.h 1999-12-20 11:55:50.000000000 -0800 +@@ -19,7 +19,7 @@ + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +-/* $Id: thread-m.h,v 1.10.2.1 1999/12/10 05:29:37 drepper Exp $ ++/* $Id: thread-m.h,v 1.1.1.1 1999/12/20 19:55:50 gafton Exp $ + One out of _LIBC, USE_PTHREADS, USE_THR or USE_SPROC should be + defined, otherwise the token NO_THREADS and dummy implementations + of the macros will be defined. */ +diff -Naur ../glibc-2.1.3/manual/.cvsignore glibc-2.1.3/manual/.cvsignore +--- ../glibc-2.1.3/manual/.cvsignore 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/manual/.cvsignore 2000-02-18 16:05:53.000000000 -0800 +@@ -0,0 +1,9 @@ ++libc.info-* ++*.c.* ++dir-add.info ++top-menu.texi ++chapters.texi ++libc.info ++summary.texi ++stamp-summary ++texis +diff -Naur ../glibc-2.1.3/manual/add.c.texi glibc-2.1.3/manual/add.c.texi +--- ../glibc-2.1.3/manual/add.c.texi 1999-07-18 18:01:09.000000000 -0700 ++++ glibc-2.1.3/manual/add.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,30 +0,0 @@ +-#include <stdarg.h> +-#include <stdio.h> +- +-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 -Naur ../glibc-2.1.3/manual/argp-ex1.c.texi glibc-2.1.3/manual/argp-ex1.c.texi +--- ../glibc-2.1.3/manual/argp-ex1.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/argp-ex1.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -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 <argp.h> +- +-int main (int argc, char **argv) +-@{ +- argp_parse (0, argc, argv, 0, 0, 0); +- exit (0); +-@} +diff -Naur ../glibc-2.1.3/manual/argp-ex2.c.texi glibc-2.1.3/manual/argp-ex2.c.texi +--- ../glibc-2.1.3/manual/argp-ex2.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/argp-ex2.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -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 becuase they will almost always be constant +- for a given program, even if it uses different argument +- parsers for various tasks).} */ +- +-#include <argp.h> +- +-const char *argp_program_version = +- "argp-ex2 1.0"; +-const char *argp_program_bug_address = +- "<bug-gnu-utils@@gnu.org>"; +- +-/* @r{Program documentation.} */ +-static char doc[] = +- "Argp example #2 -- a pretty minimal program using argp"; +- +-/* @r{Our argpument 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 -Naur ../glibc-2.1.3/manual/argp-ex3.c.texi glibc-2.1.3/manual/argp-ex3.c.texi +--- ../glibc-2.1.3/manual/argp-ex3.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/argp-ex3.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -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 argumens 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 <argp.h> +- +-const char *argp_program_version = +- "argp-ex3 1.0"; +-const char *argp_program_bug_address = +- "<bug-gnu-utils@@gnu.org>"; +- +-/* @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 -Naur ../glibc-2.1.3/manual/argp-ex4.c.texi glibc-2.1.3/manual/argp-ex4.c.texi +--- ../glibc-2.1.3/manual/argp-ex4.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/argp-ex4.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -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 documenation strings are also passed to +- the `gettext' function, for possible translation into the +- current locale.} */ +- +-#include <stdlib.h> +-#include <error.h> +-#include <argp.h> +- +-const char *argp_program_version = +- "argp-ex4 1.0"; +-const char *argp_program_bug_address = +- "<bug-gnu-utils@@prep.ai.mit.edu>"; +- +-/* @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 -Naur ../glibc-2.1.3/manual/atexit.c.texi glibc-2.1.3/manual/atexit.c.texi +--- ../glibc-2.1.3/manual/atexit.c.texi 1999-07-18 18:01:09.000000000 -0700 ++++ glibc-2.1.3/manual/atexit.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,15 +0,0 @@ +-#include <stdio.h> +-#include <stdlib.h> +- +-void +-bye (void) +-@{ +- puts ("Goodbye, cruel world...."); +-@} +- +-int +-main (void) +-@{ +- atexit (bye); +- exit (EXIT_SUCCESS); +-@} +diff -Naur ../glibc-2.1.3/manual/db.c.texi glibc-2.1.3/manual/db.c.texi +--- ../glibc-2.1.3/manual/db.c.texi 1999-07-18 18:01:09.000000000 -0700 ++++ glibc-2.1.3/manual/db.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,52 +0,0 @@ +-#include <grp.h> +-#include <pwd.h> +-#include <sys/types.h> +-#include <unistd.h> +-#include <stdlib.h> +- +-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 -Naur ../glibc-2.1.3/manual/dir glibc-2.1.3/manual/dir +--- ../glibc-2.1.3/manual/dir 1997-06-19 11:22:50.000000000 -0700 ++++ glibc-2.1.3/manual/dir 1998-02-07 12:16:10.000000000 -0800 +@@ -1,4 +1,4 @@ +-$Id: dir,v 2.1 1997/06/19 18:22:50 drepper Exp $ ++$Id: dir,v 1.1.1.1 1998/02/07 20:16:10 gafton Exp $ + This is the file .../info/dir, which contains the topmost node of the + Info hierarchy. The first time you invoke Info you start off + looking at that node, which is (dir)Top. +diff -Naur ../glibc-2.1.3/manual/dir-add.info glibc-2.1.3/manual/dir-add.info +--- ../glibc-2.1.3/manual/dir-add.info 2000-01-05 19:18:18.000000000 -0800 ++++ glibc-2.1.3/manual/dir-add.info 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1502 +0,0 @@ +-INFO-DIR-SECTION GNU C library functions +-START-INFO-DIR-ENTRY +-* (*gconv_end_fct): (libc)glibc iconv Implementation. +-* (*gconv_fct): (libc)glibc iconv Implementation. +-* (*gconv_init_fct): (libc)glibc iconv Implementation. +-* AF_INET6: (libc)Internet Namespace. +-* 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)Basic CPU Time. +-* CLOCAL: (libc)Control Modes. +-* CLOCKS_PER_SEC: (libc)Basic 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. +-* 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. +-* 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_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. +-* 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)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. +-* __va_copy: (libc)Argument Macros. +-* _exit: (libc)Termination Internals. +-* _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)Filesystem handling. +-* addseverity: (libc)Adding Severity Classes. +-* adjtime: (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 Date and Time. +-* asctime_r: (libc)Formatting Date and 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. +-* bcmp: (libc)String/Array Comparison. +-* bcopy: (libc)Copying and Concatenation. +-* bind: (libc)Setting Address. +-* bindtextdomain: (libc)Locating gettext catalog. +-* 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. +-* 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)EOF and Errors. +-* clock: (libc)Basic 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. +-* 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 Date and Time. +-* ctime_r: (libc)Formatting Date and Time. +-* cuserid: (libc)Who Logged In. +-* dcgettext: (libc)Translation with gettext. +-* des_setparity: (libc)DES Encryption. +-* dgettext: (libc)Translation with gettext. +-* difftime: (libc)Simple Calendar Time. +-* div: (libc)Integer Division. +-* 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)Filesystem handling. +-* endgrent: (libc)Scanning All Groups. +-* endhostent: (libc)Host Names. +-* endmntent: (libc)Filesystem handling. +-* 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. +-* errno: (libc)Checking for Errors. +-* 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. +-* 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. +-* fegetenv: (libc)Control Functions. +-* fegetexceptflag: (libc)Status bit operations. +-* fegetround: (libc)Rounding. +-* feholdexcept: (libc)Control Functions. +-* feof: (libc)EOF and Errors. +-* ferror: (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. +-* fgetc: (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. +-* fileno: (libc)Descriptors and Streams. +-* finite: (libc)Floating Point Classes. +-* finitef: (libc)Floating Point Classes. +-* finitel: (libc)Floating Point Classes. +-* 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. +-* fputs: (libc)Simple Output. +-* fread: (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)Truncating Files. +-* ftruncate: (libc)File Size. +-* ftruncate: (libc)Truncating Files. +-* ftw64: (libc)Working on Directory Trees. +-* ftw: (libc)Working on Directory Trees. +-* fwrite: (libc)Block Input/Output. +-* gamma: (libc)Special Functions. +-* gammaf: (libc)Special Functions. +-* gammal: (libc)Special Functions. +-* gcvt: (libc)System V Number Conversion. +-* getc: (libc)Character Input. +-* getchar: (libc)Character Input. +-* getcwd: (libc)Working Directory. +-* getdate: (libc)General Time String Parsing. +-* getdate_r: (libc)General Time String Parsing. +-* getdelim: (libc)Line Input. +-* getegid: (libc)Reading Persona. +-* getenv: (libc)Environment Access. +-* geteuid: (libc)Reading Persona. +-* getfsent: (libc)Filesystem handling. +-* getfsfile: (libc)Filesystem handling. +-* getfsspec: (libc)Filesystem handling. +-* 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. +-* 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. +-* getlogin: (libc)Who Logged In. +-* getmntent: (libc)Filesystem handling. +-* getmntent_r: (libc)Filesystem handling. +-* 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. +-* 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)Priority. +-* 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. +-* getutxent: (libc)XPG Functions. +-* getutxid: (libc)XPG Functions. +-* getutxline: (libc)XPG Functions. +-* getw: (libc)Character Input. +-* getwd: (libc)Working Directory. +-* glob: (libc)Calling Glob. +-* globfree: (libc)More Flags for Globbing. +-* gmtime: (libc)Broken-down Time. +-* gmtime_r: (libc)Broken-down Time. +-* grantpt: (libc)Allocation. +-* gsignal: (libc)Signaling Yourself. +-* hasmntopt: (libc)Filesystem handling. +-* 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. +-* infnan: (libc)Floating Point Classes. +-* initgroups: (libc)Setting Groups. +-* initstate: (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. +-* logb: (libc)Normalization Functions. +-* logbf: (libc)Exponents and Logarithms. +-* logbf: (libc)Normalization Functions. +-* logbl: (libc)Exponents and Logarithms. +-* logbl: (libc)Normalization Functions. +-* 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. +-* 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. +-* memmem: (libc)Search Functions. +-* memmove: (libc)Copying and Concatenation. +-* mempcpy: (libc)Copying and Concatenation. +-* memset: (libc)Copying and Concatenation. +-* mkdir: (libc)Creating Directories. +-* mkfifo: (libc)FIFO Special Files. +-* mknod: (libc)Making Special Files. +-* mkstemp: (libc)Temporary Files. +-* mktemp: (libc)Temporary Files. +-* mktime: (libc)Broken-down Time. +-* mmap: (libc)Memory-mapped I/O. +-* modf: (libc)Rounding Functions. +-* modff: (libc)Rounding Functions. +-* modfl: (libc)Rounding Functions. +-* 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. +-* 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 on Directory Trees. +-* nftw: (libc)Working on Directory Trees. +-* nice: (libc)Priority. +-* 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)Precision Time. +-* ntp_gettime: (libc)Precision Time. +-* 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. +-* 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. +-* 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)Miscellaneous Thread Functions. +-* pthread_attr_destroy: (libc)Thread Attributes. +-* pthread_attr_get@var{attr}: (libc)Thread Attributes. +-* pthread_attr_init: (libc)Thread Attributes. +-* pthread_attr_set@var{attr}: (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_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_trylock: (libc)Mutexes. +-* pthread_mutex_unlock: (libc)Mutexes. +-* pthread_mutexattr_destroy: (libc)Mutexes. +-* pthread_mutexattr_getkind_np: (libc)Mutexes. +-* pthread_mutexattr_init: (libc)Mutexes. +-* pthread_mutexattr_setkind_np: (libc)Mutexes. +-* pthread_once: (libc)Miscellaneous Thread Functions. +-* pthread_self: (libc)Miscellaneous Thread Functions. +-* pthread_setcancelstate: (libc)Cancellation. +-* pthread_setcanceltype: (libc)Cancellation. +-* 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. +-* putchar: (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. +-* 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. +-* read: (libc)I/O Primitives. +-* readdir: (libc)Reading/Closing Directory. +-* readdir_r: (libc)Reading/Closing Directory. +-* readlink: (libc)Symbolic Links. +-* readv: (libc)Scatter-Gather. +-* realloc: (libc)Changing Block Size. +-* 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. +-* 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. +-* 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. +-* setegid: (libc)Setting Groups. +-* setenv: (libc)Environment Access. +-* seteuid: (libc)Setting User ID. +-* setfsent: (libc)Filesystem handling. +-* 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. +-* setmntent: (libc)Filesystem handling. +-* setnetent: (libc)Networks Database. +-* setnetgrent: (libc)Lookup Netgroup. +-* setpgid: (libc)Process Group Functions. +-* setpgrp: (libc)Process Group Functions. +-* setpriority: (libc)Priority. +-* 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. +-* 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. +-* sscanf: (libc)Formatted Input Functions. +-* ssignal: (libc)Basic Signal Handling. +-* stat64: (libc)Reading Attributes. +-* stat: (libc)Reading Attributes. +-* stpcpy: (libc)Copying and Concatenation. +-* stpncpy: (libc)Copying and Concatenation. +-* strcasecmp: (libc)String/Array Comparison. +-* strcat: (libc)Copying and Concatenation. +-* strchr: (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. +-* strftime: (libc)Formatting Date and 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. +-* 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. +-* strtouq: (libc)Parsing of Integers. +-* strverscmp: (libc)String/Array Comparison. +-* strxfrm: (libc)Collation Functions. +-* symlink: (libc)Symbolic Links. +-* sync: (libc)Synchronizing I/O. +-* sysconf: (libc)Sysconf Definition. +-* 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. +-* times: (libc)Detailed CPU 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)Truncating Files. +-* truncate: (libc)File Size. +-* truncate: (libc)Truncating Files. +-* 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. +-* umask: (libc)Setting Permissions. +-* uname: (libc)Hardware/Software Type ID. +-* ungetc: (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. +-* 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. +-* 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. +-* 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. +-* wait3: (libc)BSD Wait Functions. +-* wait4: (libc)Process Completion. +-* wait: (libc)Process Completion. +-* waitpid: (libc)Process Completion. +-* wcrtomb: (libc)Converting a Character. +-* wcsnrtombs: (libc)Converting Strings. +-* wcsrtombs: (libc)Converting Strings. +-* wcstombs: (libc)Non-reentrant String Conversion. +-* wctob: (libc)Converting a Character. +-* wctomb: (libc)Non-reentrant Character Conversion. +-* wctrans: (libc)Wide Character Case Conversion. +-* wctype: (libc)Classification of Wide Characters. +-* wordexp: (libc)Calling Wordexp. +-* wordfree: (libc)Calling Wordexp. +-* write: (libc)I/O Primitives. +-* writev: (libc)Scatter-Gather. +-* 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. +-END-INFO-DIR-ENTRY +diff -Naur ../glibc-2.1.3/manual/dir.c.texi glibc-2.1.3/manual/dir.c.texi +--- ../glibc-2.1.3/manual/dir.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/dir.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,25 +0,0 @@ +-@group +-#include <stddef.h> +-#include <stdio.h> +-#include <sys/types.h> +-#include <dirent.h> +-@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 +- puts ("Couldn't open the directory."); +- +- return 0; +-@} +diff -Naur ../glibc-2.1.3/manual/dir2.c.texi glibc-2.1.3/manual/dir2.c.texi +--- ../glibc-2.1.3/manual/dir2.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/dir2.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,29 +0,0 @@ +-@group +-#include <stdio.h> +-#include <dirent.h> +-@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 -Naur ../glibc-2.1.3/manual/filecli.c.texi glibc-2.1.3/manual/filecli.c.texi +--- ../glibc-2.1.3/manual/filecli.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/filecli.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,54 +0,0 @@ +-#include <stdio.h> +-#include <errno.h> +-#include <unistd.h> +-#include <stdlib.h> +-#include <sys/socket.h> +-#include <sys/un.h> +- +-#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 -Naur ../glibc-2.1.3/manual/filesrv.c.texi glibc-2.1.3/manual/filesrv.c.texi +--- ../glibc-2.1.3/manual/filesrv.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/filesrv.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,48 +0,0 @@ +-#include <stdio.h> +-#include <errno.h> +-#include <stdlib.h> +-#include <sys/socket.h> +-#include <sys/un.h> +- +-#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 -Naur ../glibc-2.1.3/manual/fmtmsgexpl.c.texi glibc-2.1.3/manual/fmtmsgexpl.c.texi +--- ../glibc-2.1.3/manual/fmtmsgexpl.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/fmtmsgexpl.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,12 +0,0 @@ +-#include <fmtmsg.h> +- +-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 -Naur ../glibc-2.1.3/manual/inetcli.c.texi glibc-2.1.3/manual/inetcli.c.texi +--- ../glibc-2.1.3/manual/inetcli.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/inetcli.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,59 +0,0 @@ +-#include <stdio.h> +-#include <errno.h> +-#include <stdlib.h> +-#include <unistd.h> +-#include <sys/types.h> +-#include <sys/socket.h> +-#include <netinet/in.h> +-#include <netdb.h> +- +-#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 -Naur ../glibc-2.1.3/manual/inetsrv.c.texi glibc-2.1.3/manual/inetsrv.c.texi +--- ../glibc-2.1.3/manual/inetsrv.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/inetsrv.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,103 +0,0 @@ +-#include <stdio.h> +-#include <errno.h> +-#include <stdlib.h> +-#include <unistd.h> +-#include <sys/types.h> +-#include <sys/socket.h> +-#include <netinet/in.h> +-#include <netdb.h> +- +-#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 -Naur ../glibc-2.1.3/manual/isockad.c.texi glibc-2.1.3/manual/isockad.c.texi +--- ../glibc-2.1.3/manual/isockad.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/isockad.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,23 +0,0 @@ +-#include <stdio.h> +-#include <stdlib.h> +-#include <sys/socket.h> +-#include <netinet/in.h> +-#include <netdb.h> +- +-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 -Naur ../glibc-2.1.3/manual/libc.cp glibc-2.1.3/manual/libc.cp +--- ../glibc-2.1.3/manual/libc.cp 2000-01-05 19:19:29.000000000 -0800 ++++ glibc-2.1.3/manual/libc.cp 1969-12-31 16:00:00.000000000 -0800 +@@ -1,939 +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}{5}{reserved names} +-\entry{name space}{5}{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}{28}{program name} +-\entry{name of running program}{28}{name of running program} +-\entry{memory allocation}{31}{memory allocation} +-\entry{storage allocation}{31}{storage allocation} +-\entry{dynamic allocation}{31}{dynamic allocation} +-\entry{static allocation}{31}{static allocation} +-\entry{automatic allocation}{31}{automatic allocation} +-\entry{unconstrained storage allocation}{32}{unconstrained storage allocation} +-\entry{malloc function}{32}{\code {malloc} function} +-\entry{heap, dynamic allocation from}{32}{heap, dynamic allocation from} +-\entry{allocation of memory with malloc}{32}{allocation of memory with \code {malloc}} +-\entry{freeing memory allocated with malloc}{34}{freeing memory allocated with \code {malloc}} +-\entry{heap, freeing memory from}{34}{heap, freeing memory from} +-\entry{changing the size of a block (malloc)}{34}{changing the size of a block (\code {malloc})} +-\entry{efficiency and malloc}{36}{efficiency and \code {malloc}} +-\entry{page boundary}{36}{page boundary} +-\entry{alignment (with malloc)}{36}{alignment (with \code {malloc})} +-\entry{heap consistency checking}{37}{heap consistency checking} +-\entry{consistency checking, of heap}{37}{consistency checking, of heap} +-\entry{allocation hooks, for malloc}{39}{allocation hooks, for \code {malloc}} +-\entry{allocation statistics}{41}{allocation statistics} +-\entry{allocation debugging}{43}{allocation debugging} +-\entry{malloc debugger}{43}{malloc debugger} +-\entry{obstacks}{47}{obstacks} +-\entry{allocation (obstacks)}{48}{allocation (obstacks)} +-\entry{freeing (obstacks)}{50}{freeing (obstacks)} +-\entry{macros}{50}{macros} +-\entry{growing objects (in obstacks)}{51}{growing objects (in obstacks)} +-\entry{changing the size of a block (obstacks)}{51}{changing the size of a block (obstacks)} +-\entry{shrinking objects}{52}{shrinking objects} +-\entry{efficiency and obstacks}{52}{efficiency and obstacks} +-\entry{obstack status}{54}{obstack status} +-\entry{status of obstack}{54}{status of obstack} +-\entry{alignment (in obstacks)}{55}{alignment (in obstacks)} +-\entry{efficiency of chunks}{55}{efficiency of chunks} +-\entry{chunks}{55}{chunks} +-\entry{automatic freeing}{57}{automatic freeing} +-\entry{alloca function}{57}{\code {alloca} function} +-\entry{automatic storage with variable size}{57}{automatic storage with variable size} +-\entry{longjmp}{58}{longjmp} +-\entry{alloca disadvantages}{59}{\code {alloca} disadvantages} +-\entry{disadvantages of alloca}{59}{disadvantages of \code {alloca}} +-\entry{variable-sized arrays}{59}{variable-sized arrays} +-\entry{character testing}{61}{character testing} +-\entry{classification of characters}{61}{classification of characters} +-\entry{predicates on characters}{61}{predicates on characters} +-\entry{character predicates}{61}{character predicates} +-\entry{lower-case character}{61}{lower-case character} +-\entry{upper-case character}{61}{upper-case character} +-\entry{alphabetic character}{61}{alphabetic character} +-\entry{digit character}{62}{digit character} +-\entry{decimal digit character}{62}{decimal digit character} +-\entry{alphanumeric character}{62}{alphanumeric character} +-\entry{hexadecimal digit character}{62}{hexadecimal digit character} +-\entry{punctuation character}{62}{punctuation character} +-\entry{whitespace character}{62}{whitespace character} +-\entry{blank character}{62}{blank character} +-\entry{graphic character}{62}{graphic character} +-\entry{printing character}{62}{printing character} +-\entry{control character}{62}{control character} +-\entry{ASCII character}{63}{ASCII character} +-\entry{character case conversion}{63}{character case conversion} +-\entry{case conversion of characters}{63}{case conversion of characters} +-\entry{converting case of characters}{63}{converting case of characters} +-\entry{alphanumeric character}{64}{alphanumeric character} +-\entry{alphabetic character}{65}{alphabetic character} +-\entry{control character}{65}{control character} +-\entry{digit character}{65}{digit character} +-\entry{graphic character}{65}{graphic character} +-\entry{lower-case character}{66}{lower-case character} +-\entry{printing character}{66}{printing character} +-\entry{punctuation character}{66}{punctuation character} +-\entry{whitespace character}{66}{whitespace character} +-\entry{upper-case character}{67}{upper-case character} +-\entry{hexadecimal digit character}{67}{hexadecimal digit character} +-\entry{blank character}{67}{blank character} +-\entry{string, representation of}{71}{string, representation of} +-\entry{string}{71}{string} +-\entry{null character}{71}{null character} +-\entry{string literal}{71}{string literal} +-\entry{length of string}{71}{length of string} +-\entry{allocation size of string}{71}{allocation size of string} +-\entry{size of string}{71}{size of string} +-\entry{string length}{71}{string length} +-\entry{string allocation}{71}{string allocation} +-\entry{copying strings and arrays}{73}{copying strings and arrays} +-\entry{string copy functions}{73}{string copy functions} +-\entry{array copy functions}{73}{array copy functions} +-\entry{concatenating strings}{73}{concatenating strings} +-\entry{string concatenation functions}{73}{string concatenation functions} +-\entry{{\_}{\_}va{\_}copy}{77}{__va_copy} +-\entry{va{\_}copy}{77}{va_copy} +-\entry{comparing strings and arrays}{80}{comparing strings and arrays} +-\entry{string comparison functions}{80}{string comparison functions} +-\entry{array comparison functions}{80}{array comparison functions} +-\entry{predicates on strings}{80}{predicates on strings} +-\entry{predicates on arrays}{80}{predicates on arrays} +-\entry{collating strings}{83}{collating strings} +-\entry{string collation functions}{83}{string collation functions} +-\entry{converting string to collation order}{84}{converting string to collation order} +-\entry{search functions (for strings)}{86}{search functions (for strings)} +-\entry{string search functions}{86}{string search functions} +-\entry{tokenizing strings}{88}{tokenizing strings} +-\entry{breaking a string into tokens}{88}{breaking a string into tokens} +-\entry{parsing tokens from a string}{88}{parsing tokens from a string} +-\entry{argz vectors (string vectors)}{93}{argz vectors (string vectors)} +-\entry{string vectors, null-character separated}{93}{string vectors, null-character separated} +-\entry{argument vectors, null-character separated}{93}{argument vectors, null-character separated} +-\entry{envz vectors (environment vectors)}{93}{envz vectors (environment vectors)} +-\entry{environment vectors, null-character separated}{93}{environment vectors, null-character separated} +-\entry{internal representation}{97}{internal representation} +-\entry{wide character}{97}{wide character} +-\entry{Unicode}{97}{Unicode} +-\entry{ISO 10646}{97}{ISO 10646} +-\entry{UCS2}{97}{UCS2} +-\entry{UCS4}{97}{UCS4} +-\entry{multibyte character}{99}{multibyte character} +-\entry{EBCDIC}{99}{EBCDIC} +-\entry{ISO 2022}{99}{ISO 2022} +-\entry{EUC}{99}{EUC} +-\entry{SJIS}{99}{SJIS} +-\entry{ISO 6937}{100}{ISO 6937} +-\entry{UTF-8}{100}{UTF-8} +-\entry{UTF-7}{100}{UTF-7} +-\entry{stateful}{102}{stateful} +-\entry{shift state}{102}{shift state} +-\entry{stateful}{105}{stateful} +-\entry{stateful}{110}{stateful} +-\entry{stateful}{121}{stateful} +-\entry{stateful}{124}{stateful} +-\entry{triangulation}{126}{triangulation} +-\entry{ISO-2022-JP}{127}{ISO-2022-JP} +-\entry{EUC-JP}{127}{EUC-JP} +-\entry{stateful}{135}{stateful} +-\entry{internationalization}{141}{internationalization} +-\entry{locales}{141}{locales} +-\entry{combining locales}{142}{combining locales} +-\entry{categories for locales}{142}{categories for locales} +-\entry{locale categories}{142}{locale categories} +-\entry{changing the locale}{143}{changing the locale} +-\entry{locale, changing}{143}{locale, changing} +-\entry{monetary value formatting}{146}{monetary value formatting} +-\entry{numeric value formatting}{146}{numeric value formatting} +-\entry{decimal-point separator}{146}{decimal-point separator} +-\entry{grouping of digits}{146}{grouping of digits} +-\entry{currency symbols}{147}{currency symbols} +-\entry{NLSPATH environment variable}{160}{NLSPATH environment variable} +-\entry{LC{\_}ALL environment variable}{161}{LC_ALL environment variable} +-\entry{LC{\_}MESSAGES environment variable}{161}{LC_MESSAGES environment variable} +-\entry{LANG environment variable}{161}{LANG environment variable} +-\entry{gencat}{164}{gencat} +-\entry{Comparison Function}{177}{Comparison Function} +-\entry{search function (for arrays)}{177}{search function (for arrays)} +-\entry{binary search function (for arrays)}{177}{binary search function (for arrays)} +-\entry{array search function}{177}{array search function} +-\entry{sort function (for arrays)}{178}{sort function (for arrays)} +-\entry{quick sort function (for arrays)}{178}{quick sort function (for arrays)} +-\entry{array sort function}{178}{array sort function} +-\entry{stable sorting}{178}{stable sorting} +-\entry{Kermit the frog}{181}{Kermit the frog} +-\entry{globbing}{188}{globbing} +-\entry{word expansion}{198}{word expansion} +-\entry{expansion of shell words}{198}{expansion of shell words} +-\entry{tilde expansion}{199}{tilde expansion} +-\entry{variable substitution}{199}{variable substitution} +-\entry{substitution of variables and commands}{199}{substitution of variables and commands} +-\entry{command substitution}{199}{command substitution} +-\entry{arithmetic expansion}{199}{arithmetic expansion} +-\entry{field splitting}{199}{field splitting} +-\entry{wildcard expansion}{199}{wildcard expansion} +-\entry{quote removal}{199}{quote removal} +-\entry{removal of quotes}{199}{removal of quotes} +-\entry{opening a file}{205}{opening a file} +-\entry{file position}{206}{file position} +-\entry{sequential-access files}{206}{sequential-access files} +-\entry{random-access files}{206}{random-access files} +-\entry{append-access files}{207}{append-access files} +-\entry{file name}{207}{file name} +-\entry{directory}{207}{directory} +-\entry{link}{207}{link} +-\entry{directory entry}{207}{directory entry} +-\entry{file name component}{207}{file name component} +-\entry{file name resolution}{208}{file name resolution} +-\entry{root directory}{208}{root directory} +-\entry{absolute file name}{208}{absolute file name} +-\entry{relative file name}{208}{relative file name} +-\entry{parent directory}{208}{parent directory} +-\entry{file name errors}{208}{file name errors} +-\entry{usual file name errors}{208}{usual file name errors} +-\entry{file pointer}{211}{file pointer} +-\entry{standard streams}{211}{standard streams} +-\entry{streams, standard}{211}{streams, standard} +-\entry{standard input stream}{211}{standard input stream} +-\entry{standard output stream}{211}{standard output stream} +-\entry{standard error stream}{212}{standard error stream} +-\entry{opening a stream}{212}{opening a stream} +-\entry{closing a stream}{214}{closing a stream} +-\entry{writing to a stream, by characters}{215}{writing to a stream, by characters} +-\entry{reading from a stream, by characters}{216}{reading from a stream, by characters} +-\entry{peeking at input}{219}{peeking at input} +-\entry{unreading characters}{219}{unreading characters} +-\entry{pushing input back}{219}{pushing input back} +-\entry{binary I/O to a stream}{221}{binary I/O to a stream} +-\entry{block I/O to a stream}{221}{block I/O to a stream} +-\entry{reading from a stream, by blocks}{221}{reading from a stream, by blocks} +-\entry{writing to a stream, by blocks}{221}{writing to a stream, by blocks} +-\entry{format string, for printf}{221}{format string, for \code {printf}} +-\entry{template, for printf}{221}{template, for \code {printf}} +-\entry{formatted output to a stream}{221}{formatted output to a stream} +-\entry{writing to a stream, formatted}{221}{writing to a stream, formatted} +-\entry{conversion specifications (printf)}{222}{conversion specifications (\code {printf})} +-\entry{flag character (printf)}{223}{flag character (\code {printf})} +-\entry{minimum field width (printf)}{223}{minimum field width (\code {printf})} +-\entry{precision (printf)}{223}{precision (\code {printf})} +-\entry{type modifier character (printf)}{224}{type modifier character (\code {printf})} +-\entry{output conversions, for printf}{224}{output conversions, for \code {printf}} +-\entry{parsing a template string}{234}{parsing a template string} +-\entry{customizing printf}{237}{customizing \code {printf}} +-\entry{defining new printf conversions}{237}{defining new \code {printf} conversions} +-\entry{extending printf}{237}{extending \code {printf}} +-\entry{formatted input from a stream}{242}{formatted input from a stream} +-\entry{reading from a stream, formatted}{242}{reading from a stream, formatted} +-\entry{format string, for scanf}{242}{format string, for \code {scanf}} +-\entry{template, for scanf}{242}{template, for \code {scanf}} +-\entry{conversion specifications (scanf)}{243}{conversion specifications (\code {scanf})} +-\entry{matching failure, in scanf}{243}{matching failure, in \code {scanf}} +-\entry{flag character (scanf)}{244}{flag character (\code {scanf})} +-\entry{maximum field width (scanf)}{244}{maximum field width (\code {scanf})} +-\entry{type modifier character (scanf)}{244}{type modifier character (\code {scanf})} +-\entry{input conversions, for scanf}{244}{input conversions, for \code {scanf}} +-\entry{end of file, on a stream}{250}{end of file, on a stream} +-\entry{text stream}{251}{text stream} +-\entry{binary stream}{251}{binary stream} +-\entry{lines (in a text file)}{251}{lines (in a text file)} +-\entry{file positioning on a stream}{252}{file positioning on a stream} +-\entry{positioning a stream}{252}{positioning a stream} +-\entry{seeking on a stream}{252}{seeking on a stream} +-\entry{buffering of streams}{256}{buffering of streams} +-\entry{unbuffered stream}{256}{unbuffered stream} +-\entry{line buffered stream}{257}{line buffered stream} +-\entry{fully buffered stream}{257}{fully buffered stream} +-\entry{flushing a stream}{257}{flushing a stream} +-\entry{buffering, controlling}{257}{buffering, controlling} +-\entry{stream, for I/O to a string}{259}{stream, for I/O to a string} +-\entry{string stream}{259}{string stream} +-\entry{custom streams}{262}{custom streams} +-\entry{programming your own streams}{262}{programming your own streams} +-\entry{cookie, for custom stream}{262}{cookie, for custom stream} +-\entry{hook functions (of custom streams)}{263}{hook functions (of custom streams)} +-\entry{formatted messages}{264}{formatted messages} +-\entry{severity class}{266}{severity class} +-\entry{severity class}{267}{severity class} +-\entry{opening a file descriptor}{271}{opening a file descriptor} +-\entry{closing a file descriptor}{271}{closing a file descriptor} +-\entry{reading from a file descriptor}{275}{reading from a file descriptor} +-\entry{end-of-file, on a file descriptor}{275}{end-of-file, on a file descriptor} +-\entry{writing to a file descriptor}{277}{writing to a file descriptor} +-\entry{file positioning on a file descriptor}{279}{file positioning on a file descriptor} +-\entry{positioning a file descriptor}{279}{positioning a file descriptor} +-\entry{seeking on a file descriptor}{279}{seeking on a file descriptor} +-\entry{sparse files}{280}{sparse files} +-\entry{holes in files}{280}{holes in files} +-\entry{streams, and file descriptors}{282}{streams, and file descriptors} +-\entry{converting file descriptor to stream}{282}{converting file descriptor to stream} +-\entry{extracting file descriptor from stream}{282}{extracting file descriptor from stream} +-\entry{standard file descriptors}{283}{standard file descriptors} +-\entry{file descriptors, standard}{283}{file descriptors, standard} +-\entry{standard input file descriptor}{283}{standard input file descriptor} +-\entry{standard output file descriptor}{283}{standard output file descriptor} +-\entry{standard error file descriptor}{283}{standard error file descriptor} +-\entry{channels}{283}{channels} +-\entry{streams and descriptors}{283}{streams and descriptors} +-\entry{descriptors and streams}{283}{descriptors and streams} +-\entry{mixing descriptors and streams}{283}{mixing descriptors and streams} +-\entry{linked channels}{283}{linked channels} +-\entry{cleaning up a stream}{283}{cleaning up a stream} +-\entry{independent channels}{284}{independent channels} +-\entry{scatter-gather}{285}{scatter-gather} +-\entry{waiting for input or output}{289}{waiting for input or output} +-\entry{multiplexing input}{289}{multiplexing input} +-\entry{input from multiple files}{289}{input from multiple files} +-\entry{file descriptor sets, for select}{289}{file descriptor sets, for \code {select}} +-\entry{synchronizing}{292}{synchronizing} +-\entry{synchronizing}{301}{synchronizing} +-\entry{control operations on files}{305}{control operations on files} +-\entry{fcntl function}{305}{\code {fcntl} function} +-\entry{duplicating file descriptors}{306}{duplicating file descriptors} +-\entry{redirecting input and output}{306}{redirecting input and output} +-\entry{file descriptor flags}{307}{file descriptor flags} +-\entry{close-on-exec (file descriptor flag)}{308}{close-on-exec (file descriptor flag)} +-\entry{file status flags}{309}{file status flags} +-\entry{file name translation flags}{310}{file name translation flags} +-\entry{flags, file name translation}{310}{flags, file name translation} +-\entry{open-time action flags}{310}{open-time action flags} +-\entry{flags, open-time action}{310}{flags, open-time action} +-\entry{create on open (file status flag)}{310}{create on open (file status flag)} +-\entry{non-blocking open}{310}{non-blocking open} +-\entry{controlling terminal, setting}{311}{controlling terminal, setting} +-\entry{symbolic link, opening}{311}{symbolic link, opening} +-\entry{file locks}{314}{file locks} +-\entry{record locking}{314}{record locking} +-\entry{exclusive lock}{314}{exclusive lock} +-\entry{write lock}{314}{write lock} +-\entry{shared lock}{314}{shared lock} +-\entry{read lock}{314}{read lock} +-\entry{interrupt-driven input}{317}{interrupt-driven input} +-\entry{generic i/o control operations}{318}{generic i/o control operations} +-\entry{IOCTLs}{318}{IOCTLs} +-\entry{current working directory}{319}{current working directory} +-\entry{working directory}{319}{working directory} +-\entry{change working directory}{319}{change working directory} +-\entry{accessing directories}{320}{accessing directories} +-\entry{reading from a directory}{320}{reading from a directory} +-\entry{directories, accessing}{320}{directories, accessing} +-\entry{directory stream}{320}{directory stream} +-\entry{directory hierarchy}{327}{directory hierarchy} +-\entry{hierarchy, directory}{327}{hierarchy, directory} +-\entry{tree, directory}{327}{tree, directory} +-\entry{hard link}{331}{hard link} +-\entry{link, hard}{331}{link, hard} +-\entry{multiple names for one file}{331}{multiple names for one file} +-\entry{file names, multiple}{331}{file names, multiple} +-\entry{soft link}{332}{soft link} +-\entry{link, soft}{332}{link, soft} +-\entry{symbolic link}{332}{symbolic link} +-\entry{link, symbolic}{332}{link, symbolic} +-\entry{deleting a file}{333}{deleting a file} +-\entry{removing a file}{333}{removing a file} +-\entry{unlinking a file}{333}{unlinking a file} +-\entry{directories, deleting}{334}{directories, deleting} +-\entry{deleting a directory}{334}{deleting a directory} +-\entry{renaming a file}{334}{renaming a file} +-\entry{creating a directory}{335}{creating a directory} +-\entry{directories, creating}{335}{directories, creating} +-\entry{status of a file}{336}{status of a file} +-\entry{attributes of a file}{336}{attributes of a file} +-\entry{file attributes}{336}{file attributes} +-\entry{inode number}{339}{inode number} +-\entry{file owner}{343}{file owner} +-\entry{owner of a file}{343}{owner of a file} +-\entry{group owner of a file}{343}{group owner of a file} +-\entry{file permission bits}{344}{file permission bits} +-\entry{sticky bit}{345}{sticky bit} +-\entry{permission to access a file}{346}{permission to access a file} +-\entry{access permission for a file}{346}{access permission for a file} +-\entry{file access permission}{346}{file access permission} +-\entry{file creation mask}{346}{file creation mask} +-\entry{umask}{346}{umask} +-\entry{testing access permission}{348}{testing access permission} +-\entry{access, testing for}{348}{access, testing for} +-\entry{setuid programs and file access}{348}{setuid programs and file access} +-\entry{file access time}{349}{file access time} +-\entry{file modification time}{349}{file modification time} +-\entry{file attribute modification time}{349}{file attribute modification time} +-\entry{creating special files}{352}{creating special files} +-\entry{special files}{352}{special files} +-\entry{TMPDIR environment variable}{355}{TMPDIR environment variable} +-\entry{pipe}{357}{pipe} +-\entry{FIFO special file}{357}{FIFO special file} +-\entry{creating a pipe}{357}{creating a pipe} +-\entry{opening a pipe}{357}{opening a pipe} +-\entry{interprocess communication, with pipes}{357}{interprocess communication, with pipes} +-\entry{creating a pipe to a subprocess}{359}{creating a pipe to a subprocess} +-\entry{pipe to a subprocess}{359}{pipe to a subprocess} +-\entry{filtering i/o through subprocess}{359}{filtering i/o through subprocess} +-\entry{creating a FIFO special file}{360}{creating a FIFO special file} +-\entry{interprocess communication, with FIFO}{360}{interprocess communication, with FIFO} +-\entry{socket}{363}{socket} +-\entry{interprocess communication, with sockets}{363}{interprocess communication, with sockets} +-\entry{communication style (of a socket)}{363}{communication style (of a socket)} +-\entry{style of communication (of a socket)}{363}{style of communication (of a socket)} +-\entry{packet}{363}{packet} +-\entry{byte stream}{363}{byte stream} +-\entry{stream (sockets)}{363}{stream (sockets)} +-\entry{loss of data on sockets}{363}{loss of data on sockets} +-\entry{data loss on sockets}{363}{data loss on sockets} +-\entry{namespace (of socket)}{363}{namespace (of socket)} +-\entry{domain (of socket)}{363}{domain (of socket)} +-\entry{socket namespace}{363}{socket namespace} +-\entry{socket domain}{363}{socket domain} +-\entry{network protocol}{363}{network protocol} +-\entry{protocol (of socket)}{363}{protocol (of socket)} +-\entry{socket protocol}{363}{socket protocol} +-\entry{protocol family}{363}{protocol family} +-\entry{address of socket}{365}{address of socket} +-\entry{name of socket}{365}{name of socket} +-\entry{binding a socket address}{365}{binding a socket address} +-\entry{socket address (name) binding}{365}{socket address (name) binding} +-\entry{local namespace, for sockets}{369}{local namespace, for sockets} +-\entry{Internet namespace, for sockets}{371}{Internet namespace, for sockets} +-\entry{host address, Internet}{373}{host address, Internet} +-\entry{Internet host address}{373}{Internet host address} +-\entry{network number}{373}{network number} +-\entry{local network address number}{373}{local network address number} +-\entry{standard dot notation, for Internet addresses}{373}{standard dot notation, for Internet addresses} +-\entry{dot notation, for Internet addresses}{373}{dot notation, for Internet addresses} +-\entry{hosts database}{377}{hosts database} +-\entry{converting host name to address}{377}{converting host name to address} +-\entry{converting host address to name}{377}{converting host address to name} +-\entry{port number}{381}{port number} +-\entry{services database}{381}{services database} +-\entry{converting service name to port number}{381}{converting service name to port number} +-\entry{converting port number to service name}{381}{converting port number to service name} +-\entry{byte order conversion, for socket}{382}{byte order conversion, for socket} +-\entry{converting byte order}{382}{converting byte order} +-\entry{big-endian}{382}{big-endian} +-\entry{little-endian}{382}{little-endian} +-\entry{network byte order}{382}{network byte order} +-\entry{protocols database}{383}{protocols database} +-\entry{TCP (Internet protocol)}{383}{TCP (Internet protocol)} +-\entry{creating a socket}{386}{creating a socket} +-\entry{socket, creating}{386}{socket, creating} +-\entry{opening a socket}{386}{opening a socket} +-\entry{socket, closing}{387}{socket, closing} +-\entry{closing a socket}{387}{closing a socket} +-\entry{shutting down a socket}{387}{shutting down a socket} +-\entry{socket shutdown}{387}{socket shutdown} +-\entry{creating a socket pair}{387}{creating a socket pair} +-\entry{socket pair}{387}{socket pair} +-\entry{opening a socket pair}{387}{opening a socket pair} +-\entry{connection}{388}{connection} +-\entry{client}{388}{client} +-\entry{server}{388}{server} +-\entry{connecting a socket}{388}{connecting a socket} +-\entry{socket, connecting}{388}{socket, connecting} +-\entry{socket, initiating a connection}{388}{socket, initiating a connection} +-\entry{socket, client actions}{388}{socket, client actions} +-\entry{listening (sockets)}{390}{listening (sockets)} +-\entry{sockets, server actions}{390}{sockets, server actions} +-\entry{sockets, listening}{390}{sockets, listening} +-\entry{sockets, accepting connections}{390}{sockets, accepting connections} +-\entry{accepting connections}{390}{accepting connections} +-\entry{reading from a socket}{392}{reading from a socket} +-\entry{writing to a socket}{392}{writing to a socket} +-\entry{out-of-band data}{398}{out-of-band data} +-\entry{high-priority data}{398}{high-priority data} +-\entry{urgent socket condition}{398}{urgent socket condition} +-\entry{datagram socket}{401}{datagram socket} +-\entry{sending a datagram}{401}{sending a datagram} +-\entry{transmitting datagrams}{401}{transmitting datagrams} +-\entry{datagrams, transmitting}{401}{datagrams, transmitting} +-\entry{receiving datagrams}{401}{receiving datagrams} +-\entry{socket options}{406}{socket options} +-\entry{level, for socket options}{406}{level, for socket options} +-\entry{socket option level}{406}{socket option level} +-\entry{networks database}{408}{networks database} +-\entry{converting network number to network name}{408}{converting network number to network name} +-\entry{converting network name to network number}{408}{converting network name to network number} +-\entry{terminal identification}{411}{terminal identification} +-\entry{identifying terminals}{411}{identifying terminals} +-\entry{terminal input queue}{412}{terminal input queue} +-\entry{typeahead buffer}{412}{typeahead buffer} +-\entry{terminal output queue}{412}{terminal output queue} +-\entry{canonical input processing}{412}{canonical input processing} +-\entry{noncanonical input processing}{412}{noncanonical input processing} +-\entry{terminal mode data types}{413}{terminal mode data types} +-\entry{terminal mode functions}{414}{terminal mode functions} +-\entry{parity checking}{416}{parity checking} +-\entry{break condition, detecting}{417}{break condition, detecting} +-\entry{modem status lines}{419}{modem status lines} +-\entry{carrier detect}{419}{carrier detect} +-\entry{modem disconnect}{419}{modem disconnect} +-\entry{echo of terminal input}{421}{echo of terminal input} +-\entry{interactive signals, from terminal}{422}{interactive signals, from terminal} +-\entry{line speed}{423}{line speed} +-\entry{baud rate}{423}{baud rate} +-\entry{terminal line speed}{423}{terminal line speed} +-\entry{terminal line speed}{423}{terminal line speed} +-\entry{EOF character}{425}{EOF character} +-\entry{EOL character}{425}{EOL character} +-\entry{EOL2 character}{425}{EOL2 character} +-\entry{ERASE character}{426}{ERASE character} +-\entry{WERASE character}{426}{WERASE character} +-\entry{KILL character}{426}{KILL character} +-\entry{REPRINT character}{426}{REPRINT character} +-\entry{INTR character}{427}{INTR character} +-\entry{interrupt character}{427}{interrupt character} +-\entry{QUIT character}{427}{QUIT character} +-\entry{SUSP character}{427}{SUSP character} +-\entry{suspend character}{427}{suspend character} +-\entry{DSUSP character}{427}{DSUSP character} +-\entry{delayed suspend character}{427}{delayed suspend character} +-\entry{START character}{428}{START character} +-\entry{STOP character}{428}{STOP character} +-\entry{LNEXT character}{428}{LNEXT character} +-\entry{DISCARD character}{428}{DISCARD character} +-\entry{STATUS character}{429}{STATUS character} +-\entry{MIN termios slot}{429}{MIN termios slot} +-\entry{TIME termios slot}{429}{TIME termios slot} +-\entry{terminal line control functions}{430}{terminal line control functions} +-\entry{break condition, generating}{430}{break condition, generating} +-\entry{flushing terminal output queue}{431}{flushing terminal output queue} +-\entry{terminal output queue, flushing}{431}{terminal output queue, flushing} +-\entry{clearing terminal input queue}{431}{clearing terminal input queue} +-\entry{terminal input queue, clearing}{431}{terminal input queue, clearing} +-\entry{flow control, terminal}{432}{flow control, terminal} +-\entry{terminal flow control}{432}{terminal flow control} +-\entry{pseudo-terminals}{434}{pseudo-terminals} +-\entry{allocating pseudo-terminals}{434}{allocating pseudo-terminals} +-\entry{opening a pseudo-terminal pair}{436}{opening a pseudo-terminal pair} +-\entry{constants}{439}{constants} +-\entry{mathematical constants}{439}{mathematical constants} +-\entry{trigonometric functions}{440}{trigonometric functions} +-\entry{pi (trigonometric constant)}{440}{pi (trigonometric constant)} +-\entry{complex trigonometric functions}{441}{complex trigonometric functions} +-\entry{inverse trigonometric functions}{442}{inverse trigonometric functions} +-\entry{inverse complex trigonometric functions}{442}{inverse complex trigonometric functions} +-\entry{exponentiation functions}{443}{exponentiation functions} +-\entry{power functions}{443}{power functions} +-\entry{logarithm functions}{443}{logarithm functions} +-\entry{square root function}{445}{square root function} +-\entry{cube root function}{445}{cube root function} +-\entry{complex exponentiation functions}{446}{complex exponentiation functions} +-\entry{complex logarithm functions}{446}{complex logarithm functions} +-\entry{hyperbolic functions}{447}{hyperbolic functions} +-\entry{hyperbolic functions}{447}{hyperbolic functions} +-\entry{inverse hyperbolic functions}{448}{inverse hyperbolic functions} +-\entry{inverse complex hyperbolic functions}{448}{inverse complex hyperbolic functions} +-\entry{special functions}{449}{special functions} +-\entry{Bessel functions}{449}{Bessel functions} +-\entry{gamma function}{449}{gamma function} +-\entry{random numbers}{451}{random numbers} +-\entry{pseudo-random numbers}{451}{pseudo-random numbers} +-\entry{seed (for random numbers)}{451}{seed (for random numbers)} +-\entry{Optimization}{457}{Optimization} +-\entry{floating point}{459}{floating point} +-\entry{IEEE 754}{459}{IEEE 754} +-\entry{IEEE floating point}{459}{IEEE floating point} +-\entry{floating-point classes}{459}{floating-point classes} +-\entry{classes, floating-point}{459}{classes, floating-point} +-\entry{exception}{461}{exception} +-\entry{signal}{461}{signal} +-\entry{zero divide}{461}{zero divide} +-\entry{division by zero}{461}{division by zero} +-\entry{inexact exception}{461}{inexact exception} +-\entry{invalid exception}{461}{invalid exception} +-\entry{overflow exception}{461}{overflow exception} +-\entry{underflow exception}{461}{underflow exception} +-\entry{infinity}{463}{infinity} +-\entry{not a number}{463}{not a number} +-\entry{NaN}{463}{NaN} +-\entry{errors, mathematical}{465}{errors, mathematical} +-\entry{domain error}{465}{domain error} +-\entry{range error}{465}{range error} +-\entry{absolute value functions}{468}{absolute value functions} +-\entry{normalization functions (floating-point)}{469}{normalization functions (floating-point)} +-\entry{converting floats to integers}{471}{converting floats to integers} +-\entry{FP arithmetic}{473}{FP arithmetic} +-\entry{NaN}{474}{NaN} +-\entry{unordered comparison}{474}{unordered comparison} +-\entry{minimum}{475}{minimum} +-\entry{maximum}{475}{maximum} +-\entry{positive difference}{475}{positive difference} +-\entry{multiply-add}{475}{multiply-add} +-\entry{butterfly}{476}{butterfly} +-\entry{complex numbers}{476}{complex numbers} +-\entry{project complex numbers}{477}{project complex numbers} +-\entry{conjugate complex numbers}{477}{conjugate complex numbers} +-\entry{decompose complex numbers}{477}{decompose complex numbers} +-\entry{integer division functions}{478}{integer division functions} +-\entry{parsing numbers (in formatted input)}{479}{parsing numbers (in formatted input)} +-\entry{converting strings to numbers}{479}{converting strings to numbers} +-\entry{number syntax, parsing}{479}{number syntax, parsing} +-\entry{syntax, for reading numbers}{479}{syntax, for reading numbers} +-\entry{parsing numbers and locales}{481}{parsing numbers and locales} +-\entry{locales, parsing numbers and}{481}{locales, parsing numbers and} +-\entry{gcvt{\_}r}{485}{gcvt_r} +-\entry{CPU time}{487}{CPU time} +-\entry{processor time}{487}{processor time} +-\entry{clock ticks}{487}{clock ticks} +-\entry{ticks, clock}{487}{ticks, clock} +-\entry{time, elapsed CPU}{487}{time, elapsed CPU} +-\entry{Gregorian calendar}{489}{Gregorian calendar} +-\entry{time, calendar}{489}{time, calendar} +-\entry{date and time}{489}{date and time} +-\entry{calendar time}{489}{calendar time} +-\entry{high-resolution time}{489}{high-resolution time} +-\entry{local time}{489}{local time} +-\entry{broken-down time}{489}{broken-down time} +-\entry{epoch}{489}{epoch} +-\entry{broken-down time}{492}{broken-down time} +-\entry{calendar time and broken-down time}{492}{calendar time and broken-down time} +-\entry{leap second}{492}{leap second} +-\entry{Daylight Saving Time}{493}{Daylight Saving Time} +-\entry{summer time}{493}{summer time} +-\entry{time zone}{507}{time zone} +-\entry{time zone database}{509}{time zone database} +-\entry{time, high precision}{511}{time, high precision} +-\entry{setting an alarm}{513}{setting an alarm} +-\entry{interval timer, setting}{513}{interval timer, setting} +-\entry{alarms, setting}{513}{alarms, setting} +-\entry{timers, setting}{513}{timers, setting} +-\entry{real-time timer}{513}{real-time timer} +-\entry{timer, real-time}{513}{timer, real-time} +-\entry{virtual timer}{513}{virtual timer} +-\entry{timer, virtual}{513}{timer, virtual} +-\entry{profiling timer}{513}{profiling timer} +-\entry{timer, profiling}{513}{timer, profiling} +-\entry{resource limits}{518}{resource limits} +-\entry{limits on resource usage}{518}{limits on resource usage} +-\entry{usage limits}{518}{usage limits} +-\entry{soft limit}{519}{soft limit} +-\entry{hard limit}{520}{hard limit} +-\entry{process priority}{521}{process priority} +-\entry{priority of a process}{521}{priority of a process} +-\entry{non-local exits}{523}{non-local exits} +-\entry{long jumps}{523}{long jumps} +-\entry{signal}{527}{signal} +-\entry{generation of signals}{528}{generation of signals} +-\entry{delivery of signals}{528}{delivery of signals} +-\entry{pending signals}{528}{pending signals} +-\entry{blocked signals}{528}{blocked signals} +-\entry{specified action (for a signal)}{528}{specified action (for a signal)} +-\entry{default action (for a signal)}{528}{default action (for a signal)} +-\entry{signal action}{528}{signal action} +-\entry{catching signals}{528}{catching signals} +-\entry{signal names}{529}{signal names} +-\entry{names of signals}{529}{names of signals} +-\entry{signal number}{529}{signal number} +-\entry{program error signals}{529}{program error signals} +-\entry{exception}{530}{exception} +-\entry{floating-point exception}{530}{floating-point exception} +-\entry{illegal instruction}{531}{illegal instruction} +-\entry{segmentation violation}{531}{segmentation violation} +-\entry{bus error}{531}{bus error} +-\entry{abort signal}{532}{abort signal} +-\entry{program termination signals}{532}{program termination signals} +-\entry{termination signal}{532}{termination signal} +-\entry{interrupt signal}{532}{interrupt signal} +-\entry{quit signal}{533}{quit signal} +-\entry{quit signal}{533}{quit signal} +-\entry{kill signal}{533}{kill signal} +-\entry{hangup signal}{533}{hangup signal} +-\entry{alarm signal}{534}{alarm signal} +-\entry{virtual time alarm signal}{534}{virtual time alarm signal} +-\entry{profiling alarm signal}{534}{profiling alarm signal} +-\entry{input available signal}{534}{input available signal} +-\entry{output possible signal}{534}{output possible signal} +-\entry{urgent data signal}{534}{urgent data signal} +-\entry{job control signals}{534}{job control signals} +-\entry{child process signal}{534}{child process signal} +-\entry{continue signal}{535}{continue signal} +-\entry{stop signal}{535}{stop signal} +-\entry{interactive stop signal}{535}{interactive stop signal} +-\entry{terminal input signal}{535}{terminal input signal} +-\entry{terminal output signal}{536}{terminal output signal} +-\entry{pipe signal}{536}{pipe signal} +-\entry{broken pipe signal}{536}{broken pipe signal} +-\entry{lost resource signal}{536}{lost resource signal} +-\entry{user signals}{537}{user signals} +-\entry{signal messages}{537}{signal messages} +-\entry{signal actions}{538}{signal actions} +-\entry{establishing a handler}{538}{establishing a handler} +-\entry{signal function}{538}{\code {signal} function} +-\entry{default action for a signal}{539}{default action for a signal} +-\entry{ignore action for a signal}{539}{ignore action for a signal} +-\entry{sigaction function}{540}{\code {sigaction} function} +-\entry{signal flags}{543}{signal flags} +-\entry{flags for sigaction}{543}{flags for \code {sigaction}} +-\entry{sigaction flags}{543}{\code {sigaction} flags} +-\entry{initial signal actions}{544}{initial signal actions} +-\entry{signal handler function}{544}{signal handler function} +-\entry{non-local exit, from signal handler}{547}{non-local exit, from signal handler} +-\entry{race conditions, relating to signals}{548}{race conditions, relating to signals} +-\entry{handling multiple signals}{549}{handling multiple signals} +-\entry{successive signals}{549}{successive signals} +-\entry{merging of signals}{549}{merging of signals} +-\entry{restrictions on signal handler functions}{551}{restrictions on signal handler functions} +-\entry{volatile declarations}{552}{\code {volatile} declarations} +-\entry{reentrant functions}{552}{reentrant functions} +-\entry{EINTR, and restarting interrupted primitives}{556}{EINTR, and restarting interrupted primitives} +-\entry{restarting interrupted primitives}{556}{restarting interrupted primitives} +-\entry{interrupting primitives}{556}{interrupting primitives} +-\entry{primitives, interrupting}{556}{primitives, interrupting} +-\entry{sending signals}{556}{sending signals} +-\entry{raising signals}{556}{raising signals} +-\entry{signals, generating}{556}{signals, generating} +-\entry{killing a process}{557}{killing a process} +-\entry{interprocess communication, with signals}{559}{interprocess communication, with signals} +-\entry{blocking signals}{560}{blocking signals} +-\entry{signal set}{561}{signal set} +-\entry{signal mask}{562}{signal mask} +-\entry{process signal mask}{562}{process signal mask} +-\entry{blocking signals, in a handler}{564}{blocking signals, in a handler} +-\entry{pending signals, checking for}{565}{pending signals, checking for} +-\entry{blocked signals, checking for}{565}{blocked signals, checking for} +-\entry{checking for pending signals}{565}{checking for pending signals} +-\entry{timing error in signal handling}{567}{timing error in signal handling} +-\entry{waiting for a signal}{567}{waiting for a signal} +-\entry{pause function}{567}{\code {pause} function} +-\entry{process}{575}{process} +-\entry{program arguments}{575}{program arguments} +-\entry{command line arguments}{575}{command line arguments} +-\entry{arguments, to program}{575}{arguments, to program} +-\entry{program startup}{575}{program startup} +-\entry{startup of program}{575}{startup of program} +-\entry{invocation of program}{575}{invocation of program} +-\entry{main function}{575}{\code {main} function} +-\entry{argc (program argument count)}{575}{argc (program argument count)} +-\entry{argv (program argument vector)}{575}{argv (program argument vector)} +-\entry{program argument syntax}{575}{program argument syntax} +-\entry{syntax, for program arguments}{575}{syntax, for program arguments} +-\entry{command argument syntax}{575}{command argument syntax} +-\entry{long-named options}{576}{long-named options} +-\entry{program arguments, parsing}{576}{program arguments, parsing} +-\entry{command arguments, parsing}{576}{command arguments, parsing} +-\entry{parsing program arguments}{576}{parsing program arguments} +-\entry{argp (program argument parser)}{584}{argp (program argument parser)} +-\entry{argument parsing with argp}{584}{argument parsing with argp} +-\entry{option parsing with argp}{584}{option parsing with argp} +-\entry{argp parser functions}{588}{argp parser functions} +-\entry{usage messages, in argp}{591}{usage messages, in argp} +-\entry{syntax error messages, in argp}{591}{syntax error messages, in argp} +-\entry{error messages, in argp}{591}{error messages, in argp} +-\entry{ARGP{\_}HELP{\_}FMT environment variable}{606}{ARGP_HELP_FMT environment variable} +-\entry{environment variable}{609}{environment variable} +-\entry{environment}{610}{environment} +-\entry{environment access}{610}{environment access} +-\entry{environment representation}{610}{environment representation} +-\entry{standard environment variables}{611}{standard environment variables} +-\entry{HOME environment variable}{612}{\code {HOME} environment variable} +-\entry{home directory}{612}{home directory} +-\entry{LOGNAME environment variable}{612}{\code {LOGNAME} environment variable} +-\entry{PATH environment variable}{612}{\code {PATH} environment variable} +-\entry{TERM environment variable}{612}{\code {TERM} environment variable} +-\entry{TZ environment variable}{612}{\code {TZ} environment variable} +-\entry{LANG environment variable}{612}{\code {LANG} environment variable} +-\entry{LC{\_}ALL environment variable}{613}{\code {LC_ALL} environment variable} +-\entry{LC{\_}COLLATE environment variable}{613}{\code {LC_COLLATE} environment variable} +-\entry{LC{\_}CTYPE environment variable}{613}{\code {LC_CTYPE} environment variable} +-\entry{LC{\_}MESSAGES environment variable}{613}{\code {LC_MESSAGES} environment variable} +-\entry{LC{\_}MONETARY environment variable}{613}{\code {LC_MONETARY} environment variable} +-\entry{LC{\_}NUMERIC environment variable}{613}{\code {LC_NUMERIC} environment variable} +-\entry{LC{\_}TIME environment variable}{613}{\code {LC_TIME} environment variable} +-\entry{NLSPATH environment variable}{613}{\code {NLSPATH} environment variable} +-\entry{{\_}POSIX{\_}OPTION{\_}ORDER environment variable.}{613}{\code {_POSIX_OPTION_ORDER} environment variable.} +-\entry{program termination}{613}{program termination} +-\entry{process termination}{613}{process termination} +-\entry{exit status value}{613}{exit status value} +-\entry{exit status}{614}{exit status} +-\entry{aborting a program}{616}{aborting a program} +-\entry{process}{619}{process} +-\entry{child process}{619}{child process} +-\entry{parent process}{619}{parent process} +-\entry{running a command}{619}{running a command} +-\entry{process ID}{620}{process ID} +-\entry{process lifetime}{620}{process lifetime} +-\entry{creating a process}{620}{creating a process} +-\entry{forking a process}{620}{forking a process} +-\entry{child process}{620}{child process} +-\entry{parent process}{620}{parent process} +-\entry{process image}{620}{process image} +-\entry{executing a file}{622}{executing a file} +-\entry{exec functions}{622}{\code {exec} functions} +-\entry{process completion}{624}{process completion} +-\entry{waiting for completion of child process}{624}{waiting for completion of child process} +-\entry{testing exit status of child process}{624}{testing exit status of child process} +-\entry{process groups}{631}{process groups} +-\entry{job control}{631}{job control} +-\entry{job}{631}{job} +-\entry{session}{631}{session} +-\entry{shell}{631}{shell} +-\entry{session}{631}{session} +-\entry{session leader}{631}{session leader} +-\entry{controlling terminal}{631}{controlling terminal} +-\entry{foreground job}{631}{foreground job} +-\entry{background job}{631}{background job} +-\entry{stopped job}{632}{stopped job} +-\entry{job control is optional}{632}{job control is optional} +-\entry{controlling process}{632}{controlling process} +-\entry{controlling terminal, access to}{632}{controlling terminal, access to} +-\entry{SIGTTIN, from background job}{632}{\code {SIGTTIN}, from background job} +-\entry{SIGTTOU, from background job}{633}{\code {SIGTTOU}, from background job} +-\entry{orphaned process group}{633}{orphaned process group} +-\entry{job control, enabling}{635}{job control, enabling} +-\entry{subshell}{635}{subshell} +-\entry{job control, enabling}{635}{job control, enabling} +-\entry{launching jobs}{637}{launching jobs} +-\entry{process group leader}{637}{process group leader} +-\entry{process group ID}{637}{process group ID} +-\entry{race conditions, relating to job control}{637}{race conditions, relating to job control} +-\entry{foreground job, launching}{640}{foreground job, launching} +-\entry{background job, launching}{641}{background job, launching} +-\entry{stopped jobs, detecting}{641}{stopped jobs, detecting} +-\entry{terminated jobs, detecting}{641}{terminated jobs, detecting} +-\entry{SIGCHLD, handling of}{642}{\code {SIGCHLD}, handling of} +-\entry{stopped jobs, continuing}{644}{stopped jobs, continuing} +-\entry{process group functions}{646}{process group functions} +-\entry{job control functions}{646}{job control functions} +-\entry{controlling terminal, determining}{646}{controlling terminal, determining} +-\entry{BSD compatibility library}{647}{BSD compatibility library} +-\entry{Name Service Switch}{651}{Name Service Switch} +-\entry{NSS}{651}{NSS} +-\entry{databases}{651}{databases} +-\entry{ethers}{651}{ethers} +-\entry{group}{651}{group} +-\entry{hosts}{651}{hosts} +-\entry{netgroup}{651}{netgroup} +-\entry{networks}{651}{networks} +-\entry{protocols}{651}{protocols} +-\entry{passwd}{651}{passwd} +-\entry{rpc}{651}{rpc} +-\entry{services}{651}{services} +-\entry{shadow}{651}{shadow} +-\entry{/etc/nsswitch.conf}{652}{\file {/etc/nsswitch.conf}} +-\entry{nsswitch.conf}{652}{\file {nsswitch.conf}} +-\entry{DNS server unavailable}{653}{DNS server unavailable} +-\entry{nisplus, and completeness}{653}{nisplus, and completeness} +-\entry{nisplus, and booting}{653}{nisplus, and booting} +-\entry{bootstrapping, and services}{653}{bootstrapping, and services} +-\entry{default value, and NSS}{654}{default value, and NSS} +-\entry{optimizing NSS}{654}{optimizing NSS} +-\entry{reentrant NSS functions}{655}{reentrant NSS functions} +-\entry{login name}{661}{login name} +-\entry{user name}{661}{user name} +-\entry{user ID}{661}{user ID} +-\entry{group name}{661}{group name} +-\entry{group ID}{661}{group ID} +-\entry{persona}{661}{persona} +-\entry{effective user ID}{661}{effective user ID} +-\entry{effective group ID}{661}{effective group ID} +-\entry{supplementary group IDs}{661}{supplementary group IDs} +-\entry{real user ID}{661}{real user ID} +-\entry{real group ID}{661}{real group ID} +-\entry{setuid programs}{662}{\code {setuid} programs} +-\entry{saved set-user-ID}{662}{saved set-user-ID} +-\entry{saved set-group-ID}{662}{saved set-group-ID} +-\entry{{\_}POSIX{\_}SAVED{\_}IDS}{662}{\code {_POSIX_SAVED_IDS}} +-\entry{login name, determining}{670}{login name, determining} +-\entry{user ID, determining}{670}{user ID, determining} +-\entry{user accounting database}{671}{user accounting database} +-\entry{user database}{678}{user database} +-\entry{password database}{678}{password database} +-\entry{converting user ID to user name}{679}{converting user ID to user name} +-\entry{converting user name to user ID}{679}{converting user name to user ID} +-\entry{scanning the user list}{680}{scanning the user list} +-\entry{group database}{681}{group database} +-\entry{converting group name to group ID}{682}{converting group name to group ID} +-\entry{converting group ID to group name}{682}{converting group ID to group name} +-\entry{scanning the group list}{683}{scanning the group list} +-\entry{Netgroup}{685}{Netgroup} +-\entry{POSIX capacity limits}{697}{POSIX capacity limits} +-\entry{limits, POSIX}{697}{limits, POSIX} +-\entry{capacity limits, POSIX}{697}{capacity limits, POSIX} +-\entry{limits, program argument size}{697}{limits, program argument size} +-\entry{limits, number of processes}{697}{limits, number of processes} +-\entry{limits, number of open files}{697}{limits, number of open files} +-\entry{limits, time zone name length}{697}{limits, time zone name length} +-\entry{limits, number of supplementary group IDs}{698}{limits, number of supplementary group IDs} +-\entry{POSIX optional features}{698}{POSIX optional features} +-\entry{optional POSIX features}{698}{optional POSIX features} +-\entry{limits, link count of files}{709}{limits, link count of files} +-\entry{limits, terminal input queue}{709}{limits, terminal input queue} +-\entry{limits, file name length}{709}{limits, file name length} +-\entry{limits, pipe buffer size}{710}{limits, pipe buffer size} +-\entry{consistency checking}{743}{consistency checking} +-\entry{impossible events}{743}{impossible events} +-\entry{assertions}{743}{assertions} +-\entry{variable number of arguments}{744}{variable number of arguments} +-\entry{variadic functions}{744}{variadic functions} +-\entry{optional arguments}{744}{optional arguments} +-\entry{function prototypes (variadic)}{745}{function prototypes (variadic)} +-\entry{prototypes for variadic functions}{745}{prototypes for variadic functions} +-\entry{variadic function prototypes}{745}{variadic function prototypes} +-\entry{variadic function argument access}{746}{variadic function argument access} +-\entry{arguments (variadic functions)}{746}{arguments (variadic functions)} +-\entry{number of arguments passed}{747}{number of arguments passed} +-\entry{how many arguments}{747}{how many arguments} +-\entry{arguments, how many}{747}{arguments, how many} +-\entry{variadic functions, calling}{747}{variadic functions, calling} +-\entry{calling variadic functions}{747}{calling variadic functions} +-\entry{declaring variadic functions}{747}{declaring variadic functions} +-\entry{default argument promotions}{747}{default argument promotions} +-\entry{argument promotion}{747}{argument promotion} +-\entry{null pointer constant}{750}{null pointer constant} +-\entry{integer type width}{752}{integer type width} +-\entry{width of integer type}{752}{width of integer type} +-\entry{type measurements, integer}{752}{type measurements, integer} +-\entry{integer type range}{752}{integer type range} +-\entry{range of integer type}{752}{range of integer type} +-\entry{limits, integer types}{752}{limits, integer types} +-\entry{floating type measurements}{754}{floating type measurements} +-\entry{measurements of floating types}{754}{measurements of floating types} +-\entry{type measurements, floating}{754}{type measurements, floating} +-\entry{limits, floating types}{754}{limits, floating types} +-\entry{sign (of floating point number)}{754}{sign (of floating point number)} +-\entry{base (of floating point number)}{754}{base (of floating point number)} +-\entry{radix (of floating point number)}{754}{radix (of floating point number)} +-\entry{exponent (of floating point number)}{754}{exponent (of floating point number)} +-\entry{bias (of floating point number exponent)}{754}{bias (of floating point number exponent)} +-\entry{mantissa (of floating point number)}{754}{mantissa (of floating point number)} +-\entry{significand (of floating point number)}{754}{significand (of floating point number)} +-\entry{precision (of floating point number)}{754}{precision (of floating point number)} +-\entry{hidden bit (of floating point number mantissa)}{754}{hidden bit (of floating point number mantissa)} +-\entry{normalized floating point number}{755}{normalized floating point number} +-\entry{IEEE floating point representation}{758}{IEEE floating point representation} +-\entry{floating point, IEEE}{758}{floating point, IEEE} +-\entry{configuring}{857}{configuring} +-\entry{compiling}{857}{compiling} +-\entry{installing}{859}{installing} +-\entry{installation tools}{860}{installation tools} +-\entry{tools, for installing library}{860}{tools, for installing library} +-\entry{configurations, all supported}{861}{configurations, all supported} +-\entry{upgrading from libc5}{862}{upgrading from libc5} +-\entry{kernel header files}{862}{kernel header files} +-\entry{reporting bugs}{863}{reporting bugs} +-\entry{bugs, reporting}{863}{bugs, reporting} +diff -Naur ../glibc-2.1.3/manual/libc.cps glibc-2.1.3/manual/libc.cps +--- ../glibc-2.1.3/manual/libc.cps 2000-01-05 19:19:03.000000000 -0800 ++++ glibc-2.1.3/manual/libc.cps 1969-12-31 16:00:00.000000000 -0800 +@@ -1,935 +0,0 @@ +-\initial {/} +-\entry {\file {/etc/nsswitch.conf}}{652} +-\initial {{\_}} +-\entry {__va_copy}{77} +-\entry {\code {_POSIX_OPTION_ORDER} environment variable.}{613} +-\entry {\code {_POSIX_SAVED_IDS}}{662} +-\initial {4} +-\entry {4.\var {n} BSD Unix}{3} +-\initial {A} +-\entry {abort signal}{532} +-\entry {aborting a program}{616} +-\entry {absolute file name}{208} +-\entry {absolute value functions}{468} +-\entry {accepting connections}{390} +-\entry {access permission for a file}{346} +-\entry {access, testing for}{348} +-\entry {accessing directories}{320} +-\entry {address of socket}{365} +-\entry {alarm signal}{534} +-\entry {alarms, setting}{513} +-\entry {alignment (in obstacks)}{55} +-\entry {alignment (with \code {malloc})}{36} +-\entry {\code {alloca} disadvantages}{59} +-\entry {\code {alloca} function}{57} +-\entry {allocating pseudo-terminals}{434} +-\entry {allocation (obstacks)}{48} +-\entry {allocation debugging}{43} +-\entry {allocation hooks, for \code {malloc}}{39} +-\entry {allocation of memory with \code {malloc}}{32} +-\entry {allocation size of string}{71} +-\entry {allocation statistics}{41} +-\entry {alphabetic character}{61, 65} +-\entry {alphanumeric character}{62, 64} +-\entry {append-access files}{207} +-\entry {argc (program argument count)}{575} +-\entry {argp (program argument parser)}{584} +-\entry {argp parser functions}{588} +-\entry {ARGP_HELP_FMT environment variable}{606} +-\entry {argument parsing with argp}{584} +-\entry {argument promotion}{747} +-\entry {argument vectors, null-character separated}{93} +-\entry {arguments (variadic functions)}{746} +-\entry {arguments, how many}{747} +-\entry {arguments, to program}{575} +-\entry {argv (program argument vector)}{575} +-\entry {argz vectors (string vectors)}{93} +-\entry {arithmetic expansion}{199} +-\entry {array comparison functions}{80} +-\entry {array copy functions}{73} +-\entry {array search function}{177} +-\entry {array sort function}{178} +-\entry {ASCII character}{63} +-\entry {assertions}{743} +-\entry {attributes of a file}{336} +-\entry {automatic allocation}{31} +-\entry {automatic freeing}{57} +-\entry {automatic storage with variable size}{57} +-\initial {B} +-\entry {background job}{631} +-\entry {background job, launching}{641} +-\entry {base (of floating point number)}{754} +-\entry {baud rate}{423} +-\entry {Berkeley Unix}{3} +-\entry {Bessel functions}{449} +-\entry {bias (of floating point number exponent)}{754} +-\entry {big-endian}{382} +-\entry {binary I/O to a stream}{221} +-\entry {binary search function (for arrays)}{177} +-\entry {binary stream}{251} +-\entry {binding a socket address}{365} +-\entry {blank character}{62, 67} +-\entry {block I/O to a stream}{221} +-\entry {blocked signals}{528} +-\entry {blocked signals, checking for}{565} +-\entry {blocking signals}{560} +-\entry {blocking signals, in a handler}{564} +-\entry {bootstrapping, and services}{653} +-\entry {break condition, detecting}{417} +-\entry {break condition, generating}{430} +-\entry {breaking a string into tokens}{88} +-\entry {broken pipe signal}{536} +-\entry {broken-down time}{489, 492} +-\entry {BSD compatibility library}{647} +-\entry {BSD compatibility library.}{8} +-\entry {BSD Unix}{3} +-\entry {buffering of streams}{256} +-\entry {buffering, controlling}{257} +-\entry {bugs, reporting}{863} +-\entry {bus error}{531} +-\entry {butterfly}{476} +-\entry {byte order conversion, for socket}{382} +-\entry {byte stream}{363} +-\initial {C} +-\entry {calendar time}{489} +-\entry {calendar time and broken-down time}{492} +-\entry {calling variadic functions}{747} +-\entry {canonical input processing}{412} +-\entry {capacity limits, POSIX}{697} +-\entry {carrier detect}{419} +-\entry {case conversion of characters}{63} +-\entry {catching signals}{528} +-\entry {categories for locales}{142} +-\entry {change working directory}{319} +-\entry {changing the locale}{143} +-\entry {changing the size of a block (\code {malloc})}{34} +-\entry {changing the size of a block (obstacks)}{51} +-\entry {channels}{283} +-\entry {character case conversion}{63} +-\entry {character predicates}{61} +-\entry {character testing}{61} +-\entry {checking for pending signals}{565} +-\entry {child process}{619, 620} +-\entry {child process signal}{534} +-\entry {chunks}{55} +-\entry {classes, floating-point}{459} +-\entry {classification of characters}{61} +-\entry {cleaning up a stream}{283} +-\entry {clearing terminal input queue}{431} +-\entry {client}{388} +-\entry {clock ticks}{487} +-\entry {close-on-exec (file descriptor flag)}{308} +-\entry {closing a file descriptor}{271} +-\entry {closing a socket}{387} +-\entry {closing a stream}{214} +-\entry {collating strings}{83} +-\entry {combining locales}{142} +-\entry {command argument syntax}{575} +-\entry {command arguments, parsing}{576} +-\entry {command line arguments}{575} +-\entry {command substitution}{199} +-\entry {communication style (of a socket)}{363} +-\entry {comparing strings and arrays}{80} +-\entry {Comparison Function}{177} +-\entry {compiling}{857} +-\entry {complex exponentiation functions}{446} +-\entry {complex logarithm functions}{446} +-\entry {complex numbers}{476} +-\entry {complex trigonometric functions}{441} +-\entry {concatenating strings}{73} +-\entry {configurations, all supported}{861} +-\entry {configuring}{857} +-\entry {conjugate complex numbers}{477} +-\entry {connecting a socket}{388} +-\entry {connection}{388} +-\entry {consistency checking}{743} +-\entry {consistency checking, of heap}{37} +-\entry {constants}{439} +-\entry {continue signal}{535} +-\entry {control character}{62, 65} +-\entry {control operations on files}{305} +-\entry {controlling process}{632} +-\entry {controlling terminal}{631} +-\entry {controlling terminal, access to}{632} +-\entry {controlling terminal, determining}{646} +-\entry {controlling terminal, setting}{311} +-\entry {conversion specifications (\code {printf})}{222} +-\entry {conversion specifications (\code {scanf})}{243} +-\entry {converting byte order}{382} +-\entry {converting case of characters}{63} +-\entry {converting file descriptor to stream}{282} +-\entry {converting floats to integers}{471} +-\entry {converting group ID to group name}{682} +-\entry {converting group name to group ID}{682} +-\entry {converting host address to name}{377} +-\entry {converting host name to address}{377} +-\entry {converting network name to network number}{408} +-\entry {converting network number to network name}{408} +-\entry {converting port number to service name}{381} +-\entry {converting service name to port number}{381} +-\entry {converting string to collation order}{84} +-\entry {converting strings to numbers}{479} +-\entry {converting user ID to user name}{679} +-\entry {converting user name to user ID}{679} +-\entry {cookie, for custom stream}{262} +-\entry {copying strings and arrays}{73} +-\entry {CPU time}{487} +-\entry {create on open (file status flag)}{310} +-\entry {creating a directory}{335} +-\entry {creating a FIFO special file}{360} +-\entry {creating a pipe}{357} +-\entry {creating a pipe to a subprocess}{359} +-\entry {creating a process}{620} +-\entry {creating a socket}{386} +-\entry {creating a socket pair}{387} +-\entry {creating special files}{352} +-\entry {cube root function}{445} +-\entry {currency symbols}{147} +-\entry {current working directory}{319} +-\entry {custom streams}{262} +-\entry {customizing \code {printf}}{237} +-\initial {D} +-\entry {data loss on sockets}{363} +-\entry {databases}{651} +-\entry {datagram socket}{401} +-\entry {datagrams, transmitting}{401} +-\entry {date and time}{489} +-\entry {Daylight Saving Time}{493} +-\entry {decimal digit character}{62} +-\entry {decimal-point separator}{146} +-\entry {declaration (compared to definition)}{4} +-\entry {declaring variadic functions}{747} +-\entry {decompose complex numbers}{477} +-\entry {default action (for a signal)}{528} +-\entry {default action for a signal}{539} +-\entry {default argument promotions}{747} +-\entry {default value, and NSS}{654} +-\entry {defining new \code {printf} conversions}{237} +-\entry {definition (compared to declaration)}{4} +-\entry {delayed suspend character}{427} +-\entry {deleting a directory}{334} +-\entry {deleting a file}{333} +-\entry {delivery of signals}{528} +-\entry {descriptors and streams}{283} +-\entry {digit character}{62, 65} +-\entry {directories, accessing}{320} +-\entry {directories, creating}{335} +-\entry {directories, deleting}{334} +-\entry {directory}{207} +-\entry {directory entry}{207} +-\entry {directory hierarchy}{327} +-\entry {directory stream}{320} +-\entry {disadvantages of \code {alloca}}{59} +-\entry {DISCARD character}{428} +-\entry {division by zero}{461} +-\entry {DNS server unavailable}{653} +-\entry {domain (of socket)}{363} +-\entry {domain error}{465} +-\entry {dot notation, for Internet addresses}{373} +-\entry {DSUSP character}{427} +-\entry {duplicating file descriptors}{306} +-\entry {dynamic allocation}{31} +-\initial {E} +-\entry {EBCDIC}{99} +-\entry {echo of terminal input}{421} +-\entry {effective group ID}{661} +-\entry {effective user ID}{661} +-\entry {efficiency and \code {malloc}}{36} +-\entry {efficiency and obstacks}{52} +-\entry {efficiency of chunks}{55} +-\entry {EINTR, and restarting interrupted primitives}{556} +-\entry {end of file, on a stream}{250} +-\entry {end-of-file, on a file descriptor}{275} +-\entry {environment}{610} +-\entry {environment access}{610} +-\entry {environment representation}{610} +-\entry {environment variable}{609} +-\entry {environment vectors, null-character separated}{93} +-\entry {envz vectors (environment vectors)}{93} +-\entry {EOF character}{425} +-\entry {EOL character}{425} +-\entry {EOL2 character}{425} +-\entry {epoch}{489} +-\entry {ERASE character}{426} +-\entry {error codes}{15} +-\entry {error messages, in argp}{591} +-\entry {error reporting}{15} +-\entry {errors, mathematical}{465} +-\entry {establishing a handler}{538} +-\entry {ethers}{651} +-\entry {EUC}{99} +-\entry {EUC-JP}{127} +-\entry {exception}{461, 530} +-\entry {exclusive lock}{314} +-\entry {\code {exec} functions}{622} +-\entry {executing a file}{622} +-\entry {exit status}{614} +-\entry {exit status value}{613} +-\entry {expansion of shell words}{198} +-\entry {exponent (of floating point number)}{754} +-\entry {exponentiation functions}{443} +-\entry {extending \code {printf}}{237} +-\entry {extracting file descriptor from stream}{282} +-\initial {F} +-\entry {\code {fcntl} function}{305} +-\entry {feature test macros}{7} +-\entry {field splitting}{199} +-\entry {FIFO special file}{357} +-\entry {file access permission}{346} +-\entry {file access time}{349} +-\entry {file attribute modification time}{349} +-\entry {file attributes}{336} +-\entry {file creation mask}{346} +-\entry {file descriptor flags}{307} +-\entry {file descriptor sets, for \code {select}}{289} +-\entry {file descriptors, standard}{283} +-\entry {file locks}{314} +-\entry {file modification time}{349} +-\entry {file name}{207} +-\entry {file name component}{207} +-\entry {file name errors}{208} +-\entry {file name resolution}{208} +-\entry {file name translation flags}{310} +-\entry {file names, multiple}{331} +-\entry {file owner}{343} +-\entry {file permission bits}{344} +-\entry {file pointer}{211} +-\entry {file position}{206} +-\entry {file positioning on a file descriptor}{279} +-\entry {file positioning on a stream}{252} +-\entry {file status flags}{309} +-\entry {filtering i/o through subprocess}{359} +-\entry {flag character (\code {printf})}{223} +-\entry {flag character (\code {scanf})}{244} +-\entry {flags for \code {sigaction}}{543} +-\entry {flags, file name translation}{310} +-\entry {flags, open-time action}{310} +-\entry {floating point}{459} +-\entry {floating point, IEEE}{758} +-\entry {floating type measurements}{754} +-\entry {floating-point classes}{459} +-\entry {floating-point exception}{530} +-\entry {flow control, terminal}{432} +-\entry {flushing a stream}{257} +-\entry {flushing terminal output queue}{431} +-\entry {foreground job}{631} +-\entry {foreground job, launching}{640} +-\entry {forking a process}{620} +-\entry {format string, for \code {printf}}{221} +-\entry {format string, for \code {scanf}}{242} +-\entry {formatted input from a stream}{242} +-\entry {formatted messages}{264} +-\entry {formatted output to a stream}{221} +-\entry {FP arithmetic}{473} +-\entry {freeing (obstacks)}{50} +-\entry {freeing memory allocated with \code {malloc}}{34} +-\entry {fully buffered stream}{257} +-\entry {function prototypes (variadic)}{745} +-\initial {G} +-\entry {gamma function}{449} +-\entry {gcvt_r}{485} +-\entry {gencat}{164} +-\entry {generation of signals}{528} +-\entry {generic i/o control operations}{318} +-\entry {globbing}{188} +-\entry {graphic character}{62, 65} +-\entry {Gregorian calendar}{489} +-\entry {group}{651} +-\entry {group database}{681} +-\entry {group ID}{661} +-\entry {group name}{661} +-\entry {group owner of a file}{343} +-\entry {grouping of digits}{146} +-\entry {growing objects (in obstacks)}{51} +-\initial {H} +-\entry {handling multiple signals}{549} +-\entry {hangup signal}{533} +-\entry {hard limit}{520} +-\entry {hard link}{331} +-\entry {header files}{4} +-\entry {heap consistency checking}{37} +-\entry {heap, dynamic allocation from}{32} +-\entry {heap, freeing memory from}{34} +-\entry {hexadecimal digit character}{62, 67} +-\entry {hidden bit (of floating point number mantissa)}{754} +-\entry {hierarchy, directory}{327} +-\entry {high-priority data}{398} +-\entry {high-resolution time}{489} +-\entry {holes in files}{280} +-\entry {home directory}{612} +-\entry {\code {HOME} environment variable}{612} +-\entry {hook functions (of custom streams)}{263} +-\entry {host address, Internet}{373} +-\entry {hosts}{651} +-\entry {hosts database}{377} +-\entry {how many arguments}{747} +-\entry {hyperbolic functions}{447} +-\initial {I} +-\entry {identifying terminals}{411} +-\entry {IEEE 754}{459} +-\entry {IEEE floating point}{459} +-\entry {IEEE floating point representation}{758} +-\entry {IEEE Std 1003.1}{2} +-\entry {IEEE Std 1003.2}{2} +-\entry {ignore action for a signal}{539} +-\entry {illegal instruction}{531} +-\entry {impossible events}{743} +-\entry {independent channels}{284} +-\entry {inexact exception}{461} +-\entry {infinity}{463} +-\entry {initial signal actions}{544} +-\entry {inode number}{339} +-\entry {input available signal}{534} +-\entry {input conversions, for \code {scanf}}{244} +-\entry {input from multiple files}{289} +-\entry {installation tools}{860} +-\entry {installing}{859} +-\entry {integer division functions}{478} +-\entry {integer type range}{752} +-\entry {integer type width}{752} +-\entry {interactive signals, from terminal}{422} +-\entry {interactive stop signal}{535} +-\entry {internal representation}{97} +-\entry {internationalization}{141} +-\entry {Internet host address}{373} +-\entry {Internet namespace, for sockets}{371} +-\entry {interprocess communication, with FIFO}{360} +-\entry {interprocess communication, with pipes}{357} +-\entry {interprocess communication, with signals}{559} +-\entry {interprocess communication, with sockets}{363} +-\entry {interrupt character}{427} +-\entry {interrupt signal}{532} +-\entry {interrupt-driven input}{317} +-\entry {interrupting primitives}{556} +-\entry {interval timer, setting}{513} +-\entry {INTR character}{427} +-\entry {invalid exception}{461} +-\entry {inverse complex hyperbolic functions}{448} +-\entry {inverse complex trigonometric functions}{442} +-\entry {inverse hyperbolic functions}{448} +-\entry {inverse trigonometric functions}{442} +-\entry {invocation of program}{575} +-\entry {IOCTLs}{318} +-\entry {ISO 10646}{97} +-\entry {ISO 2022}{99} +-\entry {ISO 6937}{100} +-\entry {ISO C}{2} +-\entry {ISO-2022-JP}{127} +-\entry {ISO/IEC 9945-1}{2} +-\entry {ISO/IEC 9945-2}{2} +-\initial {J} +-\entry {job}{631} +-\entry {job control}{631} +-\entry {job control functions}{646} +-\entry {job control is optional}{632} +-\entry {job control signals}{534} +-\entry {job control, enabling}{635} +-\initial {K} +-\entry {Kermit the frog}{181} +-\entry {kernel header files}{862} +-\entry {KILL character}{426} +-\entry {kill signal}{533} +-\entry {killing a process}{557} +-\initial {L} +-\entry {LANG environment variable}{161} +-\entry {\code {LANG} environment variable}{612} +-\entry {launching jobs}{637} +-\entry {LC_ALL environment variable}{161} +-\entry {\code {LC_ALL} environment variable}{613} +-\entry {\code {LC_COLLATE} environment variable}{613} +-\entry {\code {LC_CTYPE} environment variable}{613} +-\entry {LC_MESSAGES environment variable}{161} +-\entry {\code {LC_MESSAGES} environment variable}{613} +-\entry {\code {LC_MONETARY} environment variable}{613} +-\entry {\code {LC_NUMERIC} environment variable}{613} +-\entry {\code {LC_TIME} environment variable}{613} +-\entry {leap second}{492} +-\entry {length of string}{71} +-\entry {level, for socket options}{406} +-\entry {library}{1} +-\entry {limits on resource usage}{518} +-\entry {limits, file name length}{709} +-\entry {limits, floating types}{754} +-\entry {limits, integer types}{752} +-\entry {limits, link count of files}{709} +-\entry {limits, number of open files}{697} +-\entry {limits, number of processes}{697} +-\entry {limits, number of supplementary group IDs}{698} +-\entry {limits, pipe buffer size}{710} +-\entry {limits, POSIX}{697} +-\entry {limits, program argument size}{697} +-\entry {limits, terminal input queue}{709} +-\entry {limits, time zone name length}{697} +-\entry {line buffered stream}{257} +-\entry {line speed}{423} +-\entry {lines (in a text file)}{251} +-\entry {link}{207} +-\entry {link, hard}{331} +-\entry {link, soft}{332} +-\entry {link, symbolic}{332} +-\entry {linked channels}{283} +-\entry {listening (sockets)}{390} +-\entry {little-endian}{382} +-\entry {LNEXT character}{428} +-\entry {local namespace, for sockets}{369} +-\entry {local network address number}{373} +-\entry {local time}{489} +-\entry {locale categories}{142} +-\entry {locale, changing}{143} +-\entry {locales}{141} +-\entry {locales, parsing numbers and}{481} +-\entry {logarithm functions}{443} +-\entry {login name}{661} +-\entry {login name, determining}{670} +-\entry {\code {LOGNAME} environment variable}{612} +-\entry {long jumps}{523} +-\entry {long-named options}{576} +-\entry {longjmp}{58} +-\entry {loss of data on sockets}{363} +-\entry {lost resource signal}{536} +-\entry {lower-case character}{61, 66} +-\initial {M} +-\entry {macros}{50} +-\entry {\code {main} function}{575} +-\entry {malloc debugger}{43} +-\entry {\code {malloc} function}{32} +-\entry {mantissa (of floating point number)}{754} +-\entry {matching failure, in \code {scanf}}{243} +-\entry {mathematical constants}{439} +-\entry {maximum}{475} +-\entry {maximum field width (\code {scanf})}{244} +-\entry {measurements of floating types}{754} +-\entry {memory allocation}{31} +-\entry {merging of signals}{549} +-\entry {MIN termios slot}{429} +-\entry {minimum}{475} +-\entry {minimum field width (\code {printf})}{223} +-\entry {mixing descriptors and streams}{283} +-\entry {modem disconnect}{419} +-\entry {modem status lines}{419} +-\entry {monetary value formatting}{146} +-\entry {multibyte character}{99} +-\entry {multiple names for one file}{331} +-\entry {multiplexing input}{289} +-\entry {multiply-add}{475} +-\initial {N} +-\entry {name of running program}{28} +-\entry {name of socket}{365} +-\entry {Name Service Switch}{651} +-\entry {name space}{5} +-\entry {names of signals}{529} +-\entry {namespace (of socket)}{363} +-\entry {NaN}{463, 474} +-\entry {netgroup}{651} +-\entry {Netgroup}{685} +-\entry {network byte order}{382} +-\entry {network number}{373} +-\entry {network protocol}{363} +-\entry {networks}{651} +-\entry {networks database}{408} +-\entry {nisplus, and booting}{653} +-\entry {nisplus, and completeness}{653} +-\entry {NLSPATH environment variable}{160} +-\entry {\code {NLSPATH} environment variable}{613} +-\entry {non-blocking open}{310} +-\entry {non-local exit, from signal handler}{547} +-\entry {non-local exits}{523} +-\entry {noncanonical input processing}{412} +-\entry {normalization functions (floating-point)}{469} +-\entry {normalized floating point number}{755} +-\entry {not a number}{463} +-\entry {NSS}{651} +-\entry {\file {nsswitch.conf}}{652} +-\entry {null character}{71} +-\entry {null pointer constant}{750} +-\entry {number of arguments passed}{747} +-\entry {number syntax, parsing}{479} +-\entry {numeric value formatting}{146} +-\initial {O} +-\entry {obstack status}{54} +-\entry {obstacks}{47} +-\entry {open-time action flags}{310} +-\entry {opening a file}{205} +-\entry {opening a file descriptor}{271} +-\entry {opening a pipe}{357} +-\entry {opening a pseudo-terminal pair}{436} +-\entry {opening a socket}{386} +-\entry {opening a socket pair}{387} +-\entry {opening a stream}{212} +-\entry {Optimization}{457} +-\entry {optimizing NSS}{654} +-\entry {option parsing with argp}{584} +-\entry {optional arguments}{744} +-\entry {optional POSIX features}{698} +-\entry {orphaned process group}{633} +-\entry {out-of-band data}{398} +-\entry {output conversions, for \code {printf}}{224} +-\entry {output possible signal}{534} +-\entry {overflow exception}{461} +-\entry {owner of a file}{343} +-\initial {P} +-\entry {packet}{363} +-\entry {page boundary}{36} +-\entry {parent directory}{208} +-\entry {parent process}{619, 620} +-\entry {parity checking}{416} +-\entry {parsing a template string}{234} +-\entry {parsing numbers (in formatted input)}{479} +-\entry {parsing numbers and locales}{481} +-\entry {parsing program arguments}{576} +-\entry {parsing tokens from a string}{88} +-\entry {passwd}{651} +-\entry {password database}{678} +-\entry {\code {PATH} environment variable}{612} +-\entry {\code {pause} function}{567} +-\entry {peeking at input}{219} +-\entry {pending signals}{528} +-\entry {pending signals, checking for}{565} +-\entry {permission to access a file}{346} +-\entry {persona}{661} +-\entry {pi (trigonometric constant)}{440} +-\entry {pipe}{357} +-\entry {pipe signal}{536} +-\entry {pipe to a subprocess}{359} +-\entry {port number}{381} +-\entry {positioning a file descriptor}{279} +-\entry {positioning a stream}{252} +-\entry {positive difference}{475} +-\entry {POSIX}{2} +-\entry {POSIX capacity limits}{697} +-\entry {POSIX optional features}{698} +-\entry {POSIX.1}{2} +-\entry {POSIX.2}{2} +-\entry {power functions}{443} +-\entry {precision (of floating point number)}{754} +-\entry {precision (\code {printf})}{223} +-\entry {predicates on arrays}{80} +-\entry {predicates on characters}{61} +-\entry {predicates on strings}{80} +-\entry {primitives, interrupting}{556} +-\entry {printing character}{62, 66} +-\entry {priority of a process}{521} +-\entry {process}{575, 619} +-\entry {process completion}{624} +-\entry {process group functions}{646} +-\entry {process group ID}{637} +-\entry {process group leader}{637} +-\entry {process groups}{631} +-\entry {process ID}{620} +-\entry {process image}{620} +-\entry {process lifetime}{620} +-\entry {process priority}{521} +-\entry {process signal mask}{562} +-\entry {process termination}{613} +-\entry {processor time}{487} +-\entry {profiling alarm signal}{534} +-\entry {profiling timer}{513} +-\entry {program argument syntax}{575} +-\entry {program arguments}{575} +-\entry {program arguments, parsing}{576} +-\entry {program error signals}{529} +-\entry {program name}{28} +-\entry {program startup}{575} +-\entry {program termination}{613} +-\entry {program termination signals}{532} +-\entry {programming your own streams}{262} +-\entry {project complex numbers}{477} +-\entry {protocol (of socket)}{363} +-\entry {protocol family}{363} +-\entry {protocols}{651} +-\entry {protocols database}{383} +-\entry {prototypes for variadic functions}{745} +-\entry {pseudo-random numbers}{451} +-\entry {pseudo-terminals}{434} +-\entry {punctuation character}{62, 66} +-\entry {pushing input back}{219} +-\initial {Q} +-\entry {quick sort function (for arrays)}{178} +-\entry {QUIT character}{427} +-\entry {quit signal}{533} +-\entry {quote removal}{199} +-\initial {R} +-\entry {race conditions, relating to job control}{637} +-\entry {race conditions, relating to signals}{548} +-\entry {radix (of floating point number)}{754} +-\entry {raising signals}{556} +-\entry {random numbers}{451} +-\entry {random-access files}{206} +-\entry {range error}{465} +-\entry {range of integer type}{752} +-\entry {read lock}{314} +-\entry {reading from a directory}{320} +-\entry {reading from a file descriptor}{275} +-\entry {reading from a socket}{392} +-\entry {reading from a stream, by blocks}{221} +-\entry {reading from a stream, by characters}{216} +-\entry {reading from a stream, formatted}{242} +-\entry {real group ID}{661} +-\entry {real user ID}{661} +-\entry {real-time timer}{513} +-\entry {receiving datagrams}{401} +-\entry {record locking}{314} +-\entry {redirecting input and output}{306} +-\entry {reentrant functions}{552} +-\entry {reentrant NSS functions}{655} +-\entry {relative file name}{208} +-\entry {removal of quotes}{199} +-\entry {removing a file}{333} +-\entry {removing macros that shadow functions}{5} +-\entry {renaming a file}{334} +-\entry {reporting bugs}{863} +-\entry {reporting errors}{15} +-\entry {REPRINT character}{426} +-\entry {reserved names}{5} +-\entry {resource limits}{518} +-\entry {restarting interrupted primitives}{556} +-\entry {restrictions on signal handler functions}{551} +-\entry {root directory}{208} +-\entry {rpc}{651} +-\entry {running a command}{619} +-\initial {S} +-\entry {saved set-group-ID}{662} +-\entry {saved set-user-ID}{662} +-\entry {scanning the group list}{683} +-\entry {scanning the user list}{680} +-\entry {scatter-gather}{285} +-\entry {search function (for arrays)}{177} +-\entry {search functions (for strings)}{86} +-\entry {seed (for random numbers)}{451} +-\entry {seeking on a file descriptor}{279} +-\entry {seeking on a stream}{252} +-\entry {segmentation violation}{531} +-\entry {sending a datagram}{401} +-\entry {sending signals}{556} +-\entry {sequential-access files}{206} +-\entry {server}{388} +-\entry {services}{651} +-\entry {services database}{381} +-\entry {session}{631} +-\entry {session leader}{631} +-\entry {setting an alarm}{513} +-\entry {\code {setuid} programs}{662} +-\entry {setuid programs and file access}{348} +-\entry {severity class}{266, 267} +-\entry {shadow}{651} +-\entry {shadowing functions with macros}{5} +-\entry {shared lock}{314} +-\entry {shell}{631} +-\entry {shift state}{102} +-\entry {shrinking objects}{52} +-\entry {shutting down a socket}{387} +-\entry {\code {sigaction} flags}{543} +-\entry {\code {sigaction} function}{540} +-\entry {\code {SIGCHLD}, handling of}{642} +-\entry {sign (of floating point number)}{754} +-\entry {signal}{461, 527} +-\entry {signal action}{528} +-\entry {signal actions}{538} +-\entry {signal flags}{543} +-\entry {\code {signal} function}{538} +-\entry {signal handler function}{544} +-\entry {signal mask}{562} +-\entry {signal messages}{537} +-\entry {signal names}{529} +-\entry {signal number}{529} +-\entry {signal set}{561} +-\entry {signals, generating}{556} +-\entry {significand (of floating point number)}{754} +-\entry {\code {SIGTTIN}, from background job}{632} +-\entry {\code {SIGTTOU}, from background job}{633} +-\entry {size of string}{71} +-\entry {SJIS}{99} +-\entry {socket}{363} +-\entry {socket address (name) binding}{365} +-\entry {socket domain}{363} +-\entry {socket namespace}{363} +-\entry {socket option level}{406} +-\entry {socket options}{406} +-\entry {socket pair}{387} +-\entry {socket protocol}{363} +-\entry {socket shutdown}{387} +-\entry {socket, client actions}{388} +-\entry {socket, closing}{387} +-\entry {socket, connecting}{388} +-\entry {socket, creating}{386} +-\entry {socket, initiating a connection}{388} +-\entry {sockets, accepting connections}{390} +-\entry {sockets, listening}{390} +-\entry {sockets, server actions}{390} +-\entry {soft limit}{519} +-\entry {soft link}{332} +-\entry {sort function (for arrays)}{178} +-\entry {sparse files}{280} +-\entry {special files}{352} +-\entry {special functions}{449} +-\entry {specified action (for a signal)}{528} +-\entry {square root function}{445} +-\entry {stable sorting}{178} +-\entry {standard dot notation, for Internet addresses}{373} +-\entry {standard environment variables}{611} +-\entry {standard error file descriptor}{283} +-\entry {standard error stream}{212} +-\entry {standard file descriptors}{283} +-\entry {standard input file descriptor}{283} +-\entry {standard input stream}{211} +-\entry {standard output file descriptor}{283} +-\entry {standard output stream}{211} +-\entry {standard streams}{211} +-\entry {standards}{1} +-\entry {START character}{428} +-\entry {startup of program}{575} +-\entry {stateful}{102, 105, 110, 121, 124, 135} +-\entry {static allocation}{31} +-\entry {STATUS character}{429} +-\entry {status codes}{15} +-\entry {status of a file}{336} +-\entry {status of obstack}{54} +-\entry {sticky bit}{345} +-\entry {STOP character}{428} +-\entry {stop signal}{535} +-\entry {stopped job}{632} +-\entry {stopped jobs, continuing}{644} +-\entry {stopped jobs, detecting}{641} +-\entry {storage allocation}{31} +-\entry {stream (sockets)}{363} +-\entry {stream, for I/O to a string}{259} +-\entry {streams and descriptors}{283} +-\entry {streams, and file descriptors}{282} +-\entry {streams, standard}{211} +-\entry {string}{71} +-\entry {string allocation}{71} +-\entry {string collation functions}{83} +-\entry {string comparison functions}{80} +-\entry {string concatenation functions}{73} +-\entry {string copy functions}{73} +-\entry {string length}{71} +-\entry {string literal}{71} +-\entry {string search functions}{86} +-\entry {string stream}{259} +-\entry {string vectors, null-character separated}{93} +-\entry {string, representation of}{71} +-\entry {style of communication (of a socket)}{363} +-\entry {subshell}{635} +-\entry {substitution of variables and commands}{199} +-\entry {successive signals}{549} +-\entry {summer time}{493} +-\entry {SunOS}{3} +-\entry {supplementary group IDs}{661} +-\entry {SUSP character}{427} +-\entry {suspend character}{427} +-\entry {SVID}{3} +-\entry {symbolic link}{332} +-\entry {symbolic link, opening}{311} +-\entry {synchronizing}{292, 301} +-\entry {syntax error messages, in argp}{591} +-\entry {syntax, for program arguments}{575} +-\entry {syntax, for reading numbers}{479} +-\entry {System V Unix}{3} +-\initial {T} +-\entry {TCP (Internet protocol)}{383} +-\entry {template, for \code {printf}}{221} +-\entry {template, for \code {scanf}}{242} +-\entry {\code {TERM} environment variable}{612} +-\entry {terminal flow control}{432} +-\entry {terminal identification}{411} +-\entry {terminal input queue}{412} +-\entry {terminal input queue, clearing}{431} +-\entry {terminal input signal}{535} +-\entry {terminal line control functions}{430} +-\entry {terminal line speed}{423} +-\entry {terminal mode data types}{413} +-\entry {terminal mode functions}{414} +-\entry {terminal output queue}{412} +-\entry {terminal output queue, flushing}{431} +-\entry {terminal output signal}{536} +-\entry {terminated jobs, detecting}{641} +-\entry {termination signal}{532} +-\entry {testing access permission}{348} +-\entry {testing exit status of child process}{624} +-\entry {text stream}{251} +-\entry {ticks, clock}{487} +-\entry {tilde expansion}{199} +-\entry {TIME termios slot}{429} +-\entry {time zone}{507} +-\entry {time zone database}{509} +-\entry {time, calendar}{489} +-\entry {time, elapsed CPU}{487} +-\entry {time, high precision}{511} +-\entry {timer, profiling}{513} +-\entry {timer, real-time}{513} +-\entry {timer, virtual}{513} +-\entry {timers, setting}{513} +-\entry {timing error in signal handling}{567} +-\entry {TMPDIR environment variable}{355} +-\entry {tokenizing strings}{88} +-\entry {tools, for installing library}{860} +-\entry {transmitting datagrams}{401} +-\entry {tree, directory}{327} +-\entry {triangulation}{126} +-\entry {trigonometric functions}{440} +-\entry {type measurements, floating}{754} +-\entry {type measurements, integer}{752} +-\entry {type modifier character (\code {printf})}{224} +-\entry {type modifier character (\code {scanf})}{244} +-\entry {typeahead buffer}{412} +-\entry {\code {TZ} environment variable}{612} +-\initial {U} +-\entry {UCS2}{97} +-\entry {UCS4}{97} +-\entry {umask}{346} +-\entry {unbuffered stream}{256} +-\entry {unconstrained storage allocation}{32} +-\entry {undefining macros that shadow functions}{5} +-\entry {underflow exception}{461} +-\entry {Unicode}{97} +-\entry {Unix, Berkeley}{3} +-\entry {Unix, System V}{3} +-\entry {unlinking a file}{333} +-\entry {unordered comparison}{474} +-\entry {unreading characters}{219} +-\entry {upgrading from libc5}{862} +-\entry {upper-case character}{61, 67} +-\entry {urgent data signal}{534} +-\entry {urgent socket condition}{398} +-\entry {usage limits}{518} +-\entry {usage messages, in argp}{591} +-\entry {user accounting database}{671} +-\entry {user database}{678} +-\entry {user ID}{661} +-\entry {user ID, determining}{670} +-\entry {user name}{661} +-\entry {user signals}{537} +-\entry {usual file name errors}{208} +-\entry {UTF-7}{100} +-\entry {UTF-8}{100} +-\initial {V} +-\entry {va_copy}{77} +-\entry {variable number of arguments}{744} +-\entry {variable substitution}{199} +-\entry {variable-sized arrays}{59} +-\entry {variadic function argument access}{746} +-\entry {variadic function prototypes}{745} +-\entry {variadic functions}{744} +-\entry {variadic functions, calling}{747} +-\entry {virtual time alarm signal}{534} +-\entry {virtual timer}{513} +-\entry {\code {volatile} declarations}{552} +-\initial {W} +-\entry {waiting for a signal}{567} +-\entry {waiting for completion of child process}{624} +-\entry {waiting for input or output}{289} +-\entry {WERASE character}{426} +-\entry {whitespace character}{62, 66} +-\entry {wide character}{97} +-\entry {width of integer type}{752} +-\entry {wildcard expansion}{199} +-\entry {word expansion}{198} +-\entry {working directory}{319} +-\entry {write lock}{314} +-\entry {writing to a file descriptor}{277} +-\entry {writing to a socket}{392} +-\entry {writing to a stream, by blocks}{221} +-\entry {writing to a stream, by characters}{215} +-\entry {writing to a stream, formatted}{221} +-\initial {Z} +-\entry {zero divide}{461} +diff -Naur ../glibc-2.1.3/manual/libc.fn glibc-2.1.3/manual/libc.fn +--- ../glibc-2.1.3/manual/libc.fn 2000-01-05 19:19:29.000000000 -0800 ++++ glibc-2.1.3/manual/libc.fn 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1142 +0,0 @@ +-\entry{strerror}{27}{\code {strerror}} +-\entry{strerror{\_}r}{27}{\code {strerror_r}} +-\entry{perror}{27}{\code {perror}} +-\entry{malloc}{32}{\code {malloc}} +-\entry{free}{34}{\code {free}} +-\entry{cfree}{34}{\code {cfree}} +-\entry{realloc}{35}{\code {realloc}} +-\entry{calloc}{35}{\code {calloc}} +-\entry{memalign}{36}{\code {memalign}} +-\entry{valloc}{36}{\code {valloc}} +-\entry{mallopt}{37}{\code {mallopt}} +-\entry{mcheck}{37}{\code {mcheck}} +-\entry{mprobe}{38}{\code {mprobe}} +-\entry{mallinfo}{42}{\code {mallinfo}} +-\entry{mtrace}{43}{\code {mtrace}} +-\entry{muntrace}{43}{\code {muntrace}} +-\entry{obstack{\_}chunk{\_}alloc}{47}{\code {obstack_chunk_alloc}} +-\entry{obstack{\_}chunk{\_}free}{47}{\code {obstack_chunk_free}} +-\entry{obstack{\_}init}{48}{\code {obstack_init}} +-\entry{obstack{\_}alloc}{49}{\code {obstack_alloc}} +-\entry{obstack{\_}copy}{49}{\code {obstack_copy}} +-\entry{obstack{\_}copy0}{49}{\code {obstack_copy0}} +-\entry{obstack{\_}free}{50}{\code {obstack_free}} +-\entry{obstack{\_}blank}{51}{\code {obstack_blank}} +-\entry{obstack{\_}grow}{51}{\code {obstack_grow}} +-\entry{obstack{\_}grow0}{51}{\code {obstack_grow0}} +-\entry{obstack{\_}1grow}{51}{\code {obstack_1grow}} +-\entry{obstack{\_}ptr{\_}grow}{52}{\code {obstack_ptr_grow}} +-\entry{obstack{\_}int{\_}grow}{52}{\code {obstack_int_grow}} +-\entry{obstack{\_}finish}{52}{\code {obstack_finish}} +-\entry{obstack{\_}object{\_}size}{52}{\code {obstack_object_size}} +-\entry{obstack{\_}room}{53}{\code {obstack_room}} +-\entry{obstack{\_}1grow{\_}fast}{53}{\code {obstack_1grow_fast}} +-\entry{obstack{\_}ptr{\_}grow{\_}fast}{53}{\code {obstack_ptr_grow_fast}} +-\entry{obstack{\_}int{\_}grow{\_}fast}{53}{\code {obstack_int_grow_fast}} +-\entry{obstack{\_}blank{\_}fast}{53}{\code {obstack_blank_fast}} +-\entry{obstack{\_}base}{54}{\code {obstack_base}} +-\entry{obstack{\_}next{\_}free}{54}{\code {obstack_next_free}} +-\entry{obstack{\_}object{\_}size}{54}{\code {obstack_object_size}} +-\entry{obstack{\_}alignment{\_}mask}{55}{\code {obstack_alignment_mask}} +-\entry{obstack{\_}chunk{\_}size}{56}{\code {obstack_chunk_size}} +-\entry{alloca}{57}{\code {alloca}} +-\entry{islower}{61}{\code {islower}} +-\entry{isupper}{61}{\code {isupper}} +-\entry{isalpha}{61}{\code {isalpha}} +-\entry{isdigit}{62}{\code {isdigit}} +-\entry{isalnum}{62}{\code {isalnum}} +-\entry{isxdigit}{62}{\code {isxdigit}} +-\entry{ispunct}{62}{\code {ispunct}} +-\entry{isspace}{62}{\code {isspace}} +-\entry{isblank}{62}{\code {isblank}} +-\entry{isgraph}{62}{\code {isgraph}} +-\entry{isprint}{62}{\code {isprint}} +-\entry{iscntrl}{63}{\code {iscntrl}} +-\entry{isascii}{63}{\code {isascii}} +-\entry{tolower}{63}{\code {tolower}} +-\entry{toupper}{63}{\code {toupper}} +-\entry{toascii}{63}{\code {toascii}} +-\entry{{\_}tolower}{63}{\code {_tolower}} +-\entry{{\_}toupper}{63}{\code {_toupper}} +-\entry{wctype}{64}{\code {wctype}} +-\entry{iswctype}{64}{\code {iswctype}} +-\entry{iswalnum}{65}{\code {iswalnum}} +-\entry{iswalpha}{65}{\code {iswalpha}} +-\entry{iswcntrl}{65}{\code {iswcntrl}} +-\entry{iswdigit}{65}{\code {iswdigit}} +-\entry{iswgraph}{66}{\code {iswgraph}} +-\entry{iswlower}{66}{\code {iswlower}} +-\entry{iswprint}{66}{\code {iswprint}} +-\entry{iswpunct}{66}{\code {iswpunct}} +-\entry{iswspace}{66}{\code {iswspace}} +-\entry{iswupper}{67}{\code {iswupper}} +-\entry{iswxdigit}{67}{\code {iswxdigit}} +-\entry{iswblank}{67}{\code {iswblank}} +-\entry{wctrans}{68}{\code {wctrans}} +-\entry{towctrans}{69}{\code {towctrans}} +-\entry{towlower}{69}{\code {towlower}} +-\entry{towupper}{69}{\code {towupper}} +-\entry{strlen}{72}{\code {strlen}} +-\entry{strnlen}{73}{\code {strnlen}} +-\entry{memcpy}{74}{\code {memcpy}} +-\entry{mempcpy}{74}{\code {mempcpy}} +-\entry{memmove}{74}{\code {memmove}} +-\entry{memccpy}{74}{\code {memccpy}} +-\entry{memset}{74}{\code {memset}} +-\entry{strcpy}{74}{\code {strcpy}} +-\entry{strncpy}{75}{\code {strncpy}} +-\entry{strdup}{75}{\code {strdup}} +-\entry{strndup}{75}{\code {strndup}} +-\entry{stpcpy}{75}{\code {stpcpy}} +-\entry{stpncpy}{76}{\code {stpncpy}} +-\entry{strdupa}{76}{\code {strdupa}} +-\entry{strndupa}{77}{\code {strndupa}} +-\entry{strcat}{77}{\code {strcat}} +-\entry{strncat}{79}{\code {strncat}} +-\entry{bcopy}{80}{\code {bcopy}} +-\entry{bzero}{80}{\code {bzero}} +-\entry{memcmp}{81}{\code {memcmp}} +-\entry{strcmp}{81}{\code {strcmp}} +-\entry{strcasecmp}{81}{\code {strcasecmp}} +-\entry{strncasecmp}{82}{\code {strncasecmp}} +-\entry{strncmp}{82}{\code {strncmp}} +-\entry{strverscmp}{82}{\code {strverscmp}} +-\entry{bcmp}{83}{\code {bcmp}} +-\entry{strcoll}{84}{\code {strcoll}} +-\entry{strxfrm}{84}{\code {strxfrm}} +-\entry{memchr}{86}{\code {memchr}} +-\entry{strchr}{86}{\code {strchr}} +-\entry{index}{87}{\code {index}} +-\entry{strrchr}{87}{\code {strrchr}} +-\entry{rindex}{87}{\code {rindex}} +-\entry{strstr}{87}{\code {strstr}} +-\entry{memmem}{88}{\code {memmem}} +-\entry{strspn}{88}{\code {strspn}} +-\entry{strcspn}{88}{\code {strcspn}} +-\entry{strpbrk}{88}{\code {strpbrk}} +-\entry{strtok}{88}{\code {strtok}} +-\entry{strtok{\_}r}{90}{\code {strtok_r}} +-\entry{strsep}{90}{\code {strsep}} +-\entry{l64a}{91}{\code {l64a}} +-\entry{a64l}{92}{\code {a64l}} +-\entry{argz{\_}create}{93}{\code {argz_create}} +-\entry{argz{\_}create{\_}sep}{93}{\code {argz_create_sep}} +-\entry{argz{\_}count}{93}{\code {argz_count}} +-\entry{argz{\_}extract}{94}{\code {argz_extract}} +-\entry{argz{\_}stringify}{94}{\code {argz_stringify}} +-\entry{argz{\_}add}{94}{\code {argz_add}} +-\entry{argz{\_}add{\_}sep}{94}{\code {argz_add_sep}} +-\entry{argz{\_}append}{94}{\code {argz_append}} +-\entry{argz{\_}delete}{94}{\code {argz_delete}} +-\entry{argz{\_}insert}{94}{\code {argz_insert}} +-\entry{argz{\_}next}{95}{\code {argz_next}} +-\entry{argz{\_}replace}{95}{\code {argz_replace}} +-\entry{envz{\_}entry}{95}{\code {envz_entry}} +-\entry{envz{\_}get}{96}{\code {envz_get}} +-\entry{envz{\_}add}{96}{\code {envz_add}} +-\entry{envz{\_}merge}{96}{\code {envz_merge}} +-\entry{envz{\_}strip}{96}{\code {envz_strip}} +-\entry{mbsinit}{103}{\code {mbsinit}} +-\entry{btowc}{104}{\code {btowc}} +-\entry{wctob}{105}{\code {wctob}} +-\entry{mbrtowc}{105}{\code {mbrtowc}} +-\entry{mbrlen}{106}{\code {mbrlen}} +-\entry{wcrtomb}{107}{\code {wcrtomb}} +-\entry{mbsrtowcs}{110}{\code {mbsrtowcs}} +-\entry{wcsrtombs}{111}{\code {wcsrtombs}} +-\entry{mbsnrtowcs}{112}{\code {mbsnrtowcs}} +-\entry{wcsnrtombs}{112}{\code {wcsnrtombs}} +-\entry{mbtowc}{115}{\code {mbtowc}} +-\entry{wctomb}{115}{\code {wctomb}} +-\entry{mblen}{116}{\code {mblen}} +-\entry{mbstowcs}{116}{\code {mbstowcs}} +-\entry{wcstombs}{117}{\code {wcstombs}} +-\entry{iconv{\_}open}{119}{\code {iconv_open}} +-\entry{iconv{\_}close}{120}{\code {iconv_close}} +-\entry{iconv}{121}{\code {iconv}} +-\entry{setlocale}{143}{\code {setlocale}} +-\entry{localeconv}{146}{\code {localeconv}} +-\entry{nl{\_}langinfo}{150}{\code {nl_langinfo}} +-\entry{strfmon}{155}{\code {strfmon}} +-\entry{catopen}{159}{\code {catopen}} +-\entry{catgets}{162}{\code {catgets}} +-\entry{catclose}{162}{\code {catclose}} +-\entry{gettext}{169}{\code {gettext}} +-\entry{dgettext}{170}{\code {dgettext}} +-\entry{dcgettext}{170}{\code {dcgettext}} +-\entry{textdomain}{172}{\code {textdomain}} +-\entry{bindtextdomain}{172}{\code {bindtextdomain}} +-\entry{lfind}{177}{\code {lfind}} +-\entry{lsearch}{178}{\code {lsearch}} +-\entry{bsearch}{178}{\code {bsearch}} +-\entry{qsort}{178}{\code {qsort}} +-\entry{hcreate}{182}{\code {hcreate}} +-\entry{hdestroy}{182}{\code {hdestroy}} +-\entry{hsearch}{183}{\code {hsearch}} +-\entry{hcreate{\_}r}{183}{\code {hcreate_r}} +-\entry{hdestroy{\_}r}{183}{\code {hdestroy_r}} +-\entry{hsearch{\_}r}{184}{\code {hsearch_r}} +-\entry{tsearch}{184}{\code {tsearch}} +-\entry{tfind}{185}{\code {tfind}} +-\entry{tdelete}{185}{\code {tdelete}} +-\entry{tdestroy}{185}{\code {tdestroy}} +-\entry{twalk}{186}{\code {twalk}} +-\entry{fnmatch}{187}{\code {fnmatch}} +-\entry{glob}{189}{\code {glob}} +-\entry{globfree}{193}{\code {globfree}} +-\entry{regcomp}{194}{\code {regcomp}} +-\entry{regexec}{195}{\code {regexec}} +-\entry{regfree}{198}{\code {regfree}} +-\entry{regerror}{198}{\code {regerror}} +-\entry{wordexp}{200}{\code {wordexp}} +-\entry{wordfree}{200}{\code {wordfree}} +-\entry{fopen}{212}{\code {fopen}} +-\entry{fopen64}{213}{\code {fopen64}} +-\entry{freopen}{214}{\code {freopen}} +-\entry{freopen64}{214}{\code {freopen64}} +-\entry{fclose}{214}{\code {fclose}} +-\entry{fcloseall}{215}{\code {fcloseall}} +-\entry{fputc}{215}{\code {fputc}} +-\entry{putc}{215}{\code {putc}} +-\entry{putchar}{216}{\code {putchar}} +-\entry{fputs}{216}{\code {fputs}} +-\entry{puts}{216}{\code {puts}} +-\entry{putw}{216}{\code {putw}} +-\entry{fgetc}{216}{\code {fgetc}} +-\entry{getc}{217}{\code {getc}} +-\entry{getchar}{217}{\code {getchar}} +-\entry{getw}{217}{\code {getw}} +-\entry{getline}{218}{\code {getline}} +-\entry{getdelim}{218}{\code {getdelim}} +-\entry{fgets}{218}{\code {fgets}} +-\entry{gets}{219}{\code {gets}} +-\entry{ungetc}{220}{\code {ungetc}} +-\entry{fread}{221}{\code {fread}} +-\entry{fwrite}{221}{\code {fwrite}} +-\entry{printf}{230}{\code {printf}} +-\entry{fprintf}{230}{\code {fprintf}} +-\entry{sprintf}{230}{\code {sprintf}} +-\entry{snprintf}{230}{\code {snprintf}} +-\entry{asprintf}{231}{\code {asprintf}} +-\entry{obstack{\_}printf}{231}{\code {obstack_printf}} +-\entry{vprintf}{232}{\code {vprintf}} +-\entry{vfprintf}{233}{\code {vfprintf}} +-\entry{vsprintf}{233}{\code {vsprintf}} +-\entry{vsnprintf}{233}{\code {vsnprintf}} +-\entry{vasprintf}{233}{\code {vasprintf}} +-\entry{obstack{\_}vprintf}{233}{\code {obstack_vprintf}} +-\entry{parse{\_}printf{\_}format}{234}{\code {parse_printf_format}} +-\entry{register{\_}printf{\_}function}{237}{\code {register_printf_function}} +-\entry{printf{\_}size}{241}{\code {printf_size}} +-\entry{printf{\_}size{\_}info}{242}{\code {printf_size_info}} +-\entry{scanf}{249}{\code {scanf}} +-\entry{fscanf}{249}{\code {fscanf}} +-\entry{sscanf}{249}{\code {sscanf}} +-\entry{vscanf}{250}{\code {vscanf}} +-\entry{vfscanf}{250}{\code {vfscanf}} +-\entry{vsscanf}{250}{\code {vsscanf}} +-\entry{clearerr}{250}{\code {clearerr}} +-\entry{feof}{251}{\code {feof}} +-\entry{ferror}{251}{\code {ferror}} +-\entry{ftell}{252}{\code {ftell}} +-\entry{ftello}{252}{\code {ftello}} +-\entry{ftello64}{252}{\code {ftello64}} +-\entry{fseek}{253}{\code {fseek}} +-\entry{fseeko}{253}{\code {fseeko}} +-\entry{fseeko64}{253}{\code {fseeko64}} +-\entry{rewind}{254}{\code {rewind}} +-\entry{fgetpos}{255}{\code {fgetpos}} +-\entry{fgetpos64}{255}{\code {fgetpos64}} +-\entry{fsetpos}{256}{\code {fsetpos}} +-\entry{fsetpos64}{256}{\code {fsetpos64}} +-\entry{fflush}{257}{\code {fflush}} +-\entry{setvbuf}{258}{\code {setvbuf}} +-\entry{setbuf}{259}{\code {setbuf}} +-\entry{setbuffer}{259}{\code {setbuffer}} +-\entry{setlinebuf}{259}{\code {setlinebuf}} +-\entry{fmemopen}{259}{\code {fmemopen}} +-\entry{open{\_}memstream}{260}{\code {open_memstream}} +-\entry{open{\_}obstack{\_}stream}{261}{\code {open_obstack_stream}} +-\entry{fopencookie}{263}{\code {fopencookie}} +-\entry{fmtmsg}{265}{\code {fmtmsg}} +-\entry{addseverity}{267}{\code {addseverity}} +-\entry{open}{271}{\code {open}} +-\entry{open64}{272}{\code {open64}} +-\entry{creat}{272}{\code {creat}} +-\entry{creat64}{273}{\code {creat64}} +-\entry{close}{273}{\code {close}} +-\entry{truncate}{274}{\code {truncate}} +-\entry{truncate64}{274}{\code {truncate64}} +-\entry{ftruncate}{274}{\code {ftruncate}} +-\entry{ftruncate64}{275}{\code {ftruncate64}} +-\entry{read}{275}{\code {read}} +-\entry{pread}{276}{\code {pread}} +-\entry{pread64}{277}{\code {pread64}} +-\entry{write}{277}{\code {write}} +-\entry{pwrite}{279}{\code {pwrite}} +-\entry{pwrite64}{279}{\code {pwrite64}} +-\entry{lseek}{280}{\code {lseek}} +-\entry{lseek64}{281}{\code {lseek64}} +-\entry{fdopen}{282}{\code {fdopen}} +-\entry{fileno}{283}{\code {fileno}} +-\entry{fclean}{284}{\code {fclean}} +-\entry{readv}{285}{\code {readv}} +-\entry{writev}{285}{\code {writev}} +-\entry{mmap}{286}{\code {mmap}} +-\entry{munmap}{288}{\code {munmap}} +-\entry{msync}{288}{\code {msync}} +-\entry{mremap}{288}{\code {mremap}} +-\entry{FD{\_}ZERO}{290}{\code {FD_ZERO}} +-\entry{FD{\_}SET}{290}{\code {FD_SET}} +-\entry{FD{\_}CLR}{290}{\code {FD_CLR}} +-\entry{FD{\_}ISSET}{290}{\code {FD_ISSET}} +-\entry{select}{290}{\code {select}} +-\entry{sync}{292}{\code {sync}} +-\entry{fsync}{292}{\code {fsync}} +-\entry{fdatasync}{293}{\code {fdatasync}} +-\entry{aio{\_}read}{296}{\code {aio_read}} +-\entry{aio{\_}read64}{297}{\code {aio_read64}} +-\entry{aio{\_}write}{297}{\code {aio_write}} +-\entry{aio{\_}write64}{298}{\code {aio_write64}} +-\entry{lio{\_}listio}{298}{\code {lio_listio}} +-\entry{lio{\_}listio64}{299}{\code {lio_listio64}} +-\entry{aio{\_}error}{300}{\code {aio_error}} +-\entry{aio{\_}error64}{300}{\code {aio_error64}} +-\entry{aio{\_}return}{300}{\code {aio_return}} +-\entry{aio{\_}return64}{301}{\code {aio_return64}} +-\entry{aio{\_}fsync}{301}{\code {aio_fsync}} +-\entry{aio{\_}fsync64}{302}{\code {aio_fsync64}} +-\entry{aio{\_}suspend}{302}{\code {aio_suspend}} +-\entry{aio{\_}suspend64}{303}{\code {aio_suspend64}} +-\entry{aio{\_}cancel}{303}{\code {aio_cancel}} +-\entry{aio{\_}cancel64}{304}{\code {aio_cancel64}} +-\entry{aio{\_}init}{304}{\code {aio_init}} +-\entry{fcntl}{305}{\code {fcntl}} +-\entry{dup}{306}{\code {dup}} +-\entry{dup2}{306}{\code {dup2}} +-\entry{ioctl}{318}{\code {ioctl}} +-\entry{getcwd}{319}{\code {getcwd}} +-\entry{getwd}{320}{\code {getwd}} +-\entry{chdir}{320}{\code {chdir}} +-\entry{IFTODT}{321}{\code {IFTODT}} +-\entry{DTTOIF}{322}{\code {DTTOIF}} +-\entry{opendir}{322}{\code {opendir}} +-\entry{readdir}{323}{\code {readdir}} +-\entry{readdir{\_}r}{323}{\code {readdir_r}} +-\entry{closedir}{323}{\code {closedir}} +-\entry{rewinddir}{324}{\code {rewinddir}} +-\entry{telldir}{324}{\code {telldir}} +-\entry{seekdir}{324}{\code {seekdir}} +-\entry{scandir}{325}{\code {scandir}} +-\entry{alphasort}{325}{\code {alphasort}} +-\entry{versionsort}{325}{\code {versionsort}} +-\entry{scandir64}{325}{\code {scandir64}} +-\entry{alphasort64}{326}{\code {alphasort64}} +-\entry{versionsort64}{326}{\code {versionsort64}} +-\entry{ftw}{329}{\code {ftw}} +-\entry{ftw64}{329}{\code {ftw64}} +-\entry{nftw}{329}{\code {nftw}} +-\entry{nftw64}{330}{\code {nftw64}} +-\entry{link}{331}{\code {link}} +-\entry{symlink}{332}{\code {symlink}} +-\entry{readlink}{332}{\code {readlink}} +-\entry{unlink}{333}{\code {unlink}} +-\entry{rmdir}{334}{\code {rmdir}} +-\entry{remove}{334}{\code {remove}} +-\entry{rename}{334}{\code {rename}} +-\entry{mkdir}{335}{\code {mkdir}} +-\entry{stat}{340}{\code {stat}} +-\entry{stat64}{340}{\code {stat64}} +-\entry{fstat}{341}{\code {fstat}} +-\entry{fstat64}{341}{\code {fstat64}} +-\entry{lstat}{341}{\code {lstat}} +-\entry{lstat64}{341}{\code {lstat64}} +-\entry{S{\_}ISDIR}{342}{\code {S_ISDIR}} +-\entry{S{\_}ISCHR}{342}{\code {S_ISCHR}} +-\entry{S{\_}ISBLK}{342}{\code {S_ISBLK}} +-\entry{S{\_}ISREG}{342}{\code {S_ISREG}} +-\entry{S{\_}ISFIFO}{342}{\code {S_ISFIFO}} +-\entry{S{\_}ISLNK}{342}{\code {S_ISLNK}} +-\entry{S{\_}ISSOCK}{342}{\code {S_ISSOCK}} +-\entry{chown}{343}{\code {chown}} +-\entry{fchown}{344}{\code {fchown}} +-\entry{chmod}{346}{\code {chmod}} +-\entry{umask}{347}{\code {umask}} +-\entry{getumask}{347}{\code {getumask}} +-\entry{chmod}{347}{\code {chmod}} +-\entry{fchmod}{347}{\code {fchmod}} +-\entry{access}{348}{\code {access}} +-\entry{utime}{350}{\code {utime}} +-\entry{utimes}{350}{\code {utimes}} +-\entry{truncate}{351}{\code {truncate}} +-\entry{ftruncate}{351}{\code {ftruncate}} +-\entry{mknod}{352}{\code {mknod}} +-\entry{tmpfile}{353}{\code {tmpfile}} +-\entry{tmpfile64}{353}{\code {tmpfile64}} +-\entry{tmpnam}{354}{\code {tmpnam}} +-\entry{tmpnam{\_}r}{354}{\code {tmpnam_r}} +-\entry{tempnam}{354}{\code {tempnam}} +-\entry{mktemp}{355}{\code {mktemp}} +-\entry{mkstemp}{355}{\code {mkstemp}} +-\entry{pipe}{357}{\code {pipe}} +-\entry{popen}{359}{\code {popen}} +-\entry{pclose}{359}{\code {pclose}} +-\entry{mkfifo}{360}{\code {mkfifo}} +-\entry{bind}{367}{\code {bind}} +-\entry{getsockname}{367}{\code {getsockname}} +-\entry{if{\_}nametoindex}{368}{\code {if_nametoindex}} +-\entry{if{\_}indextoname}{368}{\code {if_indextoname}} +-\entry{if{\_}nameindex}{368}{\code {if_nameindex}} +-\entry{if{\_}freenameindex}{369}{\code {if_freenameindex}} +-\entry{SUN{\_}LEN}{370}{\code {SUN_LEN}} +-\entry{inet{\_}aton}{376}{\code {inet_aton}} +-\entry{inet{\_}addr}{376}{\code {inet_addr}} +-\entry{inet{\_}network}{376}{\code {inet_network}} +-\entry{inet{\_}ntoa}{376}{\code {inet_ntoa}} +-\entry{inet{\_}makeaddr}{376}{\code {inet_makeaddr}} +-\entry{inet{\_}lnaof}{376}{\code {inet_lnaof}} +-\entry{inet{\_}netof}{377}{\code {inet_netof}} +-\entry{inet{\_}pton}{377}{\code {inet_pton}} +-\entry{inet{\_}ntop}{377}{\code {inet_ntop}} +-\entry{gethostbyname}{378}{\code {gethostbyname}} +-\entry{gethostbyname2}{378}{\code {gethostbyname2}} +-\entry{gethostbyaddr}{378}{\code {gethostbyaddr}} +-\entry{gethostbyname{\_}r}{379}{\code {gethostbyname_r}} +-\entry{gethostbyname2{\_}r}{380}{\code {gethostbyname2_r}} +-\entry{gethostbyaddr{\_}r}{380}{\code {gethostbyaddr_r}} +-\entry{sethostent}{380}{\code {sethostent}} +-\entry{gethostent}{380}{\code {gethostent}} +-\entry{endhostent}{380}{\code {endhostent}} +-\entry{getservbyname}{382}{\code {getservbyname}} +-\entry{getservbyport}{382}{\code {getservbyport}} +-\entry{setservent}{382}{\code {setservent}} +-\entry{getservent}{382}{\code {getservent}} +-\entry{endservent}{382}{\code {endservent}} +-\entry{htons}{383}{\code {htons}} +-\entry{ntohs}{383}{\code {ntohs}} +-\entry{htonl}{383}{\code {htonl}} +-\entry{ntohl}{383}{\code {ntohl}} +-\entry{getprotobyname}{384}{\code {getprotobyname}} +-\entry{getprotobynumber}{384}{\code {getprotobynumber}} +-\entry{setprotoent}{384}{\code {setprotoent}} +-\entry{getprotoent}{384}{\code {getprotoent}} +-\entry{endprotoent}{385}{\code {endprotoent}} +-\entry{socket}{386}{\code {socket}} +-\entry{shutdown}{387}{\code {shutdown}} +-\entry{socketpair}{388}{\code {socketpair}} +-\entry{connect}{389}{\code {connect}} +-\entry{listen}{390}{\code {listen}} +-\entry{accept}{391}{\code {accept}} +-\entry{getpeername}{391}{\code {getpeername}} +-\entry{send}{392}{\code {send}} +-\entry{recv}{393}{\code {recv}} +-\entry{sendto}{401}{\code {sendto}} +-\entry{recvfrom}{401}{\code {recvfrom}} +-\entry{getsockopt}{406}{\code {getsockopt}} +-\entry{setsockopt}{407}{\code {setsockopt}} +-\entry{getnetbyname}{409}{\code {getnetbyname}} +-\entry{getnetbyaddr}{409}{\code {getnetbyaddr}} +-\entry{setnetent}{409}{\code {setnetent}} +-\entry{getnetent}{409}{\code {getnetent}} +-\entry{endnetent}{409}{\code {endnetent}} +-\entry{isatty}{411}{\code {isatty}} +-\entry{ttyname}{411}{\code {ttyname}} +-\entry{ttyname{\_}r}{411}{\code {ttyname_r}} +-\entry{tcgetattr}{414}{\code {tcgetattr}} +-\entry{tcsetattr}{414}{\code {tcsetattr}} +-\entry{cfgetospeed}{424}{\code {cfgetospeed}} +-\entry{cfgetispeed}{424}{\code {cfgetispeed}} +-\entry{cfsetospeed}{424}{\code {cfsetospeed}} +-\entry{cfsetispeed}{424}{\code {cfsetispeed}} +-\entry{cfsetspeed}{424}{\code {cfsetspeed}} +-\entry{cfmakeraw}{430}{\code {cfmakeraw}} +-\entry{tcsendbreak}{431}{\code {tcsendbreak}} +-\entry{tcdrain}{431}{\code {tcdrain}} +-\entry{tcflush}{431}{\code {tcflush}} +-\entry{tcflow}{432}{\code {tcflow}} +-\entry{getpt}{434}{\code {getpt}} +-\entry{grantpt}{434}{\code {grantpt}} +-\entry{unlockpt}{435}{\code {unlockpt}} +-\entry{ptsname}{435}{\code {ptsname}} +-\entry{ptsname{\_}r}{435}{\code {ptsname_r}} +-\entry{openpty}{436}{\code {openpty}} +-\entry{forkpty}{437}{\code {forkpty}} +-\entry{sin}{440}{\code {sin}} +-\entry{sinf}{440}{\code {sinf}} +-\entry{sinl}{440}{\code {sinl}} +-\entry{cos}{440}{\code {cos}} +-\entry{cosf}{440}{\code {cosf}} +-\entry{cosl}{440}{\code {cosl}} +-\entry{tan}{440}{\code {tan}} +-\entry{tanf}{440}{\code {tanf}} +-\entry{tanl}{440}{\code {tanl}} +-\entry{sincos}{441}{\code {sincos}} +-\entry{sincosf}{441}{\code {sincosf}} +-\entry{sincosl}{441}{\code {sincosl}} +-\entry{csin}{441}{\code {csin}} +-\entry{csinf}{441}{\code {csinf}} +-\entry{csinl}{441}{\code {csinl}} +-\entry{ccos}{441}{\code {ccos}} +-\entry{ccosf}{441}{\code {ccosf}} +-\entry{ccosl}{441}{\code {ccosl}} +-\entry{ctan}{441}{\code {ctan}} +-\entry{ctanf}{441}{\code {ctanf}} +-\entry{ctanl}{441}{\code {ctanl}} +-\entry{asin}{442}{\code {asin}} +-\entry{asinf}{442}{\code {asinf}} +-\entry{asinl}{442}{\code {asinl}} +-\entry{acos}{442}{\code {acos}} +-\entry{acosf}{442}{\code {acosf}} +-\entry{acosl}{442}{\code {acosl}} +-\entry{atan}{442}{\code {atan}} +-\entry{atanf}{442}{\code {atanf}} +-\entry{atanl}{442}{\code {atanl}} +-\entry{atan2}{442}{\code {atan2}} +-\entry{atan2f}{442}{\code {atan2f}} +-\entry{atan2l}{442}{\code {atan2l}} +-\entry{casin}{443}{\code {casin}} +-\entry{casinf}{443}{\code {casinf}} +-\entry{casinl}{443}{\code {casinl}} +-\entry{cacos}{443}{\code {cacos}} +-\entry{cacosf}{443}{\code {cacosf}} +-\entry{cacosl}{443}{\code {cacosl}} +-\entry{catan}{443}{\code {catan}} +-\entry{catanf}{443}{\code {catanf}} +-\entry{catanl}{443}{\code {catanl}} +-\entry{exp}{443}{\code {exp}} +-\entry{expf}{443}{\code {expf}} +-\entry{expl}{443}{\code {expl}} +-\entry{exp2}{443}{\code {exp2}} +-\entry{exp2f}{443}{\code {exp2f}} +-\entry{exp2l}{443}{\code {exp2l}} +-\entry{exp10}{443}{\code {exp10}} +-\entry{exp10f}{443}{\code {exp10f}} +-\entry{exp10l}{443}{\code {exp10l}} +-\entry{pow10}{443}{\code {pow10}} +-\entry{pow10f}{443}{\code {pow10f}} +-\entry{pow10l}{443}{\code {pow10l}} +-\entry{log}{444}{\code {log}} +-\entry{logf}{444}{\code {logf}} +-\entry{logl}{444}{\code {logl}} +-\entry{log10}{444}{\code {log10}} +-\entry{log10f}{444}{\code {log10f}} +-\entry{log10l}{444}{\code {log10l}} +-\entry{log2}{444}{\code {log2}} +-\entry{log2f}{444}{\code {log2f}} +-\entry{log2l}{444}{\code {log2l}} +-\entry{logb}{444}{\code {logb}} +-\entry{logbf}{444}{\code {logbf}} +-\entry{logbl}{444}{\code {logbl}} +-\entry{ilogb}{444}{\code {ilogb}} +-\entry{ilogbf}{444}{\code {ilogbf}} +-\entry{ilogbl}{444}{\code {ilogbl}} +-\entry{pow}{445}{\code {pow}} +-\entry{powf}{445}{\code {powf}} +-\entry{powl}{445}{\code {powl}} +-\entry{sqrt}{445}{\code {sqrt}} +-\entry{sqrtf}{445}{\code {sqrtf}} +-\entry{sqrtl}{445}{\code {sqrtl}} +-\entry{cbrt}{445}{\code {cbrt}} +-\entry{cbrtf}{445}{\code {cbrtf}} +-\entry{cbrtl}{445}{\code {cbrtl}} +-\entry{hypot}{445}{\code {hypot}} +-\entry{hypotf}{445}{\code {hypotf}} +-\entry{hypotl}{445}{\code {hypotl}} +-\entry{expm1}{446}{\code {expm1}} +-\entry{expm1f}{446}{\code {expm1f}} +-\entry{expm1l}{446}{\code {expm1l}} +-\entry{log1p}{446}{\code {log1p}} +-\entry{log1pf}{446}{\code {log1pf}} +-\entry{log1pl}{446}{\code {log1pl}} +-\entry{cexp}{446}{\code {cexp}} +-\entry{cexpf}{446}{\code {cexpf}} +-\entry{cexpl}{446}{\code {cexpl}} +-\entry{clog}{446}{\code {clog}} +-\entry{clogf}{446}{\code {clogf}} +-\entry{clogl}{446}{\code {clogl}} +-\entry{clog10}{446}{\code {clog10}} +-\entry{clog10f}{446}{\code {clog10f}} +-\entry{clog10l}{446}{\code {clog10l}} +-\entry{csqrt}{447}{\code {csqrt}} +-\entry{csqrtf}{447}{\code {csqrtf}} +-\entry{csqrtl}{447}{\code {csqrtl}} +-\entry{cpow}{447}{\code {cpow}} +-\entry{cpowf}{447}{\code {cpowf}} +-\entry{cpowl}{447}{\code {cpowl}} +-\entry{sinh}{447}{\code {sinh}} +-\entry{sinhf}{447}{\code {sinhf}} +-\entry{sinhl}{447}{\code {sinhl}} +-\entry{cosh}{447}{\code {cosh}} +-\entry{coshf}{447}{\code {coshf}} +-\entry{coshl}{447}{\code {coshl}} +-\entry{tanh}{447}{\code {tanh}} +-\entry{tanhf}{447}{\code {tanhf}} +-\entry{tanhl}{447}{\code {tanhl}} +-\entry{csinh}{447}{\code {csinh}} +-\entry{csinhf}{447}{\code {csinhf}} +-\entry{csinhl}{447}{\code {csinhl}} +-\entry{ccosh}{448}{\code {ccosh}} +-\entry{ccoshf}{448}{\code {ccoshf}} +-\entry{ccoshl}{448}{\code {ccoshl}} +-\entry{ctanh}{448}{\code {ctanh}} +-\entry{ctanhf}{448}{\code {ctanhf}} +-\entry{ctanhl}{448}{\code {ctanhl}} +-\entry{asinh}{448}{\code {asinh}} +-\entry{asinhf}{448}{\code {asinhf}} +-\entry{asinhl}{448}{\code {asinhl}} +-\entry{acosh}{448}{\code {acosh}} +-\entry{acoshf}{448}{\code {acoshf}} +-\entry{acoshl}{448}{\code {acoshl}} +-\entry{atanh}{448}{\code {atanh}} +-\entry{atanhf}{448}{\code {atanhf}} +-\entry{atanhl}{448}{\code {atanhl}} +-\entry{casinh}{448}{\code {casinh}} +-\entry{casinhf}{448}{\code {casinhf}} +-\entry{casinhl}{448}{\code {casinhl}} +-\entry{cacosh}{448}{\code {cacosh}} +-\entry{cacoshf}{448}{\code {cacoshf}} +-\entry{cacoshl}{448}{\code {cacoshl}} +-\entry{catanh}{449}{\code {catanh}} +-\entry{catanhf}{449}{\code {catanhf}} +-\entry{catanhl}{449}{\code {catanhl}} +-\entry{erf}{449}{\code {erf}} +-\entry{erff}{449}{\code {erff}} +-\entry{erfl}{449}{\code {erfl}} +-\entry{erfc}{449}{\code {erfc}} +-\entry{erfcf}{449}{\code {erfcf}} +-\entry{erfcl}{449}{\code {erfcl}} +-\entry{lgamma}{449}{\code {lgamma}} +-\entry{lgammaf}{449}{\code {lgammaf}} +-\entry{lgammal}{449}{\code {lgammal}} +-\entry{lgamma{\_}r}{450}{\code {lgamma_r}} +-\entry{lgammaf{\_}r}{450}{\code {lgammaf_r}} +-\entry{lgammal{\_}r}{450}{\code {lgammal_r}} +-\entry{gamma}{450}{\code {gamma}} +-\entry{gammaf}{450}{\code {gammaf}} +-\entry{gammal}{450}{\code {gammal}} +-\entry{tgamma}{450}{\code {tgamma}} +-\entry{tgammaf}{450}{\code {tgammaf}} +-\entry{tgammal}{450}{\code {tgammal}} +-\entry{j0}{450}{\code {j0}} +-\entry{j0f}{450}{\code {j0f}} +-\entry{j0l}{450}{\code {j0l}} +-\entry{j1}{450}{\code {j1}} +-\entry{j1f}{450}{\code {j1f}} +-\entry{j1l}{450}{\code {j1l}} +-\entry{jn}{450}{\code {jn}} +-\entry{jnf}{450}{\code {jnf}} +-\entry{jnl}{450}{\code {jnl}} +-\entry{y0}{450}{\code {y0}} +-\entry{y0f}{450}{\code {y0f}} +-\entry{y0l}{450}{\code {y0l}} +-\entry{y1}{451}{\code {y1}} +-\entry{y1f}{451}{\code {y1f}} +-\entry{y1l}{451}{\code {y1l}} +-\entry{yn}{451}{\code {yn}} +-\entry{ynf}{451}{\code {ynf}} +-\entry{ynl}{451}{\code {ynl}} +-\entry{rand}{452}{\code {rand}} +-\entry{srand}{452}{\code {srand}} +-\entry{rand{\_}r}{452}{\code {rand_r}} +-\entry{random}{452}{\code {random}} +-\entry{srandom}{452}{\code {srandom}} +-\entry{initstate}{453}{\code {initstate}} +-\entry{setstate}{453}{\code {setstate}} +-\entry{drand48}{453}{\code {drand48}} +-\entry{erand48}{454}{\code {erand48}} +-\entry{lrand48}{454}{\code {lrand48}} +-\entry{nrand48}{454}{\code {nrand48}} +-\entry{mrand48}{454}{\code {mrand48}} +-\entry{jrand48}{454}{\code {jrand48}} +-\entry{srand48}{454}{\code {srand48}} +-\entry{seed48}{455}{\code {seed48}} +-\entry{lcong48}{455}{\code {lcong48}} +-\entry{drand48{\_}r}{455}{\code {drand48_r}} +-\entry{erand48{\_}r}{456}{\code {erand48_r}} +-\entry{lrand48{\_}r}{456}{\code {lrand48_r}} +-\entry{nrand48{\_}r}{456}{\code {nrand48_r}} +-\entry{mrand48{\_}r}{456}{\code {mrand48_r}} +-\entry{jrand48{\_}r}{456}{\code {jrand48_r}} +-\entry{srand48{\_}r}{457}{\code {srand48_r}} +-\entry{seed48{\_}r}{457}{\code {seed48_r}} +-\entry{lcong48{\_}r}{457}{\code {lcong48_r}} +-\entry{fpclassify}{459}{\code {fpclassify}} +-\entry{isfinite}{460}{\code {isfinite}} +-\entry{isnormal}{460}{\code {isnormal}} +-\entry{isnan}{460}{\code {isnan}} +-\entry{isinf}{460}{\code {isinf}} +-\entry{isinff}{460}{\code {isinff}} +-\entry{isinfl}{460}{\code {isinfl}} +-\entry{isnan}{460}{\code {isnan}} +-\entry{isnanf}{460}{\code {isnanf}} +-\entry{isnanl}{460}{\code {isnanl}} +-\entry{finite}{461}{\code {finite}} +-\entry{finitef}{461}{\code {finitef}} +-\entry{finitel}{461}{\code {finitel}} +-\entry{infnan}{461}{\code {infnan}} +-\entry{matherr}{461}{\code {matherr}} +-\entry{feclearexcept}{464}{\code {feclearexcept}} +-\entry{fetestexcept}{464}{\code {fetestexcept}} +-\entry{fegetexceptflag}{465}{\code {fegetexceptflag}} +-\entry{fesetexceptflag}{465}{\code {fesetexceptflag}} +-\entry{fegetround}{467}{\code {fegetround}} +-\entry{fesetround}{467}{\code {fesetround}} +-\entry{fegetenv}{468}{\code {fegetenv}} +-\entry{feholdexcept}{468}{\code {feholdexcept}} +-\entry{fesetenv}{468}{\code {fesetenv}} +-\entry{feupdateenv}{468}{\code {feupdateenv}} +-\entry{abs}{469}{\code {abs}} +-\entry{labs}{469}{\code {labs}} +-\entry{llabs}{469}{\code {llabs}} +-\entry{imaxabs}{469}{\code {imaxabs}} +-\entry{fabs}{469}{\code {fabs}} +-\entry{fabsf}{469}{\code {fabsf}} +-\entry{fabsl}{469}{\code {fabsl}} +-\entry{cabs}{469}{\code {cabs}} +-\entry{cabsf}{469}{\code {cabsf}} +-\entry{cabsl}{469}{\code {cabsl}} +-\entry{frexp}{469}{\code {frexp}} +-\entry{frexpf}{469}{\code {frexpf}} +-\entry{frexpl}{469}{\code {frexpl}} +-\entry{ldexp}{470}{\code {ldexp}} +-\entry{ldexpf}{470}{\code {ldexpf}} +-\entry{ldexpl}{470}{\code {ldexpl}} +-\entry{logb}{470}{\code {logb}} +-\entry{logbf}{470}{\code {logbf}} +-\entry{logbl}{470}{\code {logbl}} +-\entry{scalb}{470}{\code {scalb}} +-\entry{scalbf}{470}{\code {scalbf}} +-\entry{scalbl}{470}{\code {scalbl}} +-\entry{scalbn}{470}{\code {scalbn}} +-\entry{scalbnf}{470}{\code {scalbnf}} +-\entry{scalbnl}{470}{\code {scalbnl}} +-\entry{scalbln}{470}{\code {scalbln}} +-\entry{scalblnf}{470}{\code {scalblnf}} +-\entry{scalblnl}{470}{\code {scalblnl}} +-\entry{significand}{470}{\code {significand}} +-\entry{significandf}{470}{\code {significandf}} +-\entry{significandl}{470}{\code {significandl}} +-\entry{ceil}{471}{\code {ceil}} +-\entry{ceilf}{471}{\code {ceilf}} +-\entry{ceill}{471}{\code {ceill}} +-\entry{floor}{471}{\code {floor}} +-\entry{floorf}{471}{\code {floorf}} +-\entry{floorl}{471}{\code {floorl}} +-\entry{trunc}{471}{\code {trunc}} +-\entry{truncf}{471}{\code {truncf}} +-\entry{truncl}{471}{\code {truncl}} +-\entry{rint}{471}{\code {rint}} +-\entry{rintf}{471}{\code {rintf}} +-\entry{rintl}{471}{\code {rintl}} +-\entry{nearbyint}{471}{\code {nearbyint}} +-\entry{nearbyintf}{471}{\code {nearbyintf}} +-\entry{nearbyintl}{471}{\code {nearbyintl}} +-\entry{round}{472}{\code {round}} +-\entry{roundf}{472}{\code {roundf}} +-\entry{roundl}{472}{\code {roundl}} +-\entry{lrint}{472}{\code {lrint}} +-\entry{lrintf}{472}{\code {lrintf}} +-\entry{lrintl}{472}{\code {lrintl}} +-\entry{llrint}{472}{\code {llrint}} +-\entry{llrintf}{472}{\code {llrintf}} +-\entry{llrintl}{472}{\code {llrintl}} +-\entry{lround}{472}{\code {lround}} +-\entry{lroundf}{472}{\code {lroundf}} +-\entry{lroundl}{472}{\code {lroundl}} +-\entry{llround}{472}{\code {llround}} +-\entry{llroundf}{472}{\code {llroundf}} +-\entry{llroundl}{472}{\code {llroundl}} +-\entry{modf}{472}{\code {modf}} +-\entry{modff}{472}{\code {modff}} +-\entry{modfl}{472}{\code {modfl}} +-\entry{fmod}{472}{\code {fmod}} +-\entry{fmodf}{473}{\code {fmodf}} +-\entry{fmodl}{473}{\code {fmodl}} +-\entry{drem}{473}{\code {drem}} +-\entry{dremf}{473}{\code {dremf}} +-\entry{dreml}{473}{\code {dreml}} +-\entry{remainder}{473}{\code {remainder}} +-\entry{remainderf}{473}{\code {remainderf}} +-\entry{remainderl}{473}{\code {remainderl}} +-\entry{copysign}{473}{\code {copysign}} +-\entry{copysignf}{473}{\code {copysignf}} +-\entry{copysignl}{473}{\code {copysignl}} +-\entry{signbit}{474}{\code {signbit}} +-\entry{nextafter}{474}{\code {nextafter}} +-\entry{nextafterf}{474}{\code {nextafterf}} +-\entry{nextafterl}{474}{\code {nextafterl}} +-\entry{nexttoward}{474}{\code {nexttoward}} +-\entry{nexttowardf}{474}{\code {nexttowardf}} +-\entry{nexttowardl}{474}{\code {nexttowardl}} +-\entry{nan}{474}{\code {nan}} +-\entry{nanf}{474}{\code {nanf}} +-\entry{nanl}{474}{\code {nanl}} +-\entry{isgreater}{475}{\code {isgreater}} +-\entry{isgreaterequal}{475}{\code {isgreaterequal}} +-\entry{isless}{475}{\code {isless}} +-\entry{islessequal}{475}{\code {islessequal}} +-\entry{islessgreater}{475}{\code {islessgreater}} +-\entry{isunordered}{475}{\code {isunordered}} +-\entry{fmin}{475}{\code {fmin}} +-\entry{fminf}{475}{\code {fminf}} +-\entry{fminl}{475}{\code {fminl}} +-\entry{fmax}{476}{\code {fmax}} +-\entry{fmaxf}{476}{\code {fmaxf}} +-\entry{fmaxl}{476}{\code {fmaxl}} +-\entry{fdim}{476}{\code {fdim}} +-\entry{fdimf}{476}{\code {fdimf}} +-\entry{fdiml}{476}{\code {fdiml}} +-\entry{fma}{476}{\code {fma}} +-\entry{fmaf}{476}{\code {fmaf}} +-\entry{fmal}{476}{\code {fmal}} +-\entry{creal}{477}{\code {creal}} +-\entry{crealf}{477}{\code {crealf}} +-\entry{creall}{477}{\code {creall}} +-\entry{cimag}{477}{\code {cimag}} +-\entry{cimagf}{477}{\code {cimagf}} +-\entry{cimagl}{477}{\code {cimagl}} +-\entry{conj}{477}{\code {conj}} +-\entry{conjf}{477}{\code {conjf}} +-\entry{conjl}{477}{\code {conjl}} +-\entry{carg}{477}{\code {carg}} +-\entry{cargf}{477}{\code {cargf}} +-\entry{cargl}{477}{\code {cargl}} +-\entry{cproj}{478}{\code {cproj}} +-\entry{cprojf}{478}{\code {cprojf}} +-\entry{cprojl}{478}{\code {cprojl}} +-\entry{div}{478}{\code {div}} +-\entry{ldiv}{479}{\code {ldiv}} +-\entry{lldiv}{479}{\code {lldiv}} +-\entry{imaxdiv}{479}{\code {imaxdiv}} +-\entry{strtol}{480}{\code {strtol}} +-\entry{strtoul}{480}{\code {strtoul}} +-\entry{strtoll}{481}{\code {strtoll}} +-\entry{strtoq}{481}{\code {strtoq}} +-\entry{strtoull}{481}{\code {strtoull}} +-\entry{strtouq}{481}{\code {strtouq}} +-\entry{atol}{481}{\code {atol}} +-\entry{atoi}{481}{\code {atoi}} +-\entry{atoll}{481}{\code {atoll}} +-\entry{strtol{\_}l}{481}{\code {strtol_l}} +-\entry{strtoul{\_}l}{481}{\code {strtoul_l}} +-\entry{strtoll{\_}l}{481}{\code {strtoll_l}} +-\entry{strtoull{\_}l}{481}{\code {strtoull_l}} +-\entry{strtod}{482}{\code {strtod}} +-\entry{strtof}{483}{\code {strtof}} +-\entry{strtold}{483}{\code {strtold}} +-\entry{atof}{483}{\code {atof}} +-\entry{ecvt}{484}{\code {ecvt}} +-\entry{fcvt}{484}{\code {fcvt}} +-\entry{gcvt}{484}{\code {gcvt}} +-\entry{qecvt}{484}{\code {qecvt}} +-\entry{qfcvt}{484}{\code {qfcvt}} +-\entry{qgcvt}{485}{\code {qgcvt}} +-\entry{ecvt{\_}r}{485}{\code {ecvt_r}} +-\entry{fcvt{\_}r}{485}{\code {fcvt_r}} +-\entry{qecvt{\_}r}{485}{\code {qecvt_r}} +-\entry{qfcvt{\_}r}{485}{\code {qfcvt_r}} +-\entry{clock}{488}{\code {clock}} +-\entry{times}{489}{\code {times}} +-\entry{difftime}{490}{\code {difftime}} +-\entry{time}{490}{\code {time}} +-\entry{gettimeofday}{491}{\code {gettimeofday}} +-\entry{settimeofday}{491}{\code {settimeofday}} +-\entry{adjtime}{492}{\code {adjtime}} +-\entry{localtime}{493}{\code {localtime}} +-\entry{localtime{\_}r}{494}{\code {localtime_r}} +-\entry{gmtime}{494}{\code {gmtime}} +-\entry{gmtime{\_}r}{494}{\code {gmtime_r}} +-\entry{mktime}{494}{\code {mktime}} +-\entry{asctime}{495}{\code {asctime}} +-\entry{asctime{\_}r}{495}{\code {asctime_r}} +-\entry{ctime}{495}{\code {ctime}} +-\entry{ctime{\_}r}{495}{\code {ctime_r}} +-\entry{strftime}{495}{\code {strftime}} +-\entry{strptime}{500}{\code {strptime}} +-\entry{getdate}{505}{\code {getdate}} +-\entry{getdate{\_}r}{507}{\code {getdate_r}} +-\entry{tzset}{509}{\code {tzset}} +-\entry{ntp{\_}gettime}{511}{\code {ntp_gettime}} +-\entry{ntp{\_}adjtime}{513}{\code {ntp_adjtime}} +-\entry{setitimer}{514}{\code {setitimer}} +-\entry{getitimer}{514}{\code {getitimer}} +-\entry{ITIMER{\_}REAL}{514}{\code {ITIMER_REAL}} +-\entry{ITIMER{\_}VIRTUAL}{514}{\code {ITIMER_VIRTUAL}} +-\entry{ITIMER{\_}PROF}{515}{\code {ITIMER_PROF}} +-\entry{alarm}{515}{\code {alarm}} +-\entry{sleep}{515}{\code {sleep}} +-\entry{nanosleep}{516}{\code {nanosleep}} +-\entry{getrusage}{517}{\code {getrusage}} +-\entry{getrlimit}{519}{\code {getrlimit}} +-\entry{getrlimit64}{519}{\code {getrlimit64}} +-\entry{setrlimit}{519}{\code {setrlimit}} +-\entry{setrlimit64}{519}{\code {setrlimit64}} +-\entry{getpriority}{521}{\code {getpriority}} +-\entry{setpriority}{522}{\code {setpriority}} +-\entry{nice}{522}{\code {nice}} +-\entry{setjmp}{524}{\code {setjmp}} +-\entry{longjmp}{525}{\code {longjmp}} +-\entry{sigsetjmp}{526}{\code {sigsetjmp}} +-\entry{siglongjmp}{526}{\code {siglongjmp}} +-\entry{strsignal}{537}{\code {strsignal}} +-\entry{psignal}{538}{\code {psignal}} +-\entry{signal}{538}{\code {signal}} +-\entry{sysv{\_}signal}{540}{\code {sysv_signal}} +-\entry{ssignal}{540}{\code {ssignal}} +-\entry{sigaction}{541}{\code {sigaction}} +-\entry{TEMP{\_}FAILURE{\_}RETRY}{555}{\code {TEMP_FAILURE_RETRY}} +-\entry{raise}{556}{\code {raise}} +-\entry{gsignal}{556}{\code {gsignal}} +-\entry{kill}{557}{\code {kill}} +-\entry{killpg}{558}{\code {killpg}} +-\entry{sigemptyset}{562}{\code {sigemptyset}} +-\entry{sigfillset}{562}{\code {sigfillset}} +-\entry{sigaddset}{562}{\code {sigaddset}} +-\entry{sigdelset}{562}{\code {sigdelset}} +-\entry{sigismember}{562}{\code {sigismember}} +-\entry{sigprocmask}{562}{\code {sigprocmask}} +-\entry{sigpending}{565}{\code {sigpending}} +-\entry{pause}{567}{\code {pause}} +-\entry{sigsuspend}{569}{\code {sigsuspend}} +-\entry{sigaltstack}{571}{\code {sigaltstack}} +-\entry{sigstack}{571}{\code {sigstack}} +-\entry{sigvec}{573}{\code {sigvec}} +-\entry{siginterrupt}{573}{\code {siginterrupt}} +-\entry{sigmask}{573}{\code {sigmask}} +-\entry{sigblock}{573}{\code {sigblock}} +-\entry{sigsetmask}{573}{\code {sigsetmask}} +-\entry{sigpause}{573}{\code {sigpause}} +-\entry{main}{575}{\code {main}} +-\entry{getopt}{577}{\code {getopt}} +-\entry{getopt{\_}long}{581}{\code {getopt_long}} +-\entry{argp{\_}parse}{584}{\code {argp_parse}} +-\entry{argp{\_}usage}{591}{\code {argp_usage}} +-\entry{argp{\_}error}{591}{\code {argp_error}} +-\entry{argp{\_}failure}{591}{\code {argp_failure}} +-\entry{argp{\_}state{\_}help}{592}{\code {argp_state_help}} +-\entry{argp{\_}help}{596}{\code {argp_help}} +-\entry{getsubopt}{607}{\code {getsubopt}} +-\entry{getenv}{610}{\code {getenv}} +-\entry{putenv}{610}{\code {putenv}} +-\entry{setenv}{610}{\code {setenv}} +-\entry{unsetenv}{611}{\code {unsetenv}} +-\entry{clearenv}{611}{\code {clearenv}} +-\entry{exit}{614}{\code {exit}} +-\entry{atexit}{615}{\code {atexit}} +-\entry{on{\_}exit}{615}{\code {on_exit}} +-\entry{abort}{616}{\code {abort}} +-\entry{{\_}exit}{616}{\code {_exit}} +-\entry{{\_}Exit}{616}{\code {_Exit}} +-\entry{system}{619}{\code {system}} +-\entry{getpid}{620}{\code {getpid}} +-\entry{getppid}{620}{\code {getppid}} +-\entry{fork}{621}{\code {fork}} +-\entry{vfork}{621}{\code {vfork}} +-\entry{execv}{622}{\code {execv}} +-\entry{execl}{622}{\code {execl}} +-\entry{execve}{622}{\code {execve}} +-\entry{execle}{622}{\code {execle}} +-\entry{execvp}{623}{\code {execvp}} +-\entry{execlp}{623}{\code {execlp}} +-\entry{waitpid}{624}{\code {waitpid}} +-\entry{wait}{626}{\code {wait}} +-\entry{wait4}{626}{\code {wait4}} +-\entry{WIFEXITED}{627}{\code {WIFEXITED}} +-\entry{WEXITSTATUS}{627}{\code {WEXITSTATUS}} +-\entry{WIFSIGNALED}{627}{\code {WIFSIGNALED}} +-\entry{WTERMSIG}{627}{\code {WTERMSIG}} +-\entry{WCOREDUMP}{627}{\code {WCOREDUMP}} +-\entry{WIFSTOPPED}{627}{\code {WIFSTOPPED}} +-\entry{WSTOPSIG}{627}{\code {WSTOPSIG}} +-\entry{wait3}{628}{\code {wait3}} +-\entry{ctermid}{646}{\code {ctermid}} +-\entry{setsid}{647}{\code {setsid}} +-\entry{getsid}{647}{\code {getsid}} +-\entry{getpgrp}{647}{\code {getpgrp}} +-\entry{getpgrp}{647}{\code {getpgrp}} +-\entry{getpgid}{647}{\code {getpgid}} +-\entry{setpgid}{648}{\code {setpgid}} +-\entry{setpgrp}{648}{\code {setpgrp}} +-\entry{tcgetpgrp}{648}{\code {tcgetpgrp}} +-\entry{tcsetpgrp}{649}{\code {tcsetpgrp}} +-\entry{tcgetsid}{649}{\code {tcgetsid}} +-\entry{success}{653}{\code {success}} +-\entry{notfound}{653}{\code {notfound}} +-\entry{unavail}{653}{\code {unavail}} +-\entry{tryagain}{653}{\code {tryagain}} +-\entry{NSS{\_}STATUS{\_}TRYAGAIN}{656}{\code {NSS_STATUS_TRYAGAIN}} +-\entry{NSS{\_}STATUS{\_}UNAVAIL}{656}{\code {NSS_STATUS_UNAVAIL}} +-\entry{NSS{\_}STATUS{\_}NOTFOUND}{656}{\code {NSS_STATUS_NOTFOUND}} +-\entry{NSS{\_}STATUS{\_}SUCCESS}{656}{\code {NSS_STATUS_SUCCESS}} +-\entry{getuid}{663}{\code {getuid}} +-\entry{getgid}{663}{\code {getgid}} +-\entry{geteuid}{663}{\code {geteuid}} +-\entry{getegid}{663}{\code {getegid}} +-\entry{getgroups}{663}{\code {getgroups}} +-\entry{seteuid}{664}{\code {seteuid}} +-\entry{setuid}{664}{\code {setuid}} +-\entry{setreuid}{665}{\code {setreuid}} +-\entry{setegid}{665}{\code {setegid}} +-\entry{setgid}{665}{\code {setgid}} +-\entry{setregid}{665}{\code {setregid}} +-\entry{setgroups}{666}{\code {setgroups}} +-\entry{initgroups}{666}{\code {initgroups}} +-\entry{getlogin}{670}{\code {getlogin}} +-\entry{cuserid}{670}{\code {cuserid}} +-\entry{setutent}{673}{\code {setutent}} +-\entry{getutent}{673}{\code {getutent}} +-\entry{endutent}{673}{\code {endutent}} +-\entry{getutid}{673}{\code {getutid}} +-\entry{getutline}{674}{\code {getutline}} +-\entry{pututline}{674}{\code {pututline}} +-\entry{getutent{\_}r}{674}{\code {getutent_r}} +-\entry{getutid{\_}r}{674}{\code {getutid_r}} +-\entry{getutline{\_}r}{675}{\code {getutline_r}} +-\entry{utmpname}{675}{\code {utmpname}} +-\entry{updwtmp}{675}{\code {updwtmp}} +-\entry{setutxent}{677}{\code {setutxent}} +-\entry{getutxent}{677}{\code {getutxent}} +-\entry{endutxent}{677}{\code {endutxent}} +-\entry{getutxid}{677}{\code {getutxid}} +-\entry{getutxline}{677}{\code {getutxline}} +-\entry{pututxline}{677}{\code {pututxline}} +-\entry{login{\_}tty}{678}{\code {login_tty}} +-\entry{login}{678}{\code {login}} +-\entry{logout}{678}{\code {logout}} +-\entry{logwtmp}{678}{\code {logwtmp}} +-\entry{getpwuid}{679}{\code {getpwuid}} +-\entry{getpwuid{\_}r}{679}{\code {getpwuid_r}} +-\entry{getpwnam}{680}{\code {getpwnam}} +-\entry{getpwnam{\_}r}{680}{\code {getpwnam_r}} +-\entry{fgetpwent}{680}{\code {fgetpwent}} +-\entry{fgetpwent{\_}r}{680}{\code {fgetpwent_r}} +-\entry{setpwent}{681}{\code {setpwent}} +-\entry{getpwent}{681}{\code {getpwent}} +-\entry{getpwent{\_}r}{681}{\code {getpwent_r}} +-\entry{endpwent}{681}{\code {endpwent}} +-\entry{putpwent}{681}{\code {putpwent}} +-\entry{getgrgid}{682}{\code {getgrgid}} +-\entry{getgrgid{\_}r}{682}{\code {getgrgid_r}} +-\entry{getgrnam}{682}{\code {getgrnam}} +-\entry{getgrnam{\_}r}{683}{\code {getgrnam_r}} +-\entry{fgetgrent}{683}{\code {fgetgrent}} +-\entry{fgetgrent{\_}r}{683}{\code {fgetgrent_r}} +-\entry{setgrent}{683}{\code {setgrent}} +-\entry{getgrent}{683}{\code {getgrent}} +-\entry{getgrent{\_}r}{684}{\code {getgrent_r}} +-\entry{endgrent}{684}{\code {endgrent}} +-\entry{setnetgrent}{686}{\code {setnetgrent}} +-\entry{getnetgrent}{686}{\code {getnetgrent}} +-\entry{getnetgrent{\_}r}{686}{\code {getnetgrent_r}} +-\entry{endnetgrent}{687}{\code {endnetgrent}} +-\entry{innetgr}{687}{\code {innetgr}} +-\entry{gethostname}{689}{\code {gethostname}} +-\entry{sethostname}{689}{\code {sethostname}} +-\entry{gethostid}{689}{\code {gethostid}} +-\entry{sethostid}{690}{\code {sethostid}} +-\entry{uname}{691}{\code {uname}} +-\entry{setfsent}{692}{\code {setfsent}} +-\entry{endfsent}{693}{\code {endfsent}} +-\entry{getfsent}{693}{\code {getfsent}} +-\entry{getfsspec}{693}{\code {getfsspec}} +-\entry{getfsfile}{693}{\code {getfsfile}} +-\entry{setmntent}{695}{\code {setmntent}} +-\entry{endmntent}{695}{\code {endmntent}} +-\entry{getmntent}{695}{\code {getmntent}} +-\entry{getmntent{\_}r}{696}{\code {getmntent_r}} +-\entry{addmntent}{696}{\code {addmntent}} +-\entry{hasmntopt}{696}{\code {hasmntopt}} +-\entry{sysconf}{700}{\code {sysconf}} +-\entry{pathconf}{712}{\code {pathconf}} +-\entry{fpathconf}{712}{\code {fpathconf}} +-\entry{confstr}{715}{\code {confstr}} +-\entry{getpass}{718}{\code {getpass}} +-\entry{crypt}{718}{\code {crypt}} +-\entry{crypt{\_}r}{720}{\code {crypt_r}} +-\entry{setkey}{721}{\code {setkey}} +-\entry{encrypt}{721}{\code {encrypt}} +-\entry{setkey{\_}r}{721}{\code {setkey_r}} +-\entry{encrypt{\_}r}{721}{\code {encrypt_r}} +-\entry{ecb{\_}crypt}{721}{\code {ecb_crypt}} +-\entry{DES{\_}ENCRYPT}{721}{\code {DES_ENCRYPT}} +-\entry{DES{\_}DECRYPT}{721}{\code {DES_DECRYPT}} +-\entry{DES{\_}HW}{722}{\code {DES_HW}} +-\entry{DES{\_}SW}{722}{\code {DES_SW}} +-\entry{DESERR{\_}NONE}{722}{\code {DESERR_NONE}} +-\entry{DESERR{\_}NOHWDEVICE}{722}{\code {DESERR_NOHWDEVICE}} +-\entry{DESERR{\_}HWERROR}{722}{\code {DESERR_HWERROR}} +-\entry{DESERR{\_}BADPARAM}{722}{\code {DESERR_BADPARAM}} +-\entry{DES{\_}FAILED}{722}{\code {DES_FAILED}} +-\entry{cbc{\_}crypt}{722}{\code {cbc_crypt}} +-\entry{des{\_}setparity}{722}{\code {des_setparity}} +-\entry{pthread{\_}create}{723}{\code {pthread_create}} +-\entry{pthread{\_}exit}{723}{\code {pthread_exit}} +-\entry{pthread{\_}cancel}{724}{\code {pthread_cancel}} +-\entry{pthread{\_}join}{724}{\code {pthread_join}} +-\entry{pthread{\_}attr{\_}init}{724}{\code {pthread_attr_init}} +-\entry{pthread{\_}attr{\_}destroy}{725}{\code {pthread_attr_destroy}} +-\entry{pthread{\_}attr{\_}setinheritsched}{725}{\code {pthread_attr_setinheritsched}} +-\entry{pthread{\_}attr{\_}setschedparam}{725}{\code {pthread_attr_setschedparam}} +-\entry{pthread{\_}attr{\_}setschedpolicy}{725}{\code {pthread_attr_setschedpolicy}} +-\entry{pthread{\_}attr{\_}setscope}{725}{\code {pthread_attr_setscope}} +-\entry{pthread{\_}attr{\_}setattr}{725}{\code {pthread_attr_set\var {attr}}} +-\entry{pthread{\_}attr{\_}getinheritsched}{725}{\code {pthread_attr_getinheritsched}} +-\entry{pthread{\_}attr{\_}getschedparam}{725}{\code {pthread_attr_getschedparam}} +-\entry{pthread{\_}attr{\_}getschedpolicy}{725}{\code {pthread_attr_getschedpolicy}} +-\entry{pthread{\_}attr{\_}getscope}{725}{\code {pthread_attr_getscope}} +-\entry{pthread{\_}attr{\_}getattr}{725}{\code {pthread_attr_get\var {attr}}} +-\entry{pthread{\_}setcancelstate}{727}{\code {pthread_setcancelstate}} +-\entry{pthread{\_}setcanceltype}{727}{\code {pthread_setcanceltype}} +-\entry{pthread{\_}testcancel}{727}{\code {pthread_testcancel}} +-\entry{pthread{\_}cleanup{\_}push}{728}{\code {pthread_cleanup_push}} +-\entry{pthread{\_}cleanup{\_}pop}{728}{\code {pthread_cleanup_pop}} +-\entry{pthread{\_}cleanup{\_}push{\_}defer{\_}np}{729}{\code {pthread_cleanup_push_defer_np}} +-\entry{pthread{\_}cleanup{\_}pop{\_}restore{\_}np}{729}{\code {pthread_cleanup_pop_restore_np}} +-\entry{pthread{\_}mutex{\_}init}{730}{\code {pthread_mutex_init}} +-\entry{pthread{\_}mutex{\_}lock}{730}{\code {pthread_mutex_lock}} +-\entry{pthread{\_}mutex{\_}trylock}{730}{\code {pthread_mutex_trylock}} +-\entry{pthread{\_}mutex{\_}unlock}{730}{\code {pthread_mutex_unlock}} +-\entry{pthread{\_}mutex{\_}destroy}{731}{\code {pthread_mutex_destroy}} +-\entry{pthread{\_}mutexattr{\_}init}{731}{\code {pthread_mutexattr_init}} +-\entry{pthread{\_}mutexattr{\_}destroy}{731}{\code {pthread_mutexattr_destroy}} +-\entry{pthread{\_}mutexattr{\_}setkind{\_}np}{732}{\code {pthread_mutexattr_setkind_np}} +-\entry{pthread{\_}mutexattr{\_}getkind{\_}np}{732}{\code {pthread_mutexattr_getkind_np}} +-\entry{pthread{\_}cond{\_}init}{732}{\code {pthread_cond_init}} +-\entry{pthread{\_}cond{\_}signal}{733}{\code {pthread_cond_signal}} +-\entry{pthread{\_}cond{\_}broadcast}{733}{\code {pthread_cond_broadcast}} +-\entry{pthread{\_}cond{\_}wait}{733}{\code {pthread_cond_wait}} +-\entry{pthread{\_}cond{\_}timedwait}{733}{\code {pthread_cond_timedwait}} +-\entry{pthread{\_}cond{\_}destroy}{733}{\code {pthread_cond_destroy}} +-\entry{pthread{\_}condattr{\_}init}{735}{\code {pthread_condattr_init}} +-\entry{pthread{\_}condattr{\_}destroy}{735}{\code {pthread_condattr_destroy}} +-\entry{sem{\_}init}{735}{\code {sem_init}} +-\entry{sem{\_}destroy}{735}{\code {sem_destroy}} +-\entry{sem{\_}wait}{736}{\code {sem_wait}} +-\entry{sem{\_}trywait}{736}{\code {sem_trywait}} +-\entry{sem{\_}post}{736}{\code {sem_post}} +-\entry{sem{\_}getvalue}{736}{\code {sem_getvalue}} +-\entry{pthread{\_}key{\_}create}{737}{\code {pthread_key_create}} +-\entry{pthread{\_}key{\_}delete}{737}{\code {pthread_key_delete}} +-\entry{pthread{\_}setspecific}{737}{\code {pthread_setspecific}} +-\entry{pthread{\_}getspecific}{737}{\code {pthread_getspecific}} +-\entry{pthread{\_}sigmask}{738}{\code {pthread_sigmask}} +-\entry{pthread{\_}kill}{739}{\code {pthread_kill}} +-\entry{sigwait}{739}{\code {sigwait}} +-\entry{pthread{\_}self}{739}{\code {pthread_self}} +-\entry{pthread{\_}equal}{739}{\code {pthread_equal}} +-\entry{pthread{\_}detach}{740}{\code {pthread_detach}} +-\entry{pthread{\_}atfork}{740}{\code {pthread_atfork}} +-\entry{pthread{\_}kill{\_}other{\_}threads{\_}np}{740}{\code {pthread_kill_other_threads_np}} +-\entry{pthread{\_}once}{741}{\code {pthread_once}} +-\entry{pthread{\_}setschedparam}{741}{\code {pthread_setschedparam}} +-\entry{pthread{\_}getschedparam}{741}{\code {pthread_getschedparam}} +-\entry{assert}{743}{\code {assert}} +-\entry{assert{\_}perror}{744}{\code {assert_perror}} +-\entry{va{\_}start}{748}{\code {va_start}} +-\entry{va{\_}arg}{748}{\code {va_arg}} +-\entry{va{\_}end}{748}{\code {va_end}} +-\entry{{\_}{\_}va{\_}copy}{748}{\code {__va_copy}} +-\entry{va{\_}alist}{750}{\code {va_alist}} +-\entry{va{\_}dcl}{750}{\code {va_dcl}} +-\entry{va{\_}start}{750}{\code {va_start}} +-\entry{offsetof}{759}{\code {offsetof}} +diff -Naur ../glibc-2.1.3/manual/libc.fns glibc-2.1.3/manual/libc.fns +--- ../glibc-2.1.3/manual/libc.fns 2000-01-05 19:19:03.000000000 -0800 ++++ glibc-2.1.3/manual/libc.fns 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1157 +0,0 @@ +-\initial {{\_}} +-\entry {\code {__va_copy}}{748} +-\entry {\code {_exit}}{616} +-\entry {\code {_Exit}}{616} +-\entry {\code {_tolower}}{63} +-\entry {\code {_toupper}}{63} +-\initial {A} +-\entry {\code {a64l}}{92} +-\entry {\code {abort}}{616} +-\entry {\code {abs}}{469} +-\entry {\code {accept}}{391} +-\entry {\code {access}}{348} +-\entry {\code {acos}}{442} +-\entry {\code {acosf}}{442} +-\entry {\code {acosh}}{448} +-\entry {\code {acoshf}}{448} +-\entry {\code {acoshl}}{448} +-\entry {\code {acosl}}{442} +-\entry {\code {addmntent}}{696} +-\entry {\code {addseverity}}{267} +-\entry {\code {adjtime}}{492} +-\entry {\code {aio_cancel}}{303} +-\entry {\code {aio_cancel64}}{304} +-\entry {\code {aio_error}}{300} +-\entry {\code {aio_error64}}{300} +-\entry {\code {aio_fsync}}{301} +-\entry {\code {aio_fsync64}}{302} +-\entry {\code {aio_init}}{304} +-\entry {\code {aio_read}}{296} +-\entry {\code {aio_read64}}{297} +-\entry {\code {aio_return}}{300} +-\entry {\code {aio_return64}}{301} +-\entry {\code {aio_suspend}}{302} +-\entry {\code {aio_suspend64}}{303} +-\entry {\code {aio_write}}{297} +-\entry {\code {aio_write64}}{298} +-\entry {\code {alarm}}{515} +-\entry {\code {alloca}}{57} +-\entry {\code {alphasort}}{325} +-\entry {\code {alphasort64}}{326} +-\entry {\code {argp_error}}{591} +-\entry {\code {argp_failure}}{591} +-\entry {\code {argp_help}}{596} +-\entry {\code {argp_parse}}{584} +-\entry {\code {argp_state_help}}{592} +-\entry {\code {argp_usage}}{591} +-\entry {\code {argz_add}}{94} +-\entry {\code {argz_add_sep}}{94} +-\entry {\code {argz_append}}{94} +-\entry {\code {argz_count}}{93} +-\entry {\code {argz_create}}{93} +-\entry {\code {argz_create_sep}}{93} +-\entry {\code {argz_delete}}{94} +-\entry {\code {argz_extract}}{94} +-\entry {\code {argz_insert}}{94} +-\entry {\code {argz_next}}{95} +-\entry {\code {argz_replace}}{95} +-\entry {\code {argz_stringify}}{94} +-\entry {\code {asctime}}{495} +-\entry {\code {asctime_r}}{495} +-\entry {\code {asin}}{442} +-\entry {\code {asinf}}{442} +-\entry {\code {asinh}}{448} +-\entry {\code {asinhf}}{448} +-\entry {\code {asinhl}}{448} +-\entry {\code {asinl}}{442} +-\entry {\code {asprintf}}{231} +-\entry {\code {assert}}{743} +-\entry {\code {assert_perror}}{744} +-\entry {\code {atan}}{442} +-\entry {\code {atan2}}{442} +-\entry {\code {atan2f}}{442} +-\entry {\code {atan2l}}{442} +-\entry {\code {atanf}}{442} +-\entry {\code {atanh}}{448} +-\entry {\code {atanhf}}{448} +-\entry {\code {atanhl}}{448} +-\entry {\code {atanl}}{442} +-\entry {\code {atexit}}{615} +-\entry {\code {atof}}{483} +-\entry {\code {atoi}}{481} +-\entry {\code {atol}}{481} +-\entry {\code {atoll}}{481} +-\initial {B} +-\entry {\code {bcmp}}{83} +-\entry {\code {bcopy}}{80} +-\entry {\code {bind}}{367} +-\entry {\code {bindtextdomain}}{172} +-\entry {\code {bsearch}}{178} +-\entry {\code {btowc}}{104} +-\entry {\code {bzero}}{80} +-\initial {C} +-\entry {\code {cabs}}{469} +-\entry {\code {cabsf}}{469} +-\entry {\code {cabsl}}{469} +-\entry {\code {cacos}}{443} +-\entry {\code {cacosf}}{443} +-\entry {\code {cacosh}}{448} +-\entry {\code {cacoshf}}{448} +-\entry {\code {cacoshl}}{448} +-\entry {\code {cacosl}}{443} +-\entry {\code {calloc}}{35} +-\entry {\code {carg}}{477} +-\entry {\code {cargf}}{477} +-\entry {\code {cargl}}{477} +-\entry {\code {casin}}{443} +-\entry {\code {casinf}}{443} +-\entry {\code {casinh}}{448} +-\entry {\code {casinhf}}{448} +-\entry {\code {casinhl}}{448} +-\entry {\code {casinl}}{443} +-\entry {\code {catan}}{443} +-\entry {\code {catanf}}{443} +-\entry {\code {catanh}}{449} +-\entry {\code {catanhf}}{449} +-\entry {\code {catanhl}}{449} +-\entry {\code {catanl}}{443} +-\entry {\code {catclose}}{162} +-\entry {\code {catgets}}{162} +-\entry {\code {catopen}}{159} +-\entry {\code {cbc_crypt}}{722} +-\entry {\code {cbrt}}{445} +-\entry {\code {cbrtf}}{445} +-\entry {\code {cbrtl}}{445} +-\entry {\code {ccos}}{441} +-\entry {\code {ccosf}}{441} +-\entry {\code {ccosh}}{448} +-\entry {\code {ccoshf}}{448} +-\entry {\code {ccoshl}}{448} +-\entry {\code {ccosl}}{441} +-\entry {\code {ceil}}{471} +-\entry {\code {ceilf}}{471} +-\entry {\code {ceill}}{471} +-\entry {\code {cexp}}{446} +-\entry {\code {cexpf}}{446} +-\entry {\code {cexpl}}{446} +-\entry {\code {cfgetispeed}}{424} +-\entry {\code {cfgetospeed}}{424} +-\entry {\code {cfmakeraw}}{430} +-\entry {\code {cfree}}{34} +-\entry {\code {cfsetispeed}}{424} +-\entry {\code {cfsetospeed}}{424} +-\entry {\code {cfsetspeed}}{424} +-\entry {\code {chdir}}{320} +-\entry {\code {chmod}}{346, 347} +-\entry {\code {chown}}{343} +-\entry {\code {cimag}}{477} +-\entry {\code {cimagf}}{477} +-\entry {\code {cimagl}}{477} +-\entry {\code {clearenv}}{611} +-\entry {\code {clearerr}}{250} +-\entry {\code {clock}}{488} +-\entry {\code {clog}}{446} +-\entry {\code {clog10}}{446} +-\entry {\code {clog10f}}{446} +-\entry {\code {clog10l}}{446} +-\entry {\code {clogf}}{446} +-\entry {\code {clogl}}{446} +-\entry {\code {close}}{273} +-\entry {\code {closedir}}{323} +-\entry {\code {confstr}}{715} +-\entry {\code {conj}}{477} +-\entry {\code {conjf}}{477} +-\entry {\code {conjl}}{477} +-\entry {\code {connect}}{389} +-\entry {\code {copysign}}{473} +-\entry {\code {copysignf}}{473} +-\entry {\code {copysignl}}{473} +-\entry {\code {cos}}{440} +-\entry {\code {cosf}}{440} +-\entry {\code {cosh}}{447} +-\entry {\code {coshf}}{447} +-\entry {\code {coshl}}{447} +-\entry {\code {cosl}}{440} +-\entry {\code {cpow}}{447} +-\entry {\code {cpowf}}{447} +-\entry {\code {cpowl}}{447} +-\entry {\code {cproj}}{478} +-\entry {\code {cprojf}}{478} +-\entry {\code {cprojl}}{478} +-\entry {\code {creal}}{477} +-\entry {\code {crealf}}{477} +-\entry {\code {creall}}{477} +-\entry {\code {creat}}{272} +-\entry {\code {creat64}}{273} +-\entry {\code {crypt}}{718} +-\entry {\code {crypt_r}}{720} +-\entry {\code {csin}}{441} +-\entry {\code {csinf}}{441} +-\entry {\code {csinh}}{447} +-\entry {\code {csinhf}}{447} +-\entry {\code {csinhl}}{447} +-\entry {\code {csinl}}{441} +-\entry {\code {csqrt}}{447} +-\entry {\code {csqrtf}}{447} +-\entry {\code {csqrtl}}{447} +-\entry {\code {ctan}}{441} +-\entry {\code {ctanf}}{441} +-\entry {\code {ctanh}}{448} +-\entry {\code {ctanhf}}{448} +-\entry {\code {ctanhl}}{448} +-\entry {\code {ctanl}}{441} +-\entry {\code {ctermid}}{646} +-\entry {\code {ctime}}{495} +-\entry {\code {ctime_r}}{495} +-\entry {\code {cuserid}}{670} +-\initial {D} +-\entry {\code {dcgettext}}{170} +-\entry {\code {DES_DECRYPT}}{721} +-\entry {\code {DES_ENCRYPT}}{721} +-\entry {\code {DES_FAILED}}{722} +-\entry {\code {DES_HW}}{722} +-\entry {\code {des_setparity}}{722} +-\entry {\code {DES_SW}}{722} +-\entry {\code {DESERR_BADPARAM}}{722} +-\entry {\code {DESERR_HWERROR}}{722} +-\entry {\code {DESERR_NOHWDEVICE}}{722} +-\entry {\code {DESERR_NONE}}{722} +-\entry {\code {dgettext}}{170} +-\entry {\code {difftime}}{490} +-\entry {\code {div}}{478} +-\entry {\code {drand48}}{453} +-\entry {\code {drand48_r}}{455} +-\entry {\code {drem}}{473} +-\entry {\code {dremf}}{473} +-\entry {\code {dreml}}{473} +-\entry {\code {DTTOIF}}{322} +-\entry {\code {dup}}{306} +-\entry {\code {dup2}}{306} +-\initial {E} +-\entry {\code {ecb_crypt}}{721} +-\entry {\code {ecvt}}{484} +-\entry {\code {ecvt_r}}{485} +-\entry {\code {encrypt}}{721} +-\entry {\code {encrypt_r}}{721} +-\entry {\code {endfsent}}{693} +-\entry {\code {endgrent}}{684} +-\entry {\code {endhostent}}{380} +-\entry {\code {endmntent}}{695} +-\entry {\code {endnetent}}{409} +-\entry {\code {endnetgrent}}{687} +-\entry {\code {endprotoent}}{385} +-\entry {\code {endpwent}}{681} +-\entry {\code {endservent}}{382} +-\entry {\code {endutent}}{673} +-\entry {\code {endutxent}}{677} +-\entry {\code {envz_add}}{96} +-\entry {\code {envz_entry}}{95} +-\entry {\code {envz_get}}{96} +-\entry {\code {envz_merge}}{96} +-\entry {\code {envz_strip}}{96} +-\entry {\code {erand48}}{454} +-\entry {\code {erand48_r}}{456} +-\entry {\code {erf}}{449} +-\entry {\code {erfc}}{449} +-\entry {\code {erfcf}}{449} +-\entry {\code {erfcl}}{449} +-\entry {\code {erff}}{449} +-\entry {\code {erfl}}{449} +-\entry {\code {execl}}{622} +-\entry {\code {execle}}{622} +-\entry {\code {execlp}}{623} +-\entry {\code {execv}}{622} +-\entry {\code {execve}}{622} +-\entry {\code {execvp}}{623} +-\entry {\code {exit}}{614} +-\entry {\code {exp}}{443} +-\entry {\code {exp10}}{443} +-\entry {\code {exp10f}}{443} +-\entry {\code {exp10l}}{443} +-\entry {\code {exp2}}{443} +-\entry {\code {exp2f}}{443} +-\entry {\code {exp2l}}{443} +-\entry {\code {expf}}{443} +-\entry {\code {expl}}{443} +-\entry {\code {expm1}}{446} +-\entry {\code {expm1f}}{446} +-\entry {\code {expm1l}}{446} +-\initial {F} +-\entry {\code {fabs}}{469} +-\entry {\code {fabsf}}{469} +-\entry {\code {fabsl}}{469} +-\entry {\code {fchmod}}{347} +-\entry {\code {fchown}}{344} +-\entry {\code {fclean}}{284} +-\entry {\code {fclose}}{214} +-\entry {\code {fcloseall}}{215} +-\entry {\code {fcntl}}{305} +-\entry {\code {fcvt}}{484} +-\entry {\code {fcvt_r}}{485} +-\entry {\code {FD_CLR}}{290} +-\entry {\code {FD_ISSET}}{290} +-\entry {\code {FD_SET}}{290} +-\entry {\code {FD_ZERO}}{290} +-\entry {\code {fdatasync}}{293} +-\entry {\code {fdim}}{476} +-\entry {\code {fdimf}}{476} +-\entry {\code {fdiml}}{476} +-\entry {\code {fdopen}}{282} +-\entry {\code {feclearexcept}}{464} +-\entry {\code {fegetenv}}{468} +-\entry {\code {fegetexceptflag}}{465} +-\entry {\code {fegetround}}{467} +-\entry {\code {feholdexcept}}{468} +-\entry {\code {feof}}{251} +-\entry {\code {ferror}}{251} +-\entry {\code {fesetenv}}{468} +-\entry {\code {fesetexceptflag}}{465} +-\entry {\code {fesetround}}{467} +-\entry {\code {fetestexcept}}{464} +-\entry {\code {feupdateenv}}{468} +-\entry {\code {fflush}}{257} +-\entry {\code {fgetc}}{216} +-\entry {\code {fgetgrent}}{683} +-\entry {\code {fgetgrent_r}}{683} +-\entry {\code {fgetpos}}{255} +-\entry {\code {fgetpos64}}{255} +-\entry {\code {fgetpwent}}{680} +-\entry {\code {fgetpwent_r}}{680} +-\entry {\code {fgets}}{218} +-\entry {\code {fileno}}{283} +-\entry {\code {finite}}{461} +-\entry {\code {finitef}}{461} +-\entry {\code {finitel}}{461} +-\entry {\code {floor}}{471} +-\entry {\code {floorf}}{471} +-\entry {\code {floorl}}{471} +-\entry {\code {fma}}{476} +-\entry {\code {fmaf}}{476} +-\entry {\code {fmal}}{476} +-\entry {\code {fmax}}{476} +-\entry {\code {fmaxf}}{476} +-\entry {\code {fmaxl}}{476} +-\entry {\code {fmemopen}}{259} +-\entry {\code {fmin}}{475} +-\entry {\code {fminf}}{475} +-\entry {\code {fminl}}{475} +-\entry {\code {fmod}}{472} +-\entry {\code {fmodf}}{473} +-\entry {\code {fmodl}}{473} +-\entry {\code {fmtmsg}}{265} +-\entry {\code {fnmatch}}{187} +-\entry {\code {fopen}}{212} +-\entry {\code {fopen64}}{213} +-\entry {\code {fopencookie}}{263} +-\entry {\code {fork}}{621} +-\entry {\code {forkpty}}{437} +-\entry {\code {fpathconf}}{712} +-\entry {\code {fpclassify}}{459} +-\entry {\code {fprintf}}{230} +-\entry {\code {fputc}}{215} +-\entry {\code {fputs}}{216} +-\entry {\code {fread}}{221} +-\entry {\code {free}}{34} +-\entry {\code {freopen}}{214} +-\entry {\code {freopen64}}{214} +-\entry {\code {frexp}}{469} +-\entry {\code {frexpf}}{469} +-\entry {\code {frexpl}}{469} +-\entry {\code {fscanf}}{249} +-\entry {\code {fseek}}{253} +-\entry {\code {fseeko}}{253} +-\entry {\code {fseeko64}}{253} +-\entry {\code {fsetpos}}{256} +-\entry {\code {fsetpos64}}{256} +-\entry {\code {fstat}}{341} +-\entry {\code {fstat64}}{341} +-\entry {\code {fsync}}{292} +-\entry {\code {ftell}}{252} +-\entry {\code {ftello}}{252} +-\entry {\code {ftello64}}{252} +-\entry {\code {ftruncate}}{274, 351} +-\entry {\code {ftruncate64}}{275} +-\entry {\code {ftw}}{329} +-\entry {\code {ftw64}}{329} +-\entry {\code {fwrite}}{221} +-\initial {G} +-\entry {\code {gamma}}{450} +-\entry {\code {gammaf}}{450} +-\entry {\code {gammal}}{450} +-\entry {\code {gcvt}}{484} +-\entry {\code {getc}}{217} +-\entry {\code {getchar}}{217} +-\entry {\code {getcwd}}{319} +-\entry {\code {getdate}}{505} +-\entry {\code {getdate_r}}{507} +-\entry {\code {getdelim}}{218} +-\entry {\code {getegid}}{663} +-\entry {\code {getenv}}{610} +-\entry {\code {geteuid}}{663} +-\entry {\code {getfsent}}{693} +-\entry {\code {getfsfile}}{693} +-\entry {\code {getfsspec}}{693} +-\entry {\code {getgid}}{663} +-\entry {\code {getgrent}}{683} +-\entry {\code {getgrent_r}}{684} +-\entry {\code {getgrgid}}{682} +-\entry {\code {getgrgid_r}}{682} +-\entry {\code {getgrnam}}{682} +-\entry {\code {getgrnam_r}}{683} +-\entry {\code {getgroups}}{663} +-\entry {\code {gethostbyaddr}}{378} +-\entry {\code {gethostbyaddr_r}}{380} +-\entry {\code {gethostbyname}}{378} +-\entry {\code {gethostbyname_r}}{379} +-\entry {\code {gethostbyname2}}{378} +-\entry {\code {gethostbyname2_r}}{380} +-\entry {\code {gethostent}}{380} +-\entry {\code {gethostid}}{689} +-\entry {\code {gethostname}}{689} +-\entry {\code {getitimer}}{514} +-\entry {\code {getline}}{218} +-\entry {\code {getlogin}}{670} +-\entry {\code {getmntent}}{695} +-\entry {\code {getmntent_r}}{696} +-\entry {\code {getnetbyaddr}}{409} +-\entry {\code {getnetbyname}}{409} +-\entry {\code {getnetent}}{409} +-\entry {\code {getnetgrent}}{686} +-\entry {\code {getnetgrent_r}}{686} +-\entry {\code {getopt}}{577} +-\entry {\code {getopt_long}}{581} +-\entry {\code {getpass}}{718} +-\entry {\code {getpeername}}{391} +-\entry {\code {getpgid}}{647} +-\entry {\code {getpgrp}}{647} +-\entry {\code {getpid}}{620} +-\entry {\code {getppid}}{620} +-\entry {\code {getpriority}}{521} +-\entry {\code {getprotobyname}}{384} +-\entry {\code {getprotobynumber}}{384} +-\entry {\code {getprotoent}}{384} +-\entry {\code {getpt}}{434} +-\entry {\code {getpwent}}{681} +-\entry {\code {getpwent_r}}{681} +-\entry {\code {getpwnam}}{680} +-\entry {\code {getpwnam_r}}{680} +-\entry {\code {getpwuid}}{679} +-\entry {\code {getpwuid_r}}{679} +-\entry {\code {getrlimit}}{519} +-\entry {\code {getrlimit64}}{519} +-\entry {\code {getrusage}}{517} +-\entry {\code {gets}}{219} +-\entry {\code {getservbyname}}{382} +-\entry {\code {getservbyport}}{382} +-\entry {\code {getservent}}{382} +-\entry {\code {getsid}}{647} +-\entry {\code {getsockname}}{367} +-\entry {\code {getsockopt}}{406} +-\entry {\code {getsubopt}}{607} +-\entry {\code {gettext}}{169} +-\entry {\code {gettimeofday}}{491} +-\entry {\code {getuid}}{663} +-\entry {\code {getumask}}{347} +-\entry {\code {getutent}}{673} +-\entry {\code {getutent_r}}{674} +-\entry {\code {getutid}}{673} +-\entry {\code {getutid_r}}{674} +-\entry {\code {getutline}}{674} +-\entry {\code {getutline_r}}{675} +-\entry {\code {getutxent}}{677} +-\entry {\code {getutxid}}{677} +-\entry {\code {getutxline}}{677} +-\entry {\code {getw}}{217} +-\entry {\code {getwd}}{320} +-\entry {\code {glob}}{189} +-\entry {\code {globfree}}{193} +-\entry {\code {gmtime}}{494} +-\entry {\code {gmtime_r}}{494} +-\entry {\code {grantpt}}{434} +-\entry {\code {gsignal}}{556} +-\initial {H} +-\entry {\code {hasmntopt}}{696} +-\entry {\code {hcreate}}{182} +-\entry {\code {hcreate_r}}{183} +-\entry {\code {hdestroy}}{182} +-\entry {\code {hdestroy_r}}{183} +-\entry {\code {hsearch}}{183} +-\entry {\code {hsearch_r}}{184} +-\entry {\code {htonl}}{383} +-\entry {\code {htons}}{383} +-\entry {\code {hypot}}{445} +-\entry {\code {hypotf}}{445} +-\entry {\code {hypotl}}{445} +-\initial {I} +-\entry {\code {iconv}}{121} +-\entry {\code {iconv_close}}{120} +-\entry {\code {iconv_open}}{119} +-\entry {\code {if_freenameindex}}{369} +-\entry {\code {if_indextoname}}{368} +-\entry {\code {if_nameindex}}{368} +-\entry {\code {if_nametoindex}}{368} +-\entry {\code {IFTODT}}{321} +-\entry {\code {ilogb}}{444} +-\entry {\code {ilogbf}}{444} +-\entry {\code {ilogbl}}{444} +-\entry {\code {imaxabs}}{469} +-\entry {\code {imaxdiv}}{479} +-\entry {\code {index}}{87} +-\entry {\code {inet_addr}}{376} +-\entry {\code {inet_aton}}{376} +-\entry {\code {inet_lnaof}}{376} +-\entry {\code {inet_makeaddr}}{376} +-\entry {\code {inet_netof}}{377} +-\entry {\code {inet_network}}{376} +-\entry {\code {inet_ntoa}}{376} +-\entry {\code {inet_ntop}}{377} +-\entry {\code {inet_pton}}{377} +-\entry {\code {infnan}}{461} +-\entry {\code {initgroups}}{666} +-\entry {\code {initstate}}{453} +-\entry {\code {innetgr}}{687} +-\entry {\code {ioctl}}{318} +-\entry {\code {isalnum}}{62} +-\entry {\code {isalpha}}{61} +-\entry {\code {isascii}}{63} +-\entry {\code {isatty}}{411} +-\entry {\code {isblank}}{62} +-\entry {\code {iscntrl}}{63} +-\entry {\code {isdigit}}{62} +-\entry {\code {isfinite}}{460} +-\entry {\code {isgraph}}{62} +-\entry {\code {isgreater}}{475} +-\entry {\code {isgreaterequal}}{475} +-\entry {\code {isinf}}{460} +-\entry {\code {isinff}}{460} +-\entry {\code {isinfl}}{460} +-\entry {\code {isless}}{475} +-\entry {\code {islessequal}}{475} +-\entry {\code {islessgreater}}{475} +-\entry {\code {islower}}{61} +-\entry {\code {isnan}}{460} +-\entry {\code {isnanf}}{460} +-\entry {\code {isnanl}}{460} +-\entry {\code {isnormal}}{460} +-\entry {\code {isprint}}{62} +-\entry {\code {ispunct}}{62} +-\entry {\code {isspace}}{62} +-\entry {\code {isunordered}}{475} +-\entry {\code {isupper}}{61} +-\entry {\code {iswalnum}}{65} +-\entry {\code {iswalpha}}{65} +-\entry {\code {iswblank}}{67} +-\entry {\code {iswcntrl}}{65} +-\entry {\code {iswctype}}{64} +-\entry {\code {iswdigit}}{65} +-\entry {\code {iswgraph}}{66} +-\entry {\code {iswlower}}{66} +-\entry {\code {iswprint}}{66} +-\entry {\code {iswpunct}}{66} +-\entry {\code {iswspace}}{66} +-\entry {\code {iswupper}}{67} +-\entry {\code {iswxdigit}}{67} +-\entry {\code {isxdigit}}{62} +-\entry {\code {ITIMER_PROF}}{515} +-\entry {\code {ITIMER_REAL}}{514} +-\entry {\code {ITIMER_VIRTUAL}}{514} +-\initial {J} +-\entry {\code {j0}}{450} +-\entry {\code {j0f}}{450} +-\entry {\code {j0l}}{450} +-\entry {\code {j1}}{450} +-\entry {\code {j1f}}{450} +-\entry {\code {j1l}}{450} +-\entry {\code {jn}}{450} +-\entry {\code {jnf}}{450} +-\entry {\code {jnl}}{450} +-\entry {\code {jrand48}}{454} +-\entry {\code {jrand48_r}}{456} +-\initial {K} +-\entry {\code {kill}}{557} +-\entry {\code {killpg}}{558} +-\initial {L} +-\entry {\code {l64a}}{91} +-\entry {\code {labs}}{469} +-\entry {\code {lcong48}}{455} +-\entry {\code {lcong48_r}}{457} +-\entry {\code {ldexp}}{470} +-\entry {\code {ldexpf}}{470} +-\entry {\code {ldexpl}}{470} +-\entry {\code {ldiv}}{479} +-\entry {\code {lfind}}{177} +-\entry {\code {lgamma}}{449} +-\entry {\code {lgamma_r}}{450} +-\entry {\code {lgammaf}}{449} +-\entry {\code {lgammaf_r}}{450} +-\entry {\code {lgammal}}{449} +-\entry {\code {lgammal_r}}{450} +-\entry {\code {link}}{331} +-\entry {\code {lio_listio}}{298} +-\entry {\code {lio_listio64}}{299} +-\entry {\code {listen}}{390} +-\entry {\code {llabs}}{469} +-\entry {\code {lldiv}}{479} +-\entry {\code {llrint}}{472} +-\entry {\code {llrintf}}{472} +-\entry {\code {llrintl}}{472} +-\entry {\code {llround}}{472} +-\entry {\code {llroundf}}{472} +-\entry {\code {llroundl}}{472} +-\entry {\code {localeconv}}{146} +-\entry {\code {localtime}}{493} +-\entry {\code {localtime_r}}{494} +-\entry {\code {log}}{444} +-\entry {\code {log10}}{444} +-\entry {\code {log10f}}{444} +-\entry {\code {log10l}}{444} +-\entry {\code {log1p}}{446} +-\entry {\code {log1pf}}{446} +-\entry {\code {log1pl}}{446} +-\entry {\code {log2}}{444} +-\entry {\code {log2f}}{444} +-\entry {\code {log2l}}{444} +-\entry {\code {logb}}{444, 470} +-\entry {\code {logbf}}{444, 470} +-\entry {\code {logbl}}{444, 470} +-\entry {\code {logf}}{444} +-\entry {\code {login}}{678} +-\entry {\code {login_tty}}{678} +-\entry {\code {logl}}{444} +-\entry {\code {logout}}{678} +-\entry {\code {logwtmp}}{678} +-\entry {\code {longjmp}}{525} +-\entry {\code {lrand48}}{454} +-\entry {\code {lrand48_r}}{456} +-\entry {\code {lrint}}{472} +-\entry {\code {lrintf}}{472} +-\entry {\code {lrintl}}{472} +-\entry {\code {lround}}{472} +-\entry {\code {lroundf}}{472} +-\entry {\code {lroundl}}{472} +-\entry {\code {lsearch}}{178} +-\entry {\code {lseek}}{280} +-\entry {\code {lseek64}}{281} +-\entry {\code {lstat}}{341} +-\entry {\code {lstat64}}{341} +-\initial {M} +-\entry {\code {main}}{575} +-\entry {\code {mallinfo}}{42} +-\entry {\code {malloc}}{32} +-\entry {\code {mallopt}}{37} +-\entry {\code {matherr}}{461} +-\entry {\code {mblen}}{116} +-\entry {\code {mbrlen}}{106} +-\entry {\code {mbrtowc}}{105} +-\entry {\code {mbsinit}}{103} +-\entry {\code {mbsnrtowcs}}{112} +-\entry {\code {mbsrtowcs}}{110} +-\entry {\code {mbstowcs}}{116} +-\entry {\code {mbtowc}}{115} +-\entry {\code {mcheck}}{37} +-\entry {\code {memalign}}{36} +-\entry {\code {memccpy}}{74} +-\entry {\code {memchr}}{86} +-\entry {\code {memcmp}}{81} +-\entry {\code {memcpy}}{74} +-\entry {\code {memmem}}{88} +-\entry {\code {memmove}}{74} +-\entry {\code {mempcpy}}{74} +-\entry {\code {memset}}{74} +-\entry {\code {mkdir}}{335} +-\entry {\code {mkfifo}}{360} +-\entry {\code {mknod}}{352} +-\entry {\code {mkstemp}}{355} +-\entry {\code {mktemp}}{355} +-\entry {\code {mktime}}{494} +-\entry {\code {mmap}}{286} +-\entry {\code {modf}}{472} +-\entry {\code {modff}}{472} +-\entry {\code {modfl}}{472} +-\entry {\code {mprobe}}{38} +-\entry {\code {mrand48}}{454} +-\entry {\code {mrand48_r}}{456} +-\entry {\code {mremap}}{288} +-\entry {\code {msync}}{288} +-\entry {\code {mtrace}}{43} +-\entry {\code {munmap}}{288} +-\entry {\code {muntrace}}{43} +-\initial {N} +-\entry {\code {nan}}{474} +-\entry {\code {nanf}}{474} +-\entry {\code {nanl}}{474} +-\entry {\code {nanosleep}}{516} +-\entry {\code {nearbyint}}{471} +-\entry {\code {nearbyintf}}{471} +-\entry {\code {nearbyintl}}{471} +-\entry {\code {nextafter}}{474} +-\entry {\code {nextafterf}}{474} +-\entry {\code {nextafterl}}{474} +-\entry {\code {nexttoward}}{474} +-\entry {\code {nexttowardf}}{474} +-\entry {\code {nexttowardl}}{474} +-\entry {\code {nftw}}{329} +-\entry {\code {nftw64}}{330} +-\entry {\code {nice}}{522} +-\entry {\code {nl_langinfo}}{150} +-\entry {\code {notfound}}{653} +-\entry {\code {nrand48}}{454} +-\entry {\code {nrand48_r}}{456} +-\entry {\code {NSS_STATUS_NOTFOUND}}{656} +-\entry {\code {NSS_STATUS_SUCCESS}}{656} +-\entry {\code {NSS_STATUS_TRYAGAIN}}{656} +-\entry {\code {NSS_STATUS_UNAVAIL}}{656} +-\entry {\code {ntohl}}{383} +-\entry {\code {ntohs}}{383} +-\entry {\code {ntp_adjtime}}{513} +-\entry {\code {ntp_gettime}}{511} +-\initial {O} +-\entry {\code {obstack_1grow}}{51} +-\entry {\code {obstack_1grow_fast}}{53} +-\entry {\code {obstack_alignment_mask}}{55} +-\entry {\code {obstack_alloc}}{49} +-\entry {\code {obstack_base}}{54} +-\entry {\code {obstack_blank}}{51} +-\entry {\code {obstack_blank_fast}}{53} +-\entry {\code {obstack_chunk_alloc}}{47} +-\entry {\code {obstack_chunk_free}}{47} +-\entry {\code {obstack_chunk_size}}{56} +-\entry {\code {obstack_copy}}{49} +-\entry {\code {obstack_copy0}}{49} +-\entry {\code {obstack_finish}}{52} +-\entry {\code {obstack_free}}{50} +-\entry {\code {obstack_grow}}{51} +-\entry {\code {obstack_grow0}}{51} +-\entry {\code {obstack_init}}{48} +-\entry {\code {obstack_int_grow}}{52} +-\entry {\code {obstack_int_grow_fast}}{53} +-\entry {\code {obstack_next_free}}{54} +-\entry {\code {obstack_object_size}}{52, 54} +-\entry {\code {obstack_printf}}{231} +-\entry {\code {obstack_ptr_grow}}{52} +-\entry {\code {obstack_ptr_grow_fast}}{53} +-\entry {\code {obstack_room}}{53} +-\entry {\code {obstack_vprintf}}{233} +-\entry {\code {offsetof}}{759} +-\entry {\code {on_exit}}{615} +-\entry {\code {open}}{271} +-\entry {\code {open_memstream}}{260} +-\entry {\code {open_obstack_stream}}{261} +-\entry {\code {open64}}{272} +-\entry {\code {opendir}}{322} +-\entry {\code {openpty}}{436} +-\initial {P} +-\entry {\code {parse_printf_format}}{234} +-\entry {\code {pathconf}}{712} +-\entry {\code {pause}}{567} +-\entry {\code {pclose}}{359} +-\entry {\code {perror}}{27} +-\entry {\code {pipe}}{357} +-\entry {\code {popen}}{359} +-\entry {\code {pow}}{445} +-\entry {\code {pow10}}{443} +-\entry {\code {pow10f}}{443} +-\entry {\code {pow10l}}{443} +-\entry {\code {powf}}{445} +-\entry {\code {powl}}{445} +-\entry {\code {pread}}{276} +-\entry {\code {pread64}}{277} +-\entry {\code {printf}}{230} +-\entry {\code {printf_size}}{241} +-\entry {\code {printf_size_info}}{242} +-\entry {\code {psignal}}{538} +-\entry {\code {pthread_atfork}}{740} +-\entry {\code {pthread_attr_destroy}}{725} +-\entry {\code {pthread_attr_get\var {attr}}}{725} +-\entry {\code {pthread_attr_getinheritsched}}{725} +-\entry {\code {pthread_attr_getschedparam}}{725} +-\entry {\code {pthread_attr_getschedpolicy}}{725} +-\entry {\code {pthread_attr_getscope}}{725} +-\entry {\code {pthread_attr_init}}{724} +-\entry {\code {pthread_attr_set\var {attr}}}{725} +-\entry {\code {pthread_attr_setinheritsched}}{725} +-\entry {\code {pthread_attr_setschedparam}}{725} +-\entry {\code {pthread_attr_setschedpolicy}}{725} +-\entry {\code {pthread_attr_setscope}}{725} +-\entry {\code {pthread_cancel}}{724} +-\entry {\code {pthread_cleanup_pop}}{728} +-\entry {\code {pthread_cleanup_pop_restore_np}}{729} +-\entry {\code {pthread_cleanup_push}}{728} +-\entry {\code {pthread_cleanup_push_defer_np}}{729} +-\entry {\code {pthread_cond_broadcast}}{733} +-\entry {\code {pthread_cond_destroy}}{733} +-\entry {\code {pthread_cond_init}}{732} +-\entry {\code {pthread_cond_signal}}{733} +-\entry {\code {pthread_cond_timedwait}}{733} +-\entry {\code {pthread_cond_wait}}{733} +-\entry {\code {pthread_condattr_destroy}}{735} +-\entry {\code {pthread_condattr_init}}{735} +-\entry {\code {pthread_create}}{723} +-\entry {\code {pthread_detach}}{740} +-\entry {\code {pthread_equal}}{739} +-\entry {\code {pthread_exit}}{723} +-\entry {\code {pthread_getschedparam}}{741} +-\entry {\code {pthread_getspecific}}{737} +-\entry {\code {pthread_join}}{724} +-\entry {\code {pthread_key_create}}{737} +-\entry {\code {pthread_key_delete}}{737} +-\entry {\code {pthread_kill}}{739} +-\entry {\code {pthread_kill_other_threads_np}}{740} +-\entry {\code {pthread_mutex_destroy}}{731} +-\entry {\code {pthread_mutex_init}}{730} +-\entry {\code {pthread_mutex_lock}}{730} +-\entry {\code {pthread_mutex_trylock}}{730} +-\entry {\code {pthread_mutex_unlock}}{730} +-\entry {\code {pthread_mutexattr_destroy}}{731} +-\entry {\code {pthread_mutexattr_getkind_np}}{732} +-\entry {\code {pthread_mutexattr_init}}{731} +-\entry {\code {pthread_mutexattr_setkind_np}}{732} +-\entry {\code {pthread_once}}{741} +-\entry {\code {pthread_self}}{739} +-\entry {\code {pthread_setcancelstate}}{727} +-\entry {\code {pthread_setcanceltype}}{727} +-\entry {\code {pthread_setschedparam}}{741} +-\entry {\code {pthread_setspecific}}{737} +-\entry {\code {pthread_sigmask}}{738} +-\entry {\code {pthread_testcancel}}{727} +-\entry {\code {ptsname}}{435} +-\entry {\code {ptsname_r}}{435} +-\entry {\code {putc}}{215} +-\entry {\code {putchar}}{216} +-\entry {\code {putenv}}{610} +-\entry {\code {putpwent}}{681} +-\entry {\code {puts}}{216} +-\entry {\code {pututline}}{674} +-\entry {\code {pututxline}}{677} +-\entry {\code {putw}}{216} +-\entry {\code {pwrite}}{279} +-\entry {\code {pwrite64}}{279} +-\initial {Q} +-\entry {\code {qecvt}}{484} +-\entry {\code {qecvt_r}}{485} +-\entry {\code {qfcvt}}{484} +-\entry {\code {qfcvt_r}}{485} +-\entry {\code {qgcvt}}{485} +-\entry {\code {qsort}}{178} +-\initial {R} +-\entry {\code {raise}}{556} +-\entry {\code {rand}}{452} +-\entry {\code {rand_r}}{452} +-\entry {\code {random}}{452} +-\entry {\code {read}}{275} +-\entry {\code {readdir}}{323} +-\entry {\code {readdir_r}}{323} +-\entry {\code {readlink}}{332} +-\entry {\code {readv}}{285} +-\entry {\code {realloc}}{35} +-\entry {\code {recv}}{393} +-\entry {\code {recvfrom}}{401} +-\entry {\code {regcomp}}{194} +-\entry {\code {regerror}}{198} +-\entry {\code {regexec}}{195} +-\entry {\code {regfree}}{198} +-\entry {\code {register_printf_function}}{237} +-\entry {\code {remainder}}{473} +-\entry {\code {remainderf}}{473} +-\entry {\code {remainderl}}{473} +-\entry {\code {remove}}{334} +-\entry {\code {rename}}{334} +-\entry {\code {rewind}}{254} +-\entry {\code {rewinddir}}{324} +-\entry {\code {rindex}}{87} +-\entry {\code {rint}}{471} +-\entry {\code {rintf}}{471} +-\entry {\code {rintl}}{471} +-\entry {\code {rmdir}}{334} +-\entry {\code {round}}{472} +-\entry {\code {roundf}}{472} +-\entry {\code {roundl}}{472} +-\initial {S} +-\entry {\code {S_ISBLK}}{342} +-\entry {\code {S_ISCHR}}{342} +-\entry {\code {S_ISDIR}}{342} +-\entry {\code {S_ISFIFO}}{342} +-\entry {\code {S_ISLNK}}{342} +-\entry {\code {S_ISREG}}{342} +-\entry {\code {S_ISSOCK}}{342} +-\entry {\code {scalb}}{470} +-\entry {\code {scalbf}}{470} +-\entry {\code {scalbl}}{470} +-\entry {\code {scalbln}}{470} +-\entry {\code {scalblnf}}{470} +-\entry {\code {scalblnl}}{470} +-\entry {\code {scalbn}}{470} +-\entry {\code {scalbnf}}{470} +-\entry {\code {scalbnl}}{470} +-\entry {\code {scandir}}{325} +-\entry {\code {scandir64}}{325} +-\entry {\code {scanf}}{249} +-\entry {\code {seed48}}{455} +-\entry {\code {seed48_r}}{457} +-\entry {\code {seekdir}}{324} +-\entry {\code {select}}{290} +-\entry {\code {sem_destroy}}{735} +-\entry {\code {sem_getvalue}}{736} +-\entry {\code {sem_init}}{735} +-\entry {\code {sem_post}}{736} +-\entry {\code {sem_trywait}}{736} +-\entry {\code {sem_wait}}{736} +-\entry {\code {send}}{392} +-\entry {\code {sendto}}{401} +-\entry {\code {setbuf}}{259} +-\entry {\code {setbuffer}}{259} +-\entry {\code {setegid}}{665} +-\entry {\code {setenv}}{610} +-\entry {\code {seteuid}}{664} +-\entry {\code {setfsent}}{692} +-\entry {\code {setgid}}{665} +-\entry {\code {setgrent}}{683} +-\entry {\code {setgroups}}{666} +-\entry {\code {sethostent}}{380} +-\entry {\code {sethostid}}{690} +-\entry {\code {sethostname}}{689} +-\entry {\code {setitimer}}{514} +-\entry {\code {setjmp}}{524} +-\entry {\code {setkey}}{721} +-\entry {\code {setkey_r}}{721} +-\entry {\code {setlinebuf}}{259} +-\entry {\code {setlocale}}{143} +-\entry {\code {setmntent}}{695} +-\entry {\code {setnetent}}{409} +-\entry {\code {setnetgrent}}{686} +-\entry {\code {setpgid}}{648} +-\entry {\code {setpgrp}}{648} +-\entry {\code {setpriority}}{522} +-\entry {\code {setprotoent}}{384} +-\entry {\code {setpwent}}{681} +-\entry {\code {setregid}}{665} +-\entry {\code {setreuid}}{665} +-\entry {\code {setrlimit}}{519} +-\entry {\code {setrlimit64}}{519} +-\entry {\code {setservent}}{382} +-\entry {\code {setsid}}{647} +-\entry {\code {setsockopt}}{407} +-\entry {\code {setstate}}{453} +-\entry {\code {settimeofday}}{491} +-\entry {\code {setuid}}{664} +-\entry {\code {setutent}}{673} +-\entry {\code {setutxent}}{677} +-\entry {\code {setvbuf}}{258} +-\entry {\code {shutdown}}{387} +-\entry {\code {sigaction}}{541} +-\entry {\code {sigaddset}}{562} +-\entry {\code {sigaltstack}}{571} +-\entry {\code {sigblock}}{573} +-\entry {\code {sigdelset}}{562} +-\entry {\code {sigemptyset}}{562} +-\entry {\code {sigfillset}}{562} +-\entry {\code {siginterrupt}}{573} +-\entry {\code {sigismember}}{562} +-\entry {\code {siglongjmp}}{526} +-\entry {\code {sigmask}}{573} +-\entry {\code {signal}}{538} +-\entry {\code {signbit}}{474} +-\entry {\code {significand}}{470} +-\entry {\code {significandf}}{470} +-\entry {\code {significandl}}{470} +-\entry {\code {sigpause}}{573} +-\entry {\code {sigpending}}{565} +-\entry {\code {sigprocmask}}{562} +-\entry {\code {sigsetjmp}}{526} +-\entry {\code {sigsetmask}}{573} +-\entry {\code {sigstack}}{571} +-\entry {\code {sigsuspend}}{569} +-\entry {\code {sigvec}}{573} +-\entry {\code {sigwait}}{739} +-\entry {\code {sin}}{440} +-\entry {\code {sincos}}{441} +-\entry {\code {sincosf}}{441} +-\entry {\code {sincosl}}{441} +-\entry {\code {sinf}}{440} +-\entry {\code {sinh}}{447} +-\entry {\code {sinhf}}{447} +-\entry {\code {sinhl}}{447} +-\entry {\code {sinl}}{440} +-\entry {\code {sleep}}{515} +-\entry {\code {snprintf}}{230} +-\entry {\code {socket}}{386} +-\entry {\code {socketpair}}{388} +-\entry {\code {sprintf}}{230} +-\entry {\code {sqrt}}{445} +-\entry {\code {sqrtf}}{445} +-\entry {\code {sqrtl}}{445} +-\entry {\code {srand}}{452} +-\entry {\code {srand48}}{454} +-\entry {\code {srand48_r}}{457} +-\entry {\code {srandom}}{452} +-\entry {\code {sscanf}}{249} +-\entry {\code {ssignal}}{540} +-\entry {\code {stat}}{340} +-\entry {\code {stat64}}{340} +-\entry {\code {stpcpy}}{75} +-\entry {\code {stpncpy}}{76} +-\entry {\code {strcasecmp}}{81} +-\entry {\code {strcat}}{77} +-\entry {\code {strchr}}{86} +-\entry {\code {strcmp}}{81} +-\entry {\code {strcoll}}{84} +-\entry {\code {strcpy}}{74} +-\entry {\code {strcspn}}{88} +-\entry {\code {strdup}}{75} +-\entry {\code {strdupa}}{76} +-\entry {\code {strerror}}{27} +-\entry {\code {strerror_r}}{27} +-\entry {\code {strfmon}}{155} +-\entry {\code {strftime}}{495} +-\entry {\code {strlen}}{72} +-\entry {\code {strncasecmp}}{82} +-\entry {\code {strncat}}{79} +-\entry {\code {strncmp}}{82} +-\entry {\code {strncpy}}{75} +-\entry {\code {strndup}}{75} +-\entry {\code {strndupa}}{77} +-\entry {\code {strnlen}}{73} +-\entry {\code {strpbrk}}{88} +-\entry {\code {strptime}}{500} +-\entry {\code {strrchr}}{87} +-\entry {\code {strsep}}{90} +-\entry {\code {strsignal}}{537} +-\entry {\code {strspn}}{88} +-\entry {\code {strstr}}{87} +-\entry {\code {strtod}}{482} +-\entry {\code {strtof}}{483} +-\entry {\code {strtok}}{88} +-\entry {\code {strtok_r}}{90} +-\entry {\code {strtol}}{480} +-\entry {\code {strtol_l}}{481} +-\entry {\code {strtold}}{483} +-\entry {\code {strtoll}}{481} +-\entry {\code {strtoll_l}}{481} +-\entry {\code {strtoq}}{481} +-\entry {\code {strtoul}}{480} +-\entry {\code {strtoul_l}}{481} +-\entry {\code {strtoull}}{481} +-\entry {\code {strtoull_l}}{481} +-\entry {\code {strtouq}}{481} +-\entry {\code {strverscmp}}{82} +-\entry {\code {strxfrm}}{84} +-\entry {\code {success}}{653} +-\entry {\code {SUN_LEN}}{370} +-\entry {\code {symlink}}{332} +-\entry {\code {sync}}{292} +-\entry {\code {sysconf}}{700} +-\entry {\code {system}}{619} +-\entry {\code {sysv_signal}}{540} +-\initial {T} +-\entry {\code {tan}}{440} +-\entry {\code {tanf}}{440} +-\entry {\code {tanh}}{447} +-\entry {\code {tanhf}}{447} +-\entry {\code {tanhl}}{447} +-\entry {\code {tanl}}{440} +-\entry {\code {tcdrain}}{431} +-\entry {\code {tcflow}}{432} +-\entry {\code {tcflush}}{431} +-\entry {\code {tcgetattr}}{414} +-\entry {\code {tcgetpgrp}}{648} +-\entry {\code {tcgetsid}}{649} +-\entry {\code {tcsendbreak}}{431} +-\entry {\code {tcsetattr}}{414} +-\entry {\code {tcsetpgrp}}{649} +-\entry {\code {tdelete}}{185} +-\entry {\code {tdestroy}}{185} +-\entry {\code {telldir}}{324} +-\entry {\code {TEMP_FAILURE_RETRY}}{555} +-\entry {\code {tempnam}}{354} +-\entry {\code {textdomain}}{172} +-\entry {\code {tfind}}{185} +-\entry {\code {tgamma}}{450} +-\entry {\code {tgammaf}}{450} +-\entry {\code {tgammal}}{450} +-\entry {\code {time}}{490} +-\entry {\code {times}}{489} +-\entry {\code {tmpfile}}{353} +-\entry {\code {tmpfile64}}{353} +-\entry {\code {tmpnam}}{354} +-\entry {\code {tmpnam_r}}{354} +-\entry {\code {toascii}}{63} +-\entry {\code {tolower}}{63} +-\entry {\code {toupper}}{63} +-\entry {\code {towctrans}}{69} +-\entry {\code {towlower}}{69} +-\entry {\code {towupper}}{69} +-\entry {\code {trunc}}{471} +-\entry {\code {truncate}}{274, 351} +-\entry {\code {truncate64}}{274} +-\entry {\code {truncf}}{471} +-\entry {\code {truncl}}{471} +-\entry {\code {tryagain}}{653} +-\entry {\code {tsearch}}{184} +-\entry {\code {ttyname}}{411} +-\entry {\code {ttyname_r}}{411} +-\entry {\code {twalk}}{186} +-\entry {\code {tzset}}{509} +-\initial {U} +-\entry {\code {umask}}{347} +-\entry {\code {uname}}{691} +-\entry {\code {unavail}}{653} +-\entry {\code {ungetc}}{220} +-\entry {\code {unlink}}{333} +-\entry {\code {unlockpt}}{435} +-\entry {\code {unsetenv}}{611} +-\entry {\code {updwtmp}}{675} +-\entry {\code {utime}}{350} +-\entry {\code {utimes}}{350} +-\entry {\code {utmpname}}{675} +-\initial {V} +-\entry {\code {va_alist}}{750} +-\entry {\code {va_arg}}{748} +-\entry {\code {va_dcl}}{750} +-\entry {\code {va_end}}{748} +-\entry {\code {va_start}}{748, 750} +-\entry {\code {valloc}}{36} +-\entry {\code {vasprintf}}{233} +-\entry {\code {versionsort}}{325} +-\entry {\code {versionsort64}}{326} +-\entry {\code {vfork}}{621} +-\entry {\code {vfprintf}}{233} +-\entry {\code {vfscanf}}{250} +-\entry {\code {vprintf}}{232} +-\entry {\code {vscanf}}{250} +-\entry {\code {vsnprintf}}{233} +-\entry {\code {vsprintf}}{233} +-\entry {\code {vsscanf}}{250} +-\initial {W} +-\entry {\code {wait}}{626} +-\entry {\code {wait3}}{628} +-\entry {\code {wait4}}{626} +-\entry {\code {waitpid}}{624} +-\entry {\code {WCOREDUMP}}{627} +-\entry {\code {wcrtomb}}{107} +-\entry {\code {wcsnrtombs}}{112} +-\entry {\code {wcsrtombs}}{111} +-\entry {\code {wcstombs}}{117} +-\entry {\code {wctob}}{105} +-\entry {\code {wctomb}}{115} +-\entry {\code {wctrans}}{68} +-\entry {\code {wctype}}{64} +-\entry {\code {WEXITSTATUS}}{627} +-\entry {\code {WIFEXITED}}{627} +-\entry {\code {WIFSIGNALED}}{627} +-\entry {\code {WIFSTOPPED}}{627} +-\entry {\code {wordexp}}{200} +-\entry {\code {wordfree}}{200} +-\entry {\code {write}}{277} +-\entry {\code {writev}}{285} +-\entry {\code {WSTOPSIG}}{627} +-\entry {\code {WTERMSIG}}{627} +-\initial {Y} +-\entry {\code {y0}}{450} +-\entry {\code {y0f}}{450} +-\entry {\code {y0l}}{450} +-\entry {\code {y1}}{451} +-\entry {\code {y1f}}{451} +-\entry {\code {y1l}}{451} +-\entry {\code {yn}}{451} +-\entry {\code {ynf}}{451} +-\entry {\code {ynl}}{451} +diff -Naur ../glibc-2.1.3/manual/libc.info glibc-2.1.3/manual/libc.info +--- ../glibc-2.1.3/manual/libc.info 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info 1969-12-31 16:00:00.000000000 -0800 +@@ -1,752 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-Indirect: +-libc.info-1: 1298 +-libc.info-2: 57716 +-libc.info-3: 102744 +-libc.info-4: 151031 +-libc.info-5: 199987 +-libc.info-6: 249921 +-libc.info-7: 292606 +-libc.info-8: 339721 +-libc.info-9: 378119 +-libc.info-10: 424741 +-libc.info-11: 468204 +-libc.info-12: 510493 +-libc.info-13: 559332 +-libc.info-14: 606451 +-libc.info-15: 654088 +-libc.info-16: 701144 +-libc.info-17: 750430 +-libc.info-18: 795650 +-libc.info-19: 844918 +-libc.info-20: 894777 +-libc.info-21: 944407 +-libc.info-22: 992882 +-libc.info-23: 1042803 +-libc.info-24: 1090005 +-libc.info-25: 1138647 +-libc.info-26: 1185928 +-libc.info-27: 1232876 +-libc.info-28: 1281524 +-libc.info-29: 1329861 +-libc.info-30: 1374966 +-libc.info-31: 1420048 +-libc.info-32: 1469028 +-libc.info-33: 1518430 +-libc.info-34: 1565374 +-libc.info-35: 1614949 +-libc.info-36: 1663505 +-libc.info-37: 1707438 +-libc.info-38: 1756967 +-libc.info-39: 1806436 +-libc.info-40: 1855417 +-libc.info-41: 1898314 +-libc.info-42: 1942337 +-libc.info-43: 1989010 +-libc.info-44: 2037813 +-libc.info-45: 2050944 +-libc.info-46: 2234131 +-libc.info-47: 2277750 +-libc.info-48: 2322225 +-libc.info-49: 2379317 +-libc.info-50: 2386726 +-libc.info-51: 2457367 +-libc.info-52: 2508837 +- +-Tag Table: +-(Indirect) +-Node: Top1298 +-Node: Introduction57716 +-Node: Getting Started59065 +-Node: Standards and Portability60525 +-Node: ISO C61973 +-Node: POSIX63490 +-Node: Berkeley Unix65231 +-Node: SVID65999 +-Node: XPG67000 +-Node: Using the Library67941 +-Node: Header Files68664 +-Node: Macro Definitions72616 +-Node: Reserved Names74961 +-Node: Feature Test Macros79644 +-Node: Roadmap to the Manual90385 +-Node: Error Reporting97601 +-Node: Checking for Errors98529 +-Node: Error Codes102744 +-Node: Error Messages121761 +-Node: Memory Allocation127458 +-Node: Memory Concepts128350 +-Node: Dynamic Allocation and C129620 +-Node: Unconstrained Allocation131704 +-Node: Basic Allocation133155 +-Node: Malloc Examples134859 +-Node: Freeing after Malloc136810 +-Node: Changing Block Size138626 +-Node: Allocating Cleared Space141229 +-Node: Efficiency and Malloc142237 +-Node: Aligned Memory Blocks143327 +-Node: Malloc Tunable Parameters144707 +-Node: Heap Consistency Checking146370 +-Node: Hooks for Malloc151031 +-Node: Statistics of Malloc155620 +-Node: Summary of Malloc157553 +-Node: Allocation Debugging159677 +-Node: Tracing malloc160821 +-Node: Using the Memory Debugger162677 +-Node: Tips for the Memory Debugger164557 +-Node: Interpreting the traces165892 +-Node: Obstacks169485 +-Node: Creating Obstacks171099 +-Node: Preparing for Obstacks172998 +-Node: Allocation in an Obstack175745 +-Node: Freeing Obstack Objects178153 +-Node: Obstack Functions179489 +-Node: Growing Objects181719 +-Node: Extra Fast Growing185966 +-Node: Status of an Obstack189585 +-Node: Obstacks Data Alignment191004 +-Node: Obstack Chunks192690 +-Node: Summary of Obstacks195046 +-Node: Variable Size Automatic198460 +-Node: Alloca Example199987 +-Node: Advantages of Alloca201104 +-Node: Disadvantages of Alloca202996 +-Node: GNU C Variable-Size Arrays203741 +-Node: Character Handling204899 +-Node: Classification of Characters206365 +-Node: Case Conversion210209 +-Node: Classification of Wide Characters212099 +-Node: Using Wide Char Classes219833 +-Node: Wide Character Case Conversion222191 +-Node: String and Array Utilities224957 +-Node: Representation of Strings226904 +-Node: String/Array Conventions229845 +-Node: String Length231677 +-Node: Copying and Concatenation233667 +-Node: String/Array Comparison249921 +-Node: Collation Functions257337 +-Node: Search Functions264333 +-Node: Finding Tokens in a String269779 +-Node: Encode Binary Data276580 +-Node: Argz and Envz Vectors281238 +-Node: Argz Functions281838 +-Node: Envz Functions288393 +-Node: Character Set Handling291443 +-Node: Extended Char Intro292606 +-Node: Charset Function Overview304759 +-Node: Restartable multibyte conversion305773 +-Node: Selecting the Conversion307885 +-Node: Keeping the state310301 +-Node: Converting a Character313530 +-Node: Converting Strings329668 +-Node: Multibyte Conversion Example339721 +-Node: Non-reentrant Conversion342707 +-Node: Non-reentrant Character Conversion344342 +-Node: Non-reentrant String Conversion349044 +-Node: Shift State352039 +-Node: Generic Charset Conversion354702 +-Node: Generic Conversion Interface357830 +-Node: iconv Examples367685 +-Node: Other iconv Implementations372786 +-Node: glibc iconv Implementation378119 +-Node: Locales417363 +-Node: Effects of Locale418963 +-Node: Choosing Locale420898 +-Node: Locale Categories422276 +-Node: Setting the Locale424741 +-Node: Standard Locales429033 +-Node: Locale Information430326 +-Node: The Lame Way to Locale Data432086 +-Node: General Numeric434052 +-Node: Currency Symbol436983 +-Node: Sign of Money Amount441602 +-Node: The Elegant and Fast Way443915 +-Node: Formatting Numbers455142 +-Node: Message Translation464860 +-Node: Message catalogs a la X/Open466906 +-Node: The catgets Functions468204 +-Node: The message catalog files477313 +-Node: The gencat program484269 +-Node: Common Usage487408 +-Node: The Uniforum approach494531 +-Node: Message catalogs with gettext496025 +-Node: Translation with gettext496723 +-Node: Locating gettext catalog503629 +-Node: Using gettextized software510493 +-Node: Helper programs for gettext518829 +-Node: Searching and Sorting520591 +-Node: Comparison Functions521506 +-Node: Array Search Function522724 +-Node: Array Sort Function526068 +-Node: Search/Sort Example528040 +-Node: Hash Search Function531519 +-Node: Tree Search Function539117 +-Node: Pattern Matching545900 +-Node: Wildcard Matching546702 +-Node: Globbing549580 +-Node: Calling Glob550444 +-Node: Flags for Globbing555802 +-Node: More Flags for Globbing559332 +-Node: Regular Expressions565288 +-Node: POSIX Regexp Compilation566272 +-Node: Flags for POSIX Regexps570387 +-Node: Matching POSIX Regexps571294 +-Node: Regexp Subexpressions573455 +-Node: Subexpression Complications575509 +-Node: Regexp Cleanup577872 +-Node: Word Expansion580198 +-Node: Expansion Stages581553 +-Node: Calling Wordexp583046 +-Node: Flags for Wordexp587009 +-Node: Wordexp Example588962 +-Node: Tilde Expansion590758 +-Node: Variable Substitution591830 +-Node: I/O Overview595945 +-Node: I/O Concepts597458 +-Node: Streams and File Descriptors598603 +-Node: File Position601694 +-Node: File Names603828 +-Node: Directories604714 +-Node: File Name Resolution606451 +-Node: File Name Errors609380 +-Node: File Name Portability610920 +-Node: I/O on Streams612912 +-Node: Streams614935 +-Node: Standard Streams616276 +-Node: Opening Streams617942 +-Node: Closing Streams625469 +-Node: Simple Output628006 +-Node: Character Input630342 +-Node: Line Input633451 +-Node: Unreading638439 +-Node: Unreading Idea639248 +-Node: How Unread640074 +-Node: Block Input/Output642572 +-Node: Formatted Output644801 +-Node: Formatted Output Basics646568 +-Node: Output Conversion Syntax649061 +-Node: Table of Output Conversions654088 +-Node: Integer Conversions656887 +-Node: Floating-Point Conversions662228 +-Node: Other Output Conversions668023 +-Node: Formatted Output Functions671183 +-Node: Dynamic Output675325 +-Node: Variable Arguments Output676962 +-Node: Parsing a Template String682496 +-Node: Example of Parsing686323 +-Node: Customizing Printf688611 +-Node: Registering New Conversions690530 +-Node: Conversion Specifier Options692521 +-Node: Defining the Output Handler696274 +-Node: Printf Extension Example698741 +-Node: Predefined Printf Handlers701144 +-Node: Formatted Input704789 +-Node: Formatted Input Basics705868 +-Node: Input Conversion Syntax708548 +-Node: Table of Input Conversions711911 +-Node: Numeric Input Conversions714208 +-Node: String Input Conversions718452 +-Node: Dynamic String Input722545 +-Node: Other Input Conversions723735 +-Node: Formatted Input Functions725387 +-Node: Variable Arguments Input726953 +-Node: EOF and Errors728588 +-Node: Binary Streams730808 +-Node: File Positioning733332 +-Node: Portable Positioning740445 +-Node: Stream Buffering745986 +-Node: Buffering Concepts747571 +-Node: Flushing Buffers748934 +-Node: Controlling Buffering750430 +-Node: Other Kinds of Streams754865 +-Node: String Streams756154 +-Node: Obstack Streams760292 +-Node: Custom Streams762343 +-Node: Streams and Cookies762996 +-Node: Hook Functions766066 +-Node: Formatted Messages768452 +-Node: Printing Formatted Messages769117 +-Node: Adding Severity Classes775561 +-Node: Example777154 +-Node: Low-Level I/O780379 +-Node: Opening and Closing Files783453 +-Node: Truncating Files791434 +-Node: I/O Primitives795650 +-Node: File Position Primitive809767 +-Node: Descriptors and Streams817073 +-Node: Stream/Descriptor Precautions819491 +-Node: Linked Channels820697 +-Node: Independent Channels821925 +-Node: Cleaning Streams823828 +-Node: Scatter-Gather826031 +-Node: Memory-mapped I/O828620 +-Node: Waiting for I/O837175 +-Node: Synchronizing I/O844918 +-Node: Asynchronous I/O848390 +-Node: Asynchronous Reads/Writes856454 +-Node: Status of AIO Operations868913 +-Node: Synchronizing AIO Operations872478 +-Node: Cancel AIO Operations878869 +-Node: Configuration of AIO882330 +-Node: Control Operations884426 +-Node: Duplicating Descriptors887115 +-Node: Descriptor Flags891375 +-Node: File Status Flags894777 +-Node: Access Modes896231 +-Node: Open-time Flags898520 +-Node: Operating Modes903237 +-Node: Getting File Status Flags906003 +-Node: File Locks908610 +-Node: Interrupt Input917507 +-Node: IOCTLs919939 +-Node: File System Interface922015 +-Node: Working Directory923544 +-Node: Accessing Directories927267 +-Node: Directory Entries928692 +-Node: Opening a Directory931534 +-Node: Reading/Closing Directory933226 +-Node: Simple Directory Lister936279 +-Node: Random Access Directory937298 +-Node: Scanning Directory Content938800 +-Node: Simple Directory Lister Mark II943286 +-Node: Working on Directory Trees944407 +-Node: Hard Links956252 +-Node: Symbolic Links959046 +-Node: Deleting Files962812 +-Node: Renaming Files965742 +-Node: Creating Directories969369 +-Node: File Attributes971117 +-Node: Attribute Meanings972667 +-Node: Reading Attributes981888 +-Node: Testing File Type985972 +-Node: File Owner989189 +-Node: Permission Bits992882 +-Node: Access Permission998199 +-Node: Setting Permissions999349 +-Node: Testing File Access1004596 +-Node: File Times1008239 +-Node: File Size1012770 +-Node: Making Special Files1016909 +-Node: Temporary Files1018586 +-Node: Pipes and FIFOs1026473 +-Node: Creating a Pipe1028056 +-Node: Pipe to a Subprocess1031209 +-Node: FIFO Special Files1034049 +-Node: Pipe Atomicity1035622 +-Node: Sockets1036506 +-Node: Socket Concepts1038553 +-Node: Communication Styles1042803 +-Node: Socket Addresses1044655 +-Node: Address Formats1046694 +-Node: Setting Address1049662 +-Node: Reading Address1051385 +-Node: Interface Naming1053146 +-Node: Local Namespace1055554 +-Node: Local Namespace Concepts1056214 +-Node: Local Namespace Details1057821 +-Node: Local Socket Example1059768 +-Node: Internet Namespace1061193 +-Node: Internet Address Formats1063425 +-Node: Host Addresses1065580 +-Node: Abstract Host Addresses1066762 +-Node: Host Address Data Type1071287 +-Node: Host Address Functions1074411 +-Node: Host Names1078774 +-Node: Ports1087967 +-Node: Services Database1090005 +-Node: Byte Order1092829 +-Node: Protocols Database1095149 +-Node: Inet Example1098690 +-Node: Misc Namespaces1100700 +-Node: Open/Close Sockets1101450 +-Node: Creating a Socket1101948 +-Node: Closing a Socket1103624 +-Node: Socket Pairs1105154 +-Node: Connections1107166 +-Node: Connecting1108260 +-Node: Listening1111099 +-Node: Accepting Connections1113185 +-Node: Who is Connected1116324 +-Node: Transferring Data1117423 +-Node: Sending Data1118533 +-Node: Receiving Data1121061 +-Node: Socket Data Options1122805 +-Node: Byte Stream Example1123668 +-Node: Server Example1125725 +-Node: Out-of-Band Data1129742 +-Node: Datagrams1135677 +-Node: Sending Datagrams1136707 +-Node: Receiving Datagrams1138647 +-Node: Datagram Example1140733 +-Node: Example Receiver1142748 +-Node: Inetd1145316 +-Node: Inetd Servers1146124 +-Node: Configuring Inetd1147367 +-Node: Socket Options1150041 +-Node: Socket Option Functions1150749 +-Node: Socket-Level Options1152314 +-Node: Networks Database1155943 +-Node: Low-Level Terminal Interface1158828 +-Node: Is It a Terminal1160226 +-Node: I/O Queues1162129 +-Node: Canonical or Not1164087 +-Node: Terminal Modes1165934 +-Node: Mode Data Types1167210 +-Node: Mode Functions1169038 +-Node: Setting Modes1172970 +-Node: Input Modes1174958 +-Node: Output Modes1180225 +-Node: Control Modes1181838 +-Node: Local Modes1185928 +-Node: Line Speed1192242 +-Node: Special Characters1196419 +-Node: Editing Characters1198333 +-Node: Signal Characters1202674 +-Node: Start/Stop Characters1205543 +-Node: Other Special1207414 +-Node: Noncanonical Input1209228 +-Node: Line Control1214041 +-Node: Noncanon Example1218753 +-Node: Pseudo-Terminals1220973 +-Node: Allocation1221885 +-Node: Pseudo-Terminal Pairs1226676 +-Node: Mathematics1229195 +-Node: Mathematical Constants1230868 +-Node: Trig Functions1232876 +-Node: Inverse Trig Functions1236612 +-Node: Exponents and Logarithms1240416 +-Node: Hyperbolic Functions1248606 +-Node: Special Functions1252646 +-Node: Pseudo-Random Numbers1257155 +-Node: ISO Random1259386 +-Node: BSD Random1261318 +-Node: SVID Random1263499 +-Node: FP Function Optimizations1276673 +-Node: Arithmetic1278593 +-Node: Floating Point Numbers1279807 +-Node: Floating Point Classes1281524 +-Node: Floating Point Errors1285923 +-Node: FP Exceptions1286420 +-Node: Infinity and NaN1290781 +-Node: Status bit operations1293856 +-Node: Math Error Reporting1297118 +-Node: Rounding1299444 +-Node: Control Functions1303033 +-Node: Arithmetic Functions1306263 +-Node: Absolute Value1307131 +-Node: Normalization Functions1309123 +-Node: Rounding Functions1313197 +-Node: Remainder Functions1317442 +-Node: FP Bit Twiddling1319586 +-Node: FP Comparison Functions1322699 +-Node: Misc FP Arithmetic1325413 +-Node: Complex Numbers1328155 +-Node: Operations on Complex1329861 +-Node: Integer Division1332204 +-Node: Parsing of Numbers1335761 +-Node: Parsing of Integers1336448 +-Node: Parsing of Floats1343367 +-Node: System V Number Conversion1347034 +-Node: Date and Time1352350 +-Node: Processor Time1353591 +-Node: Basic CPU Time1354349 +-Node: Detailed CPU Time1356604 +-Node: Calendar Time1359069 +-Node: Simple Calendar Time1360787 +-Node: High-Resolution Calendar1362544 +-Node: Broken-down Time1368264 +-Node: Formatting Date and Time1374966 +-Node: Parsing Date and Time1388408 +-Node: Low-Level Time String Parsing1389243 +-Node: General Time String Parsing1402603 +-Node: TZ Variable1410035 +-Node: Time Zone Functions1416088 +-Node: Time Functions Example1418933 +-Node: Precision Time1420048 +-Node: Setting an Alarm1426515 +-Node: Sleeping1431743 +-Node: Resource Usage1435987 +-Node: Limits on Resources1439498 +-Node: Priority1446161 +-Node: Non-Local Exits1449422 +-Node: Non-Local Intro1450041 +-Node: Non-Local Details1453768 +-Node: Non-Local Exits and Signals1456844 +-Node: Signal Handling1458315 +-Node: Concepts of Signals1460350 +-Node: Kinds of Signals1460914 +-Node: Signal Generation1462311 +-Node: Delivery of Signal1464578 +-Node: Standard Signals1467435 +-Node: Program Error Signals1469028 +-Node: Termination Signals1476486 +-Node: Alarm Signals1480324 +-Node: Asynchronous I/O Signals1481564 +-Node: Job Control Signals1482755 +-Node: Operation Error Signals1487358 +-Node: Miscellaneous Signals1489297 +-Node: Signal Messages1490992 +-Node: Signal Actions1492878 +-Node: Basic Signal Handling1493823 +-Node: Advanced Signal Handling1499892 +-Node: Signal and Sigaction1502848 +-Node: Sigaction Function Example1504600 +-Node: Flags for Sigaction1506916 +-Node: Initial Signal Actions1509294 +-Node: Defining Handlers1510677 +-Node: Handler Returns1512862 +-Node: Termination in Handler1514912 +-Node: Longjmp in Handler1516335 +-Node: Signals in Handler1518430 +-Node: Merged Signals1520550 +-Node: Nonreentrancy1526260 +-Node: Atomic Data Access1531678 +-Node: Non-atomic Example1532714 +-Node: Atomic Types1534485 +-Node: Atomic Usage1535493 +-Node: Interrupted Primitives1536963 +-Node: Generating Signals1540263 +-Node: Signaling Yourself1540856 +-Node: Signaling Another Process1542834 +-Node: Permission for kill1546210 +-Node: Kill Example1548006 +-Node: Blocking Signals1550350 +-Node: Why Block1552122 +-Node: Signal Sets1553659 +-Node: Process Signal Mask1556685 +-Node: Testing for Delivery1559693 +-Node: Blocking for Handler1560943 +-Node: Checking for Pending Signals1563362 +-Node: Remembering a Signal1565374 +-Node: Waiting for a Signal1568923 +-Node: Using Pause1569468 +-Node: Pause Problems1571092 +-Node: Sigsuspend1572816 +-Node: Signal Stack1575526 +-Node: BSD Signal Handling1580863 +-Node: BSD Handler1582137 +-Node: Blocking in BSD1584571 +-Node: Process Startup1586025 +-Node: Program Arguments1587060 +-Node: Argument Syntax1589058 +-Node: Parsing Program Arguments1591735 +-Node: Getopt1592840 +-Node: Using Getopt1593478 +-Node: Example of Getopt1596859 +-Node: Getopt Long Options1599583 +-Node: Getopt Long Option Example1603685 +-Node: Argp1606556 +-Node: Argp Global Variables1609812 +-Node: Argp Parsers1611832 +-Node: Argp Option Vectors1614949 +-Node: Argp Option Flags1618186 +-Node: Argp Parser Functions1620204 +-Node: Argp Special Keys1622907 +-Node: Argp Helper Functions1627998 +-Node: Argp Parsing State1631059 +-Node: Argp Children1634580 +-Node: Argp Flags1636641 +-Node: Argp Help Filtering1638958 +-Node: Argp Help Filter Keys1640175 +-Node: Argp Help1641049 +-Node: Argp Help Flags1642238 +-Node: Argp Examples1644534 +-Node: Argp Example 11645004 +-Node: Argp Example 21645808 +-Node: Argp Example 31648753 +-Node: Argp Example 41655801 +-Node: Argp User Customization1663505 +-Node: Suboptions1665118 +-Node: Suboptions Example1667060 +-Node: Environment Variables1669163 +-Node: Environment Access1671036 +-Node: Standard Environment1675277 +-Node: Program Termination1679453 +-Node: Normal Termination1680672 +-Node: Exit Status1681898 +-Node: Cleanups on Exit1684919 +-Node: Aborting a Program1686736 +-Node: Termination Internals1687635 +-Node: Processes1689756 +-Node: Running a Command1691779 +-Node: Process Creation Concepts1693846 +-Node: Process Identification1695856 +-Node: Creating a Process1696780 +-Node: Executing a File1700403 +-Node: Process Completion1707438 +-Node: Process Completion Status1713704 +-Node: BSD Wait Functions1715348 +-Node: Process Creation Example1717216 +-Node: Job Control1719466 +-Node: Concepts of Job Control1720746 +-Node: Job Control is Optional1724103 +-Node: Controlling Terminal1725153 +-Node: Access to the Terminal1726060 +-Node: Orphaned Process Groups1727664 +-Node: Implementing a Shell1728656 +-Node: Data Structures1729539 +-Node: Initializing the Shell1732182 +-Node: Launching Jobs1735918 +-Node: Foreground and Background1743371 +-Node: Stopped and Terminated Jobs1746480 +-Node: Continuing Stopped Jobs1751662 +-Node: Missing Pieces1753289 +-Node: Functions for Job Control1754913 +-Node: Identifying the Terminal1755393 +-Node: Process Group Functions1756967 +-Node: Terminal Access Functions1761978 +-Node: Name Service Switch1765452 +-Node: NSS Basics1766783 +-Node: NSS Configuration File1768379 +-Node: Services in the NSS configuration1770077 +-Node: Actions in the NSS configuration1771358 +-Node: Notes on NSS Configuration File1774519 +-Node: NSS Module Internals1776396 +-Node: NSS Module Names1777092 +-Node: NSS Modules Interface1779467 +-Node: Extending NSS1784266 +-Node: Adding another Service to NSS1785197 +-Node: NSS Module Function Internals1787423 +-Node: Users and Groups1792330 +-Node: User and Group IDs1794942 +-Node: Process Persona1795850 +-Node: Why Change Persona1797535 +-Node: How Change Persona1799416 +-Node: Reading Persona1801303 +-Node: Setting User ID1803573 +-Node: Setting Groups1806436 +-Node: Enable/Disable Setuid1810538 +-Node: Setuid Program Example1812572 +-Node: Tips for Setuid1816026 +-Node: Who Logged In1818543 +-Node: User Accounting Database1820924 +-Node: Manipulating the Database1822108 +-Node: XPG Functions1834434 +-Node: Logging In and Out1838097 +-Node: User Database1840213 +-Node: User Data Structure1840875 +-Node: Lookup User1842132 +-Node: Scanning All Users1844695 +-Node: Writing a User Entry1847649 +-Node: Group Database1848548 +-Node: Group Data Structure1849124 +-Node: Lookup Group1849887 +-Node: Scanning All Groups1852387 +-Node: Database Example1855417 +-Node: Netgroup Database1857614 +-Node: Netgroup Data1858025 +-Node: Lookup Netgroup1859542 +-Node: Netgroup Membership1862954 +-Node: System Information1864284 +-Node: Host Identification1864948 +-Node: Hardware/Software Type ID1868167 +-Node: Filesystem handling1870894 +-Node: System Configuration1886625 +-Node: General Limits1888198 +-Node: System Options1891837 +-Node: Version Supported1895169 +-Node: Sysconf1897006 +-Node: Sysconf Definition1897642 +-Node: Constants for Sysconf1898314 +-Node: Examples of Sysconf1910834 +-Node: Minimums1911827 +-Node: Limits for Files1914538 +-Node: Options for Files1917540 +-Node: File Minimums1919829 +-Node: Pathconf1921608 +-Node: Utility Limits1924562 +-Node: Utility Minimums1926492 +-Node: String Parameters1928244 +-Node: Cryptographic Functions1932152 +-Node: Legal Problems1934274 +-Node: getpass1936419 +-Node: crypt1937323 +-Node: DES Encryption1942337 +-Node: POSIX Threads1948750 +-Node: Basic Thread Operations1950127 +-Node: Thread Attributes1954713 +-Node: Cancellation1960007 +-Node: Cleanup Handlers1964059 +-Node: Mutexes1969197 +-Node: Condition Variables1977752 +-Node: POSIX Semaphores1985128 +-Node: Thread-Specific Data1989010 +-Node: Threads and Signal Handling1993643 +-Node: Miscellaneous Thread Functions1997347 +-Node: Language Features2004706 +-Node: Consistency Checking2005630 +-Node: Variadic Functions2010268 +-Node: Why Variadic2011340 +-Node: How Variadic2013305 +-Node: Variadic Prototypes2014594 +-Node: Receiving Arguments2015752 +-Node: How Many Arguments2018466 +-Node: Calling Variadics2020137 +-Node: Argument Macros2022274 +-Node: Variadic Example2025044 +-Node: Old Varargs2026196 +-Node: Null Pointer Constant2027871 +-Node: Important Data Types2028956 +-Node: Data Type Measurements2031522 +-Node: Width of Type2032379 +-Node: Range of Type2033285 +-Node: Floating Type Macros2036553 +-Node: Floating Point Concepts2037813 +-Node: Floating Point Parameters2041548 +-Node: IEEE Floating Point2048496 +-Node: Structure Measurement2050249 +-Node: Library Summary2050944 +-Node: Installation2234131 +-Node: Configuring and compiling2236199 +-Node: Running make install2243896 +-Node: Tools for Compilation2247584 +-Node: Supported Configurations2251078 +-Node: Linux2253073 +-Node: Reporting Bugs2255216 +-Node: Maintenance2258061 +-Node: Source Layout2258444 +-Node: Porting2262377 +-Node: Hierarchy Conventions2270678 +-Node: Porting to Unix2275735 +-Node: Contributors2277750 +-Node: Copying2295328 +-Node: Concept Index2322225 +-Node: Type Index2379317 +-Node: Function Index2386726 +-Node: Variable Index2457367 +-Node: File Index2508837 +- +-End Tag Table +diff -Naur ../glibc-2.1.3/manual/libc.info-1 glibc-2.1.3/manual/libc.info-1 +--- ../glibc-2.1.3/manual/libc.info-1 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-1 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1258 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Top, Next: Introduction, Prev: (dir), Up: (dir) +- +-Main Menu +-********* +- +- This is Edition 0.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta of the GNU C Library. +- +-* Menu: +- +-* Introduction:: Purpose of the GNU C Library. +-* Error Reporting:: How library functions report errors. +-* Memory Allocation:: Allocating memory dynamically and +- manipulating it via pointers. +-* 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. +-* 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. +-* Non-Local Exits:: Jumping out of nested function calls. +-* Signal Handling:: How to send, block, and handle signals. +-* Process Startup:: 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 Information:: Getting information about the hardware and +- operating system. +-* System Configuration:: Parameters describing operating system +- limits. +- +-Add-ons +- +-* Cryptographic Functions:: DES encryption and password handling. +-* 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. +-* Copying:: The GNU Library General Public License says +- how you can copy and share the GNU C Library. +- +-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 Allocation +- +-* Memory Concepts:: An introduction to concepts and terminology. +-* Dynamic 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: +- `memalign' and `valloc'. +-* 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. +- +-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. +-* 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. +- +-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. +-* 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. +-* 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. +-* 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. +-* Truncating Files:: Change the size of a file. +-* 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 discontinous 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:: Cancelation 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 on 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. +-* 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. +- +-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. +-* 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 +- +-* 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. +-* Integer Division:: Integer division with guaranteed rounding. +-* 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 +- +-* Processor Time:: Measures processor time used by a program. +-* Calendar Time:: Manipulation of "real" dates and times. +-* Precision Time:: Manipulation and monitoring of high accuracy +- time. +-* Setting an Alarm:: Sending a signal after a specified time. +-* Sleeping:: Waiting for a period of time. +-* Resource Usage:: Measuring various resources used. +-* Limits on Resources:: Specifying limits on resource usage. +-* Priority:: Reading or setting process run priority. +- +-Processor Time +- +-* Basic CPU Time:: The `clock' function. +-* Detailed CPU 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. +-* Formatting Date and 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. +- +-Non-Local Exits +- +-* Intro: Non-Local Intro. When and how to use these facilities. +-* Details: Non-Local Details. Functions for nonlocal exits. +-* Non-Local Exits and Signals:: Portability issues. +- +-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. +- +-Process Startup +- +-* Program Arguments:: Parsing your program's command-line arguments. +-* Environment Variables:: How to access parameters inherited from +- a parent process. +-* Program Termination:: How to cause a process to terminate and +- return status information to its parent. +- +-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 Information +- +-* Host Identification:: Determining the name of the machine. +-* Hardware/Software Type ID:: Determining the hardware type of the +- machine and what operating system it is +- running. +-* Filesystem handling:: Which is mounted and/or available? +- +-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 UNIX passwords. +-* DES Encryption:: Routines for DES encryption. +- +-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 +- cancelled. +-* 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. +-* 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 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 -Naur ../glibc-2.1.3/manual/libc.info-10 glibc-2.1.3/manual/libc.info-10 +--- ../glibc-2.1.3/manual/libc.info-10 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-10 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1071 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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. +- +- If CATEGORY is `LC_ALL', this specifies the locale for all +- purposes. The other possible values of CATEGORY specify an +- individual 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'. +- +- 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 ensure to be able to use the string encoding the currently +- selected locale at a later time one has to make a copy of the +- string. It is not guaranteed that the return value stays valid +- all the 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 the locale with this name +- is used, if this is 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 <stddef.h> +- #include <locale.h> +- #include <stdlib.h> +- #include <string.h> +- +- 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 XXX. +- +- 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 the Locale Information +-================================ +- +- There are several ways to access the locale information. The +-simplest way is to let the C library itself do the work. Several of the +-functions in this library access implicitly the locale data and use +-what information is available in 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 Date and Time::.). +-Part of the standard information contained in the `LC_TIME' category +-are, e.g., 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. When using `%A' in the format string +-this will be replaced by the appropriate weekday name of the locale +-currently selected for `LC_TIME'. This is the easy part and wherever +-possible functions do things automatically as in this case. +- +- But there are quite often situations when there is simply no +-functions 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 +-`localeconv' function. It is a masterpiece of misdesign. It is +-expensive to use, it is not extendable, and is not generally usable as +-it provides access only to the `LC_MONETARY' and `LC_NUMERIC' related +-information. If it is applicable for a certain situation it should +-nevertheless be used since it is very portable. In general it is +-better to use the function `strfmon' which can be used to format +-monetary amounts correctly according to the selected locale by +-implicitly 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 +- This is the data type of the value returned by `localeconv'. 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 string is made up of decimal numbers separated by semicolons. +- Successive numbers (from left to right) give the sizes of +- successive groups (from right to left, starting at the decimal +- point). The last number in the string is used over and over for +- all the remaining groups. +- +- If the last integer is `-1', it means that there is no more +- grouping--or, put another way, any remaining digits form one large +- group without separators. +- +- For example, if `grouping' is `"4;3;2"', 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 `"3"' 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 the 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 found +- in the appropriate member. +- +-`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 found +- in the appropriate member. +- +-`char p_cs_precedes' +-`char n_cs_precedes' +- These members are `1' if the `currency_symbol' string should +- precede the value of a monetary amount, or `0' if the string should +- follow the value. The `p_cs_precedes' member applies to positive +- amounts (or zero), and the `n_cs_precedes' member applies to +- negative amounts. +- +- In the standard `C' locale, both 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, but we recommend printing the +- currency symbol before the amount. That's right for most +- countries. In other words, treat all nonzero values alike in +- these members. +- +- The POSIX standard says that these two members apply to the +- `int_curr_symbol' as well as the `currency_symbol'. The ISO C +- standard seems to imply that they should apply only to the +- `currency_symbol'--so the `int_curr_symbol' should always precede +- the amount. +- +- We can only guess which of these (if either) matches the usual +- conventions for printing international currency symbols. Our +- guess is that they should always precede the amount. If we find +- out a reliable answer, we will put it here. +- +-`char p_sep_by_space' +-`char n_sep_by_space' +- These members are `1' if a space should appear between the +- `currency_symbol' string and the amount, or `0' if no space should +- appear. The `p_sep_by_space' member applies to positive amounts +- (or zero), and the `n_sep_by_space' member applies to negative +- amounts. +- +- In the standard `C' locale, both 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 one (print a space). In other words, treat all nonzero +- values alike in these members. +- +- These members apply only to `currency_symbol'. When you use +- `int_curr_symbol', you never print an additional space, because +- `int_curr_symbol' itself contains the appropriate separator. +- +- The POSIX standard says that these two members apply to the +- `int_curr_symbol' as well as the `currency_symbol'. But an +- example in the ISO C standard clearly implies that they should +- apply only to the `currency_symbol'--that the `int_curr_symbol' +- contains any appropriate separator, so you should never print an +- additional space. +- +- Based on what we know now, we recommend you ignore these members +- when printing international currency symbols, and print no extra +- space. +- +- +-File: libc.info, Node: Sign of Money Amount, Prev: Currency Symbol, Up: The Lame Way to Locale Data +- +-Printing the Sign of an Amount of Money +-....................................... +- +- These members of the `struct lconv' structure specify how to print +-the sign (if any) in a monetary value. +- +-`char *positive_sign' +-`char *negative_sign' +- These are strings used to indicate positive (or zero) and negative +- (respectively) monetary quantities. +- +- 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' +- These members have values that are small integers indicating 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. +- +- It is not clear whether you should let these members apply to the +-international currency format or not. POSIX says you should, but +-intuition plus the examples in the ISO C standard suggest you should +-not. We hope that someone who knows well the conventions for formatting +-monetary quantities will tell us what we should recommend. +- +- +-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 +-the locale information. The information which was meant to be available +-in the locale (as later specified in the POSIX.1 standard) requires more +-possibilities 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. I.e., unlike the `localeconv' +- function which always returns all the information `nl_langinfo' +- lets the caller select what information is necessary. This is very +- fast and it is no problem to call this function multiple times. +- +- The second advantage is that not only the numeric and monetary +- formatting information is available. Also the information of 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 values which must be one of the values defined in the +- header `langinfo.h'. The X/Open standard defines the following +- values: +- +- `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 for the month names. +- `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 time +- representation which uses to American 1 to 12 hours plus +- am/pm representation. +- +- Please note that in locales which do not know this time +- representation these strings actually might be empty and +- therefore 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 using the American-style am/pm +- format. +- +- Please note that if the am/pm format does not make any sense +- for the selected locale the returned value might be the same +- as the one for `T_FMT'. +- +- `ERA' +- The return value is value representing the eras of time used +- in the current locale. +- +- Most locales do not define this value. An example for a +- locale which does define this value is the Japanese. Here +- the traditional data representation is based on the eras +- measured by the reigns of the emperors. +- +- Normally it should not be necessary to use this value +- directly. Using the `E' modifier for its formats the +- `strftime' functions can be made to use this information. +- The format of the returned string is not specified and +- therefore one should not generalize the knowledge about the +- representation on one system. +- +- `ERA_YEAR' +- The return value describes the name years for the eras of +- this 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 time and date using the era +- representation in a locale specific way. +- +- `ERA_D_FMT' +- This return value can be used as a format string for +- `strftime' to represent a date using the era representation +- in a locale specific way. +- +- `ERA_T_FMT' +- This return value can be used as a format string for +- `strftime' to represent time using the era representation in +- a locale specific 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 for format which would use numerals to represent hours, +- minutes, seconds, weekdays, months, or weeks the appropriate +- value for this locale values is used instead of the number. +- +- `INT_CURR_SYMBOL' +- This value is the same as returned by `localeconv' in the +- `int_curr_symbol' element of the `struct lconv'. +- +- `CURRENCY_SYMBOL' +- `CRNCYSTR' +- This value is the same as returned by `localeconv' in the +- `currency_symbol' element of the `struct lconv'. +- +- `CRNCYSTR' is a deprecated alias, still required by Unix98. +- +- `MON_DECIMAL_POINT' +- This value is the same as returned by `localeconv' in the +- `mon_decimal_point' element of the `struct lconv'. +- +- `MON_THOUSANDS_SEP' +- This value is the same as returned by `localeconv' in the +- `mon_thousands_sep' element of the `struct lconv'. +- +- `MON_GROUPING' +- This value is the same as returned by `localeconv' in the +- `mon_grouping' element of the `struct lconv'. +- +- `POSITIVE_SIGN' +- This value is the same as returned by `localeconv' in the +- `positive_sign' element of the `struct lconv'. +- +- `NEGATIVE_SIGN' +- This value is the same as returned by `localeconv' in the +- `negative_sign' element of the `struct lconv'. +- +- `INT_FRAC_DIGITS' +- This value is the same as returned by `localeconv' in the +- `int_frac_digits' element of the `struct lconv'. +- +- `FRAC_DIGITS' +- This value is the same as returned by `localeconv' in the +- `frac_digits' element of the `struct lconv'. +- +- `P_CS_PRECEDES' +- This value is the same as returned by `localeconv' in the +- `p_cs_precedes' element of the `struct lconv'. +- +- `P_SEP_BY_SPACE' +- This value is the same as returned by `localeconv' in the +- `p_sep_by_space' element of the `struct lconv'. +- +- `N_CS_PRECEDES' +- This value is the same as returned by `localeconv' in the +- `n_cs_precedes' element of the `struct lconv'. +- +- `N_SEP_BY_SPACE' +- This value is the same as returned by `localeconv' in the +- `n_sep_by_space' element of the `struct lconv'. +- +- `P_SIGN_POSN' +- This value is the same as returned by `localeconv' in the +- `p_sign_posn' element of the `struct lconv'. +- +- `N_SIGN_POSN' +- This value is the same as returned by `localeconv' in the +- `n_sign_posn' element of the `struct lconv'. +- +- `DECIMAL_POINT' +- `RADIXCHAR' +- This value is the same as 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' +- This value is the same as returned by `localeconv' in the +- `thousands_sep' element of the `struct lconv'. +- +- The name `THOUSEP' is a deprecated alias still used in Unix98. +- +- `GROUPING' +- This value is the same as 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. +- +- `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 this better can be handled +- using the message translation functions (*note Message +- Translation::.). +- +- `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 file `langinfo.h' defines a lot more symbols but none of them +- is official. Using them is completely unportable and the format +- of the return values might change. Therefore it is highly +- requested to not use them in any situation. +- +- Please 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 format related values). 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 the global variable ERRNO is set +- to `EINVAL' and a `NULL' pointer is returned. +- +- An example for the use of `nl_langinfo' is a function which has to +-print a given date and time in the locale specific way. At first one +-might think the 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 the date and time format which is explicitly selected for the +-locale in place when the program runs is used. 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, 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 to retrieve the various pieces +-of locale specific information to format numbers and monetary amounts. +-But we have also seen that the rules underlying this information are +-quite complex. +- +- Therefore the X/Open standards introduce a function which uses this +-information from the locale and so makes it is 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 description of a buffer (with size), a format +- string and values to write into a buffer a textual representation +- of the values according to the format string. As for `strftime' +- the function also returns the number of bytes written into the +- buffer. +- +- There are two difference: `strfmon' can take more than one argument +- and of course the format specification is different. The format +- string consists as for `strftime' of normal text which is simply +- printed and format specifiers, which here are also introduced +- using `%'. Following the `%' the function allows similar to +- `printf' a sequence of flags and other specifications before the +- format character: +- +- * 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 using +- the rules of the current locale. By default grouping is +- enabled. +- +- `+', `(' +- At most one of these flags must be used. They select +- which format to represent the sign of currency amount is +- used. By default and if `+' is used the locale +- equivalent to +/- is used. If `(' is used 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 right-justified instead +- left-justified if the output does not fill the entire +- field width. +- +- The next part of a specification is an, again optional, +- specification of the field width. The width is given by digits +- following the flags. If no width is specified it is assumed to be +- 0. The width value is used after it is determined how much space +- the printed result needs. If it does not require fewer characters +- than specified by the width value nothing happens. Otherwise the +- output is extended to use as many characters as the width says by +- filling with spaces. At which side depends on whether the `-' +- flag was given or not. If it was given, the spaces are added at +- the right, making the output right-justified and vice versa. +- +- So far the format looks familiar as it is similar to `printf' or +- `strftime' formats. But the next two fields introduce something +- new. The first one, if available, is introduced by a `#' character +- which is followed by a decimal digit string. The value of the +- digit string specifies the width the formatted digits left to the +- radix character. This does *not* include the grouping character +- needed if 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 which 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 next field is introduced by a `.' (period) and consists of +- another decimal digit string. Its value describes the number of +- characters printed after the radix character. 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 those specified by the field +- width the displayed value is rounded. In case the number of +- fractional digits is selected to be zero, no radix character is +- printed. +- +- As a GNU extension the `strfmon' implementation in the GNU libc +- allows as the next field an optional `L' as a format modifier. If +- this modifier is given the argument is expected to be a `long +- double' instead of a `double' value. +- +- Finally as the last component of the format there must come a +- format specifying. There are three specifiers defined: +- +- `i' +- The argument is formatted according to the locale's rules to +- format an international currency value. +- +- `n' +- The argument is formatted according to the locale's rules to +- format an national currency value. +- +- `%' +- Creates a `%' in the output. There must be no flag, width +- specifier or modifier given, only `%%' is allowed. +- +- As it is done 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 NUL 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 it clear how to use this function. It is +-assumed that all the following pieces of code are executed in a program +-which uses the locale valid for the USA (`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 width for all formats +-is 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. +-Beside this the number is rounded. The .678 are rounded to .68 since +-the format does not specify a precision and the default value in the +-locale is 2. A last thing is 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. First, 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 fill the space specified by the right +-precision, but instead it is used to fill to the given width. The +-difference becomes obvious if we now add a right 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 the +-space between the currency sign and the number is filled with the +-selected fill character. Please note that although the right precision +-is selected to be 5 and 123.45 has three characters right of the radix +-character, the space is filled with three asterisks. This is correct +-since as explained above, the right precision does not count the +-characters used for the thousands separators in. 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 use of the alternative style to +-represent negative numbers. In financial circles it is often done using +-parentheses and this is what the `(' flag selected. The fill character +-is now `0'. Please note that this `0' character is not regarded as a +-numeric zero and therefore the first and second number are not printed +-using a thousands separator. Since we use in the format the specifier +-`i' instead of `n' now 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 left precision is selected to be three the +-first and second number are printed with an extra zero at the end and +-the third number is printed unrounded. +- +- +-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 -Naur ../glibc-2.1.3/manual/libc.info-11 glibc-2.1.3/manual/libc.info-11 +--- ../glibc-2.1.3/manual/libc.info-11 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-11 1969-12-31 16:00:00.000000000 -0800 +@@ -1,949 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 to specify 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 behaviour 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 examines the environment +- variable `LC_ALL', `LC_MESSAGES', and `LANG' in this order. The +- first variable which is set in the current environment will be +- used. +- +- If FLAG is zero only the `LANG' environment variable is examined. +- This is a left-over from the early days of this function where the +- other environment variable were not known. +- +- In any case the environment variable 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 occured the global variable ERRNO is set to +- +- EBADF +- The catalog does not exist. +- +- ENOMSG +- The set/message ttuple 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 at the first non-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. +- +- Please note that you must use a quoting character if a message +- contains leading whitespace. Since one cannot guarantee this +- never happens it is probably a good idea to always use quoting. +- +- 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 allows to process 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 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 /* u.msg:8 */ +- +- #define SetOneSet 0x1 /* u.msg:4 */ +- #define SetOnetwo 0x2 /* u.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 <stdio.h> +- 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 <nl_types.h> +- #include <stdio.h> +- #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 package 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. +-* 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 speciality 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 s peaks 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. I.e., the algorithm to determine the translation is +-deterministic. +- +- Exactly this is what the optimizations implemented in the +-`libintl.h' header will use. Whenever a program is compiler with the +-GNU C compiler, optimization is selected and the MSGID argument to +-`gettext', `dgettext' or `dcgettext' is a constant string the actual +-function call will only be done the first time the message is used and +-then always only if any new message catalog was loaded and so the +-result of the translation lookup might be different. See the +-`libintl.h' header file for details. For the user it is only important +-to know that the result is always the same, independent of the compiler +-or compiler options in use. +- +- +-File: libc.info, Node: Locating gettext catalog, Next: Using gettextized software, 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 directly +- 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 bounded 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 -Naur ../glibc-2.1.3/manual/libc.info-12 glibc-2.1.3/manual/libc.info-12 +--- ../glibc-2.1.3/manual/libc.info-12 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-12 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1187 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Using gettextized software, Prev: Locating gettext catalog, 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, 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 the +-exactly the value which was given to the function as the second +-parameter. I.e., `bindtextdomain' allows to overwrite the only system +-dependent and fixed value to make it possible to address file +-everywhere 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: +- +- { +- textdomain ("test-package"); +- bindtextdomain ("test-package", "/usr/local/share/locale"); +- puts (gettext ("Hello, world!"); +- } +- +- At the program start the default domain is `messages'. The +-`textdomain' call changes this 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 +-are to more or less standardized forms: +- +-*X/Open Format* +- `language[_territory[.codeset]][@modifier]' +- +-*CEN Format (European Community Standard)* +- `language[_territory][+audience][+special][,[sponsor][_revision]]' +- +- The functions will automatically recognize which format is used. +-Less specific locale names will be stripped of in the order of the +-following list: +- +- 1. `revision' +- +- 2. `sponsor' +- +- 3. `special' +- +- 4. `codeset' +- +- 5. `normalized codeset' +- +- 6. `territory' +- +- 7. `audience'/`modifier' +- +- From the last entry one can see that the meaning of the `modifier' +-field in the X/Open format and the `audience' format have the same +-meaning. Beside one can see that the `language' field for obvious +-reasons never will be dropped. +- +- 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 +-themself. +- +- +-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. +- +- +-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 <stdlib.h> +- #include <stdio.h> +- #include <string.h> +- +- /* 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. +- +- - 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 arbitrary 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, possibly replacing +- a previous value (if ACTION is `ENTER'). +- +- 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. +- +- The return value depends on the ACTION parameter value. If it is +- `FIND' the value is a pointer to the matching element in the +- hashing table or `NULL' if no matching element exists. If ACTION +- is `ENTER' the return value is only `NULL' if the programs runs +- out of memory while adding the new element to the table. +- Otherwise the return value is a pointer to the element in the +- hashing table which contains newly added element based on the data +- in KEY. +- +- 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 to have more than once hashing table at one time. The +- memory necessary for the `struct hsearch_data' object can be +- allocated dynamically. +- +- 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 later 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. +- +- +-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. +- +- - 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 +- the data if this tree node is returned by the function. If there +- is no matching entry in the tree nothing can be deleted and the +- function returns `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 to apply a function on +-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. +- +- `endorder' +- The current node is an internal node and the function is +- called after the first child was processed. +- +- `postorder' +- 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' is 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 behaviour 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. +- +- +-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. +- +- `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. +- +- - 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. +- +- +-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'. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-13 glibc-2.1.3/manual/libc.info-13 +--- ../glibc-2.1.3/manual/libc.info-13 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-13 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1154 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 +- themself 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. +- +- +-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). +- +- +-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; args[i]; i++) +- { +- if (wordexp (options, &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%%r*}' substitutes `t', because the largest match for +- `r*' at the end of `tractor' is `ractor'. +- +-`${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%%r*}' substitutes `tracto', because the shortest +- match for `r*' at the end of `tractor' is just `r'. +- +- +-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 terminal 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::. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-14 glibc-2.1.3/manual/libc.info-14 +--- ../glibc-2.1.3/manual/libc.info-14 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-14 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1114 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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. +-* 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. +-* 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::. +- +- +-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 can 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::. +- +- 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 bits 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 bits 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 bits 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 bits 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. +- +- +-File: libc.info, Node: Closing Streams, Next: Simple Output, 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 cancelled. 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 situation, e.g., when +- an error occurred and the program must be aborted. Normally each +- single stream should be closed separately so that problems with +- one stream 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::. +- +- +-File: libc.info, Node: Simple Output, Next: Character Input, Prev: Closing Streams, Up: I/O on Streams +- +-Simple Output by Characters or Lines +-==================================== +- +- This section describes functions for performing character- and +-line-oriented output. +- +- These functions are declared in the header file `stdio.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: 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: int putchar (int C) +- The `putchar' function is equivalent to `putc' with `stdout' as +- the value of the STREAM argument. +- +- - 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 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."); +- +- - 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 functions are declared in the header file `stdio.h'. +- +- These functions return an `int' value that is either a character of +-input, or the special value `EOF' (usually -1). 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: 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: int getchar (void) +- The `getchar' function is equivalent to `getc' with `stdin' as the +- value of the STREAM argument. +- +- 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)'. +- +- 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's +-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, `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'. +- +- - 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 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. +- +- 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 <stdio.h> +- #include <ctype.h> +- +- 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 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. +- +- +-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 +- +- 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 a 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 to specify and explicit +- parameter to be used. +- +- The PARAM-NO part of the format must be an integer 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 `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 behaviour 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 -Naur ../glibc-2.1.3/manual/libc.info-15 glibc-2.1.3/manual/libc.info-15 +--- ../glibc-2.1.3/manual/libc.info-15 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-15 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1211 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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::. +- +-`%s' +- Print a string. *Note Other Output Conversions::. +- +-`%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 C 9x. +- +-`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 C 9x. +- +-`l' +- Specifies that the argument is a `long int' or `unsigned long +- int', as appropriate. Two `l' characters is like the `L' +- modifier, below. +- +-`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 C 9x. +- +-`z' +-`Z' +- Specifies that the argument is a `size_t'. +- +- `z' was introduced in ISO C 9x. `Z' is a GNU extension predating +- this addition and should not be used anymore 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| +- +- 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| 0x0| 0X0|0x00000000| +- | 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. 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 number 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 implemention 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. The `int' argument +-is first converted to an `unsigned char'. 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'. +- +- The `%s' conversion prints a string. The corresponding argument +-must be of type `char *' (or `const char *'). 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 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 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 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 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; +- +- /* 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); +- +- /* 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 the GNU C library version 2.0 the return value is +- the number of characters stored, not including the terminating +- null. If this value equals `SIZE - 1', then there was not enough +- space in S for all the output. This change was necessary with the +- adoption of snprintf by ISO C9x. +- +- +-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. +- +- 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; +- asprintf (&result, "value of %s is %s", name, value); +- 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 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 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 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 <stdio.h> +- #include <stdarg.h> +- +- 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 N argument specifies the number of elements in the array +- ARGTYPES. This is the most 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 more than that many 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 `'z'', it defines the conversion `%z'. 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. +- +- 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 version before 2.0 the +- ARGINFO-FUNCTION function did not need to be installed unless the +- user uses the `parse_printf_format' function. This 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'. +- +- `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 the 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 were 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. +- +- +-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 <stdio.h> +- #include <stdlib.h> +- #include <printf.h> +- 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, "<Widget %p: %s>", 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: +- +- |<Widget 0xffeffb7c: mywidget>| +- | <Widget 0xffeffb7c: mywidget>| +- |<Widget 0xffeffb7c: mywidget> | +- +diff -Naur ../glibc-2.1.3/manual/libc.info-16 glibc-2.1.3/manual/libc.info-16 +--- ../glibc-2.1.3/manual/libc.info-16 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-16 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1155 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 to 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 return 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 power of 1024. Please note that all what is +-different in these both lines in the format specifier. The +-`printf_size' function knows about the difference of low 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 also available using the 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<n; i++) +- if (scanf (" %lf", &(array[i])) != 1) +- invalid_input_error (); +- } +- +- The formatted input functions are not used as frequently as the +-formatted output functions. Partly, this is because it takes some care +-to use them properly. Another reason is that it is difficult to recover +-from a matching error. +- +- If you are trying to read input that doesn't match a single, fixed +-pattern, you may be better off using a tool such as Flex to generate a +-lexical scanner, or Bison to generate a parser, rather than using +-`scanf'. For more information about these tools, see *Note : +-(flex.info), and *Note : (bison.info). +- +- +-File: libc.info, Node: Input Conversion Syntax, Next: Table of Input Conversions, Prev: Formatted Input Basics, Up: Formatted Input +- +-Input Conversion Syntax +------------------------ +- +- A `scanf' template string is a string that contains ordinary +-multibyte characters interspersed with conversion specifications that +-start with `%'. +- +- Any whitespace character (as defined by the `isspace' function; +-*note Classification of Characters::.) in the template causes any number +-of whitespace characters in the input stream to be read and discarded. +-The whitespace characters that are matched need not be exactly the same +-whitespace characters that appear in the template string. For example, +-write ` , ' in the template to recognize a comma with optional +-whitespace before and after. +- +- Other characters in the template string that are not part of +-conversion specifications must match characters in the input stream +-exactly; if this is not the case, a matching failure occurs. +- +- The conversion specifications in a `scanf' template string have the +-general form: +- +- % FLAGS WIDTH TYPE CONVERSION +- +- In more detail, an input conversion specification consists of an +-initial `%' character followed in sequence by: +- +- * An optional "flag character" `*', which says to ignore the text +- read for this specification. When `scanf' finds a conversion +- specification that uses this flag, it reads input as directed by +- the rest of the conversion specification, but it discards this +- input, does not use a pointer argument, and does not increment the +- count of successful assignments. +- +- * An optional flag character `a' (valid with string conversions only) +- which requests allocation of a buffer long enough to store the +- string in. (This is a GNU extension.) *Note Dynamic String +- Input::. +- +- * An optional decimal integer that specifies the "maximum field +- width". Reading of characters from the input stream stops either +- when this maximum is reached or when a non-matching character is +- found, whichever happens first. Most conversions discard initial +- whitespace characters (those that don't are explicitly +- documented), and these discarded characters don't count towards +- the maximum field width. String input conversions store a null +- character to mark the end of the input; the maximum field width +- does not include this terminator. +- +- * An optional "type modifier character". For example, you can +- specify a type modifier of `l' with integer conversions such as +- `%d' to specify that the argument is a pointer to a `long int' +- rather than a pointer to an `int'. +- +- * 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 allow. +- +- With the `-Wformat' option, the GNU C compiler checks calls to +-`scanf' 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 `scanf'-style format string. *Note Declaring Attributes +-of Functions: (gcc.info)Function Attributes, for more information. +- +- +-File: libc.info, Node: Table of Input Conversions, Next: Numeric Input Conversions, Prev: Input Conversion Syntax, Up: Formatted Input +- +-Table of Input Conversions +--------------------------- +- +- Here is a table that summarizes the various conversion +-specifications: +- +-`%d' +- Matches an optionally signed integer written in decimal. *Note +- Numeric Input Conversions::. +- +-`%i' +- Matches an optionally signed integer in any of the formats that +- the C language defines for specifying an integer constant. *Note +- Numeric Input Conversions::. +- +-`%o' +- Matches an unsigned integer written in octal radix. *Note Numeric +- Input Conversions::. +- +-`%u' +- Matches an unsigned integer written in decimal radix. *Note +- Numeric Input Conversions::. +- +-`%x', `%X' +- Matches an unsigned integer written in hexadecimal radix. *Note +- Numeric Input Conversions::. +- +-`%e', `%f', `%g', `%E', `%G' +- Matches an optionally signed floating-point number. *Note Numeric +- Input Conversions::. +- +-`%s' +- Matches a string containing only non-whitespace characters. *Note +- String Input Conversions::. +- +-`%[' +- Matches a string of characters that belong to a specified set. +- *Note String Input Conversions::. +- +-`%c' +- Matches a string of one or more characters; the number of +- characters read is controlled by the maximum field width given for +- the conversion. *Note String Input Conversions::. +- +-`%p' +- Matches a pointer value in the same implementation-defined format +- used by the `%p' output conversion for `printf'. *Note Other +- Input Conversions::. +- +-`%n' +- This conversion doesn't read any characters; it records the number +- of characters read so far by this call. *Note Other Input +- Conversions::. +- +-`%%' +- This matches a literal `%' character in the input stream. No +- corresponding argument is used. *Note Other Input Conversions::. +- +- If the syntax of a conversion specification is invalid, the behavior +-is undefined. If there aren't enough function arguments provided to +-supply addresses for all the conversion specifications in the template +-strings that perform assignments, or if the arguments are not of the +-correct types, the behavior is also undefined. On the other hand, extra +-arguments are simply ignored. +- +- +-File: libc.info, Node: Numeric Input Conversions, Next: String Input Conversions, Prev: Table of Input Conversions, Up: Formatted Input +- +-Numeric Input Conversions +-------------------------- +- +- This section describes the `scanf' conversions for reading numeric +-values. +- +- The `%d' conversion matches an optionally signed integer in decimal +-radix. The syntax that is recognized is the same as that for the +-`strtol' function (*note Parsing of Integers::.) with the value `10' +-for the BASE argument. +- +- The `%i' conversion matches an optionally signed integer in any of +-the formats that the C language defines for specifying an integer +-constant. The syntax that is recognized is the same as that for the +-`strtol' function (*note Parsing of Integers::.) with the value `0' for +-the BASE argument. (You can print integers in this syntax with +-`printf' by using the `#' flag character with the `%x', `%o', or `%d' +-conversion. *Note Integer Conversions::.) +- +- For example, any of the strings `10', `0xa', or `012' could be read +-in as integers under the `%i' conversion. Each of these specifies a +-number with decimal value `10'. +- +- The `%o', `%u', and `%x' conversions match unsigned integers in +-octal, decimal, and hexadecimal radices, respectively. The syntax that +-is recognized is the same as that for the `strtoul' function (*note +-Parsing of Integers::.) with the appropriate value (`8', `10', or `16') +-for the BASE argument. +- +- The `%X' conversion is identical to the `%x' conversion. They both +-permit either uppercase or lowercase letters to be used as digits. +- +- The default type of the corresponding argument for the `%d' and `%i' +-conversions is `int *', and `unsigned int *' for the other integer +-conversions. You can use the following type modifiers to specify other +-sizes of integer: +- +-`hh' +- Specifies that the argument is a `signed char *' or `unsigned char +- *'. +- +- This modifier was introduced in ISO C 9x. +- +-`h' +- Specifies that the argument is a `short int *' or `unsigned short +- int *'. +- +-`j' +- Specifies that the argument is a `intmax_t *' or `uintmax_t *'. +- +- This modifier was introduced in ISO C 9x. +- +-`l' +- Specifies that the argument is a `long int *' or `unsigned long +- int *'. Two `l' characters is like the `L' modifier, below. +- +-`ll' +-`L' +-`q' +- Specifies that the argument is a `long long int *' or `unsigned +- long long int *'. (The `long long' type is an extension supported +- by the GNU C compiler. For systems that don't provide 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 C 9x. +- +-`z' +- Specifies that the argument is a `size_t *'. +- +- This modifier was introduced in ISO C 9x. +- +- All of the `%e', `%f', `%g', `%E', and `%G' input conversions are +-interchangeable. They all match an optionally signed floating point +-number, in the same syntax as for the `strtod' function (*note Parsing +-of Floats::.). +- +- For the floating-point input conversions, the default argument type +-is `float *'. (This is different from the corresponding output +-conversions, where the default type is `double'; remember that `float' +-arguments to `printf' are converted to `double' by the default argument +-promotions, but `float *' arguments are not promoted to `double *'.) +-You can specify other sizes of float using these type modifiers: +- +-`l' +- Specifies that the argument is of type `double *'. +- +-`L' +- Specifies that the argument is of type `long double *'. +- +- For all the above number parsing formats there is an additional +-optional flag `''. When this flag is given the `scanf' function +-expects the number represented in the input string to be formatted +-according to the grouping rules of the currently selected locale (*note +-General Numeric::.). +- +- If the `"C"' or `"POSIX"' locale is selected there is no difference. +-But for a locale which specifies values for the appropriate fields in +-the locale the input must have the correct form in the input. +-Otherwise the longest prefix with a correct form is processed. +- +- +-File: libc.info, Node: String Input Conversions, Next: Dynamic String Input, Prev: Numeric Input Conversions, Up: Formatted Input +- +-String Input Conversions +------------------------- +- +- This section describes the `scanf' input conversions for reading +-string and character values: `%s', `%[', and `%c'. +- +- You have two options for how to receive the input from these +-conversions: +- +- * Provide a buffer to store it in. This is the default. You should +- provide an argument of type `char *'. +- +- *Warning:* To make a robust program, you must make sure that the +- input (plus its terminating null) cannot possibly exceed the size +- of the buffer you provide. In general, the only way to do this is +- to specify a maximum field width one less than the buffer size. +- *If you provide the buffer, always specify a maximum field width +- to prevent overflow.* +- +- * Ask `scanf' to allocate a big enough buffer, by specifying the `a' +- flag character. This is a GNU extension. You should provide an +- argument of type `char **' for the buffer address to be stored in. +- *Note Dynamic String Input::. +- +- The `%c' conversion is the simplest: it matches a fixed number of +-characters, always. The maximum field with says how many characters to +-read; if you don't specify the maximum, the default is 1. This +-conversion doesn't append a null character to the end of the text it +-reads. It also does not skip over initial whitespace characters. It +-reads precisely the next N characters, and fails if it cannot get that +-many. Since there is always a maximum field width with `%c' (whether +-specified, or 1 by default), you can always prevent overflow by making +-the buffer long enough. +- +- The `%s' conversion matches a string of non-whitespace characters. +-It skips and discards initial whitespace, but stops when it encounters +-more whitespace after having read something. It stores a null character +-at the end of the text that it reads. +- +- For example, reading the input: +- +- hello, world +- +-with the conversion `%10c' produces `" hello, wo"', but reading the +-same input with the conversion `%10s' produces `"hello,"'. +- +- *Warning:* If you do not specify a field width for `%s', then the +-number of characters read is limited only by where the next whitespace +-character appears. This almost certainly means that invalid input can +-make your program crash--which is a bug. +- +- To read in characters that belong to an arbitrary set of your choice, +-use the `%[' conversion. You specify the set between the `[' character +-and a following `]' character, using the same syntax used in regular +-expressions. As special cases: +- +- * A literal `]' character can be specified as the first character of +- the set. +- +- * An embedded `-' character (that is, one that is not the first or +- last character of the set) is used to specify a range of +- characters. +- +- * If a caret character `^' immediately follows the initial `[', then +- the set of allowed input characters is the everything *except* the +- characters listed. +- +- The `%[' conversion does not skip over initial whitespace characters. +- +- Here are some examples of `%[' conversions and what they mean: +- +-`%25[1234567890]' +- Matches a string of up to 25 digits. +- +-`%25[][]' +- Matches a string of up to 25 square brackets. +- +-`%25[^ \f\n\r\t\v]' +- Matches a string up to 25 characters long that doesn't contain any +- of the standard whitespace characters. This is slightly different +- from `%s', because if the input begins with a whitespace character, +- `%[' reports a matching failure while `%s' simply discards the +- initial whitespace. +- +-`%25[a-z]' +- Matches up to 25 lowercase characters. +- +- One more reminder: the `%s' and `%[' conversions are *dangerous* if +-you don't specify a maximum width or use the `a' flag, because input +-too long would overflow whatever buffer you have provided for it. No +-matter how long your buffer is, a user could supply input that is +-longer. A well-written program reports invalid input with a +-comprehensible error message, not with a crash. +- +- +-File: libc.info, Node: Dynamic String Input, Next: Other Input Conversions, Prev: String Input Conversions, Up: Formatted Input +- +-Dynamically Allocating String Conversions +------------------------------------------ +- +- A GNU extension to formatted input lets you safely read a string +-with no maximum size. Using this feature, you don't supply a buffer; +-instead, `scanf' allocates a buffer big enough to hold the data and +-gives you its address. To use this feature, write `a' as a flag +-character, as in `%as' or `%a[0-9a-z]'. +- +- The pointer argument you supply for where to store the input should +-have type `char **'. The `scanf' function allocates a buffer and +-stores its address in the word that the argument points to. You should +-free the buffer with `free' when you no longer need it. +- +- Here is an example of using the `a' flag with the `%[...]' +-conversion specification to read a "variable assignment" of the form +-`VARIABLE = VALUE'. +- +- { +- char *variable, *value; +- +- if (2 > 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 as is 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 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 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' +- 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 are GNU +-extensions. +- +- - Function: int vscanf (const char *TEMPLATE, va_list AP) +- This function is similar to `scanf' except that, 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 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'. +- +- 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. *Note +-Declaring Attributes of Functions: (gcc.info)Function Attributes, for +-details. +- +- +-File: libc.info, Node: EOF and Errors, Next: Binary Streams, 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. +- +- These symbols are declared in the header file `stdio.h'. +- +- - Macro: int EOF +- This macro is an integer value that is returned by a number of +- 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. +- +- - 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: int feof (FILE *STREAM) +- The `feof' function returns nonzero if and only if the end-of-file +- indicator for the stream STREAM is set. +- +- - 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. +- +- 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: Binary Streams, Next: File Positioning, Prev: EOF and Errors, 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' only it corrects a +- problem which the POSIX type system. In this type system all file +- positions are described using values of type `off_t' which is not +- necessarily of the same size as `long int'. Therefore using +- `ftell' can lead to problems if the implementation is written on +- top of a POSIX compliant lowlevel I/O implementation. +- +- Therefore it is a good idea to prefer `ftello' whenever it is +- available since its functionality is (if different at all) closer +- the underlying definition. +- +- If this function fails it return `(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 bits 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 bits 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'. +- +- +-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 either be zero; or WHENCE must be `SEEK_SET' 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 equivalent to `off_t' or `long +- int'. In other systems, it might have a different internal +- representation. +- +- When compiling with `_FILE_OFFSET_BITS == 64' on a 32 bits machine +- this type is in fact equivalent to `off64_t' since the LFS +- interface transparently replaced 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 equivalent to `off64_t' or `long +- long int'. 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 bits system the function is in fact `fgetpos64'. I.e., the LFS +- interface transparently replaced 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 bits system the function is in fact `fsetpos64'. I.e., the LFS +- interface transparently replaced 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 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. +- +- *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. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-17 glibc-2.1.3/manual/libc.info-17 +--- ../glibc-2.1.3/manual/libc.info-17 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-17 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1134 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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. +- +- +-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 (as with `malloc'; *note Unconstrained +- Allocation::.) an array SIZE bytes long. 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 open. +- +- 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 <stdio.h> +- +- 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 <stdio.h> +- +- 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". +- +-* 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, void *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 void *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 the 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 behaviour. +- +- 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 system 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 behaviour 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 explicitely 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 behaviour of +-`fmtmsg' is `SEV_LEVEL'. This variable and the change in the behaviour +-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 beside +-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 to introduce 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 <fmtmsg.h> +- +- 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 how +-it usually happens on System V systems which heavily use this function. +-It might be worth a thought to follow the scheme used in System V +-systems so we give a short explanation here. The value of the LABEL +-field (`UX:cat') says that the error occured in the Unix program `cat'. +-The explanation of the error follows and the value for the ACTION +-parameter is `"refer to manual"'. One could me more specific here, if +-needed. 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 +-the `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 the `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 in 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 since 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. +-* Truncating Files:: Change the size of a file. +-* 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 discontinous 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. +- +- +-File: libc.info, Node: Opening and Closing Files, Next: Truncating Files, 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 bits 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 cancelation 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 cancelation 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 +- the difference is that on 32 bits 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 bits 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 bits 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 cancelation 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 cancelation 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 for which mode the descriptor is used 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: Truncating Files, Next: I/O Primitives, Prev: Opening and Closing Files, Up: Low-Level I/O +- +-Change the size of a file +-========================= +- +- In some situations it is useful to explicitly determine the size of a +-file. Since the 4.2BSD days there is a function to truncate a file to +-at most a given number of bytes and POSIX defines one additional +-function. The prototypes for these functions are in `unistd.h'. +- +- - Function: int truncate (const char *NAME, off_t LENGTH) +- The `truncation' function truncates the file named by NAME to at +- most LENGTH bytes. I.e., if the file was larger before the extra +- bytes are stripped of. If the file was small or equal to LENGTH +- in size before nothing is done. The file must be writable by the +- user to perform this operation. +- +- 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 zero is everything went ok. Otherwise the +- return value is -1 and the global variable ERRNO is set to: +- `EACCES' +- The file is not accessible to the user. +- +- `EINVAL' +- The LENGTH value is illegal. +- +- `EISDIR' +- The object named by NAME is a directory. +- +- `ENOENT' +- The file named by NAME does not exist. +- +- `ENOTDIR' +- One part of the NAME is not a directory. +- +- This function was introduced in 4.2BSD but also was available in +- later System V systems. It is not added to POSIX since the +- authors felt it is only of marginally additional utility. See +- below. +- +- - 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 to handle file with a size 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) +- The `ftruncate' function is similar to the `truncate' function. +- The main difference is that it takes a descriptor 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. +- +- 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. +- +- On success the function returns zero. Otherwise it returns -1 and +- set ERRNO to one of these values: +- `EBADF' +- FD is no valid file descriptor or is not opened for writing. +- +- `EINVAL' +- The object referred to by FD does not permit this operation. +- +- `EROFS' +- The file is on a read-only file system. +- +- - 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 to handle file with a size 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. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-18 glibc-2.1.3/manual/libc.info-18 +--- ../glibc-2.1.3/manual/libc.info-18 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-18 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1157 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: I/O Primitives, Next: File Position Primitive, Prev: Truncating 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 there is no terminating +- null character 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 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 cancelation 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 cancelation 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 also the return values and error +- codes 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 effected 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. Only there are a few more error codes: +- `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 bits 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 `pread' and so transparently replaces the 32 bits 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 necessary +- 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 cancelation 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 cancelation 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 also the return values and +- error codes 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 effected 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. Only there are a few more error codes: +- `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 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 bits 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 bits machine this function is actually available under the +- name `pwrite' and so transparently replaces the 32 bits 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 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 +- so; 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 cancelation 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 cancelation 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 bits 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 bits 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 bits 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 affect 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. +- +- 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, 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. +- +- 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 seperated in memory. Although this can be done easily enough +-with multiple calls to `read' and `write', it is inefficent 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. +- +- +-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 efficent than `read' or `write', as only regions of the +-file 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. +- +- 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) in the file open on FILEDES. +- +- 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 recieve 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 +- efficent 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: 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 un-map 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 accessable to +- non-memory-mapped I/O, it is neccessary 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, but a with the length NEW_LENGTH +- instead. +- +- 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: +- +- This function is only available on a few systems. Except for +- performing optional optimizations one should not rely on this +- function. +- `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 insufficent 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. +- +- +- 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. +- +- +-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 <stdio.h> +- #include <unistd.h> +- #include <sys/types.h> +- #include <sys/time.h> +- +- 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::. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-19 glibc-2.1.3/manual/libc.info-19 +--- ../glibc-2.1.3/manual/libc.info-19 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-19 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1158 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 operation 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 the user can +-use special functions which ensure that all operations finished before +-they return. +- +- - Function: int sync (void) +- A call to this function will not return as long as there is data +- which that is not 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. +- +- More often it is wanted that not all data in the system is committed. +-Programs want to ensure that data written to a given file are all +-committed and in this situation `sync' is overkill. +- +- - Function: int fsync (int FILDES) +- The `fsync' 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 cancelation 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 cancelation handlers. +- +- The return value of the function is zero if no error occured. +- 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 made sure +- 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 `fdatasyn'. +- +- The prototype for `fdatasync' is in `unistd.h'. +- +- The return value of the function is zero if no error occured. +- 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 +-reduce the time an application spends waiting at I/O significantly. The +-new functions allow a program to initiate one or more I/O operations and +-then immediately resume the normal work while the I/O operations are +-executed in parallel. The 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 arbitrary many operations for one file running. 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 on these elements is not portable and is highly +- deprecated. +- +- `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. +- +- `off_t aio_offset' +- This element specifies at which offset in the file 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 send. If it is +- `SIGEV_SIGNAL' the signal determined by `sigev_signo' is +- send. 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 to +- start an arbitrary number of operations at once and since +- 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 bits 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'. Especially +-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 specified 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 ead 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' is 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 send. If it is +- `SIGEV_SIGNAL' the signal determined by `sigev_signo' is +- send. Otherwise `sigev_notify' must be `SIGEV_THREAD' in +- which case a thread which starts executing the function +- pointeed 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 to +- start an arbitrary number of operations 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 bits machine this type is available under the name `struct +- aiocb64' since the LFS replaces transparently 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:: Cancelation 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. The +- function call 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 needs 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 asynchrously. +- +- In the case `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 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_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 bits 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 bits +- 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 needs 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 needs 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 code 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 bits 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 bits +- machines. +- +- Beside these functions with the more or less traditional interface +-POSIX.1b also defines a function with can initiate more than one +-operation at once and which can handled freely mixed read and write +-operation. 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. What operation has to be performed is determined by the +- `aio_lio_opcode' member in each element of LIST. If this field is +- `LIO_READ' an read operation is queued, 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' an 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 +- cancelled 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 return 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. In +- case `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 in the moment. The error status for each element +- of LIST must be checked 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 for which one +- failed. +- +- `ENOSYS' +- The `lio_listio' function is not supported. +- +- If the MODE parameter is `LIO_NOWAIT' and the caller cancels an +- 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 `aio_listio' function. The only +- difference is that only 32 bits 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 bits +- 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 +-a I/O request. When the operation is performed really asynchronous (as +-with `aio_read' and `aio_write' and with `aio_listio' when the mode is +-`LIO_NOWAIT') one sometimes needs to know whether a specific request +-already terminated and if yes, what the result was.. The following two +-function allow 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 bits +- 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 behaviour. 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 bits +- machines. +- +- +-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 in +-`unistd.h' the symbol `_POSIX_SYNCHRONIZED_IO' is defined. +- +- - 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 return +- immediately but the notification through the method described in +- `aiocbp->aio_sigevent' will happen only after all requests for this +- file descriptor 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 effected. +- +- 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 filed. 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_return64' 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 bits +- 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 already has +- completed at the time `aio_suspend' is called the function returns +- immediately. Whether a request has terminated or not is done 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 waked until a request +- finished. If TIMEOUT is not `NULL' the process remains suspended +- at 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 bits +- machines. +- +- +-File: libc.info, Node: Cancel AIO Operations, Next: Configuration of AIO, Prev: Synchronizing AIO Operations, Up: Asynchronous I/O +- +-Cancelation 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 not anymore 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 to force the cancelation 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 outstanding requests which would +- process the file descriptor FILDES (i.e.,, whose `aio_fildes' +- member is FILDES). If AIOCBP is not `NULL' the very specific +- request pointed to by AIOCBP is tried to be canceled. +- +- 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 te 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 successfully were +- canceled. If there is one or more request 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') wasn'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 aiocb *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 bits +- 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 least the available implementation at the point of this writing +-is a userlevel implementation which uses threads for handling the +-enqueued requests. This implementation requires to make some decisions +-about limitations but hard limitations are something which better +-should be avoided the GNU C library implementation provides a mean to +-tune the AIO implementation individually for each 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 +- must 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' +- +- `int aio_usedba' +- +- `int aio_debug' +- +- `int aio_numusers' +- +- `int aio_reserved[2]' +- +- - Function: void aio_init (const struct aioinit *INIT) +- This function must be called before any other AIO function. +- Calling it is completely voluntarily since it only is meant to +- help the AIO implementation to 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 cancelation 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 cancelation 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); +- } +- +diff -Naur ../glibc-2.1.3/manual/libc.info-2 glibc-2.1.3/manual/libc.info-2 +--- ../glibc-2.1.3/manual/libc.info-2 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-2 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1003 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 <file.h> +- +-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 <stdlib.h> +- 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 <stdlib.h> +- 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 implementationally +- 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 indescriminantly. +- +- This should not be used to verify that a program conforms to a +-limited standard. It is insufficent 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. +- +- The Single Unix Specification specify that setting this macro to +- the value `199506L' selects all the values specified by the POSIX +- standards plus those of the Single Unix Specification, i.e., is the +- same as if `_XOPEN_SOURCE' is set to `500' (see below). +- +- - 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. More +- concrete 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 function gets +- available which enables to use on 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 existing. 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 time 64 bit +- offsets are not generally used (see `_FILE_OFFSET_BITS'. +- +- - Macro: _FILE_OFFSET_BITS +- This macro lets decide which file system interface shall be used, +- one replacing the other. While `_LARGEFILE64_SOURCE' makes the +- 64 bit interface available as an additional interface +- `_FILE_OFFSET_BITS' allows to use 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 `_LARGEFILE64_SOURCE' does. +- 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: _GNU_SOURCE +- If you define this macro, everything is included: ISO C, 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 that the +- standardization of the thread safe C library interface still is +- behind. +- +- 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 Allocation::, describes the GNU library's facilities +- for dynamic allocation of storage. If you do not know in advance +- how much storage 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 Process Startup::, 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 Information::, describes functions for 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 Allocation, 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 the +- 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 -Naur ../glibc-2.1.3/manual/libc.info-20 glibc-2.1.3/manual/libc.info-20 +--- ../glibc-2.1.3/manual/libc.info-20 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-20 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1238 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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_RDWR'; only defined on GNU. +- +- - Macro: int O_WRITE +- Open the file for reading. 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. +- +- +-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 on 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 () +- { +- int size = 100; +- char *buffer = (char *) xmalloc (size); +- +- while (1) +- { +- char *value = getcwd (buffer, size); +- if (value != 0) +- return buffer; +- size *= 2; +- free (buffer); +- buffer = (char *) xmalloc (size); +- } +- } +- +-*Note Malloc Examples::, for information about `xmalloc', which is not +-a library function but is a customary name used in most GNU software. +- +- - 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: 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. +- +- +-File: libc.info, Node: Accessing Directories, Next: Working on 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. On systems where it is used, +- it corresponds to the file type bits in the `st_mode' member +- of `struct statbuf'. On other systems it will always be +- 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. +- +- 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, and the like are +- part of the file itself, not 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::.). +- +- +-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 for simultaneously running threads the result is +- not stored in some internal memory. Instead the argument ENTRY +- has to point to a place where the result is stored. +- +- The return value is `0' in case the next entry was read +- successfully. In this case a pointer to the result is returned in +- *RESULT. It is not required that *RESULT is the same as ENTRY. +- If something goes wrong while executing `readdir_r' the function +- returns a value indicating the error (as described for `readdir'). +- +- If there are no more directory entries, `readdir_r''s return value +- is `0', and *RESULT is set to `NULL'. +- +- *Portability Note:* On some systems, `readdir_r' may not return a +- terminated string as the file name even if no `d_reclen' element +- is available in `struct dirent' and the file name as the maximal +- 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 `d_reclen' field one could use multiple threads by +- using external locking. +- +- - 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 <stddef.h> +- #include <stdio.h> +- #include <sys/types.h> +- #include <dirent.h> +- +- 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 +- puts ("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 as the result a list +-of names. +- +- - 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 nonzero +- value are selected. +- +- Finally the entries in the NAMELIST are sorted using the user +- supplied function CMP. The arguments of the CMP function are of +- type `struct dirent **'. I.e., one cannot directly use the +- `strcmp' or `strcoll' function; see the functions `alphasort' and +- `versionsort' below. +- +- The return value of the function gives 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 said 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 **'. +- +- 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', excepted 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 only +- 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 wanted entries only that SELECTOR now +- must point to a function which takes a `struct dirent64 *' +- parameter. +- +- The CMP now must be a function which expects its two arguments to +- be of type `struct dirent64 **'. +- +- As just said the function expected as the fourth is different from +-the function expected in `scandir'. Therefore we cannot use the +-`alphasort' and `versionsort' functions anymore. Instead we have two +-similar functions available. +- +- - 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 bits +-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 +-using the functions which directly work with the directory contents. +-After the call the found entries are available for direct used. +- +- #include <stdio.h> +- #include <dirent.h> +- +- 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; +- } +- +- Please note the simple selector function for this example. Since we +-want to see all directory entries we always return `1'. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-21 glibc-2.1.3/manual/libc.info-21 +--- ../glibc-2.1.3/manual/libc.info-21 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-21 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1198 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Working on Directory Trees, Next: Hard Links, Prev: Accessing Directories, Up: File System Interface +- +-Working on Directory Trees +-========================== +- +- The functions to handle files in directories described so far +-allowed to retrieve all the information in small pieces or process all +-files in a directory (see `scandir'). Sometimes it is useful to +-process whole hierarchies of directories and the contained files. The +-X/Open specification define 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. +- +- Both functions of this `ftw' family take as one of the arguments a +-reference to a callback function. The functions must be of these types. +- +- - Data Type: __ftw_func_t +- int (*) (const char *, const struct stat *, int) +- +- Type for callback functions given to the `ftw' function. The first +- parameter will contain a pointer to the filename, the second +- parameter will point to an object of type `struct stat' which will +- be filled for the file named by the first parameter. +- +- The last parameter is a flag given more information about the +- current file. It can have the following values: +- +- `FTW_F' +- The current item is a normal file or files which do not fit +- into one of the following categories. This means especially +- special files, sockets etc. +- +- `FTW_D' +- The current item is a directory. +- +- `FTW_NS' +- The `stat' call to fill the object pointed to by the second +- parameter failed and so the information 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 also changes +- `struct stat' to be `struct stat64'. +- +- For the LFS interface and the 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 called from `ftw64'. 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: __nftw_func_t +- int (*) (const char *, const struct stat *, int, struct FTW *) +- +- The first three arguments have the same as for the `__ftw_func_t' +- type. A difference is that 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 given 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 also 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 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 contained information helps to interpret the name parameter and +- gives some information about current state of the traversal of the +- directory hierarchy. +- +- `int base' +- The value specifies which part of the filename argument given +- in the first parameter to the callback function is the name +- of the file. The rest of the string is the path to locate +- the file. This information is especially important if the +- `FTW_CHDIR' flag for `nftw' was set since then the current +- directory is the one the current item is found in. +- +- `int level' +- While processing the directory the functions tracks how many +- directories have been examine to find the current item. This +- nesting level is 0 for the item given starting item (file or +- directory) and is incremented by one for each entered +- directory. +- +- - 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 names no directory this item is the only object +- reported by calling the callback function. +- +- The filename given 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. Before the +- callback function is called `ftw' calls `stat' for this file and +- passes the information up to the callback function. If this +- `stat' call was not successful the failure is indicated by setting +- the falg argument of the callback function to `FTW_NS'. Otherwise +- the flag is set according to the description given in the +- description of `__ftw_func_t' above. +- +- The callback function is expected to return 0 to indicate that no +- error occurred and the processing should be continued. If an error +- occurred in the callback function or the call to `ftw' shall 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 the +- program in another place. This would leave the resources +- allocated in the `ftw' function allocated. +- +- The DESCRIPTORS parameter to the `ftw' function specifies how many +- file descriptors the `ftw' function is allowed to consume. The +- more descriptors can be used the faster the function can run. For +- each level of directories at most one descriptor is used so that +- for very deep directory hierarchies the limit on open file +- descriptors for the process or the system can be exceeded. Beside +- this the limit on file descriptors is counted together for all +- threads in a multi-threaded program and therefore it is always +- good too limit the maximal number of open descriptors to a +- reasonable number. +- +- 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 some function call failed (other than calling +- `stat' on an item) the function return -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 bits 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 since the information about the files 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 bits 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' functions works like the `ftw' functions. It calls the +- callback function FUNC for all items it finds in the directory +- FILENAME and below. At most DESCRIPTORS file descriptors are +- consumed during the `nftw' call. +- +- The differences are that for one the callback function is of a +- different type. It is of type `struct FTW *' and provides the +- callback functions the information described above. +- +- The second difference is that `nftw' takes an additional fourth +- argument which is 0 or a combination of any of the following +- values, combined using bitwise OR. +- +- `FTW_PHYS' +- While traversing the directory symbolic links are not +- followed. I.e., if this flag is given symbolic links are +- reported using the `FTW_SL' value for the type parameter to +- the callback function. Please note that if this flag is used +- the appearance of `FTW_SL' in a callback function does not +- mean the referenced file does not exist. To indicate this +- the extra value `FTW_SLN' exists. +- +- `FTW_MOUNT' +- The callback function is only called for items which are on +- the same mounted filesystem as the directory given as the +- FILENAME parameter to `nftw'. +- +- `FTW_CHDIR' +- If this flag is given the current working directory is +- changed to the directory containing the reported object +- before the callback function is called. +- +- `FTW_DEPTH' +- If this option is given the function visits first all files +- and subdirectories before the callback function is called for +- the 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' +- return 0 if no failure occurred in `nftw' and all callback +- function call return values are also 0. For internal errors such +- as memory problems -1 is returned and ERRNO is set accordingly. +- If the return value of a callback invocation is nonzero this very +- same value is returned. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a +- 32 bits 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 since the information about the files 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 bits 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 on 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 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. So does `link', the function that +-makes a hard link--it makes a hard link to the symbolic link, which one +-rarely wants. +- +- Prototypes for 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 (char *filename) +- { +- int size = 100; +- +- while (1) +- { +- char *buffer = (char *) xmalloc (size); +- int nchars = readlink (filename, buffer, size); +- if (nchars < size) +- return buffer; +- free (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. +- +- +-File: libc.info, Node: Deleting Files, Next: Renaming Files, Prev: Symbolic Links, Up: File System Interface +- +-Deleting Files +-============== +- +- You can delete a file with the functions `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 names as +-well (*note Hard Links::.), it remains accessible under its other 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 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 in which the file name is 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 name OLDNAME with NEWNAME. +- The file formerly accessible under the name OLDNAME is afterward +- 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 file (as indicated by 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, POSIX requires that in this case +- `rename' do nothing and report success--which is inconsistent. We +- don't know what your operating system will do. +- +- If the 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 the 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 the name +- NEWNAME changes "atomically" from any previously existing file by +- that name to its new meaning (the file that was called OLDNAME). +- There is no instant at which NEWNAME is nonexistent "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' +- The OLDNAME is a directory that contains NEWNAME. +- +- `EISDIR' +- The NEWNAME names a directory, but the OLDNAME doesn't. +- +- `EMLINK' +- The parent directory of NEWNAME would have too many links. +- +- `ENOENT' +- The file named by 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 OLDNAMES 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 whose name is +- 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. +- +- 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, and the like. This kind of information is called the "file +-attributes"; it is 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 these attributes of files. +- +-* 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 +- +-What the File Attribute Values Mean +------------------------------------ +- +- 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 and the like, 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 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 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 +-bits machine 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 and the like, 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 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 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 at 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, 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: +- +- `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 +- file larger then 2^31 bytes on 32 bits 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 fiels on 32 bits 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 it is prepared to work on +- large files on 32 bits platforms. For large files the file +- descriptor FILEDES should be returned 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 fiels on 32 bits 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 +- file larger then 2^31 bytes on 32 bits 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 fiels on 32 bits 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, whether it is +-a socket, and so on. For information about the access permission, +-*Note Permission Bits::. +- +- There are two predefined ways you can access the file type portion of +-the file mode. First of all, for each type of file, there is a +-"predicate macro" which examines a file mode value and returns true or +-false--is the file of that type, or not. Secondly, you can mask out +-the rest of the file mode to get just a file type code. You can +-compare this against various constants for 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 nonzero if the file is a directory. +- +- - Macro: int S_ISCHR (mode_t M) +- This macro returns nonzero if the file is a character special file +- (a device like a terminal). +- +- - Macro: int S_ISBLK (mode_t M) +- This macro returns nonzero if the file is a block special file (a +- device like a disk). +- +- - Macro: int S_ISREG (mode_t M) +- This macro returns nonzero if the file is a regular file. +- +- - Macro: int S_ISFIFO (mode_t M) +- This macro returns nonzero 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 nonzero if the file is a symbolic link. *Note +- Symbolic Links::. +- +- - Macro: int S_ISSOCK (mode_t M) +- This macro returns nonzero 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 ANDed with +-`S_IFMT' to extract the file type code, and compared to the appropriate +-type code 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 portion of a +- mode value. +- +- These are the symbolic names for the different file type codes: +- +-`S_IFDIR' +- This macro represents the value of the file type code for a +- directory file. +- +-`S_IFCHR' +- This macro represents the value of the file type code for a +- character-oriented device file. +- +-`S_IFBLK' +- This macro represents the value of the file type code for a +- block-oriented device file. +- +-`S_IFREG' +- This macro represents the value of the file type code for a +- regular file. +- +-`S_IFLNK' +- This macro represents the value of the file type code for a +- symbolic link. +- +-`S_IFSOCK' +- This macro represents the value of the file type code for a socket. +- +-`S_IFIFO' +- This macro represents the value of the file type code for a FIFO +- or pipe. +- +- +-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 user that is the +-owner, another set that apply to users who belong to the file's group, +-and a third set of bits that apply 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 from the effective user ID +-of the process that creates it (*note Process Persona::.). The file's +-group ID may be set from either 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 rule, 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 bits of the file's permissions. +- (This is because those bits may not be appropriate for the new +- owner.) The 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 file +- with open file 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. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-22 glibc-2.1.3/manual/libc.info-22 +--- ../glibc-2.1.3/manual/libc.info-22 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-22 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1259 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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. +- +- On a directory, it gives permission to delete a file in the +- directory only if you own that file. Ordinarily, a user either +- can delete all the files in the directory or cannot delete any of +- them (based on whether the user has write permission for the +- directory). The same restriction applies--you must both have +- 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. In this use the sticky bit also says +- 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. It is not only non-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 file permission bits. As a special case, for a file to be +-executable even for 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 for +-the newly created file. But the specified 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 specified to the creation 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 ignores the file creation mask; it uses exactly +-the specified permission bits. +- +- In normal use, the file creation mask is initialized in 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 do automatically what it is supposed to +-do. +- +- When your program should 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 that 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 the FILENAME names a symbolic link, `chmod' changes the +- permission 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 +- permission 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 file currently open via descriptor 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 +- permission 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 +------------------------------------ +- +- When a program runs as a privileged user, this permits it to access +-files off-limits to ordinary users--for example, to modify +-`/etc/passwd'. Programs designed to be run by ordinary users but +-access such files use the setuid bit feature so that they always run +-with `root' as the effective user ID. +- +- Such a program may also access files specified by the user, files +-which conceptually are being accessed explicitly by the user. Since the +-program runs as `root', it has permission to access whatever file the +-user specifies--but usually the desired behavior is to permit only +-those files which the user could ordinarily access. +- +- 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 ID's of the calling +- process, rather than the *effective* ID's, 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 +- Argument that means, test for read permission. +- +- - Macro: int W_OK +- Argument that means, test for write permission. +- +- - Macro: int X_OK +- Argument that means, test for execute/search permission. +- +- - Macro: int F_OK +- Argument that means, test for existence of the file. +- +- +-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 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 at 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 on 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. This error +- is used to report the problem. +- +- `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 for the +- file named by FILENAME. The new file access time is specified by +- `TVP[0]', and the new modification time by `TVP[1]'. This +- function comes from BSD. +- +- The return values and error conditions are the same as for the +- `utime' function. +- +- +-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 in an +-`open' or `fopen' call. +- +- However, sometimes it is neccessary 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. +- +- 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. +- +- 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 occured. +- +- `EPERM' +- The file is "append-only" or "immutable". +- +- `EINTR' +- The operation was interrupted by a signal. +- +- +- - Function: int ftruncate (int FD, off_t LENGTH) +- This is like `truncate', but it works on a file descriptor FD. +- +- `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. +- +- 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 write. +- +- `EINVAL' +- LENGTH is negative. +- +- `EFBIG' +- The operation would extend the file beyond the limits of the +- operating system. +- +- `EIO' +- A hardware I/O error occured. +- +- `EPERM' +- The file is "append-only" or "immutable". +- +- `EINTR' +- The operation was interrupted by a signal. +- +- +- As announced here is a little example 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' allows to add at arbitrary positions in the file +-given blocks of memory. If the current size of the file is too small it +-is extended. Please note the it is extended in multiples of a pagesize. +-This is a requirement of `mmap'. The program has to track the real +-size and once the program finished to work 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 make 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 bits 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 for is opened using `tmpfile64'. Therefore this stream +- can be used even on files larger then 2^31 bytes on 32 bits +- 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 file name that is a valid +- file name and that does not name 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 +- fixed length of a temporary file name gives room for only a finite +- number of different names. If `tmpnam' fails, it returns a null +- pointer. +- +- *Warning:* Since between the time the pathname is constructed and +- the file is created another process might have created a file with +- this name using `tmpnam' is a possible security hole. The +- implementation generates names which hardly can be predicted but +- opening the file in any case should use the `O_EXCL' flag. Using +- `tmpfile' is a safe way to avoid this problem. +- +- - Function: char * tmpnam_r (char *RESULT) +- This function is nearly identical to the `tmpnam' function. But it +- does not allow RESULT to be a null pointer. In the later case a +- null pointer is returned. +- +- This function is reentrant because the non-reentrant situation of +- `tmpnam' cannot happen here. +- +- - Macro: int L_tmpnam +- The value of this macro is an integer constant expression that +- represents the minimum allocation size of a string large enough to +- hold the 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 create the files, you will +- probably run out of disk space before you run 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 filename. 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'; 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. +- +- - 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:* Since between the time the pathname is constructed and +- the file is created another process might have created a file with +- this name using `mktemp' is a possible security hole. The +- implementation generates names which hardly can be predicted but +- opening the file in any case 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 open on that file +- 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 the mode must explicitly changed. +- +- 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 bit, which says you want to always create a new file, and +-get an error if the file already exists. +- +- +-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 <sys/types.h> +- #include <unistd.h> +- #include <stdio.h> +- #include <stdlib.h> +- +- /* 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. */ +- 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. */ +- 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 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 <stdio.h> +- #include <stdlib.h> +- +- 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, "Could not run more.\n"); +- return EXIT_FAILURE; +- } +- write_data (output); +- pclose (output); +- 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. But, 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'. This type was on almost all machines of this time 32 +-bits wide and so a de-factor standard required 32 bit variables. This +-is important since references to variables of this type are passed to +-the kernel. +- +- But then the POSIX people came and unified the interface with the +-words "all size values are of type `size_t'". But on 64 bit machines +-`size_t' is 64 bits wide, and so variable references are not anymore +-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. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-23 glibc-2.1.3/manual/libc.info-23 +--- ../glibc-2.1.3/manual/libc.info-23 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-23 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1160 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 resend 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 addresses; 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 in 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 which 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', for compatibility. (`PF_UNIX' +- is likewise a synonym for `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, all or most 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 for 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. +- +- +-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 `IFNAMSIZE' 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. In order to +-connect to a socket, you must have read permission for 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 that is over with, 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 to 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 example following +- 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 <stddef.h> +- #include <stdio.h> +- #include <errno.h> +- #include <stdlib.h> +- #include <sys/socket.h> +- #include <sys/un.h> +- +- 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)); +- +- /* The size of the address is +- the offset of the start of the filename, +- plus its length, +- plus one for the terminating null byte. +- Alternativly 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. +- +- Originaly 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 neccessary: IP version 6 (IPv6). IPv6 +-introduces besides 128bit addresses (IPv4 has 32bit addresses) also +-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 AF_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 of `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. But the program needs a numeric +-address to open a connection; to use a host name, you must convert it +-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 address were introduced which changed the +-behaviour. 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 adresses 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 specifies 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 out of 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 as +-classless. The distinction between classes A, B, and C can be ignored. +-Instead a IPv4 host adddress consists of a 32-bit address and a 32-bit +-mask. The mask contains bits of 1 for the network part and bits of 0 +-for the host part. The 1-bits are contigous from the leftmost bit, the +-0-bits are contigous from the rightmost bit so that the netmask can also +-be written as a prefix length of bits of 1. 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 which is +-`0:0:0:0:0:0:0:1' can be just 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 initialise 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 initialise 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; they represent 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 data base 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') for the result. +- +- - Function: struct hostent * gethostbyaddr (const char *ADDR, int +- 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 data base. +- +-`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; +- 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->h_name; +- } +- +- - 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, int 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 in 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. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-24 glibc-2.1.3/manual/libc.info-24 +--- ../glibc-2.1.3/manual/libc.info-24 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-24 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1331 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 in 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 the +-"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 the 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 the 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 is 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 in 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 <stdio.h> +- #include <stdlib.h> +- #include <sys/socket.h> +- #include <netinet/in.h> +- +- 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 <stdio.h> +- #include <stdlib.h> +- #include <sys/socket.h> +- #include <netinet/in.h> +- #include <netdb.h> +- +- 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; +- } +- +- +-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 on `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. +- +- `EACCESS' +- The process does not have 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. But, 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 are 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 only 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, using 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 cancelation point in multi-threaded +- programs. So one has to be prepared for this and make sure that +- possibly 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 connect 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 a `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 cancelation point in multi-threaded +- programs. So one has to be prepared for this and make sure that +- possibly 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 the 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 cancelation point in multi-threaded +- programs. So one has to be prepared for this and make sure that +- possibly 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 is 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 cancelation point in multi-threaded +- programs. So one has to be prepared for this and make sure that +- possibly 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 <stdio.h> +- #include <errno.h> +- #include <stdlib.h> +- #include <unistd.h> +- #include <sys/types.h> +- #include <sys/socket.h> +- #include <netinet/in.h> +- #include <netdb.h> +- +- #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 <stdio.h> +- #include <errno.h> +- #include <stdlib.h> +- #include <unistd.h> +- #include <sys/types.h> +- #include <sys/socket.h> +- #include <netinet/in.h> +- #include <netdb.h> +- +- #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. +-The way to send out-of-band data is using `send', specifying the flag +-`MSG_OOB' (*note Sending Data::.). +- +- Out-of-band data is 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 the ordinary data. +- +- When a socket finds that out-of-band data is on its 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 is 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 *buffer; +- 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 is 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? */ +- char *buffer = (char *) xmalloc (1024); +- int success; +- int atmark; +- +- /* Try again to read the out-of-band data. */ +- success = recv (socket, buffer, sizeof buffer, MSG_OOB); +- if (success >= 0) +- { +- /* We got it, so return it. */ +- struct buffer *link +- = (struct buffer *) xmalloc (sizeof (struct buffer)); +- link->buffer = buffer; +- 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, buffer, sizeof buffer); +- if (success < 0) +- perror ("read"); +- +- /* Save this data in the buffer list. */ +- { +- struct buffer *link +- = (struct buffer *) xmalloc (sizeof (struct buffer)); +- link->buffer = buffer; +- 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, then 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 +- due to a problem related to a previous call. +- +- This function is defined as a cancelation point in multi-threaded +- programs. So one has to be prepared for this and make sure that +- possibly allocated resources (like memory, files descriptors, +- semaphores or whatever) are freed even if the thread is canceled. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-25 glibc-2.1.3/manual/libc.info-25 +--- ../glibc-2.1.3/manual/libc.info-25 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-25 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1208 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 cancelation point in multi-threaded +- programs. So one has to be prepared for this and make sure that +- possibly 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 know 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 <stdio.h> +- #include <errno.h> +- #include <stdlib.h> +- #include <sys/socket.h> +- #include <sys/un.h> +- +- #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 <stdio.h> +- #include <errno.h> +- #include <unistd.h> +- #include <stdlib.h> +- #include <sys/socket.h> +- #include <sys/un.h> +- +- #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 it 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 resend 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 service for 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. So 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 many as 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. +- +- +-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, which has 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 is 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 data base, 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 in 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: Mathematics, 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. +-* 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: Line Control, 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'. +- +-* 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 tcgetattr"); +- return; +- } +- 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 <RET> and <LFD> 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 <RET> 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'. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-26 glibc-2.1.3/manual/libc.info-26 +--- ../glibc-2.1.3/manual/libc.info-26 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-26 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1201 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 <DEL>) 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. +- +- +-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 <RET> 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 <DEL>. +- +- - 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: int 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: Line Control, Next: Noncanon Example, Prev: 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 cancelation 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 cancelation 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 <unistd.h> +- #include <stdio.h> +- #include <stdlib.h> +- #include <termios.h> +- +- /* 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. +- +- `ENINVAL' +- The FILEDES argument is not associated with a master +- pseudo-terminal device. +- +- `EACCESS' +- 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: Mathematics, Next: Arithmetic, Prev: Low-Level Terminal Interface, 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 C 89. The +-`float' and `long double' versions are from the numeric extensions to C +-included in ISO C 9X. +- +- 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 accomodate 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. +-* 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 circumrefence 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. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-27 glibc-2.1.3/manual/libc.info-27 +--- ../glibc-2.1.3/manual/libc.info-27 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-27 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1146 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 C 9x 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 C 9x 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 denormalized, `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 C 9X. +- +- - 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 C 9X. +- +- 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 due 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 C 9X 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: Pseudo-Random Numbers, 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, and, `-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 nonpositive 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. +- +- - 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 and +- `lgamma' is also standardized in ISO C 9x 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 C 9x. +- +- - 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. +- +- +-File: libc.info, Node: Pseudo-Random Numbers, Next: FP Function Optimizations, Prev: Special 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 get 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: int32_t random (void) +- This function returns the next pseudo-random number in the +- sequence. The value returned ranges from `0' to `RAND_MAX'. +- +- *Note:* Historically this function returned a `long int' value. +- On 64bit systems `long int' would have been larger than programs +- expected, so `random' is now defined to return exactly 32 bits. +- +- - 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. +- +- +-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 functions: those which use a state +-of the random number generator which is shared among several functions +-and by all threads of the process. The second group of functions +-require 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 work. 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. +- +- - 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), similar 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 using to get reproducible results. +- +- - Function: long int lrand48 (void) +- The `lrand48' functions return 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 afterwards updated so that subsequent +- calls to this function yield to different results (as it is +- expected by a random number generator). The array should have +- been initialized before the first call to get 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 functions 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 +- state 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 the 32 bits only the lower 32 bits are used. +- +- Due to this limitation the initialization of the state using this +- function of 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 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 content 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 allows to specify even more information by allowing 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 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 +-get an individual random number generator. +- +- The user supplied buffer must be of type `struct drand48_data'. +-This type should be regarded as opaque and no member should be used +-directly. +- +- - Function: int drand48_r (struct drand48_data *BUFFER, double *RESULT) +- This function is equivalent to the `drand48' function with the +- difference it does not modify the global random number generator +- parameters but instead the parameters is the buffer supplied by the +- buffer through the pointer BUFFER. The random number is return in +- the variable pointed to by RESULT. +- +- The return value of the function indicate 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 the `erand48' and 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 return in the +- variable pointed to by RESULT. +- +- The return value is non-negative is 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' and it takes a pointer to a +- buffer describing the state of the random number generator as a +- parameter 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 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 as the other reentrant +- function 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'. But as 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 should be used the buffer of type +-`struct drand48_data' should initialized. The easiest way is to fill +-the whole buffer with null bytes, e.g., using +- +- 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 too use any of the functions which +-explicitely initialize the buffer. Though it might be obvious how to +-initialize the buffer from the data given as parameter from 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 similar to what the function +- `srand48' does. The state is initialized from the parameter +- SEEDVAL and the parameters for the congruential formula are +- initialized to the 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 rerun 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 by the data in PARAM. Here it is +- especially true the function does more than just copying the +- contents of PARAM of BUFFER. Some more actions are required and +- therefore it is important to use this function and not initialized +- 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 function it is often the +-case that the costs for the function calls itselfs are not neglectable. +-Modern processor implementation often can execute the operation itself +-very fast but the call means a disturbance of the control flow. +- +- For this reason the GNU C Library provides optimizations for many of +-the frequently used math functions. When the GNU CC is used and the +-user activates the optimizer several new inline functions and macros get +-defined. These new functions and macros have the same names as the +-library function and so get used instead of the later. In case of +-inline functions the compiler will decide whether it is reasonable to +-use the inline function and this decision is usually correct. +- +- For the generated code this means that no calls to the library +-functions are necessary. This increases the speed significantly. But +-the drawback is that the code size increases and this increase is not +-always neglectable. +- +- The speed increase has one drawback: the inline functions might not +-set `errno' and might not have the same precission as the library +-functions. +- +- 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 make sure only library functions are used. Of +-course it can be determined for each single file in the project whether +-giving this option is preferred or not. +- +- Not all hardware implements the entire IEEE 754 standard, or 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 unpipelined, which more than doubles 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: +- +-* 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. +-* Integer Division:: Integer division with guaranteed rounding. +-* Parsing of Numbers:: Converting strings to numbers. +-* System V Number Conversion:: An archaic way to convert numbers to strings. +- +- +-File: libc.info, Node: Floating Point Numbers, Next: Floating Point Classes, 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). +- +diff -Naur ../glibc-2.1.3/manual/libc.info-28 glibc-2.1.3/manual/libc.info-28 +--- ../glibc-2.1.3/manual/libc.info-28 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-28 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1161 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Floating Point Classes, Next: Floating Point Errors, Prev: Floating Point Numbers, Up: Arithmetic +- +-Floating-Point Number Classification Functions +-============================================== +- +- ISO C 9x 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 C9x 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 C 9x 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. +- +- - Function: double infnan (int ERROR) +- This function is provided for compatibility with BSD. Its +- argument is an error code, `EDOM' or `ERANGE'; `infnan' returns the +- value that a math function would return if it set `errno' to that +- value. *Note Math Error Reporting::. `-ERANGE' is also acceptable +- as an argument, and corresponds to `-HUGE_VAL' as a value. +- +- In the BSD library, on certain machines, `infnan' raises a fatal +- signal in all cases. The GNU library does not do likewise, +- because that does not fit the ISO C specification. +- +- *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 C 9X 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 C 9x 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: void feclearexcept (int EXCEPTS) +- This function clears all of the supported exception flags +- indicated by EXCEPTS. +- +- - 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: void 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. +- +- - Function: void 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. +- +- 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. +- +- +-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 a nonzero value if it changed +- the rounding mode, zero 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: void fegetenv (fenv_t *ENVP) +- Store the floating-point environment in the variable pointed to by +- ENVP. +- +- - 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 zero. If it +- succeeds, it returns a nonzero value. +- +- The functions which restore the floating-point environment can take +-two 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_'. +- +- 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: void fesetenv (const fenv_t *ENVP) +- Set the floating-point environment to that described by ENVP. +- +- - Function: void 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. +- +- +-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 C 9x. +- +- - 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'. +- +- - Function: double logb (double X) +- - Function: float logbf (float X) +- - Function: long double logbl (long double X) +- These functions return the integer part of the base-2 logarithm of +- X, an integer value represented in type `double'. This is the +- highest integer power of `2' contained in X. The sign of X is +- ignored. For example, `logb (3.5)' is `1.0' and `logb (4.0)' is +- `2.0'. +- +- When `2' raised to this power is divided into X, it gives a +- quotient between `1' (inclusive) and `2' (exclusive). +- +- If X is zero, the return value is minus infinity if the machine +- supports infinities, and a very small number if it does not. If X +- is infinity, the return value is infinity. +- +- For finite X, the value returned by `logb' is one less than the +- value that `frexp' would store into `*EXPONENT'. +- +- - 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) +- `trunc' is another name for `floor' +- +- - 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 C 9x 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 X. 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 C 9x +-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 C 9x 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 <complex.h> +- #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'.) +- +- +diff -Naur ../glibc-2.1.3/manual/libc.info-29 glibc-2.1.3/manual/libc.info-29 +--- ../glibc-2.1.3/manual/libc.info-29 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-29 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1129 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Operations on Complex, Next: Integer Division, Prev: Complex Numbers, Up: Arithmetic +- +-Projections, Conjugates, and Decomposing of Complex Numbers +-=========================================================== +- +- ISO C 9x 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: Integer Division, Next: Parsing of Numbers, Prev: Operations on Complex, 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 C 9x. +- +- - 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'.) +- +- - 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'. +- +- The `imaxdiv' function was added in ISO C 9x. +- +- +-File: libc.info, Node: Parsing of Numbers, Next: System V Number Conversion, Prev: Integer Division, 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 +-------------------- +- +- These functions are declared in `stdlib.h'. +- +- - Function: long int strtol (const char *STRING, char **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 `35'. 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: unsigned long int strtoul (const char *STRING, char +- **TAILPTR, int BASE) +- The `strtoul' ("string-to-unsigned-long") function is like +- `strtol' except it returns an `unsigned long int' value. If the +- number has a leading `-' sign, the return value is negated. The +- syntax is the same as described above for `strtol'. The value +- returned on overflow is `ULONG_MAX' (*note Range of Type::.). +- +- `strtoul' sets ERRNO to `EINVAL' if BASE is out of range, or +- `ERANGE' on overflow. +- +- - Function: long long int strtoll (const char *STRING, char **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 C 9x. +- +- - Function: long long int strtoq (const char *STRING, char **TAILPTR, +- int BASE) +- `strtoq' ("string-to-quad-word") is the BSD name for `strtoll'. +- +- - Function: unsigned long long int strtoull (const char *STRING, char +- **TAILPTR, int BASE) +- The `strtoull' function is like `strtoul' except that it returns +- an `unsigned long long int'. The value returned on overflow is +- `ULONG_LONG_MAX' (*note Range of Type::.). +- +- The `strtoull' function was introduced in ISO C 9x. +- +- - Function: unsigned long long int strtouq (const char *STRING, char +- **TAILPTR, int BASE) +- `strtouq' is the BSD name for `strtoull'. +- +- - 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 C 9x. It too is +- obsolete (despite having just been added); use `strtoll' instead. +- +- Some locales specify a printed syntax for numbers other than the one +-that these functions understand. If you need to read numbers formatted +-in some other locale, you can use the `strtoX_l' functions. Each of +-the `strtoX' functions has a counterpart with `_l' added to its name. +-The `_l' counterparts take an additional argument: a pointer to an +-`locale_t' structure, which describes how the numbers to be read are +-formatted. *Note Locales::. +- +- *Portability Note:* These functions are all GNU extensions. You can +-also use `scanf' or its relatives, which have the `'' flag for parsing +-numeric input according to the current locale (*note Numeric Input +-Conversions::.). This feature is standard. +- +- 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; +- } +- +- +-File: libc.info, Node: Parsing of Floats, Prev: Parsing of Integers, Up: Parsing of Numbers +- +-Parsing of Floats +------------------ +- +- These functions are declared in `stdlib.h'. +- +- - Function: double strtod (const char *STRING, char **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 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. +- +- * 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 are GNU extensions. +- +- - 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 thse 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: Non-Local Exits, Prev: Arithmetic, Up: Top +- +-Date and Time +-************* +- +- This chapter describes functions for manipulating dates and times, +-including functions for determining what the current time is and +-conversion between different time representations. +- +- The time functions fall into three main categories: +- +- * Functions for measuring elapsed CPU time are discussed in *Note +- Processor Time::. +- +- * Functions for measuring absolute clock or calendar time are +- discussed in *Note Calendar Time::. +- +- * Functions for setting alarms and timers are discussed in *Note +- Setting an Alarm::. +- +-* Menu: +- +-* Processor Time:: Measures processor time used by a program. +-* Calendar Time:: Manipulation of "real" dates and times. +-* Precision Time:: Manipulation and monitoring of high accuracy +- time. +-* Setting an Alarm:: Sending a signal after a specified time. +-* Sleeping:: Waiting for a period of time. +-* Resource Usage:: Measuring various resources used. +-* Limits on Resources:: Specifying limits on resource usage. +-* Priority:: Reading or setting process run priority. +- +- +-File: libc.info, Node: Processor Time, Next: Calendar Time, Up: Date and Time +- +-Processor Time +-============== +- +- If you're trying to optimize your program or measure its efficiency, +-it's very useful to be able to know how much "processor time" or "CPU +-time" it has used at any given point. Processor time is different from +-actual wall clock time because it doesn't include any time spent waiting +-for I/O or when some other process is running. Processor time is +-represented by the data type `clock_t', and is given as a number of +-"clock ticks" relative to an arbitrary base time marking the beginning +-of a single program invocation. +- +-* Menu: +- +-* Basic CPU Time:: The `clock' function. +-* Detailed CPU Time:: The `times' function. +- +- +-File: libc.info, Node: Basic CPU Time, Next: Detailed CPU Time, Up: Processor Time +- +-Basic CPU Time Inquiry +----------------------- +- +- To get the elapsed CPU time used by a process, 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), like +-this: +- +- #include <time.h> +- +- clock_t start, end; +- double elapsed; +- +- start = clock(); +- ... /* Do the work. */ +- end = clock(); +- elapsed = ((double) (end - start)) / CLOCKS_PER_SEC; +- +- Different computers and operating systems vary wildly in how they +-keep track of processor time. It's common for the internal processor +-clock to have a resolution somewhere between hundredth and millionth of +-a second. +- +- 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 type of the macro `CLOCKS_PER_SEC' can be either +-integer or floating-point types. Casting processor 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 a wrap around happens after around +-36 minutes. +- +- - 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 +- is one million independend 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 in units of clock ticks. +- +- - Function: clock_t clock (void) +- This function returns the elapsed processor time. The base time is +- arbitrary but doesn't change within a single process. If the +- processor time is not available or cannot be represented, `clock' +- returns the value `(clock_t)(-1)'. +- +- +-File: libc.info, Node: Detailed CPU Time, Prev: Basic CPU Time, Up: Processor Time +- +-Detailed Elapsed CPU Time Inquiry +---------------------------------- +- +- The `times' function returns more detailed information about elapsed +-processor time in a `struct tms' object. 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 CPU time used in executing the instructions of +- the calling process. +- +- `clock_t tms_stime' +- This is the CPU time used by the system 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 CPU 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 CPU +- time used by the system on behalf of all the terminated child +- processes of the calling process. +- +- All of the times are given in clock ticks. These are absolute +- values; in a newly created process, they are all zero. *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 same as the value of `clock()': the elapsed +- real time relative to an arbitrary base. The base is a constant +- within a particular process, and typically represents the time +- since system start-up. A value of `(clock_t)(-1)' is returned to +- indicate failure. +- +- *Portability Note:* The `clock' function described in *Note Basic +-CPU Time::, is specified by the ISO C standard. The `times' function +-is a feature of POSIX.1. In the GNU system, the value returned by the +-`clock' function is equivalent to the sum of the `tms_utime' and +-`tms_stime' fields returned by `times'. +- +- +-File: libc.info, Node: Calendar Time, Next: Precision Time, Prev: Processor Time, Up: Date and Time +- +-Calendar Time +-============= +- +- This section describes facilities for keeping track of dates and +-times according to the Gregorian calendar. +- +- There are three representations for date and time information: +- +- * "Calendar time" (the `time_t' data type) is a compact +- representation, typically giving the number of seconds elapsed +- since some implementation-specific base time. +- +- * There is also a "high-resolution time" representation (the `struct +- timeval' data type) that includes fractions of a second. Use this +- time representation instead of ordinary calendar time when you +- need greater precision. +- +- * "Local time" or "broken-down time" (the `struct tm' data type) +- represents the date and time as a set of components specifying the +- year, month, and so on, for a specific time zone. This time +- representation is usually used in conjunction with formatting date +- and time values. +- +-* 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. +-* Formatting Date and 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, and the functions which operate on calendar time objects. +-These facilities are declared in the header file `time.h'. +- +- - Data Type: time_t +- This is the data type used to represent calendar time. When +- interpreted as an absolute time value, it represents the number of +- seconds elapsed since 00:00:00 on January 1, 1970, Coordinated +- Universal Time. (This date is sometimes referred to as the +- "epoch".) POSIX requires that this count ignore leap seconds, but +- on some hosts this count includes leap seconds if you set `TZ' to +- certain values (*note TZ Variable::.). +- +- 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. +- +- - Function: double difftime (time_t TIME1, time_t TIME0) +- The `difftime' function returns the number of seconds elapsed +- between time TIME1 and 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. +- +- - Function: time_t time (time_t *RESULT) +- The `time' function returns the current time as a value of type +- `time_t'. If the argument RESULT is not a null pointer, the time +- value is also stored in `*RESULT'. If the calendar time is not +- available, the value `(time_t)(-1)' is returned. +- +- +-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 calendar 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 timeval +- The `struct timeval' structure represents a calendar time. It has +- the following members: +- +- `long int tv_sec' +- This represents the number of seconds since the epoch. It is +- equivalent to a normal `time_t' value. +- +- `long int tv_usec' +- This is the fractional second value, represented as the +- number of microseconds. +- +- Some times struct timeval values are used for time intervals. +- Then the `tv_sec' member is the number of seconds in the +- interval, and `tv_usec' is the number of additional +- microseconds. +- +- - 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::. +- +- It is often necessary to subtract two values of type +-`struct timeval'. 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; +- } +- +- - Function: int gettimeofday (struct timeval *TP, struct timezone *TZP) +- The `gettimeofday' function returns the current date and time in +- the `struct timeval' structure indicated by TP. 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 date and time +- according to the arguments. 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'. +- +- 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 time 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 gradual adjustments in the current time. This ensures that +- the time reported by the system clock is always monotonically +- increasing, which might not happen if you simply set the current +- time. +- +- The DELTA argument specifies a relative adjustment to be made to +- the current time. If negative, the system clock is slowed down +- for a while until it has lost this much 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. 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. +- +- +-File: libc.info, Node: Broken-down Time, Next: Formatting Date and Time, Prev: High-Resolution Calendar, Up: Calendar Time +- +-Broken-down Time +----------------- +- +- Calendar time is represented as a number of seconds. This is +-convenient for calculation, but has no resemblance to the way people +-normally represent dates and times. By contrast, "broken-down time" is +-a binary representation 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. +- +- A broken-down time value is always relative to a choice of local time +-zone, and it also indicates which time zone was used. +- +- 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 seconds after the minute, normally in +- the range `0' through `59'. (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 minutes after the hour, in the range +- `0' through `59'. +- +- `int tm_hour' +- This is the number of hours past midnight, in the range `0' +- through `23'. +- +- `int tm_mday' +- This is the day of the month, in the range `1' through `31'. +- +- `int tm_mon' +- This is the number of months since January, in the range `0' +- through `11'. +- +- `int tm_year' +- This is the number of years since `1900'. +- +- `int tm_wday' +- This is the number of days since Sunday, in the range `0' +- through `6'. +- +- `int tm_yday' +- This is the number of days since January 1, 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 calendar 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 varient 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 the +- calendar 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)--that is, as Greenwich Mean Time (GMT)--rather than relative +- to the local time zone. +- +- Recall that calendar times are *always* expressed in coordinated +- universal time. +- +- 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 calendar 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 compute the +- calendar time; it's permissible for these components to have +- unnormalized values outside of 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 +- calendar 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::. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-3 glibc-2.1.3/manual/libc.info-3 +--- ../glibc-2.1.3/manual/libc.info-3 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-3 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1292 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 +- +- *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::. +- +- 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 is a new feature of +-ISO C. 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 <errno.h> +- #include <stdio.h> +- #include <stdlib.h> +- #include <string.h> +- +- 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; +- } +- +- +-File: libc.info, Node: Memory Allocation, Next: Character Handling, Prev: Error Reporting, Up: Top +- +-Memory Allocation +-***************** +- +- The GNU system provides several methods for allocating memory space +-under explicit program control. They vary in generality and in +-efficiency. +- +-* Menu: +- +-* Memory Concepts:: An introduction to concepts and terminology. +-* Dynamic 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 Concepts, Next: Dynamic Allocation and C, Up: Memory Allocation +- +-Dynamic Memory Allocation Concepts +-================================== +- +- "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 number of memory blocks you need, or how +-long you continue to need them, depends on the data you are working on. +- +- 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 storage 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. +- +- +-File: libc.info, Node: Dynamic Allocation and C, Next: Unconstrained Allocation, Prev: Memory Concepts, Up: Memory Allocation +- +-Dynamic Allocation and C +-======================== +- +- 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, 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 length of the automatic storage can be an expression +- that varies. In other C implementations, it must be a constant. +- +- 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 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: Dynamic 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: +- `memalign' and `valloc'. +-* 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 Storage 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' 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::.). +- +- +-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 storage 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 apposed to other versions, the `malloc' in GNU libc 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' or `valloc'. These functions are +-declared in `stdlib.h'. +- +- With the GNU library, you can use `free' to free the blocks that +-`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: 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); +- } +- +- +-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, +- releaseable 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'. +- +- `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 storage 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. Alternately 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 proteced 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. +- +- So, what's the difference between using `MALLOC_CHECK_' and linking +-with `-lmcheck'? `MALLOC_CHECK_' is orthognal 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. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-30 glibc-2.1.3/manual/libc.info-30 +--- ../glibc-2.1.3/manual/libc.info-30 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-30 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1213 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Formatting Date and Time, Next: Parsing Date and Time, Prev: Broken-down Time, Up: Calendar Time +- +-Formatting Date and Time +------------------------- +- +- The functions described in this section format 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 at +- least room for 16 bytes. +- +- 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 the time +- value is specified as a `time_t' calendar 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', only that it 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 are POSIX.2 extensions, 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 date and 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 is a POSIX.2 extension. +- +- `%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 is a POSIX.2 extension. +- +- `%e' +- The day of the month like with `%d', but padded with blank +- (range ` 1' through `31'). +- +- This format is a POSIX.2 extension. +- +- `%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 is a ISO C 9X extension. +- +- `%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 is a GNU extension. +- +- `%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 is a GNU extension. +- +- `%h' +- The abbreviated month name according to the current locale. +- The action is the same as for `%b'. +- +- This format is a POSIX.2 extension. +- +- `%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 is a POSIX.2 extension. +- +- `%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'. +- +- `%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'. +- +- This format is a GNU extension. +- +- `%r' +- The complete time using the AM/PM format of the current +- locale. +- +- This format is a POSIX.2 extension. +- +- `%R' +- The hour and minute in decimal numbers using the format +- `%H:%M'. +- +- This format is 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 is a POSIX.2 extension. +- +- `%T' +- The time using decimal numbers using the format `%H:%M:%S'. +- +- This format is a POSIX.2 extension. +- +- `%u' +- The day of the week as a decimal number (range `1' through +- `7'), Monday being `1'. +- +- This format is a POSIX.2 extension. +- +- `%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 is a POSIX.2 extension. +- +- `%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, but +- without the time. +- +- `%X' +- The preferred time representation for the current locale, but +- with no date. +- +- `%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 is a GNU extension. +- +- 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 content of the array S +- is indetermined. 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::. +- +- +-File: libc.info, Node: Parsing Date and Time, Next: TZ Variable, Prev: Formatting Date and 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 +-lead to variety of more or less successful implementations with +-different interfaces over the years. Then the Unix standard got +-extended by two functions: `strptime' and `getdate'. Both have kind of +-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 +-.......................................... +- +- The first function is a rather low-level interface. It is +-nevertheless frequently used in user programs since it is better known. +-Its implementation and the interface though is 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 the found values in the structure TP. +- +- The input string can be retrieved in any way. It does not matter +- whether it was generated by a `strftime' call or made up directly +- by a program. It is also not necessary that the content is in any +- human-recognizable format. I.e., it is OK if a date is written +- like `"02:1999:9"' which is not understandable without context. +- As long the format string FMT matches the format of the input +- string everything goes. +- +- The format string consists of the same components as the format +- string for the `strftime' function. The only difference is that +- the flags `_', `-', `0', and `^' are not allowed. Several of the +- formats which `strftime' handled differently do the same work in +- `strptime' since differences like case of the output do not +- matter. For symmetry reasons 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 makes sometimes sense to use this format since +- in some cultures it is required to specify years relative to +- periods 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 the locale's alternative numeric symbols are +- used. +- +- Leading zeroes are permitted but not required. +- +- `%D' +- Equivalent to the use of `%m/%d/%y' in this place. +- +- `%F' +- Equivalent to the use of `%Y-%m-%d' which is the ISO 8601 date +- format. +- +- This is a GNU extension following an ISO C 9X extension to +- `strftime'. +- +- `%g' +- The year corresponding to the ISO week number, but without +- the century (range `00' through `99'). +- +- *Note:* This is not really implemented currently. 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:* This is not really implemented currently. 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 are used. +- +- `%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 are used. +- +- `%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 are used. +- +- `%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 are used. +- +- `%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 `61'). +- +- Leading zeroes are permitted but not required. +- +- Please note the nonsense with `61' being allowed. This is +- what the Unix specification says. They followed the stupid +- decision once made to allow double leap seconds. These do +- not exist but the myth persists. +- +- `%OS' +- Same as `%S' but using the locale's alternative numeric +- symbols are used. +- +- `%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:* This is not really implemented currently. 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 are used. +- +- `%V' +- The ISO 8601:1988 week number as a decimal number (range `1' +- through `53'). +- +- Leading zeroes are permitted but not required. +- +- *Note:* This is not really implemented currently. 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:* This is not really implemented currently. 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 are used. +- +- `%W' +- The week number of the current year as a decimal number +- (range `0' through `53'). +- +- Leading zeroes are permitted but not required. +- +- *Note:* This is not really implemented currently. 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 are used. +- +- `%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. +- +- Please note that it is at least 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' +- Equivalent to the use of `%a, %d %b %Y %H:%M:%S %z' in this +- place. This is the full ISO 8601 date and time format. +- +- `%Z' +- The timezone name. +- +- *Note:* This is not really implemented currently. 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 white space characters +- in the input string. +- +- 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 return value of the function is a pointer to the first +- character not processed in this function call. In case the input +- string contains more characters than required by the format string +- the return value points right after the last consumed input +- character. In case the whole input string is consumed the return +- value points to the NUL byte at the end of the string. If +- `strptime' fails to match all of the format string and therefore +- an error occurred the function returns `NULL'. +- +- The specification of the function in the XPG standard is rather +-vague. It leaves out a few important pieces of information. Most +-important it does not specify what happens to those elements of TM +-which are not directly initialized by the different formats. Various +-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 one +- has to prepare the structure passed in as the TM. Normally this +- will mean that all values are initialized to zero. Alternatively +- one can use all fields to values like `INT_MAX' which allows 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 one wants to find out +- whether a certain field in TM was initialized by the function call. +- +- * One can construct a `struct tm' value in several `strptime' calls +- in a row. A useful application of this is for example the parsing +- of two separate strings, one containing the date information, the +- other the time information. By parsing both one after the other +- without clearing the structure in between one can construct a +- complete broken-down time. +- +- The following example shows a function which parses a string which is +-supposed to contain 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 user-friendlier way to parse times and dates +-.............................................. +- +- The Unix standard defines another function to parse date strings. +-The interface is, mildly said, weird. But if this function fits into +-the application to be written it is just fine. It is a problem when +-using this function in multi-threaded programs or in libraries since it +-returns a pointer to a static variable, uses a global variable, and a +-global state (an environment variable). +- +- - Variable: getdate_err +- This variable of type `int' will contain the error code of the last +- unsuccessful call of the `getdate' function. 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 no 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 string is invalid for a template which would match +- otherwise. This includes error like February 31st, or return +- values which can be represented using `time_t'. +- +- - Function: struct tm * getdate (const char *STRING) +- The interface of the `getdate' function is the simplest possible +- for a function to parse a string and return the value. STRING is +- the input string and the result is passed to the user in a +- statically allocated variable. +- +- The details about how the string is processed is hidden from the +- user. In fact, it can be outside the control of the program. +- Which formats are recognized is controlled by the file named by +- the environment variable `DATEMSK'. The content of the named 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 which were not initialized through the format string get +- assigned the values of the time the `getdate' function is called. +- +- The format elements recognized by `getdate' are the same as for +- `strptime'. See above for an explanation. There are only a few +- extension to the `strptime' behavior: +- +- * If the `%Z' format is given the broken-down time is based on +- the current time in the timezone matched, not in 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) uses for countries other than the USA will fail. So +- far we have found no good solution for 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 this weeks day is selected. Otherwise +- next weeks day. +- +- * A similar heuristic is used if only the month is given, not +- the year. For value corresponding to the current or a later +- month the current year s used. Otherwise the next year. The +- first day of the month is assumed if it is not explicitly +- specified. +- +- * The current hour, minute, and second is used if the +- appropriate value is not set through the format. +- +- * If no date is given the date for the next day is used if the +- time is smaller than the current time. Otherwise it is the +- same day. +- +- 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 one 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 get the following results for the given input. +- +- 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 in the variable pointed to by the return value is only valid +- until the next `getdate' call which makes this function unusable in +- multi-threaded applications. +- +- The `errno' variable is *not* changed. Error conditions are +- signalled using 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 one 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 the error but instead the return value now is this error +- code. The same error codes as described in the `getdate_err' +- documentation above are used. +- +- `getdate_r' also does not store the broken-down time in a static +- variable. Instead it takes an second argument which must be a +- pointer to a variable of type `struct tm' where the broken-down +- can be stored. +- +- This function is not defined in the Unix standard. Nevertheless +- it is available on some other Unix systems as well. +- +- As for `getdate' the warning for using this function 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 the network from a different +-time zone, and would like times reported to you in the time zone that +-local for you, rather than what is local for the computer. +- +- In POSIX.1 systems the value of the `TZ' variable can be of 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 or +-embedded digits, commas, or plus or 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 one 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 one 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 stay away +- 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 savings time rules +- apply. A nonzero value does not necessarily mean that daylight +- savings time is now in effect; it means only that daylight savings +- 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 local time +-and calendar time functions. +- +- #include <time.h> +- #include <stdio.h> +- +- #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 -Naur ../glibc-2.1.3/manual/libc.info-31 glibc-2.1.3/manual/libc.info-31 +--- ../glibc-2.1.3/manual/libc.info-31 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-31 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1223 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Precision Time, Next: Setting an Alarm, Prev: Calendar Time, Up: Date and Time +- +-Precision Time +-============== +- +- The `net_gettime' and `ntp_adjtime' functions provide an interface +-to monitor and manipulate high precision time. These functions are +-declared in `sys/timex.h'. +- +- - Data Type: struct ntptimeval +- This structure is used to monitor kernel time. It contains the +- following members: +- `struct timeval time' +- This is the current time. The `struct timeval' data type is +- described in *Note High-Resolution Calendar::. +- +- `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 local clock against the true 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 kernel time in a +- greater level of detail. 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 local clock +- from the true 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 time and the local 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 valiable 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 and can't be changed. +- +- `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. +- +- `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 local clock. The value is +- expressed in scaled PPM and it denotes the difference in +- frequency between the local clock and the PPS signal. +- +- `long int jitter' +- This value expresses a median filtered average of the PPS +- signal's dispersion in microseconds. +- +- `int 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 numer 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, values passed in TPTR can be used to +- replace existing settings. To do this the `modes' element of the +- `struct timex' must be set appropriately. Setting it to zero +- selects reading the current state. +- +- 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. Another reason could +- be that the specified new values are not allowed. +- +- For more details see RFC1305 (Network Time Protocol, Version 3) and +- related documents. +- +- +-File: libc.info, Node: Setting an Alarm, Next: Sleeping, Prev: Precision Time, Up: Date and Time +- +-Setting an Alarm +-================ +- +- The `alarm' and `setitimer' functions provide a mechanism for a +-process to interrupt itself at some future time. 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 clock time. This timer sends a +- `SIGALRM' signal to the process when it expires. +- +- * A virtual timer that counts CPU time used by the process. This +- timer sends a `SIGVTALRM' signal to the process when it expires. +- +- * A profiling timer that counts both CPU time used by the process, +- and CPU 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, and in that case +-it would be terminated, since that is the default action for the alarm +-signals. *Note Signal Handling::. +- +- 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 interval between successive timer interrupts. If +- zero, the alarm will only be sent once. +- +- `struct timeval it_value' +- This is the interval to the first timer interrupt. If zero, +- the alarm is disabled. +- +- The `struct timeval' data type is described in *Note +- High-Resolution Calendar::. +- +- - 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 interval was 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, Next: Resource Usage, Prev: Setting an Alarm, Up: Date and Time +- +-Sleeping +-======== +- +- The function `sleep' gives a simple way to make the program wait for +-short periods of time. If your program doesn't use signals (except to +-terminate), then you can expect `sleep' to wait reliably for the +-specified amount of time. Otherwise, `sleep' can return sooner if a +-signal arrives; if you want to wait for a given period 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 time has +- elapsed, 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 period. +- +- 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 time at which the program should stop waiting, +-and keep trying to wait until that 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 unavoidable additional 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 the resolution of seconds is not enough the `nanosleep' function +- can be used. As the name suggests the sleeping period can be +- specified in nanoseconds. The actual period of waiting time might +- be longer since the requested time in the REQUESTED_TIME parameter +- is rounded up to the next integer multiple of the actual +- resolution of the system. +- +- If the function returns because the time has elapsed the return +- value is zero. If the function return -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 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 cancelation 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 cancelation +- handlers. +- +- The `nanosleep' function is declared in `time.h'. +- +- +-File: libc.info, Node: Resource Usage, Next: Limits on Resources, Prev: Sleeping, Up: Date and Time +- +-Resource Usage +-============== +- +- The function `getrusage' and the data type `struct rusage' are used +-for examining the usage figures of a process. They are declared in +-`sys/resource.h'. +- +- - Function: int getrusage (int PROCESSES, struct rusage *RUSAGE) +- This function reports the 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 +- terminated already. +- +- 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 usage figures 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 records a collection usage amounts for various +- sorts of resources. 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 that PROCESSES used in real +- memory 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 in data. +- +- `long int ru_isrss' +- An integral value expressed the same way, which is the amount +- of unshared memory used in 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 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 the time slice expired, or another process of higher +- priority became runnable). +- +- An additional historical function for examining usage figures, +-`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: Date and Time +- +-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 limit. Each +-process initially inherits its limit values from its parent, but it can +-subsequently change them. +- +- The symbols in this section are defined in `sys/resource.h'. +- +- - Function: int getrlimit (int RESOURCE, struct rlimit *RLP) +- Read the current value and the maximum value of 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 bits system this function is in fact `getrlimit64'. I.e., the +- LFS interface transparently replaces the old interface. +- +- - Function: int getrlimit64 (int RESOURCE, struct rlimit64 *RLP) +- This function is similar to the `getrlimit' but its second +- parameter is a pointer to a variable of type `struct rlimit64' +- which allows this function 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 +- bits 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 value and the maximum value of resource RESOURCE +- in `*RLP'. +- +- The return value is `0' on success and `-1' on failure. The +- following `errno' error condition is possible: +- +- `EPERM' +- You tried to change the maximum permissible limit value, but +- you don't have privileges to do so. +- +- When the sources are compiled with `_FILE_OFFSET_BITS == 64' on a +- 32 bits system this function is in fact `setrlimit64'. I.e., the +- LFS interface transparently replaces the old interface. +- +- - Function: int setrlimit64 (int RESOURCE, const struct rlimit64 *RLP) +- This function is similar to the `setrlimit' but its second +- parameter is a pointer to a variable of type `struct rlimit64' +- which allows this function 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 +- bits 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. It has two fields: +- +- `rlim_t rlim_cur' +- The current value of the limit in question. This is also +- called the "soft limit". +- +- `rlim_t rlim_max' +- The maximum permissible value of the limit in question. You +- cannot set the current value of the limit to a larger number +- than this maximum. Only the super user can change the +- maximum permissible value. This is also called the "hard +- limit". +- +- In `getrlimit', the structure is an output; it receives the current +- values. In `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 used with `getrlimit64' to receive limit values, +- and with `setrlimit64' to specify limit values. It has two fields: +- +- `rlim64_t rlim_cur' +- The current value of the limit in question. This is also +- called the "soft limit". +- +- `rlim64_t rlim_max' +- The maximum permissible value of the limit in question. You +- cannot set the current value of the limit to a larger number +- than this maximum. Only the super user can change the +- maximum permissible value. This is also called the "hard +- limit". +- +- In `getrlimit64', the structure is an output; it receives the +- current values. In `setrlimit64', it specifies the new values. +- +- Here is a list of resources that you can specify a limit for. Those +-that are 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 +- maximum size, 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, it gets error code `EMFILE'. +- *Note Error Codes::. Not all systems support this limit; GNU +- does, and 4.4 BSD does. +- +-`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'. +- +- Two historical functions for setting resource limits, `ulimit' and +-`vlimit', are not documented here. The latter is declared in +-`sys/vlimit.h' and comes from BSD. +- +- +-File: libc.info, Node: Priority, Prev: Limits on Resources, Up: Date and Time +- +-Process Priority +-================ +- +- When several processes try to run, their respective priorities +-determine what share of the CPU each process gets. This section +-describes how you can read and set the priority of a process. All +-these functions and macros are declared in `sys/resource.h'. +- +- The range of valid priority values depends on the operating system, +-but typically it runs from `-20' to `20'. A lower priority value means +-the process runs more often. These constants describe the range of +-priority values: +- +-`PRIO_MIN' +- The smallest valid priority value. +- +-`PRIO_MAX' +- The largest valid priority value. +- +- - Function: int getpriority (int CLASS, int ID) +- Read the priority of a class of processes; CLASS and ID specify +- which ones (see below). If the processes specified do not all +- have the same priority, this returns the smallest value that any +- of them has. +- +- The return value is the priority value 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. +- +- When the return value is `-1', it could indicate failure, or it +- could be the priority 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 PRIORITY) +- Set the priority of a class of processes to PRIORITY; 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 defined 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' +- You tried to set the priority of some other user's process, +- and you don't have privileges for that. +- +- `EACCES' +- You tried to lower the priority of a process, and you don't +- have privileges for that. +- +- The arguments CLASS and ID together specify a set of processes you +-are interested in. These are the possible values for CLASS: +- +-`PRIO_PROCESS' +- Read or set the priority of one process. The argument ID is a +- process ID. +- +-`PRIO_PGRP' +- Read or set the priority of one process group. The argument ID is +- a process group ID. +- +-`PRIO_USER' +- Read or set the priority of one user's processes. The argument ID +- is a user ID. +- +- If the argument ID is 0, it stands for the current process, current +-process group, or the current user, according to CLASS. +- +- - Function: int nice (int INCREMENT) +- Increment the priority of the current process by INCREMENT. The +- return value is the same as for `setpriority'. +- +- Here is an equivalent definition for `nice': +- +- int +- nice (int increment) +- { +- int old = getpriority (PRIO_PROCESS, 0); +- return setpriority (PRIO_PROCESS, 0, old + increment); +- } +- +- +-File: libc.info, Node: Non-Local Exits, Next: Signal Handling, Prev: Date and Time, 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 nonlocal exits. +-* Non-Local Exits and Signals:: Portability issues. +- +- +-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 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 a 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 <setjmp.h> +- #include <stdlib.h> +- #include <stdio.h> +- +- 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, 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: Signal Handling, Next: Process Startup, 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 -Naur ../glibc-2.1.3/manual/libc.info-32 glibc-2.1.3/manual/libc.info-32 +--- ../glibc-2.1.3/manual/libc.info-32 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-32 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1213 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 possible 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 is 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 when working with the `signal' +-function is that it has a different semantic on BSD and SVID system. +-The difference is that on SVID systems the signal handler is +-deinstalled after an signal was delivered. 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::.). Generally it should be +-avoided to use this functions due to the 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 <signal.h> +- +- 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 how 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 behaviour 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 *ACTION, +- struct sigaction *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 <signal.h> +- +- 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 <signal.h> +- #include <stdio.h> +- #include <stdlib.h> +- +- /* 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 <signal.h> +- #include <setjmp.h> +- +- 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 -Naur ../glibc-2.1.3/manual/libc.info-33 glibc-2.1.3/manual/libc.info-33 +--- ../glibc-2.1.3/manual/libc.info-33 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-33 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1181 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 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 accessings 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 at 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. The description of a +- function in this manual always mentions 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 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 <signal.h> +- #include <stdio.h> +- +- 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 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 <signal.h> +- +- /* 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 <signal.h> +- #include <stdio.h> +- #include <sys/types.h> +- #include <unistd.h> +- +- /* 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'. +- +- - Function: int sigprocmask (int HOW, const sigset_t *SET, sigset_t +- *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 <signal.h> +- #include <stddef.h> +- +- 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 <signal.h> +- #include <stddef.h> +- +- 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 -Naur ../glibc-2.1.3/manual/libc.info-34 glibc-2.1.3/manual/libc.info-34 +--- ../glibc-2.1.3/manual/libc.info-34 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-34 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1256 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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' 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 cancelation 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 +- `pause' is called. If the thread gets canceled these resources +- stay allocated until the program ends. To avoid this calls to +- `pause' should be protected using cancelation 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 deliver 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: struct sigaltstack +- 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 struct sigaltstack *STACK, struct +- sigaltstack *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: Process Startup, Next: Processes, Prev: Signal Handling, Up: Top +- +-Process Startup and Termination +-******************************* +- +- "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. +- +- This chapter explains what your program should do to handle the +-startup of a process, to terminate its process, and to receive +-information (arguments and the environment) from the parent process. +- +-* Menu: +- +-* Program Arguments:: Parsing your program's command-line arguments. +-* Environment Variables:: How to access parameters inherited from +- a parent process. +-* Program Termination:: How to cause a process to terminate and +- return status information to its parent. +- +- +-File: libc.info, Node: Program Arguments, Next: Environment Variables, Up: Process Startup +- +-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 process'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. +- +- 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 `\0'. +- +- 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 <unistd.h> +- #include <stdio.h> +- +- 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 **ARGV, const char +- *SHORTOPTS, 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. +- +- +-File: libc.info, Node: Getopt Long Option Example, Prev: Getopt Long Options, Up: Getopt +- +-Example of Parsing Long Options with `getopt_long' +--------------------------------------------------- +- +- #include <stdio.h> +- #include <stdlib.h> +- #include <getopt.h> +- +- /* 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", 0, &verbose_flag, 1}, +- {"brief", 0, &verbose_flag, 0}, +- /* These options don't set a flag. +- We distinguish them by their indices. */ +- {"add", 1, 0, 0}, +- {"append", 0, 0, 0}, +- {"delete", 1, 0, 0}, +- {"create", 0, 0, 0}, +- {"file", 1, 0, 0}, +- {0, 0, 0, 0} +- }; +- /* `getopt_long' stores the option index here. */ +- int option_index = 0; +- +- c = getopt_long (argc, argv, "abc:d:", +- 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 '?': +- /* `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::.). +- +- Unlike the more common `getopt' interface, it provides many related +-convenience features in addition to parsing options, such as +-automatically producing output in response to `--help' and `--version' +-options (as defined by the GNU coding standards). Doing these things +-in argp results in a more consistent look for programs that use it, and +-makes less likely that implementors will neglect to implement them 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, +-which programs can easily use in conjunction with their own option +-parser. This results in less work for user programs (indeed, some may +-use only argument parsers exported by libraries, and have no options of +-their own), and more consistent option-parsing for the abstractions +-implemented by the library. +- +- The header file `<argp.h>' should be included to use argp. +- +-The `argp_parse' Function +-------------------------- +- +- The main interface to argp is the `argp_parse' function; often, a +-call to `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 it; a typical usage is to pass a +- pointer to a structure which can be used for specifying parameters +- to the parser and passing back results from it. +- +- Unless the `ARGP_NO_EXIT' or `ARGP_NO_HELP' flags are included in +- FLAGS, calling `argp_parse' may result in the program exiting--for +- instance when an unknown option is encountered. *Note Program +- Termination::. +- +- The return value is zero for successful parsing, or a unix error +- code (*note Error Codes::.) if an error was detected. Different +- argp parsers may return arbitrary error codes, but standard ones +- are `ENOMEM' if a memory allocation error occurred, or `EINVAL' if +- an unknown option or option argument was 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 very easy for every user program to implement +-the `--version' option and provide a bug-reporting address in the +-`--help' output (which is implemented by argp regardless). +- +- - 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' (unless +- the `ARGP_NO_HELP' flag is used), which will print this string +- followed by a newline and exit (unless 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 string that is the +- bug-reporting address for the program. It will be printed at the +- end of the standard output for the `--help' option, embedded in a +- sentence that says something like `Report bugs to ADDRESS.'. +- +- - Variable: argp_program_version_hook +- If defined or set by the user program to a non-zero value, then a +- `--version' option is added when parsing with `argp_parse' (unless +- the `ARGP_NO_HELP' flag is used), which calls this function to +- print the version, and then exits with a status of 0 (unless the +- `ARGP_NO_EXIT' flag is used). It should point to a function with +- the following type signature: +- +- void PRINT-VERSION (FILE *STREAM, struct argp_state *STATE) +- +- *Note Argp Parsing State::, for an explanation of STATE. +- +- This variable takes precedent over `argp_program_version', and is +- useful if a program has version information that cannot be easily +- specified as a simple string. +- +- - Variable: error_t argp_err_exit_status +- The exit status that argp will use when exiting due to a parsing +- error. If not defined or set by the user program, this defaults to +- `EX_USAGE' from `<sysexits.h>'. +- +- +-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 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 wanted by this parser; it 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 +- prefix 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 saying what the program does, +- and that afterwards is longer, describing the behavior in +- more detail. +- +- `const struct argp_child *children' +- A pointer to a vector of `argp_children' structures specifying +- additional argp parsers that 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 to filter the output of +- help messages. *Note Argp Help Filtering::. +- +- The `options', `parser', `args_doc', and `doc' fields are usually +-all that are needed. If an argp parser is defined as an initialized C +-variable, only the used fields need be specified in the +-initializer--the rest will default to zero due to the way C structure +-initialization works (this fact is exploited for most argp structures, +-grouping the most-used fields near the beginning, so that unused fields +-can simply be 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. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-35 glibc-2.1.3/manual/libc.info-35 +--- ../glibc-2.1.3/manual/libc.info-35 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-35 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1239 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 argp +-parser supports (actually, sometimes multiple entries may used for a +-single option if it has many names). It 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, and how to parse and document it. It has the +- following fields: +- +- `const char *name' +- The long name for this option, corresponding to the long +- option `--NAME'; this field can 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 that is provided to the argp parser's parsing +- function when this option is being parsed. Also, 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 out-dented from the normal option column, +- making it useful as a group header (it will be the first +- thing printed in its group); in this usage, it's conventional +- to end the string with a `:' character. +- +- `int group' +- The group this option is in. +- +- 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, unless its a +- group header (`name' and `key' fields both zero), in which +- case, 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 right +- 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', and 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 aliased +- option. +- +-`OPTION_DOC' +- This option isn't actually an option (and so should be ignored by +- the actual option parser), but rather an arbitrary piece of +- documentation that should be displayed in much the same manner as +- the options (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 the +- documentation string in the normal place. For purposes of +- sorting, any leading whitespace and punctuation is ignored, except +- that if the first non-whitespace character is not `-', this entry +- is displayed after all options (and `OPTION_DOC' entries with a +- leading `-') in the same group. +- +-`OPTION_NO_USAGE' +- This option shouldn't be included in `long' usage messages (but is +- still included in help messages). This is mainly intended for +- options that are completely documented in an argp's `args_doc' +- field (*note Argp Parsers::.), in which case including the option +- in the generic usage list would be redundant. +- +- 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 that is parsed, and is also used as a hook, to +-allow a parser to do something 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 the value given for it, or zero if no +- value was specified. Only options that have a non-zero `arg' +- field can ever have a value, and those must *always* have a value, +- unless the `OPTION_ARG_OPTIONAL' flag was 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 either `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 do not which 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 (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 (due to argp parsers being +- combined), it's impossible to know which one wants to handle an +- argument, so each is called in turn, until one returns 0 or an +- error other than `ARGP_ERR_UNKNOWN'; if an argument is handled by +- no one, `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, then all remaining arguments are +- considered to have been consumed, otherwise, the amount by which +- `STATE->next' has been adjust indicates how many were used. For +- instance, 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' +- There are no more command line arguments at all. +- +-`ARGP_KEY_NO_ARGS' +- Because it's common to want 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. +- Called just before `ARGP_KEY_END' (where more general validity +- checks on previously parsed arguments can take place). +- +-`ARGP_KEY_INIT' +- 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 +- there are still arguments remaining). +- +-`ARGP_KEY_ERROR' +- Passed in if an error has occurred, and parsing terminated (in +- which 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 (although sometimes certain +- resources allocated there 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 contained no non-option arguments at +- all. +- +-( 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 was unrecognized. +- +- This occurs when every parser function returns `ARGP_KEY_UNKNOWN' +- for an argument, in which case parsing stops at that argument. If +- a non-zero value for ARG_INDEX was passed to `argp_parse', the +- index of this argument is returned in it, otherwise an error +- occurs. +- +- If an error occurs (either detected by argp, or because a parser +-function returned an error value), then each parser is called with +-`ARGP_KEY_ERROR', and 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 for the user of argp parser +-functions (*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) +- Output 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, ...) +- Print the printf format string FMT and following args, preceded by +- the program name and `:', and followed by a `Try ... --help' +- message, and terminate 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, ...) +- Similarly to the standard gnu error-reporting function `error', +- print the printf format string FMT and following args, preceded by +- the program name and `:', and followed by the standard unix error +- text for ERRNUM if it is non-zero; then if STATUS is non-zero, +- terminate the program with that as its exit status. +- +- The difference between this function 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) +- Output 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, respectively, +-were 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, calls to any of +-these functions should be followed by code return of an appropriate +-error code for the case where the program *doesn't* terminate; for +-example: +- +- if (BAD ARGUMENT SYNTAX) +- { +- argp_usage (STATE); +- return EINVAL; +- } +- +-If it's known that 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::.), but instead an internal +- argp parser that contains options implemented by `argp_parse' +- itself (such as `--help'). +- +- `int argc' +- `char **argv' +- The argument vector being parsed. May be modified. +- +- `int next' +- The index in `argv' of the next argument to be parsed. 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). +- Also, you can cause the current option to be re-parsed by +- decrementing this field, and then modifying +- `STATE->argv[STATE->next]' to be the option that should be +- reexamined. +- +- `unsigned flags' +- The flags supplied to `argp_parse'. 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 is the number of the current arg, +- starting at 0, and incremented after each such call returns. +- At all other times, this is the number of such arguments that +- have been processed. +- +- `int quoted' +- If non-zero, the index in `argv' of the first argument +- following a special `--' argument (which prevents anything +- following being interpreted as an option). Only set once +- 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' +- Values to pass to child parsers. This vector will be the +- same length as the number of children in the current parser, +- and 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 that is +- unavailable. +- +- `FILE *err_stream' +- `FILE *out_stream' +- Stdio streams used when argp prints something; error messages +- are printed to `err_stream', and 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' allows other argp parsers to +-be combined with the referencing one to parse a single set of +-arguments. It should point to a vector of `struct argp_child', +-terminated by an entry having a value of zero in the `argp' field. +- +- Where conflicts between combined parsers arise (for instance, if two +-specify an option with the same name), they are resolved in favor of +-the parent argp parsers, or earlier 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 the list. +- +- `int flags' +- Flags for this child. +- +- `const char *header' +- If non-zero, an optional header to be printed in 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 value conventionally has `:' as the last +- character. *Note Argp Option Vectors::. +- +- `int group' +- Where to group the child options 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::.), but 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 at all, but rather +- merged with the parent options (merging the child's grouping +- levels with the parents). +- +- +-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'. Normally (and always 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' (on the assumption that silent exiting upon errors +- is bad behaviour). +- +-`ARGP_NO_ARGS' +- Don't parse any non-option args. Normally non-option args are +- parsed by calling the parse functions with a key of +- `ARGP_KEY_ARG', and the actual arg as the value. This flag +- needn't normally be set, as the normal behavior is to stop parsing +- as soon as some argument isn't accepted by a parsing function. +- *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)' called. +- +-`ARGP_NO_EXIT' +- Don't exit on errors (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 `-' (for +- instances, `-help'), but results in a generally somewhat less +- useful interface, that conflicts with the way most GNU programs +- work. For this reason, its use is discouraged. +- +-`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 to filter 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::.), or one of the +-special keys with names beginning with `ARGP_KEY_HELP_', describing +-which other help text TEXT is (*note Argp Help Filter Keys::.). +- +- The function should return either TEXT, if it should be used as-is, +-a replacement string, which should be allocated using `malloc', and +-will be freed by argp, or zero, meaning `print nothing'. The value of +-TEXT supplied is *after* any translation has been done, so if any of +-the replacement text also needs translation, that should be done by the +-filter function. INPUT is either the input supplied to `argp_parse', +-or 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, and specify which help text the TEXT argument contains: +- +-`ARGP_KEY_HELP_PRE_DOC' +- Help text preceding options. +- +-`ARGP_KEY_HELP_POST_DOC' +- Help text following options. +- +-`ARGP_KEY_HELP_HEADER' +- Option header string. +- +-`ARGP_KEY_HELP_EXTRA' +- After all other documentation; TEXT is zero for this key. +- +-`ARGP_KEY_HELP_DUP_ARGS_NOTE' +- The explanatory note emitted when duplicate option arguments have +- been suppressed. +- +-`ARGP_KEY_HELP_ARGS_DOC' +- The argument doc string (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 worry too much about printing +-argument-usage-type help messages, because the standard `--help' option +-is handled automatically by argp, and the typical error cases can be +-handled using `argp_usage' and `argp_error' (*note Argp Helper +-Functions::.). +- +- However, if it's desirable to print a standard 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) +- Output a help message for the argp parser ARGP to STREAM. What +- sort of messages is printed is 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 better 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::.), exactly what is output is determined +-by the FLAGS argument, which 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 only 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 understood +- along with its documentation string. +- +-`ARGP_HELP_PRE_DOC' +- The part of the argp parser doc string that precedes the verbose +- option help. +- +-`ARGP_HELP_POST_DOC' +- The part of the argp parser doc string that follows the verbose +- option help. +- +-`ARGP_HELP_DOC' +- `(ARGP_HELP_PRE_DOC | ARGP_HELP_POST_DOC)' +- +-`ARGP_HELP_BUG_ADDR' +- A message saying where to report bugs for this program, if the +- `argp_program_bug_address' variable contains one. +- +-`ARGP_HELP_LONG_ONLY' +- Modify any output appropriately to reflect `ARGP_LONG_ONLY' mode. +- +- The following flags are only understood when used with +-`argp_state_help', and control whether the function returns after +-printing its output, or terminates the program: +- +-`ARGP_HELP_EXIT_ERR' +- Terminate the program with `exit (argp_err_exit_status)'. +- +-`ARGP_HELP_EXIT_OK' +- Terminate the program with `exit (0)'. +- +- The following flags are combinations of the basic ones for printing +-standard messages: +- +-`ARGP_HELP_STD_ERR' +- Assuming an error message for a parsing error has already printed, +- prints a note on how to get help, and terminates the program with +- an error. +- +-`ARGP_HELP_STD_USAGE' +- Prints a standard usage message and terminates the program with an +- error. This is used when no more specific error message is +- appropriate. +- +-`ARGP_HELP_STD_HELP' +- 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 (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) 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 <argp.h> +- +- 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, 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). +- +- /* 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 becuase they will almost always be constant +- for a given program, even if it uses different argument +- parsers for various tasks). */ +- +- #include <argp.h> +- +- const char *argp_program_version = +- "argp-ex2 1.0"; +- const char *argp_program_bug_address = +- "<bug-gnu-utils@gnu.org>"; +- +- /* Program documentation. */ +- static char doc[] = +- "Argp example #2 -- a pretty minimal program using argp"; +- +- /* Our argpument 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, and adds user +-options and arguments. +- +- We now use the first four fields in `argp' (*note Argp Parsers::.), +-and specifies `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::.), and 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 argumens 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 <argp.h> +- +- const char *argp_program_version = +- "argp-ex3 1.0"; +- const char *argp_program_bug_address = +- "<bug-gnu-utils@gnu.org>"; +- +- /* 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); +- } +- +- +-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 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, and the special +-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 the help output, two features are used: *headers*, +-which are entries in the options vector (*note Argp Option Vectors::.) +-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 (*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 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. +- +- /* 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 documenation strings are also passed to +- the `gettext' function, for possible translation into the +- current locale. */ +- +- #include <stdlib.h> +- #include <error.h> +- #include <argp.h> +- +- const char *argp_program_version = +- "argp-ex4 1.0"; +- const char *argp_program_bug_address = +- "<bug-gnu-utils@prep.ai.mit.edu>"; +- +- /* 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); +- } +- +diff -Naur ../glibc-2.1.3/manual/libc.info-36 glibc-2.1.3/manual/libc.info-36 +--- ../glibc-2.1.3/manual/libc.info-36 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-36 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1096 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Argp User Customization, Prev: Argp Examples, Up: Argp +- +-Argp User Customization +------------------------ +- +- The way 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 (whitespace is ignored) of the +-following tokens: +- +-`dup-args' +-`no-dup-args' +- Turn "duplicate-argument-mode" on or off. In duplicate argument +- mode, if an option which accepts an argument has multiple names, +- the argument is shown for each name; otherwise, it is only shown +- for the first long option, and a note is emitted later so the user +- knows that it applies to the other names as well. The default is +- `no-dup-args', which is less consistent, but prettier. +- +-`dup-args-note' +- +-`no-dup-args-note' +- Enable or disable the note informing the user of suppressed option +- argument duplication. The default is `dup-args-note'. +- +-`short-opt-col=N' +- Show the first short option in column N (default 2). +- +-`long-opt-col=N' +- Show the first long option in column N (default 6). +- +-`doc-opt-col=N' +- Show `documentation options' (*note Argp Option Flags::.) in column +- N (default 2). +- +-`opt-doc-col=N' +- Show the documentation for options starting in column N (default +- 29). +- +-`header-col=N' +- Indent group headers (which document groups of options) to column +- N (default 1). +- +-`usage-indent=N' +- Indent continuation lines in `Usage:' messages to column N +- (default 12). +- +-`rmargin=N' +- Word wrap help output at or before column N (default 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 <stdio.h> +- #include <stdlib.h> +- +- 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 +- }; +- +- const char *mount_opts[] = +- { +- [RO_OPTION] = "ro", +- [RW_OPTION] = "rw", +- [READ_SIZE_OPTION] = "rsize", +- [WRITE_SIZE_OPTION] = "wsize" +- }; +- +- 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: Program Termination, Prev: Program Arguments, Up: Process Startup +- +-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 (const 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. +- +- 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. 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 is part of the BSD library. The GNU C Library +- provides this function for compatibility but it may not be +- available on other systems. +- +- - Function: void 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. +- +- This function is part of the BSD library. The GNU C Library +- provides this function for compatibility but it may not be +- available on other systems. +- +- 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 process; 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: Program Termination, Prev: Environment Variables, Up: Process Startup +- +-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 the program calls `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 terminates the process with status 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. +- +- +-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 <stdio.h> +- #include <stdlib.h> +- +- 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 C9x and is declared in +- `stdlib.h'. +- +- When a process terminates for any reason--either by an explicit +-termination call, or termination 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::. +- +- * The low-order 8 bits of the return status code are saved to be +- reported back to the parent process via `wait' or `waitpid'; see +- *Note Process Completion::. +- +- * 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: Process Startup, 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 non-zero return value +- indicates that a command processor is available and this function +- can be used at all. +- +- This function is a cancelation 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 cancelation 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. +- +- +-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. +- +- 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::.). +- +diff -Naur ../glibc-2.1.3/manual/libc.info-37 glibc-2.1.3/manual/libc.info-37 +--- ../glibc-2.1.3/manual/libc.info-37 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-37 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1308 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 cancelation 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 cancelation 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 cancelation 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 cancelation 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 <stddef.h> +- #include <stdlib.h> +- #include <unistd.h> +- #include <sys/types.h> +- #include <sys/wait.h> +- +- /* 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 <sys/types.h> +- #include <termios.h> +- #include <unistd.h> +- +- 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 been 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)"); +- } +- +- +-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::. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-38 glibc-2.1.3/manual/libc.info-38 +--- ../glibc-2.1.3/manual/libc.info-38 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-38 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1195 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 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 ins 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 ultimative. +- +- 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 described how 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 itself. This is *not* true in the moment, though. +-But the different 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 to duplicate this information. The answer +-is that we want to keep the possibility 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 do not tell this 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 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 explain 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 +- adata 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 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 program (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 more much we can tell 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 their 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 honour 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 Information, 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. +- +- +-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. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-39 glibc-2.1.3/manual/libc.info-39 +--- ../glibc-2.1.3/manual/libc.info-39 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-39 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1245 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 GID) +- The `initgroups' function sets the process's supplementary group +- IDs to be the normal default for the user name USER. If GID is not +- -1, it includes that group also. +- +- 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'. +- +- +-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 +- setuid (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 <stdio.h> +- #include <sys/types.h> +- #include <unistd.h> +- #include <stdlib.h> +- +- +- /* 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 return for the request is overwritten be 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 provides functionality identical to +- `pututline', but uses `struct utmpx' instead of `struct utmp'. On +- the GNU system `pututxline' is simply an alias for `pututline'. +- +- +-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. +- +- +-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 occured, 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 occured, 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'. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-4 glibc-2.1.3/manual/libc.info-4 +--- ../glibc-2.1.3/manual/libc.info-4 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-4 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1233 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Hooks for Malloc, Next: Statistics of Malloc, Prev: Heap Consistency Checking, Up: Unconstrained Allocation +- +-Storage 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 storage +-allocation, for example. +- +- The hook variables are declared in `malloc.h'. +- +- - Variable: __malloc_hook +- The value of this variable is a pointer to 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, void *CALLER) +- +- The value of CALLER is the return address found on the stack when +- the `malloc' function was called. This value allows 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, void *CALLER) +- +- The value of CALLER is the return address found on the stack when +- the `realloc' function was called. This value allows 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, void *CALLER) +- +- The value of CALLER is the return address found on the stack when +- the `free' function was called. This value allows 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 SIZE, size_t ALIGNMENT) +- +- 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. +- +- 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. +- +- /* Global variables used to hold underlaying hook values. */ +- static void *(*old_malloc_hook) (size_t); +- static void (*old_free_hook) (void*); +- +- /* Prototypes for our hooks. */ +- static void *my_malloc_hook (size_t); +- static void my_free_hook(void*); +- +- static void * +- my_malloc_hook (size_t size) +- { +- void *result; +- /* Restore all old hooks */ +- __malloc_hook = old_malloc_hook; +- __free_hook = old_free_hook; +- /* Call recursively */ +- result = malloc (size); +- /* Save underlaying 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) +- { +- /* Restore all old hooks */ +- __malloc_hook = old_malloc_hook; +- __free_hook = old_free_hook; +- /* Call recursively */ +- free (ptr); +- /* Save underlaying 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 () +- { +- ... +- old_malloc_hook = __malloc_hook; +- old_free_hook = __free_hook; +- __malloc_hook = my_malloc_hook; +- __free_hook = my_free_hook; +- ... +- } +- +- 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 Storage Allocation with `malloc' +------------------------------------------------ +- +- You can get information about dynamic storage 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 +- storage 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 storage +- 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, releaseable chunk that +- normally borders the end of the heap (i.e. the "brk" of the +- process). +- +- +- - 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, void *CALLER)' +- A pointer to a function that `malloc' uses whenever it is called. +- +-`void *(*__realloc_hook) (void *PTR, size_t SIZE, void *CALLER)' +- A pointer to a function that `realloc' uses whenever it is called. +- +-`void (*__free_hook) (void *PTR, void *CALLER)' +- A pointer to a function that `free' uses whenever it is called. +- +-`void (*__memalign_hook) (size_t SIZE, size_t ALIGNMENT)' +- 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 +-==================== +- +- An 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 sich leaks and provide 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 if the program is compiled in preparation of the debugging if +-the debug 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 behaviour of `malloc' +- etc. is not changed. For obvious reasons this also happens if the +- application is install SUID or SGID. +- +- If the named file is successfully opened `mtrace' installs special +- handlers for the functions `malloc', `realloc', and `free' (*note +- Hooks for Malloc::.). From now 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 that the +- tracing should not be enabled during their 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 (succesful) 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 programs runs again with the 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 programs excerpts +-------------------------- +- +- Even though the tracing functionality does not influence the runtime +-behaviour of the program it is no wise idea to call `mtrace' in all +-programs. Just imagine you debug a program using `mtrace' and all +-other programs used in the debug sessions also trace their `malloc' +-calls. The output file would be the same for all programs and so is +-unusable. Therefore one should call `mtrace' only if compiled for +-debugging. A program could therefore start like this: +- +- #include <mcheck.h> +- +- 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 course +-unreliable results since there are possibly 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 +-this function. +- +- 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. In our situation here: the memory leaks +-becomes visible only when we just turned off the debugging. If you +-foresee such situations you can still win. Simply use something +-equivalent to the following little program: +- +- #include <mcheck.h> +- #include <signal.h> +- +- 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 payed to +-good readability. Instead there is a program which comes with the GNU C +-library which interprets the traces and outputs a summary in on +-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-mtrace errlog +- - 0x08064cc8 Free 2 was never alloc'd /home/drepper/tst-mtrace.c:39 +- - 0x08064ce0 Free 3 was never alloc'd /home/drepper/tst-mtrace.c:39 +- - 0x08064cf8 Free 4 was never alloc'd /home/drepper/tst-mtrace.c:39 +- +- Memory not freed: +- ----------------- +- Address Size Caller +- 0x08064c48 0x14 at /home/drepper/tst-mtrace.c:33 +- 0x08064c60 0x14 at /home/drepper/tst-mtrace.c:33 +- 0x08064c78 0x14 at /home/drepper/tst-mtrace.c:33 +- 0x08064c90 0x14 at /home/drepper/tst-mtrace.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 how 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 keeps 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 <obstack.h> +- +- 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 storage 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 storage 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. +- +- +-File: libc.info, Node: Growing Objects, Next: Extra Fast Growing, Prev: Obstack Functions, Up: Obstacks +- +-Growing Objects +---------------- +- +- Because storage 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 storage, 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. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-40 glibc-2.1.3/manual/libc.info-40 +--- ../glibc-2.1.3/manual/libc.info-40 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-40 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1028 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 <grp.h> +- #include <pwd.h> +- #include <sys/types.h> +- #include <unistd.h> +- #include <stdlib.h> +- +- 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 to group hosts, users, and domain freely, +-giving them individual names. 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 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' iterate over +- all entries in the netgroup with name NETGROUP. +- +- When the call is successful (i.e., when a netgroup with this name +- exist) 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, 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 unless no 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 free 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 excepted 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 Information, Next: System Configuration, Prev: Users and Groups, Up: Top +- +-System Information +-****************** +- +- This chapter describes functions that return information about the +-particular machine that is in use--the type of hardware, the type of +-software, and the individual machine's name. +- +-* Menu: +- +-* Host Identification:: Determining the name of the machine. +-* Hardware/Software Type ID:: Determining the hardware type of the +- machine and what operating system it is +- running. +-* Filesystem handling:: Which is mounted and/or available? +- +- +-File: libc.info, Node: Host Identification, Next: Hardware/Software Type ID, Up: System Information +- +-Host Identification +-=================== +- +- This section explains how to identify the particular machine that +-your program is running on. The identification of a machine consists +-of its Internet host name and Internet address; see *Note Internet +-Namespace::. The host name should always be a fully qualified domain +-name, like `crispy-wheats-n-chicken.ai.mit.edu', not a simple name like +-just `crispy-wheats-n-chicken'. +- +- Prototypes for these functions appear in `unistd.h'. The shell +-commands `hostname' and `hostid' work by calling them. +- +- - Function: int gethostname (char *NAME, size_t SIZE) +- This function returns the name of the host machine in the array +- NAME. The SIZE argument specifies the size of this array, in +- bytes. +- +- 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 name of the host machine to +- NAME, a string with length LENGTH. Only privileged processes are +- allowed to do this. Usually it happens just once, at system boot +- time. +- +- 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: 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 +- address of that machine, converted to a `long int'. However, some +- systems it is a meaningless but unique number which is hard-coded +- for each machine. +- +- - Function: int sethostid (long int ID) +- The `sethostid' function sets the "host ID" of the host machine to +- ID. Only privileged processes are allowed to do this. Usually it +- happens just once, at system boot time. +- +- 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. +- +- `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: Hardware/Software Type ID, Next: Filesystem handling, Prev: Host Identification, Up: System Information +- +-Hardware/Software 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'. +- +- - 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 nodename[]' +- This is the network name of this particular computer. In the +- GNU library, the value is the same as that returned by +- `gethostname'; see *Note Host Identification::. +- +- `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"' +- +- - 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, Prev: Hardware/Software Type ID, Up: System Information +- +-Which filesystems are mounted and/or available? +-=============================================== +- +- The Unix concept of *Everything is a file* is based on the +-possibility to "mount" filesystems or other things into the filesystem. +-For some programs it is desirable and necessary to access the +-information whether and, if yes, where a certain filesystem is mounted +-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 `/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. +- +- The filenames given above should never be used directly. The +-portable way to handle these file is to use the macros `_PATH_FSTAB', +-defined in `fstab.h' and `_PATH_MNTTAB', defined in `mntent.h', +-respectively. There are also two alternate macro names `FSTAB' and +-`_PATH_MOUNTED' defined but both names are deprecated and kept only for +-backward compatibility. The two former names should always be used. +- +- 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 best +- happen 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 an 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 an 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 an 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. +- +- To access the `mtab' file there is a different set of functions and +-also a different structure to describe the results. +- +- - 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 value this +- string can have. But since the kernel can support an +- 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 symbol 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 makes not 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 custumizable +- 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. +- +- 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. +- +- 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 to add 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 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: System Configuration, Next: Cryptographic Functions, Prev: System Information, 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. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-41 glibc-2.1.3/manual/libc.info-41 +--- ../glibc-2.1.3/manual/libc.info-41 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-41 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1269 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 Basic 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 +- `_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. +- +-`_SC_NPROCESSORS_CONF' +- Inquire about number of configured processors. +- +-`_SC_NPROCESSORS_ONLN' +- Inquire about number of processors online. +- +-`_SC_PHYS_PAGES' +- Inquire about number of physical pages in the system. +- +-`_SC_AVPHYS_PAGES' +- Inquire about number of available physical pages in the system. +- +-`_SC_ATEXIT_MAX' +- Inquire about 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_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 number of bits in a variable of type `char'. +- +-`_SC_CHAR_MAX' +- Inquire about maximum value which can be stored in a variable of +- type `char'. +- +-`_SC_CHAR_MIN' +- Inquire about minimum value which can be stored in a variable of +- type `char'. +- +-`_SC_INT_MAX' +- Inquire about maximum value which can be stored in a variable of +- type `int'. +- +-`_SC_INT_MIN' +- Inquire about minimum value which can be stored in a variable of +- type `int'. +- +-`_SC_LONG_BIT' +- Inquire about number of bits in a variable of type `long int'. +- +-`_SC_WORD_BIT' +- Inquire about 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 value used to internally represent the zero priority level +- for the process execution. +- +-`SC_SSIZE_MAX' +- Inquire about maximum value which can be stored in a variable of +- type `ssize_t'. +- +-`_SC_SCHAR_MAX' +- Inquire about maximum value which can be stored in a variable of +- type `signed char'. +- +-`_SC_SCHAR_MIN' +- Inquire about minimum value which can be stored in a variable of +- type `signed char'. +- +-`_SC_SHRT_MAX' +- Inquire about maximum value which can be stored in a variable of +- type `short int'. +- +-`_SC_SHRT_MIN' +- Inquire about minimum value which can be stored in a variable of +- type `short int'. +- +-`_SC_UCHAR_MAX' +- Inquire about maximum value which can be stored in a variable of +- type `unsigned char'. +- +-`_SC_UINT_MAX' +- Inquire about maximum value which can be stored in a variable of +- type `unsigned int'. +- +-`_SC_ULONG_MAX' +- Inquire about maximum value which can be stored in a variable of +- type `unsigned long int'. +- +-`_SC_USHRT_MAX' +- Inquire about 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'. +- +- +-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 outstandard 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 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 +- `255'. +- +-`_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'. +- +- +-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'. +- +- +-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: POSIX Threads, 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 +-authorised 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 already provides a one-way function based on MD5. +-The `crypt' add-on provides additional compatibility with the standard +-UNIX one-way function based on the Data Encryption Standard. +- +- It also provides support for Secure RPC, and some library functions +-that can be used to perform normal DES encryption. +- +- The add-on is not included in the main distribution of the GNU C +-library because some governments, most notably those of France, Russia, +-and the US, have very restrictive rules governing the distribution and +-use of encryption software. The first section below tries to describe +-some of those rules. +- +-* 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 UNIX 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, posess, or +-import cryptography. These countries are believed to include +-Byelorussia, Burma, France, 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. +- +- In particular, the US does not allow export of this software without +-a licence, including via the Internet. So please do not download it +-from the main FSF FTP site at `ftp.gnu.org' if you are outside the US. +-This software was completely developed outside the US. +- +- The rules in this area are continuously changing. If any +-information in this manual 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'. +- +- 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'. +- +- +-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. If the `crypt' add-on is not installed, +- trying to use the DES-based algorithm will return an empty string +- and set `errno' to `EOPNOTSUPP'. +- +- The MD5-based algorithm is available in the GNU C library even if +- the `crypt' add-on is not installed. It also 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 <stdio.h> +- #include <time.h> +- #include <unistd.h> +- #include <crypt.h> +- +- 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 <stdio.h> +- #include <string.h> +- #include <unistd.h> +- #include <crypt.h> +- +- 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'. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-42 glibc-2.1.3/manual/libc.info-42 +--- ../glibc-2.1.3/manual/libc.info-42 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-42 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1068 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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-2 published by the +-National Institute of Standards and Technology. The DES has been very +-thoroughly analysed 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 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 practical purposes, and NIST is now evaluating +-improved encryption algorithms. +- +- 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' the first time, +- `data->initialised' 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'. +- +- If the `crypt' add-on is not used to build the library, programs +-that use these four functions will crash when the functions are called. +-If this is a problem, the `ecb_crypt' function described below is +-recommended instead. +- +- - 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. In the +- GNU library, this error code is also returned if the `crypt' +- add-on was not used to build the library. +- +- `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: POSIX Threads, Next: Language Features, Prev: Cryptographic Functions, 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 +- cancelled. +-* 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. +-* Miscellaneous Thread Functions:: A grab bag of utility routines. +- +- +-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 cancelled. +- +- 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 cancelled. +- +- 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'. +- +- +-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 cancelled 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 cancelled 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 KIND, which is either "fast", "recursive", or "error +- checking". The kind of a mutex determines whether it can be locked +- again by a thread that already owns it. The default kind is +- "fast". +- +- Variables of type `pthread_mutex_t' can also be initialized +- statically, using the constants `PTHREAD_MUTEX_INITIALIZER' (for +- fast mutexes), `PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP' (for +- recursive 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 kind of the mutex. If the +- mutex is of the "fast" kind, 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" kind, +- `pthread_mutex_lock' returns immediately with the error code +- `EDEADLK'. If the mutex is of the "recursive" kind, +- `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_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" kind, +- `pthread_mutex_unlock' always returns it to the unlocked state. If +- it is of the "recursive" kind, 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 kind, +-which is either `PTHREAD_MUTEX_FAST_NP' for "fast" mutexes, +-`PTHREAD_MUTEX_RECURSIVE_NP' for "recursive" 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 kind 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" kind, `pthread_mutex_lock' simply suspends the calling thread +-forever. If the mutex is of the "error checking" kind, +-`pthread_mutex_lock' returns immediately with the error code `EDEADLK'. +-If the mutex is of the "recursive" kind, 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 kind is "fast", that is, `PTHREAD_MUTEX_FAST_NP'. +- +- - Function: int pthread_mutexattr_setkind_np (pthread_mutexattr_t +- *ATTR, int KIND) +- `pthread_mutexattr_setkind_np' sets the mutex kind attribute in +- ATTR to the value specified by KIND. +- +- If KIND is not `PTHREAD_MUTEX_FAST_NP', +- `PTHREAD_MUTEX_RECURSIVE_NP', or `PTHREAD_MUTEX_ERRORCHECK_NP', +- this function will return `EINVAL' and leave ATTR unchanged. +- +- - Function: int pthread_mutexattr_getkind_np (const +- pthread_mutexattr_t *ATTR, int *KIND) +- `pthread_mutexattr_getkind_np' retrieves the current value of the +- mutex kind attribute in ATTR and stores it in the location pointed +- to by KIND. +- +- 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 cancelled 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. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-43 glibc-2.1.3/manual/libc.info-43 +--- ../glibc-2.1.3/manual/libc.info-43 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-43 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1182 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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: Miscellaneous Thread Functions, 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). +- +- +-File: libc.info, Node: Miscellaneous Thread Functions, Prev: Threads and Signal Handling, 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: 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. +- +- 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. Thus, if a mutex is locked by a thread +-other than the thread calling `fork', that mutex will remain locked +-forever in the child process, possibly blocking the execution of the +-child process. To avoid this, install handlers with `pthread_atfork' as +-follows: the PREPARE handler locks the global mutexes (in locking +-order), and the PARENT and CHILD handlers unlock them (in reverse +-order). Alternatively, PREPARE and PARENT can be set to `NULL' and +-CHILD to a function that calls `pthread_mutex_init' on the global +-mutexes. +- +- - 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. +- +- `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. +- +- +- +-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 should be 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 written. 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 defined, `assert_perror' tests the value of ERRNUM. +- If it is nonzero, `assert_perror' aborts the program after a +- 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 a just 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' +-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. So +-you can't use `assert' or `assert_perror' to print the error messages +-for these eventualities. +- +- 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, ...) +- { +- ... +- } +- +-outlines a definition of 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 +- and you do not really need to call it. 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 the 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 tell it +-how many arguments it has, and what kind. 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 write anything special when you call a variadic +-function. Just write the arguments (required arguments, followed by +-optional ones) inside parentheses, separated by commas, as usual. But +-you should prepare by declaring the function with a prototype, and you +-must 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 should get 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 it is not guaranteed +-that one can simply assign the value of a variable to another one of +-type `va_list' +- +- - 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 no 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 that +-this macro is not available. On architectures where a simple assignment +-is invalid it hopefully is and 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 <stdarg.h> +- #include <stdio.h> +- +- 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' just 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 -Naur ../glibc-2.1.3/manual/libc.info-44 glibc-2.1.3/manual/libc.info-44 +--- ../glibc-2.1.3/manual/libc.info-44 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-44 1969-12-31 16:00:00.000000000 -0800 +@@ -1,355 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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", 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 actually 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 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 -Naur ../glibc-2.1.3/manual/libc.info-45 glibc-2.1.3/manual/libc.info-45 +--- ../glibc-2.1.3/manual/libc.info-45 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-45 1969-12-31 16:00:00.000000000 -0800 +@@ -1,6297 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 Filesystem handling::. +- +-`int adjtime (const struct timeval *DELTA, struct timeval *OLDDELTA)' +- `sys/time.h' (BSD): *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): *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 aiocb *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 Date and Time::. +- +-`char * asctime_r (const struct tm *BROKENTIME, char *BUFFER)' +- `time.h' (POSIX.1c): *Note Formatting Date and 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 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::. +- +-`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::. +- +-`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::. +- +-`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::. +- +-`int 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 EOF and Errors::. +- +-`int CLK_TCK' +- `time.h' (POSIX.1): *Note Basic CPU Time::. +- +-`tcflag_t CLOCAL' +- `termios.h' (POSIX.1): *Note Control Modes::. +- +-`clock_t clock (void)' +- `time.h' (ISO): *Note Basic CPU Time::. +- +-`int CLOCKS_PER_SEC' +- `time.h' (ISO): *Note Basic CPU Time::. +- +-`clock_t' +- `time.h' (ISO): *Note Basic 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::. +- +-`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' (crypt.h): *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 Date and Time::. +- +-`char * ctime_r (const time_t *TIME, char *BUFFER)' +- `time.h' (POSIX.1c): *Note Formatting Date and 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::. +- +-`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::. +- +-`double difftime (time_t TIME1, time_t TIME0)' +- `time.h' (ISO): *Note Simple Calendar Time::. +- +-`DIR' +- `dirent.h' (POSIX.1): *Note Opening a Directory::. +- +-`div_t div (int NUMERATOR, int DENOMINATOR)' +- `stdlib.h' (ISO): *Note Integer Division::. +- +-`div_t' +- `stdlib.h' (ISO): *Note Integer Division::. +- +-`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::. +- +-`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 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' (crypt.h): *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 Filesystem handling::. +- +-`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 Filesystem handling::. +- +-`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: Device not configured): *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::. +- +-`volatile int errno' +- `errno.h' (ISO): *Note Checking for Errors::. +- +-`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::. +- +-`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::. +- +-`void feclearexcept (int EXCEPTS)' +- `fenv.h' (ISO): *Note Status bit operations::. +- +-`FE_DIVBYZERO' +- `fenv.h' (ISO): *Note Status bit operations::. +- +-`FE_DOWNWARD' +- `fenv.h' (ISO): *Note Rounding::. +- +-`void fegetenv (fenv_t *ENVP)' +- `fenv.h' (ISO): *Note Control Functions::. +- +-`void 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::. +- +-`FE_OVERFLOW' +- `fenv.h' (ISO): *Note Status bit operations::. +- +-`int ferror (FILE *STREAM)' +- `stdio.h' (ISO): *Note EOF and Errors::. +- +-`void fesetenv (const fenv_t *ENVP)' +- `fenv.h' (ISO): *Note Control Functions::. +- +-`void 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::. +- +-`void 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 fgetc (FILE *STREAM)' +- `stdio.h' (ISO): *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::. +- +-`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 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::. +- +-`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::. +- +-`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_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::. +- +-`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::. +- +-`int fputc (int C, FILE *STREAM)' +- `stdio.h' (ISO): *Note Simple Output::. +- +-`int fputs (const char *S, FILE *STREAM)' +- `stdio.h' (ISO): *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::. +- +-`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 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 Truncating Files::. +- +-`int ftruncate64 (int ID, off64_t LENGTH)' +- `unistd.h' (Unix98): *Note Truncating Files::. +- +-`int ftw (const char *FILENAME, __ftw_func_t FUNC, int DESCRIPTORS)' +- `ftw.h' (SVID): *Note Working on Directory Trees::. +- +-`int ftw64 (const char *FILENAME, __ftw64_func_t FUNC, int DESCRIPTORS)' +- `ftw.h' (Unix98): *Note Working on Directory Trees::. +- +-`__ftw64_func_t' +- `ftw.h' (GNU): *Note Working on Directory Trees::. +- +-`__ftw_func_t' +- `ftw.h' (GNU): *Note Working on Directory Trees::. +- +-`F_UNLCK' +- `fcntl.h' (POSIX.1): *Note File Locks::. +- +-`size_t fwrite (const void *DATA, size_t SIZE, size_t COUNT, FILE *STREAM)' +- `stdio.h' (ISO): *Note Block Input/Output::. +- +-`F_WRLCK' +- `fcntl.h' (POSIX.1): *Note File Locks::. +- +-`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::. +- +-`int getc (FILE *STREAM)' +- `stdio.h' (ISO): *Note Character Input::. +- +-`int getchar (void)' +- `stdio.h' (ISO): *Note Character Input::. +- +-`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::. +- +-`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 Filesystem handling::. +- +-`struct fstab * getfsfile (const char *NAME)' +- `fstab.h' (BSD): *Note Filesystem handling::. +- +-`struct fstab * getfsspec (const char *NAME)' +- `fstab.h' (BSD): *Note Filesystem handling::. +- +-`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 getgroups (int COUNT, gid_t *GROUPS)' +- `unistd.h' (POSIX.1): *Note Reading Persona::. +- +-`struct hostent * gethostbyaddr (const char *ADDR, int LENGTH, int FORMAT)' +- `netdb.h' (BSD): *Note Host Names::. +- +-`int gethostbyaddr_r (const char *ADDR, int 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::. +- +-`char * getlogin (void)' +- `unistd.h' (POSIX.1): *Note Who Logged In::. +- +-`struct mntent * getmntent (FILE *STREAM)' +- `mntent.h' (BSD): *Note Filesystem handling::. +- +-`struct mntent * getmntent_r (FILE *STREAM, struct mentent *RESULT, char *BUFFER, int BUFSIZE)' +- `mntent.h' (BSD): *Note Filesystem handling::. +- +-`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 getopt (int ARGC, char **ARGV, const char *OPTIONS)' +- `unistd.h' (POSIX.2): *Note Using Getopt::. +- +-`int getopt_long (int ARGC, char **ARGV, const char *SHORTOPTS, struct option *LONGOPTS, int *INDEXPTR)' +- `getopt.h' (GNU): *Note Getopt Long Options::. +- +-`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::. +- +-`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): *Note Priority::. +- +-`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. +- +-`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::. +- +-`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::. +- +-`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::. +- +-`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::. +- +-`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::. +- +-`char * hasmntopt (const struct mntent *MNT, const char *OPT)' +- `mntent.h' (BSD): *Note Filesystem handling::. +- +-`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, const 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::. +- +-`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::. +- +-`double infnan (int ERROR)' +- `math.h' (BSD): *Note Floating Point Classes::. +- +-`int initgroups (const char *USER, gid_t GID)' +- `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::. +- +-`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 _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::. +- +-`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' (BSD): *Note Normalization Functions::. +- +-`double logb (double X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`float logbf (float X)' +- `math.h' (BSD): *Note Normalization Functions::. +- +-`float logbf (float X)' +- `math.h' (ISO): *Note Exponents and Logarithms::. +- +-`long double logbl (long double X)' +- `math.h' (BSD): *Note Normalization Functions::. +- +-`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::. +- +-`L_XTND' +- `sys/file.h' (BSD): *Note File Positioning::. +- +-`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::. +- +-`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 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', `stdlib.h' (BSD): *Note Aligned Memory Blocks::. +- +-`__memalign_hook' +- `malloc.h' (GNU): *Note Hooks for Malloc::. +- +-`void * memccpy (void *TO, const void *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 *TO, const void *FROM, size_t SIZE)' +- `string.h' (ISO): *Note Copying and Concatenation::. +- +-`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 *TO, const void *FROM, size_t SIZE)' +- `string.h' (GNU): *Note Copying and Concatenation::. +- +-`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::. +- +-`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::. +- +-`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::. +- +-`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::. +- +-`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::. +- +-`void mtrace (void)' +- `mcheck.h' (GNU): *Note Tracing malloc::. +- +-`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 on Directory Trees::. +- +-`int nftw64 (const char *FILENAME, __nftw64_func_t FUNC, int DESCRIPTORS, int FLAG)' +- `ftw.h' (Unix98): *Note Working on Directory Trees::. +- +-`__nftw64_func_t' +- `ftw.h' (GNU): *Note Working on Directory Trees::. +- +-`__nftw_func_t' +- `ftw.h' (GNU): *Note Working on Directory Trees::. +- +-`int NGROUPS_MAX' +- `limits.h' (POSIX.1): *Note General Limits::. +- +-`int nice (int INCREMENT)' +- `dunno.h' (dunno.h): *Note Priority::. +- +-`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 Precision Time::. +- +-`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::. +- +-`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_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_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_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::. +- +-`_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::. +- +-`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 Priority::. +- +-`PRIO_MIN' +- `sys/resource.h' (BSD): *Note Priority::. +- +-`PRIO_PGRP' +- `sys/resource.h' (BSD): *Note Priority::. +- +-`PRIO_PROCESS' +- `sys/resource.h' (BSD): *Note Priority::. +- +-`PRIO_USER' +- `sys/resource.h' (BSD): *Note Priority::. +- +-`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 Miscellaneous Thread Functions::. +- +-`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_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_getkind_np (const pthread_mutexattr_t *ATTR, int *KIND)' +- `pthread.h' (GNU): *Note Mutexes::. +- +-`int pthread_mutexattr_init (pthread_mutexattr_t *ATTR)' +- `pthread.h' (POSIX): *Note Mutexes::. +- +-`int pthread_mutexattr_setkind_np (pthread_mutexattr_t *ATTR, int KIND)' +- `pthread.h' (GNU): *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_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_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 putenv (const 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::. +- +-`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::. +- +-`int32_t random (void)' +- `stdlib.h' (BSD): *Note BSD Random::. +- +-`int rand_r (unsigned int *SEED)' +- `stdlib.h' (POSIX.1): *Note ISO Random::. +- +-`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::. +- +-`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::. +- +-`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::. +- +-`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_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::. +- +-`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::. +- +-`_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::. +- +-`_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_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 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 Filesystem handling::. +- +-`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' (crypt.h): *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::. +- +-`FILE * setmntent (const char *FILE, const char *MODE)' +- `mntent.h' (BSD): *Note Filesystem handling::. +- +-`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 PRIORITY)' +- `sys/resource.h' (BSD): *Note Priority::. +- +-`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 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 *ACTION, struct sigaction *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 struct sigaltstack *STACK, struct sigaltstack *OLDSTACK)' +- `signal.h' (BSD): *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 *SET, sigset_t *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 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::. +- +-`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::. +- +-`char * stpcpy (char *TO, const char *FROM)' +- `string.h' (Unknown origin): *Note Copying and Concatenation::. +- +-`char * stpncpy (char *TO, const char *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 * strcat (char *TO, const char *FROM)' +- `string.h' (ISO): *Note Copying and Concatenation::. +- +-`char * strchr (const char *STRING, int C)' +- `string.h' (ISO): *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 *TO, const char *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::. +- +-`size_t strftime (char *S, size_t SIZE, const char *TEMPLATE, const struct tm *BROKENTIME)' +- `time.h' (ISO): *Note Formatting Date and 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 *TO, const char *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 *TO, const char *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 *STRING, char **TAILPTR)' +- `stdlib.h' (ISO): *Note Parsing of Floats::. +- +-`float strtof (const char *STRING, char **TAILPTR)' +- `stdlib.h' (GNU): *Note Parsing of Floats::. +- +-`char * strtok (char *NEWSTRING, const char *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 *STRING, char **TAILPTR, int BASE)' +- `stdlib.h' (ISO): *Note Parsing of Integers::. +- +-`long double strtold (const char *STRING, char **TAILPTR)' +- `stdlib.h' (GNU): *Note Parsing of Floats::. +- +-`long long int strtoll (const char *STRING, char **TAILPTR, int BASE)' +- `stdlib.h' (ISO): *Note Parsing of Integers::. +- +-`long long int strtoq (const char *STRING, char **TAILPTR, int BASE)' +- `stdlib.h' (BSD): *Note Parsing of Integers::. +- +-`unsigned long int strtoul (const char *STRING, char **TAILPTR, int BASE)' +- `stdlib.h' (ISO): *Note Parsing of Integers::. +- +-`unsigned long long int strtoull (const char *STRING, char **TAILPTR, int BASE)' +- `stdlib.h' (ISO): *Note Parsing of Integers::. +- +-`unsigned long long int strtouq (const char *STRING, char **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 Filesystem handling::. +- +-`struct FTW' +- `ftw.h' (XPG4.2): *Note Working on 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 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' +- `fstab.h' (BSD): *Note Filesystem handling::. +- +-`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 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 servent' +- `netdb.h' (BSD): *Note Services Database::. +- +-`struct sigaction' +- `signal.h' (POSIX.1): *Note Advanced Signal Handling::. +- +-`struct sigaltstack' +- `signal.h' (BSD): *Note Signal Stack::. +- +-`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 timeval' +- `sys/time.h' (BSD): *Note High-Resolution Calendar::. +- +-`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 Detailed CPU Time::. +- +-`struct utimbuf' +- `time.h' (POSIX.1): *Note File Times::. +- +-`struct utsname' +- `sys/utsname.h' (POSIX.1): *Note Hardware/Software Type ID::. +- +-`int strverscmp (const char *S1, const char *S2)' +- `string.h' (GNU): *Note String/Array Comparison::. +- +-`size_t strxfrm (char *TO, const char *FROM, size_t SIZE)' +- `string.h' (ISO): *Note Collation Functions::. +- +-`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 symlink (const char *OLDNAME, const char *NEWNAME)' +- `unistd.h' (BSD): *Note Symbolic Links::. +- +-`int sync (void)' +- `unistd.h' (X/Open): *Note Synchronizing I/O::. +- +-`long int sysconf (int PARAMETER)' +- `unistd.h' (POSIX.1): *Note Sysconf Definition::. +- +-`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::. +- +-`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): *Note Special Functions::. +- +-`float tgammaf (float X)' +- `math.h' (XPG): *Note Special Functions::. +- +-`long double tgammal (long double X)' +- `math.h' (XPG): *Note Special Functions::. +- +-`time_t time (time_t *RESULT)' +- `time.h' (ISO): *Note Simple Calendar Time::. +- +-`clock_t times (struct tms *BUFFER)' +- `sys/times.h' (POSIX.1): *Note Detailed CPU 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 *NAME, off_t LENGTH)' +- `unistd.h' (X/Open): *Note Truncating Files::. +- +-`int truncate64 (const char *NAME, off64_t LENGTH)' +- `unistd.h' (Unix98): *Note Truncating Files::. +- +-`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::. +- +-`uid_t' +- `sys/types.h' (POSIX.1): *Note Reading Persona::. +- +-`UINT_MAX' +- `limits.h' (ISO): *Note Range of Type::. +- +-`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 uname (struct utsname *INFO)' +- `sys/utsname.h' (POSIX.1): *Note Hardware/Software Type ID::. +- +-`int ungetc (int C, FILE *STREAM)' +- `stdio.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::. +- +-`void 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::. +- +-`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::. +- +-`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' (GNU): *Note Variable Arguments Input::. +- +-`int VINTR' +- `termios.h' (POSIX.1): *Note Signal Characters::. +- +-`int VKILL' +- `termios.h' (POSIX.1): *Note Editing Characters::. +- +-`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' (GNU): *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' (GNU): *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 VTIME' +- `termios.h' (POSIX.1): *Note Noncanonical Input::. +- +-`int VWERASE' +- `termios.h' (BSD): *Note Editing Characters::. +- +-`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::. +- +-`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::. +- +-`size_t wcrtomb (char *restrict S, wchar_t WC, mbstate_t *restrict PS)' +- `wchar.h' (ISO): *Note Converting a Character::. +- +-`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::. +- +-`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 wcstombs (char *STRING, const wchar_t *WSTRING, size_t SIZE)' +- `stdlib.h' (ISO): *Note Non-reentrant String Conversion::. +- +-`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::. +- +-`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::. +- +-`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::. +- +-`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::. +- +-`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 -Naur ../glibc-2.1.3/manual/libc.info-46 glibc-2.1.3/manual/libc.info-46 +--- ../glibc-2.1.3/manual/libc.info-46 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-46 1969-12-31 16:00:00.000000000 -0800 +@@ -1,986 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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' found 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 tarfiles 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.1 release, two important components of glibc are distributed as +-"official" add-ons. Unless you are doing an unusual installation, you +-should get them both. +- +- Support for POSIX threads is maintained by someone else, so it's in a +-separate package. It is only available for 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'. Support for +-the `crypt' function is distributed separately because of United States +-export restrictions. If you are outside the US or Canada, you must get +-`crypt' support from a site outside the US, such as `ftp.gwdg.de'. +-`ftp.gwdg.de' has the crypt distribution in `pub/linux/glibc'. (Most +-non-US mirrors of `ftp.gnu.org' will have it too.) The file you need +-is `glibc-crypt-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 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'd advise to +-build in a separate build directory. For example, if you have unpacked +-the glibc sources in `/src/gnu/glibc-2.1.0', create a directory +-`/src/gnu/glibc-build' to put the object files in. +- +- From your object directory, run the shell script `configure' found +-at the top level of the source tree. In the scenario above, you'd type +- +- $ ../glibc-2.1.0/configure ARGS... +- +- Please note that even if you're building in a separate build +-directory, the compiliation 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 give 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. +- +- Here are all the useful options known by `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 given, 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. +- It will normally look in `/usr/include' for them, but if you give +- 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 +- given with no list, it enables all the add-on packages it finds. +- If you do not wish to use some add-on package 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=crypt,linuxthreads' +- +-`--with-binutils=DIRECTORY' +- Use the binutils (assembler and linker) in `DIRECTORY', not the +- ones the C compiler would default to. You could use this option if +- the default binutils on your system cannot deal with all the +- constructs in the GNU C library. (`configure' will detect the +- problem and suppress these constructs, so the library will still +- be usable, but functionality may be lost--for example, you can not +- 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. +- +-`--disable-shared' +- Don't build shared libraries even if we could. 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 optimisation. We recommend against 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 library that's built 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. +- +-`--build=BUILD-SYSTEM' +-`--host=HOST-SYSTEM' +- These options are for cross-compiling. If you give them both 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 give just `--host', configure will prepare for a native +- compile but use what you say 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 give 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 really wrong. +- +- The compilation process takes several hours even on fast hardware. +-Expect at least two hours for the default configuration on i586 for +-Linux. For Hurd times are much longer. Except for EGCS 1.1 and GCC +-2.95 (and later versions of GCC), all supported versions of GCC have a +-problem which causes them to take several minutes to compile certain +-files in the iconvdata directory. Do not panic if the compiler appears +-to hang. +- +- If you want to run a parallel make, you can't just give `make' the +-`-j' option, because it won't be passed down to the sub-makes. +-Instead, edit the generated `Makefile' and uncomment the line +- +- # PARALLELMFLAGS = -j 4 +- +-You can change the `4' to some other number as appropriate for your +-system. Instead of changing the `Makefile', you could give this option +-directly to `make' and call it as, e.g. `make PARALLELMFLAGS=-j4'. If +-you're building in the source directory, you've got to use the latter +-approach since in this case no new `Makefile' is generated which you +-can change. +- +- To build and run some test programs which exercise some of the +-library facilities, type `make check'. This should complete +-successfully; if it doesn't, do not use the built library, and report a +-bug. *Note Reporting Bugs::, for how to do that. 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. +- +- 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. +- +- +-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 `make install'. This will build things if necessary, +-before installing them. Don't rely on that; compile everything first. +-If you are installing glibc as your primary C library, we recommend 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 are upgrading from a previous installation of glibc 2.0 or +-2.1, `make install' will do the entire job. If you're upgrading from +-Linux libc5 or some other C library, you need to rename the old +-`/usr/include' directory out of the way before running `make install', +-or you will end up with a mixture of header files from both libraries, +-and you won't be able to compile anything. 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 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.1 includes two daemons, `nscd' and `utmpd', 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. `utmpd' allows programs that use the old format for the `utmp' +-file to coexist with new programs. For more information see the file +-`login/README.utmpd'. +- +- 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, you can either 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.75 +- +- You need the latest version of GNU `make'. Modifying the GNU C +- Library to work with other `make' programs would be so hard that we +- recommend you port GNU `make' instead. *Really.* We recommend +- version GNU `make' version 3.75 or 3.77. All earlier versions +- have severe bugs or lack features. Version 3.76 is known to have +- bugs which only show up in big projects like GNU `libc'. Version +- 3.76.1 seems OK but some people have reported problems. +- +- * EGCS 1.1.1, 1.1 or 1.0.3, or GCC 2.8.1, 2.95, 2.95.1 +- +- The GNU C library can only be compiled with the GNU C compiler +- family. As of the 2.1 release, EGCS 1.0.3 or higher is required. +- GCC 2.8.1 can also be used (but see the FAQ for reasons why you +- might not want to). Earlier versions simply are too buggy. As of +- this writing, GCC 2.95.1 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. +- +- On Alpha machines you need at least EGCS 1.1.1. Earlier versions +- don't work reliably. +- +- For PPC you might need some patches even on top of the last EGCS +- version. See the FAQ. +- +- * GNU `binutils' 2.9.1, 2.9.1.0.16, or later 2.9.1.0.x release +- +- You must use GNU binutils (as and ld) if you want to build a shared +- library. Even if you don't, we recommend you use them anyway. No +- one has tested compilation with non-GNU binutils in a long time. +- +- The quality of binutils releases has varied a bit recently. The +- bugs are in obscure features, but glibc uses quite a few of those. +- 2.9.1, 2.9.1.0.16, and later 2.9.1.0.x releases are known to +- work. Versions after 2.8.1.0.23 may or may not work. Older +- versions definitely don't. 2.9.1.0.16 or higher is required on +- some platforms, like PPC and Arm. +- +- For PPC you might need some patches even on top of the last +- binutils version. See the FAQ. +- +- * 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. +- +-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.35 or later (version 0.10.35 is a alpha release +- and available via ftp from alpha.gnu.org/gnu) +- +-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 +- arm-*-linuxaout +- arm-*-none +- iX86-*-gnu +- iX86-*-linux +- m68k-*-linux +- powerpc-*-linux +- sparc-*-linux +- sparc64-*-linux +- +- Former releases of this library (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 <bug-glibc@gnu.org>. +- +- Each case of `iX86' can be `i386', `i486', `i586', or `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 Linux systems +-================================= +- +- If you are installing GNU libc on a Linux system, you need to have +-the header files from a 2.2 kernel around for reference. You do not +-need to use the 2.2 kernel, just have its headers where glibc can get +-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 the usual symbolic links of +-`/usr/include/linux' and `/usr/include/asm' into the 2.2 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. +- +- 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. +- +- 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 +-`http://www.imaxx.net/~thrytis/glibc' 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 check first that the problem was not reported +-before. 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 `http://www-gnats.gnu.org:8080/cgi-bin/wwwgnats.pl'. The +-WWW interface gives you access to open and closed reports. The closed +-reports normally include a patch or a hint on solving the problem. +- +- To report a bug, first you must find it. Hopefully, 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 <bugs@gnu.org>. 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 <bug-glibc-manual@gnu.org>. If you refer to specific sections +-when reporting on 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 +-`<stub-tag.h>' into your file. This causes the function to be listed +-in the installed `<gnu/stubs.h>', 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 -Naur ../glibc-2.1.3/manual/libc.info-47 glibc-2.1.3/manual/libc.info-47 +--- ../glibc-2.1.3/manual/libc.info-47 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-47 1969-12-31 16:00:00.000000000 -0800 +@@ -1,918 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Contributors, Next: Copying, 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 were 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 Torbj"orn 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 Torbj"orn 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 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. +- +- All code incorporated from 4.4 BSD is under the following +- copyright: +- +- Copyright (C) 1991 Regents of the University of California. +- All rights reserved. +- +- Redistribution and use in source and binary forms, with or +- without modification, are permitted provided that the +- following conditions are met: +- +- 1. Redistributions of source code must retain the above +- copyright notice, this list of conditions and the +- following disclaimer. +- +- 2. Redistributions in binary form must reproduce the above +- copyright notice, this list of conditions and the +- following disclaimer in the documentation and/or other +- materials provided with the distribution. +- +- 3. All advertising materials mentioning features or use of +- this software must display the following acknowledgement: +- This product includes software developed by the +- University of California, Berkeley and its +- contributors. +- +- 4. Neither the name of the University nor the names of its +- contributors may be used to endorse or promote products +- derived from this software without specific prior +- written permission. +- +- THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS +- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +- SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +- OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +- THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +- OF SUCH DAMAGE. +- +- * 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 is +- under both the Berkeley copyright above and also: +- +- Portions Copyright (C) 1993 by Digital Equipment Corporation. +- +- Permission to use, copy, modify, and distribute this software +- for any purpose with or without fee is hereby granted, +- provided that the above copyright notice and this permission +- notice appear in all copies, and that the name of Digital +- Equipment Corporation not be used in advertising or publicity +- pertaining to distribution of the document or software +- without specific, written prior permission. +- +- THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. +- DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +- INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +- FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT CORPORATION BE +- LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +- DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +- DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +- OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +- WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +- +- * The code to support Sun RPC is taken verbatim from Sun's +- RPCSRC-4.0 distribution, and is covered by this copyright: +- +- Copyright (C) 1984, Sun Microsystems, Inc. +- +- Sun RPC is a product of Sun Microsystems, Inc. and is +- provided for unrestricted use provided that this legend is +- included on all tape media and as a part of the software +- program in whole or part. Users may copy or modify Sun RPC +- without charge, but are not authorized to license or +- distribute it to anyone else except as part of a product or +- program developed by the user. +- +- SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND +- INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND +- FITNESS FOR A PARTICULAR PURPOSE, OR ARISING FROM A COURSE OF +- DEALING, USAGE OR TRADE PRACTICE. +- +- Sun RPC is provided with no support and without any +- obligation on the part of Sun Microsystems, Inc. to assist in +- its use, correction, modification or enhancement. +- +- SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT +- TO THE INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY +- PATENTS BY SUN RPC OR ANY PART THEREOF. +- +- In no event will Sun Microsystems, Inc. be liable for any +- lost revenue or profits or other special, indirect and +- consequential damages, even if Sun has been advised of the +- possibility of such damages. +- +- Sun Microsystems, Inc. +- 2550 Garcia Avenue +- Mountain View, California 94043 +- +- * Some of the support code for Mach is taken from Mach 3.0 by CMU, +- and is under the following copyright terms: +- +- Mach Operating System +- Copyright (C) 1991,1990,1989 Carnegie Mellon University +- All Rights Reserved. +- +- Permission to use, copy, modify and distribute this software +- and its documentation is hereby granted, provided that both +- the copyright notice and this permission notice appear in all +- copies of the software, derivative works or modified +- versions, and any portions thereof, and that both notices +- appear in supporting documentation. +- +- CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS +- IS" CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF +- ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF +- THIS SOFTWARE. +- +- Carnegie Mellon requests users of this software to return to +- +- Software Distribution Coordinator +- School of Computer Science +- Carnegie Mellon University +- Pittsburgh PA 15213-3890 +- +- or <Software.Distribution@CS.CMU.EDU> any improvements or +- extensions that they make and grant Carnegie Mellon the +- rights to redistribute these changes. +- +- * The code for the database library `libdb' comes from the 2.3 +- release of Berkeley DB. That code is under the same copyright as +- 4.4 BSD and also: +- +- Copyright (C) 1990, 1993, 1994, 1995, 1996, 1997 +- Sleepycat Software. All rights reserved. +- +- Redistribution and use in source and binary forms, with or +- without modification, are permitted provided that the +- following conditions are met: +- +- 1. Redistributions of source code must retain the above +- copyright notice, this list of conditions and the +- following disclaimer. +- +- 2. Redistributions in binary form must reproduce the above +- copyright notice, this list of conditions and the +- following disclaimer in the documentation and/or other +- materials provided with the distribution. +- +- 3. Redistributions in any form must be accompanied by +- information on how to obtain complete source code for +- the DB software and any accompanying software that uses +- the DB software. The source code must either be +- included in the distribution or be available for no more +- than the cost of distribution plus a nominal fee, and +- must be freely redistributable under reasonable +- conditions. For an executable file, complete source +- code means the source code for all modules it contains. +- It does not mean source code for modules or files that +- typically accompany the operating system on which the +- executable file runs, e.g., standard library modules or +- system header files. +- +- THIS SOFTWARE IS PROVIDED BY SLEEPYCAT SOFTWARE "AS IS" AND +- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL +- SLEEPYCAT SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT, +- INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +- GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +- WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +- THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +- DAMAGE. +- +- Portions copyright (C) 1995, 1996 +- The President and Fellows of Harvard University. +- All rights reserved. +- +- Redistribution and use in source and binary forms, with or +- without modification, are permitted provided that the +- following conditions are met: +- 1. Redistributions of source code must retain the above +- copyright notice, this list of conditions and the +- following disclaimer. +- +- 2. Redistributions in binary form must reproduce the above +- copyright notice, this list of conditions and the +- following disclaimer in the documentation and/or other +- materials provided with the distribution. +- +- 3. All advertising materials mentioning features or use of +- this software must display the following acknowledgement: +- This product includes software developed by +- Harvard University and its contributors. +- +- 4. Neither the name of the University nor the names of its +- contributors may be used to endorse or promote products +- derived from this software without specific prior +- written permission. +- +- THIS SOFTWARE IS PROVIDED BY HARVARD AND ITS CONTRIBUTORS "AS +- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +- FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +- SHALL HARVARD OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +- OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF +- THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +- OF SUCH DAMAGE. +- +- For a license to use, redistribute or sell DB software under +- conditions other than those described above, or to purchase +- support for this software, please contact Sleepycat Software +- at +- +- Sleepycat Software +- 394 E. Riding Dr. +- Carlisle, MA 01741 +- USA +- +1-508-287-4781 +- +- or <db@sleepycat.com>. +- +- +- +-File: libc.info, Node: Copying, Next: Concept Index, Prev: Contributors, Up: Top +- +-GNU LIBRARY GENERAL PUBLIC LICENSE +-********************************** +- +- Version 2, June 1991 +- +- Copyright (C) 1991 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 library GPL. It is +- numbered 2 because it goes with version 2 of the ordinary GPL.] +- +-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 Library General Public License, applies to some +-specially designated Free Software Foundation software, and to any +-other libraries whose authors decide to use it. You can use it for +-your libraries, too. +- +- When we speak of free software, we are referring to freedom, 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 or use pieces of it in +-new free programs; and that you know you can do these things. +- +- To protect your rights, we need to make restrictions that forbid +-anyone to deny you these rights or to ask you to surrender the 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 a program 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. +- +- Our method of protecting your rights has two steps: (1) copyright +-the library, and (2) offer you this license which gives you legal +-permission to copy, distribute and/or modify the library. +- +- Also, for each distributor's protection, we want to make certain +-that everyone understands that there is no warranty for this free +-library. If the library is modified by someone else and passed on, we +-want its recipients to know that what they have is not the original +-version, so that any problems introduced by others will not reflect on +-the original authors' reputations. +- +- Finally, any free program is threatened constantly by software +-patents. We wish to avoid the danger that companies distributing free +-software will individually obtain patent licenses, thus in effect +-transforming the program into proprietary software. To prevent this, +-we have made it clear that any patent must be licensed for everyone's +-free use or not licensed at all. +- +- Most GNU software, including some libraries, is covered by the +-ordinary GNU General Public License, which was designed for utility +-programs. This license, the GNU Library General Public License, +-applies to certain designated libraries. This license is quite +-different from the ordinary one; be sure to read it in full, and don't +-assume that anything in it is the same as in the ordinary license. +- +- The reason we have a separate public license for some libraries is +-that they blur the distinction we usually make between modifying or +-adding to a program and simply using it. Linking a program with a +-library, without changing the library, is in some sense simply using +-the library, and is analogous to running a utility program or +-application program. However, in a textual and legal sense, the linked +-executable is a combined work, a derivative of the original library, +-and the ordinary General Public License treats it as such. +- +- Because of this blurred distinction, using the ordinary General +-Public License for libraries did not effectively promote software +-sharing, because most developers did not use the libraries. We +-concluded that weaker conditions might promote sharing better. +- +- However, unrestricted linking of non-free programs would deprive the +-users of those programs of all benefit from the free status of the +-libraries themselves. This Library General Public License is intended +-to permit developers of non-free programs to use free libraries, while +-preserving your freedom as a user of such programs to change the free +-libraries that are incorporated in them. (We have not seen how to +-achieve this as regards changes in header files, but we have achieved +-it as regards changes in the actual functions of the Library.) The +-hope is that this will lead to faster development of free libraries. +- +- 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, while the latter only +-works together with the library. +- +- Note that it is possible for a library to be covered by the ordinary +-General Public License rather than by this special one. +- +- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +- +- 0. This License Agreement applies to any software library which +- contains a notice placed by the copyright holder or other +- authorized party saying it may be distributed under the terms of +- this Library 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 compile 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. 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. +- +- c. 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. +- +- d. 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 source code 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 to 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 Library 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 Library General Public License as published +- by the Free Software Foundation; either version 2 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 +- Library General Public License for more details. +- +- You should have received a copy of the GNU General Public License along +- with this program; 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 -Naur ../glibc-2.1.3/manual/libc.info-48 glibc-2.1.3/manual/libc.info-48 +--- ../glibc-2.1.3/manual/libc.info-48 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-48 1969-12-31 16:00:00.000000000 -0800 +@@ -1,977 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Concept Index, Next: Type Index, Prev: Copying, Up: Top +- +-Concept Index +-************* +- +-* Menu: +- +-* /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 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. +-* 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 allocation: Memory Concepts. +-* automatic freeing: Variable Size Automatic. +-* automatic storage with variable size: Variable Size Automatic. +-* background job: Concepts of Job Control. +-* background job, launching: Foreground and Background. +-* 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. +-* calendar time: Calendar Time. +-* calendar time and broken-down time: Broken-down 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: Processes. +-* 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 Time. +-* 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: Mathematical Constants. +-* 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. +-* copying strings and arrays: Copying and Concatenation. +-* CPU time: Processor Time. +-* 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 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 and time: Calendar Time. +-* 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 on Directory Trees. +-* directory stream: Accessing Directories. +-* disadvantages of alloca: Disadvantages of Alloca. +-* DISCARD character: Other Special. +-* division by zero: FP Exceptions. +-* DNS server unavailable: Actions in the NSS configuration. +-* domain (of socket): Socket Concepts. +-* domain error: Math Error Reporting. +-* dot notation, for Internet addresses: Abstract Host Addresses. +-* DSUSP character: Signal Characters. +-* duplicating file descriptors: Duplicating Descriptors. +-* dynamic allocation: Memory Concepts. +-* 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. +-* 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. +-* 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. +-* executing a file: Executing a File. +-* exit status: Exit Status. +-* exit status value: Program Termination. +-* 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. +-* 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. +-* 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. +-* freeing (obstacks): Freeing Obstack Objects. +-* 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 on 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. +-* 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 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 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 header files: Linux. +-* KILL character: Editing Characters. +-* kill signal: Termination Signals. +-* killing a process: Signaling Another Process. +-* 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. +-* library: Introduction. +-* 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. +-* little-endian: Byte Order. +-* LNEXT character: Other Special. +-* 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. +-* locales, parsing numbers and: Parsing of Integers. +-* 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. +-* mathematical constants: Mathematical Constants. +-* maximum: Misc FP Arithmetic. +-* maximum field width (scanf): Input Conversion Syntax. +-* measurements of floating types: Floating Type Macros. +-* memory allocation: Memory Allocation. +-* merging of signals: Merged Signals. +-* MIN termios slot: Noncanonical Input. +-* minimum: Misc FP Arithmetic. +-* minimum field width (printf): Output Conversion Syntax. +-* 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. +-* multibyte character: Extended Char Intro. +-* 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. +-* 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. +-* 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. +-* 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. +-* 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 numbers and locales: Parsing of Integers. +-* 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. +-* permission to access a file: Access Permission. +-* persona: Process Persona. +-* 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. +-* primitives, interrupting: Interrupted Primitives. +-* printing character <1>: Classification of Wide Characters. +-* printing character: Classification of Characters. +-* priority of a process: Priority. +-* process <1>: Processes. +-* process: Process Startup. +-* 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: Processor Time. +-* profiling alarm signal: Alarm Signals. +-* profiling timer: Setting an Alarm. +-* 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. +-* real group ID: Process Persona. +-* real user ID: Process Persona. +-* real-time timer: Setting an Alarm. +-* 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. +-* rpc: NSS Basics. +-* 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. +-* 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. +-* shadow: NSS Basics. +-* shadowing functions with macros: Macro Definitions. +-* shared lock: File Locks. +-* shell: Concepts of Job Control. +-* shift state: Keeping the state. +-* 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. +-* significand (of floating point number): Floating Point Concepts. +-* SIGTTIN, from background job: Access to the Terminal. +-* SIGTTOU, from background job: Access to the Terminal. +-* 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. +-* 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 allocation: Memory Concepts. +-* 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 Allocation. +-* stream (sockets): Socket Concepts. +-* stream, for I/O to a string: String Streams. +-* streams and descriptors: Stream/Descriptor Precautions. +-* streams, and file descriptors: Descriptors and Streams. +-* 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. +-* 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. +-* 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 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. +-* ticks, clock: Processor Time. +-* tilde expansion: Expansion Stages. +-* TIME termios slot: Noncanonical Input. +-* time zone: TZ Variable. +-* time zone database: TZ Variable. +-* time, calendar: Calendar Time. +-* time, elapsed CPU: Processor Time. +-* time, high precision: Precision Time. +-* timer, profiling: Setting an Alarm. +-* timer, real-time: Setting an Alarm. +-* timer, virtual: Setting an Alarm. +-* timers, setting: Setting an Alarm. +-* 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 on 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. +-* UCS2: Extended Char Intro. +-* UCS4: Extended Char Intro. +-* umask: Setting Permissions. +-* unbuffered stream: Buffering Concepts. +-* unconstrained storage 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-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. +-* width of integer type: Width of Type. +-* wildcard expansion: Expansion Stages. +-* 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. +-* zero divide: FP Exceptions. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-49 glibc-2.1.3/manual/libc.info-49 +--- ../glibc-2.1.3/manual/libc.info-49 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-49 1969-12-31 16:00:00.000000000 -0800 +@@ -1,160 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Type Index, Next: Function Index, Prev: Concept Index, Up: Top +- +-Type Index +-********** +- +-* Menu: +- +-* __ftw64_func_t: Working on Directory Trees. +-* __ftw_func_t: Working on Directory Trees. +-* __nftw64_func_t: Working on Directory Trees. +-* __nftw_func_t: Working on Directory Trees. +-* blkcnt64_t: Attribute Meanings. +-* blkcnt_t: Attribute Meanings. +-* cc_t: Mode Data Types. +-* clock_t: Basic 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. +-* 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. +-* 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: Filesystem handling. +-* struct FTW: Working on Directory Trees. +-* struct gconv_step: glibc iconv Implementation. +-* struct gconv_step_data: glibc iconv Implementation. +-* 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: Filesystem handling. +-* struct netent: Networks Database. +-* struct ntptimeval: Precision Time. +-* 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 rlimit: Limits on Resources. +-* struct rlimit64: Limits on Resources. +-* struct rusage: Resource Usage. +-* struct servent: Services Database. +-* struct sigaction: Advanced Signal Handling. +-* struct sigaltstack: Signal Stack. +-* 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 timeval: High-Resolution Calendar. +-* struct timex: Precision Time. +-* struct timezone: High-Resolution Calendar. +-* struct tm: Broken-down Time. +-* struct tms: Detailed CPU Time. +-* struct utimbuf: File Times. +-* struct utmp: Manipulating the Database. +-* struct utmpx: XPG Functions. +-* struct utsname: Hardware/Software Type ID. +-* tcflag_t: Mode Data Types. +-* time_t: Simple Calendar Time. +-* 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 -Naur ../glibc-2.1.3/manual/libc.info-5 glibc-2.1.3/manual/libc.info-5 +--- ../glibc-2.1.3/manual/libc.info-5 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-5 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1317 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Alloca Example, Next: Advantages of Alloca, Up: Variable Size Automatic +- +-`alloca' Example +----------------- +- +- As an example of 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 storage 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 storage 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 storage 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 storage 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: Character Handling, Next: String and Array Utilities, Prev: Memory Allocation, 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 character (*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. +- +- +-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 +-================================================= +- +- The second amendment to ISO C89 defines functions to classify wide +-character. Although the original ISO C89 standard already defined the +-type `wchar_t' but no functions operating on them were defined. +- +- The general design of the classification functions for wide +-characters is more general. It allows to extend the set of available +-classification beyond the set which is always available. The POSIX +-standard specifies a way how the extension can be done and this is +-already implemented in the GNU C library implementation of the +-`localedef' program. +- +- The character class functions are normally implemented using bitsets. +-I.e., for the character in question the appropriate bitset is read from +-a table and a test is performed whether a certain bit is set in this +-bitset. Which bit is tested for is determined by the class. +- +- For the wide character classification functions this is made visible. +-There is a type representing the classification, a function to retrieve +-this value for a specific class, and a function to test using the +-classification value whether a given character is in this class. 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 ony 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 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'. +- +- The make it easier to use the commonly used classification functions +-they are defined in the C library. There is no need to use `wctype' is +-the property string is one of the known character classes. In some +-situations it is desirable to construct the property string and then it +-gets 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 (iswctype (*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 provides also 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 nothing 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 nothing new +-compared to the `char' type versions of these functions. +- +- The second notes covers something which is 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' one could 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 guarateed that the wide character +-representation of a single-byte character can be found using casting. +-In fact, usually this fails miserably. The correct solution for 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'. +-Please 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. But it gets really interesting if the +-`is_in_class' function would be called more than once using 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. +-=========================== +- +- As for the classification functions the ISO C standard also +-generalizes the mapping functions. Instead of only allowing the two +-standard mappings the 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 beside 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 it can +- afterwards be used 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"' +- +- This function is declared in `wctype.h'. +- +- - Function: wint_t towctrans (wint_t WC, wctrans_t DESC) +- The `towctrans' function maps the input character WC according to +- the rules of the mapping for which DESC is an descriptor and +- returns the so found value. The DESC value must be obtained by a +- successful call to `wctrans'. +- +- This function is declared in `wctype.h'. +- +- The ISO C standard also defines for the generally available mappings +-convenient shortcuts so that it is not necesary 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 classiffication function applies here. It is not possible to +-simply cast a `char' type value to a `wint_t' and use it as an argument +-for `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. +-* 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. +- +- By convention, a "null character", `'\0'', marks the end of a +-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 (`"'). In ISO C, string +-literals can also be formed by "string concatenation": `"a" "b"' is the +-same as `"ab"'. 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. +- +- +-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. +- +- Functions that operate on arbitrary blocks of memory have names +-beginning with `mem' (such as `memcpy') and invariably take an argument +-which specifies the size (in bytes) of the block of memory to operate +-on. The array arguments and return values for these functions have +-type `void *', and as a matter of style, the elements of these arrays +-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. +- +- In contrast, functions that operate specifically on strings have +-names beginning with `str' (such as `strcpy') 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 the array elements are referred to as +-"characters". +- +- In many cases, there are both `mem' and `str' 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' functions, unless you already +-know the length of the string in advance. +- +- +-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 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. +- +- +- - Function: size_t strnlen (const char *S, size_t MAXLEN) +- The `strnlen' function returns the length of the null-terminated +- string S is this length is smaller than MAXLEN. Otherwise it +- returns MAXLEN. Therefore this function is equivalent to `(strlen +- (S) < n ? strlen (S) : MAXLEN)' but it is more efficient. +- +- char string[32] = "hello, world"; +- strnlen (string, 32) +- => 12 +- strnlen (string, 5) +- => 5 +- +- This function is a GNU extension. +- +- +-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. These functions are declared in the header file `string.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 *TO, const void *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: void * mempcpy (void *TO, const void *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: 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. +- +- - Function: void * memccpy (void *TO, const void *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: char * strcpy (char *TO, const char *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: char * strncpy (char *TO, const char *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: 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: 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 *TO, const char *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) rather than the beginning. +- +- For example, this program uses `stpcpy' to concatenate `foo' and +- `bar' to produce `foobar', which it then prints. +- +- #include <string.h> +- #include <stdio.h> +- +- 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. +- +- - Function: char * stpncpy (char *TO, const char *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 behaviour is rarely useful, but it is +- implemented to be useful in contexts where this behaviour 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 behaviour is undefined if the strings overlap. +- +- - Macro: char * strdupa (const char *S) +- This function 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 <paths.h> +- #include <string.h> +- #include <stdio.h> +- +- 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. +- +- 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'. +- +- `strndupa' is only available if GNU CC is used. +- +- - Function: char * strcat (char *TO, const char *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 *to, const char *from) +- { +- strcpy (to + strlen (to), from); +- return to; +- } +- +- This function has undefined results if the strings overlap. +- +- Programmers using the `strcat' function (or the following `strncat' +-function for that matter) can easily be recognize as lazy. In almost +-all situations the lengths of the participating strings are known. 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'. 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 concats arbitrary 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 +-efficent: +- +- 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. +- +- 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 *TO, const char *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) +- { +- strncpy (to + strlen (to), from, size); +- return to; +- } +- +- The behavior of `strncat' is undefined if the strings overlap. +- +- Here is an example showing the use of `strncpy' and `strncat'. +-Notice how, in the call to `strncat', the SIZE parameter is computed to +-avoid overflowing the character array `buffer'. +- +- #include <string.h> +- #include <stdio.h> +- +- #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. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-50 glibc-2.1.3/manual/libc.info-50 +--- ../glibc-2.1.3/manual/libc.info-50 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-50 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1181 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Function Index, Next: Variable Index, Prev: Type Index, Up: Top +- +-Function and Macro Index +-************************ +- +-* Menu: +- +-* __va_copy: Argument Macros. +-* _Exit: Termination Internals. +-* _exit: Termination Internals. +-* _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: Filesystem handling. +-* addseverity: Adding Severity Classes. +-* adjtime: 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 Date and Time. +-* asctime_r: Formatting Date and 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. +-* bcmp: String/Array Comparison. +-* bcopy: Copying and Concatenation. +-* bind: Setting Address. +-* bindtextdomain: Locating gettext catalog. +-* 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. +-* 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: EOF and Errors. +-* clock: Basic 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. +-* 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 Date and Time. +-* ctime_r: Formatting Date and Time. +-* cuserid: Who Logged In. +-* dcgettext: Translation with gettext. +-* DES_DECRYPT: DES Encryption. +-* DES_ENCRYPT: DES Encryption. +-* DES_FAILED: DES Encryption. +-* DES_HW: DES Encryption. +-* des_setparity: DES Encryption. +-* DES_SW: DES Encryption. +-* DESERR_BADPARAM: DES Encryption. +-* DESERR_HWERROR: DES Encryption. +-* DESERR_NOHWDEVICE: DES Encryption. +-* DESERR_NONE: DES Encryption. +-* dgettext: Translation with gettext. +-* difftime: Simple Calendar Time. +-* div: Integer Division. +-* 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: Filesystem handling. +-* endgrent: Scanning All Groups. +-* endhostent: Host Names. +-* endmntent: Filesystem handling. +-* 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. +-* 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. +-* 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. +-* fegetenv: Control Functions. +-* fegetexceptflag: Status bit operations. +-* fegetround: Rounding. +-* feholdexcept: Control Functions. +-* feof: EOF and Errors. +-* ferror: EOF and Errors. +-* fesetenv: Control Functions. +-* fesetexceptflag: Status bit operations. +-* fesetround: Rounding. +-* fetestexcept: Status bit operations. +-* feupdateenv: Control Functions. +-* fflush: Flushing Buffers. +-* fgetc: 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. +-* fileno: Descriptors and Streams. +-* finite: Floating Point Classes. +-* finitef: Floating Point Classes. +-* finitel: Floating Point Classes. +-* 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. +-* fputs: Simple Output. +-* fread: 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 <1>: File Size. +-* ftruncate: Truncating Files. +-* ftruncate64: Truncating Files. +-* ftw: Working on Directory Trees. +-* ftw64: Working on Directory Trees. +-* fwrite: Block Input/Output. +-* gamma: Special Functions. +-* gammaf: Special Functions. +-* gammal: Special Functions. +-* gcvt: System V Number Conversion. +-* getc: Character Input. +-* getchar: Character Input. +-* getcwd: Working Directory. +-* getdate: General Time String Parsing. +-* getdate_r: General Time String Parsing. +-* getdelim: Line Input. +-* getegid: Reading Persona. +-* getenv: Environment Access. +-* geteuid: Reading Persona. +-* getfsent: Filesystem handling. +-* getfsfile: Filesystem handling. +-* getfsspec: Filesystem handling. +-* 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. +-* 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. +-* getlogin: Who Logged In. +-* getmntent: Filesystem handling. +-* getmntent_r: Filesystem handling. +-* getnetbyaddr: Networks Database. +-* getnetbyname: Networks Database. +-* getnetent: Networks Database. +-* getnetgrent: Lookup Netgroup. +-* getnetgrent_r: Lookup Netgroup. +-* getopt: Using Getopt. +-* getopt_long: Getopt Long Options. +-* getpass: getpass. +-* getpeername: Who is Connected. +-* getpgid: Process Group Functions. +-* getpgrp: Process Group Functions. +-* getpid: Process Identification. +-* getppid: Process Identification. +-* getpriority: Priority. +-* 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. +-* getutxent: XPG Functions. +-* getutxid: XPG Functions. +-* getutxline: XPG Functions. +-* getw: Character Input. +-* getwd: Working Directory. +-* glob: Calling Glob. +-* globfree: More Flags for Globbing. +-* gmtime: Broken-down Time. +-* gmtime_r: Broken-down Time. +-* grantpt: Allocation. +-* gsignal: Signaling Yourself. +-* hasmntopt: Filesystem handling. +-* 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. +-* infnan: Floating Point Classes. +-* initgroups: Setting Groups. +-* initstate: 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. +-* ITIMER_PROF: Setting an Alarm. +-* ITIMER_REAL: Setting an Alarm. +-* ITIMER_VIRTUAL: Setting an Alarm. +-* 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 <1>: Normalization Functions. +-* logb: Exponents and Logarithms. +-* logbf <1>: Normalization Functions. +-* logbf: Exponents and Logarithms. +-* logbl <1>: Normalization Functions. +-* 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. +-* main: Program Arguments. +-* 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. +-* memmem: Search Functions. +-* memmove: Copying and Concatenation. +-* mempcpy: Copying and Concatenation. +-* memset: Copying and Concatenation. +-* mkdir: Creating Directories. +-* mkfifo: FIFO Special Files. +-* mknod: Making Special Files. +-* mkstemp: Temporary Files. +-* mktemp: Temporary Files. +-* mktime: Broken-down Time. +-* mmap: Memory-mapped I/O. +-* modf: Rounding Functions. +-* modff: Rounding Functions. +-* modfl: Rounding Functions. +-* mprobe: Heap Consistency Checking. +-* mrand48: SVID Random. +-* mrand48_r: SVID Random. +-* mremap: Memory-mapped I/O. +-* msync: Memory-mapped I/O. +-* mtrace: Tracing malloc. +-* 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 on Directory Trees. +-* nftw64: Working on Directory Trees. +-* nice: Priority. +-* nl_langinfo: The Elegant and Fast Way. +-* notfound: Actions in the NSS configuration. +-* nrand48: SVID Random. +-* nrand48_r: SVID Random. +-* NSS_STATUS_NOTFOUND: NSS Modules Interface. +-* NSS_STATUS_SUCCESS: NSS Modules Interface. +-* NSS_STATUS_TRYAGAIN: NSS Modules Interface. +-* NSS_STATUS_UNAVAIL: NSS Modules Interface. +-* ntohl: Byte Order. +-* ntohs: Byte Order. +-* ntp_adjtime: Precision Time. +-* ntp_gettime: Precision Time. +-* 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. +-* 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. +-* 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: Miscellaneous Thread Functions. +-* pthread_attr_destroy: Thread Attributes. +-* pthread_attr_get: Thread Attributes. +-* pthread_attr_getinheritsched: Thread Attributes. +-* pthread_attr_getschedparam: Thread Attributes. +-* pthread_attr_getschedpolicy: Thread Attributes. +-* pthread_attr_getscope: Thread Attributes. +-* pthread_attr_init: Thread Attributes. +-* pthread_attr_set: Thread Attributes. +-* pthread_attr_setinheritsched: Thread Attributes. +-* pthread_attr_setschedparam: Thread Attributes. +-* pthread_attr_setschedpolicy: Thread Attributes. +-* pthread_attr_setscope: 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_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_trylock: Mutexes. +-* pthread_mutex_unlock: Mutexes. +-* pthread_mutexattr_destroy: Mutexes. +-* pthread_mutexattr_getkind_np: Mutexes. +-* pthread_mutexattr_init: Mutexes. +-* pthread_mutexattr_setkind_np: Mutexes. +-* pthread_once: Miscellaneous Thread Functions. +-* pthread_self: Miscellaneous Thread Functions. +-* pthread_setcancelstate: Cancellation. +-* pthread_setcanceltype: Cancellation. +-* 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. +-* putchar: Simple Output. +-* putenv: Environment Access. +-* putpwent: Writing a User Entry. +-* puts: Simple Output. +-* pututline: Manipulating the Database. +-* pututxline: XPG Functions. +-* putw: 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. +-* read: I/O Primitives. +-* readdir: Reading/Closing Directory. +-* readdir_r: Reading/Closing Directory. +-* readlink: Symbolic Links. +-* readv: Scatter-Gather. +-* realloc: Changing Block Size. +-* 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. +-* 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. +-* 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. +-* 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. +-* setegid: Setting Groups. +-* setenv: Environment Access. +-* seteuid: Setting User ID. +-* setfsent: Filesystem handling. +-* 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. +-* setmntent: Filesystem handling. +-* setnetent: Networks Database. +-* setnetgrent: Lookup Netgroup. +-* setpgid: Process Group Functions. +-* setpgrp: Process Group Functions. +-* setpriority: Priority. +-* 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. +-* 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. +-* sscanf: Formatted Input Functions. +-* ssignal: Basic Signal Handling. +-* stat: Reading Attributes. +-* stat64: Reading Attributes. +-* stpcpy: Copying and Concatenation. +-* stpncpy: Copying and Concatenation. +-* strcasecmp: String/Array Comparison. +-* strcat: Copying and Concatenation. +-* strchr: 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. +-* strftime: Formatting Date and 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. +-* strtok: Finding Tokens in a String. +-* strtok_r: Finding Tokens in a String. +-* strtol: Parsing of Integers. +-* strtol_l: Parsing of Integers. +-* strtold: Parsing of Floats. +-* strtoll: Parsing of Integers. +-* strtoll_l: Parsing of Integers. +-* strtoq: Parsing of Integers. +-* strtoul: Parsing of Integers. +-* strtoul_l: Parsing of Integers. +-* strtoull: Parsing of Integers. +-* strtoull_l: Parsing of Integers. +-* strtouq: Parsing of Integers. +-* strverscmp: String/Array Comparison. +-* strxfrm: Collation Functions. +-* success: Actions in the NSS configuration. +-* SUN_LEN: Local Namespace Details. +-* symlink: Symbolic Links. +-* sync: Synchronizing I/O. +-* sysconf: Sysconf Definition. +-* 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. +-* times: Detailed CPU 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 <1>: File Size. +-* truncate: Truncating Files. +-* truncate64: Truncating Files. +-* 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. +-* umask: Setting Permissions. +-* uname: Hardware/Software Type ID. +-* unavail: Actions in the NSS configuration. +-* ungetc: How Unread. +-* unlink: Deleting Files. +-* unlockpt: Allocation. +-* unsetenv: Environment Access. +-* updwtmp: Manipulating the Database. +-* utime: File Times. +-* utimes: File Times. +-* utmpname: Manipulating the Database. +-* 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. +-* versionsort: Scanning Directory Content. +-* versionsort64: Scanning Directory Content. +-* vfork: Creating a Process. +-* vfprintf: Variable Arguments Output. +-* vfscanf: Variable Arguments Input. +-* vprintf: Variable Arguments Output. +-* vscanf: Variable Arguments Input. +-* vsnprintf: Variable Arguments Output. +-* vsprintf: Variable Arguments Output. +-* vsscanf: Variable Arguments Input. +-* wait: Process Completion. +-* wait3: BSD Wait Functions. +-* wait4: Process Completion. +-* waitpid: Process Completion. +-* WCOREDUMP: Process Completion Status. +-* wcrtomb: Converting a Character. +-* wcsnrtombs: Converting Strings. +-* wcsrtombs: Converting Strings. +-* wcstombs: Non-reentrant String Conversion. +-* 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. +-* wordexp: Calling Wordexp. +-* wordfree: Calling Wordexp. +-* write: I/O Primitives. +-* writev: Scatter-Gather. +-* 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 -Naur ../glibc-2.1.3/manual/libc.info-51 glibc-2.1.3/manual/libc.info-51 +--- ../glibc-2.1.3/manual/libc.info-51 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-51 1969-12-31 16:00:00.000000000 -0800 +@@ -1,900 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Variable Index, Next: File Index, Prev: Function Index, Up: Top +- +-Variable and Constant Macro Index +-********************************* +- +-* Menu: +- +-* (: glibc iconv Implementation. +-* __free_hook: Hooks for Malloc. +-* __malloc_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. +-* _LARGEFILE64_SOURCE: Feature Test Macros. +-* _LARGEFILE_SOURCE: Feature Test Macros. +-* _PATH_FSTAB: Filesystem handling. +-* _PATH_MNTTAB: Filesystem handling. +-* _PATH_MOUNTED: Filesystem handling. +-* _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. +-* _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_INET6: Internet Namespace. +-* 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: Basic CPU Time. +-* CLOCAL: Control Modes. +-* CLOCKS_PER_SEC: Basic CPU Time. +-* 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. +-* 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. +-* 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. +-* 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. +-* FSTAB: Filesystem handling. +-* FSTAB_RO: Filesystem handling. +-* FSTAB_RQ: Filesystem handling. +-* FSTAB_RW: Filesystem handling. +-* FSTAB_SW: Filesystem handling. +-* FSTAB_XX: Filesystem handling. +-* FTW_CHDIR: Working on Directory Trees. +-* FTW_D: Working on Directory Trees. +-* FTW_DEPTH: Working on Directory Trees. +-* FTW_DNR: Working on Directory Trees. +-* FTW_DP: Working on Directory Trees. +-* FTW_F: Working on Directory Trees. +-* FTW_MOUNT: Working on Directory Trees. +-* FTW_NS: Working on Directory Trees. +-* FTW_PHYS: Working on Directory Trees. +-* FTW_SL: Working on Directory Trees. +-* FTW_SLN: Working on Directory Trees. +-* getdate_err: General Time String Parsing. +-* 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. +-* IPPORT_RESERVED: Ports. +-* IPPORT_USERRESERVED: Ports. +-* ISIG: Local Modes. +-* ISTRIP: Input Modes. +-* 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. +-* 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. +-* 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: Filesystem handling. +-* MNTOPT_NOAUTO: Filesystem handling. +-* MNTOPT_NOSUID: Filesystem handling. +-* MNTOPT_RO: Filesystem handling. +-* MNTOPT_RW: Filesystem handling. +-* MNTOPT_SUID: Filesystem handling. +-* MNTTYPE_IGNORE: Filesystem handling. +-* MNTTYPE_NFS: Filesystem handling. +-* MNTTYPE_SWAP: Filesystem handling. +-* 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. +-* 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_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: Priority. +-* PRIO_MIN: Priority. +-* PRIO_PGRP: Priority. +-* PRIO_PROCESS: Priority. +-* PRIO_USER: Priority. +-* 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. +-* 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_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. +-* 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: Extended Char Intro. +-* X_OK: Testing File Access. +-* YESEXPR: The Elegant and Fast Way. +-* YESSTR: The Elegant and Fast Way. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-52 glibc-2.1.3/manual/libc.info-52 +--- ../glibc-2.1.3/manual/libc.info-52 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-52 1969-12-31 16:00:00.000000000 -0800 +@@ -1,287 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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. +-* 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. +-* 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.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. +-* 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>: EOF and Errors. +-* stdio.h <14>: Formatted Input Functions. +-* stdio.h <15>: Variable Arguments Output. +-* stdio.h <16>: Formatted Output Functions. +-* stdio.h <17>: Block Input/Output. +-* stdio.h <18>: Character Input. +-* stdio.h <19>: Simple Output. +-* stdio.h <20>: Opening Streams. +-* stdio.h <21>: 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>: Integer Division. +-* stdlib.h <8>: Absolute Value. +-* stdlib.h <9>: BSD Random. +-* stdlib.h <10>: ISO Random. +-* stdlib.h <11>: Allocation. +-* stdlib.h <12>: Array Sort Function. +-* stdlib.h <13>: Array Search Function. +-* stdlib.h <14>: Non-reentrant Character Conversion. +-* stdlib.h <15>: Selecting the Conversion. +-* stdlib.h <16>: Variable Size Automatic. +-* stdlib.h <17>: Aligned Memory Blocks. +-* stdlib.h <18>: Allocating Cleared Space. +-* stdlib.h <19>: Changing Block Size. +-* stdlib.h <20>: Freeing after Malloc. +-* stdlib.h: Basic Allocation. +-* string.h <1>: Signal Messages. +-* string.h <2>: Finding Tokens in a String. +-* string.h <3>: Search Functions. +-* string.h <4>: Collation Functions. +-* string.h <5>: String/Array Comparison. +-* string.h <6>: Copying and Concatenation. +-* string.h: String Length. +-* sys/param.h: Host Identification. +-* sys/resource.h <1>: Priority. +-* 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>: Detailed CPU Time. +-* sys/times.h: Reserved Names. +-* sys/timex.h: Precision Time. +-* 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: Hardware/Software Type ID. +-* 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 Date and Time. +-* time.h <3>: Simple Calendar Time. +-* time.h <4>: Basic CPU Time. +-* time.h: File Times. +-* 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>: Converting Strings. +-* wchar.h <2>: Converting a Character. +-* wchar.h <3>: Keeping the state. +-* wchar.h: Extended Char Intro. +-* wctype.h <1>: Wide Character Case Conversion. +-* wctype.h: Classification of Wide Characters. +-* zoneinfo: TZ Variable. +- +- +diff -Naur ../glibc-2.1.3/manual/libc.info-6 glibc-2.1.3/manual/libc.info-6 +--- ../glibc-2.1.3/manual/libc.info-6 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-6 1969-12-31 16:00:00.000000000 -0800 +@@ -1,998 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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'. +- +- 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. +- +- 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. +- +- - 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 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 strncmp (const char *S1, const char *S2, size_t SIZE) +- This function is the similar to `strcmp', except that no more than +- SIZE characters are compared. In other words, if the two strings +- are the same in their first SIZE characters, the return value is +- zero. +- +- Here are some examples showing the use of `strcmp' and `strncmp'. +-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 behaviour 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 +-header file `string.h') 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'. +- +- 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 function `strcoll' performs this translation implicitly, in +-order to do one comparison. By contrast, `strxfrm' performs 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' to transform all the strings just once, and subsequently +-compare the transformed strings with `strcmp'. +- +- - 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). +- +- 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 *TO, const char *FROM, size_t SIZE) +- The function `strxfrm' transforms STRING 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 string to allocate. It does not matter what +- TO is if SIZE is zero; TO 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); +- } +- +- *Compatibility Note:* The string collation functions are a new +-feature of ISO C 89. Older C dialects have no equivalent feature. +- +- +-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: 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. +- +- - 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. +- +- One useful, but unusual, use of the `strchr' or `index' 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 when using the GNU C library is used this `strchr' +-call gets optimized in a special way so that this version 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: 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. +- +- - 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: 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 +- +- - 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 +- +- - 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" +- +- +-File: libc.info, Node: Finding Tokens in a String, Next: Encode Binary Data, 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 *NEWSTRING, const char *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. +- +- *Warning:* Since `strtok' alters the string it is parsing, you +-should always copy the string to a temporary buffer before parsing it +-with `strtok'. If you allow `strtok' 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' 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' tries to modify it, your program will get a fatal signal +-for writing in read-only memory. *Note Program Error Signals::. +- +- 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 function `strtok' is 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 <string.h> +- #include <stddef.h> +- +- ... +- +- 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. +- +- - 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 is just `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. +- +- 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 <string.h> +- #include <stddef.h> +- +- ... +- +- 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 */ +- +- +-File: libc.info, Node: Encode Binary Data, Next: Argz and Envz Vectors, Prev: Finding Tokens in a String, 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 occurance 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 occurances 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 occurances 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 which was added +-to the C library to correctly 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 -Naur ../glibc-2.1.3/manual/libc.info-7 glibc-2.1.3/manual/libc.info-7 +--- ../glibc-2.1.3/manual/libc.info-7 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-7 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1041 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-File: libc.info, Node: Extended Char Intro, Next: Charset Function Overview, Up: Character Set Handling +- +-Introduction to Extended Characters +-=================================== +- +- A variety of solutions 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 exist. 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 whatever communication channel. Examples of external +-representations include files lying in a directory that are going to be +-read and parsed. +- +- Traditionally there was no difference between the two +-representations. It was equally comfortable and useful to use the same +-one-byte representation internally and externally. This changes with +-more and larger character sets. +- +- One of the problems to overcome with the internal representation is +-handling text which is externally encoded using different character +-sets. Assume a program which 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, 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, there exists a +-completely new family of functions which can handle texts of this kind +-in memory. The most commonly used character set for such internal wide +-character representations are Unicode and ISO 10646. The former is a +-subset of the latter and used when wide characters are chosen to by 2 +-bytes (= 16 bits) wide. The standard names of the encodings used in +-these cases are UCS2 (= 16 bits) and UCS4 (= 32 bits). +- +- To represent wide characters the `char' type is not suitable. For +-this reason the ISO C standard introduces a new type which 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 which take a single wide character. +- +- - Data type: wchar_t +- This data type is used as the base type for wide character strings. +- I.e., arrays of objects of this type are the equivalent of `char[]' +- for multibyte character strings. The type is defined in +- `stddef.h'. +- +- The ISO C89 standard, where this type was introduced, does not say +- anything specific about the representation. It only requires that +- this type is capable to store all elements of the basic character +- set. Therefore it would be legitimate to define `wchar_t' and +- `char'. This might make sense for embedded systems. +- +- But for GNU systems this type is always 32 bits wide. It is +- therefore capable to represent all UCS4 value therefore covering +- all of ISO 10646. Some Unix systems define `wchar_t' as a 16 bit +- type and thereby follow Unicode very strictly. This is perfectly +- fine with the standard but it also means that to represent all +- characters from Unicode and ISO 10646 one has to use surrogate +- character which is in fact a multi-wide-character encoding. But +- this contradicts the purpose of the `wchar_t' type. +- +- - Data type: wint_t +- `wint_t' is a data type used for parameters and variables which +- contain a single wide character. As the name already suggests it +- is the equivalent to `int' when using the normal `char' strings. +- The types `wchar_t' and `wint_t' have often the same +- representation if their size if 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 got introduced in the second +- amendment to ISO C 89. +- +- As there are for the `char' data type there also exist macros +-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 got introduced in the second amendment to ISO C89. +- +- - Macro: wint_t WCHAR_MAX +- The macro `WCHAR_MIN' evaluates to the maximum value representable +- by an object of type `wint_t'. +- +- This macro got introduced in the second amendment to ISO C89. +- +- 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. I.e., sloppy code like +- +- { +- int c; +- ... +- while ((c = getc (fp)) < 0) +- ... +- } +- +- has to be rewritten to explicitly use `WEOF' when wide characters +- are used. +- +- { +- wint_t c; +- ... +- while ((c = wgetc (fp)) != WEOF) +- ... +- } +- +- This macro was introduced in the second amendment to ISO C89 and is +- defined in `wchar.h'. +- +- These internal representations present problems when it comes to +-storing and transmittal, since a single wide character consists of more +-than one byte they are effected by byte-ordering. I.e., machines with +-different endianesses would see different value accessing the same data. +-This also applies for communication protocols which are all byte-based +-and therefore 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 an customized byte +-oriented character set. +- +- For all the above reasons, an external encoding which is different +-from the internal encoding is often used if the latter is UCS2 or UCS4. +-The external encoding is byte-based and can be chosen appropriately for +-the environment and for the texts to be handled. There exist a variety +-of different character sets which can be used for this external +-encoding. Information which will not be exhaustively presented +-here-instead, a description of the major groups will suffice. All of +-the ASCII-based character sets [_bkoz_: do you mean Roman character +-sets? If not, what do you mean here?] 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 one-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. Another reason to choose this is +- because of constraints from interaction with other programs (which +- might not be 8-bit clean). +- +- * 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. +- Embedded in the text can be characters which can be used to change +- the state. 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 which 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 SJIS (Shift JIS, a Japanese +- encoding). +- +- But there are also character sets using a state which 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. E.g., the byte sequence +- `0xc2 0x61' (non-spacing acute accent, following by lower-case +- `a') to get the "small a with acute" character. To get the acute +- accent character on its on one has to write `0xc2 0x20' (the +- non-spacing acute followed by a space). +- +- This type of characters sets is quite frequently used in embedded +- systems such as video text. +- +- * Instead of converting the Unicode or ISO 10646 text used internally +- it is often also sufficient to simply use an encoding different +- than UCS2/UCS4. The Unicode and ISO 10646 standards even specify +- such an encoding: UTF-8. This encoding is able to represent all +- of ISO 10464 31 bits in a byte string of length one to seven. +- +- There were a few other attempts to encode ISO 10646 such as UTF-7 +- but UTF-8 is today the only encoding which should be used. In +- fact, UTF-8 will hopefully soon be the only external which has to +- be supported. It proves to be universally usable and the only +- disadvantage is that it favor Roman languages very much 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. I.e., if a project is expected to only be used in, 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 which 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 specified in +-any standard, though. The ISO C standard does not specify anything +-specific about the `wchar_t' type. There might be systems where the +-developers decided differently. Therefore one should as much as +-possible avoid making assumption about the wide character representation +-although GNU systems will always work as described above. If the +-programmer uses only the functions provided by the C library to handle +-wide character strings there should not be any 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. The one function family +-is specified in the ISO C standard and therefore is portable even +-beyond the Unix world. +- +- The most commonly known set of functions, coming from the ISO C89 +-standard, is unfortunately the least useful one. In fact, 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 the second +-amendment to ISO C89. +- +- +-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 the +- standard which allow specifying a size but basically they also +- expect terminated strings. +- +- Despite these limitations the ISO C functions can very well be used +-in many contexts. In graphical user interfaces, for instance, it is not +-uncommon to have functions which require text to be displayed in a wide +-character string if it 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 which 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 UCS4, at least on GNU systems. +- +- A characteristic of each multibyte character set is the maximum +-number of bytes which can be necessary to represent one character. This +-information is quite important when writing code which uses the +-conversion functions. In the examples below we will see some examples. +-The ISO C standard defines two macros which provide this information. +- +- - Macro: int MB_LEN_MAX +- This macro 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 it 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 +- fact, in the GNU C library it is not. +- +- `MB_CUR_MAX' is defined in `stdlib.h'. +- +- Two different macros are necessary since strictly ISO C89 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 always `MB_CUR_MAX' bytes are +-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. I.e., 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. +- +- This type is defined in `wchar.h'. It got introduced in the second +- amendment to ISO C89. +- +- To use objects of this type 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 or not 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) +- This function determines whether the state object pointed to by PS +- is in the initial state or not. If PS is a null pointer or the +- object is in the initial state the return value is nonzero. +- Otherwise it is zero. +- +- This function was introduced in the second amendment to ISO C89 and +- is declared in `wchar.h'. +- +- Code using this function 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 char empty[] = ""; +- const char **srcp = ∅ +- 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 ot wide character +-text since the wide character encoding is not stateful. But there is +-nothing mentioned in any standard which 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 which consists of single byte sequences there are +-functions to help with converting bytes. One very important and often +-applicable scenario is where ASCII is a subpart of the multibyte +-character set. I.e., all ASCII characters stand for itself and all +-other characters have at least a first byte which 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. There is no `mbstate_t' object used from +- which the state information is taken and the function also does +- not use any static state. +- +- This function was introduced in the second amendment of ISO C89 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'. +- +- This function was introduced in the second amendment of ISO C89 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 an static, +- internal state variable used only by the `mbrtowc' variable 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 which 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 pointer to by PWC iff 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 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 also 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. +- +- This function was introduced in the second amendment to ISO C89 and +- is declared in `wchar.h'. +- +- Using this function is straight forward. A function which copies a +-multibyte string into a wide character string while at the same time +-converting all lowercase character into uppercase could look like this +-(this is not the final version, just an example; it has no error +-checking, and leaks sometimes 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; +- memset (&state, '\0', sizeof (state)); +- size_t nbytes; +- 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. In case the the conversion was 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 the function 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 to a +-pessimistic guess about the size of the result and if many wide +-character strings have to be constructed this way or the strings are +-long, the extra memory required allocated because the input string +-contains multibzte characters might be significant. It would be +-possible to resize the allocated memory block to the correct size before +-returning it. 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. But there is a function which 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 it 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 pointer to by PS. If PS is a null pointer an state +- object local to `mbrlen' is used. +- +- This function was introduced in the second amendment to ISO C89 and +- is declared in `wchar.h'. +- +- The tentative reader now will of course 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. +-Now, 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 OK since a) this value is larger then the length of the longest +-multibyte character sequence and b) because 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' implemented using `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 the state stored in +- the objects pointer 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 is stored in the string S. +- +- Otherwise a byte sequence (possibly including shift sequences) is +- written into the string S. This of 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 byte 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. +- +- This function was introduced in the second amendment to ISO C and +- is declared in `wchar.h'. +- +- Using this function 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 (and correct), it is simply here to +-demonstrate the use and some problems. +- +- char * +- mbscatwc (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 +-never is 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 or +-not. If this solution is really 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 do perform the conversion which 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 think about this: 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 meant 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, thus the GNU C library contains a few extensions +-which 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 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 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. +- +- This function was introduced in the second amendment to ISO C and +- is declared in `wchar.h'. +- +- The definition of this function has one limitation which has to be +-understood. 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 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 always could do only a +-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 is 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 +-never should 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 which take additional parameters specifying the maximal +-number of bytes which 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 +- 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. +- +- This function was introduced in the second amendment to ISO C and +- is declared in `wchar.h'. +- +- The restriction mentions above for the `mbsrtowcs' function applies +-also here. There is no possibility to directly control 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. I.e., 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 extensions. It is meant to work around the +- problems mentioned above. Now it is possible to convert 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 which 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 it takes, just like `mbsnrtowcs', 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 character to conversion stops at this place. +- +- This function is a GNU extension and just like `mbsnrtowcs' is +- helps in situations where no NUL terminated input strings are +- available. +- +diff -Naur ../glibc-2.1.3/manual/libc.info-8 glibc-2.1.3/manual/libc.info-8 +--- ../glibc-2.1.3/manual/libc.info-8 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-8 1969-12-31 16:00:00.000000000 -0800 +@@ -1,889 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 last chapter are defined in the second +-amendment to ISO C89. But the original ISO C89 standard also contained +-functions for character set conversion. The reason that they are not +-described in the first place is that they are almost entirely useless. +- +- The problem is that all the functions for conversion defined in +-ISO C89 use a local state. This 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 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 from +-the last section are 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 +- character, 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 which +-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 character, +- 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 reasons the ISO C89 standard defines also functions +-to convert entire strings instead of single characters. These functions +-suffer from the same problems as their reentrant counterparts from the +-second amendment to ISO C89; 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, this 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, this 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 +-which 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 which 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 always is UCS4 encoded ISO 10646. +- +- This has of course several problems when it comes to general +-character conversion: +- +- * For every conversion where neither the source or 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'. +- +- This 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 but no constraints on the character sets selected for +-source and destination. Only the set of available conversions is +-limiting them. The standard does not specify that any conversion at all +-must be available. It is a measure of the quality of the +-implementation. +- +- In the following text first the interface to `iconv', the conversion +-function, will be described. Comparisons with other implementations +-will show what pitfalls lie on the way of portable applications. At +-last, the implementation is described as far as interesting to the +-advanced user who wants to extend the 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 implement one step. +- +- Before the interfaces are described it is necessary to introduce a +-datatype. Just like other open-use-close interface the functions +-introduced here work using a 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 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. Within the data structures +- associated with the descriptor there is 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 to store the necessary files with data and code in +- arbitrary many directories. How this extensions have to 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 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 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. +- +- This function got 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 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. +- +- This function was introduced together with the rest of the `iconv' +- functions in XPG2 and it 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, const 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 on +- whether the conversion has to deal with states or not. 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 three reasons. The first is that all +- characters from the input buffer are converted. This actually can +- mean two things: really all bytes from the input buffer are +- consumed or there are some bytes at the end of the buffer which +- possibly can form a complete character but the input is +- incomplete. The second reason for a stop is when the output +- buffer is full. And the third reason is that the input contains +- invalid characters. +- +- In all 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 +- conversions performed. In all other cases the return value is +- `(size_t) -1' and `errno' is set appropriately. In this case 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. +- +- This 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 is 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 ("UCS4", charset); +- if (cd == (iconv_t) -1) +- { +- /* Something went wrong. */ +- if (errno == EINVAL) +- error (0, 0, "conversion from `%s' to `UCS4' no 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; +- 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. */ +- *((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' return 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 than can 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 it 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 +-which 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 which +- 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. On top of this the generic nature of +- these functions make them slower than specifically implemented +- functions. +- +- * The C library only contains a framework which can dynamically load +- object files and execute the therein contained conversion +- functions. +- +- 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 these possibilities, the majority 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 his +-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 in these situations and therefore this +-point is mood. The danger is that one gets acquainted with this 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. E.g., conversions from one character set to a set of, say, +-10 others counts as 10 conversion. Together with the other direction +-this makes already 20. 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 system 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 which has to convert from A to +-C. A call like +- +- cd = iconv_open ("C", "A"); +- +-does fail according to the assumption above. But what does the program +-do now? The conversion is really necessary and therefore simply giving +-up is no possibility. +- +- This is a nuisance. The `iconv' function should take care of this. +-But how should the program proceed from here on? If it would try 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 UTF8 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 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 -Naur ../glibc-2.1.3/manual/libc.info-9 glibc-2.1.3/manual/libc.info-9 +--- ../glibc-2.1.3/manual/libc.info-9 2000-01-05 19:18:25.000000000 -0800 ++++ glibc-2.1.3/manual/libc.info-9 1969-12-31 16:00:00.000000000 -0800 +@@ -1,1029 +0,0 @@ +-This is Info file libc.info, produced by Makeinfo version 1.68 from the +-input file 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.08 DRAFT, last updated 11 Jan 1999, of `The GNU C +-Library Reference Manual', for Version 2.1 Beta. +- +- Copyright (C) 1993, '94, '95, '96, '97, '98, '99 Free Software +-Foundation, Inc. +- +- Permission is granted to make and distribute verbatim copies of this +-manual provided the copyright notice and this permission notice are +-preserved on all copies. +- +- Permission is granted to copy and distribute modified versions of +-this manual under the conditions for verbatim copying, provided also +-that the section entitled "GNU Library General Public License" is +-included exactly as in the original, and provided that the entire +-resulting derived work is distributed under the terms of a permission +-notice identical to this one. +- +- Permission is granted to copy and distribute translations of this +-manual into another language, under the above conditions for modified +-versions, except that the text of the translation of the section +-entitled "GNU Library General Public License" must be approved for +-accuracy by the Foundation. +- +- +-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 funtionality 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 this means that static linking needs not to 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 easily be added. +- +- 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' this really means there is no known way, +-directly or indirectly, to perform the wanted conversion. +- +- This is achieved by providing for each character set a conversion +-from and to UCS4 encoded ISO 10646. Using ISO 10646 as an intermediate +-representation it is possible to "triangulate", i.e., converting 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 currently existing set of conversions is simply meant to +-cover all conversions which might be of interest. +- +- All currently available conversions use the triangulation method +-above, making conversion run unnecessarily slow. If, e.g., 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 can easy 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. There are two more words expected on the line. The first one +- 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 always an official name but this need not +- correspond to the most popular name. Beside this many character +- sets have special names which are somehow constructed. E.g., 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 which 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. 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 what has to +-be done is to put the new module, be its name 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 which 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 which 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 +-straighforward. Since the later 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. But the above `gconv-modules' file specifies that the new +-conversion modules can perform this conversion with only the cost of 1. +- +- A mysterious piece 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 of 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 `//'. There often is a character set named `INTERNAL' +-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 +-UCS4 but actually it is not quite right. The UCS4 specification also +-includes the specification of the byte ordering used. Since a UCS4 +-value consists of four bytes a stored value is effected by byte +-ordering. The internal representation is *not* the same as UCS4 in +-case the byte ordering of the processor (or at least the running +-process) is not the same as the one required for UCS4. 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 UCS4. 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 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 +-in future a bit but hopefully only in an upward compatible way. +- +- The definitions necessary to write new modules are publically +-available in the non-standard header `gconv.h'. The following text will +-therefore describe the definitions from this header file. But first 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 which can be used in +-calls to `iconv' and finally the handle is freed with a call to +-`iconv_close'. The problem is: 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 which is passed to the `iconv' +-function. Therefore the data structures are really the elements 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 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 filled 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 which also +- includes possible shift sequences. +- +- The `min_needed_to' and `max_needed_to' values serve the same +- purpose but this time for the destination character set. +- +- It is crucial that these values are 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. +- It 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. It can be used to communicate extra +- information from one call to another. It need not be +- initialized if not needed at all. If this element gets +- 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 which 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 and the conversion is the +- last step the `outbuf' element must be modified to point +- after last 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 when generating output a certain +- prolog and by comparing this value with zero one can find out +- whether it is the first call and therefore the prolog should +- be emitted or not. This element must never be modified. +- +- `int internal_use' +- This element is another one rarely used but needed in certain +- situations. It got 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 only used 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. But since 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 to +- access the needed information. +- +- This element is mostly used together with +- `invocation_counter' in a way like this: +- +- 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 an stateful +- character set must use the object pointed to by this element +- to store information about the conversion state. The +- `statep' element itself must never be modified. +- +- `mbstate_t __state' +- This element *never* must 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 functions itself. To understand the interface a bit of +-knowledge about the functionality in the C library which loads the +-objects with the conversions is necessary. +- +- 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. +- +- For this reason the modules do not get loaded exclusively for one +-conversion. Instead a module once loaded can be used by arbitrary many +-`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 structure used to do this. +- +- This is of course also reflected in the interface and semantic of the +-functions the modules must provide. There are three functions which +-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 +- conversion which 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 to free 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 +-function 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 int 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 set 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 communication some +- information to the conversion function this can happen using the +- `data' element of the `gconv_step' structure. But since this data +- is shared by all the conversion is must not be modified by the +- conversion function. How this can be used is shown in the example +- below. +- +- #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 +- conversion and which one is selected can be determined by +- comparing the names. The comparison should always be done without +- paying attention to the case. +- +- Then a data structure is allocated which contains the necessary +- information about which conversion is selected. 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 UCS4) +- 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 +- which have to be emitted together with the next character. +- Therefore one needs more room then 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 functions 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 it 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. It +-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. If it is nonzero it means that flushing is +- selected. +- +- Common to both mode is where the output buffer can be found. The +- information about this buffer is stored in the conversion step +- data. A pointer to this is passed as the second argument to this +- function. The description of the `struct gconv_step_data' +- structure has more information on this. +- +- What has to be done for flushing depends on the source character +- set. If it is not stateful nothing has to be done. Otherwise the +- function has to emit a byte sequence to bring the state object in +- 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 actually 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 or +- not. If it is the last step the only thing which has to be done +- is to update the `outbuf' element of the step data structure to +- point after the last written byte. This gives the caller the +- information on how much text is available in the output buffer. +- Beside this the variable pointed to by the fifth parameter, which +- is of type `size_t', must be incremented by the number of +- characters (*not bytes*) which were written in the output buffer. +- 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' this means there is +- more room in the output buffer. Unless the input buffer is empty +- the conversion functions start all over again and processes 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 points to the last character +- which was put in the converted form in the output buffer. This is +- trivial true after the conversion performed in the current step. +- But if the conversion functions deeper down the stream stop +- prematurely not all characters from the output buffer are consumed +- and therefore the input buffer pointers must be backed of to the +- right position. +- +- This 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 appropriate with a similar +- computation. Things are getting tricky if either character set +- has character 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 just +- before returning to the caller increment the `invocation_counter' +- element of the step data structure. 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_OUTPUT_FULL' +- 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; +- +- /* This variable is used to count the number of characters +- we actually converted. */ +- size_t converted = 0; +- +- 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; +- +- /* Remember how many characters we converted. */ +- *written += converted; +- +- break; +- } +- +- /* Write out all output which 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. +- +- +-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 Date and 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. +- +- * 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 XXX. +- +- 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 Date and 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::.). +- +-`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. +-E.g., it should be possible to specify more than one locale name. For +-an example take a Swedish user who better speaks German than English, +-the programs messages by default are written in English. Then it +-should be possible to specify that the first choice for the language is +-Swedish, the second choice is German, and if this also fails English is +-used. This is possible with the variable `LANGUAGE'. For further +-description of this GNU extension see *Note Using gettextized +-software::. +- +diff -Naur ../glibc-2.1.3/manual/libc.pg glibc-2.1.3/manual/libc.pg +--- ../glibc-2.1.3/manual/libc.pg 2000-01-05 19:19:29.000000000 -0800 ++++ glibc-2.1.3/manual/libc.pg 1969-12-31 16:00:00.000000000 -0800 +@@ -1,274 +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}{32}{\code {stdlib.h}} +-\entry{stdlib.h}{34}{\code {stdlib.h}} +-\entry{stdlib.h}{34}{\code {stdlib.h}} +-\entry{stdlib.h}{35}{\code {stdlib.h}} +-\entry{stdlib.h}{36}{\code {stdlib.h}} +-\entry{malloc.h}{37}{\code {malloc.h}} +-\entry{mcheck.h}{37}{\code {mcheck.h}} +-\entry{malloc.h}{39}{\code {malloc.h}} +-\entry{malloc.h}{41}{\code {malloc.h}} +-\entry{obstack.h}{47}{\code {obstack.h}} +-\entry{stdlib.h}{57}{\code {stdlib.h}} +-\entry{ctype.h}{61}{\code {ctype.h}} +-\entry{ctype.h}{61}{\code {ctype.h}} +-\entry{ctype.h}{63}{\code {ctype.h}} +-\entry{wctype.h}{64}{\code {wctype.h}} +-\entry{wctype.h}{64}{\code {wctype.h}} +-\entry{wctype.h}{64}{\code {wctype.h}} +-\entry{wctype.h}{65}{\code {wctype.h}} +-\entry{wctype.h}{65}{\code {wctype.h}} +-\entry{wctype.h}{65}{\code {wctype.h}} +-\entry{wctype.h}{65}{\code {wctype.h}} +-\entry{wctype.h}{66}{\code {wctype.h}} +-\entry{wctype.h}{66}{\code {wctype.h}} +-\entry{wctype.h}{66}{\code {wctype.h}} +-\entry{wctype.h}{66}{\code {wctype.h}} +-\entry{wctype.h}{66}{\code {wctype.h}} +-\entry{wctype.h}{67}{\code {wctype.h}} +-\entry{wctype.h}{67}{\code {wctype.h}} +-\entry{wctype.h}{68}{\code {wctype.h}} +-\entry{wctype.h}{68}{\code {wctype.h}} +-\entry{wctype.h}{69}{\code {wctype.h}} +-\entry{wctype.h}{69}{\code {wctype.h}} +-\entry{wctype.h}{69}{\code {wctype.h}} +-\entry{string.h}{72}{\code {string.h}} +-\entry{string.h}{73}{\code {string.h}} +-\entry{string.h}{81}{\code {string.h}} +-\entry{string.h}{83}{\code {string.h}} +-\entry{string.h}{86}{\code {string.h}} +-\entry{string.h}{88}{\code {string.h}} +-\entry{argz.h}{93}{\code {argz.h}} +-\entry{envz.h}{95}{\code {envz.h}} +-\entry{wchar.h}{98}{\code {wchar.h}} +-\entry{wchar.h}{99}{\code {wchar.h}} +-\entry{limits.h}{102}{\code {limits.h}} +-\entry{stdlib.h}{102}{\code {stdlib.h}} +-\entry{wchar.h}{102}{\code {wchar.h}} +-\entry{wchar.h}{103}{\code {wchar.h}} +-\entry{wchar.h}{104}{\code {wchar.h}} +-\entry{wchar.h}{105}{\code {wchar.h}} +-\entry{wchar.h}{105}{\code {wchar.h}} +-\entry{wchar.h}{107}{\code {wchar.h}} +-\entry{wchar.h}{108}{\code {wchar.h}} +-\entry{wchar.h}{110}{\code {wchar.h}} +-\entry{wchar.h}{111}{\code {wchar.h}} +-\entry{stdlib.h}{116}{\code {stdlib.h}} +-\entry{iconv.h}{120}{\code {iconv.h}} +-\entry{iconv.h}{121}{\code {iconv.h}} +-\entry{iconv.h}{122}{\code {iconv.h}} +-\entry{gconv.h}{129}{\code {gconv.h}} +-\entry{locale.h}{143}{\code {locale.h}} +-\entry{locale.h}{146}{\code {locale.h}} +-\entry{stdlib.h}{178}{\code {stdlib.h}} +-\entry{stdlib.h}{178}{\code {stdlib.h}} +-\entry{fnmatch.h}{187}{\code {fnmatch.h}} +-\entry{stdio.h}{211}{\code {stdio.h}} +-\entry{stdio.h}{211}{\code {stdio.h}} +-\entry{stdio.h}{212}{\code {stdio.h}} +-\entry{stdio.h}{215}{\code {stdio.h}} +-\entry{stdio.h}{216}{\code {stdio.h}} +-\entry{stdio.h}{221}{\code {stdio.h}} +-\entry{stdio.h}{230}{\code {stdio.h}} +-\entry{stdio.h}{232}{\code {stdio.h}} +-\entry{printf.h}{237}{\code {printf.h}} +-\entry{printf.h}{238}{\code {printf.h}} +-\entry{stdio.h}{249}{\code {stdio.h}} +-\entry{stdio.h}{250}{\code {stdio.h}} +-\entry{stdio.h}{252}{\code {stdio.h}} +-\entry{stdio.h}{255}{\code {stdio.h}} +-\entry{stdio.h}{257}{\code {stdio.h}} +-\entry{stdio.h}{257}{\code {stdio.h}} +-\entry{stdio.h}{259}{\code {stdio.h}} +-\entry{stdio.h}{262}{\code {stdio.h}} +-\entry{unistd.h}{271}{\code {unistd.h}} +-\entry{fcntl.h}{271}{\code {fcntl.h}} +-\entry{unistd.h}{275}{\code {unistd.h}} +-\entry{stdio.h}{282}{\code {stdio.h}} +-\entry{unistd.h}{283}{\code {unistd.h}} +-\entry{sys/types.h}{289}{\code {sys/types.h}} +-\entry{fcntl.h}{305}{\code {fcntl.h}} +-\entry{unistd.h}{306}{\code {unistd.h}} +-\entry{fcntl.h}{306}{\code {fcntl.h}} +-\entry{fcntl.h}{307}{\code {fcntl.h}} +-\entry{fcntl.h}{309}{\code {fcntl.h}} +-\entry{fcntl.h}{314}{\code {fcntl.h}} +-\entry{fcntl.h}{317}{\code {fcntl.h}} +-\entry{cd}{319}{\code {cd}} +-\entry{unistd.h}{319}{\code {unistd.h}} +-\entry{dirent.h}{321}{\code {dirent.h}} +-\entry{dirent.h}{322}{\code {dirent.h}} +-\entry{dirent.h}{322}{\code {dirent.h}} +-\entry{dirent.h}{324}{\code {dirent.h}} +-\entry{unistd.h}{331}{\code {unistd.h}} +-\entry{unistd.h}{332}{\code {unistd.h}} +-\entry{unistd.h}{333}{\code {unistd.h}} +-\entry{unistd.h}{334}{\code {unistd.h}} +-\entry{stdio.h}{334}{\code {stdio.h}} +-\entry{mkdir}{335}{\code {mkdir}} +-\entry{sys/stat.h}{336}{\code {sys/stat.h}} +-\entry{ls}{336}{\code {ls}} +-\entry{sys/stat.h}{336}{\code {sys/stat.h}} +-\entry{sys/stat.h}{342}{\code {sys/stat.h}} +-\entry{chown}{343}{\code {chown}} +-\entry{chgrp}{343}{\code {chgrp}} +-\entry{unistd.h}{343}{\code {unistd.h}} +-\entry{sys/stat.h}{344}{\code {sys/stat.h}} +-\entry{umask}{346}{\code {umask}} +-\entry{sys/stat.h}{346}{\code {sys/stat.h}} +-\entry{unistd.h}{348}{\code {unistd.h}} +-\entry{unistd.h}{349}{\code {unistd.h}} +-\entry{time.h}{349}{\code {time.h}} +-\entry{utime.h}{349}{\code {utime.h}} +-\entry{sys/time.h}{350}{\code {sys/time.h}} +-\entry{sys/stat.h}{352}{\code {sys/stat.h}} +-\entry{stdio.h}{353}{\code {stdio.h}} +-\entry{unistd.h}{357}{\code {unistd.h}} +-\entry{sys/stat.h}{360}{\code {sys/stat.h}} +-\entry{sys/socket.h}{364}{\code {sys/socket.h}} +-\entry{sys/socket.h}{366}{\code {sys/socket.h}} +-\entry{sys/socket.h}{367}{\code {sys/socket.h}} +-\entry{sys/socket.h}{367}{\code {sys/socket.h}} +-\entry{sys/socket.h}{369}{\code {sys/socket.h}} +-\entry{sys/un.h}{370}{\code {sys/un.h}} +-\entry{sys/socket.h}{371}{\code {sys/socket.h}} +-\entry{netinet/in.h}{372}{\code {netinet/in.h}} +-\entry{netinet/in.h}{375}{\code {netinet/in.h}} +-\entry{arpa/inet.h}{376}{\code {arpa/inet.h}} +-\entry{/etc/hosts}{377}{\code {/etc/hosts}} +-\entry{netdb.h}{377}{\code {netdb.h}} +-\entry{netinet/in.h}{381}{\code {netinet/in.h}} +-\entry{/etc/services}{381}{\code {/etc/services}} +-\entry{netdb.h}{381}{\code {netdb.h}} +-\entry{netinet/in.h}{383}{\code {netinet/in.h}} +-\entry{/etc/protocols}{383}{\code {/etc/protocols}} +-\entry{netdb.h}{384}{\code {netdb.h}} +-\entry{sys/socket.h}{386}{\code {sys/socket.h}} +-\entry{sys/socket.h}{387}{\code {sys/socket.h}} +-\entry{sys/socket.h}{387}{\code {sys/socket.h}} +-\entry{sys/socket.h}{392}{\code {sys/socket.h}} +-\entry{sys/socket.h}{393}{\code {sys/socket.h}} +-\entry{sys/socket.h}{394}{\code {sys/socket.h}} +-\entry{sys/socket.h}{401}{\code {sys/socket.h}} +-\entry{sys/socket.h}{406}{\code {sys/socket.h}} +-\entry{sys/socket.h}{407}{\code {sys/socket.h}} +-\entry{/etc/networks}{408}{\code {/etc/networks}} +-\entry{netdb.h}{408}{\code {netdb.h}} +-\entry{unistd.h}{411}{\code {unistd.h}} +-\entry{termios.h}{413}{\code {termios.h}} +-\entry{stdlib.h}{434}{\code {stdlib.h}} +-\entry{math.h}{439}{\code {math.h}} +-\entry{complex.h}{439}{\code {complex.h}} +-\entry{stdlib.h}{451}{\code {stdlib.h}} +-\entry{stdlib.h}{452}{\code {stdlib.h}} +-\entry{math.h}{459}{\code {math.h}} +-\entry{math.h}{468}{\code {math.h}} +-\entry{stdlib.h}{468}{\code {stdlib.h}} +-\entry{math.h}{469}{\code {math.h}} +-\entry{math.h}{471}{\code {math.h}} +-\entry{complex.h}{476}{\code {complex.h}} +-\entry{complex.h}{477}{\code {complex.h}} +-\entry{stdlib.h}{478}{\code {stdlib.h}} +-\entry{stdlib.h}{480}{\code {stdlib.h}} +-\entry{stdlib.h}{482}{\code {stdlib.h}} +-\entry{time.h}{487}{\code {time.h}} +-\entry{sys/times.h}{488}{\code {sys/times.h}} +-\entry{time.h}{489}{\code {time.h}} +-\entry{sys/time.h}{490}{\code {sys/time.h}} +-\entry{time.h}{495}{\code {time.h}} +-\entry{time.h}{507}{\code {time.h}} +-\entry{/etc/localtime}{508}{\code {/etc/localtime}} +-\entry{localtime}{508}{\code {localtime}} +-\entry{/share/lib/zoneinfo}{509}{\code {/share/lib/zoneinfo}} +-\entry{zoneinfo}{509}{\code {zoneinfo}} +-\entry{sys/timex.h}{511}{\code {sys/timex.h}} +-\entry{unistd.h}{514}{\code {unistd.h}} +-\entry{sys/time.h}{514}{\code {sys/time.h}} +-\entry{sys/resource.h}{517}{\code {sys/resource.h}} +-\entry{sys/resource.h}{518}{\code {sys/resource.h}} +-\entry{sys/resource.h}{521}{\code {sys/resource.h}} +-\entry{setjmp.h}{524}{\code {setjmp.h}} +-\entry{setjmp.h}{525}{\code {setjmp.h}} +-\entry{signal.h}{529}{\code {signal.h}} +-\entry{kill}{532}{\code {kill}} +-\entry{string.h}{538}{\code {string.h}} +-\entry{stdio.h}{538}{\code {stdio.h}} +-\entry{signal.h}{538}{\code {signal.h}} +-\entry{signal.h}{540}{\code {signal.h}} +-\entry{signal.h}{543}{\code {signal.h}} +-\entry{signal.h}{556}{\code {signal.h}} +-\entry{signal.h}{557}{\code {signal.h}} +-\entry{signal.h}{561}{\code {signal.h}} +-\entry{signal.h}{562}{\code {signal.h}} +-\entry{signal.h}{565}{\code {signal.h}} +-\entry{signal.h}{572}{\code {signal.h}} +-\entry{unistd.h}{577}{\code {unistd.h}} +-\entry{argp.h}{584}{\code {argp.h}} +-\entry{stdlib.h}{610}{\code {stdlib.h}} +-\entry{stdlib.h}{614}{\code {stdlib.h}} +-\entry{stdlib.h}{616}{\code {stdlib.h}} +-\entry{unistd.h}{616}{\code {unistd.h}} +-\entry{sh}{619}{\code {sh}} +-\entry{stdlib.h}{619}{\code {stdlib.h}} +-\entry{sys/types.h}{620}{\code {sys/types.h}} +-\entry{unistd.h}{620}{\code {unistd.h}} +-\entry{unistd.h}{621}{\code {unistd.h}} +-\entry{unistd.h}{622}{\code {unistd.h}} +-\entry{sys/wait.h}{624}{\code {sys/wait.h}} +-\entry{sys/wait.h}{627}{\code {sys/wait.h}} +-\entry{sys/wait.h}{627}{\code {sys/wait.h}} +-\entry{stdio.h}{646}{\code {stdio.h}} +-\entry{unistd.h}{646}{\code {unistd.h}} +-\entry{sys/types.h}{646}{\code {sys/types.h}} +-\entry{-lbsd-compat}{647}{\code {-lbsd-compat}} +-\entry{bsd-compat}{647}{\code {bsd-compat}} +-\entry{unistd.h}{648}{\code {unistd.h}} +-\entry{sys/types.h}{648}{\code {sys/types.h}} +-\entry{unistd.h}{663}{\code {unistd.h}} +-\entry{sys/types.h}{663}{\code {sys/types.h}} +-\entry{unistd.h}{664}{\code {unistd.h}} +-\entry{sys/types.h}{664}{\code {sys/types.h}} +-\entry{unistd.h}{665}{\code {unistd.h}} +-\entry{sys/types.h}{665}{\code {sys/types.h}} +-\entry{grp.h}{666}{\code {grp.h}} +-\entry{stdio.h}{670}{\code {stdio.h}} +-\entry{unistd.h}{670}{\code {unistd.h}} +-\entry{utmp.h}{671}{\code {utmp.h}} +-\entry{utmpx.h}{676}{\code {utmpx.h}} +-\entry{utmp.h}{678}{\code {utmp.h}} +-\entry{/etc/passwd}{678}{\code {/etc/passwd}} +-\entry{pwd.h}{679}{\code {pwd.h}} +-\entry{/etc/group}{681}{\code {/etc/group}} +-\entry{grp.h}{682}{\code {grp.h}} +-\entry{hostname}{689}{\code {hostname}} +-\entry{hostid}{689}{\code {hostid}} +-\entry{unistd.h}{689}{\code {unistd.h}} +-\entry{sys/param.h}{689}{\code {sys/param.h}} +-\entry{sys/utsname.h}{690}{\code {sys/utsname.h}} +-\entry{limits.h}{697}{\code {limits.h}} +-\entry{unistd.h}{698}{\code {unistd.h}} +-\entry{limits.h}{709}{\code {limits.h}} +-\entry{unistd.h}{710}{\code {unistd.h}} +-\entry{unistd.h}{711}{\code {unistd.h}} +-\entry{assert.h}{743}{\code {assert.h}} +-\entry{stdarg.h}{746}{\code {stdarg.h}} +-\entry{stdarg.h}{748}{\code {stdarg.h}} +-\entry{varargs.h}{750}{\code {varargs.h}} +-\entry{stddef.h}{751}{\code {stddef.h}} +-\entry{limits.h}{752}{\code {limits.h}} +-\entry{float.h}{755}{\code {float.h}} +diff -Naur ../glibc-2.1.3/manual/libc.pgs glibc-2.1.3/manual/libc.pgs +--- ../glibc-2.1.3/manual/libc.pgs 2000-01-05 19:19:03.000000000 -0800 ++++ glibc-2.1.3/manual/libc.pgs 1969-12-31 16:00:00.000000000 -0800 +@@ -1,98 +0,0 @@ +-\initial {-} +-\entry {\code {-lbsd-compat}}{8, 647} +-\initial {/} +-\entry {\code {/etc/group}}{681} +-\entry {\code {/etc/hosts}}{377} +-\entry {\code {/etc/localtime}}{508} +-\entry {\code {/etc/networks}}{408} +-\entry {\code {/etc/passwd}}{678} +-\entry {\code {/etc/protocols}}{383} +-\entry {\code {/etc/services}}{381} +-\entry {\code {/share/lib/zoneinfo}}{509} +-\initial {A} +-\entry {\code {argp.h}}{584} +-\entry {\code {argz.h}}{93} +-\entry {\code {arpa/inet.h}}{376} +-\entry {\code {assert.h}}{743} +-\initial {B} +-\entry {\code {bsd-compat}}{8, 647} +-\initial {C} +-\entry {\code {cd}}{319} +-\entry {\code {chgrp}}{343} +-\entry {\code {chown}}{343} +-\entry {\code {complex.h}}{439, 476, 477} +-\entry {\code {ctype.h}}{61, 63} +-\initial {D} +-\entry {\code {dirent.h}}{7, 321, 322, 324} +-\initial {E} +-\entry {\code {envz.h}}{95} +-\entry {\code {errno.h}}{15, 16} +-\initial {F} +-\entry {\code {fcntl.h}}{7, 271, 305, 306, 307, 309, 314, 317} +-\entry {\code {float.h}}{755} +-\entry {\code {fnmatch.h}}{187} +-\initial {G} +-\entry {\code {gcc}}{2} +-\entry {\code {gconv.h}}{129} +-\entry {\code {grp.h}}{7, 666, 682} +-\initial {H} +-\entry {\code {hostid}}{689} +-\entry {\code {hostname}}{689} +-\initial {I} +-\entry {\code {iconv.h}}{120, 121, 122} +-\initial {K} +-\entry {\code {kill}}{532} +-\initial {L} +-\entry {\code {limits.h}}{7, 102, 697, 709, 752} +-\entry {\code {locale.h}}{143, 146} +-\entry {\code {localtime}}{508} +-\entry {\code {ls}}{336} +-\initial {M} +-\entry {\code {malloc.h}}{37, 39, 41} +-\entry {\code {math.h}}{439, 459, 468, 469, 471} +-\entry {\code {mcheck.h}}{37} +-\entry {\code {mkdir}}{335} +-\initial {N} +-\entry {\code {netdb.h}}{377, 381, 384, 408} +-\entry {\code {netinet/in.h}}{372, 375, 381, 383} +-\initial {O} +-\entry {\code {obstack.h}}{47} +-\initial {P} +-\entry {\code {printf.h}}{237, 238} +-\entry {\code {pwd.h}}{7, 679} +-\initial {S} +-\entry {\code {setjmp.h}}{524, 525} +-\entry {\code {sh}}{619} +-\entry {\code {signal.h}}{7, 529, 538, 540, 543, 556, 557, 561, 562, 565, 572} +-\entry {\code {stdarg.h}}{746, 748} +-\entry {\code {stddef.h}}{751} +-\entry {\code {stdio.h}}{211, 212, 215, 216, 221, 230, 232, 249, 250, 252, 255, 257, 259, 262, 282, 334, 353, 538, 646, 670} +-\entry {\code {stdlib.h}}{32, 34, 35, 36, 57, 102, 116, 178, 434, 451, 452, 468, 478, 480, 482, 610, 614, 616, 619} +-\entry {\code {string.h}}{72, 73, 81, 83, 86, 88, 538} +-\entry {\code {sys/param.h}}{689} +-\entry {\code {sys/resource.h}}{517, 518, 521} +-\entry {\code {sys/socket.h}}{364, 366, 367, 369, 371, 386, 387, 392, 393, 394, 401, 406, 407} +-\entry {\code {sys/stat.h}}{7, 336, 342, 344, 346, 352, 360} +-\entry {\code {sys/time.h}}{350, 490, 514} +-\entry {\code {sys/times.h}}{7, 488} +-\entry {\code {sys/timex.h}}{511} +-\entry {\code {sys/types.h}}{289, 620, 646, 648, 663, 664, 665} +-\entry {\code {sys/un.h}}{370} +-\entry {\code {sys/utsname.h}}{690} +-\entry {\code {sys/wait.h}}{624, 627} +-\initial {T} +-\entry {\code {termios.h}}{7, 413} +-\entry {\code {time.h}}{349, 487, 489, 495, 507} +-\initial {U} +-\entry {\code {umask}}{346} +-\entry {\code {unistd.h}}{271, 275, 283, 306, 319, 331, 332, 333, 334, 343, 348, 349, 357, 411, 514, 577, 616, 620, 621, 622, 646, 648, 663, 664, 665, 670, 689, 698, 710, 711} +-\entry {\code {utime.h}}{349} +-\entry {\code {utmp.h}}{671, 678} +-\entry {\code {utmpx.h}}{676} +-\initial {V} +-\entry {\code {varargs.h}}{750} +-\initial {W} +-\entry {\code {wchar.h}}{98, 99, 102, 103, 104, 105, 107, 108, 110, 111} +-\entry {\code {wctype.h}}{64, 65, 66, 67, 68, 69} +-\initial {Z} +-\entry {\code {zoneinfo}}{509} +diff -Naur ../glibc-2.1.3/manual/libc.tp glibc-2.1.3/manual/libc.tp +--- ../glibc-2.1.3/manual/libc.tp 2000-01-05 19:19:29.000000000 -0800 ++++ glibc-2.1.3/manual/libc.tp 1969-12-31 16:00:00.000000000 -0800 +@@ -1,120 +0,0 @@ +-\entry{enum mcheck{\_}status}{38}{\code {enum mcheck_status}} +-\entry{struct mallinfo}{41}{\code {struct mallinfo}} +-\entry{struct obstack}{47}{\code {struct obstack}} +-\entry{wctype{\_}t}{64}{\code {wctype_t}} +-\entry{wctrans{\_}t}{68}{\code {wctrans_t}} +-\entry{wchar{\_}t}{97}{\code {wchar_t}} +-\entry{wint{\_}t}{98}{\code {wint_t}} +-\entry{mbstate{\_}t}{102}{\code {mbstate_t}} +-\entry{iconv{\_}t}{119}{\code {iconv_t}} +-\entry{struct gconv{\_}step}{129}{\code {struct gconv_step}} +-\entry{struct gconv{\_}step{\_}data}{130}{\code {struct gconv_step_data}} +-\entry{struct lconv}{146}{\code {struct lconv}} +-\entry{comparison{\_}fn{\_}t}{177}{\code {comparison_fn_t}} +-\entry{struct ENTRY}{183}{\code {struct ENTRY}} +-\entry{VISIT}{185}{\code {VISIT}} +-\entry{glob{\_}t}{188}{\code {glob_t}} +-\entry{regex{\_}t}{193}{\code {regex_t}} +-\entry{regmatch{\_}t}{196}{\code {regmatch_t}} +-\entry{regoff{\_}t}{196}{\code {regoff_t}} +-\entry{wordexp{\_}t}{199}{\code {wordexp_t}} +-\entry{FILE}{211}{\code {FILE}} +-\entry{struct printf{\_}info}{238}{\code {struct printf_info}} +-\entry{printf{\_}function}{239}{\code {printf_function}} +-\entry{printf{\_}arginfo{\_}function}{240}{\code {printf_arginfo_function}} +-\entry{fpos{\_}t}{255}{\code {fpos_t}} +-\entry{fpos64{\_}t}{255}{\code {fpos64_t}} +-\entry{cookie{\_}io{\_}functions{\_}t}{263}{\code {cookie_io_functions_t}} +-\entry{cookie{\_}read{\_}function}{264}{\code {cookie_read_function}} +-\entry{cookie{\_}write{\_}function}{264}{\code {cookie_write_function}} +-\entry{cookie{\_}seek{\_}function}{264}{\code {cookie_seek_function}} +-\entry{cookie{\_}close{\_}function}{264}{\code {cookie_close_function}} +-\entry{ssize{\_}t}{275}{\code {ssize_t}} +-\entry{off{\_}t}{282}{\code {off_t}} +-\entry{off64{\_}t}{282}{\code {off64_t}} +-\entry{struct iovec}{285}{\code {struct iovec}} +-\entry{fd{\_}set}{289}{\code {fd_set}} +-\entry{struct aiocb}{293}{\code {struct aiocb}} +-\entry{struct aiocb64}{295}{\code {struct aiocb64}} +-\entry{struct aioinit}{304}{\code {struct aioinit}} +-\entry{struct flock}{314}{\code {struct flock}} +-\entry{struct dirent}{321}{\code {struct dirent}} +-\entry{DIR}{322}{\code {DIR}} +-\entry{{\_}{\_}ftw{\_}func{\_}t}{327}{\code {__ftw_func_t}} +-\entry{{\_}{\_}ftw64{\_}func{\_}t}{328}{\code {__ftw64_func_t}} +-\entry{{\_}{\_}nftw{\_}func{\_}t}{328}{\code {__nftw_func_t}} +-\entry{{\_}{\_}nftw64{\_}func{\_}t}{328}{\code {__nftw64_func_t}} +-\entry{struct FTW}{328}{\code {struct FTW}} +-\entry{struct stat}{336}{\code {struct stat}} +-\entry{struct stat64}{338}{\code {struct stat64}} +-\entry{mode{\_}t}{339}{\code {mode_t}} +-\entry{ino{\_}t}{339}{\code {ino_t}} +-\entry{ino64{\_}t}{339}{\code {ino64_t}} +-\entry{dev{\_}t}{339}{\code {dev_t}} +-\entry{nlink{\_}t}{340}{\code {nlink_t}} +-\entry{blkcnt{\_}t}{340}{\code {blkcnt_t}} +-\entry{blkcnt64{\_}t}{340}{\code {blkcnt64_t}} +-\entry{struct utimbuf}{350}{\code {struct utimbuf}} +-\entry{struct sockaddr}{366}{\code {struct sockaddr}} +-\entry{struct if{\_}nameindex}{368}{\code {struct if_nameindex}} +-\entry{struct sockaddr{\_}un}{370}{\code {struct sockaddr_un}} +-\entry{struct sockaddr{\_}in}{372}{\code {struct sockaddr_in}} +-\entry{struct sockaddr{\_}in6}{372}{\code {struct sockaddr_in6}} +-\entry{struct in{\_}addr}{375}{\code {struct in_addr}} +-\entry{struct in6{\_}addr}{375}{\code {struct in6_addr}} +-\entry{struct hostent}{377}{\code {struct hostent}} +-\entry{struct servent}{381}{\code {struct servent}} +-\entry{struct protoent}{384}{\code {struct protoent}} +-\entry{struct linger}{408}{\code {struct linger}} +-\entry{struct netent}{408}{\code {struct netent}} +-\entry{struct termios}{413}{\code {struct termios}} +-\entry{tcflag{\_}t}{414}{\code {tcflag_t}} +-\entry{cc{\_}t}{414}{\code {cc_t}} +-\entry{speed{\_}t}{424}{\code {speed_t}} +-\entry{div{\_}t}{478}{\code {div_t}} +-\entry{ldiv{\_}t}{478}{\code {ldiv_t}} +-\entry{lldiv{\_}t}{479}{\code {lldiv_t}} +-\entry{imaxdiv{\_}t}{479}{\code {imaxdiv_t}} +-\entry{clock{\_}t}{488}{\code {clock_t}} +-\entry{struct tms}{488}{\code {struct tms}} +-\entry{time{\_}t}{489}{\code {time_t}} +-\entry{struct timeval}{490}{\code {struct timeval}} +-\entry{struct timezone}{490}{\code {struct timezone}} +-\entry{struct tm}{492}{\code {struct tm}} +-\entry{struct ntptimeval}{511}{\code {struct ntptimeval}} +-\entry{struct ntptimeval}{511}{\code {struct ntptimeval}} +-\entry{struct timex}{511}{\code {struct timex}} +-\entry{struct timex}{511}{\code {struct timex}} +-\entry{struct itimerval}{514}{\code {struct itimerval}} +-\entry{struct rusage}{517}{\code {struct rusage}} +-\entry{struct rlimit}{519}{\code {struct rlimit}} +-\entry{struct rlimit64}{520}{\code {struct rlimit64}} +-\entry{jmp{\_}buf}{524}{\code {jmp_buf}} +-\entry{sigjmp{\_}buf}{525}{\code {sigjmp_buf}} +-\entry{sighandler{\_}t}{538}{\code {sighandler_t}} +-\entry{struct sigaction}{541}{\code {struct sigaction}} +-\entry{sig{\_}atomic{\_}t}{554}{\code {sig_atomic_t}} +-\entry{sigset{\_}t}{561}{\code {sigset_t}} +-\entry{struct sigaltstack}{570}{\code {struct sigaltstack}} +-\entry{struct sigstack}{571}{\code {struct sigstack}} +-\entry{struct sigvec}{572}{\code {struct sigvec}} +-\entry{struct option}{580}{\code {struct option}} +-\entry{struct argp}{585}{\code {struct argp}} +-\entry{struct argp{\_}option}{586}{\code {struct argp_option}} +-\entry{struct argp{\_}state}{592}{\code {struct argp_state}} +-\entry{struct argp{\_}child}{594}{\code {struct argp_child}} +-\entry{pid{\_}t}{620}{\code {pid_t}} +-\entry{union wait}{628}{\code {union wait}} +-\entry{uid{\_}t}{663}{\code {uid_t}} +-\entry{gid{\_}t}{663}{\code {gid_t}} +-\entry{struct exit{\_}status}{671}{\code {struct exit_status}} +-\entry{struct utmp}{671}{\code {struct utmp}} +-\entry{struct utmpx}{676}{\code {struct utmpx}} +-\entry{struct passwd}{679}{\code {struct passwd}} +-\entry{struct group}{682}{\code {struct group}} +-\entry{struct utsname}{690}{\code {struct utsname}} +-\entry{struct fstab}{691}{\code {struct fstab}} +-\entry{struct mntent}{693}{\code {struct mntent}} +-\entry{va{\_}list}{748}{\code {va_list}} +-\entry{ptrdiff{\_}t}{751}{\code {ptrdiff_t}} +-\entry{size{\_}t}{751}{\code {size_t}} +diff -Naur ../glibc-2.1.3/manual/libc.tps glibc-2.1.3/manual/libc.tps +--- ../glibc-2.1.3/manual/libc.tps 2000-01-05 19:19:03.000000000 -0800 ++++ glibc-2.1.3/manual/libc.tps 1969-12-31 16:00:00.000000000 -0800 +@@ -1,138 +0,0 @@ +-\initial {{\_}} +-\entry {\code {__ftw_func_t}}{327} +-\entry {\code {__ftw64_func_t}}{328} +-\entry {\code {__nftw_func_t}}{328} +-\entry {\code {__nftw64_func_t}}{328} +-\initial {B} +-\entry {\code {blkcnt_t}}{340} +-\entry {\code {blkcnt64_t}}{340} +-\initial {C} +-\entry {\code {cc_t}}{414} +-\entry {\code {clock_t}}{488} +-\entry {\code {comparison_fn_t}}{177} +-\entry {\code {cookie_close_function}}{264} +-\entry {\code {cookie_io_functions_t}}{263} +-\entry {\code {cookie_read_function}}{264} +-\entry {\code {cookie_seek_function}}{264} +-\entry {\code {cookie_write_function}}{264} +-\initial {D} +-\entry {\code {dev_t}}{339} +-\entry {\code {DIR}}{322} +-\entry {\code {div_t}}{478} +-\initial {E} +-\entry {\code {enum mcheck_status}}{38} +-\initial {F} +-\entry {\code {fd_set}}{289} +-\entry {\code {FILE}}{211} +-\entry {\code {fpos_t}}{255} +-\entry {\code {fpos64_t}}{255} +-\initial {G} +-\entry {\code {gid_t}}{663} +-\entry {\code {glob_t}}{188} +-\initial {I} +-\entry {\code {iconv_t}}{119} +-\entry {\code {imaxdiv_t}}{479} +-\entry {\code {ino_t}}{339} +-\entry {\code {ino64_t}}{339} +-\initial {J} +-\entry {\code {jmp_buf}}{524} +-\initial {L} +-\entry {\code {ldiv_t}}{478} +-\entry {\code {lldiv_t}}{479} +-\initial {M} +-\entry {\code {mbstate_t}}{102} +-\entry {\code {mode_t}}{339} +-\initial {N} +-\entry {\code {nlink_t}}{340} +-\initial {O} +-\entry {\code {off_t}}{282} +-\entry {\code {off64_t}}{282} +-\initial {P} +-\entry {\code {pid_t}}{620} +-\entry {\code {printf_arginfo_function}}{240} +-\entry {\code {printf_function}}{239} +-\entry {\code {ptrdiff_t}}{751} +-\initial {R} +-\entry {\code {regex_t}}{193} +-\entry {\code {regmatch_t}}{196} +-\entry {\code {regoff_t}}{196} +-\initial {S} +-\entry {\code {sig_atomic_t}}{554} +-\entry {\code {sighandler_t}}{538} +-\entry {\code {sigjmp_buf}}{525} +-\entry {\code {sigset_t}}{561} +-\entry {\code {size_t}}{751} +-\entry {\code {speed_t}}{424} +-\entry {\code {ssize_t}}{275} +-\entry {\code {struct aiocb}}{293} +-\entry {\code {struct aiocb64}}{295} +-\entry {\code {struct aioinit}}{304} +-\entry {\code {struct argp}}{585} +-\entry {\code {struct argp_child}}{594} +-\entry {\code {struct argp_option}}{586} +-\entry {\code {struct argp_state}}{592} +-\entry {\code {struct dirent}}{321} +-\entry {\code {struct ENTRY}}{183} +-\entry {\code {struct exit_status}}{671} +-\entry {\code {struct flock}}{314} +-\entry {\code {struct fstab}}{691} +-\entry {\code {struct FTW}}{328} +-\entry {\code {struct gconv_step}}{129} +-\entry {\code {struct gconv_step_data}}{130} +-\entry {\code {struct group}}{682} +-\entry {\code {struct hostent}}{377} +-\entry {\code {struct if_nameindex}}{368} +-\entry {\code {struct in_addr}}{375} +-\entry {\code {struct in6_addr}}{375} +-\entry {\code {struct iovec}}{285} +-\entry {\code {struct itimerval}}{514} +-\entry {\code {struct lconv}}{146} +-\entry {\code {struct linger}}{408} +-\entry {\code {struct mallinfo}}{41} +-\entry {\code {struct mntent}}{693} +-\entry {\code {struct netent}}{408} +-\entry {\code {struct ntptimeval}}{511} +-\entry {\code {struct obstack}}{47} +-\entry {\code {struct option}}{580} +-\entry {\code {struct passwd}}{679} +-\entry {\code {struct printf_info}}{238} +-\entry {\code {struct protoent}}{384} +-\entry {\code {struct rlimit}}{519} +-\entry {\code {struct rlimit64}}{520} +-\entry {\code {struct rusage}}{517} +-\entry {\code {struct servent}}{381} +-\entry {\code {struct sigaction}}{541} +-\entry {\code {struct sigaltstack}}{570} +-\entry {\code {struct sigstack}}{571} +-\entry {\code {struct sigvec}}{572} +-\entry {\code {struct sockaddr}}{366} +-\entry {\code {struct sockaddr_in}}{372} +-\entry {\code {struct sockaddr_in6}}{372} +-\entry {\code {struct sockaddr_un}}{370} +-\entry {\code {struct stat}}{336} +-\entry {\code {struct stat64}}{338} +-\entry {\code {struct termios}}{413} +-\entry {\code {struct timeval}}{490} +-\entry {\code {struct timex}}{511} +-\entry {\code {struct timezone}}{490} +-\entry {\code {struct tm}}{492} +-\entry {\code {struct tms}}{488} +-\entry {\code {struct utimbuf}}{350} +-\entry {\code {struct utmp}}{671} +-\entry {\code {struct utmpx}}{676} +-\entry {\code {struct utsname}}{690} +-\initial {T} +-\entry {\code {tcflag_t}}{414} +-\entry {\code {time_t}}{489} +-\initial {U} +-\entry {\code {uid_t}}{663} +-\entry {\code {union wait}}{628} +-\initial {V} +-\entry {\code {va_list}}{748} +-\entry {\code {VISIT}}{185} +-\initial {W} +-\entry {\code {wchar_t}}{97} +-\entry {\code {wctrans_t}}{68} +-\entry {\code {wctype_t}}{64} +-\entry {\code {wint_t}}{98} +-\entry {\code {wordexp_t}}{199} +diff -Naur ../glibc-2.1.3/manual/libc.vr glibc-2.1.3/manual/libc.vr +--- ../glibc-2.1.3/manual/libc.vr 2000-01-05 19:19:29.000000000 -0800 ++++ glibc-2.1.3/manual/libc.vr 1969-12-31 16:00:00.000000000 -0800 +@@ -1,860 +0,0 @@ +-\entry{{\_}POSIX{\_}SOURCE}{7}{\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}{8}{\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{{\_}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}{18}{\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}{19}{\code {EFBIG}} +-\entry{ENOSPC}{19}{\code {ENOSPC}} +-\entry{ESPIPE}{19}{\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}{20}{\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}{21}{\code {EOPNOTSUPP}} +-\entry{EPFNOSUPPORT}{21}{\code {EPFNOSUPPORT}} +-\entry{EAFNOSUPPORT}{21}{\code {EAFNOSUPPORT}} +-\entry{EADDRINUSE}{21}{\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}{22}{\code {ENOTCONN}} +-\entry{EDESTADDRREQ}{22}{\code {EDESTADDRREQ}} +-\entry{ESHUTDOWN}{22}{\code {ESHUTDOWN}} +-\entry{ETOOMANYREFS}{22}{\code {ETOOMANYREFS}} +-\entry{ETIMEDOUT}{22}{\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}{23}{\code {EPROCLIM}} +-\entry{EUSERS}{23}{\code {EUSERS}} +-\entry{EDQUOT}{23}{\code {EDQUOT}} +-\entry{ESTALE}{23}{\code {ESTALE}} +-\entry{EREMOTE}{23}{\code {EREMOTE}} +-\entry{EBADRPC}{23}{\code {EBADRPC}} +-\entry{ERPCMISMATCH}{23}{\code {ERPCMISMATCH}} +-\entry{EPROGUNAVAIL}{23}{\code {EPROGUNAVAIL}} +-\entry{EPROGMISMATCH}{23}{\code {EPROGMISMATCH}} +-\entry{EPROCUNAVAIL}{23}{\code {EPROCUNAVAIL}} +-\entry{ENOLCK}{23}{\code {ENOLCK}} +-\entry{EFTYPE}{23}{\code {EFTYPE}} +-\entry{EAUTH}{24}{\code {EAUTH}} +-\entry{ENEEDAUTH}{24}{\code {ENEEDAUTH}} +-\entry{ENOSYS}{24}{\code {ENOSYS}} +-\entry{ENOTSUP}{24}{\code {ENOTSUP}} +-\entry{EILSEQ}{24}{\code {EILSEQ}} +-\entry{EBACKGROUND}{24}{\code {EBACKGROUND}} +-\entry{EDIED}{24}{\code {EDIED}} +-\entry{ED}{24}{\code {ED}} +-\entry{EGREGIOUS}{24}{\code {EGREGIOUS}} +-\entry{EIEIO}{24}{\code {EIEIO}} +-\entry{EGRATUITOUS}{25}{\code {EGRATUITOUS}} +-\entry{EBADMSG}{25}{\code {EBADMSG}} +-\entry{EIDRM}{25}{\code {EIDRM}} +-\entry{EMULTIHOP}{25}{\code {EMULTIHOP}} +-\entry{ENODATA}{25}{\code {ENODATA}} +-\entry{ENOLINK}{25}{\code {ENOLINK}} +-\entry{ENOMSG}{25}{\code {ENOMSG}} +-\entry{ENOSR}{25}{\code {ENOSR}} +-\entry{ENOSTR}{25}{\code {ENOSTR}} +-\entry{EOVERFLOW}{25}{\code {EOVERFLOW}} +-\entry{EPROTO}{25}{\code {EPROTO}} +-\entry{ETIME}{25}{\code {ETIME}} +-\entry{ERESTART}{25}{\code {ERESTART}} +-\entry{ECHRNG}{25}{\code {ECHRNG}} +-\entry{EL2NSYNC}{25}{\code {EL2NSYNC}} +-\entry{EL3HLT}{25}{\code {EL3HLT}} +-\entry{EL3RST}{25}{\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}{26}{\code {EXFULL}} +-\entry{ENOANO}{26}{\code {ENOANO}} +-\entry{EBADRQC}{26}{\code {EBADRQC}} +-\entry{EBADSLT}{26}{\code {EBADSLT}} +-\entry{EDEADLOCK}{26}{\code {EDEADLOCK}} +-\entry{EBFONT}{26}{\code {EBFONT}} +-\entry{ENONET}{26}{\code {ENONET}} +-\entry{ENOPKG}{26}{\code {ENOPKG}} +-\entry{EADV}{26}{\code {EADV}} +-\entry{ESRMNT}{26}{\code {ESRMNT}} +-\entry{ECOMM}{26}{\code {ECOMM}} +-\entry{EDOTDOT}{26}{\code {EDOTDOT}} +-\entry{ENOTUNIQ}{26}{\code {ENOTUNIQ}} +-\entry{EBADFD}{26}{\code {EBADFD}} +-\entry{EREMCHG}{26}{\code {EREMCHG}} +-\entry{ELIBACC}{26}{\code {ELIBACC}} +-\entry{ELIBBAD}{26}{\code {ELIBBAD}} +-\entry{ELIBSCN}{26}{\code {ELIBSCN}} +-\entry{ELIBMAX}{26}{\code {ELIBMAX}} +-\entry{ELIBEXEC}{26}{\code {ELIBEXEC}} +-\entry{ESTRPIPE}{26}{\code {ESTRPIPE}} +-\entry{EUCLEAN}{26}{\code {EUCLEAN}} +-\entry{ENOTNAM}{26}{\code {ENOTNAM}} +-\entry{ENAVAIL}{26}{\code {ENAVAIL}} +-\entry{EISNAM}{26}{\code {EISNAM}} +-\entry{EREMOTEIO}{26}{\code {EREMOTEIO}} +-\entry{ENOMEDIUM}{26}{\code {ENOMEDIUM}} +-\entry{EMEDIUMTYPE}{26}{\code {EMEDIUMTYPE}} +-\entry{program{\_}invocation{\_}name}{28}{\code {program_invocation_name}} +-\entry{program{\_}invocation{\_}short{\_}name}{28}{\code {program_invocation_short_name}} +-\entry{{\_}{\_}malloc{\_}hook}{39}{\code {__malloc_hook}} +-\entry{{\_}{\_}realloc{\_}hook}{39}{\code {__realloc_hook}} +-\entry{{\_}{\_}free{\_}hook}{39}{\code {__free_hook}} +-\entry{{\_}{\_}memalign{\_}hook}{39}{\code {__memalign_hook}} +-\entry{obstack{\_}alloc{\_}failed{\_}handler}{48}{\code {obstack_alloc_failed_handler}} +-\entry{WCHAR{\_}MIN}{98}{\code {WCHAR_MIN}} +-\entry{WCHAR{\_}MAX}{98}{\code {WCHAR_MAX}} +-\entry{WEOF}{98}{\code {WEOF}} +-\entry{MB{\_}LEN{\_}MAX}{102}{\code {MB_LEN_MAX}} +-\entry{MB{\_}CUR{\_}MAX}{102}{\code {MB_CUR_MAX}} +-\entry{(*gconv{\_}init{\_}fct)}{132}{\code {(*gconv_init_fct)}} +-\entry{(*gconv{\_}end{\_}fct)}{135}{\code {(*gconv_end_fct)}} +-\entry{(*gconv{\_}fct)}{135}{\code {(*gconv_fct)}} +-\entry{LC{\_}COLLATE}{142}{\code {LC_COLLATE}} +-\entry{LC{\_}CTYPE}{142}{\code {LC_CTYPE}} +-\entry{LC{\_}MONETARY}{142}{\code {LC_MONETARY}} +-\entry{LC{\_}NUMERIC}{142}{\code {LC_NUMERIC}} +-\entry{LC{\_}TIME}{142}{\code {LC_TIME}} +-\entry{LC{\_}MESSAGES}{142}{\code {LC_MESSAGES}} +-\entry{LC{\_}ALL}{143}{\code {LC_ALL}} +-\entry{LANG}{143}{\code {LANG}} +-\entry{LANGUAGE}{143}{\code {LANGUAGE}} +-\entry{ABDAY{\_}1}{150}{\code {ABDAY_1}} +-\entry{ABDAY{\_}2}{150}{\code {ABDAY_2}} +-\entry{ABDAY{\_}3}{150}{\code {ABDAY_3}} +-\entry{ABDAY{\_}4}{150}{\code {ABDAY_4}} +-\entry{ABDAY{\_}5}{150}{\code {ABDAY_5}} +-\entry{ABDAY{\_}6}{150}{\code {ABDAY_6}} +-\entry{ABDAY{\_}7}{150}{\code {ABDAY_7}} +-\entry{DAY{\_}1}{150}{\code {DAY_1}} +-\entry{DAY{\_}2}{150}{\code {DAY_2}} +-\entry{DAY{\_}3}{150}{\code {DAY_3}} +-\entry{DAY{\_}4}{150}{\code {DAY_4}} +-\entry{DAY{\_}5}{150}{\code {DAY_5}} +-\entry{DAY{\_}6}{150}{\code {DAY_6}} +-\entry{DAY{\_}7}{150}{\code {DAY_7}} +-\entry{ABMON{\_}1}{150}{\code {ABMON_1}} +-\entry{ABMON{\_}2}{150}{\code {ABMON_2}} +-\entry{ABMON{\_}3}{150}{\code {ABMON_3}} +-\entry{ABMON{\_}4}{150}{\code {ABMON_4}} +-\entry{ABMON{\_}5}{150}{\code {ABMON_5}} +-\entry{ABMON{\_}6}{150}{\code {ABMON_6}} +-\entry{ABMON{\_}7}{150}{\code {ABMON_7}} +-\entry{ABMON{\_}8}{150}{\code {ABMON_8}} +-\entry{ABMON{\_}9}{150}{\code {ABMON_9}} +-\entry{ABMON{\_}10}{150}{\code {ABMON_10}} +-\entry{ABMON{\_}11}{150}{\code {ABMON_11}} +-\entry{ABMON{\_}12}{150}{\code {ABMON_12}} +-\entry{MON{\_}1}{150}{\code {MON_1}} +-\entry{MON{\_}2}{151}{\code {MON_2}} +-\entry{MON{\_}3}{151}{\code {MON_3}} +-\entry{MON{\_}4}{151}{\code {MON_4}} +-\entry{MON{\_}5}{151}{\code {MON_5}} +-\entry{MON{\_}6}{151}{\code {MON_6}} +-\entry{MON{\_}7}{151}{\code {MON_7}} +-\entry{MON{\_}8}{151}{\code {MON_8}} +-\entry{MON{\_}9}{151}{\code {MON_9}} +-\entry{MON{\_}10}{151}{\code {MON_10}} +-\entry{MON{\_}11}{151}{\code {MON_11}} +-\entry{MON{\_}12}{151}{\code {MON_12}} +-\entry{AM{\_}STR}{151}{\code {AM_STR}} +-\entry{PM{\_}STR}{151}{\code {PM_STR}} +-\entry{D{\_}T{\_}FMT}{151}{\code {D_T_FMT}} +-\entry{D{\_}FMT}{151}{\code {D_FMT}} +-\entry{T{\_}FMT}{151}{\code {T_FMT}} +-\entry{T{\_}FMT{\_}AMPM}{151}{\code {T_FMT_AMPM}} +-\entry{ERA}{151}{\code {ERA}} +-\entry{ERA{\_}YEAR}{151}{\code {ERA_YEAR}} +-\entry{ERA{\_}D{\_}T{\_}FMT}{152}{\code {ERA_D_T_FMT}} +-\entry{ERA{\_}D{\_}FMT}{152}{\code {ERA_D_FMT}} +-\entry{ERA{\_}T{\_}FMT}{152}{\code {ERA_T_FMT}} +-\entry{ALT{\_}DIGITS}{152}{\code {ALT_DIGITS}} +-\entry{INT{\_}CURR{\_}SYMBOL}{152}{\code {INT_CURR_SYMBOL}} +-\entry{CURRENCY{\_}SYMBOL}{152}{\code {CURRENCY_SYMBOL}} +-\entry{CRNCYSTR}{152}{\code {CRNCYSTR}} +-\entry{MON{\_}DECIMAL{\_}POINT}{152}{\code {MON_DECIMAL_POINT}} +-\entry{MON{\_}THOUSANDS{\_}SEP}{152}{\code {MON_THOUSANDS_SEP}} +-\entry{MON{\_}GROUPING}{152}{\code {MON_GROUPING}} +-\entry{POSITIVE{\_}SIGN}{152}{\code {POSITIVE_SIGN}} +-\entry{NEGATIVE{\_}SIGN}{152}{\code {NEGATIVE_SIGN}} +-\entry{INT{\_}FRAC{\_}DIGITS}{152}{\code {INT_FRAC_DIGITS}} +-\entry{FRAC{\_}DIGITS}{153}{\code {FRAC_DIGITS}} +-\entry{P{\_}CS{\_}PRECEDES}{153}{\code {P_CS_PRECEDES}} +-\entry{P{\_}SEP{\_}BY{\_}SPACE}{153}{\code {P_SEP_BY_SPACE}} +-\entry{N{\_}CS{\_}PRECEDES}{153}{\code {N_CS_PRECEDES}} +-\entry{N{\_}SEP{\_}BY{\_}SPACE}{153}{\code {N_SEP_BY_SPACE}} +-\entry{P{\_}SIGN{\_}POSN}{153}{\code {P_SIGN_POSN}} +-\entry{N{\_}SIGN{\_}POSN}{153}{\code {N_SIGN_POSN}} +-\entry{DECIMAL{\_}POINT}{153}{\code {DECIMAL_POINT}} +-\entry{RADIXCHAR}{153}{\code {RADIXCHAR}} +-\entry{THOUSANDS{\_}SEP}{153}{\code {THOUSANDS_SEP}} +-\entry{THOUSEP}{153}{\code {THOUSEP}} +-\entry{GROUPING}{153}{\code {GROUPING}} +-\entry{YESEXPR}{153}{\code {YESEXPR}} +-\entry{NOEXPR}{153}{\code {NOEXPR}} +-\entry{YESSTR}{153}{\code {YESSTR}} +-\entry{NOSTR}{154}{\code {NOSTR}} +-\entry{stdin}{211}{\code {stdin}} +-\entry{stdout}{211}{\code {stdout}} +-\entry{stderr}{211}{\code {stderr}} +-\entry{FOPEN{\_}MAX}{213}{\code {FOPEN_MAX}} +-\entry{NL{\_}ARGMAX}{223}{\code {NL_ARGMAX}} +-\entry{PA{\_}FLAG{\_}MASK}{234}{\code {PA_FLAG_MASK}} +-\entry{PA{\_}INT}{234}{\code {PA_INT}} +-\entry{PA{\_}CHAR}{234}{\code {PA_CHAR}} +-\entry{PA{\_}STRING}{234}{\code {PA_STRING}} +-\entry{PA{\_}POINTER}{234}{\code {PA_POINTER}} +-\entry{PA{\_}FLOAT}{234}{\code {PA_FLOAT}} +-\entry{PA{\_}DOUBLE}{235}{\code {PA_DOUBLE}} +-\entry{PA{\_}LAST}{235}{\code {PA_LAST}} +-\entry{PA{\_}FLAG{\_}PTR}{235}{\code {PA_FLAG_PTR}} +-\entry{PA{\_}FLAG{\_}SHORT}{235}{\code {PA_FLAG_SHORT}} +-\entry{PA{\_}FLAG{\_}LONG}{235}{\code {PA_FLAG_LONG}} +-\entry{PA{\_}FLAG{\_}LONG{\_}LONG}{235}{\code {PA_FLAG_LONG_LONG}} +-\entry{PA{\_}FLAG{\_}LONG{\_}DOUBLE}{235}{\code {PA_FLAG_LONG_DOUBLE}} +-\entry{EOF}{250}{\code {EOF}} +-\entry{SEEK{\_}SET}{254}{\code {SEEK_SET}} +-\entry{SEEK{\_}CUR}{254}{\code {SEEK_CUR}} +-\entry{SEEK{\_}END}{254}{\code {SEEK_END}} +-\entry{L{\_}SET}{254}{\code {L_SET}} +-\entry{L{\_}INCR}{254}{\code {L_INCR}} +-\entry{L{\_}XTND}{254}{\code {L_XTND}} +-\entry{{\_}IOFBF}{258}{\code {_IOFBF}} +-\entry{{\_}IOLBF}{258}{\code {_IOLBF}} +-\entry{{\_}IONBF}{258}{\code {_IONBF}} +-\entry{BUFSIZ}{258}{\code {BUFSIZ}} +-\entry{MM{\_}PRINT}{264}{\code {MM_PRINT}} +-\entry{MM{\_}CONSOLE}{264}{\code {MM_CONSOLE}} +-\entry{MM{\_}HARD}{265}{\code {MM_HARD}} +-\entry{MM{\_}SOFT}{265}{\code {MM_SOFT}} +-\entry{MM{\_}FIRM}{265}{\code {MM_FIRM}} +-\entry{MM{\_}APPL}{265}{\code {MM_APPL}} +-\entry{MM{\_}UTIL}{265}{\code {MM_UTIL}} +-\entry{MM{\_}OPSYS}{265}{\code {MM_OPSYS}} +-\entry{MM{\_}RECOVER}{265}{\code {MM_RECOVER}} +-\entry{MM{\_}NRECOV}{265}{\code {MM_NRECOV}} +-\entry{MM{\_}NULLLBL}{265}{\code {MM_NULLLBL}} +-\entry{MM{\_}NULLSEV}{265}{\code {MM_NULLSEV}} +-\entry{MM{\_}NULLMC}{265}{\code {MM_NULLMC}} +-\entry{MM{\_}NULLTXT}{265}{\code {MM_NULLTXT}} +-\entry{MM{\_}NULLACT}{266}{\code {MM_NULLACT}} +-\entry{MM{\_}NULLTAG}{266}{\code {MM_NULLTAG}} +-\entry{MM{\_}NOSEV}{266}{\code {MM_NOSEV}} +-\entry{MM{\_}HALT}{266}{\code {MM_HALT}} +-\entry{MM{\_}ERROR}{266}{\code {MM_ERROR}} +-\entry{MM{\_}WARNING}{266}{\code {MM_WARNING}} +-\entry{MM{\_}INFO}{266}{\code {MM_INFO}} +-\entry{STDIN{\_}FILENO}{283}{\code {STDIN_FILENO}} +-\entry{STDOUT{\_}FILENO}{283}{\code {STDOUT_FILENO}} +-\entry{STDERR{\_}FILENO}{283}{\code {STDERR_FILENO}} +-\entry{PROT{\_}READ}{286}{\code {PROT_READ}} +-\entry{PROT{\_}WRITE}{286}{\code {PROT_WRITE}} +-\entry{PROT{\_}EXEC}{286}{\code {PROT_EXEC}} +-\entry{MAP{\_}PRIVATE}{286}{\code {MAP_PRIVATE}} +-\entry{MAP{\_}SHARED}{287}{\code {MAP_SHARED}} +-\entry{MAP{\_}FIXED}{287}{\code {MAP_FIXED}} +-\entry{MAP{\_}ANONYMOUS}{287}{\code {MAP_ANONYMOUS}} +-\entry{MAP{\_}ANON}{287}{\code {MAP_ANON}} +-\entry{MS{\_}SYNC}{288}{\code {MS_SYNC}} +-\entry{MS{\_}ASYNC}{288}{\code {MS_ASYNC}} +-\entry{FD{\_}SETSIZE}{289}{\code {FD_SETSIZE}} +-\entry{LIO{\_}READ}{294}{\code {LIO_READ}} +-\entry{LIO{\_}WRITE}{294}{\code {LIO_WRITE}} +-\entry{LIO{\_}NOP}{294}{\code {LIO_NOP}} +-\entry{F{\_}DUPFD}{306}{\code {F_DUPFD}} +-\entry{F{\_}GETFD}{307}{\code {F_GETFD}} +-\entry{F{\_}SETFD}{308}{\code {F_SETFD}} +-\entry{FD{\_}CLOEXEC}{308}{\code {FD_CLOEXEC}} +-\entry{O{\_}RDONLY}{309}{\code {O_RDONLY}} +-\entry{O{\_}WRONLY}{309}{\code {O_WRONLY}} +-\entry{O{\_}RDWR}{309}{\code {O_RDWR}} +-\entry{O{\_}READ}{309}{\code {O_READ}} +-\entry{O{\_}WRITE}{309}{\code {O_WRITE}} +-\entry{O{\_}EXEC}{310}{\code {O_EXEC}} +-\entry{O{\_}ACCMODE}{310}{\code {O_ACCMODE}} +-\entry{O{\_}CREAT}{310}{\code {O_CREAT}} +-\entry{O{\_}EXCL}{310}{\code {O_EXCL}} +-\entry{O{\_}NONBLOCK}{310}{\code {O_NONBLOCK}} +-\entry{O{\_}NOCTTY}{311}{\code {O_NOCTTY}} +-\entry{O{\_}IGNORE{\_}CTTY}{311}{\code {O_IGNORE_CTTY}} +-\entry{O{\_}NOLINK}{311}{\code {O_NOLINK}} +-\entry{O{\_}NOTRANS}{311}{\code {O_NOTRANS}} +-\entry{O{\_}TRUNC}{311}{\code {O_TRUNC}} +-\entry{O{\_}SHLOCK}{311}{\code {O_SHLOCK}} +-\entry{O{\_}EXLOCK}{312}{\code {O_EXLOCK}} +-\entry{O{\_}APPEND}{312}{\code {O_APPEND}} +-\entry{O{\_}NONBLOCK}{312}{\code {O_NONBLOCK}} +-\entry{O{\_}NDELAY}{312}{\code {O_NDELAY}} +-\entry{O{\_}ASYNC}{312}{\code {O_ASYNC}} +-\entry{O{\_}FSYNC}{312}{\code {O_FSYNC}} +-\entry{O{\_}SYNC}{312}{\code {O_SYNC}} +-\entry{O{\_}NOATIME}{313}{\code {O_NOATIME}} +-\entry{F{\_}GETFL}{313}{\code {F_GETFL}} +-\entry{F{\_}SETFL}{313}{\code {F_SETFL}} +-\entry{F{\_}GETLK}{315}{\code {F_GETLK}} +-\entry{F{\_}SETLK}{315}{\code {F_SETLK}} +-\entry{F{\_}SETLKW}{316}{\code {F_SETLKW}} +-\entry{F{\_}RDLCK}{316}{\code {F_RDLCK}} +-\entry{F{\_}WRLCK}{317}{\code {F_WRLCK}} +-\entry{F{\_}UNLCK}{317}{\code {F_UNLCK}} +-\entry{F{\_}GETOWN}{317}{\code {F_GETOWN}} +-\entry{F{\_}SETOWN}{317}{\code {F_SETOWN}} +-\entry{FTW{\_}F}{327}{\code {FTW_F}} +-\entry{FTW{\_}D}{327}{\code {FTW_D}} +-\entry{FTW{\_}NS}{327}{\code {FTW_NS}} +-\entry{FTW{\_}DNR}{327}{\code {FTW_DNR}} +-\entry{FTW{\_}SL}{327}{\code {FTW_SL}} +-\entry{FTW{\_}DP}{328}{\code {FTW_DP}} +-\entry{FTW{\_}SLN}{328}{\code {FTW_SLN}} +-\entry{FTW{\_}PHYS}{330}{\code {FTW_PHYS}} +-\entry{FTW{\_}MOUNT}{330}{\code {FTW_MOUNT}} +-\entry{FTW{\_}CHDIR}{330}{\code {FTW_CHDIR}} +-\entry{FTW{\_}DEPTH}{330}{\code {FTW_DEPTH}} +-\entry{S{\_}IFMT}{342}{\code {S_IFMT}} +-\entry{S{\_}IFDIR}{342}{\code {S_IFDIR}} +-\entry{S{\_}IFCHR}{342}{\code {S_IFCHR}} +-\entry{S{\_}IFBLK}{342}{\code {S_IFBLK}} +-\entry{S{\_}IFREG}{343}{\code {S_IFREG}} +-\entry{S{\_}IFLNK}{343}{\code {S_IFLNK}} +-\entry{S{\_}IFSOCK}{343}{\code {S_IFSOCK}} +-\entry{S{\_}IFIFO}{343}{\code {S_IFIFO}} +-\entry{S{\_}IRUSR}{344}{\code {S_IRUSR}} +-\entry{S{\_}IREAD}{344}{\code {S_IREAD}} +-\entry{S{\_}IWUSR}{344}{\code {S_IWUSR}} +-\entry{S{\_}IWRITE}{344}{\code {S_IWRITE}} +-\entry{S{\_}IXUSR}{344}{\code {S_IXUSR}} +-\entry{S{\_}IEXEC}{344}{\code {S_IEXEC}} +-\entry{S{\_}IRWXU}{344}{\code {S_IRWXU}} +-\entry{S{\_}IRGRP}{344}{\code {S_IRGRP}} +-\entry{S{\_}IWGRP}{344}{\code {S_IWGRP}} +-\entry{S{\_}IXGRP}{344}{\code {S_IXGRP}} +-\entry{S{\_}IRWXG}{344}{\code {S_IRWXG}} +-\entry{S{\_}IROTH}{345}{\code {S_IROTH}} +-\entry{S{\_}IWOTH}{345}{\code {S_IWOTH}} +-\entry{S{\_}IXOTH}{345}{\code {S_IXOTH}} +-\entry{S{\_}IRWXO}{345}{\code {S_IRWXO}} +-\entry{S{\_}ISUID}{345}{\code {S_ISUID}} +-\entry{S{\_}ISGID}{345}{\code {S_ISGID}} +-\entry{S{\_}ISVTX}{345}{\code {S_ISVTX}} +-\entry{R{\_}OK}{349}{\code {R_OK}} +-\entry{W{\_}OK}{349}{\code {W_OK}} +-\entry{X{\_}OK}{349}{\code {X_OK}} +-\entry{F{\_}OK}{349}{\code {F_OK}} +-\entry{L{\_}tmpnam}{354}{\code {L_tmpnam}} +-\entry{TMP{\_}MAX}{354}{\code {TMP_MAX}} +-\entry{P{\_}tmpdir}{355}{\code {P_tmpdir}} +-\entry{SOCK{\_}STREAM}{364}{\code {SOCK_STREAM}} +-\entry{SOCK{\_}DGRAM}{364}{\code {SOCK_DGRAM}} +-\entry{SOCK{\_}RAW}{365}{\code {SOCK_RAW}} +-\entry{AF{\_}LOCAL}{366}{\code {AF_LOCAL}} +-\entry{AF{\_}UNIX}{366}{\code {AF_UNIX}} +-\entry{AF{\_}FILE}{366}{\code {AF_FILE}} +-\entry{AF{\_}INET}{366}{\code {AF_INET}} +-\entry{AF{\_}UNSPEC}{366}{\code {AF_UNSPEC}} +-\entry{IFNAMSIZ}{368}{\code {IFNAMSIZ}} +-\entry{PF{\_}LOCAL}{369}{\code {PF_LOCAL}} +-\entry{PF{\_}UNIX}{369}{\code {PF_UNIX}} +-\entry{PF{\_}FILE}{369}{\code {PF_FILE}} +-\entry{PF{\_}INET}{371}{\code {PF_INET}} +-\entry{AF{\_}INET6}{371}{\code {AF_INET6}} +-\entry{INADDR{\_}LOOPBACK}{375}{\code {INADDR_LOOPBACK}} +-\entry{INADDR{\_}ANY}{375}{\code {INADDR_ANY}} +-\entry{INADDR{\_}BROADCAST}{375}{\code {INADDR_BROADCAST}} +-\entry{INADDR{\_}NONE}{375}{\code {INADDR_NONE}} +-\entry{in6addr{\_}loopback}{375}{\code {in6addr_loopback}} +-\entry{in6addr{\_}any}{375}{\code {in6addr_any}} +-\entry{h{\_}errno}{378}{\code {h_errno}} +-\entry{HOST{\_}NOT{\_}FOUND}{379}{\code {HOST_NOT_FOUND}} +-\entry{TRY{\_}AGAIN}{379}{\code {TRY_AGAIN}} +-\entry{NO{\_}RECOVERY}{379}{\code {NO_RECOVERY}} +-\entry{NO{\_}ADDRESS}{379}{\code {NO_ADDRESS}} +-\entry{IPPORT{\_}RESERVED}{381}{\code {IPPORT_RESERVED}} +-\entry{IPPORT{\_}USERRESERVED}{381}{\code {IPPORT_USERRESERVED}} +-\entry{PF{\_}NS}{386}{\code {PF_NS}} +-\entry{PF{\_}ISO}{386}{\code {PF_ISO}} +-\entry{PF{\_}CCITT}{386}{\code {PF_CCITT}} +-\entry{PF{\_}IMPLINK}{386}{\code {PF_IMPLINK}} +-\entry{PF{\_}ROUTE}{386}{\code {PF_ROUTE}} +-\entry{MSG{\_}OOB}{394}{\code {MSG_OOB}} +-\entry{MSG{\_}PEEK}{394}{\code {MSG_PEEK}} +-\entry{MSG{\_}DONTROUTE}{394}{\code {MSG_DONTROUTE}} +-\entry{SOL{\_}SOCKET}{407}{\code {SOL_SOCKET}} +-\entry{NCCS}{414}{\code {NCCS}} +-\entry{TCSANOW}{414}{\code {TCSANOW}} +-\entry{TCSADRAIN}{414}{\code {TCSADRAIN}} +-\entry{TCSAFLUSH}{414}{\code {TCSAFLUSH}} +-\entry{TCSASOFT}{414}{\code {TCSASOFT}} +-\entry{INPCK}{416}{\code {INPCK}} +-\entry{IGNPAR}{416}{\code {IGNPAR}} +-\entry{PARMRK}{417}{\code {PARMRK}} +-\entry{ISTRIP}{417}{\code {ISTRIP}} +-\entry{IGNBRK}{417}{\code {IGNBRK}} +-\entry{BRKINT}{417}{\code {BRKINT}} +-\entry{IGNCR}{417}{\code {IGNCR}} +-\entry{ICRNL}{417}{\code {ICRNL}} +-\entry{INLCR}{417}{\code {INLCR}} +-\entry{IXOFF}{418}{\code {IXOFF}} +-\entry{IXON}{418}{\code {IXON}} +-\entry{IXANY}{418}{\code {IXANY}} +-\entry{IMAXBEL}{418}{\code {IMAXBEL}} +-\entry{OPOST}{418}{\code {OPOST}} +-\entry{ONLCR}{419}{\code {ONLCR}} +-\entry{OXTABS}{419}{\code {OXTABS}} +-\entry{ONOEOT}{419}{\code {ONOEOT}} +-\entry{CLOCAL}{419}{\code {CLOCAL}} +-\entry{HUPCL}{419}{\code {HUPCL}} +-\entry{CREAD}{419}{\code {CREAD}} +-\entry{CSTOPB}{419}{\code {CSTOPB}} +-\entry{PARENB}{420}{\code {PARENB}} +-\entry{PARODD}{420}{\code {PARODD}} +-\entry{CSIZE}{420}{\code {CSIZE}} +-\entry{CS5}{420}{\code {CS5}} +-\entry{CS6}{420}{\code {CS6}} +-\entry{CS7}{420}{\code {CS7}} +-\entry{CS8}{420}{\code {CS8}} +-\entry{CCTS{\_}OFLOW}{420}{\code {CCTS_OFLOW}} +-\entry{CRTS{\_}IFLOW}{420}{\code {CRTS_IFLOW}} +-\entry{MDMBUF}{420}{\code {MDMBUF}} +-\entry{CIGNORE}{420}{\code {CIGNORE}} +-\entry{ICANON}{421}{\code {ICANON}} +-\entry{ECHO}{421}{\code {ECHO}} +-\entry{ECHOE}{421}{\code {ECHOE}} +-\entry{ECHOPRT}{421}{\code {ECHOPRT}} +-\entry{ECHOK}{421}{\code {ECHOK}} +-\entry{ECHOKE}{422}{\code {ECHOKE}} +-\entry{ECHONL}{422}{\code {ECHONL}} +-\entry{ECHOCTL}{422}{\code {ECHOCTL}} +-\entry{ISIG}{422}{\code {ISIG}} +-\entry{IEXTEN}{422}{\code {IEXTEN}} +-\entry{NOFLSH}{422}{\code {NOFLSH}} +-\entry{TOSTOP}{422}{\code {TOSTOP}} +-\entry{ALTWERASE}{423}{\code {ALTWERASE}} +-\entry{FLUSHO}{423}{\code {FLUSHO}} +-\entry{NOKERNINFO}{423}{\code {NOKERNINFO}} +-\entry{PENDIN}{423}{\code {PENDIN}} +-\entry{B0}{424}{\code {B0}} +-\entry{B50}{424}{\code {B50}} +-\entry{B75}{424}{\code {B75}} +-\entry{B110}{424}{\code {B110}} +-\entry{B134}{424}{\code {B134}} +-\entry{B150}{424}{\code {B150}} +-\entry{B200}{424}{\code {B200}} +-\entry{B300}{424}{\code {B300}} +-\entry{B600}{424}{\code {B600}} +-\entry{B1200}{424}{\code {B1200}} +-\entry{B1800}{424}{\code {B1800}} +-\entry{B2400}{424}{\code {B2400}} +-\entry{B4800}{424}{\code {B4800}} +-\entry{B9600}{424}{\code {B9600}} +-\entry{B19200}{424}{\code {B19200}} +-\entry{B38400}{424}{\code {B38400}} +-\entry{B57600}{424}{\code {B57600}} +-\entry{B115200}{424}{\code {B115200}} +-\entry{B230400}{424}{\code {B230400}} +-\entry{B460800}{424}{\code {B460800}} +-\entry{EXTA}{424}{\code {EXTA}} +-\entry{EXTB}{424}{\code {EXTB}} +-\entry{{\_}POSIX{\_}VDISABLE}{425}{\code {_POSIX_VDISABLE}} +-\entry{VEOF}{425}{\code {VEOF}} +-\entry{VEOL}{425}{\code {VEOL}} +-\entry{VEOL2}{425}{\code {VEOL2}} +-\entry{VERASE}{426}{\code {VERASE}} +-\entry{VWERASE}{426}{\code {VWERASE}} +-\entry{VKILL}{426}{\code {VKILL}} +-\entry{VREPRINT}{426}{\code {VREPRINT}} +-\entry{VINTR}{427}{\code {VINTR}} +-\entry{VQUIT}{427}{\code {VQUIT}} +-\entry{VSUSP}{427}{\code {VSUSP}} +-\entry{VDSUSP}{427}{\code {VDSUSP}} +-\entry{VSTART}{428}{\code {VSTART}} +-\entry{VSTOP}{428}{\code {VSTOP}} +-\entry{VLNEXT}{428}{\code {VLNEXT}} +-\entry{VDISCARD}{428}{\code {VDISCARD}} +-\entry{VSTATUS}{429}{\code {VSTATUS}} +-\entry{VMIN}{429}{\code {VMIN}} +-\entry{VTIME}{429}{\code {VTIME}} +-\entry{TCIFLUSH}{431}{\code {TCIFLUSH}} +-\entry{TCOFLUSH}{431}{\code {TCOFLUSH}} +-\entry{TCIOFLUSH}{431}{\code {TCIOFLUSH}} +-\entry{TCOOFF}{432}{\code {TCOOFF}} +-\entry{TCOON}{432}{\code {TCOON}} +-\entry{TCIOFF}{432}{\code {TCIOFF}} +-\entry{TCION}{432}{\code {TCION}} +-\entry{EBADF}{432}{\code {EBADF}} +-\entry{ENOTTY}{432}{\code {ENOTTY}} +-\entry{EINVAL}{432}{\code {EINVAL}} +-\entry{M{\_}E}{439}{\code {M_E}} +-\entry{M{\_}LOG2E}{439}{\code {M_LOG2E}} +-\entry{M{\_}LOG10E}{439}{\code {M_LOG10E}} +-\entry{M{\_}LN2}{439}{\code {M_LN2}} +-\entry{M{\_}LN10}{439}{\code {M_LN10}} +-\entry{M{\_}PI}{439}{\code {M_PI}} +-\entry{M{\_}PI{\_}2}{439}{\code {M_PI_2}} +-\entry{M{\_}PI{\_}4}{439}{\code {M_PI_4}} +-\entry{M{\_}1{\_}PI}{439}{\code {M_1_PI}} +-\entry{M{\_}2{\_}PI}{439}{\code {M_2_PI}} +-\entry{M{\_}2{\_}SQRTPI}{439}{\code {M_2_SQRTPI}} +-\entry{M{\_}SQRT2}{439}{\code {M_SQRT2}} +-\entry{M{\_}SQRT1{\_}2}{439}{\code {M_SQRT1_2}} +-\entry{PI}{440}{\code {PI}} +-\entry{FP{\_}ILOGB0}{444}{\code {FP_ILOGB0}} +-\entry{FP{\_}ILOGBNAN}{444}{\code {FP_ILOGBNAN}} +-\entry{signgam}{449}{\code {signgam}} +-\entry{RAND{\_}MAX}{452}{\code {RAND_MAX}} +-\entry{FP{\_}NAN}{459}{\code {FP_NAN}} +-\entry{FP{\_}INFINITE}{459}{\code {FP_INFINITE}} +-\entry{FP{\_}ZERO}{459}{\code {FP_ZERO}} +-\entry{FP{\_}SUBNORMAL}{460}{\code {FP_SUBNORMAL}} +-\entry{FP{\_}NORMAL}{460}{\code {FP_NORMAL}} +-\entry{INFINITY}{463}{\code {INFINITY}} +-\entry{NAN}{463}{\code {NAN}} +-\entry{FE{\_}INEXACT}{464}{\code {FE_INEXACT}} +-\entry{FE{\_}DIVBYZERO}{464}{\code {FE_DIVBYZERO}} +-\entry{FE{\_}UNDERFLOW}{464}{\code {FE_UNDERFLOW}} +-\entry{FE{\_}OVERFLOW}{464}{\code {FE_OVERFLOW}} +-\entry{FE{\_}INVALID}{464}{\code {FE_INVALID}} +-\entry{HUGE{\_}VAL}{466}{\code {HUGE_VAL}} +-\entry{HUGE{\_}VALF}{466}{\code {HUGE_VALF}} +-\entry{HUGE{\_}VALL}{466}{\code {HUGE_VALL}} +-\entry{FE{\_}TONEAREST}{466}{\code {FE_TONEAREST}} +-\entry{FE{\_}UPWARD}{466}{\code {FE_UPWARD}} +-\entry{FE{\_}DOWNWARD}{466}{\code {FE_DOWNWARD}} +-\entry{FE{\_}TOWARDZERO}{466}{\code {FE_TOWARDZERO}} +-\entry{FE{\_}DFL{\_}ENV}{468}{\code {FE_DFL_ENV}} +-\entry{FE{\_}NOMASK{\_}ENV}{468}{\code {FE_NOMASK_ENV}} +-\entry{FP{\_}FAST{\_}FMA}{476}{\code {FP_FAST_FMA}} +-\entry{{\_}Complex{\_}I}{476}{\code {_Complex_I}} +-\entry{I}{477}{\code {I}} +-\entry{CLOCKS{\_}PER{\_}SEC}{488}{\code {CLOCKS_PER_SEC}} +-\entry{CLK{\_}TCK}{488}{\code {CLK_TCK}} +-\entry{getdate{\_}err}{505}{\code {getdate_err}} +-\entry{tzname}{509}{\code {tzname}} +-\entry{timezone}{509}{\code {timezone}} +-\entry{daylight}{510}{\code {daylight}} +-\entry{RLIMIT{\_}CPU}{520}{\code {RLIMIT_CPU}} +-\entry{RLIMIT{\_}FSIZE}{520}{\code {RLIMIT_FSIZE}} +-\entry{RLIMIT{\_}DATA}{520}{\code {RLIMIT_DATA}} +-\entry{RLIMIT{\_}STACK}{520}{\code {RLIMIT_STACK}} +-\entry{RLIMIT{\_}CORE}{520}{\code {RLIMIT_CORE}} +-\entry{RLIMIT{\_}RSS}{521}{\code {RLIMIT_RSS}} +-\entry{RLIMIT{\_}NOFILE}{521}{\code {RLIMIT_NOFILE}} +-\entry{RLIMIT{\_}OFILE}{521}{\code {RLIMIT_OFILE}} +-\entry{RLIM{\_}NLIMITS}{521}{\code {RLIM_NLIMITS}} +-\entry{RLIM{\_}INFINITY}{521}{\code {RLIM_INFINITY}} +-\entry{PRIO{\_}MIN}{521}{\code {PRIO_MIN}} +-\entry{PRIO{\_}MAX}{521}{\code {PRIO_MAX}} +-\entry{PRIO{\_}PROCESS}{522}{\code {PRIO_PROCESS}} +-\entry{PRIO{\_}PGRP}{522}{\code {PRIO_PGRP}} +-\entry{PRIO{\_}USER}{522}{\code {PRIO_USER}} +-\entry{NSIG}{529}{\code {NSIG}} +-\entry{COREFILE}{530}{\code {COREFILE}} +-\entry{SIGFPE}{530}{\code {SIGFPE}} +-\entry{FPE{\_}INTOVF{\_}TRAP}{530}{\code {FPE_INTOVF_TRAP}} +-\entry{FPE{\_}INTDIV{\_}TRAP}{530}{\code {FPE_INTDIV_TRAP}} +-\entry{FPE{\_}SUBRNG{\_}TRAP}{530}{\code {FPE_SUBRNG_TRAP}} +-\entry{FPE{\_}FLTOVF{\_}TRAP}{531}{\code {FPE_FLTOVF_TRAP}} +-\entry{FPE{\_}FLTDIV{\_}TRAP}{531}{\code {FPE_FLTDIV_TRAP}} +-\entry{FPE{\_}FLTUND{\_}TRAP}{531}{\code {FPE_FLTUND_TRAP}} +-\entry{FPE{\_}DECOVF{\_}TRAP}{531}{\code {FPE_DECOVF_TRAP}} +-\entry{SIGILL}{531}{\code {SIGILL}} +-\entry{SIGSEGV}{531}{\code {SIGSEGV}} +-\entry{SIGBUS}{531}{\code {SIGBUS}} +-\entry{SIGABRT}{532}{\code {SIGABRT}} +-\entry{SIGIOT}{532}{\code {SIGIOT}} +-\entry{SIGTRAP}{532}{\code {SIGTRAP}} +-\entry{SIGEMT}{532}{\code {SIGEMT}} +-\entry{SIGSYS}{532}{\code {SIGSYS}} +-\entry{SIGTERM}{532}{\code {SIGTERM}} +-\entry{SIGINT}{532}{\code {SIGINT}} +-\entry{SIGQUIT}{533}{\code {SIGQUIT}} +-\entry{SIGKILL}{533}{\code {SIGKILL}} +-\entry{SIGHUP}{533}{\code {SIGHUP}} +-\entry{SIGALRM}{533}{\code {SIGALRM}} +-\entry{SIGVTALRM}{534}{\code {SIGVTALRM}} +-\entry{SIGPROF}{534}{\code {SIGPROF}} +-\entry{SIGIO}{534}{\code {SIGIO}} +-\entry{SIGURG}{534}{\code {SIGURG}} +-\entry{SIGPOLL}{534}{\code {SIGPOLL}} +-\entry{SIGCHLD}{534}{\code {SIGCHLD}} +-\entry{SIGCLD}{535}{\code {SIGCLD}} +-\entry{SIGCONT}{535}{\code {SIGCONT}} +-\entry{SIGSTOP}{535}{\code {SIGSTOP}} +-\entry{SIGTSTP}{535}{\code {SIGTSTP}} +-\entry{SIGTTIN}{535}{\code {SIGTTIN}} +-\entry{SIGTTOU}{535}{\code {SIGTTOU}} +-\entry{SIGPIPE}{536}{\code {SIGPIPE}} +-\entry{SIGLOST}{536}{\code {SIGLOST}} +-\entry{SIGXCPU}{536}{\code {SIGXCPU}} +-\entry{SIGXFSZ}{537}{\code {SIGXFSZ}} +-\entry{SIGUSR1}{537}{\code {SIGUSR1}} +-\entry{SIGUSR2}{537}{\code {SIGUSR2}} +-\entry{SIGWINCH}{537}{\code {SIGWINCH}} +-\entry{SIGINFO}{537}{\code {SIGINFO}} +-\entry{sys{\_}siglist}{538}{\code {sys_siglist}} +-\entry{SIG{\_}DFL}{539}{\code {SIG_DFL}} +-\entry{SIG{\_}IGN}{539}{\code {SIG_IGN}} +-\entry{SIG{\_}ERR}{540}{\code {SIG_ERR}} +-\entry{SA{\_}NOCLDSTOP}{543}{\code {SA_NOCLDSTOP}} +-\entry{SA{\_}ONSTACK}{543}{\code {SA_ONSTACK}} +-\entry{SA{\_}RESTART}{544}{\code {SA_RESTART}} +-\entry{SIG{\_}BLOCK}{562}{\code {SIG_BLOCK}} +-\entry{SIG{\_}UNBLOCK}{562}{\code {SIG_UNBLOCK}} +-\entry{SIG{\_}SETMASK}{562}{\code {SIG_SETMASK}} +-\entry{SIGSTKSZ}{570}{\code {SIGSTKSZ}} +-\entry{MINSIGSTKSZ}{570}{\code {MINSIGSTKSZ}} +-\entry{SS{\_}DISABLE}{570}{\code {SS_DISABLE}} +-\entry{SS{\_}ONSTACK}{570}{\code {SS_ONSTACK}} +-\entry{SV{\_}ONSTACK}{572}{\code {SV_ONSTACK}} +-\entry{SV{\_}INTERRUPT}{572}{\code {SV_INTERRUPT}} +-\entry{SV{\_}RESETHAND}{572}{\code {SV_RESETHAND}} +-\entry{opterr}{577}{\code {opterr}} +-\entry{optopt}{577}{\code {optopt}} +-\entry{optind}{577}{\code {optind}} +-\entry{optarg}{577}{\code {optarg}} +-\entry{argp{\_}program{\_}version}{585}{\code {argp_program_version}} +-\entry{argp{\_}program{\_}bug{\_}address}{585}{\code {argp_program_bug_address}} +-\entry{argp{\_}program{\_}version{\_}hook}{585}{\code {argp_program_version_hook}} +-\entry{argp{\_}err{\_}exit{\_}status}{585}{\code {argp_err_exit_status}} +-\entry{OPTION{\_}ARG{\_}OPTIONAL}{587}{\code {OPTION_ARG_OPTIONAL}} +-\entry{OPTION{\_}HIDDEN}{587}{\code {OPTION_HIDDEN}} +-\entry{OPTION{\_}ALIAS}{587}{\code {OPTION_ALIAS}} +-\entry{OPTION{\_}DOC}{587}{\code {OPTION_DOC}} +-\entry{OPTION{\_}NO{\_}USAGE}{588}{\code {OPTION_NO_USAGE}} +-\entry{ARGP{\_}ERR{\_}UNKNOWN}{589}{\code {ARGP_ERR_UNKNOWN}} +-\entry{ARGP{\_}KEY{\_}ARG}{589}{\code {ARGP_KEY_ARG}} +-\entry{ARGP{\_}KEY{\_}ARGS}{589}{\code {ARGP_KEY_ARGS}} +-\entry{ARGP{\_}KEY{\_}END}{590}{\code {ARGP_KEY_END}} +-\entry{ARGP{\_}KEY{\_}NO{\_}ARGS}{590}{\code {ARGP_KEY_NO_ARGS}} +-\entry{ARGP{\_}KEY{\_}INIT}{590}{\code {ARGP_KEY_INIT}} +-\entry{ARGP{\_}KEY{\_}SUCCESS}{590}{\code {ARGP_KEY_SUCCESS}} +-\entry{ARGP{\_}KEY{\_}ERROR}{590}{\code {ARGP_KEY_ERROR}} +-\entry{ARGP{\_}KEY{\_}FINI}{590}{\code {ARGP_KEY_FINI}} +-\entry{ARGP{\_}PARSE{\_}ARGV0}{594}{\code {ARGP_PARSE_ARGV0}} +-\entry{ARGP{\_}NO{\_}ERRS}{594}{\code {ARGP_NO_ERRS}} +-\entry{ARGP{\_}NO{\_}ARGS}{595}{\code {ARGP_NO_ARGS}} +-\entry{ARGP{\_}IN{\_}ORDER}{595}{\code {ARGP_IN_ORDER}} +-\entry{ARGP{\_}NO{\_}HELP}{595}{\code {ARGP_NO_HELP}} +-\entry{ARGP{\_}NO{\_}EXIT}{595}{\code {ARGP_NO_EXIT}} +-\entry{ARGP{\_}LONG{\_}ONLY}{595}{\code {ARGP_LONG_ONLY}} +-\entry{ARGP{\_}SILENT}{595}{\code {ARGP_SILENT}} +-\entry{ARGP{\_}KEY{\_}HELP{\_}PRE{\_}DOC}{596}{\code {ARGP_KEY_HELP_PRE_DOC}} +-\entry{ARGP{\_}KEY{\_}HELP{\_}POST{\_}DOC}{596}{\code {ARGP_KEY_HELP_POST_DOC}} +-\entry{ARGP{\_}KEY{\_}HELP{\_}HEADER}{596}{\code {ARGP_KEY_HELP_HEADER}} +-\entry{ARGP{\_}KEY{\_}HELP{\_}EXTRA}{596}{\code {ARGP_KEY_HELP_EXTRA}} +-\entry{ARGP{\_}KEY{\_}HELP{\_}DUP{\_}ARGS{\_}NOTE}{596}{\code {ARGP_KEY_HELP_DUP_ARGS_NOTE}} +-\entry{ARGP{\_}KEY{\_}HELP{\_}ARGS{\_}DOC}{596}{\code {ARGP_KEY_HELP_ARGS_DOC}} +-\entry{ARGP{\_}HELP{\_}USAGE}{596}{\code {ARGP_HELP_USAGE}} +-\entry{ARGP{\_}HELP{\_}SHORT{\_}USAGE}{597}{\code {ARGP_HELP_SHORT_USAGE}} +-\entry{ARGP{\_}HELP{\_}SEE}{597}{\code {ARGP_HELP_SEE}} +-\entry{ARGP{\_}HELP{\_}LONG}{597}{\code {ARGP_HELP_LONG}} +-\entry{ARGP{\_}HELP{\_}PRE{\_}DOC}{597}{\code {ARGP_HELP_PRE_DOC}} +-\entry{ARGP{\_}HELP{\_}POST{\_}DOC}{597}{\code {ARGP_HELP_POST_DOC}} +-\entry{ARGP{\_}HELP{\_}DOC}{597}{\code {ARGP_HELP_DOC}} +-\entry{ARGP{\_}HELP{\_}BUG{\_}ADDR}{597}{\code {ARGP_HELP_BUG_ADDR}} +-\entry{ARGP{\_}HELP{\_}LONG{\_}ONLY}{597}{\code {ARGP_HELP_LONG_ONLY}} +-\entry{ARGP{\_}HELP{\_}EXIT{\_}ERR}{597}{\code {ARGP_HELP_EXIT_ERR}} +-\entry{ARGP{\_}HELP{\_}EXIT{\_}OK}{597}{\code {ARGP_HELP_EXIT_OK}} +-\entry{ARGP{\_}HELP{\_}STD{\_}ERR}{597}{\code {ARGP_HELP_STD_ERR}} +-\entry{ARGP{\_}HELP{\_}STD{\_}USAGE}{597}{\code {ARGP_HELP_STD_USAGE}} +-\entry{ARGP{\_}HELP{\_}STD{\_}HELP}{597}{\code {ARGP_HELP_STD_HELP}} +-\entry{environ}{611}{\code {environ}} +-\entry{EXIT{\_}SUCCESS}{614}{\code {EXIT_SUCCESS}} +-\entry{EXIT{\_}FAILURE}{615}{\code {EXIT_FAILURE}} +-\entry{L{\_}ctermid}{646}{\code {L_ctermid}} +-\entry{aliases}{651}{\code {aliases}} +-\entry{ethers}{651}{\code {ethers}} +-\entry{group}{651}{\code {group}} +-\entry{hosts}{651}{\code {hosts}} +-\entry{netgroup}{651}{\code {netgroup}} +-\entry{networks}{651}{\code {networks}} +-\entry{protocols}{651}{\code {protocols}} +-\entry{passwd}{651}{\code {passwd}} +-\entry{rpc}{651}{\code {rpc}} +-\entry{services}{651}{\code {services}} +-\entry{shadow}{652}{\code {shadow}} +-\entry{NSS{\_}STATUS{\_}TRYAGAIN}{656}{\code {NSS_STATUS_TRYAGAIN}} +-\entry{NSS{\_}STATUS{\_}UNAVAIL}{656}{\code {NSS_STATUS_UNAVAIL}} +-\entry{NSS{\_}STATUS{\_}NOTFOUND}{656}{\code {NSS_STATUS_NOTFOUND}} +-\entry{NSS{\_}STATUS{\_}SUCCESS}{656}{\code {NSS_STATUS_SUCCESS}} +-\entry{L{\_}cuserid}{671}{\code {L_cuserid}} +-\entry{EMPTY}{672}{\code {EMPTY}} +-\entry{RUN{\_}LVL}{672}{\code {RUN_LVL}} +-\entry{BOOT{\_}TIME}{672}{\code {BOOT_TIME}} +-\entry{OLD{\_}TIME}{672}{\code {OLD_TIME}} +-\entry{NEW{\_}TIME}{672}{\code {NEW_TIME}} +-\entry{INIT{\_}PROCESS}{672}{\code {INIT_PROCESS}} +-\entry{LOGIN{\_}PROCESS}{672}{\code {LOGIN_PROCESS}} +-\entry{USER{\_}PROCESS}{672}{\code {USER_PROCESS}} +-\entry{DEAD{\_}PROCESS}{673}{\code {DEAD_PROCESS}} +-\entry{ACCOUNTING}{673}{\code {ACCOUNTING}} +-\entry{{\_}PATH{\_}UTMP}{675}{\code {_PATH_UTMP}} +-\entry{{\_}PATH{\_}WTMP}{675}{\code {_PATH_WTMP}} +-\entry{EMPTY}{676}{\code {EMPTY}} +-\entry{RUN{\_}LVL}{676}{\code {RUN_LVL}} +-\entry{BOOT{\_}TIME}{676}{\code {BOOT_TIME}} +-\entry{OLD{\_}TIME}{677}{\code {OLD_TIME}} +-\entry{NEW{\_}TIME}{677}{\code {NEW_TIME}} +-\entry{INIT{\_}PROCESS}{677}{\code {INIT_PROCESS}} +-\entry{LOGIN{\_}PROCESS}{677}{\code {LOGIN_PROCESS}} +-\entry{USER{\_}PROCESS}{677}{\code {USER_PROCESS}} +-\entry{DEAD{\_}PROCESS}{677}{\code {DEAD_PROCESS}} +-\entry{{\_}PATH{\_}FSTAB}{691}{\code {_PATH_FSTAB}} +-\entry{{\_}PATH{\_}MNTTAB}{691}{\code {_PATH_MNTTAB}} +-\entry{FSTAB}{691}{\code {FSTAB}} +-\entry{{\_}PATH{\_}MOUNTED}{691}{\code {_PATH_MOUNTED}} +-\entry{FSTAB{\_}RW}{692}{\code {FSTAB_RW}} +-\entry{FSTAB{\_}RQ}{692}{\code {FSTAB_RQ}} +-\entry{FSTAB{\_}RO}{692}{\code {FSTAB_RO}} +-\entry{FSTAB{\_}SW}{692}{\code {FSTAB_SW}} +-\entry{FSTAB{\_}XX}{692}{\code {FSTAB_XX}} +-\entry{MNTTYPE{\_}IGNORE}{694}{\code {MNTTYPE_IGNORE}} +-\entry{MNTTYPE{\_}NFS}{694}{\code {MNTTYPE_NFS}} +-\entry{MNTTYPE{\_}SWAP}{694}{\code {MNTTYPE_SWAP}} +-\entry{MNTOPT{\_}DEFAULTS}{694}{\code {MNTOPT_DEFAULTS}} +-\entry{MNTOPT{\_}RO}{694}{\code {MNTOPT_RO}} +-\entry{MNTOPT{\_}RW}{694}{\code {MNTOPT_RW}} +-\entry{MNTOPT{\_}SUID}{694}{\code {MNTOPT_SUID}} +-\entry{MNTOPT{\_}NOSUID}{695}{\code {MNTOPT_NOSUID}} +-\entry{MNTOPT{\_}NOAUTO}{695}{\code {MNTOPT_NOAUTO}} +-\entry{ARG{\_}MAX}{697}{\code {ARG_MAX}} +-\entry{CHILD{\_}MAX}{697}{\code {CHILD_MAX}} +-\entry{OPEN{\_}MAX}{697}{\code {OPEN_MAX}} +-\entry{STREAM{\_}MAX}{697}{\code {STREAM_MAX}} +-\entry{TZNAME{\_}MAX}{697}{\code {TZNAME_MAX}} +-\entry{NGROUPS{\_}MAX}{698}{\code {NGROUPS_MAX}} +-\entry{SSIZE{\_}MAX}{698}{\code {SSIZE_MAX}} +-\entry{RE{\_}DUP{\_}MAX}{698}{\code {RE_DUP_MAX}} +-\entry{{\_}POSIX{\_}JOB{\_}CONTROL}{698}{\code {_POSIX_JOB_CONTROL}} +-\entry{{\_}POSIX{\_}SAVED{\_}IDS}{698}{\code {_POSIX_SAVED_IDS}} +-\entry{{\_}POSIX2{\_}C{\_}DEV}{699}{\code {_POSIX2_C_DEV}} +-\entry{{\_}POSIX2{\_}FORT{\_}DEV}{699}{\code {_POSIX2_FORT_DEV}} +-\entry{{\_}POSIX2{\_}FORT{\_}RUN}{699}{\code {_POSIX2_FORT_RUN}} +-\entry{{\_}POSIX2{\_}LOCALEDEF}{699}{\code {_POSIX2_LOCALEDEF}} +-\entry{{\_}POSIX2{\_}SW{\_}DEV}{699}{\code {_POSIX2_SW_DEV}} +-\entry{{\_}POSIX{\_}VERSION}{699}{\code {_POSIX_VERSION}} +-\entry{{\_}POSIX2{\_}C{\_}VERSION}{700}{\code {_POSIX2_C_VERSION}} +-\entry{LINK{\_}MAX}{709}{\code {LINK_MAX}} +-\entry{MAX{\_}CANON}{709}{\code {MAX_CANON}} +-\entry{MAX{\_}INPUT}{709}{\code {MAX_INPUT}} +-\entry{NAME{\_}MAX}{710}{\code {NAME_MAX}} +-\entry{PATH{\_}MAX}{710}{\code {PATH_MAX}} +-\entry{PIPE{\_}BUF}{710}{\code {PIPE_BUF}} +-\entry{MAXNAMLEN}{710}{\code {MAXNAMLEN}} +-\entry{FILENAME{\_}MAX}{710}{\code {FILENAME_MAX}} +-\entry{{\_}POSIX{\_}CHOWN{\_}RESTRICTED}{711}{\code {_POSIX_CHOWN_RESTRICTED}} +-\entry{{\_}POSIX{\_}NO{\_}TRUNC}{711}{\code {_POSIX_NO_TRUNC}} +-\entry{{\_}POSIX{\_}VDISABLE}{711}{\code {_POSIX_VDISABLE}} +-\entry{BC{\_}BASE{\_}MAX}{713}{\code {BC_BASE_MAX}} +-\entry{BC{\_}DIM{\_}MAX}{713}{\code {BC_DIM_MAX}} +-\entry{BC{\_}SCALE{\_}MAX}{713}{\code {BC_SCALE_MAX}} +-\entry{BC{\_}STRING{\_}MAX}{713}{\code {BC_STRING_MAX}} +-\entry{COLL{\_}WEIGHTS{\_}MAX}{714}{\code {COLL_WEIGHTS_MAX}} +-\entry{EXPR{\_}NEST{\_}MAX}{714}{\code {EXPR_NEST_MAX}} +-\entry{LINE{\_}MAX}{714}{\code {LINE_MAX}} +-\entry{EQUIV{\_}CLASS{\_}MAX}{714}{\code {EQUIV_CLASS_MAX}} +-\entry{SEM{\_}VALUE{\_}MAX}{735}{\code {SEM_VALUE_MAX}} +-\entry{NDEBUG}{743}{\code {NDEBUG}} +-\entry{NULL}{750}{\code {NULL}} +-\entry{SCHAR{\_}MIN}{752}{\code {SCHAR_MIN}} +-\entry{SCHAR{\_}MAX}{752}{\code {SCHAR_MAX}} +-\entry{UCHAR{\_}MAX}{752}{\code {UCHAR_MAX}} +-\entry{CHAR{\_}MIN}{752}{\code {CHAR_MIN}} +-\entry{CHAR{\_}MAX}{753}{\code {CHAR_MAX}} +-\entry{SHRT{\_}MIN}{753}{\code {SHRT_MIN}} +-\entry{SHRT{\_}MAX}{753}{\code {SHRT_MAX}} +-\entry{USHRT{\_}MAX}{753}{\code {USHRT_MAX}} +-\entry{INT{\_}MIN}{753}{\code {INT_MIN}} +-\entry{INT{\_}MAX}{753}{\code {INT_MAX}} +-\entry{UINT{\_}MAX}{753}{\code {UINT_MAX}} +-\entry{LONG{\_}MIN}{753}{\code {LONG_MIN}} +-\entry{LONG{\_}MAX}{753}{\code {LONG_MAX}} +-\entry{ULONG{\_}MAX}{753}{\code {ULONG_MAX}} +-\entry{LONG{\_}LONG{\_}MIN}{753}{\code {LONG_LONG_MIN}} +-\entry{LONG{\_}LONG{\_}MAX}{753}{\code {LONG_LONG_MAX}} +-\entry{ULONG{\_}LONG{\_}MAX}{753}{\code {ULONG_LONG_MAX}} +-\entry{WCHAR{\_}MAX}{753}{\code {WCHAR_MAX}} +-\entry{FLT{\_}ROUNDS}{755}{\code {FLT_ROUNDS}} +-\entry{FLT{\_}RADIX}{756}{\code {FLT_RADIX}} +-\entry{FLT{\_}MANT{\_}DIG}{756}{\code {FLT_MANT_DIG}} +-\entry{DBL{\_}MANT{\_}DIG}{756}{\code {DBL_MANT_DIG}} +-\entry{LDBL{\_}MANT{\_}DIG}{756}{\code {LDBL_MANT_DIG}} +-\entry{FLT{\_}DIG}{756}{\code {FLT_DIG}} +-\entry{DBL{\_}DIG}{756}{\code {DBL_DIG}} +-\entry{LDBL{\_}DIG}{756}{\code {LDBL_DIG}} +-\entry{FLT{\_}MIN{\_}EXP}{756}{\code {FLT_MIN_EXP}} +-\entry{DBL{\_}MIN{\_}EXP}{757}{\code {DBL_MIN_EXP}} +-\entry{LDBL{\_}MIN{\_}EXP}{757}{\code {LDBL_MIN_EXP}} +-\entry{FLT{\_}MIN{\_}10{\_}EXP}{757}{\code {FLT_MIN_10_EXP}} +-\entry{DBL{\_}MIN{\_}10{\_}EXP}{757}{\code {DBL_MIN_10_EXP}} +-\entry{LDBL{\_}MIN{\_}10{\_}EXP}{757}{\code {LDBL_MIN_10_EXP}} +-\entry{FLT{\_}MAX{\_}EXP}{757}{\code {FLT_MAX_EXP}} +-\entry{DBL{\_}MAX{\_}EXP}{757}{\code {DBL_MAX_EXP}} +-\entry{LDBL{\_}MAX{\_}EXP}{757}{\code {LDBL_MAX_EXP}} +-\entry{FLT{\_}MAX{\_}10{\_}EXP}{757}{\code {FLT_MAX_10_EXP}} +-\entry{DBL{\_}MAX{\_}10{\_}EXP}{757}{\code {DBL_MAX_10_EXP}} +-\entry{LDBL{\_}MAX{\_}10{\_}EXP}{757}{\code {LDBL_MAX_10_EXP}} +-\entry{FLT{\_}MAX}{757}{\code {FLT_MAX}} +-\entry{DBL{\_}MAX}{757}{\code {DBL_MAX}} +-\entry{LDBL{\_}MAX}{757}{\code {LDBL_MAX}} +-\entry{FLT{\_}MIN}{757}{\code {FLT_MIN}} +-\entry{DBL{\_}MIN}{758}{\code {DBL_MIN}} +-\entry{LDBL{\_}MIN}{758}{\code {LDBL_MIN}} +-\entry{FLT{\_}EPSILON}{758}{\code {FLT_EPSILON}} +-\entry{DBL{\_}EPSILON}{758}{\code {DBL_EPSILON}} +-\entry{LDBL{\_}EPSILON}{758}{\code {LDBL_EPSILON}} +diff -Naur ../glibc-2.1.3/manual/libc.vrs glibc-2.1.3/manual/libc.vrs +--- ../glibc-2.1.3/manual/libc.vrs 2000-01-05 19:19:03.000000000 -0800 ++++ glibc-2.1.3/manual/libc.vrs 1969-12-31 16:00:00.000000000 -0800 +@@ -1,869 +0,0 @@ +-\initial {(} +-\entry {\code {(*gconv_end_fct)}}{135} +-\entry {\code {(*gconv_fct)}}{135} +-\entry {\code {(*gconv_init_fct)}}{132} +-\initial {{\_}} +-\entry {\code {__free_hook}}{39} +-\entry {\code {__malloc_hook}}{39} +-\entry {\code {__memalign_hook}}{39} +-\entry {\code {__realloc_hook}}{39} +-\entry {\code {_BSD_SOURCE}}{8} +-\entry {\code {_Complex_I}}{476} +-\entry {\code {_FILE_OFFSET_BITS}}{9} +-\entry {\code {_GNU_SOURCE}}{10} +-\entry {\code {_IOFBF}}{258} +-\entry {\code {_IOLBF}}{258} +-\entry {\code {_IONBF}}{258} +-\entry {\code {_LARGEFILE_SOURCE}}{9} +-\entry {\code {_LARGEFILE64_SOURCE}}{9} +-\entry {\code {_PATH_FSTAB}}{691} +-\entry {\code {_PATH_MNTTAB}}{691} +-\entry {\code {_PATH_MOUNTED}}{691} +-\entry {\code {_PATH_UTMP}}{675} +-\entry {\code {_PATH_WTMP}}{675} +-\entry {\code {_POSIX_C_SOURCE}}{8} +-\entry {\code {_POSIX_CHOWN_RESTRICTED}}{711} +-\entry {\code {_POSIX_JOB_CONTROL}}{698} +-\entry {\code {_POSIX_NO_TRUNC}}{711} +-\entry {\code {_POSIX_SAVED_IDS}}{698} +-\entry {\code {_POSIX_SOURCE}}{7} +-\entry {\code {_POSIX_VDISABLE}}{425, 711} +-\entry {\code {_POSIX_VERSION}}{699} +-\entry {\code {_POSIX2_C_DEV}}{699} +-\entry {\code {_POSIX2_C_VERSION}}{700} +-\entry {\code {_POSIX2_FORT_DEV}}{699} +-\entry {\code {_POSIX2_FORT_RUN}}{699} +-\entry {\code {_POSIX2_LOCALEDEF}}{699} +-\entry {\code {_POSIX2_SW_DEV}}{699} +-\entry {\code {_REENTRANT}}{10} +-\entry {\code {_SVID_SOURCE}}{8} +-\entry {\code {_THREAD_SAFE}}{10} +-\entry {\code {_XOPEN_SOURCE}}{8} +-\entry {\code {_XOPEN_SOURCE_EXTENDED}}{8} +-\initial {A} +-\entry {\code {ABDAY_1}}{150} +-\entry {\code {ABDAY_2}}{150} +-\entry {\code {ABDAY_3}}{150} +-\entry {\code {ABDAY_4}}{150} +-\entry {\code {ABDAY_5}}{150} +-\entry {\code {ABDAY_6}}{150} +-\entry {\code {ABDAY_7}}{150} +-\entry {\code {ABMON_1}}{150} +-\entry {\code {ABMON_10}}{150} +-\entry {\code {ABMON_11}}{150} +-\entry {\code {ABMON_12}}{150} +-\entry {\code {ABMON_2}}{150} +-\entry {\code {ABMON_3}}{150} +-\entry {\code {ABMON_4}}{150} +-\entry {\code {ABMON_5}}{150} +-\entry {\code {ABMON_6}}{150} +-\entry {\code {ABMON_7}}{150} +-\entry {\code {ABMON_8}}{150} +-\entry {\code {ABMON_9}}{150} +-\entry {\code {ACCOUNTING}}{673} +-\entry {\code {AF_FILE}}{366} +-\entry {\code {AF_INET}}{366} +-\entry {\code {AF_INET6}}{371} +-\entry {\code {AF_LOCAL}}{366} +-\entry {\code {AF_UNIX}}{366} +-\entry {\code {AF_UNSPEC}}{366} +-\entry {\code {aliases}}{651} +-\entry {\code {ALT_DIGITS}}{152} +-\entry {\code {ALTWERASE}}{423} +-\entry {\code {AM_STR}}{151} +-\entry {\code {ARG_MAX}}{697} +-\entry {\code {argp_err_exit_status}}{585} +-\entry {\code {ARGP_ERR_UNKNOWN}}{589} +-\entry {\code {ARGP_HELP_BUG_ADDR}}{597} +-\entry {\code {ARGP_HELP_DOC}}{597} +-\entry {\code {ARGP_HELP_EXIT_ERR}}{597} +-\entry {\code {ARGP_HELP_EXIT_OK}}{597} +-\entry {\code {ARGP_HELP_LONG}}{597} +-\entry {\code {ARGP_HELP_LONG_ONLY}}{597} +-\entry {\code {ARGP_HELP_POST_DOC}}{597} +-\entry {\code {ARGP_HELP_PRE_DOC}}{597} +-\entry {\code {ARGP_HELP_SEE}}{597} +-\entry {\code {ARGP_HELP_SHORT_USAGE}}{597} +-\entry {\code {ARGP_HELP_STD_ERR}}{597} +-\entry {\code {ARGP_HELP_STD_HELP}}{597} +-\entry {\code {ARGP_HELP_STD_USAGE}}{597} +-\entry {\code {ARGP_HELP_USAGE}}{596} +-\entry {\code {ARGP_IN_ORDER}}{595} +-\entry {\code {ARGP_KEY_ARG}}{589} +-\entry {\code {ARGP_KEY_ARGS}}{589} +-\entry {\code {ARGP_KEY_END}}{590} +-\entry {\code {ARGP_KEY_ERROR}}{590} +-\entry {\code {ARGP_KEY_FINI}}{590} +-\entry {\code {ARGP_KEY_HELP_ARGS_DOC}}{596} +-\entry {\code {ARGP_KEY_HELP_DUP_ARGS_NOTE}}{596} +-\entry {\code {ARGP_KEY_HELP_EXTRA}}{596} +-\entry {\code {ARGP_KEY_HELP_HEADER}}{596} +-\entry {\code {ARGP_KEY_HELP_POST_DOC}}{596} +-\entry {\code {ARGP_KEY_HELP_PRE_DOC}}{596} +-\entry {\code {ARGP_KEY_INIT}}{590} +-\entry {\code {ARGP_KEY_NO_ARGS}}{590} +-\entry {\code {ARGP_KEY_SUCCESS}}{590} +-\entry {\code {ARGP_LONG_ONLY}}{595} +-\entry {\code {ARGP_NO_ARGS}}{595} +-\entry {\code {ARGP_NO_ERRS}}{594} +-\entry {\code {ARGP_NO_EXIT}}{595} +-\entry {\code {ARGP_NO_HELP}}{595} +-\entry {\code {ARGP_PARSE_ARGV0}}{594} +-\entry {\code {argp_program_bug_address}}{585} +-\entry {\code {argp_program_version}}{585} +-\entry {\code {argp_program_version_hook}}{585} +-\entry {\code {ARGP_SILENT}}{595} +-\initial {B} +-\entry {\code {B0}}{424} +-\entry {\code {B110}}{424} +-\entry {\code {B115200}}{424} +-\entry {\code {B1200}}{424} +-\entry {\code {B134}}{424} +-\entry {\code {B150}}{424} +-\entry {\code {B1800}}{424} +-\entry {\code {B19200}}{424} +-\entry {\code {B200}}{424} +-\entry {\code {B230400}}{424} +-\entry {\code {B2400}}{424} +-\entry {\code {B300}}{424} +-\entry {\code {B38400}}{424} +-\entry {\code {B460800}}{424} +-\entry {\code {B4800}}{424} +-\entry {\code {B50}}{424} +-\entry {\code {B57600}}{424} +-\entry {\code {B600}}{424} +-\entry {\code {B75}}{424} +-\entry {\code {B9600}}{424} +-\entry {\code {BC_BASE_MAX}}{713} +-\entry {\code {BC_DIM_MAX}}{713} +-\entry {\code {BC_SCALE_MAX}}{713} +-\entry {\code {BC_STRING_MAX}}{713} +-\entry {\code {BOOT_TIME}}{672, 676} +-\entry {\code {BRKINT}}{417} +-\entry {\code {BUFSIZ}}{258} +-\initial {C} +-\entry {\code {CCTS_OFLOW}}{420} +-\entry {\code {CHAR_MAX}}{753} +-\entry {\code {CHAR_MIN}}{752} +-\entry {\code {CHILD_MAX}}{697} +-\entry {\code {CIGNORE}}{420} +-\entry {\code {CLK_TCK}}{488} +-\entry {\code {CLOCAL}}{419} +-\entry {\code {CLOCKS_PER_SEC}}{488} +-\entry {\code {COLL_WEIGHTS_MAX}}{714} +-\entry {\code {COREFILE}}{530} +-\entry {\code {CREAD}}{419} +-\entry {\code {CRNCYSTR}}{152} +-\entry {\code {CRTS_IFLOW}}{420} +-\entry {\code {CS5}}{420} +-\entry {\code {CS6}}{420} +-\entry {\code {CS7}}{420} +-\entry {\code {CS8}}{420} +-\entry {\code {CSIZE}}{420} +-\entry {\code {CSTOPB}}{419} +-\entry {\code {CURRENCY_SYMBOL}}{152} +-\initial {D} +-\entry {\code {D_FMT}}{151} +-\entry {\code {D_T_FMT}}{151} +-\entry {\code {DAY_1}}{150} +-\entry {\code {DAY_2}}{150} +-\entry {\code {DAY_3}}{150} +-\entry {\code {DAY_4}}{150} +-\entry {\code {DAY_5}}{150} +-\entry {\code {DAY_6}}{150} +-\entry {\code {DAY_7}}{150} +-\entry {\code {daylight}}{510} +-\entry {\code {DBL_DIG}}{756} +-\entry {\code {DBL_EPSILON}}{758} +-\entry {\code {DBL_MANT_DIG}}{756} +-\entry {\code {DBL_MAX}}{757} +-\entry {\code {DBL_MAX_10_EXP}}{757} +-\entry {\code {DBL_MAX_EXP}}{757} +-\entry {\code {DBL_MIN}}{758} +-\entry {\code {DBL_MIN_10_EXP}}{757} +-\entry {\code {DBL_MIN_EXP}}{757} +-\entry {\code {DEAD_PROCESS}}{673, 677} +-\entry {\code {DECIMAL_POINT}}{153} +-\initial {E} +-\entry {\code {E2BIG}}{17} +-\entry {\code {EACCES}}{17} +-\entry {\code {EADDRINUSE}}{21} +-\entry {\code {EADDRNOTAVAIL}}{21} +-\entry {\code {EADV}}{26} +-\entry {\code {EAFNOSUPPORT}}{21} +-\entry {\code {EAGAIN}}{19} +-\entry {\code {EALREADY}}{20} +-\entry {\code {EAUTH}}{24} +-\entry {\code {EBACKGROUND}}{24} +-\entry {\code {EBADE}}{25} +-\entry {\code {EBADF}}{17, 432} +-\entry {\code {EBADFD}}{26} +-\entry {\code {EBADMSG}}{25} +-\entry {\code {EBADR}}{25} +-\entry {\code {EBADRPC}}{23} +-\entry {\code {EBADRQC}}{26} +-\entry {\code {EBADSLT}}{26} +-\entry {\code {EBFONT}}{26} +-\entry {\code {EBUSY}}{17} +-\entry {\code {ECHILD}}{17} +-\entry {\code {ECHO}}{421} +-\entry {\code {ECHOCTL}}{422} +-\entry {\code {ECHOE}}{421} +-\entry {\code {ECHOK}}{421} +-\entry {\code {ECHOKE}}{422} +-\entry {\code {ECHONL}}{422} +-\entry {\code {ECHOPRT}}{421} +-\entry {\code {ECHRNG}}{25} +-\entry {\code {ECOMM}}{26} +-\entry {\code {ECONNABORTED}}{21} +-\entry {\code {ECONNREFUSED}}{22} +-\entry {\code {ECONNRESET}}{21} +-\entry {\code {ED}}{24} +-\entry {\code {EDEADLK}}{17} +-\entry {\code {EDEADLOCK}}{26} +-\entry {\code {EDESTADDRREQ}}{22} +-\entry {\code {EDIED}}{24} +-\entry {\code {EDOM}}{19} +-\entry {\code {EDOTDOT}}{26} +-\entry {\code {EDQUOT}}{23} +-\entry {\code {EEXIST}}{18} +-\entry {\code {EFAULT}}{17} +-\entry {\code {EFBIG}}{19} +-\entry {\code {EFTYPE}}{23} +-\entry {\code {EGRATUITOUS}}{25} +-\entry {\code {EGREGIOUS}}{24} +-\entry {\code {EHOSTDOWN}}{22} +-\entry {\code {EHOSTUNREACH}}{22} +-\entry {\code {EIDRM}}{25} +-\entry {\code {EIEIO}}{24} +-\entry {\code {EILSEQ}}{24} +-\entry {\code {EINPROGRESS}}{20} +-\entry {\code {EINTR}}{16} +-\entry {\code {EINVAL}}{18, 432} +-\entry {\code {EIO}}{16} +-\entry {\code {EISCONN}}{21} +-\entry {\code {EISDIR}}{18} +-\entry {\code {EISNAM}}{26} +-\entry {\code {EL2HLT}}{25} +-\entry {\code {EL2NSYNC}}{25} +-\entry {\code {EL3HLT}}{25} +-\entry {\code {EL3RST}}{25} +-\entry {\code {ELIBACC}}{26} +-\entry {\code {ELIBBAD}}{26} +-\entry {\code {ELIBEXEC}}{26} +-\entry {\code {ELIBMAX}}{26} +-\entry {\code {ELIBSCN}}{26} +-\entry {\code {ELNRNG}}{25} +-\entry {\code {ELOOP}}{22} +-\entry {\code {EMEDIUMTYPE}}{26} +-\entry {\code {EMFILE}}{18} +-\entry {\code {EMLINK}}{19} +-\entry {\code {EMPTY}}{672, 676} +-\entry {\code {EMSGSIZE}}{20} +-\entry {\code {EMULTIHOP}}{25} +-\entry {\code {ENAMETOOLONG}}{22} +-\entry {\code {ENAVAIL}}{26} +-\entry {\code {ENEEDAUTH}}{24} +-\entry {\code {ENETDOWN}}{21} +-\entry {\code {ENETRESET}}{21} +-\entry {\code {ENETUNREACH}}{21} +-\entry {\code {ENFILE}}{18} +-\entry {\code {ENOANO}}{26} +-\entry {\code {ENOBUFS}}{21} +-\entry {\code {ENOCSI}}{25} +-\entry {\code {ENODATA}}{25} +-\entry {\code {ENODEV}}{18} +-\entry {\code {ENOENT}}{16} +-\entry {\code {ENOEXEC}}{17} +-\entry {\code {ENOLCK}}{23} +-\entry {\code {ENOLINK}}{25} +-\entry {\code {ENOMEDIUM}}{26} +-\entry {\code {ENOMEM}}{17} +-\entry {\code {ENOMSG}}{25} +-\entry {\code {ENONET}}{26} +-\entry {\code {ENOPKG}}{26} +-\entry {\code {ENOPROTOOPT}}{20} +-\entry {\code {ENOSPC}}{19} +-\entry {\code {ENOSR}}{25} +-\entry {\code {ENOSTR}}{25} +-\entry {\code {ENOSYS}}{24} +-\entry {\code {ENOTBLK}}{17} +-\entry {\code {ENOTCONN}}{22} +-\entry {\code {ENOTDIR}}{18} +-\entry {\code {ENOTEMPTY}}{22} +-\entry {\code {ENOTNAM}}{26} +-\entry {\code {ENOTSOCK}}{20} +-\entry {\code {ENOTSUP}}{24} +-\entry {\code {ENOTTY}}{18, 432} +-\entry {\code {ENOTUNIQ}}{26} +-\entry {\code {environ}}{611} +-\entry {\code {ENXIO}}{17} +-\entry {\code {EOF}}{250} +-\entry {\code {EOPNOTSUPP}}{21} +-\entry {\code {EOVERFLOW}}{25} +-\entry {\code {EPERM}}{16} +-\entry {\code {EPFNOSUPPORT}}{21} +-\entry {\code {EPIPE}}{19} +-\entry {\code {EPROCLIM}}{23} +-\entry {\code {EPROCUNAVAIL}}{23} +-\entry {\code {EPROGMISMATCH}}{23} +-\entry {\code {EPROGUNAVAIL}}{23} +-\entry {\code {EPROTO}}{25} +-\entry {\code {EPROTONOSUPPORT}}{20} +-\entry {\code {EPROTOTYPE}}{20} +-\entry {\code {EQUIV_CLASS_MAX}}{714} +-\entry {\code {ERA}}{151} +-\entry {\code {ERA_D_FMT}}{152} +-\entry {\code {ERA_D_T_FMT}}{152} +-\entry {\code {ERA_T_FMT}}{152} +-\entry {\code {ERA_YEAR}}{151} +-\entry {\code {ERANGE}}{19} +-\entry {\code {EREMCHG}}{26} +-\entry {\code {EREMOTE}}{23} +-\entry {\code {EREMOTEIO}}{26} +-\entry {\code {ERESTART}}{25} +-\entry {\code {EROFS}}{19} +-\entry {\code {ERPCMISMATCH}}{23} +-\entry {\code {errno}}{15} +-\entry {\code {ESHUTDOWN}}{22} +-\entry {\code {ESOCKTNOSUPPORT}}{20} +-\entry {\code {ESPIPE}}{19} +-\entry {\code {ESRCH}}{16} +-\entry {\code {ESRMNT}}{26} +-\entry {\code {ESTALE}}{23} +-\entry {\code {ESTRPIPE}}{26} +-\entry {\code {ethers}}{651} +-\entry {\code {ETIME}}{25} +-\entry {\code {ETIMEDOUT}}{22} +-\entry {\code {ETOOMANYREFS}}{22} +-\entry {\code {ETXTBSY}}{18} +-\entry {\code {EUCLEAN}}{26} +-\entry {\code {EUNATCH}}{25} +-\entry {\code {EUSERS}}{23} +-\entry {\code {EWOULDBLOCK}}{20} +-\entry {\code {EXDEV}}{18} +-\entry {\code {EXFULL}}{26} +-\entry {\code {EXIT_FAILURE}}{615} +-\entry {\code {EXIT_SUCCESS}}{614} +-\entry {\code {EXPR_NEST_MAX}}{714} +-\entry {\code {EXTA}}{424} +-\entry {\code {EXTB}}{424} +-\initial {F} +-\entry {\code {F_DUPFD}}{306} +-\entry {\code {F_GETFD}}{307} +-\entry {\code {F_GETFL}}{313} +-\entry {\code {F_GETLK}}{315} +-\entry {\code {F_GETOWN}}{317} +-\entry {\code {F_OK}}{349} +-\entry {\code {F_RDLCK}}{316} +-\entry {\code {F_SETFD}}{308} +-\entry {\code {F_SETFL}}{313} +-\entry {\code {F_SETLK}}{315} +-\entry {\code {F_SETLKW}}{316} +-\entry {\code {F_SETOWN}}{317} +-\entry {\code {F_UNLCK}}{317} +-\entry {\code {F_WRLCK}}{317} +-\entry {\code {FD_CLOEXEC}}{308} +-\entry {\code {FD_SETSIZE}}{289} +-\entry {\code {FE_DFL_ENV}}{468} +-\entry {\code {FE_DIVBYZERO}}{464} +-\entry {\code {FE_DOWNWARD}}{466} +-\entry {\code {FE_INEXACT}}{464} +-\entry {\code {FE_INVALID}}{464} +-\entry {\code {FE_NOMASK_ENV}}{468} +-\entry {\code {FE_OVERFLOW}}{464} +-\entry {\code {FE_TONEAREST}}{466} +-\entry {\code {FE_TOWARDZERO}}{466} +-\entry {\code {FE_UNDERFLOW}}{464} +-\entry {\code {FE_UPWARD}}{466} +-\entry {\code {FILENAME_MAX}}{710} +-\entry {\code {FLT_DIG}}{756} +-\entry {\code {FLT_EPSILON}}{758} +-\entry {\code {FLT_MANT_DIG}}{756} +-\entry {\code {FLT_MAX}}{757} +-\entry {\code {FLT_MAX_10_EXP}}{757} +-\entry {\code {FLT_MAX_EXP}}{757} +-\entry {\code {FLT_MIN}}{757} +-\entry {\code {FLT_MIN_10_EXP}}{757} +-\entry {\code {FLT_MIN_EXP}}{756} +-\entry {\code {FLT_RADIX}}{756} +-\entry {\code {FLT_ROUNDS}}{755} +-\entry {\code {FLUSHO}}{423} +-\entry {\code {FOPEN_MAX}}{213} +-\entry {\code {FP_FAST_FMA}}{476} +-\entry {\code {FP_ILOGB0}}{444} +-\entry {\code {FP_ILOGBNAN}}{444} +-\entry {\code {FP_INFINITE}}{459} +-\entry {\code {FP_NAN}}{459} +-\entry {\code {FP_NORMAL}}{460} +-\entry {\code {FP_SUBNORMAL}}{460} +-\entry {\code {FP_ZERO}}{459} +-\entry {\code {FPE_DECOVF_TRAP}}{531} +-\entry {\code {FPE_FLTDIV_TRAP}}{531} +-\entry {\code {FPE_FLTOVF_TRAP}}{531} +-\entry {\code {FPE_FLTUND_TRAP}}{531} +-\entry {\code {FPE_INTDIV_TRAP}}{530} +-\entry {\code {FPE_INTOVF_TRAP}}{530} +-\entry {\code {FPE_SUBRNG_TRAP}}{530} +-\entry {\code {FRAC_DIGITS}}{153} +-\entry {\code {FSTAB}}{691} +-\entry {\code {FSTAB_RO}}{692} +-\entry {\code {FSTAB_RQ}}{692} +-\entry {\code {FSTAB_RW}}{692} +-\entry {\code {FSTAB_SW}}{692} +-\entry {\code {FSTAB_XX}}{692} +-\entry {\code {FTW_CHDIR}}{330} +-\entry {\code {FTW_D}}{327} +-\entry {\code {FTW_DEPTH}}{330} +-\entry {\code {FTW_DNR}}{327} +-\entry {\code {FTW_DP}}{328} +-\entry {\code {FTW_F}}{327} +-\entry {\code {FTW_MOUNT}}{330} +-\entry {\code {FTW_NS}}{327} +-\entry {\code {FTW_PHYS}}{330} +-\entry {\code {FTW_SL}}{327} +-\entry {\code {FTW_SLN}}{328} +-\initial {G} +-\entry {\code {getdate_err}}{505} +-\entry {\code {group}}{651} +-\entry {\code {GROUPING}}{153} +-\initial {H} +-\entry {\code {h_errno}}{378} +-\entry {\code {HOST_NOT_FOUND}}{379} +-\entry {\code {hosts}}{651} +-\entry {\code {HUGE_VAL}}{466} +-\entry {\code {HUGE_VALF}}{466} +-\entry {\code {HUGE_VALL}}{466} +-\entry {\code {HUPCL}}{419} +-\initial {I} +-\entry {\code {I}}{477} +-\entry {\code {ICANON}}{421} +-\entry {\code {ICRNL}}{417} +-\entry {\code {IEXTEN}}{422} +-\entry {\code {IFNAMSIZ}}{368} +-\entry {\code {IGNBRK}}{417} +-\entry {\code {IGNCR}}{417} +-\entry {\code {IGNPAR}}{416} +-\entry {\code {IMAXBEL}}{418} +-\entry {\code {in6addr_any}}{375} +-\entry {\code {in6addr_loopback}}{375} +-\entry {\code {INADDR_ANY}}{375} +-\entry {\code {INADDR_BROADCAST}}{375} +-\entry {\code {INADDR_LOOPBACK}}{375} +-\entry {\code {INADDR_NONE}}{375} +-\entry {\code {INFINITY}}{463} +-\entry {\code {INIT_PROCESS}}{672, 677} +-\entry {\code {INLCR}}{417} +-\entry {\code {INPCK}}{416} +-\entry {\code {INT_CURR_SYMBOL}}{152} +-\entry {\code {INT_FRAC_DIGITS}}{152} +-\entry {\code {INT_MAX}}{753} +-\entry {\code {INT_MIN}}{753} +-\entry {\code {IPPORT_RESERVED}}{381} +-\entry {\code {IPPORT_USERRESERVED}}{381} +-\entry {\code {ISIG}}{422} +-\entry {\code {ISTRIP}}{417} +-\entry {\code {IXANY}}{418} +-\entry {\code {IXOFF}}{418} +-\entry {\code {IXON}}{418} +-\initial {L} +-\entry {\code {L_ctermid}}{646} +-\entry {\code {L_cuserid}}{671} +-\entry {\code {L_INCR}}{254} +-\entry {\code {L_SET}}{254} +-\entry {\code {L_tmpnam}}{354} +-\entry {\code {L_XTND}}{254} +-\entry {\code {LANG}}{143} +-\entry {\code {LANGUAGE}}{143} +-\entry {\code {LC_ALL}}{143} +-\entry {\code {LC_COLLATE}}{142} +-\entry {\code {LC_CTYPE}}{142} +-\entry {\code {LC_MESSAGES}}{142} +-\entry {\code {LC_MONETARY}}{142} +-\entry {\code {LC_NUMERIC}}{142} +-\entry {\code {LC_TIME}}{142} +-\entry {\code {LDBL_DIG}}{756} +-\entry {\code {LDBL_EPSILON}}{758} +-\entry {\code {LDBL_MANT_DIG}}{756} +-\entry {\code {LDBL_MAX}}{757} +-\entry {\code {LDBL_MAX_10_EXP}}{757} +-\entry {\code {LDBL_MAX_EXP}}{757} +-\entry {\code {LDBL_MIN}}{758} +-\entry {\code {LDBL_MIN_10_EXP}}{757} +-\entry {\code {LDBL_MIN_EXP}}{757} +-\entry {\code {LINE_MAX}}{714} +-\entry {\code {LINK_MAX}}{709} +-\entry {\code {LIO_NOP}}{294} +-\entry {\code {LIO_READ}}{294} +-\entry {\code {LIO_WRITE}}{294} +-\entry {\code {LOGIN_PROCESS}}{672, 677} +-\entry {\code {LONG_LONG_MAX}}{753} +-\entry {\code {LONG_LONG_MIN}}{753} +-\entry {\code {LONG_MAX}}{753} +-\entry {\code {LONG_MIN}}{753} +-\initial {M} +-\entry {\code {M_1_PI}}{439} +-\entry {\code {M_2_PI}}{439} +-\entry {\code {M_2_SQRTPI}}{439} +-\entry {\code {M_E}}{439} +-\entry {\code {M_LN10}}{439} +-\entry {\code {M_LN2}}{439} +-\entry {\code {M_LOG10E}}{439} +-\entry {\code {M_LOG2E}}{439} +-\entry {\code {M_PI}}{439} +-\entry {\code {M_PI_2}}{439} +-\entry {\code {M_PI_4}}{439} +-\entry {\code {M_SQRT1_2}}{439} +-\entry {\code {M_SQRT2}}{439} +-\entry {\code {MAP_ANON}}{287} +-\entry {\code {MAP_ANONYMOUS}}{287} +-\entry {\code {MAP_FIXED}}{287} +-\entry {\code {MAP_PRIVATE}}{286} +-\entry {\code {MAP_SHARED}}{287} +-\entry {\code {MAX_CANON}}{709} +-\entry {\code {MAX_INPUT}}{709} +-\entry {\code {MAXNAMLEN}}{710} +-\entry {\code {MB_CUR_MAX}}{102} +-\entry {\code {MB_LEN_MAX}}{102} +-\entry {\code {MDMBUF}}{420} +-\entry {\code {MINSIGSTKSZ}}{570} +-\entry {\code {MM_APPL}}{265} +-\entry {\code {MM_CONSOLE}}{264} +-\entry {\code {MM_ERROR}}{266} +-\entry {\code {MM_FIRM}}{265} +-\entry {\code {MM_HALT}}{266} +-\entry {\code {MM_HARD}}{265} +-\entry {\code {MM_INFO}}{266} +-\entry {\code {MM_NOSEV}}{266} +-\entry {\code {MM_NRECOV}}{265} +-\entry {\code {MM_NULLACT}}{266} +-\entry {\code {MM_NULLLBL}}{265} +-\entry {\code {MM_NULLMC}}{265} +-\entry {\code {MM_NULLSEV}}{265} +-\entry {\code {MM_NULLTAG}}{266} +-\entry {\code {MM_NULLTXT}}{265} +-\entry {\code {MM_OPSYS}}{265} +-\entry {\code {MM_PRINT}}{264} +-\entry {\code {MM_RECOVER}}{265} +-\entry {\code {MM_SOFT}}{265} +-\entry {\code {MM_UTIL}}{265} +-\entry {\code {MM_WARNING}}{266} +-\entry {\code {MNTOPT_DEFAULTS}}{694} +-\entry {\code {MNTOPT_NOAUTO}}{695} +-\entry {\code {MNTOPT_NOSUID}}{695} +-\entry {\code {MNTOPT_RO}}{694} +-\entry {\code {MNTOPT_RW}}{694} +-\entry {\code {MNTOPT_SUID}}{694} +-\entry {\code {MNTTYPE_IGNORE}}{694} +-\entry {\code {MNTTYPE_NFS}}{694} +-\entry {\code {MNTTYPE_SWAP}}{694} +-\entry {\code {MON_1}}{150} +-\entry {\code {MON_10}}{151} +-\entry {\code {MON_11}}{151} +-\entry {\code {MON_12}}{151} +-\entry {\code {MON_2}}{151} +-\entry {\code {MON_3}}{151} +-\entry {\code {MON_4}}{151} +-\entry {\code {MON_5}}{151} +-\entry {\code {MON_6}}{151} +-\entry {\code {MON_7}}{151} +-\entry {\code {MON_8}}{151} +-\entry {\code {MON_9}}{151} +-\entry {\code {MON_DECIMAL_POINT}}{152} +-\entry {\code {MON_GROUPING}}{152} +-\entry {\code {MON_THOUSANDS_SEP}}{152} +-\entry {\code {MS_ASYNC}}{288} +-\entry {\code {MS_SYNC}}{288} +-\entry {\code {MSG_DONTROUTE}}{394} +-\entry {\code {MSG_OOB}}{394} +-\entry {\code {MSG_PEEK}}{394} +-\initial {N} +-\entry {\code {N_CS_PRECEDES}}{153} +-\entry {\code {N_SEP_BY_SPACE}}{153} +-\entry {\code {N_SIGN_POSN}}{153} +-\entry {\code {NAME_MAX}}{710} +-\entry {\code {NAN}}{463} +-\entry {\code {NCCS}}{414} +-\entry {\code {NDEBUG}}{743} +-\entry {\code {NEGATIVE_SIGN}}{152} +-\entry {\code {netgroup}}{651} +-\entry {\code {networks}}{651} +-\entry {\code {NEW_TIME}}{672, 677} +-\entry {\code {NGROUPS_MAX}}{698} +-\entry {\code {NL_ARGMAX}}{223} +-\entry {\code {NO_ADDRESS}}{379} +-\entry {\code {NO_RECOVERY}}{379} +-\entry {\code {NOEXPR}}{153} +-\entry {\code {NOFLSH}}{422} +-\entry {\code {NOKERNINFO}}{423} +-\entry {\code {NOSTR}}{154} +-\entry {\code {NSIG}}{529} +-\entry {\code {NSS_STATUS_NOTFOUND}}{656} +-\entry {\code {NSS_STATUS_SUCCESS}}{656} +-\entry {\code {NSS_STATUS_TRYAGAIN}}{656} +-\entry {\code {NSS_STATUS_UNAVAIL}}{656} +-\entry {\code {NULL}}{750} +-\initial {O} +-\entry {\code {O_ACCMODE}}{310} +-\entry {\code {O_APPEND}}{312} +-\entry {\code {O_ASYNC}}{312} +-\entry {\code {O_CREAT}}{310} +-\entry {\code {O_EXCL}}{310} +-\entry {\code {O_EXEC}}{310} +-\entry {\code {O_EXLOCK}}{312} +-\entry {\code {O_FSYNC}}{312} +-\entry {\code {O_IGNORE_CTTY}}{311} +-\entry {\code {O_NDELAY}}{312} +-\entry {\code {O_NOATIME}}{313} +-\entry {\code {O_NOCTTY}}{311} +-\entry {\code {O_NOLINK}}{311} +-\entry {\code {O_NONBLOCK}}{310, 312} +-\entry {\code {O_NOTRANS}}{311} +-\entry {\code {O_RDONLY}}{309} +-\entry {\code {O_RDWR}}{309} +-\entry {\code {O_READ}}{309} +-\entry {\code {O_SHLOCK}}{311} +-\entry {\code {O_SYNC}}{312} +-\entry {\code {O_TRUNC}}{311} +-\entry {\code {O_WRITE}}{309} +-\entry {\code {O_WRONLY}}{309} +-\entry {\code {obstack_alloc_failed_handler}}{48} +-\entry {\code {OLD_TIME}}{672, 677} +-\entry {\code {ONLCR}}{419} +-\entry {\code {ONOEOT}}{419} +-\entry {\code {OPEN_MAX}}{697} +-\entry {\code {OPOST}}{418} +-\entry {\code {optarg}}{577} +-\entry {\code {opterr}}{577} +-\entry {\code {optind}}{577} +-\entry {\code {OPTION_ALIAS}}{587} +-\entry {\code {OPTION_ARG_OPTIONAL}}{587} +-\entry {\code {OPTION_DOC}}{587} +-\entry {\code {OPTION_HIDDEN}}{587} +-\entry {\code {OPTION_NO_USAGE}}{588} +-\entry {\code {optopt}}{577} +-\entry {\code {OXTABS}}{419} +-\initial {P} +-\entry {\code {P_CS_PRECEDES}}{153} +-\entry {\code {P_SEP_BY_SPACE}}{153} +-\entry {\code {P_SIGN_POSN}}{153} +-\entry {\code {P_tmpdir}}{355} +-\entry {\code {PA_CHAR}}{234} +-\entry {\code {PA_DOUBLE}}{235} +-\entry {\code {PA_FLAG_LONG}}{235} +-\entry {\code {PA_FLAG_LONG_DOUBLE}}{235} +-\entry {\code {PA_FLAG_LONG_LONG}}{235} +-\entry {\code {PA_FLAG_MASK}}{234} +-\entry {\code {PA_FLAG_PTR}}{235} +-\entry {\code {PA_FLAG_SHORT}}{235} +-\entry {\code {PA_FLOAT}}{234} +-\entry {\code {PA_INT}}{234} +-\entry {\code {PA_LAST}}{235} +-\entry {\code {PA_POINTER}}{234} +-\entry {\code {PA_STRING}}{234} +-\entry {\code {PARENB}}{420} +-\entry {\code {PARMRK}}{417} +-\entry {\code {PARODD}}{420} +-\entry {\code {passwd}}{651} +-\entry {\code {PATH_MAX}}{710} +-\entry {\code {PENDIN}}{423} +-\entry {\code {PF_CCITT}}{386} +-\entry {\code {PF_FILE}}{369} +-\entry {\code {PF_IMPLINK}}{386} +-\entry {\code {PF_INET}}{371} +-\entry {\code {PF_ISO}}{386} +-\entry {\code {PF_LOCAL}}{369} +-\entry {\code {PF_NS}}{386} +-\entry {\code {PF_ROUTE}}{386} +-\entry {\code {PF_UNIX}}{369} +-\entry {\code {PI}}{440} +-\entry {\code {PIPE_BUF}}{710} +-\entry {\code {PM_STR}}{151} +-\entry {\code {POSITIVE_SIGN}}{152} +-\entry {\code {PRIO_MAX}}{521} +-\entry {\code {PRIO_MIN}}{521} +-\entry {\code {PRIO_PGRP}}{522} +-\entry {\code {PRIO_PROCESS}}{522} +-\entry {\code {PRIO_USER}}{522} +-\entry {\code {program_invocation_name}}{28} +-\entry {\code {program_invocation_short_name}}{28} +-\entry {\code {PROT_EXEC}}{286} +-\entry {\code {PROT_READ}}{286} +-\entry {\code {PROT_WRITE}}{286} +-\entry {\code {protocols}}{651} +-\initial {R} +-\entry {\code {R_OK}}{349} +-\entry {\code {RADIXCHAR}}{153} +-\entry {\code {RAND_MAX}}{452} +-\entry {\code {RE_DUP_MAX}}{698} +-\entry {\code {RLIM_INFINITY}}{521} +-\entry {\code {RLIM_NLIMITS}}{521} +-\entry {\code {RLIMIT_CORE}}{520} +-\entry {\code {RLIMIT_CPU}}{520} +-\entry {\code {RLIMIT_DATA}}{520} +-\entry {\code {RLIMIT_FSIZE}}{520} +-\entry {\code {RLIMIT_NOFILE}}{521} +-\entry {\code {RLIMIT_OFILE}}{521} +-\entry {\code {RLIMIT_RSS}}{521} +-\entry {\code {RLIMIT_STACK}}{520} +-\entry {\code {rpc}}{651} +-\entry {\code {RUN_LVL}}{672, 676} +-\initial {S} +-\entry {\code {S_IEXEC}}{344} +-\entry {\code {S_IFBLK}}{342} +-\entry {\code {S_IFCHR}}{342} +-\entry {\code {S_IFDIR}}{342} +-\entry {\code {S_IFIFO}}{343} +-\entry {\code {S_IFLNK}}{343} +-\entry {\code {S_IFMT}}{342} +-\entry {\code {S_IFREG}}{343} +-\entry {\code {S_IFSOCK}}{343} +-\entry {\code {S_IREAD}}{344} +-\entry {\code {S_IRGRP}}{344} +-\entry {\code {S_IROTH}}{345} +-\entry {\code {S_IRUSR}}{344} +-\entry {\code {S_IRWXG}}{344} +-\entry {\code {S_IRWXO}}{345} +-\entry {\code {S_IRWXU}}{344} +-\entry {\code {S_ISGID}}{345} +-\entry {\code {S_ISUID}}{345} +-\entry {\code {S_ISVTX}}{345} +-\entry {\code {S_IWGRP}}{344} +-\entry {\code {S_IWOTH}}{345} +-\entry {\code {S_IWRITE}}{344} +-\entry {\code {S_IWUSR}}{344} +-\entry {\code {S_IXGRP}}{344} +-\entry {\code {S_IXOTH}}{345} +-\entry {\code {S_IXUSR}}{344} +-\entry {\code {SA_NOCLDSTOP}}{543} +-\entry {\code {SA_ONSTACK}}{543} +-\entry {\code {SA_RESTART}}{544} +-\entry {\code {SCHAR_MAX}}{752} +-\entry {\code {SCHAR_MIN}}{752} +-\entry {\code {SEEK_CUR}}{254} +-\entry {\code {SEEK_END}}{254} +-\entry {\code {SEEK_SET}}{254} +-\entry {\code {SEM_VALUE_MAX}}{735} +-\entry {\code {services}}{651} +-\entry {\code {shadow}}{652} +-\entry {\code {SHRT_MAX}}{753} +-\entry {\code {SHRT_MIN}}{753} +-\entry {\code {SIG_BLOCK}}{562} +-\entry {\code {SIG_DFL}}{539} +-\entry {\code {SIG_ERR}}{540} +-\entry {\code {SIG_IGN}}{539} +-\entry {\code {SIG_SETMASK}}{562} +-\entry {\code {SIG_UNBLOCK}}{562} +-\entry {\code {SIGABRT}}{532} +-\entry {\code {SIGALRM}}{533} +-\entry {\code {SIGBUS}}{531} +-\entry {\code {SIGCHLD}}{534} +-\entry {\code {SIGCLD}}{535} +-\entry {\code {SIGCONT}}{535} +-\entry {\code {SIGEMT}}{532} +-\entry {\code {SIGFPE}}{530} +-\entry {\code {SIGHUP}}{533} +-\entry {\code {SIGILL}}{531} +-\entry {\code {SIGINFO}}{537} +-\entry {\code {SIGINT}}{532} +-\entry {\code {SIGIO}}{534} +-\entry {\code {SIGIOT}}{532} +-\entry {\code {SIGKILL}}{533} +-\entry {\code {SIGLOST}}{536} +-\entry {\code {signgam}}{449} +-\entry {\code {SIGPIPE}}{536} +-\entry {\code {SIGPOLL}}{534} +-\entry {\code {SIGPROF}}{534} +-\entry {\code {SIGQUIT}}{533} +-\entry {\code {SIGSEGV}}{531} +-\entry {\code {SIGSTKSZ}}{570} +-\entry {\code {SIGSTOP}}{535} +-\entry {\code {SIGSYS}}{532} +-\entry {\code {SIGTERM}}{532} +-\entry {\code {SIGTRAP}}{532} +-\entry {\code {SIGTSTP}}{535} +-\entry {\code {SIGTTIN}}{535} +-\entry {\code {SIGTTOU}}{535} +-\entry {\code {SIGURG}}{534} +-\entry {\code {SIGUSR1}}{537} +-\entry {\code {SIGUSR2}}{537} +-\entry {\code {SIGVTALRM}}{534} +-\entry {\code {SIGWINCH}}{537} +-\entry {\code {SIGXCPU}}{536} +-\entry {\code {SIGXFSZ}}{537} +-\entry {\code {SOCK_DGRAM}}{364} +-\entry {\code {SOCK_RAW}}{365} +-\entry {\code {SOCK_STREAM}}{364} +-\entry {\code {SOL_SOCKET}}{407} +-\entry {\code {SS_DISABLE}}{570} +-\entry {\code {SS_ONSTACK}}{570} +-\entry {\code {SSIZE_MAX}}{698} +-\entry {\code {stderr}}{211} +-\entry {\code {STDERR_FILENO}}{283} +-\entry {\code {stdin}}{211} +-\entry {\code {STDIN_FILENO}}{283} +-\entry {\code {stdout}}{211} +-\entry {\code {STDOUT_FILENO}}{283} +-\entry {\code {STREAM_MAX}}{697} +-\entry {\code {SV_INTERRUPT}}{572} +-\entry {\code {SV_ONSTACK}}{572} +-\entry {\code {SV_RESETHAND}}{572} +-\entry {\code {sys_siglist}}{538} +-\initial {T} +-\entry {\code {T_FMT}}{151} +-\entry {\code {T_FMT_AMPM}}{151} +-\entry {\code {TCIFLUSH}}{431} +-\entry {\code {TCIOFF}}{432} +-\entry {\code {TCIOFLUSH}}{431} +-\entry {\code {TCION}}{432} +-\entry {\code {TCOFLUSH}}{431} +-\entry {\code {TCOOFF}}{432} +-\entry {\code {TCOON}}{432} +-\entry {\code {TCSADRAIN}}{414} +-\entry {\code {TCSAFLUSH}}{414} +-\entry {\code {TCSANOW}}{414} +-\entry {\code {TCSASOFT}}{414} +-\entry {\code {THOUSANDS_SEP}}{153} +-\entry {\code {THOUSEP}}{153} +-\entry {\code {timezone}}{509} +-\entry {\code {TMP_MAX}}{354} +-\entry {\code {TOSTOP}}{422} +-\entry {\code {TRY_AGAIN}}{379} +-\entry {\code {tzname}}{509} +-\entry {\code {TZNAME_MAX}}{697} +-\initial {U} +-\entry {\code {UCHAR_MAX}}{752} +-\entry {\code {UINT_MAX}}{753} +-\entry {\code {ULONG_LONG_MAX}}{753} +-\entry {\code {ULONG_MAX}}{753} +-\entry {\code {USER_PROCESS}}{672, 677} +-\entry {\code {USHRT_MAX}}{753} +-\initial {V} +-\entry {\code {VDISCARD}}{428} +-\entry {\code {VDSUSP}}{427} +-\entry {\code {VEOF}}{425} +-\entry {\code {VEOL}}{425} +-\entry {\code {VEOL2}}{425} +-\entry {\code {VERASE}}{426} +-\entry {\code {VINTR}}{427} +-\entry {\code {VKILL}}{426} +-\entry {\code {VLNEXT}}{428} +-\entry {\code {VMIN}}{429} +-\entry {\code {VQUIT}}{427} +-\entry {\code {VREPRINT}}{426} +-\entry {\code {VSTART}}{428} +-\entry {\code {VSTATUS}}{429} +-\entry {\code {VSTOP}}{428} +-\entry {\code {VSUSP}}{427} +-\entry {\code {VTIME}}{429} +-\entry {\code {VWERASE}}{426} +-\initial {W} +-\entry {\code {W_OK}}{349} +-\entry {\code {WCHAR_MAX}}{98, 753} +-\entry {\code {WCHAR_MIN}}{98} +-\entry {\code {WEOF}}{98} +-\initial {X} +-\entry {\code {X_OK}}{349} +-\initial {Y} +-\entry {\code {YESEXPR}}{153} +-\entry {\code {YESSTR}}{153} +diff -Naur ../glibc-2.1.3/manual/libcbook.texi glibc-2.1.3/manual/libcbook.texi +--- ../glibc-2.1.3/manual/libcbook.texi 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/manual/libcbook.texi 1998-02-07 12:17:00.000000000 -0800 +@@ -0,0 +1,3 @@ ++\input texinfo ++@finalout ++@include libc.texinfo +diff -Naur ../glibc-2.1.3/manual/longopt.c.texi glibc-2.1.3/manual/longopt.c.texi +--- ../glibc-2.1.3/manual/longopt.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/longopt.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,94 +0,0 @@ +-#include <stdio.h> +-#include <stdlib.h> +-#include <getopt.h> +- +-/* @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", 0, &verbose_flag, 1@}, +- @{"brief", 0, &verbose_flag, 0@}, +- /* @r{These options don't set a flag. +- We distinguish them by their indices.} */ +- @{"add", 1, 0, 0@}, +- @{"append", 0, 0, 0@}, +- @{"delete", 1, 0, 0@}, +- @{"create", 0, 0, 0@}, +- @{"file", 1, 0, 0@}, +- @{0, 0, 0, 0@} +- @}; +- /* @r{@code{getopt_long} stores the option index here.} */ +- int option_index = 0; +- +- c = getopt_long (argc, argv, "abc:d:", +- 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 '?': +- /* @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 -Naur ../glibc-2.1.3/manual/memopen.c.texi glibc-2.1.3/manual/memopen.c.texi +--- ../glibc-2.1.3/manual/memopen.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/memopen.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,17 +0,0 @@ +-#include <stdio.h> +- +-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 -Naur ../glibc-2.1.3/manual/memstrm.c.texi glibc-2.1.3/manual/memstrm.c.texi +--- ../glibc-2.1.3/manual/memstrm.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/memstrm.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,19 +0,0 @@ +-#include <stdio.h> +- +-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 -Naur ../glibc-2.1.3/manual/mkfsock.c.texi glibc-2.1.3/manual/mkfsock.c.texi +--- ../glibc-2.1.3/manual/mkfsock.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/mkfsock.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,44 +0,0 @@ +-#include <stddef.h> +-#include <stdio.h> +-#include <errno.h> +-#include <stdlib.h> +-#include <sys/socket.h> +-#include <sys/un.h> +- +-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)); +- +- /* @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. +- Alternativly 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 -Naur ../glibc-2.1.3/manual/mkisock.c.texi glibc-2.1.3/manual/mkisock.c.texi +--- ../glibc-2.1.3/manual/mkisock.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/mkisock.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,31 +0,0 @@ +-#include <stdio.h> +-#include <stdlib.h> +-#include <sys/socket.h> +-#include <netinet/in.h> +- +-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 -Naur ../glibc-2.1.3/manual/pipe.c.texi glibc-2.1.3/manual/pipe.c.texi +--- ../glibc-2.1.3/manual/pipe.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/pipe.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,66 +0,0 @@ +-#include <sys/types.h> +-#include <unistd.h> +-#include <stdio.h> +-#include <stdlib.h> +- +-/* @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.} */ +- 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.} */ +- write_to_pipe (mypipe[1]); +- return EXIT_SUCCESS; +- @} +-@} +diff -Naur ../glibc-2.1.3/manual/popen.c.texi glibc-2.1.3/manual/popen.c.texi +--- ../glibc-2.1.3/manual/popen.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/popen.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,33 +0,0 @@ +-#include <stdio.h> +-#include <stdlib.h> +- +-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, "Could not run more.\n"); +- return EXIT_FAILURE; +- @} +- write_data (output); +- pclose (output); +- return EXIT_SUCCESS; +-@} +-@end group +diff -Naur ../glibc-2.1.3/manual/rprintf.c.texi glibc-2.1.3/manual/rprintf.c.texi +--- ../glibc-2.1.3/manual/rprintf.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/rprintf.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,67 +0,0 @@ +-#include <stdio.h> +-#include <stdlib.h> +-#include <printf.h> +- +-@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, "<Widget %p: %s>", 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 -Naur ../glibc-2.1.3/manual/search.c.texi glibc-2.1.3/manual/search.c.texi +--- ../glibc-2.1.3/manual/search.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/search.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,93 +0,0 @@ +-#include <stdlib.h> +-#include <stdio.h> +-#include <string.h> +- +-/* @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 -Naur ../glibc-2.1.3/manual/select.c.texi glibc-2.1.3/manual/select.c.texi +--- ../glibc-2.1.3/manual/select.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/select.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,40 +0,0 @@ +-@group +-#include <stdio.h> +-#include <unistd.h> +-#include <sys/types.h> +-#include <sys/time.h> +-@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 -Naur ../glibc-2.1.3/manual/setjmp.c.texi glibc-2.1.3/manual/setjmp.c.texi +--- ../glibc-2.1.3/manual/setjmp.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/setjmp.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,32 +0,0 @@ +-#include <setjmp.h> +-#include <stdlib.h> +-#include <stdio.h> +- +-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 -Naur ../glibc-2.1.3/manual/sigh1.c.texi glibc-2.1.3/manual/sigh1.c.texi +--- ../glibc-2.1.3/manual/sigh1.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/sigh1.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,36 +0,0 @@ +-#include <signal.h> +-#include <stdio.h> +-#include <stdlib.h> +- +-/* @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 -Naur ../glibc-2.1.3/manual/sigusr.c.texi glibc-2.1.3/manual/sigusr.c.texi +--- ../glibc-2.1.3/manual/sigusr.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/sigusr.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,61 +0,0 @@ +-@group +-#include <signal.h> +-#include <stdio.h> +-#include <sys/types.h> +-#include <unistd.h> +-@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 -Naur ../glibc-2.1.3/manual/stpcpy.c.texi glibc-2.1.3/manual/stpcpy.c.texi +--- ../glibc-2.1.3/manual/stpcpy.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/stpcpy.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,13 +0,0 @@ +-#include <string.h> +-#include <stdio.h> +- +-int +-main (void) +-@{ +- char buffer[10]; +- char *to = buffer; +- to = stpcpy (to, "foo"); +- to = stpcpy (to, "bar"); +- puts (buffer); +- return 0; +-@} +diff -Naur ../glibc-2.1.3/manual/strdupa.c.texi glibc-2.1.3/manual/strdupa.c.texi +--- ../glibc-2.1.3/manual/strdupa.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/strdupa.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,19 +0,0 @@ +-#include <paths.h> +-#include <string.h> +-#include <stdio.h> +- +-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 -Naur ../glibc-2.1.3/manual/strftim.c.texi glibc-2.1.3/manual/strftim.c.texi +--- ../glibc-2.1.3/manual/strftim.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/strftim.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,31 +0,0 @@ +-#include <time.h> +-#include <stdio.h> +- +-#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 -Naur ../glibc-2.1.3/manual/strncat.c.texi glibc-2.1.3/manual/strncat.c.texi +--- ../glibc-2.1.3/manual/strncat.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/strncat.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,14 +0,0 @@ +-#include <string.h> +-#include <stdio.h> +- +-#define SIZE 10 +- +-static char buffer[SIZE]; +- +-main () +-@{ +- strncpy (buffer, "hello", SIZE); +- puts (buffer); +- strncat (buffer, ", world", SIZE - strlen (buffer) - 1); +- puts (buffer); +-@} +diff -Naur ../glibc-2.1.3/manual/subopt.c.texi glibc-2.1.3/manual/subopt.c.texi +--- ../glibc-2.1.3/manual/subopt.c.texi 1999-07-18 18:01:09.000000000 -0700 ++++ glibc-2.1.3/manual/subopt.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,75 +0,0 @@ +-#include <stdio.h> +-#include <stdlib.h> +- +-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 +-@}; +- +-const char *mount_opts[] = +-@{ +- [RO_OPTION] = "ro", +- [RW_OPTION] = "rw", +- [READ_SIZE_OPTION] = "rsize", +- [WRITE_SIZE_OPTION] = "wsize" +-@}; +- +-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 -Naur ../glibc-2.1.3/manual/termios.c.texi glibc-2.1.3/manual/termios.c.texi +--- ../glibc-2.1.3/manual/termios.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/termios.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,60 +0,0 @@ +-#include <unistd.h> +-#include <stdio.h> +-#include <stdlib.h> +-#include <termios.h> +- +-/* @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 -Naur ../glibc-2.1.3/manual/testopt.c.texi glibc-2.1.3/manual/testopt.c.texi +--- ../glibc-2.1.3/manual/testopt.c.texi 1999-07-18 18:01:08.000000000 -0700 ++++ glibc-2.1.3/manual/testopt.c.texi 1969-12-31 16:00:00.000000000 -0800 +@@ -1,51 +0,0 @@ +-@group +-#include <unistd.h> +-#include <stdio.h> +- +-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 -Naur ../glibc-2.1.3/math/math_private.h glibc-2.1.3/math/math_private.h +--- ../glibc-2.1.3/math/math_private.h 1998-11-27 03:33:46.000000000 -0800 ++++ glibc-2.1.3/math/math_private.h 1998-11-30 07:01:06.000000000 -0800 +@@ -11,7 +11,7 @@ + + /* + * from: @(#)fdlibm.h 5.1 93/09/24 +- * $Id: math_private.h,v 1.8 1998/11/27 11:33:46 drepper Exp $ ++ * $Id: math_private.h,v 1.1.1.1 1998/11/30 15:01:06 gafton Exp $ + */ + + #ifndef _MATH_PRIVATE_H_ +diff -Naur ../glibc-2.1.3/math/test-math.c glibc-2.1.3/math/test-math.c +--- ../glibc-2.1.3/math/test-math.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/math/test-math.c 1998-02-07 12:20:22.000000000 -0800 +@@ -0,0 +1,150 @@ ++#include <stdio.h> ++#include <math.h> ++#include <stdlib.h> ++#include <errno.h> ++#include <string.h> ++ ++void print_trig_stuff __P ((void)); ++ ++int ++main (int argc, char *argv[]) ++{ ++ const char str[] = "123.456"; ++ double x,h,li,lr,a,lrr; ++ ++ if (signbit (argc < 1 ? -0.0 : 0.0)) ++ /* I don't make this an error for now. --drepper */ ++ fputs ("\n*** Your compiler has a bug. Consider upgrading\n\n", stderr); ++ ++ x = atof (str); ++ ++ printf ("%g %g\n", x, pow (10.0, 3.0)); ++ ++ x = sinh(2.0); ++ ++ printf("sinh(2.0) = %g\n", x); ++ ++ x = sinh(3.0); ++ ++ printf("sinh(3.0) = %g\n", x); ++ ++ h = hypot(2.0,3.0); ++ ++ printf("h=%g\n", h); ++ ++ a = atan2(3.0, 2.0); ++ ++ printf("atan2(3,2) = %g\n", a); ++ ++ lr = pow(h,4.0); ++ ++ printf("pow(%g,4.0) = %g\n", h, lr); ++ ++ lrr = lr; ++ ++ li = 4.0 * a; ++ ++ lr = lr / exp(a*5.0); ++ ++ printf("%g / exp(%g * 5) = %g\n", lrr, a, lr); ++ ++ lrr = li; ++ ++ li += 5.0 * log(h); ++ ++ printf("%g + 5*log(%g) = %g\n", lrr, h, li); ++ ++ printf("cos(%g) = %g, sin(%g) = %g\n", li, cos(li), li, sin(li)); ++ ++ x = drem(10.3435,6.2831852); ++ ++ printf("drem(10.3435,6.2831852) = %g\n", x); ++ ++ x = drem(-10.3435,6.2831852); ++ ++ printf("drem(-10.3435,6.2831852) = %g\n", x); ++ ++ x = drem(-10.3435,-6.2831852); ++ ++ printf("drem(-10.3435,-6.2831852) = %g\n", x); ++ ++ x = drem(10.3435,-6.2831852); ++ ++ printf("drem(10.3435,-6.2831852) = %g\n", x); ++ ++ ++ printf("x%8.6gx\n", .5); ++ printf("x%-8.6gx\n", .5); ++ printf("x%6.6gx\n", .5); ++ ++ { ++ double x = atof ("-1e-17-"); ++ printf ("%g %c= %g %s!\n", ++ x, ++ x == -1e-17 ? '=' : '!', ++ -1e-17, ++ x == -1e-17 ? "Worked" : "Failed"); ++ } ++ ++ print_trig_stuff (); ++ ++ return 0; ++} ++ ++ ++const double RAD[5] = { 0, M_PI/2, M_PI, (3*M_PI)/2, 2*M_PI }; ++ ++#define PRINT_IT_1_ARG(_func, _arg, _value) \ ++ (_value) = (_func) ((_arg)); \ ++ if (errno) { \ ++ errno = 0; \ ++ printf ("%s = ERROR %s\n", #_func, strerror (errno)); \ ++ } else \ ++ printf ("%s(%g) = %g\n", #_func, _arg, (_value)); \ ++ ++#define PRINT_IT_2_ARG(_func, _arg1, _arg2, _value) \ ++ (_value) = (_func) ((_arg1),(_arg2)); \ ++ if (errno) { \ ++ errno = 0; \ ++ printf ("%s = ERROR %s\n", #_func, strerror (errno)); \ ++ } else \ ++ printf ("%s(%g, %g) = %g\n", #_func, _arg1, _arg2, (_value)); \ ++ ++void ++print_trig_stuff(void) ++{ ++ double value, arg1, arg2; ++ int i; ++ ++ puts ("\n\nMath Test"); ++ ++ errno = 0; /* automatically reset on error condition */ ++ for (i=0; i<4; i++) ++ { ++ PRINT_IT_1_ARG (sin, RAD[i], value); ++ PRINT_IT_1_ARG (cos, RAD[i], value); ++ PRINT_IT_1_ARG (tan, RAD[i], value); ++ PRINT_IT_1_ARG (asin, RAD[i], value); ++ PRINT_IT_1_ARG (acos, RAD[i], value); ++ PRINT_IT_1_ARG (atan, RAD[i], value); ++ PRINT_IT_2_ARG (atan2, RAD[i], -RAD[i % 4], value); ++ } ++ ++ arg1 = 16; ++ arg2 = 3; ++ PRINT_IT_1_ARG (exp, arg1, value); ++ PRINT_IT_1_ARG (log, arg1, value); ++ PRINT_IT_1_ARG (log10, arg1, value); ++ PRINT_IT_2_ARG (pow, arg1, arg2, value); ++ PRINT_IT_1_ARG (sqrt, arg1, value); ++ PRINT_IT_1_ARG (cbrt, arg1, value); ++ PRINT_IT_2_ARG (hypot, arg1, arg2, value); ++ PRINT_IT_1_ARG (expm1, arg1, value); ++ PRINT_IT_1_ARG (log1p, arg1, value); ++ PRINT_IT_1_ARG (sinh, arg1, value); ++ PRINT_IT_1_ARG (cosh, arg1, value); ++ PRINT_IT_1_ARG (tanh, arg1, value); ++ PRINT_IT_1_ARG (asinh, arg1, value); ++ PRINT_IT_1_ARG (acosh, arg1, value); ++ PRINT_IT_1_ARG (atanh, arg1, value); ++} +diff -Naur ../glibc-2.1.3/misc/ioctltst.c glibc-2.1.3/misc/ioctltst.c +--- ../glibc-2.1.3/misc/ioctltst.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/misc/ioctltst.c 1998-02-07 12:20:35.000000000 -0800 +@@ -0,0 +1,55 @@ ++#include <stdio.h> ++#include <errno.h> ++#include <sys/types.h> ++#include <sys/socket.h> ++#include <sys/ioctl.h> ++#include <net/if.h> ++#include <netinet/in.h> ++ ++/* ++ * open a socket, get the process group information of the socket, and use the ++ * socket to get the network interface configuration list ++ */ ++main(int argc, char *argv[]) ++{ ++ int sock; ++ int ioctl_result; ++ ++ /* get a socket */ ++ sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); ++ if (sock < 0) ++ { ++ perror("Cannot create socket"); ++ exit(1); ++ } ++ ++ /* use ioctl() to get the process group information */ ++ { ++ int get_process_group; ++ ++ ioctl_result = ioctl(sock, SIOCGPGRP, (char *) &get_process_group); ++ ++ if (ioctl_result < 0) ++ { ++ int my_errno = errno; ++ ++ fprintf(stderr, "errno %d ", my_errno); ++ perror("ioctl(get process group)"); ++ } ++ } ++ ++ /* use ioctl() to get the interface configuration list */ ++ { ++ static struct ifconf ifc; /* init to 0 */ ++ ++ ioctl_result = ioctl(sock, SIOCGIFCONF, (char *) &ifc); ++ ++ if (ioctl_result < 0) ++ { ++ int my_errno = errno; ++ ++ fprintf(stderr, "errno %d ", my_errno); ++ perror("ioctl(get interface configuration list)"); ++ } ++ } ++} +diff -Naur ../glibc-2.1.3/misc/nlist.h glibc-2.1.3/misc/nlist.h +--- ../glibc-2.1.3/misc/nlist.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/misc/nlist.h 1998-02-07 12:20:36.000000000 -0800 +@@ -0,0 +1,48 @@ ++/* Copyright (C) 1991, 1992, 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 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 _NLIST_H ++#define _NLIST_H 1 ++ ++#include <features.h> ++ ++__BEGIN_DECLS ++ ++/* Structure describing a symbol-table entry. */ ++struct nlist ++{ ++ char *n_name; ++ unsigned char n_type; ++ char n_other; ++ short int n_desc; ++ unsigned long int n_value; ++}; ++ ++#define N_NLIST_DECLARED ++#include <a.out.h> ++ ++ ++/* Search the executable FILE for symbols matching those in NL, ++ which is terminated by an element with a NULL `n_un.n_name' member, ++ and fill in the elements of NL. */ ++extern int nlist __P ((__const char *__file, struct nlist * __nl)); ++ ++ ++__END_DECLS ++ ++#endif /* nlist.h */ +diff -Naur ../glibc-2.1.3/misc/syslog.c glibc-2.1.3/misc/syslog.c +--- ../glibc-2.1.3/misc/syslog.c 2000-02-11 15:49:57.000000000 -0800 ++++ glibc-2.1.3/misc/syslog.c 2000-02-01 14:15:08.000000000 -0800 +@@ -281,6 +281,13 @@ + __set_errno (old_errno); + continue; + } ++ if (LogType == SOCK_STREAM ++ && saved_errno == ECONNREFUSED) { ++ /* retry with next SOCK_DGRAM: */ ++ LogType = SOCK_DGRAM; ++ __set_errno (old_errno); ++ continue; ++ } + } else + connected = 1; + } +diff -Naur ../glibc-2.1.3/nis/Versions glibc-2.1.3/nis/Versions +--- ../glibc-2.1.3/nis/Versions 1998-07-28 06:50:25.000000000 -0700 ++++ glibc-2.1.3/nis/Versions 1999-12-27 08:16:06.000000000 -0800 +@@ -54,6 +54,9 @@ + __nisbind_destroy; __nisbind_next; + readColdStartFile; writeColdStartFile; + } ++ GLIBC_2.1.2 { ++ xdr_ypall; ++ } + } + + libnss_compat { +diff -Naur ../glibc-2.1.3/nis/yp_xdr.c glibc-2.1.3/nis/yp_xdr.c +--- ../glibc-2.1.3/nis/yp_xdr.c 1998-08-18 16:25:46.000000000 -0700 ++++ glibc-2.1.3/nis/yp_xdr.c 1999-12-27 08:16:07.000000000 -0800 +@@ -28,6 +28,7 @@ + */ + + #include <rpcsvc/yp.h> ++#include <rpcsvc/ypclnt.h> + + bool_t + xdr_ypstat (XDR *xdrs, ypstat *objp) +@@ -298,3 +299,47 @@ + return FALSE; + return TRUE; + } ++ ++bool_t ++xdr_ypall(XDR *xdrs, struct ypall_callback *incallback) ++{ ++ struct ypresp_key_val out; ++ char key[YPMAXRECORD], val[YPMAXRECORD]; ++ ++ /* ++ * Set up key/val struct to be used during the transaction. ++ */ ++ memset(&out, 0, sizeof out); ++ out.key.keydat_val = key; ++ out.key.keydat_len = sizeof(key); ++ out.val.valdat_val = val; ++ out.val.valdat_len = sizeof(val); ++ ++ for (;;) { ++ bool_t more, status; ++ ++ /* Values pending? */ ++ if (!xdr_bool(xdrs, &more)) ++ return FALSE; /* can't tell! */ ++ if (!more) ++ return TRUE; /* no more */ ++ ++ /* Transfer key/value pair. */ ++ status = xdr_ypresp_key_val(xdrs, &out); ++ ++ /* ++ * If we succeeded, call the callback function. ++ * The callback will return TRUE when it wants ++ * no more values. If we fail, indicate the ++ * error. ++ */ ++ if (status) { ++ if ((*incallback->foreach)(out.stat, ++ (char *)out.key.keydat_val, out.key.keydat_len, ++ (char *)out.val.valdat_val, out.val.valdat_len, ++ incallback->data)) ++ return TRUE; ++ } else ++ return FALSE; ++ } ++} +diff -Naur ../glibc-2.1.3/nscd/connections.c glibc-2.1.3/nscd/connections.c +--- ../glibc-2.1.3/nscd/connections.c 2000-02-22 23:02:58.000000000 -0800 ++++ glibc-2.1.3/nscd/connections.c 2000-02-18 15:52:59.000000000 -0800 +@@ -515,3 +515,17 @@ + + nscd_run ((void *) 0); + } ++ ++/* Handle the HUP signal which will force a dump of the cache */ ++void ++sighup_handler (int signum) ++{ ++ /* Prune the password database */ ++ prune_cache (&dbs[pwddb], LONG_MAX); ++ ++ /* Prune the group database */ ++ prune_cache (&dbs[grpdb], LONG_MAX); ++ ++ /* Prune the host database */ ++ prune_cache (&dbs[hstdb], LONG_MAX); ++} +diff -Naur ../glibc-2.1.3/nscd/nscd.c glibc-2.1.3/nscd/nscd.c +--- ../glibc-2.1.3/nscd/nscd.c 1999-10-04 12:51:37.000000000 -0700 ++++ glibc-2.1.3/nscd/nscd.c 1999-12-27 07:50:23.000000000 -0800 +@@ -102,6 +102,9 @@ + options, parse_opt, NULL, doc, + }; + ++/* The SIGHUP handler is extern to this file */ ++extern void sighup_handler(int signum); ++ + int + main (int argc, char **argv) + { +@@ -150,12 +153,13 @@ + /* Ignore job control signals. */ + signal (SIGTTOU, SIG_IGN); + signal (SIGTTIN, SIG_IGN); +- signal (SIGTSTP, SIG_IGN); ++ signal (SIGTSTP, SIG_IGN); + } + + signal (SIGINT, termination_handler); + signal (SIGQUIT, termination_handler); + signal (SIGTERM, termination_handler); ++ signal (SIGHUP, sighup_handler); + signal (SIGPIPE, SIG_IGN); + + /* Cleanup files created by a previous `bind'. */ +diff -Naur ../glibc-2.1.3/nscd/nscd.init glibc-2.1.3/nscd/nscd.init +--- ../glibc-2.1.3/nscd/nscd.init 1999-08-17 13:04:10.000000000 -0700 ++++ glibc-2.1.3/nscd/nscd.init 2000-01-04 14:21:27.000000000 -0800 +@@ -74,7 +74,7 @@ + RETVAL=$? + ;; + reload) +- killproc -HUP nscd ++ killproc nscd -HUP + RETVAL=$? + ;; + *) +diff -Naur ../glibc-2.1.3/po/.cvsignore glibc-2.1.3/po/.cvsignore +--- ../glibc-2.1.3/po/.cvsignore 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/po/.cvsignore 2000-02-18 16:03:43.000000000 -0800 +@@ -0,0 +1 @@ ++*.mo +diff -Naur ../glibc-2.1.3/po/cs.mo glibc-2.1.3/po/cs.mo +--- ../glibc-2.1.3/po/cs.mo 2000-01-05 19:28:54.000000000 -0800 ++++ glibc-2.1.3/po/cs.mo 1969-12-31 16:00:00.000000000 -0800 +@@ -1,458 +0,0 @@ +-�������������������8�������K������K������K��M���L��E���UL��&����L��(����L������L������L�����M�����&M�����5M�����IM�����dM�����~M��n���M�����O�����O��"���%O��"���HO�����kO��:����O������O������O������O������O�����P�����P�����2P�����LP�����eP������P������P������P������P������P�����Q�����#Q�����*Q�����EQ�����RQ�����YQ��3���kQ��3����Q��4����Q��.���R��%���7R�����]R��&���qR��%����R������R��%����R��3����R��,���/S��)���\S������S��"����S��!����S������S������S�����T�����.T�����DT��"���ZT��*���}T������T��&����T��&����T��&���U��&���7U��&���^U������U�� ����U��$����U������U������U�����V��,���2V�����_V��%���}V��,����V��-����V�� ����V��&���W�����FW�����eW������W������W������W������W�������W��2���|X������X��"����X��4����X�����"Y��#���4Y�� ���XY��=���bY������Y��<����Y������Y��'���Z�����6Z��)���?Z��(���iZ�� ����Z������Z������Z������Z��$����Z������Z��)��� +-[��(���4[�����][�����m[�����y[��#����[��/����[������[������[�� ���\�����\�����%\�����9\�����N\�����Z\�����j\������\������\������\������\������\�� ����\������\������\�� ���]��&���]��-���<]��!���j]������]������]������]������]��&����]��%���&^��0���L^��!���}^������^��-����^������^��%���_��)���(_��'���R_��%���z_��&����_������_������_������_����� +-`�����%`�����<`�����X`�����u`��@����`��D����`�����a�����'a�����@a�� ���Ua��=���_a������a�������a�����b��7����b��2����b��-��� c�����7c��$���Jc�� +-���oc�����zc������c��!����c������c������c������c������c�����d�����d�����/d�����Jd�����^d�����rd��3����d��-����d��2����d�����e�����,e�����5e�����<e�����Le�����fe��<���}e������e��$����e��)����e�� ���)f�����7f��1���If��8���{f������f������f������f������f�����g�����'g�����@g�����Og�����gg��"����g������g������g������g�������g�����oh�� ����h������h������h������h������h�� ����h�����i��$���'i�����Li��"���Si��%���vi��"����i��"����i��%����i�����j�����j�����.j��>���;j�����zj������j������j������j��!����j������j��!����j������j��.���k�����Mk�����ak�����nk��"���{k������k������k������k�� ����k������k��+����k�����(l�����El�����Vl�����ml������l������l������l������l������l����� +-m��1���m��$���Mm�����rm������m������m������m������m������m������m�����n�� +-���n�����#n�����*n��2���0n�����cn�����rn������n�� ����n������n������n������n������n����� o�����o��!���3o�����Uo�����so��s����o�����p��*���p�����Cp�����]p�����np�����p������p������p������p������p������p�����q�����q�����q��9���q�����Vq�����nq������q��,����q�� +-����q������q������q������q�����r�����#r�����>r�����Xr�����pr������r��#����r������r������r������r�����s��#���&s�����Js�����js�����ss������s������s������s������s������s������s������s�����t�����1t�����Pt�����pt������t������t������t������t������t������t�����u��*���#u�����Nu�����Uu�����mu������u�� ����u��!����u�� ����u������u������u�� ���v�����"v�����@v�����Mv�����av�����rv������v������v��(����v������v�����w�����w�����5w�����Ow�����ew�����~w������w������w������w������w������w������w��.����w�����"x�� ���4x��#���Bx��0���fx��%����x������x������x������x������x�����y�����#y�����@y�����Oy�����my������y������y������y������y������y������y�����z�����+z�����Ez�����_z�����qz������z������z������z������z������z��!���{�����.{�����G{�����b{�����~{������{������{��"����{������{������{����� |�����$|�����8|�����J|�����`|��-���o|��-����|��!����|������|�����}�����}�����2}�����C}��2���Z}��#����}������}������}��;����}�����~�����$~�����@~�����X~�� ���r~�� ����~������~������~������~������~������~���������������/�����J��&���c�������������������������������� ������������$���0��� ���U������c������o����������������������������������ˀ�����߀����������������� ���*���(���(���S������|����������"������������������D������K���$���e��� +-������������������������P��� ���`������n���!������������������������DŽ��������"����������������*������@������S���'���c���#�������6������� ������ +-�������������"������"���*������M���"���g��������������������Ć�����ۆ�� ����������������������������*������C������Z������o����������������������������������χ����������������� ���������#���%���:���I�����������������%����������ֈ��"������������!������ ���@���"���a��� ������������������������ω�����������������������������!���F���>��� �������.�������-�������6������8���#���;���\���I��������������������������+���$���+���P���'���|�������������Č�� ���ь�����ی���������������&���(���.���O���&���~����������,�������������������C������#���a�����������������!�������"������.������ ���4���%���U���;���{���&����������ޏ��1����������0������K������W���"���h����������'����������ϐ��������.���������3���"���J���(���m���-����������đ�����ܑ��!����������������8������X������t���!�����������������ʒ��������9�������4���7���8���l���+�������8���ѓ��$��� +-���"���/���!���R���.���t���������������������<������;���>���$���z�����������������*���ו��7���������:���"���Y������|���)�������N�������U���������^���&���|���)������� ���͗�����ۗ��+���������� ������>������X������j���"�������%�������*���Ә��*����������)������=���0���W�����������������+���Ǚ��7������#���+������O���!���m���$�������!����������֚��&������%������,���>������k���'���z���%�������0���ț��2����������,���.���9������h���K�������L���͜��L���������g���+���{���2�������2���ڝ��/��� ���$���=������b���%���x���-�������$���̞����������� ������'������:���(���Q���&���z���!����������ß��F���ڟ�����!���B���4���B���w���?�������<�������7���7������o����������#�������.���ɡ��0�������0���)������Z������x���������������������������Т������������������������%������;������O���#���d���5�������G������� ������#������5���8������n������{���-�������!�������(������-���������9������J���'���\���?�������=���ĥ�� ������.������ ���?���9���`���;�������,���֦��*������#���.������R���%���l���A����������ԧ��������I������7���X���3�������+���Ĩ��������'������!���/������Q���.���b����������C�������*������������������(���8������a���1���t�����������������:���ݪ��������)���6���*���`���#��������������$���ϫ���������������"���,������O������m�����������������>���Ĭ��������!���"��� ���D���(���e���$��������������*���ɭ��=�������H���2������{����������E�������&������(������'���0���E���X����������(�������'������$������,���-���)���Z���%��������������"���Ȱ��������&��� ������0���P���O���V�������U�������O���M���V�������!�������'������*���>���/���i���*�������$���ij��/������1������/���K���)���{���*�������)���д��#�������������-���9���&���g���4�������(���õ����������� ��� ������#���(���$���L���"���q��������������������Ķ�����۶��.���������������;���3���X����������#����������·�� ���۷��������0����������-���$���I������n����������#�����������������ȸ�����ݸ�����������������)���4���B������w�����������������'���ǹ��B������D���2���j���w���K������?���.������n����������!����������̻��������������������"���3������V������r�����������������#�������#�����#������0���'���#���X������|����������*�������%������*�� ������4������J���d���`���X���ſ��.������0���M������~�����������������������������������������������������2�����������������-�������-��� +-������8���L���W������������������������������������������������������2������P������p����������������������������������������#������,������I������X������d���/���w���/�������=�������.������%���D������j���)�������&��������������.�������1���!���6���S���-��������������"�������(����������������9������R������r�����������������1��������������&������&���.���&���U���&���|���&��������������,�������,���������@������_������{���1�������#�������$�������1������2���D���&���w���%��������������,����������������'������:������W�������t���5���������I��� ���d���-��������������-��������������R����������J���M���]����������������� +-�������*�������!���������>������[������]������y���"��������������&�������'����������������)������9���$���X���/���}����������!�������������� ����������������(��� ���<������J������i���������� ��������������/��������������,���������8���-���<������j���,�������5������� ����������������"������=���!���R���0���t���%�������4�������'����������(������A������X���+���v���+�������.�������&�������8���$���!���]����������������"���������������������'���������3���?���H���F���������������������$����������%���8���>������w���������*�������G�������.������7���L����������0���������������������������������������������������2������P������d���&�����������������������������������D��� ���'���N���:���v����������������������������������������� ���J���$���%���o���3�������.��������������#������4���+���=���`����������-��������������)����������(���'���D������l����������*�������'����������������� �������������0����������0����������������5������J������[������q���$�������%��������������0�������.������0���I���1���z���.��������������#�������������R���1�������������������������������"�������������� ������ ���0���%���Q������w��� +-��������������"�������������������������������������"���3���;������o�����������������������������������������������$���$���;������`���9���s���%������������������������ ������������=��� ���V������d������q��� +-���������������������6���������������������������'���,���"���T������w������������������������"�������)�������������'���0���X���X����������<�����������������������,���'���A������i������~���&���������������������������� ���������� ���>��� ������L���%���g����������,������� �������������� ��������������%���������<������Z������t���'��������������4����������������������.������J���$���i�����������������*���������������������!���������4������M������Y������p���"�������$�������-������������� ���������>������Y������u���'���������������������)�������������(���$��� ���M������n������}���"����������������������������)����������������9������F������\������o���%��������������0�����������������������������1������A������X������p����������������� ����������������������������,����������������'���"���A���8���d���&���������������������������������%���6������\������y���!����������������������������!����������������,��� ���A������b������}�������������������������������#����������������:������Y������u�������������������������������"���������)���&���G������n������z��������������������������������������:�������7���+���,���c���!���������������������*�������������4���1���3���f����������{���������������������!��������������0���������=���!���T���*���v������������������������'�������'���������,������I������a���.���w������������������������/�������������*���"������M���7���k��� �������������������������������������������.��� ���C���!���d������������������������#�������<������� ���������,���/���A�������q������������ +-���%���$������J������\���I��s���������������������'����������(���/�2���X�2�����"����������������������/�&���B�%���i�>���������� +-����������#�����#�������:� ���W����x�"��������������� ���������������������+����C����[����q�������������������������������������������!�#���*�N���N�(�����(�����+�����%����$���A����f�&�����,�����!�����&����� �������?����K����\����a����f����}�!�����U�������� �"����-���<�<���j�:�����@�����?���# ����c ����} ����� �'���� �'���� �(���� �#��� +-����? +-����O +-����_ +-���� +-����� +-�+���� +-�7���� +-�4�������N�3���k�2����������F�����(���4�8���]� �����!�����"�����!�����'��� �.���F �=���u � ���� �!���� �#���� ����� ���8����F�(���Y�!�����6����������"�����5�������R�$���j�'�����*����������&�����-����*���M����x������.�����%������������&����B�A���_�0�����1�����(����;���-�"���i�#�����&�����4�����"����"���/�#���R�<���v�=�����!���������&���-�(���T�4���}�!�����/���������1����L���J�M���������� ���� ���"����C����S�=���l����������������&�����"���!�(���D�9���m�3���������������(����!���/�(���Q�/���z�5�����)�������� +-�)���#�)���M�(���w�!�����0����������%��� ����/�+���>�+���j�,�����7����� �����%�������B�K���W�K�����I��������9�(���M�1���v�+�����+�����)�����)���*�$���T�/���y�������������������������'���'�)���O�!���y������C����������D����B���T�7�����:�����@��� +- ����K ����e �&���� �-���� �/���� �/���!�&���7!����^!����y!�����!�����!�����!�����!�����!����"����"����-"����@"�+���S"�-���"�*����"�����"�!����"�F���#� ���X#����y#�=����#�+����#�/���$�+���1$����]$����m$�*���~$�=����$�>����$����&%�'���:%� ���b%�>����%�B����%�)���&�<���/&�"���l&�"����&�.����&�A����&�&���#'�"���J'�P���m'�@����'�<����'�-���<(�$���j(�6����(�!����(�����(�/����)� ���0)�6���>)�*���u)�����)�����)�,����)�����)�,���*����8*����U*�:���o*�����*�$����*�*����*�$���+�&���:+�%���a+�����+�����+�*����+�0����+����,����=,����],�6���|,�0����,�'����,�2���-����?-����_-����{-�+����-�9����-�*����-����%.����6.�F���H.�����.�)����.�(����.�D���/�(���G/�5���p/�2����/�(����/�7���0�6���:0�)���q0�!����0�-����0�!����0�#��� 1�"���11�C���T1�?����1�L����1�E���%2�U���k2�#����2�+����2�(���3�+���:3�*���f3�#����3�/����3�-����3�.���4�,���B4�B���o4�:����4�'����4����5�1���55�8���g5�E����5�'����5����6����%6����86�!���G6�"���i6�&����6�����6�$����6�����6����7�6���!7����X7�$���m7�3����7�����7�*����7����8����8����)8�*���;8����f8�(���8�!����8�����8�'����8����9����9����09����C9����V9����r9�$����9�����9�%����9�"����9�#���:�=���::�<���x:�^����:�J���;�:���_;�����;�"����;�&����;�����<����<����:<����Q<�5���f<�����<� ����<�!����<�����<�!����<�!���=�!���==�.���_=�!����=�!����=�!����=�<����=�(���1>��������k��������������������������@������,�������(�������������:��C����������������p��}���������2�������������k��D����������!��a���S����q�������J������������w��7������������@��������������E��V��H���������s������l���s���������u���[���������v������������������:������������������6��=������u������������������o���.������ ����|��d�����p���������������9�������������������$���������[�������������������l��?���������������C��`��������������*�����X���9��I������S��V��p������!������������y��d������������������������������Q������1�����������������n��^�� +-��� ���m���4���������?��������m������r�������������������������������]�������������������������������#������������������/���_��J����������������������������������������������s��f��Q��8�����r����������z���������<������������������x������B��{��K�������������>����������D��M����������������������������>����������������o���������i�������@����������x����������������b������� �������g���a�����������������E��o��e�������-��x��W������������������������������������������������Z�������s���R��"�������������4���������������/��������������������*����������(�������������������1�������k������L��V������N����)��������A������y���������*�����f���$������X������Q��)��#���K����������������[�������q�������D�����������T������a����������.���������T�������,��'�������u��\������������!�������3������������g�� +-������=��H���]�����-��5��O��z��������������������j�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��`�����������������������������������U������m�����{�����Q������c��P��������������������������������������������6���r����������������`���������t�����e��5�������������F��h��|�������������������b�������������������e�����\���~��2��E������� ���j�������#����������� ���������m��������������y������������1��M����������\����������4��f�������R����������7��Y�������������f��L�������F������������������������������������<����������� �� ���������������{��i���������Y�������������������������������� ���%���������(������c����������������������������~��������,����������{��������������������������������C���5��"���������?������v���)�������?������ +-����������+��������������/��~��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��P������������������������y���`�� ��<��w���}�����_�����'��H������d��������������n����������������H���������G������5��>����+�������S�����������-���������Y������������!����������������I����������g����l���������^��z������������v����������������������������������������N��A������|�����t���������W��������������������������+��������$��3��h�����������������c����������������������b��&��A������i���������������������b��[�� �������8�������������O��������o�����Y��#���������������r�����N���0����������������;��n��������������%����������������������������������������������������������E�� ������K������������ +-��M��������������������������h�������X��������������T��t������������������^�����9�����M�� ��J���������������>���+�����������������(���������2��c���������6��&��������V���)��������������������������������U��=�������B�������������;���v����������������0���������������Z�����������%��������������������~���������]������������������������1���������������N��������p��2��i���'��:��0������-���D�����������S������������������������W������L��8�����������������������������������}�������������������,�����������������������t�������������&�����B��w�������������l�����������������I�����������������������������6��'��������������������U�������������������������:������*������F�������������������������������������������n���������.�����q������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��T��Z��F����������������g��4�����q�����_��O��K��P��\����������������X�������������I�����������z��������������������������������������������������������G����������0�����a��A�����B�����j��U�����������������������������������<��$������k���������������]��P�����������h���������������3��������������9���������� Access Rights : � Attributes : � %s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile] +-� %s [-n netid]* [-o outfile] [infile] +-� %s [-s nettype]* [-o outfile] [infile] +-� Access rights: � Entry data of type %s +-� Name : %s +-� Public Key : � Type : %s +-� Universal addresses (%u) +-� [%d] Name : %s +-� [%u] - [%u bytes] � +-%s cache: +- +-%15s cache is enabled +-%15Zd suggested size +-%15ld seconds time to live for positive entries +-%15ld seconds time to live for negative entries +-%15ld cache hits on positive entries +-%15ld cache hits on negative entries +-%15ld cache misses on positive entries +-%15ld cache misses on negative entries +-%15ld%% cache hit rate +-%15s check /etc/%s for changes +-� +-Group Members : +-� +-Time to Live : � rpcinfo -b prognum versnum +-� rpcinfo -d prognum versnum +-� rpcinfo -p [ host ] +-� rpcinfo [ -n portnum ] -t host prognum [ versnum ] +-� no� yes� Data Length = %u +-� Explicit members: +-� Explicit nonmembers: +-� Implicit members: +-� Implicit nonmembers: +-� No explicit members +-� No explicit nonmembers +-� No implicit members +-� No implicit nonmembers +-� No recursive members +-� No recursive nonmembers +-� Recursive members: +-� program vers proto port +-� or: � (rule from "%s", line %d)� [OPTION...]� done +-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags. +-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed. +-�%s%s%s:%u: %s%sUnexpected error: %s. +-�%s%sUnknown signal %d +-�%s: %d did not sign extend correctly +-�%s: <mb_cur_max> must be greater than <mb_cur_min> +-�%s: C preprocessor failed with exit code %d +-�%s: C preprocessor failed with signal %d +-�%s: Can't create %s: %s +-�%s: Can't create directory %s: %s +-�%s: Can't link from %s to %s: %s +-�%s: Can't open %s: %s +-�%s: Can't remove %s: %s +-�%s: Error closing %s: %s +-�%s: Error reading %s +-�%s: Error writing %s +-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s +-�%s: Memory exhausted: %s +-�%s: More than one -L option specified +-�%s: More than one -d option specified +-�%s: More than one -l option specified +-�%s: More than one -p option specified +-�%s: More than one -y option specified +-�%s: Too many arguments +-�%s: cannot get modification time�%s: command was '%s', result was %d +-�%s: error in state machine�%s: illegal option -- %c +-�%s: invalid option -- %c +-�%s: option `%c%s' doesn't allow an argument +-�%s: option `%s' is ambiguous +-�%s: option `%s' requires an argument +-�%s: option `--%s' doesn't allow an argument +-�%s: option `-W %s' doesn't allow an argument +-�%s: option `-W %s' is ambiguous +-�%s: option requires an argument -- %c +-�%s: output would overwrite %s +-�%s: panic: Invalid l_value %d +-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s' +-�%s: unrecognized option `--%s' +-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ] +- [ -L leapseconds ] [ -y yearistype ] [ filename ... ] +-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ... +-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object) +-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible +-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]... +-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT +-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data +-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag! +-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file! +-�Cannot use netid flag with inetd flag! +-�Cannot use netid flag without TIRPC! +-�Cannot use table flags with newstyle! +-�Channel number out of range�Character Separator : %c +-�Child exited�Client credential too weak�Columns : +-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc. +-This is free software; see the source for copying conditions. There is NO +-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique +-�DIRECTORY +-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights : +-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits) +-�Directory : %s +-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY +-�Encrypted data +-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file. Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP +-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group : %s +-�Group Flags :�Group entry for "%s.%s" group: +-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos. +-�Killed�LINK +-�LOCAL entry for UID %d in directory %s not unique +-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s +-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server : +-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME +-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT +-�NUMBER�Name : '%s' +-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered. +-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None. +-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns : %d +-�Number of objects : %u +-�Numerical argument out of domain�Numerical result out of range�Object #%d: +-�Object Name : %s +-�Object Type : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner : %s +-�PRIVATE +-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits) +-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate : +-�Report bugs to %s. +-�Report bugs using the `glibcbug' script to <bugs@gnu.org>. +-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path : %s +-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root +-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status : %s +-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%s�TABLE +-�Table Type : %s +-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known. This does +-not necessarily mean that all combinations of these names can be used for +-the FROM and TO command line parameters. One coded character set can be +-listed with several different names (aliases). +- Some of the names are no plain strings but instead regular expressions and +-they match a variety of names which can be given as parameters to the +-program. +- +- �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information. +-�Trying %s... +-�Type : %s +-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d) +-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s +-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname] +-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s. +-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory +-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice +-�bogus mcheck_status, library is buggy +-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d +-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s +-�cannot find any C preprocessor (cpp) +-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory +-�clntudp_create: out of memory +-�clntunix_create: out of memory +-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server +-�couldn't register prog %d vers %d +-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten +-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s' +-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block +-�memory clobbered past end of allocated block +-�memory exhausted�memory exhausted +-�memory is consistent, library is buggy +-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s +-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d +-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration: +- +-%15d server debug level +-�nscd not running! +-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup +-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available +-�program %lu version %lu is not available +-�program %lu version %lu ready and waiting +-�rcmd: poll (setting up stderr): %m +-�rcmd: socket: All ports in use +-�rcmd: write (setting up stderr): %m +-�registerrpc: out of memory +-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error +-�rpcgen: too many defines +-�rpcinfo: %s is unknown host +-�rpcinfo: %s is unknown service +-�rpcinfo: Could not delete registration for prog %s version %s +-�rpcinfo: broadcast failed: %s +-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup +-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory +-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory +-�svctcp_create: out of memory +-�svcudp_create - cannot getsockname�svcudp_create: out of memory +-�svcudp_create: socket creation problem�svcunix_create: out of memory +-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d +-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage: %s infile +-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory +-�xdrrec_create: out of memory +-�yp_update: cannot convert host to netname +-�yp_update: cannot get server address +-�Project-Id-Version: libc 2.1 +-POT-Creation-Date: 1998-11-28 09:29-0800 +-PO-Revision-Date: 1999-11-09 13:01+01:00 +-Last-Translator: Vladimir Michl <Vladimir.Michl@seznam.cz> +-Language-Team: Czech <cs@li.org> +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=ISO-8859-2 +-Content-Transfer-Encoding: 8bit +-� P��stupov� pr�va : � Atributy : � %s [-abkCLNTM][-Dn�zev[=hodnota]] [-i velikost] [-I [-K sekundy]] +- [-Y cesta] vst_soubor +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o v�st_soubor] +- [vst_soubor] +-� %s [-n netid]* [-o v�st_soubor] [vst_soubor] +-� %s [-s nettype]* [-o v�st_soubor] [vst_soubor] +-� P��stupov� pr�va: � Vstupn� data typu %s +-� N�zev : %s +-� Ve�ejn� kl�� : � Typ : %s +-� Univerz�ln� adresy (%u) +-� [%d] N�zev : %s +-� [%u] - [%u bajt�] � +-%s cache: +- +-%15s cache je povolena +-%15Zd navrhovan� velikost +-%15ld sekund �ivotnost pozitivn�ch z�znam� +-%15ld sekund �ivotnost negativn�ch z�znam� +-%15ld �sp�ch� cache pro pozitivn� z�znamy +-%15ld �sp�ch� cache pro negativn� z�znamy +-%15ld ne�sp�ch� cache pro pozitivn� z�znamy +-%15ld ne�sp�ch� cache pro negativn� z�znamy +-%15ld%% �sp�nost cache +-%15s zkontrolujte zm�ny v /etc/%s +-� +-�lenov� skupin : +-� +-�ivotnost : � rpcinfo -b ��slo_programu ��slo_verze +-� rpcinfo -d ��slo_programu ��slo_verze +-� rpcinfo -p [ po��ta� ] +-� rpcinfo [ -n ��slo_portu ] -t po��ta� ��slo_programu [ ��slo_verze ] +-� ne� ano� D�lka dat = %u +-� Explicitn� �lenov�: +-� Explicitn� ne�lenov�: +-� Implicitn� �lenov�: +-� Implicitn� ne�lenov�: +-� ��dn� explicitn� �lenov� +-� ��dn� explicitn� ne�lenov� +-� ��dn� implicitn� �lenov� +-� ��dn� implicitn� ne�lenov� +-� ��dn� rekurzivn� �lenov� +-� ��dn� rekurzivn� ne�lenov� +-� Rekurzivn� �lenov�: +-� program verz proto port +-� nebo: � (pravidlo z "%s", ��dek %d)� [P�EP�NA�...]� dokon�eno +-�"%s", ��dek %d: %s���dek "Zone %s" a volba -l se navz�jem vylu�uj����dek "Zone %s" a volba -p se navz�jem vylu�uj��"vst_soubor" je vy�adov�n p�i pou�it� p��znak� tvorby vzoru. +-�%.*s: Parameter ARGP_HELP_FMT vy�aduje hodnotu�%.*s: Nezn�m� parameter ARGP_HELP_FMT�%s v �asov�m p�smu bez pravidel�%s%s%s:%u: %s%sP�edpoklad `%s' nespln�n. +-�%s%s%s:%u: %s%sNeo�ek�van� chyba: %s. +-�%s%sNezn�m� sign�l %d +-�%s: p�i p�etypov�n� %d do�lo k chyb� znam�nka +-�%s: <mb_cur_max> mus� b�t v�t�� ne� <mb_cur_min> +-�%s: preprocesor jazyka C skon�il s v�stupn�m k�dem %d +-�%s: preprocesor jazyka C ukon�en sign�lem %d +-�%s: %s nelze vytvo�it: %s +-�%s: Adres�� %s nelze vytvo�it: %s +-�%s: Odkaz na %s z %s nelze vytvo�it: %s +-�%s: %s nelze otev��t: %s +-�%s: %s nelze smazat: %s +-�%s: Chyba p�i uzav�r�n� %s: %s +-�%s: Chyba p�i �ten� %s +-�%s: Chyba p�i z�pisu %s +-�%s: Chyba p�i z�pisu na �%s: ��dek Leap v souboru nep�estupn�ch sekund %s +-�%s: Pam� vy�erp�na: %s +-�%s: P�ep�na� -L zad�n v�ce ne� jednou +-�%s: P�ep�na� -d zad�n v�ce ne� jednou +-�%s: P�ep�na� -l zad�n v�ce ne� jednou +-�%s: P�ep�na� -p zad�n v�ce ne� jednou +-�%s: P�ep�na� -y zad�n v�ce ne� jednou +-�%s: P��li� mnoho argument� +-�%s: �as posledn� zm�ny souboru nelze zjistit�%s: p��kaz byl '%s', a jeho v�sledek byl %d +-�%s: chyba ve stavov�m automatu�%s: nezn�m� p�ep�na� -- %c +-�%s: nezn�m� p�ep�na� -- %c +-�%s: p�ep�na� `%c%s' mus� b�t zad�n bez argumentu +-�%s: p�ep�na� `%s' nen� jednozna�n� +-�%s: p�ep�na� `%s' vy�aduje argument +-�%s: p�ep�na� `--%s' mus� b�t zad�n bez argumentu +-�%s: p�ep�na� `-W %s' mus� b�t zad�n bez argumentu +-�%s: p�ep�na� `-W %s' nen� jednozna�n� +-�%s: p�ep�na� vy�aduje argument -- %c +-�%s: v�stup by p�epsal %s +-�%s: fat�ln� chyba: Nep��pustn� l_hodnota %d +-�%s: p�ed�asn� konec souboru�%s: nelze otev��t �%s: nezn�m� p�ep�na� `%c%s' +-�%s: nezn�m� p�ep�na� `--%s' +-�%s: Pou�it�: %s [ -s ] [ -v ] [ -l lok�ln�_�as ] +- [ -p posixov�_pravidla ] [ -d adres�� ] [ -L p�estupn�ch_sekund ] +- [ -y typ_roku ] [ soubor ... ] +-�%s: Pou�it�: %s [ -v ] [ -c limit ] �asov�_p�smo ... +-�%s: b�hem z�pisu v�stupu: �(CHYBA PROGRAMU) Nezn�m� verze!?�(CHYBA PROGRAMU) P�ep�na� m�l b�t rozpozn�n!?�(Nezn�m� objekt) +-�(nezn�m� chyba p�i ov��ov�n� toto�nosti - %d)�(?)�*** Ze souboru `%s' byly odstran�ny lad�c� informace: podrobn� anal�za +-nen� mo�n� +-�*standardn� vstup*�-o V�STUPN�_SOUBOR [VSTUPN�_SOUBOR]... +-[ V�STUPN�_SOUBOR [VSTUPN�_SOUBOR]...]�Po�kozen� sekce .lib v a.out�; podverze = %lu, verze = %lu�; d�vod = �<%s> a <%s> jsou zak�zan� n�zvy pro rozsah�znak <SP> nesm� ve t��d� `%s' b�t�znak <SP> ve t��d� `%s' nen��?�Ne�sp�n� ukon�en (SIGABRT)�P��stupov� pr�va: �Pou�it� po�kozen� sd�len� knihovny�Adresa ji� je u��v�na�T��da adres nen� po��ta�em podporov�na�T��da adres nen� protokolem podporov�na�Chyba p�i zve�ejn�n��Bud�k (SIGALRM)�P��li� dlouh� seznam argument��Pokus o odstran�n� nepr�zdn� tabulky�Pokus o pou�it� p��li� mnoha sd�len�ch knihoven�Ov��en� toto�nosti bylo �sp�n��Ov��en� toto�nosti bylo ne�sp�n��POCHYBN� OBJEKT +-�Chybn� adresa�Chybn� deskriptor souboru�Chybn� form�t fontu�Chybn� zpr�va�Chybn� vol�n� syst�mu (SIGSYS)�Chybn� hodnota ai_flags�P�esn� soulad s POSIX�Bin�rn� data +-�Vy�adov�no blokov� za��zen��Probl�m p�i vol�n� poll pro v�esm�rov� vys�l�n��P�eru�ena roura (SIGPIPE)�Chyba na sb�rnici (neplatn� adresa) (SIGBUS)�CDS�P�ekro�en �asov� limit pro procesor (SIGXCPU)��ivotnost cache vypr�ela�K pot�ebn� sd�len� knihovn� nelze p�istoupit�K serveru obsluhuj�c�mu tuto dom�nu se nelze p�ipojit�S portmapperem nelze komunikovat�S ypbind nelze komunikovat�S ypserv nelze komunikovat�Nelze alokovat pam��Po�adovanou adresu nelze p�i�adit�Soket pro v�esm�rov� rpc vys�l�n� nelze vytvo�it�Sd�lenou knihovnu nelze p��mo spustit�V�ce ne� jeden p��znak tvorby souboru nelze pou��t! +-�Odpov�� na v�esm�rov� vys�l�n� nep�i�la�Slu�bu nelze registrovat�Spojen� bylo p�eru�eno�V�esm�rov� paket nelze poslat�Volbu SO_BROADCAST pro soket nelze nastavit�V�ce ne� jeden vstupn� soubor nelze zadat! +-�P��znaky netid a inetd nelze pou��t sou�asn�! +-�P��znak netid nelze bez TIRPC pou��t! +-�P�i pou�it� nov�ho stylu nelze p��znaky tabulky pou��t! +-���slo kan�lu mimo povolen� rozsah�Odd�lova� znak� : %c +-�Potomek skon�il (SIGCHLD)�Opr�vn�n� klienta je neposta�uj�c��Sloupce : +-�Chyba komunikace p�i vys�lan��Kompiluje definice n�rodn�ho prost�ed�.�Po��ta� koupil farmu�V�po�et velkosti tabulky pro t��dy znak� (m��e chv�li trvat)...�V�po�et velkosti tabulky pro informace o �azen� (m��e chv�li trvat)...�Spojen� odm�tnuto�Spojen� zru�eno druhou stranou�Spojen� bylo p��li� dlouho neaktivn��Je pokra�ov�no (SIGCONT)�Konvertuje zadan� soubory z jednoho k�dov�n� do druh�ho.�P�ev�d� kl��e na mal� p�smena� Copyright (C) %s Free Software Foundation, Inc. +- Toto je voln� programov� vybaven�; podm�nky pro kop�rov�n� a roz�i�ov�n� +-naleznete ve zdrojov�ch textech. Toto programov� vybaven� je zcela BEZ Z�RUKY, +-a to i bez z�ruky PRODEJNOSTI nebo VHODNOSTI PRO N�JAK� KONKR�TN� ��EL. +-��urn�lov� (log) soubor "%s" nelze vytvo�it�Vytvo�� hlavi�kov� soubor N�ZEV pro jazyk C obsahuj�c� definice symbol��Vytvo�� v�stupn� soubor i p�i v�skytu varov�n��Vytv��� jednoduch� datab�ze typu DB z textov�ho vstupu.��as vytvo�en� : %s�DES z�znam pro s��ov� jm�no %s nen� jednozna�n� +-�ADRES�� +-�DNANS�DNS�Datab�ze pro tabulku neexistuje�Datab�ze ji� je pou��v�na�Implicitn� p��st. pr�va : +-�C�lovou adresu je nutn� zadat�Za��zen� nen� proud�Za��zen� nen� nakonfigurov�no�Za��zen� nebo zdroj ji� jsou pou��v�ny�Diffie-Hellmann (bit�: %d) +-�Adres�� : %s +-�Adres�� nen� pr�zdn��P�ekro�ena diskov� kv�ta�Nespou�t� samostatn� proces a vypisuje zpr�vy na aktu�ln�m termin�lu�B�hem tvorby datab�ze nevypisuje zpr�vy�Nepou��v� existuj�c� katalog, vytvo�� nov� v�stupn� soubor�Dom�na nen� p�ipojena�EMT past (SIGEMT)�Z�ZNAM +-��ifrovan� data +-�Nesoulad z�znamu s tabulkou�Chyba v subsyst�mu RPC�Chyba p�i p��stupu k souboru studen�ho startu NIS+. Je NIS+ nainstalov�no?�Chyba z nezn�m�ho chybov�ho syst�mu: �Chyba b�hem komunikace s procedurou zp�tn�ho vol�n��Chyba: soubor .netrc je �iteln� i pro ostatn�.�Pln� st�edisko�Chybn� form�t spustiteln�ho souboru�FAT�LN� CHYBA: syst�m nedefinuje `_POSIX2_LOCALEDEF'�SOUBOR obsahuj�c� mapov�n� symbolick�ch n�zv� na UCS4 hodnoty�Chyba (bl��e nespecifikovan�)�Deskriptor souboru se nach�z� v chybn�m stavu�Soubor ji� existuje�Vz�jemn� zablokov�n� p�i zamykan� souboru�P��li� dlouh� jm�no souboru�P�ekro�en limit d�lky souboru (SIGXFS2)�Soubor je p��li� velk��Chyba z�et�zen� prvn�/dal���V�jimka matematick�ho koprocesoru (SIGFPE)�Adres�� vy�aduje �plnou resynchronizaci�Funkce nen� implementov�na�SKUPINA +-�Smet� v ARGP_HELP_FMT: %s� Generuje katalog zpr�v.\vJe-li VSTUPN�_SOUBOR -, vstup bude na�ten ze +-standardn�ho vstupu. Je-li V�STUPN�_SOUBOR -, v�stup bude zaps�n na standardn� +-v�stup. +-�Obecn� chyba syst�mu�Z�sk�n� ur�it�ch informac� o n�rodn�m prost�ed�.�Vyp��e kr�tk� n�vod na pou�it��Vyp��e tuto n�pov�du�Dobrovoln� chyba�Skupina : %s +-�P��znaky skupiny :�Z�znam skupiny pro skupinu "%s.%s": +-�Po�k�n� SECS sekund (implicitn� 3600)�Odpojen termin�l (SIGHUP)�"%d" nebylo v cache pam�ti pro skupiny nalezeno!�"%d" nebylo v cache pam�i pro hesla nalezeno!�"%s" nebylo v cache pam�ti pro skupiny nalezeno!�"%s" nebylo v cache pam�i pro po��ta�e nalezeno!�"%s" nebylo v cache pam�i pro hesla nalezeno!�Po��ta� nen� v provozu�N�zev po��ta�e se nepoda�ilo nal�zt�Vstup/V�stup mo�n� (SIGIO)�VSTUPN�_SOUBOR V�STUPN�_SOUBOR +--o V�STUPN�_SOUBOR VSTUPN�_SOUBOR +--u VSTUPN�_SOUBOR�IOT past (SIGIOT)�IVY�Identifik�tor odstran�n�Nedovolen� instrukce (SIGILL)�Nedovolen� typ objektu pro operaci�Nedovolen� nastaven� pozice�Nevhodn� typ nebo form�t souboru�Pro toto za��zen� nevhodn� ioctl�Nevhodn� operace pro proces na pozad����dost o informaci (SIGINFO)�Informace:�Vstupn� soubory:�Zad�n� vstupn�/v�stupn�ho form�tu:�Chyba vstupu/v�stupu�Vnit�n� chyba NIS�Vnit�n� chyba ypbind�P�eru�en� (SIGINT)�P�eru�en� vol�n� syst�mu�P�eru�en� vol�n� syst�mu by m�lo b�t znovu spu�t�no�Pro operaci neplatn� objekt�Nep��pustn� argument�Neplatn� zp�tn� odkaz�Nep��pustn� n�zev t��dy znak��Neplatn� opr�vn�n� klienta�Neplatn� ov��en� klienta�Pro �azen� nep��pustn� znak�Nep��pustn� obsah \{\}�Odkaz mezi za��zen�mi nen� p��pustn��Nep��pustn� v�m�na�Nep��pustn� nebo nekompletn� v�cebajtov� nebo �irok� znak�Nep��pustn� p�edchoz� regul�rn� v�raz�Nep��pustn� konec rozsahu�Nep��pustn� regul�rn� v�raz�Neplatn� k�d ��dosti�Nep��pustn� deskriptor ��dosti�Neplatn� ov��en� serveru�Neplatn� slot�je adres��em�je soubor zadan�ho typu�Kerberos. +-�Zabit (SIGKILL)�ODKAZ +-�LOK�LN� z�znam pro UID %d v adres��i %s nen� unik�tn� +-��rove� 2 - zastaveno��rove� 2 - nen� synchronizov�no��rove� 3 - zastaveno��rove� 3 - nastaveno na v�choz� hodnoty�Odkaz odkazuje na nedovolen� n�zev�Odkaz byl zni�en���slo odkazu mimo rozsah�Typ odkazovan�ho objektu : �Odkazuje na : %s +-�Jm�no m�stn� dom�ny nen� nastaveno�Chyba p�i p�id�lov�n� m�stn�ch prost�edk��Po��ta� nen� v s�ti�Chybn� formovan� nebo nep��pustn� n�zev� Argumenty po�adovan� dlouh�mi p�ep�na�i, jsou tak� po�adov�ny jejich kr�tk�mi formami.�Hlavn� server: +-�Hlavn� server je zanepr�zdn�n, �pln� p�enos byl p�epl�nov�n.�Alokace pam�ti nebyla �sp�n��Pam� vy�erp�na�P��li� dlouh� zpr�va�Chyb�j�c� nebo chybn� formovan� atribut��as zm�ny : %s�Zm�na nebyla provedena�Operace zm�ny nebyla provedena �sp�n��Zm�na v�stupn�ho form�tu:�Pokus o spojen� p�es v�ce uzl��N�ZEV�N�ZEV +-[-a|-m]�NIS�Rozd�ln� verze NIS klienta a serveru - slu�bu nelze poskytnout�NIS map datab�ze je chybn��NIS+ operace nebyla provedena �sp�n��NIS+ server nen� dostupn��Slu�ba NIS+ nen� dostupn� nebo nainstalovan����DN� OBJEKT +-�PO�ET�N�zev : '%s' +-�NSC (Name Service Cache) d�mon.�Jm�no nen� t�mto serverem obsluhov�no�Jm�no v s�ti nen� jednozna�n��Nezn�m� jm�no nebo slu�ba�Jm�no/z�znam nejsou jednozna�n��Pojmenovan� objekt nen� prohled�vateln��Je t�eba ov��ova�e�S�� zru�ila spojen� (probl�m se vzd�len�m po��ta�em)�S��ov�n� je mimo provoz�S�� nen� dostupn��CSI struktura nen� dostupn��XENIX semafory nejsou dostupn��Jm�no po��ta�e nem� p�i�azenu adresu�Jm�no nem� p�i�azenu adresu���dn� anode�Pro V/V vyrovn�vac� pam� nen� voln� pam����dn� potomek neexistuje�Data nejsou k dispozici�Na serveru nen� m�sto pro soubory�Z�mky nejsou k dispozici���dn� shoda�M�dium nebylo nalezeno���dn� zpr�va ��dan�ho typu���dn� dal�� z�znamy v map datab�zi�P�edchoz� regul�rn� v�raz neexistuje���dn� vzd�len� programy nejsou registrov�ny. +-�K po��ta�i neexistuje cesta�Na za��zen� ji� nen� voln� m�sto�Takov� za��zen� neexistuje�nen� souborem ani adres��em�Tento kl�� v map� neexistuje�Tato mapa se v dom�n� serveru nenach�z��Tento proces neexistuje�Spat�en prostor n�zv� mimo NIS+�Neopraviteln� chyba p�i vyhodnocen� n�zvu���dn�. +-�Nebylo nalezeno, takov� jm�no neexistuje�Nejde o pojmenovan� XENIX soubor�nen� adres��em�Nebylo nalezeno�Nen� hlavn� server pro tuto dom�nu�Nen� vlastn�kem�Po�et sloupc� : %d +-�Po�et objekt� : %u +-���seln� rozsah mimo defini�n� obor funkce���seln� v�sledek mimo rozsah�Objekt #%d: +-�N�zev objektu : %s +-�Typ objektu : �Objekt je vzd�len��Objekt se stejn�m n�zvem ji� existuje�Lich� po�et uvozovek�Tento p�ep�na� je dostupn� pouze superu�ivateli!�Operace ji� prob�h��Operace nen� povolena�Operace nen� podporov�na�Operace prob�h��Operace byla p�eru�ena�Ji� nejsou voln� proudy���zen� v�stupu:�V�b�r v�stupu:�Vlastn�k : %s +-�SOUKROM� +-�Bal�k nen� nainstalov�n�Chyba anal�zy: %s���ste�n� �sp�ch�Do�l� objekt nen� na serveru t�mt� objektem�P��stup odm�tnut�V�padek nap�jen� (SIGPWR)�P�ed�asn� konec regul�rn�ho v�razu�Vyp��e obsah datab�zov�ho souboru, jeden z�znam na ��dek�Vyp��e statistiky aktu�ln� konfigurace�Vyp��e v�ce informac� o pr�b�hu�Vyp��e ozna�en� verze programu�Pravd�podobn� �sp�ch�Pravd�podobn� nebylo nalezeno�Profilovac� �asova� vypr�el (SIGPROF)�Ovlada� protokolu nep�ipojen�Chyba protokolu�Rodina protokol� nen� podporov�na�Protokol nen� k dispozici�Protokol nen� podporov�n�Protokol nepodporuje sokety�Zak�zan� ot�zka pro danou tabulku�Konec (SIGQUIT)�RFS-specifick� chyba�Chybn� RPC procedura pro program�Selhal RPC p�i NIS operaci�RPC program nen� k dispozici�Chybn� verze RPC programu�RPC struktura je chybn��Chybn� verze RPC�RPC: (nezn�m� chybov� k�d)�RPC: Chyba p�i ov��ov�n� toto�nosti�RPC: V�sledek nelze dek�dovat�RPC: Argumenty nelze zak�dovat�RPC: Chyba (bl��e neur�en�)�RPC: Nekompatibiln� verze RPC�RPC: Chyba portmapperu�RPC: Procedura nen� k dispozici�RPC: Program nen� registrov�n�RPC: Program nen� k dispozici�RPC: Nesouhlas� program nebo verze�RPC: Chyba vzd�len�ho syst�mu�RPC: Server nem��e dek�dovat argumenty�RPC: �sp�ch�RPC: �asova� vypr�el�RPC: Nelze p�ijmout�RPC: Nelze vyslat�RPC: Nezn�m� po��ta��RPC: Nezn�m� protokol�RSA (bit�: %d) +-�RTLD_NEXT je pou�ito pro k�d, kter� nen� dynamicky zaveden�P�e�ten� a vyps�n� profilovac�ch dat sd�len�ho objektu.�Na�ten� �daj� o konfiguraci ze souboru N�ZEV�Syst�m soubor� je pouze pro �ten��Real-timeov� sign�l %d�Regul�rn� v�raz je p��li� velk��Chyba vstupu/v�stupu na vzd�len�m po��ta�i�Vzd�len� adresa byla zm�nila�Odstra�te heslo nebo zaka�te �ten� souboru ostatn�m.�Znovuotev�en� sd�len�ho objektu `%s' nebylo �sp�n��Kopie: +-� Chyby v programu oznamujte na adrese %s (pouze anglicky), +-p�ipom�nky k p�ekladu zas�lejte na adresu <cs@li.org> (�esky). +-� Chyby v programu oznamujte pomoc� skriptu `glibcbug' na adresu <bugs@gnu.org> +-(pouze anglicky), p�ipom�nky k p�ekladu zas�lejte na <cs@li.org> (�esky). +-�Chybn� argumenty ��dosti�Resolver vrac� stav 0 (bez chyby)�Vnit�n� chyba resolveru�Bylo zabr�n�no vz�jemn�mu zablokov�n� prost�edk��Prost�edek byl ztracen�Prost�edek je do�asn� nep��stupn��V�sledky zasl�ny procedu�e zp�tn�ho vol�n��SD�LEN�_OBJEKT [PROF_DATA]�SUNYP�Prohled�vac� cesta : %s +-�Neopr�vn�n� p��stup do pam�ti (SIGSEGV)�Server je zanepr�zdn�n, zkuste to znovu�Pam� serveru byla vy�erp�na�Server odm�tl opr�vn�n��Server odm�tl ov��en��Jm�no serveru nen� pro ai_socktype podporov�no�Nastav� n�zev programu�Zastaven� serveru�Sign�l 0�Soketov� operace na objektu, kter� nen� soketem�Typ soket nen� podporov�n�Software zp�sobil ukon�en� spojen� (abort)�Lituji, nejste superu�ivatel +-�Na�te zdrojovou definici n�rodn�ho prost�ed� ze SOUBORu�Chyba srmount�Poru�en z�sobn�k (SIGSTKFLT)"�Zastaral� odkaz na NFS soubor�Spust� PO�ET vl�ken�Stav : %s +-�Pozastaven (SIGTSTP)�Pozastaven (SIGSTOP)�Pozastaven (tty input) (SIGTTIN)�Pozastaven (tty output) (SIGTTOU)�Chyba proudov� roury�Struktura pot�ebuje opravu��sp�ch�Potla�� varovn� a informa�n� zpr�vy�Symbolick� n�zvy znak� budou �teny ze SOUBORu (znakov� sady)�Chyba syst�mu�Syst�mov� informace:�P�id�len� syst�mov�ho prost�edku nebylo �sp�n��Syst�mov� adres�� pro znakov� sady: : %s +- reperto�ry znak� : %s +- lokaliza�n� soubory : %s +-%s�TABULKA +-�Typ tabulky : %s +-�Do�asn� chyba p�i vyhodnocov�n� jm�na�Ukon�en (SIGTERM)�Soubor ji� je pou��v�n� N�sleduj�c� seznam obsahuje v�echny zn�m� znakov� sady. To nutn� neznamen�, +-�e v�echny kombinace t�chto n�zv� mohou b�t pou�ity pro argumenty Z a DO. +-Jedna znakov� sada m��e b�t uvedena pod v�cer�mi n�zvy (p�ezd�vkami). +- N�kter� z n�zv� nejsou oby�ejn� �et�zce, ale regul�rn� v�razy, kter� +-ur�uj� mo�n� parametry programu. +- +- ��ivotnost : ��asova� vypr�el�P��li� mnoho atribut��P��li� mnoho �rovn� symbolick�ch odkaz��P��li� mnoho odkaz��P�ekro�en limit po�tu otev�en�ch soubor��V cel�m syst�mu je p��li� mnoho otev�en�ch soubor��P�ekro�en limit po�tu proces� aktu�ln�ho u�ivatele�P��li� mnoho odkaz� - nelze spojit�P��li� mnoho u�ivatel��Trasovac�/lad�c� past (SIGTRAP)�Koncov� zp�tn� lom�tko�P�ekladatel zem�el�Koncov� komunika�n� bod je u� p�ipojen�Koncov� komunika�n� bod nen� p�ipojen�V�ce informac� z�sk�te p��kazy `%s --help' nebo `%s --usage'. +-�Zkou�� se %s... +-�Typ : %s +-�NEZN�M��Toto�nost NIS+ klienta nelze ov��it�Toto�nost NIS+ serveru nelze ov��it�Zp�tn� vol�n� nelze vytvo�it�Na serveru nelze vytvo�it proces�Nezn�m� (typ = %d, bit� = %d) +-�Nezn�m� kl��ov� slovo v .netrc: %s�Nezn�m� chybov� k�d slu�by NIS�Nezn�m� datab�ze: %s +-�Nezn�m� chyba�Nezn�m� chyba �Nezn�m� po��ta��Nezn�m� objekt�Nezn�m� volba: %s %s %s�Nezn�m� chyba resolveru�Nezn�m� chyba serveru�Nezn�m� sign�l %d�Nezn�m� chyba syst�mu�Nezn�m� chyba ypbind�Nep�rov� ( or \(�Nep�rov� ) or \)�Nep�rov� [ or [^�Nep�rov� \{�Nezn�m� prom�nn� `%s'�Nal�hav� V/V situace (SIGURG)�Pou�it�:�Pou�it�: %s jm�no_prom�nn� [cesta] +-�Pou�it�: rpcinfo [ -n ��slo_portu ] -u po��ta� ��slo_programu [ ��slo_verze ] +-�U�ivatelem definovan� sign�l 1 (SIGUSR1)�U�ivatelem definovan� sign�l 2 (SIGUSR2)�Hodnota je p��li� velk� pro dan� datov� typ�Virtu�ln� �asova� vypr�el (SIGVTALRM)�Vykonan� p��kaz dal podivn� v�sledek�Okno se zm�nilo (SIGWINCH)�Vyps�n� n�zv� dostupn�ch znakov�ch sad�Vyps�n� n�zv� dostupn�ch n�rodn�ch prost�ed��Vyps�n� n�zv� vybran�ch kategori��Vyps�n� n�zv� vybran�ch kl��ov�ch slov�Zaps�n� v�stup do souboru SOUBOR�Autor: %s. +-�Chybn� typ m�dia�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Ano, 42 je smysl �ivota�Tentokr�t jste to skute�n� zvoral�Koncov� �as pokra�ovac�ho ��dku Zone nen� v�t�� ne� koncov� �as p�edch�zej�c�ho ��dku�[SOUBOR...]�Definice `%1$s' nekon�� `END %1$s'�`%s' nejsou spr�vn� profilovac� data pro `%s'�`-1' mus� b�t posledn�m �dajem v polo�ce `%s' kategorie `%s'�`...' m��e b�t pou�ito jen v polo�k�ch `...' a `UNDEFINED'�Za prvn�m argumentem pro `collating-element' je o�ek�v�no `from'��et�zec `z-�eho' v deklaraci prvku �azen� obsahuje nezn�m� znak�ai_family nen� podporov�n�ai_socktype nen� podporov�n�ji� b���argument pro <%s> mus� b�t jednoznakov��argument pro `%s' mus� b�t jednoznakov��auth_none.c - Fat�ln� chyba marshallingu�authunix_create: nedostatek pam�ti +-�chybn� argument�chybn� vlastn�k�pr�zdn� polo�ka OD v ��dku Link�pr�zdn� polo�ka DO v ��dku Link�blok uvoln�n dvakr�t +-�pochybn� mcheck_status, knihovna je chybn� +-�v�esm�rov� vys�l�n�: ioctl (�ten� konfigurace rozhran�)�v�esm�rov� vys�l�n�: ioctl (�ten� p��znak� rozhran�)�p�ete�en� vyrovn�vac� pam�ti�cache_set: ne�lo alokovat vyrovn�vac� pam� pro rpc�cache_set: alokace nov� polo�ky cache se nezda�ila�cache_set: ob� nenalezena�zkratku �asov�ho p�sma pro pou�it� ihned po �asov�m �daji nelze nel�zt���slo procedury %d nelze znovu p�id�lit +-�nelze vykonat `stat' pro soubor n�rodn�ho prost�ed� `%s'�pam� pro symboly nelze alokovat�intern� deskriptor nelze vytvo�it�intern� deskriptory nelze vytvo�it�soket nem��e p�ij�mat spojen�: %s�preprocesor jazyka C nelze nal�zt: %s +-���dn� preprocesor jazyka C (cpp) nelze nal�zt +-���dost star� verze (%d) nelze zpracovat; aktu�ln� verze je %d�prvek �azen� `%.*s' nelze vlo�it�do v�sledn� tabulky nelze vkl�dat�nov� symbol �azen� nelze vlo�it: %s�profilovac� data nelze na��st�nelze otev��t�`%s' nelze otev��t�datab�zov� soubor `%s' nelze otev��t: %s�vstupn� soubor `%s' nelze otev��t�soubor `%s' definice n�rodn�ho prost�ed� nelze otev��t�v�stupn� soubor nelze otev��t�v�stupn� soubor `%s' nelze otev��t�v�stupn� soubor `%s' pro kategorii `%s' nelze otev��t�soket nelze otev��t: %s�zadan� po�ad� �azen� nelze zpracovat�adres�� `%s' znakov�ch sad nelze na��st�konfigura�n� soubor nelze na��st (fat�ln�)�od klienta nelze ��st�hlavi�ku ze souboru `%s' nelze p�e��st�adres�� `%s' n�rodn�ch prost�ed� nelze na��st�soubor `%s' n�rodn�ho prost�ed� nelze ��st�reperto�r znak� `%s' nelze ��st�statistick� �daje nelze na��st�stat() nelze na soubor `%s' vykonat stat(): %s�v�stupn� soubory nelze do `%s' zapsat�v�sledek nelze zapsat: %s�statistiku nelze zapsat: %s�ke klientovi nelze zapisovat��daje kategorie po�adov�ny v�ce ne� jednou - to by se nem�lo st�t�znak %s'%s' ve t��d� `%s' mus� b�t ve t��d� `%s'�znak %s'%s' ve t��d� `%s' nesm� b�t ve t��d� `%s'�znak <SP> nen� ve znakov� sad� definov�n�znak `%s', pot�ebn� jako implicitn� hodnota, nen� definov�n�t��da znak� `%s' ji� je definov�na�znakov� sada `%s' ji� je definov�na�soubor `%s' znakov� sady nebyl nalezen�clnt_raw.c - Fat�ln� chyba p�i serializaci hlavi�ky.�clnttcp_create: nedostatek pam�ti +-�clntudp_create: nedostatek pam�ti +-�clntunix_create: nedostatek pam�ti +-�prvek �azen� `%.*s' uveden v�ce ne� jednou - ��dek ignorov�n�symbol �azen� `%.*s' uveden v�ce ne� jednou - ��dek ignorov�n�po `%s' je o�ek�v�n symbol �azen��p�ipojen� na adresou %s: �o�ek�v�na konstanta nebo identifik�tor�konverze z `%s' do `%s' nen� podporov�na�konverze zastavena kv�li probl�mu p�i z�pisu v�stupu�rpc server nebylo mo�no vytvo�it +-�program %d verze %d nebylo mo�no zaregistrovat +-�datab�ze [kl�� ...]�implicitn� soubor `%s' znakov� sady nebyl nalezen�p��znak sm�ru v �et�zci (%d) polo�ky `era' v kategorii `%s' nen� '+' ani '-'�p��znak sm�ru v �et�zci (%d) polo�ky `era' v kategorii `%s' nen� jednoznakov��duplicitn� n�zev znaku `%s'�duplicitn� definice prvku �azen��duplicitn� definice znaku `%.*s'�duplicitn� kl���duplicitn� definice sady�duplicitn� ozna�en� �asov�ho p�sma %s (soubor "%s", ��dek %d)�duplicitn� identifik�tor zpr�vy�duplicitn� ��slo zpr�vy�pr�zdn� znakov� �et�zec�pr�zdn� v�hov� n�zev - ��dek ignorov�n�enablecache: cache ji� je povolena�enablecache: cache nebylo mo�no alokovat�enablecache: nebylo mo�no alokovat m�sto pro data v cache�enablecache: nebylo mo�no alokovat frontu pro cache�v�stupn� k�dov�n��k�dov�n� vstupn�ho textu�koncov� bod `...' je v�t�� ne� po��te�n��chyba b�hem uzav�r�n� vstupu `%s'�chyba b�hem uzav�r�n� v�stupn�ho souboru�chyba b�hem uzav�r�n� souboru profilovac�ch dat�chyba b�hem vkl�d�n� prvku �azen� do ha�ovac� tabulky�chyba b�hem vkl�d�n� do hashovac� tabulky�chyba b�hem �ten� vstupu�jako argument pro `copy' o�ek�v�n �et�zec�o�ek�van� pokra�ovac� ��dek nebyl nalezen�sd�len� objekt `%s' se nepoda�ilo zav�st�data symbol� se nepoda�ila na��st�soubor profilovac�ch dat se nepoda�ilo mmap-ovat�konverze se nezda�ila�chyba b�hem z�pisu dat kategorie `%s'�fcntl: F_SETFD�polo�ka `%s' kategorie `%s' nen� definov�na�polo�ka `%s' kategorie `%s' nen� definov�na�soubor '%s' ji� existuje a mohl b�t p�eps�n +-�hodnota z-�eho pro `collating-element' mus� b�t �et�zec�funkce fstat() skon�ila s chybou�smet� na konci specifikace k�du znaku�smet� na konci ��sla�smet� na konci hodnoty posunut� v �et�zci (%d) polo�ky `era' kategorie `%s'�smet� na konci po��te�n�ho data v �et�zci (%d) polo�ky `era' kategorie `%s'�smet� na konci koncov�ho data v �et�zci (%d) polo�ky `era' kategorie `%s'�vytvo�� graf vol�n��vytvo�� jednoduch� profil s po�ty a tiky�get_myaddress: ioctl (�ten� konfigurace rozhran�)�Z�sk�v� z�znamy z administrativn� datab�ze.�handle_request: ��dost p�ijata (verze = %d)�pevn� odkaz nevytvo�en, pou�it symbolick��na soubor se odkazuje v�ce pevn�ch odkaz��chybn� polo�ka KOREKCE na ��dku Leap�chybn� polo�ka Rolling/Stationary na ��dku Leap�nepovolen� znak v �et�zci�nepovolen� znak v souboru: �nepovolen� prvek �azen��nepovolen� definice�zad�no nep��pustn� k�dov�n��chybn� escape-sekvence na konci �et�zce�nepovolen� vstupn� sekvence na pozici %ld�nepovolen� n�zvy pro rozsah znak��nepovolen� nettype: '%s' +-�chybn� hodnota posunut� v �et�zci (%d) polo�ky `era' kategorie `%s'�nepovolen� ��slo sady�neplatn� po��te�n� datum v �et�zci (%d) polo�ky `era' kategorie `%s'�neplatn� koncov� datum v �et�zci (%d) polo�ky `era' kategorie `%s'�implementa�n� omezen�: maxim�ln� po�et t��d znak� je %d�implementa�n� omezen�: maxim�ln� po�et znakov�ch sad je %d�nekompletn� znak nebo shift sekvence na konci vyrovn�vac� pam�ti�chybn� form�tovan� soubor�vstupn� ��dek nezn�meho typu�vnit�n� chyba (nep��pustn� deskriptor)�vnit�n� chyba - addtype vol�n s chybn�m isdst�vnit�n� chyba - addtype vol�n s chybn�m ttisgmt�vnit�n� chyba - addtype vol�n s chybn�m ttisstd�vnit�n� chyba ve funkci %s na ��dku %u�neplatn� posunut� v��i UTC�neplatn� form�t zkratky�neplatn� den m�s�ce�neplatn� koncov� rok�neplatn� p�estupn� rok�neplatn� m�d pro dlopen()�neplatn� n�zev m�s�ce�neplatn� ulo�en� �as�neplatn� po��te�n� rok�neplatn� denn� �as�neplatn� n�zev dne�d�lka kl��e v ��dosti je p��li� dlouh�: %Zd���dek za '...' mus� obsahovat definici znaku���dek p�ed '...' neobsahuje definici znaku���dek je p��li� dlouh��vyp��e v�echny zn�m� znakov� sady�soubor `%s' n�rodn�ho prost�ed� pou�it� v p��kazu `copy' nebyl nalezen�funkce lstat() skon�ila s chybou�deformovan� ��dek - ignorov�n�chyba p�i mapov�n� tabulky �et�zc� z hlavi�ky sekce do pam�ti�chyba p�i mapov�n� hlavi�ek sekc� do pam�ti�pam� p�ed za��tkem p�id�len�ho bloku p�eps�na +-�pam� za koncem p�id�len�ho bloku p�eps�na +-�pam� vy�erp�na�pam� vy�erp�na +-�pam� je konzistentn�, knihovna je chybn� +-��et�zec (%d) polo�ky `era' kategorie `%s' je chybn�ho form�tu��et�zec (%d) polo�ky `era' kategorie `%s' neobsahuje jm�no �ry�bezejmenn� pravidlo�p�vodn� ani c�lov� k�dov�n� nen� zad�no�netname2user: (nis+ lookup): %s +-�netname2user: DES z�znam pro %s v adres��i %s nen� jednozna�n��netname2user: LOK�LN� z�znam pro %s v adres��i %s nen� jednozna�n��netname2user: '%s' nen� seznam id skupin.�netname2user: hlavn� (principal) n�zev '%s' je p��li� dlouh��netname2user: nem�l bych m�t uid 0�dosud neregistrovan� program (%d) +-�hodnota <Uxxxx> nebo <Uxxxxxxxx> nebyla zad�na�v polo�ce `%s' v kategorii `%s' nen� korektn� regul�rn� v�raz: %s�pravidlu nevyhovuje ��dn� den v m�s�ci�chyb� definice symbolu `UNDEFINED'�n�zev souboru pro profilovac� data nebyl zad�n a sd�len� objekt `%s' nem� soname�p�i pou�it� `copy' nen� dovoleno pou��t ��dn� jin� kl��ov� slovo�v�stupn� soubor nebyl vytvo�en, proto�e se vyskytla varov�n��reperto�r znak� nebyl zad�n: nelze pokra�ovat���dn� symbolick� jm�no nebylo zad�no���dn� symbolick� jm�no nebylo pro konec rozsahu zad�no�symbol `%s' nem� definovanou v�hu�nen� oby�ejn�m souborem�konfigurace nscd: +- +-%15d lad�c� �rove� serveru +-�nscd neb��! +-�definici CHARMAP mohou n�sledovat pouze definice WIDTH�p�vodn� k�dov�n� nebylo pomoc� `-f' zad�no�v�stupn� soubor�pmap_getmaps probl�m s rpc�poll: chyba protokolu b�hem p��pravy okruhu +-�chyba preprocesoru�vyp��e seznam symbol� a po�et jejich pou�it��vypisuje informace o pr�b�hu�probl�my b�hem �ten� `%s'�profilovac� data `%s' nesouhlas� se sd�len�m objektem `%s'�program %lu nen� dostupn� +-�program %lu verze %lu nen� dostupn� +-�program %lu verze %lu je p�ipraven a �ek� +-�rcmd: poll (nastavov�n� stderr): %m +-�rcmd: soket: Voln� port nebyl nalezen +-�rcmd: write (nastavov�n� stderr): %m +-�registerrpc: nedostatek pam�ti +-�p�estupn� sekunda opakov�na�soubor `%s' reperto�ru znak� nebyl nalezen�rpcgen: chyba p�i vkl�d�n� do seznamu argument� +-�rpcgen: p��li� mnoho definic +-�rpcinfo: %s je nezn�m� po��ta� +-�rpcinfo: %s je nezn�m� slu�ba +-�rpcinfo: Registraci programu %s verze %s nelze zru�it +-�rpcinfo: v�esm�rov� vys�l�n� nebylo �sp�n�: %s +-�rpcinfo: s portmapperem se nelze spojit�stejn� jm�no pravidla je pou�ito ve v�ce souborech�ne�pln� �ten� kl��e ��dosti: %s�ne�pln� �ten� ��dosti: `%s'�ne�pln� z�pis v %s(): %s�soket: chyba protokolu p�i p��prav� okruhu +-�po�ad� �azen� `forward' a `backward' se navz�jem vylu�uj��uveden� v�hy pro symbol �azen� nem� v�znam�standardn� vstup�standardn� v�stup�nepovolen� po��te�n� datum v �et�zci (%d) polo�ky `era' kategorie `%s'�po��te�n� rok v�t�� ne� koncov��po��te�n� rok je pro ulo�en� p��li� velk��po��te�n� rok je pro ulo�en� p��li� mal��nepovolen� koncov� datum v �et�zci (%d) polo�ky `era' kategorie `%s'�svc_run: funkce select skon�ila s chybou�svc_tcp.c - p�i getsockname nebo listen vznikla chyba�svc_tcp.c - p�i vytv��en� tcp soketu vznikla chyba�svc_tcp: makefd_xprt: nedostatek pam�ti +-�svc_unix.c - p�i vytv��en� AF_UNIX soketu vznikla chyba�svc_unix.c - p�i getsockname nebo listen vznikla chyba�svc_unix: makefd_xprt: nedostatek pam�ti +-�svctcp_create: nedostatek pam�ti +-�svcudp_create - p�i getsockname vznikla chyba�svcudp_create: nedostatek pam�ti +-�svcudp_create: soket nelze vytvo�it�svcunix_create: nedostatek pam�ti +-�symbol pro v�ceznakov� prvek �azen� `%.*s' duplikuje definici prvku�symbol pro v�ceznakov� prvek �azen� `%.*s' duplikuje jin� prvek�symbol pro v�ceznakov� prvek �azen� `%.*s' duplikuje definici jin�ho symbolu�symbol pro v�ceznakov� prvek �azen� `%.*s' duplikuje definici symbolu�symbol pro v�ceznakov� prvek �azen� `%.*s' duplikuje symbolick� jm�no ve znakov� sad��syntaktick� chyba v definici %s: %s�syntaktick� chyba v direktiv� `order_start'�syntaktick� chyba v definici t��dy znak��syntaktick� chyba v definici konverze znak��syntaktick� chyba v definici po�ad� �azen��syntaktick� chyba v definici �azen��syntaktick� chyba v definici kategorie LC_CTYPE�syntaktick� chyba v definici nov� t��dy znak��syntaktick� chyba v definici nov� znakov� sady�syntaktick� chyba v definici n�rodn�ch zpr�v�syntaktick� chyba v definici n�rodn�ho prost�ed� pro pen�n� �daje�syntaktick� chyba v definici n�rodn�ho prost�ed� pro ��sla�syntaktick� chyba ve specifikaci po�ad��syntaktick� chyba v prologu: %s�syntaktick� chyba v definici reperto�ru znak�: %s�syntaktick� chyba v definici n�rodn�ho prost�ed� pro �as�syntaktick� chyba: nen� uvnit� sekce pro definici n�rodn�ho prost�ed��k�dov�n� c�le nebylo pomoc� `-t' zad�no�toto je prvn� definice��as men�� ne� nula�p�ete�en� �asu�v k�du znaku je p��li� m�lo bajt��v k�du znaku je p��li� mnoho bajt��definov�no p��li� mnoho znakov�ch t��d�p��li� mnoho p�estupn�ch sekund�p��li� mnoho lok�ln�ch �asov�ch typ��p��li� mnoho p�echod�?!�p��li� mnoho vah�p��li� mnoho nebo p��li� dlouh� zkratky �asov�ho p�sma�smet� na konci ��dku�probl�my p�i odpov�d�n� programu %d +-�dva ��dky za sebou obsahuj�c� `...' nejsou povoleny�zad�n jeden rok�vyrovn�vac� pam� pro vstup nelze alokovat�argumenty nelze uvolnit�nen� definov�no�nezn�m� znak `%s'�nezn�m� znak v polo�ce `%s' kategorie `%s'�nezn�m� direktiva �azen��nezn�m� direktiva `%s' - ��dek ignorov�n�nezn�m� chyba funkce iconv() (%d)�nezn�m� sada `%s'�nezn�m� symbol `%.*s' - ��dek ignorov�n��asov� p�smo bez pravidel�neukon�en� zpr�va�neukon�en� �et�zec�neukon�en� �et�zec�neukon�en� symbolick� jm�no�escape sekvence nen� cel��horn� mez rozsahu je men�� ne� doln��Pou�it�: %s vstupn�_soubor +-�pou�it� 29. �nora v nep�estupn�m roce�hodnota pro %s mus� b�t cel� ��slo�honota pro <%s> mus� b�t mezi 1 a 4�hodnota polo�ky `%s' kategorie `%s' nesm� b�t pr�zdn� �et�zec�hodnota <mb_cur_max> mus� b�t v�t�� ne� hodnota <mb_cur_min>�hodnota polo�ky `int_curr_symbol' kategorie `LC_MONETARY' neodpov�d� platn�mu jm�nu v ISO 4217�hodnota polo�ky `int_curr_symbol' kategorie `LC_MONETARY' m� chybnou d�lku�hodnoty polo�ky `%s' kategorie `%s' mus� b�t men�� ne� 127�b�hem p�ij�m�n� spojen�: %s�b�hem alokace z�znamu cache pam�ti�b�hem alokace z�znamu ha�ovac� tabulky�b�hem alokace kopie kl��e�b�hem otv�r�n� star�ho katalogu�b�hem p��pravy v�stupu�b�hem �ten� datab�ze�b�hem funkce stat() na soubor profilovac�ch informac��b�hem z�pisu datab�ze�ne�pln� z�pis�zapisovateln� nejen pro vlastn�ka�chybn� po�et argument���patn� po�et polo�ek v ��dku Leap��patn� po�et polo�ek v ��dku Link��patn� po�et polo�ek v ��dku Rule��patn� po�et polo�ek v pokra�ovac�m ��dku Zone��patn� po�et polo�ek v ��dku Zone�xdr_reference: nedostatek pam�ti +-�xdrrec_create: nedostatek pam�ti +-�yp_update: n�zev po��ta�e nelze konvertovat na s��ov� n�zev +-�yp_update: adresu serveru nelze zjistit +-� +\ No newline at end of file +diff -Naur ../glibc-2.1.3/po/de.mo glibc-2.1.3/po/de.mo +--- ../glibc-2.1.3/po/de.mo 2000-02-24 18:13:09.000000000 -0800 ++++ glibc-2.1.3/po/de.mo 1969-12-31 16:00:00.000000000 -0800 +@@ -1,476 +0,0 @@ +-���������������'���=������XR�����YR�����lR��M���R��E����R��&���S��(���:S�����cS�����tS������S������S������S������S������S������S��n�� +-T�����yU������U��"����U��"����U������U��:����U�����:V�����CV�����LV�����bV�����yV������V������V������V������V������V�����W�����.W�����HW�����eW�����}W������W������W������W������W������W��3����W��3���X��4���KX��.����X��%����X������X��&����X��%���Y�����6Y��%���MY��3���sY��,����Y��)����Y������Y��"���Z��!���:Z�����\Z�����sZ������Z������Z������Z������Z������Z��*����Z�����*[��&���D[��&���k[��&����[��&����[��&����[�����\�� ���\��$���@\�����e\������\������\��,����\������\��%����\��,���%]��-���R]�� ����]��&����]������]������]�����^����� ^�����;^�����[^������{^��2���_�����8_��"���X_��4���{_������_��#����_�� ����_��=����_�����.`��<���?`�����|`��'����`������`��)����`��(����`�� ��� a�����Aa�����Ca�����Ka��$���\a������a��)����a��(����a��/����a�����b�����+b�����7b�����Lb�����^b�����ub��#����b��=����b��/����b�����c�����0c�� ���Ec�����Sc�����_c�����wc������c������c������c������c������c������c������c�����d�����%d�����2d�����Hd�����_d�� ���kd�����ud�����yd�� ����d��&����d��&����d��-����d��!���e�����=e�����[e�����ye������e��&����e��%����e��0����e��!���.f�����Pf��!���hf��-����f������f��%����f��)����f��'���%g��%���Mg��&���sg������g������g������g������g������g�����h�����+h�����Hh��@���ah��D����h������h������h�����i�� ���(i��=���2i�����pi�������i�����Rj��7���qj��2����j��-����j����� +-k�����k��$���/k�� +-���Tk�����_k�����ek��!���ik������k��#����k������k������k������k�����l�����l�����,l�����Dl�����_l�����sl������l������l��3����l��-����l��2���m�����Dm�����Um�����^m�����em�����um������m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ���n�� ���n�� ���n�� ���#n�� ���-n�� ���7n�� ���An�� ���Kn�� ���Un�� ���_n�� ���in�����sn�����|n������n������n������n������n������n������n������n��<����n�����o��$���/o��)���To�� ���~o������o��1����o������o��8����o�����p�����)p�����Fp�����Rp�����hp������p������p������p������p������p������p��"���q�����'q�����@q�����Gq������dq������q�� ���r�����)r�����Dr�����Xr�����ir�� ���}r������r��$����r������r��"����r��%����r��"��� s��"���Cs��%���fs������s������s�� ����s������s��>����s�����t�����t�����t�����(t�����>t��!���Rt�����tt��!����t������t��.����t������t�����u�����u��"���u�����Bu�����Uu�����hu�� ���~u������u��+����u������u������u������u�����v�����+v�����Cv�����_v�����wv������v������v��1����v��$����v�����w�����(w�����Cw�����Xw�����sw������w������w������w������w������w�� +-����w������w������w��2���x�����5x�����Dx�����]x�� ���lx�����zx������x������x������x������x������x��!���y�����'y�����Ey��s���ey������y��*����y�����z�����/z�����@z�����Tz�����ez������z������z������z������z������z������z������z������z��9���{�����<{�����T{�����j{��,����{�� +-����{������{������{������{������{����� |�����$|�����>|�����V|�����u|��+����|��#����|������|������|������|�����}��#���8}�����\}�����|}������}������}������}������}������}������}������}�����~�����#~�����C~�����b~�����|~������~������~������~������~������~���������������:�����J��*���i�������������������������������������� ������������ ���������'���!���?��� ���a��� ���k������y����������S������� ���������� ������>������K������_������p�����������������(����������������������������/������G���-���_����������������� ����������ނ������������������������1������E������N������d������t���.�������������� ���Ń��#���Ӄ��0�������%���(������N������b������x���������������������������ф�������������������������,������K������i������n���������������������������օ������������������������.������H������a������}���!�����������������؆�����������������(������F���"���_����������������������������������ɇ�����ۇ��������-�������-���.���!���\������~��������������������È�����Ԉ��2������#���������B������O���;���c��������������������͉�������������� ������ ���)������J������[������y����������������������������������Ԋ��������������&���������D������Y������n������w���������� ����������ы��$������ ���������������)������?������T������l������t����������������������������������ڌ��*������(��� ������6������C���"���W�������z���������������� ������������$���/��� +-���T������_������n��������� ���*������8���!���L������n������}�����������������"��������������������� +-���������'���-���#���U���6���y��� ������� +-����������ɑ��"���ё��"�������������"���1������T������t����������������� ����������ɒ�����ؒ������������������ ������$������9������K������`������u����������������������������������ӓ��������#������:������ ���N������o����������%��������������"���ה���������!��� ��� ���+���"���L��� ���o���������������������������̕�����ѕ�����֕��������������F���)��� ���p���4���z���.�������-���ޖ��6������8���C���;���|���I����������������������4���+���D���+���p���'����������Ę�������� ����������������������5���&���H���.���o���&����������ř��,���ՙ�����������!���C���=���#�����������������Ě��!�������"������.���%��� ���T���%���u���;�������&���כ���������1���������P������k������w���"��������������'���ǜ��������������.���$������S���"���j���(�������-��������������������!���������;������X������x����������!����������Ҟ��������������9������2���W���6�������+�������?������C���-���8���q���$�������"���Ϡ��!������.���������C������b����������<�������;���ޡ��$���������?������W���*���w���7����������ڢ��"�������������)���/���N���Y���U��������������&������)���C��� ���m������{���+�����������������ޤ������������ +-���"���*���%���M���*���s���*����������ɥ�����ݥ��0����������(������E������d���+�������7�������#������������!���*���$���L���!���q����������&�������%���է��,����������(���%���7���0���]���2��������������.���Ψ���������K������L���b���L��������������+������2���<���2���o���/�������$���Ҫ���������%��� ���-���3���$���a���������������������������ϫ��(������&������!���6������X���F���o����������B���ɬ��B������?���O���<�������7���̭��������������#���:���.���^���0�������0���������������� ������ ������<������Q������e������z���������������������������Я��������#�������5������G���S��� �������#�������5���Ͱ��������������-���'���!���U���(���w���-����������α��'���߱��?������=���G��� �������.������� ���²��9������;������,���Y���*�������#����������ճ��%������A���������W������t���I�������7���۴��3������+���G������s���'�������!����������Ե��.������������C���'���*���k�����������������(�������������1����������)������D���:���`����������)�������*������#���������2���$���R������w����������"����������Ҹ����������� +-������'���>���G����������!������� ���ǹ��(������$���������6���*���L���=���w���H����������������� ���E������&���c���(�������'�������E���ۻ�����!���(���:���'���c���$�������,�������)���ݼ��%���������-���"���K������n���&��������������P���ҽ��U���#���O���y���V���ɾ��!��� ���'���B���*���j���/�������*���ſ��$������/������1���E���/���w���)�������*�������)�������#���&������J���-���e���&�������4�������(����������������5��� ���F���#���T���$���x���"����������������������������������.���������G������g���3��������������#�������������� ������������0���(������Y���$���u�����������������#������������������������ ������������:������U���4���n������������������������'�������B������D���]���j�������K��� ���?���Y��� ���������������������!����������������������:������Q���"���h�������������������������������#�������#������#���8���0���\���#���������������������*�������%������(��>������g������{���T�������P�������3���5���4���i�����������������������������������������������"������<������P����������������0������0���O����������N������� +-�������������������������� ���6������W��� ���r��� �������&������� �������&������� ���#���&���D������k�����������������!����������������������������7�������7���0���>���h���1�������)�������������/������,���O������|���0�������6�������3�������0���3���!���d���1�������-�������)������� ������@���1���-���r���%��������������)�������:������*���F���(���q���(�������(�������(�������(���������>���-���V���/�������6�������)�������������,���3���(���`���+�������,�������-�������+������/���<���)���l���#��������������$������������������������;���2�������'�������'���(���>���P����������3��������������E����������2���B���D���2�������+��������������;�������?���/���9���o������������������������8�������"������5���$���@���Z���@������������������������������)������G���3���e���,�������E�������-���������:��� ���O��� ���p������~���(�������������������������������������������6������S������s���������� �������!��������������(���������� ������3���"���7������Z���?���r���7�������)�������.������(���C���(���l���&�������5�������5�������7���(���F���`���2�������#�������0�������9���/���%���i���7�������;�������G������;���K���>�������4��������������������+���*������V��� ���m���"�������'�������T�������Z���.����������<�������/�������������?������*���^�����������&���t���9�������A�������:���������R���)���f���9����������������������������-����������������'������E���!���`���'�������������� �������'���������� ������(������<���6���[���6�������F�������@������I���Q���!����������������������������9������������� +-���&��� +-���1��� +-���<��� +-���G��� +-���R��� +-���]��� +-���h��� +-���s��� +-���~��� +-������� +-������� +-������� +-������� +-������� +-������� +-������� +-������� +-������� +-������� +-������� +-������ +-��� ��� ������ ���"��� ���,��� ���6��� ���@��� ���J��� ���T��� ���^������h���H�������%�������6�������:���(������c���"���}���I��������������>�������4���/���5���d�������������������������������)������'���8������`���,���v����������C�������1����������-���$���4�������Y���������&���(���!���O������q������������������������(�������/������� ������(������+���F���(���r���'�������+��������������#���������/������B���F���[��������������������������������������4���������=���1���R���-�������.���������������������������'���������:������Q������e��� �������/�������B�������������������&���6���(���]���!���������������������)���������� ���%������<���D���2�������4��������������������������!���;������]���#���m������������������������ +-���������������������K����������;��� ���N������o�����������������4�������,����������������.���,���A���-���n���4�������!����������������������E�������'�������!��������)�����I��$���c��������������"�����������������������������&�H���*�*���s������%�����:������������*����1����>�/���Y�(�����*�����)�����*�������2�8���I�9����������!���������� ����(���;�$���d������+���������������4�������� ����8����W�$���l�)�����6�����!�����0�������E�3���a������9�����%�����#����,���7����d������.���������������������������(����;����Q� ���a������!�����#������������������ ���� �t���4 �>���� �<���� ����% +-����2 +-����F +-����W +-�0���m +-�%���� +-�:���� +-�%���� +-����%�!���D����f�$�����;�����&���������/���-�&���]�&�������������������������&�������� ����$ �>���: ����y ����� �*���� �<���� �+�������>����X����t������0�����!����������+����!���<�$���^�&�����8����� ����������(����#���.����R�#���p����������������%�����'����&���4�3���[�,������������������������#���4�"���X�/���{���������������������������� ����;�C���J�@�������������������!���"�)���D�'���n�C�����5����� ����&����A���A�#�����)�����$����������5����"���J�*���m������,������������������������<���&�+���c�-�����-�����2������������7����I�&���R�!���y�3�����H�����/�������H����Y�!���e� ���������� +-������������������������!���'����I�1���P�>���������������0�������������������� +-����������)����������?��������?������'�������0�&���C����j����y�!����������!����������������������0� ���M����n�:���������� ����� �����7�����7���& �0���^ �3���� � ���� �4���� ����!����4!����N!����a!����u!�����!�����!�"����!�����!�����!����"����)"�&���H"�#���o"�&����"�����"�����"�����"����#�$���#�O���>#�/����#�����#�����#�1����#�'���*$�*���R$� ���}$�-����$�*����$�.����$�4���&%�&���[%�����%�����%�����%�����%�����%�M����%�)���&�`���F&� +-����&�?����&�B����&�2���5'�C���h'�B����'�@����'�S���0(�"����(�"����(�����(�6����(�3���)�+���K)�)���w)�����)�����)�"����)� ����)�*���*�<���@*�<���}*�8����*�����*�<���+�*���?+�)���j+�X����+�1����+�5���,�6���U,�(����,�)����,�H����,�*���(-�(���S-�C���|-�-����-�*����-�8���.�$���R.����w.�����.�+����.�'����.�2����/�"���3/�'���V/�>���~/� ����/�?����/�K���0�7���j0�����0�$����0�,����0�&���1�*���71����b1�7����1�*����1�%����1�&���2����22�V���R2�p����2�^���3�@���y3�}����3�k���84�H����4�,����4�6���5�;���Q5�:����5�(����5�(����5�)���6�U���D6�T����6�-����6�"���7�"���@7�7���c7�?����7� ����7�7����7����48�J���N8�g����8�k���9�1���m9�-����9�)����9�����9����:�/���%:�0���U:�,����:�����:�:����:�$���;�&���&;�/���M;�+���};�����;�%����;�=����;�7���'<�+���_<�'����<�7����<�=����<�(���)=����R=�,���p=�3����=�)����=�!����=�4���>�#���R>�6���v>�����>�:����>�9����>�:���1?�.���l?�,����?�(����?�d����?�c���V@�b����@����A�:���:A�=���uA�7����A�4����A�@��� B����aB�0���|B�8����B�.����B�!���C����7C����QC����fC�1����C�+����C�&����C���� D�Z���$D����D�Q����D�P����D�K���9E�H����E�<����E����F�.���&F�'���UF�I���}F�K����F�K���G�+���_G�����G�����G�����G�����G�����G����H����H����5H����QH����hH�#���|H�6����H�N����H�M���&I����tI�.����I�O����I�-��� J� ���7J�?���XJ�2����J�;����J�G���K�!���OK�E���qK�Q����K�O��� L����YL�9���iL� ����L�J����L�L���M�.���\M�1����M�5����M�&����M�,���N�O���GN�.����N� ����N�\����N�S���DO�E����O�:����O� ���P�=���:P�<���xP�����P�.����P�����P�F���Q�4���SQ�����Q�����Q�+����Q�$����Q�C����Q�1���CR����uR�D����R�%����R�8����R�.���6S�7���eS�.����S�8����S�%���T����+T�4���KT�+����T�����T�*����T�*����T�N���U�*���kU�,����U�0����U�5����U� ���*V����KV�-���dV�;����V�J����V����W����)W�T���9W�+����W�-����W�.����W�V���X�%���nX�5����X�6����X�.���Y�;���0Y�6���lY�/����Y�'����Y�,����Y�'���(Z�5���PZ�(����Z�V����Z�a���[�Z���h[������[�'���D\�+���l\�,����\�4����\�5����\�-���0]�7���^]�8����]�8����]�@���^�A���I^�@����^�>����^����_�2���&_�A���Y_�<����_�2����_����`� ���)`����7`�'���I`�&���q`�!����`�����`�����`�����`�����`�0���a�%���Ha�3���na�<����a�����a�2����a�5���/b����eb����ub�5����b� ����b�4����b����c����8c�4���Mc�����c�%����c�����c�����c�'����c�0���%d�C���Vd�����d�9����d�(����d�5���e�H���Le�K����e�r����e�W���Tf�M����f� ����f� ���g�$���%g�8���Jg�$����g�"����g�����g�����g�<���h�!���>h�.���`h�A����h�����h�+����h�+���i�+���Fi�<���ri�+����i�'����i�'���j�B���+j�5���nj������������:��c���������������� +-�����������}�������������H��8�� ���������������1����������������������C��������������������������������� ���������V�������������R���������V��z����������������������a������m��������������+��������� +-���������������� ������� ��k�����������O��F���������������������8������M��D�����N��f��4����A���r�����������������������������X����������������������q�������������v��5������Q��V���\���F���B���������������������|�������������4������������������>����������������������$��]�����$�����������������������I��J���C��h������q��������������\��u������"��M�������������������������������������h�����M���]�����������������������p��s��G��������������������N��������e��@������������������������w����������������<���_������B�����������������������������������������������v�����=���G����������������������G������)��)������� ��1��&���������@���������������������P������6������3��L������������W��<�����������������!���7��������������������������U���������.��������r����������S���������������:��������<��g�����������s�������������"�������������������������������0��A��4����������#��������������E��u�����������a���������Q���������9��~��`��X��������5�����������`��c�������2�����4�����������������&�����������������������(��9��������������>�������������������K���������{��������/��[�������������������������+������������h���������!��������l��<����������������������A��g���������� �������������������������N������������B���������X�����������������������������������������6�����*��o���������������������������������R������-���I����������������������a�����������9��:�������������������������8�������������������e�������������������������Z���i���������������(������6������������(������������������������������������������S�����>�����,��i����������������������������w������f����������@������F��������y��0������J�������������������������n���������������|������������������������m��;��X���p��x��-��5������%��w������H���:�����������������������1���#�������7�����������������W�����������������?������������������������/��a����[��������T�������F����D�������3����������k����������'��E��r��}��~����,���������*�����n������W��������9�������������'������.������C�������������0�����O��������\����2���f��^����������������b���������3�������������%��-��#��\��j�������v����������������2������e�����������u��;��y�������������������������=�����k�������n�������������������������O�������������]����t���L������D������������d�����z����������������������P�����i�����t��������)����P��������"�������� �����=�������������������������R�����f�������������������[���Z���������?�����Z��D��������T���������������������������������������������������������{������k��������������������������������������������T���������_�������������������������c��������H������������Z��K�����s�����������������������������p��������������]�������������+����������������g����������z����������`��0���o�����������������������B��|������L��%�����������^������p���*��{�������"����������x�������������������Y���������>�������������!�����y��;��U�����@�����������7�����Y��x������������.��������L���������������l�����,���Q���[������h�����������v�������b������������� �����������������Y������������������������������I�������������/�������������5��/�������������������i���K������%��;�������������������_�������������������r������#��1��������������������s����������������������U��8���e����������������m��}������ �������=������2��?��������*���������������u����������������z������������������$������J��^����������� ���c�������$���J������������������I������������t��������������������������������������������&�����m��G�����������S������������������������ +-����������������������������d���o�������������'������������V��E������t��_�������������������������� +-�����������U��������������M�����������x��~�������������������d��A��.������ ����������y�����������������������������������������T��������������������!����������������������������7��g������+���������j�����,�����(������K���b��)���������q��S��3���������������������������������������������������������������W��������������N������������������E������O�������������������������w���������`�������������������������������������o������b���{��|�����6�����q��������&����������������H����������������l����������������}�����������������j��������������������������������������������������C������������d�������������������j������l�������-�����P�������������n��R���������������������������������~�������������������^��Y��� ����������Q��?��������������'���� Access Rights : � Attributes : � %s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile] +-� %s [-n netid]* [-o outfile] [infile] +-� %s [-s nettype]* [-o outfile] [infile] +-� Access rights: � Entry data of type %s +-� Name : %s +-� Public Key : � Type : %s +-� Universal addresses (%u) +-� [%d] Name : %s +-� [%u] - [%u bytes] � +-%s cache: +- +-%15s cache is enabled +-%15Zd suggested size +-%15ld seconds time to live for positive entries +-%15ld seconds time to live for negative entries +-%15ld cache hits on positive entries +-%15ld cache hits on negative entries +-%15ld cache misses on positive entries +-%15ld cache misses on negative entries +-%15ld%% cache hit rate +-%15s check /etc/%s for changes +-� +-Group Members : +-� +-Time to Live : � rpcinfo -b prognum versnum +-� rpcinfo -d prognum versnum +-� rpcinfo -p [ host ] +-� rpcinfo [ -n portnum ] -t host prognum [ versnum ] +-� no� yes� Data Length = %u +-� Explicit members: +-� Explicit nonmembers: +-� Implicit members: +-� Implicit nonmembers: +-� No explicit members +-� No explicit nonmembers +-� No implicit members +-� No implicit nonmembers +-� No recursive members +-� No recursive nonmembers +-� Recursive members: +-� program vers proto port +-� or: � (rule from "%s", line %d)� [OPTION...]� done +-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags. +-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed. +-�%s%s%s:%u: %s%sUnexpected error: %s. +-�%s%sUnknown signal %d +-�%s: %d did not sign extend correctly +-�%s: <mb_cur_max> must be greater than <mb_cur_min> +-�%s: C preprocessor failed with exit code %d +-�%s: C preprocessor failed with signal %d +-�%s: Can't create %s: %s +-�%s: Can't create directory %s: %s +-�%s: Can't link from %s to %s: %s +-�%s: Can't open %s: %s +-�%s: Can't remove %s: %s +-�%s: Can't unlink %s: %s +-�%s: Error closing %s: %s +-�%s: Error reading %s +-�%s: Error writing �%s: Error writing %s +-�%s: Leap line in non leap seconds file %s +-�%s: Memory exhausted: %s +-�%s: More than one -L option specified +-�%s: More than one -d option specified +-�%s: More than one -l option specified +-�%s: More than one -p option specified +-�%s: More than one -y option specified +-�%s: Too many arguments +-�%s: cannot get modification time�%s: command was '%s', result was %d +-�%s: error in state machine�%s: illegal option -- %c +-�%s: invalid option -- %c +-�%s: option `%c%s' doesn't allow an argument +-�%s: option `%s' is ambiguous +-�%s: option `%s' requires an argument +-�%s: option `--%s' doesn't allow an argument +-�%s: option `-W %s' doesn't allow an argument +-�%s: option `-W %s' is ambiguous +-�%s: option requires an argument -- %c +-�%s: output would overwrite %s +-�%s: panic: Invalid l_value %d +-�%s: premature end of file�%s: unable to open %s: %m +-�%s: unrecognized option `%c%s' +-�%s: unrecognized option `--%s' +-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ] +- [ -L leapseconds ] [ -y yearistype ] [ filename ... ] +-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ... +-�%s: while writing output %s: %m�(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object) +-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible +-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]... +-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Address family not supported by protocol family�Advertise error�Alarm clock�Anode table overflow�Arg list too long�Argument list too long�Argument out of domain�Attempt to remove a non-empty table�Attempting to link in more shared libraries than system limit�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT +-�Bad address�Bad exchange descriptor�Bad file descriptor�Bad file number�Bad font file format�Bad message�Bad request code�Bad request descriptor�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data +-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can not exec a shared library directly�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag! +-�Cannot receive reply to broadcast�Cannot register service�Cannot send after socket shutdown�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file! +-�Cannot use netid flag with inetd flag! +-�Cannot use netid flag without TIRPC! +-�Cannot use table flags with newstyle! +-�Channel number out of range�Character Separator : %c +-�Child exited�Client credential too weak�Columns : +-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc. +-This is free software; see the source for copying conditions. There is NO +-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�Cross-device link�DES entry for netname %s not unique +-�DIRECTORY +-�DNANS�DNS�Database for table does not exist�Database is busy�Deadlock situation detected/avoided�Default Access rights : +-�Destination address required�Device busy�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits) +-�Directory : %s +-�Directory not empty�Disc quota exceeded�Disk quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY +-�Encrypted data +-�Entry/table type mismatch�Error 0�Error 100�Error 101�Error 102�Error 103�Error 104�Error 105�Error 106�Error 107�Error 108�Error 109�Error 110�Error 111�Error 112�Error 113�Error 114�Error 115�Error 116�Error 117�Error 118�Error 119�Error 136�Error 142�Error 58�Error 59�Error 72�Error 73�Error 75�Error 76�Error 91�Error 92�Error in RPC subsystem�Error in accessing NIS+ cold start file. Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock�File locking deadlock error�File name too long�File size limit exceeded�File table overflow�File too large�First/next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP +-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group : %s +-�Group Flags :�Group entry for "%s.%s" group: +-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O error�I/O possible�INPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal byte sequence�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid object for operation�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Invalidate the specified cache�Is a directory�Is a name file�Is a named type file�Kerberos. +-�Killed�LINK +-�LOCAL entry for UID %d in directory %s not unique +-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link has been severed�Link number out of range�Link points to illegal name�Linked Object Type : �Linked to : %s +-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server : +-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message tables full�Message too long�Missing or malformed attribute�Mod. Time : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME +-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT +-�NUMBER�Name : `%s' +-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection because of reset�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No record locks available�No remote programs registered. +-�No route to host�No space left on device�No such device�No such device or address�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None. +-�Not a XENIX named type file�Not a data message�Not a directory�Not a name file�Not a stream device�Not available�Not enough space�Not found�Not found, no such name�Not master server for this domain�Not owner�Not supported�Number of Columns : %d +-�Number of objects : %u +-�Number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS�Numerical argument out of domain�Numerical result out of range�Object #%d: +-�Object Name : %s +-�Object Type : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation canceled�Operation not applicable�Operation not permitted�Operation not supported�Operation not supported on transport endpoint�Operation now in progress�Operation would block�Option not supported by protocol�Out of stream resources�Out of streams resources�Output control:�Output selection:�Owner : %s +-�PRIVATE +-�Package not installed�Parse error: %s�Partial success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits) +-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate : +-�Report bugs to %s. +-�Report bugs using the `glibcbug' script to <bugs@gnu.org>. +-�Request arguments bad�Reserved for future use�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Result too large�Results sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path : %s +-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root +-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status : %s +-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%s�TABLE�TABLE +-�TABLE,yes�Table Type : %s +-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known. This does +-not necessarily mean that all combinations of these names can be used for +-the FROM and TO command line parameters. One coded character set can be +-listed with several different names (aliases). +- Some of the names are no plain strings but instead regular expressions and +-they match a variety of names which can be given as parameters to the +-program. +- +- �Time to live : �Timer expired�Too many attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information. +-�Trying %s... +-�Type : %s +-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d) +-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s +-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname] +-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-�Use separate cache for each user�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s. +-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�__get_myaddress: ioctl (get interface configuration)�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory +-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice +-�bogus mcheck_status, library is buggy +-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d +-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s +-�cannot find any C preprocessor (cpp) +-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character '%s' in class `%s' must be in class `%s'�character '%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character L'%s' (index %Zd) in class `%s' must be in class `%s'�character L'%s' (index %Zd) in class `%s' must not be in class `%s'�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory +-�clntudp_create: out of memory +-�clntunix_create: out of memory +-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server +-�couldn't register prog %d vers %d +-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error getting callers id: %s�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' undefined�file `%s' already exists and may be overwritten +-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :`%s' +-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block +-�memory clobbered past end of allocated block +-�memory exhausted�memory is consistent, library is buggy +-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s +-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in `%s'.�netname2user: principal name `%s' too long�netname2user: should not have uid 0�never registered prog %d +-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration: +- +-%15d server debug level +-�nscd not running! +-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup +-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available +-�program %lu version %lu is not available +-�program %lu version %lu ready and waiting +-�rcmd: poll (setting up stderr): %m +-�rcmd: socket: All ports in use +-�rcmd: write (setting up stderr): %m +-�registerrpc: out of memory +-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error +-�rpcgen: too many defines +-�rpcinfo: %s is unknown host +-�rpcinfo: %s is unknown service +-�rpcinfo: Could not delete registration for prog %s version %s +-�rpcinfo: broadcast failed: %s +-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup +-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory +-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory +-�svctcp_create: out of memory +-�svcudp_create - cannot getsockname�svcudp_create: out of memory +-�svcudp_create: socket creation problem�svcunix_create: out of memory +-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d +-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage: %s infile +-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�warning: �while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory +-�xdrrec_create: out of memory +-�yp_update: cannot convert host to netname +-�yp_update: cannot get server address +-�Project-Id-Version: GNU libc 2.1.3 +-POT-Creation-Date: 2000-02-16 10:39-0800 +-PO-Revision-Date: 2000-02-20 09:38+01:00 +-Last-Translator: Jochen Hein <jochen@jochen.org> +-Language-Team: German <de@li.org> +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=ISO-8859-1 +-Content-Transfer-Encoding: 8-bit +-� Zugriffsrechte : � Attribute : � %s [-abkCLNTM][-DName[=Wert]] [-i Gr��e] [-I [-K Sekunden]] [-Y Pfad] Eingabedatei +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o Ausgabedatei] [Eingabedatei] +-� %s [-n Netz-ID]* [-o Ausgabedatei] [Eingabedatei] +-� %s [-s Netz-Typ]* [-o Ausgabedatei] [Eingabedatei] +-� Zugriffsrechte : � Dateneingabe vom Typ %s +-� Name : %s +-� Public Key : � Typ : %s +-� Universelle Adressen (%u) +-� [%d] Name : %s +-� [%u] - [%u Bytes] � +-%s Cache: +- +-%15s Cache ist eingeschaltet +-%15Zd vorgeschlagene Gr��e +-%15ld Time to Live f�r positive Eintr�ge in Sekunden +-%15ld Time to Live f�r negative Eintr�ge in Sekunden +-%15ld Cache-Hits bei positiven Eintr�gen +-%15ld Cache-Hits bei positiven Eintr�gen +-%15ld Cache-Misses bei positiven Eintr�gen +-%15ld Cache-Misses bei negativen Eintr�gen +-%15ld%% Cache-Hit Verh�ltnis +-%15s Pr�fe /etc/%s auf �nderungen +-� +-Gruppen Mitglieder : +-� +-Time to Live : � rpcinfo -b Programmnummer Versionsnummer +-� rpcinfo -d Programmnummer Versionsnummer +-� rpcinfo -p [ Rechner ] +-� rpcinfo [ -n Portnummer ] -t Rechner Programmnummer [ Versionsnummer ] +-� nein� ja� L�nge der Daten = %u +-� Explizite Mitglieder: +-� Explizite Nicht-Mitglieder: +-� Implizite Mitglieder: +-� Implizite Nicht-Mitglieder: +-� Keine expliziten Mitglieder +-� Keine expliziten Nicht-Mitglieder +-� Keine impliziten Mitglieder +-� Keine impliziten Nicht-Mitglieder +-� Keine rekursiven Mitglieder +-� Keine rekursiven Nicht-Mitglieder +-� Rekursive Mitglieder: +-� Program Vers Proto Port +-� oder: � (Regel aus Datei �%s�, Zeile %d)� [Option...]� fertig +-��%s�, Zeile %d: %s��Zone %s�-Zeile und die Option �-l� schliessen sich aus��Zone %s�-Zeile und die Option �-p� schliessen sich aus��infile� ist f�r die Template-Generierungs-Flags erforderlich +-�%.*s: ARGP_HELP_FMT Parameter verlangt einen Wert�%.*s: Unbekannter ARGP_HELP_FMT Parameter�%s in einer regellosen Zone�%s%s%s:%u: %s%sZusicherung �%s� nicht erf�llt. +-�%s%s%s:%u: %s%sNicht erwarteter Fehler: %s. +-�%s%sUnbekanntes Signal %d +-�%s: Vorzeichenerweiterung von %d fehlgeschlagen +-�%s: �<mb_cur_max>� mu� gr��er als �<mb_cur_min>� sein +-�%s: C Pr�prozessor fehlgeschlagen mit Exit-Code %d +-�%s: C Pr�prozessor fehlgeschlagen mit Signal %d +-�%s: Kann �%s� nicht erzeugen: %s +-�%s: Kann das Verzeichnis �%s� nicht erzeugen: %s +-�%s: Kann nicht von �%s� nach �%s� linken: %s +-�%s: Kann die Datei �%s� nicht �ffnen: %s +-�%s: Kann �%s� nicht l�schen: %s +-�%s: Kann den Verzeichniseintrag �%s� nicht l�schen (unlink): %s +-�%s: Fehler beim Schlie�en der Datei �%s�: %s +-�%s: Fehler beim Lesen der Datei �%s� +-�%s: Fehler beim Schreiben �%s: Fehler beim Schreiben der Datei �%s� +-�%s: Schalt-Zeile in einer nicht-Schaltsekunden-Datei �%s� +-�%s: Kein Hauptspeicher mehr verf�gbar: %s +-�%s: Mehr als eine �-L� Option angegeben +-�%s: Mehr als eine �-d� Option angegeben +-�%s: Mehr als eine �-l� Option angegeben +-�%s: Mehr als eine �-p� Option angegeben +-�%s: Mehr als eine �-y� Option angegeben +-�%s: Zu viele Argumente +-�%s: kann die Modifikationszeit nicht bekommen�%s: Das Kommando war �%s�, das Ergebnis war %d +-�%s: Fehler im (intern verwendeten) endlichen Automaten�%s: Die Option ist nicht erlaubt -- �%c� +-�%s: Ung�ltige Option -- �%c� +-�%s: Die Option �%c%s� erlaubt kein Argument +-�%s: Die Option �%s� ist nicht eindeutig +-�%s: Die Option �%s� erfordert ein Argument +-�%s: Die Option �--%s� erlaubt kein Argument +-�%s: Die Option �-W %s� erlaubt kein Argument +-�%s: Die Option �-W %s� ist nicht eindeutig +-�%s: Diese Option ben�tigt ein Argument -- �%c� +-�%s: Die Ausgabe w�rde �%s� �berschreiben +-�%s: Panik: ung�ltiger �l_value� %d +-�%s: Unerwartetes Ende der Datei�%s: Fehler beim �ffnen von �%s�: %m +-�%s: Unbekannte Option �%c%s� +-�%s: Unbekannte Option �--%s� +-�%s: Syntax ist %s [ -s ] [ -v ] [ -l Ortszeit ] [ -p Posix-Regeln ] [ -d Verzeichnis ] +- [ -L Schaltsekunden ] [ -y Jahrestyp ] [ Dateiname ... ] +-�%s: Syntax: %s [ -v ] [ -c cutoff ] Zonenname ... +-�%s: Beim Schreiben der Ausgabe �%s�: %m�(PROGRAM ERROR) Keine Version bekannt!?�(PROGRAM ERROR) Option sollte eigentlich erkannt worden sein!?�(Unbekanntes Objekt) +-�(unbekannter Fehler bei der Authentifizierung - %d)�Unbekanntes Signal�*** Die Datei �%s� ist gestrippt: keine detaillierte Analyse m�glich +-�*Standardeingabe*�-o Ausgabedatei [Eingabedatei]... +-[Ausgabedatei [Eingabedatei]...]��.lib�-Sektion in der �a.out�-Datei ist besch�digt�; untere Version = %lu, obere Version = %lu�; Ursache = �<%s> und <%s> sind ung�ltige Namen f�r einen Zeichenbereich�Das Zeichen �<SP>� darf nicht in der Klasse �%s� enthalten sein�Das Zeichen �<SP>� ist nicht in der Klasse �%s� enthalten�?�Abgebrochen�Zugriffsrechte: �Zugriff auf eine fehlerhafte oder defekte Shared Library�Die Adresse wird bereits verwendet�Die Adre�familie f�r Hostnamen wird nicht unterst�tzt�Die Adre�familie wird von der Protokollfamilie nicht unterst�tzt�Die Adre�familie wird von der Protokollfamilie nicht unterst�tzt�Konflikt mit Bekanntmachung�Der Wecker klingelt��berlauf der �anode�-Tabelle�Die Argumentliste ist zu lang�Die Argumentliste ist zu lang�Das Argument ist au�erhalb des Definitionsbereiches�Versuch, eine nicht-leere Tabelle zu l�schen�Versuche mehr Shared Libraries einzubinden als das Systemlimit zul��t�Versuch zu viele Shared Libraries einzubinden�Authentifizierung OK�Fehler bei der Authentifizierung�BOGUS OBJEKT +-�Ung�ltige Adresse�Ung�ltiger Deskriptor zum Datenaustausch�Ung�ltiger Dateideskriptor�Ung�ltiger Dateideskriptor�Ung�ltiges Font-Dateiformat�Ung�ltige Nachricht�Ung�ltiger Aufruf-Code�Ung�ltiger Aufruf-Deskriptor�Ung�ltiger Betriebssystemaufruf�Ung�ltiger Wert f�r �ai_flags��Sei strikt POSIX-konform�Bin�re Daten +-�Es ist ein Block-Device notwendig�Poll-Problem beim Broadcast�Daten�bergabe unterbrochen (broken pipe)�Bus-Zugriffsfehler�CDS�Rechenzeitbegrenzung �berschritten�Der Cache ist verfallen�Auf eine ben�tigte Shared Library kann nicht zugegriffen werden�Eine Shared Library kann nicht direkt ausgef�hrt werden�Kein Server f�r diese NIS-Domain gefunden�Keine Kommunikation mit dem Portmapper m�glich�Keine Kommunikation mit �ypbind� m�glich�Keine Kommunikation mit �ypserv� m�glich�Nicht gen�gend Hauptspeicher verf�gbar�Die angeforderte Adresse kann nicht zugewiesen werden�Kann den Socket f�r den Broadcast-RPC nicht erstellen�Eine Shared Library kann nicht direkt ausgef�hrt werden�Mehr als ein File-Generation-Flag angegeben, es ist nur eins erlaubt! +-�Kann die Antwort auf den Broadcast nicht empfangen�Kann den Service nicht registrieren�Kein Senden nach dem Beenden des Sockets m�glich�Ein Senden nach dem Beenden des Sockets ist nicht m�glich�Kann das Broadcast-Paket nicht senden�Kann die Option �SO_BROADCAST� nicht beim Socket setzen�Es darf nicht mehr als eine Eingabedatei angegeben werden! +-�Kann das �netid�-Flag nicht zusammen mit dem �inetd�-Flag verarbeiten! +-�Das �netid�-Flag kann nicht ohne �TIRPC� verwendet werden! +-�Das �table�-flags kann nicht mit �newstyle� verwendet werden! +-�Die Kanalnummer ist au�erhalb des g�ltigen Bereiches�Trennzeichen : %c +-�Der Kind-Proze� ist beendet�Die Best�tigung des Clients ist zu unsicher�Spalten : +-�Kommunikationsfehler beim Senden�Umwandeln der Lokale-Spezifikation�Der Computer hat den Bauernhof erworben�Berechnung der Gr��e der Tabelle der Zeichenklassen: Dies kann einige Zeit dauern...�Berechnung der Gr��e der Tabelle der Sortierinformationen: Dies kann einige Zeit dauern...�Verbindungsaufbau abgelehnt�Die Verbindung wurde vom Kommunikationspartner zur�ckgesetzt�Die Wartezeit f�r die Verbindung ist abgelaufen�Fortgesetzt�Konvertiert die Kodierung von Dateien in eine andere Kodierung.��bersetze den Schl�ssel in Kleinbuchstaben�Copyright � %s Free Software Foundation, Inc. +-Dies ist freie Software; in den Quellen befinden sich die Lizenzbedingungen. +-Es gibt KEINERLEI Garantie; nicht einmal f�r die TAUGLICHKEIT oder +-VERWENDBARKEIT F�R EINEN ANGEGEBENEN ZWECK. +-�Kann die Logdatei �%s� nicht erstellen�Erzeuge die C Headerdatei NAME mit den Symboldefinitionen�Die Ausgabedatei wird erzeugt, obwohl Warnungen ausgegeben wurden�Erstellt eine einfach DB Datenbank aus einer Text-Eingabe.�Erstellungszeit: %s�Ung�ltiger Link �ber Ger�tegrenzen hinweg�Der DES-Eintrag f�r den netname �%s� ist nicht eindeutig +-�VERZEICHNIS +-�DNANS�DNS�Die Datenbank f�r die Tabelle existiert nicht�Die Databank ist belegt�Verklemmung erkannt/vermieden�Standard-Zugriffsrechte : +-�Es ist eine Zieladresse notwendig�Das Ger�t oder die Ressource ist belegt�Das Ger�t ist kein Stream�Das Ger�t ist nicht konfiguriert�Das Ger�t oder die Ressource ist belegt�Diffie-Hellmann (%d Bits) +-�Verzeichnis : %s +-�Das Verzeichnis ist nicht leer�Der zugewiesene Plattenplatz (Quota) ist �berschritten�Der zugewiesene Plattenplatz (Quota) ist �berschritten�F�hre kein �fork()� aus und zeige Nachrichten auf dem aktuellen tty an�Gebe keine Nachrichten aus, w�hrend die Datenbank aufgebaut wird�Verwende nicht den existierenden Katalog; erzwinge eine neue Ausgabedatei�Die Domain wurde nicht zugewiesen�EMT-Trap�ENTRY +-�Verschl�sselte Daten +-�Die Typen des Eintrages/der Tabelle passen nicht zusammen�Fehler 0�Fehler 100�Fehler 101�Fehler 102�Fehler 103�Fehler 104�Fehler 105�Fehler 106�Fehler 107�Fehler 108�Fehler 109�Fehler 110�Fehler 111�Fehler 112�Fehler 113�Fehler 114�Fehler 115�Fehler 116�Fehler 117�Fehler 118�Fehler 119�Fehler 136�Fehler 142�Fehler 58�Fehler 59�Fehler 72�Fehler 73�Fehler 75�Fehler 76�Fehler 91�Fehler 92�Fehler im RPC Subsystem: �Fehler beim Zugriff auf die NIS+ Kaltstart-Datei. Ist NIS+ installiert?�Fehler in unbekanntem Fehler-System: �Fehler bei der Kommunikation mit der Callback-Prozedur�Fehler: Die Datei �.netrc� ist f�r andere Benutzer lesbar.�Vermittlung ist �berf�llt�Fehler im Format der Programmdatei�Fataler Fehler: Das System definiert das Symbol �_POSIX2_LOCALEDEF� nicht�Datei�FILE enth�lt Zuordnungen von symbolischen Namen zu UCS4-Werten�Fehlgeschlagen (Fehler nicht genau zu spezifizieren)�Die Dateizugriffsnummer ist ein schlechter Verfassung�Die Datei existiert bereits�Verklemmung beim Datei-Locking�Verklemmung beim Datei-Locking�Der Dateiname ist zu lang�Die maximale Dateigr��e ist �berschritten��berlauf der Datei-Deskriptoren-Tabelle�Die Datei ist zu gro��Die Verkettung mittels First/Next ist defekt�Gleitkomma-Ausnahme�Vollst�ndige Resynchronisation f�r das Verzeichnis ist erforderlich�Die angeforderte Funktion ist nicht implementiert�GROUP +-�Unsinnige Daten in ARGP_HELP_FMT: %s�Generiere einen Message-Katalog.\vWenn als INPUT-FILE - angegeben wird, wird von der Standardeingabe gelesen. Wenn die OUTPUT-FILE +-- ist, wird auf die Standardausgabe geschrieben. +-�Allgemeiner Systemfehler�Hole Lokale-spezifische Informationen.�Gibt kurze Bedienungshinweise aus�Gibt diese Hilfe aus�Irgendein Fehler�Gruppe : %s +-�Gruppen Flags:�Gruppen-Eintrag f�r die Gruppe �%s.%s�: +-�Warte f�r SECS Sekunden (Standardwert ist 3600)�Aufgelegt�Habe �%d� nicht im Group-Cache gefunden!�Habe �%d� nicht im Password-Cache gefunden!�Habe �%s� nicht im Group-Cache gefunden!�Habe �%s� nicht im Host-Cache gefunden!�Habe �%s� nicht im Password-Cache gefunden!�Der Rechner ist nicht aktiv�Fehler beim Aufl�sen des Hostnamens�Ein-/Ausgabefehler�Ein-/Ausgabe ist m�glich�Eingabedatei Ausgabedatei +--o Ausgabedatei Eingabedatei +--u Eingabedatei�Ein-/Ausgabe-Trap (IOT)�IVY�Bezeichner wurde entfernt�Ung�ltige Byte-Folge�Ung�ltiger Maschinenbefehl�Ung�ltiger Objekt-Typ f�r die angeforderte Operation�Nicht erlaubter Seek�Unpassender Dateityp oder unpassendes Dateiformat�Unpassender IOCTL (I/O-Control) f�r das Ger�t�Unpassende Operation f�r den Hintergrundproze��Informationsanfrage�Information:�Eingabedateien:�Beschreibung des Ein-/Ausgabe-Formates:�Eingabe-/Ausgabefehler�Interner NIS-Fehler�Interner Fehler in �ypbind��Unterbrechung�Unterbrechung w�hrend des Betriebssystemaufrufs�Der unterbrochene Betriebssystemaufruf sollte neu gestartet werden�Das Argument ist ung�ltig�Ung�ltiger Verweis zur�ck�Ung�ltiger Name f�r eine Zeichenklasse�Die Best�tigung des Clients ist ung�ltig�Ung�ltige �berpr�fung des Clients�Ung�ltiges Sortierzeichen�Ung�ltiger Inhalt von �\{\}��Ung�ltiger Link �ber Ger�tegrenzen hinweg�Ung�ltiger Austausch�Ung�ltiges Objekt f�r diese Operation�Ung�ltiges oder unvollst�ndiges Multi-Byte oder Wide-Zeichen�Der vorherige regul�re Ausdruck ist nicht korrekt.�Das Ende des angegebenen Intervalls ist nicht g�ltig�Ung�ltiger regul�rer Ausdruck�Ung�ltiger Aufruf-Code�Ung�ltiger Aufruf-Deskriptor�Ung�ltige �berpr�fung des Servers�Ung�ltiger Slot�Der angegebene Cache wird verworfen�Ist ein Verzeichnis�Ist eine �named file��Ist eine �named type file��Kerberos. +-�Get�tet�LINK +-�Der LOCAL Eintrag f�r die UID �%d� im Verzeichnis �%s� ist nicht eindeutig +-�Level 2 angehalten�Level 2 ist nicht synchronisiert�Level 3 angehalten�Level 3 zur�ckgesetzt�Der Link wurde besch�digt�Die Link-Nummer ist au�erhalb des g�ltigen Bereiches�Der Link verweist auf einen ung�ltigen Namen�Verbundener Objekt-Typ : �Verbunden zu : %s +-�Der lokale Domain-Name ist nicht eingetragen�Lokaler Fehler bei der Ressourcenreservierung�Die Maschine ist nicht an das Netzwerk angeschlossen�Ung�ltiger oder fehlerhafter Name�Obligatorische oder optionale Argumente von langen Optionen sind ebenfalls obligatorische bzw. optionale Argumente f�r jede zugeh�rige kurze Option.�Master Server : +-�Der Master-Server ist besch�ftigt, vollst�ndiger Dump neu eingeplant.�Fehler beim Anfordern von Hauptspeicher�Kein Hauptspeicher mehr verf�gbar�Die Nachrichtentabelle ist voll�Die Nachricht ist zu lang�Fehlendes oder fehlerhaftes Attribut�Mod. Zeit : %s�Modifikation fehlgeschlagen�Die Ver�nderung ist fehlgeschlagen�Modifiziere Ausgabe-Format:�Ein �Multihop� wurde versucht�NAME�Name +-[-a|-m]�NIS�NIS Client/Server Versionen passen nicht zusammen - kein Service m�glich�Die Datenbank mit der NIS-Map ist ung�ltig�NIS+ Operation fehlgeschlagen�Die NIS+ Server sind nicht erreichbar�Der NIS+ Dienst ist nicht verf�gbar oder nicht installiert�KEIN OBJEKT +-�NUMMER�Name : �%s� +-�Name Service Cache Daemon.�Der Name wird nicht von diesem Server verwaltet�Der Name ist im Netzwerk nicht eindeutig�Der Name oder der Dienst ist nicht bekannt�Der Name bzw. Eintrag ist nicht eindeutig�Das benannte Objekt ist nicht durchsuchbar�Authentikator ben�tigt�Das Netzwerk hat die Verbindung nach einem Reset beendet�Das Netzwerk hat die Verbindung nach einem Reset verloren�Das Netzwerk ist nicht aktiv�Das Netzwerk ist nicht erreichbar�Keine �CSI�-Struktur verf�gbar�Keine XENIX-Semaphoren verf�gbar�Zu diesem Hostnamen geh�rt keine Adresse�Zu diesem Namen geh�rt keine Adresse�Keine Anode�Kein Hauptspeicher f�r den Puffer verf�gbar�Keine Kind-Prozesse�Keine Daten verf�gbar�Auf dem Server ist kein Speicherplatz mehr verf�gbar�Keine Sperren verf�gbar�Keine �bereinstimmung gefunden�Kein Medium gefunden�Keine Nachricht des gew�nschten Typs�Keine weiteren S�tze in der Map-Datenbank�Es wurde bisher noch kein regul�rer Ausdruck definiert�Keine Datensatz-Sperren verf�gbar�Es sind keine entfernten Programme registriert. +-�Keine Route zum Zielrechner�Auf dem Ger�t ist kein Speicherplatz mehr verf�gbar�Kein passendes Ger�t gefunden�Kein passendes Ger�t bzw. keine passende Adresse gefunden�Datei oder Verzeichnis nicht gefunden�Kein passender Schl�ssel in der Map�Keine passende Map in der Domain des Servers�Kein passender Proze� gefunden�Kein NIS+ Namespace gefunden�Nicht-behebbarer Fehler in der Namensaufl�sung�Keine. +-�Keine XENIX �named type� Datei�Das ist keine �data message��Ist kein Verzeichnis�Keine �named file��Ist kein Stream-Ger�t�Nicht verf�gbar�Nicht genugend (Speicher-) Platz�Nicht gefunden�Nicht gefunden, kein solcher Name�Kein Master-Server f�r diese Domain�Bin nicht der Eigent�mer�Nicht unterst�tzt�Anzahl der Spalten : %d +-�Anzahl der Objekte: %u +-�Die Anzahl der symbolischen Link, die beim Durchgehen des Pfades gefunden wurden, �berschreitet den Wert MAXSYMLINKS�Das numerische Argument ist au�erhalb des Definitionsbereiches�Das numerische Ergebnis ist au�erhalb des g�ltigen Bereiches�Objekt #%d: +-�Objekt-Name : %s +-�Objekt-Typ : �Das Objekt ist remote�Ein Objekt mit demselben Namen existiert bereits�Ungerade Anzahl von Anf�hrungszeichen�Nur der Systemverwalter �root� darf diese Option benutzen!�Die Operation wird bereits ausgef�hrt�Die Operation wird abgebrochen�Die Operation ist nicht anwendbar�Die Operation ist nicht erlaubt�Die Operation wird nicht unterst�tzt�Die Operation wird am Transporkt-Endpunkt nicht unterst�tzt�Die Operation ist jetzt in Bearbeitung�Die Operation w�rde blockieren�Die Option wird vom Protokoll nicht unterst�tzt�Keine Stream-Ressourcen mehr verf�gbar�Keine Stream-Ressourcen mehr verf�gbar�Ausgabesteuerung:�Ausgabeselektion:�Eigent�mer : %s +-�PRIVAT +-�Das Zusatzpacket ist nicht installiert�Syntax-Fehler: %s�Teilweise erfolgreich�Das �bergebene Objekt ist nicht dasselbe Objekt auf dem Server�Keine Berechtigung�Fehler in der Stromversorgung�Unerwartetes Ende des regul�ren Ausdruckes�Drucke den Inhalt der Datenbank-Datei, je Eintrag eine Zeile�Drucke die aktuelle Konfigurationsstatistik�Gibt mehr Nachrichten aus�Gib die Programmversion aus�M�glicherweise erfolgreich�M�glicherweise nicht gefunden�Zeitnehmer zur Laufzeitbestimmung ist abgelaufen�Das Protokoll ist nicht verf�gbar�Protokollfehler�Die Protokollfamilie wird nicht unterst�tzt�Das Protokoll ist nicht verf�gbar�Das Protokoll wird nicht unterst�tzt�Das Protokoll pa�t nicht zu dem Socket�Die Abfrage ist f�r die angegebene Tabelle nicht erlaubt�Verlassen�RFS-spezifischer Fehler�RPC: ung�ltige Prozedur f�r das Programm�RPC: Fehler bei einer NIS-Operation�RPC: Programm nicht verf�gbar�RPC: Die Programmversion ist falsch�RPC: Die Struktur ist ung�ltig�RPC: falsche Version�RPC: (Unbekannter Fehlercode)�RPC: Fehler bei der Authentifizierung�RPC: Kann das Ergebnis nicht dekodieren�RPC: Kann die Argumente nicht kodieren�RPC: Fehlgeschlagen (Fehler nicht zu spezifizieren)�RPC: Die RPC-Versionen sind nicht kompatibel�RPC: Fehler des Portmappers�RPC: Prozedur nicht verf�gbar�RPC: Programm nicht registriert�RPC: Programm nicht verf�gbar�RPC: Programm/Version nicht passend�RPC: Fehler des entfernten Systems�RPC: Server kann die Argumente nicht dekodieren�RPC: Erfolgreich�RPC: Wartezeit abgelaufen�RPC: Kann nicht empfangen�RPC: Kann nicht senden�RPC: Unbekannter Rechner�RPC: Unbekanntes Protokoll�RSA (%d Bits) +-��RTLD_NEXT� wird in Code verwendet, der nicht dynamisch geladen ist�Lese und gib die Profiling-Informationen von Shared Objects aus.�Lese die Konfiguration aus NAME�Das Dateisystem ist nur lesbar�Real-Time Signal %d�Der regul�re Ausdruck ist zu gro��Ein-/Ausgabefehler des entfernten Systems�Die entfernte Adresse hat sich ge�ndert�Das Pa�wort l�schen oder die Datei f�r andere nicht lesbar anlegen.�Erneutes �ffnen des Shared Objects �%s� ist mi�lungen�Replik : +-�Fehlermeldungen bitte an �%s� senden. +-�Fehler bitte mit dem �glibcbug�-Skript an <bugs@gnu.org> melden. +-�Die Request-Argumente sind ung�ltig�Reserviert f�r eine zuk�nftige Verwendung�Fehler 0 des Resolvers (Kein Fehler)�Interner Fehler des Resolvers�Verklemmung beim Zugriff auf eine Ressource vermieden�Die Ressource ist verlorengegangen�Die Ressource ist zur Zeit nicht verf�gbar�Das Ergebnis ist zu gro��Ergebnisse an die Callback-Prozedur gesendet�SHOBJ [PROFDATA]�SUNYP�Suchpfad : %s +-�Speicherzugriffsfehler�Der Server ist zur Zeit besch�ftigt, bitte nochmal versuchen�Der Hauptspeicher des Servers ist ersch�pft�Der Server hat die Best�tigung zur�ckgewiesen�Der Server hat die �berpr�fung zur�ckgewiesen��Servname� wird f�r �ai_soctype� nicht unterst�tzt�Setzt den Programm-Namen�Stoppt den Server�Signal 0�Socket-Operation an einem nicht-Socket�Socket-Typ wird nicht unterst�tzt�Das Programm verursachte den Abbruch der Verbindung�Sorry, diese Funktion kann nur vom Systemverwalter durchgef�hrt werden. +-�Die Quell-Definitionen stehen in der Datei FILE��Srmount�-Fehler�Stackfehler�Veraltete NFS-Dateizugriffsnummer�Starte die Anzahl NUMBER Threads�Status : %s +-�Angehalten�Angehalten (Signal)�Angehalten (tty-Eingabe)�Angehalten (tty-Ausgabe)�Fehler in Stream-Pipe�Die Struktur mu� bereinigt werden�Erfolg�Unterdr�cke Warnungen und informative Nachrichten�Symbolische Namen f�r Zeichen sind in der Datei FILE definiert�Systemfehler�System-Information:�Fehler bei der Beschaffung einer Systemressource�System-Verzeichnis f�r character maps : %s +- repertoire maps: %s +- locale path : %s +-%s�TABELLE�TABELLE +-�TABELLE,ja�Tabellentyp : %s +-�Tempor�rer Fehler bei der Namensaufl�sung�Beendet�Das Programm kann nicht ausgef�hrt oder ver�ndert werden (busy)�Die folgende Liste enth�lt alle bekannten Zeichensatzkodierungen. Das +-bedeutet nicht, da� zwischen allen Kombinationen dieser Namen als FROM +-und TO Paramter konvertiert werden kann. Eine Zeichensatzkodierung kann +-unter verschiedenen Namen aufgef�hrt sein (sog. Aliasnamen). +- +-Einige Namen sind keine normalen Zeichenketten sondern Regul�re Ausdr�cke +-und diese passen zu einer Reihe von Namen, die als Parameter angegeben +-werden k�nnen. +- +- �Time-to-Live : �Der virtuelle Zeitnehmer ist abgelaufen�Zu viele Attribute�Zu viele Ebenen aus symbolischen Links�Zu viele Links�Zu viele offene Dateien�Zu viele offene Dateien im System�Zu viele Prozesse�Zu viele Referenzen: can't splice�Zu viele Benutzer�Trace/Breakpoint ausgel�st�Angeh�ngter Backslash (�\�)�Der �bersetzer ist gestorben�Der Socket ist bereits verbunden�Der Socket ist nicht verbunden��%s --help� oder �%s --usage� gibt weitere Informationen. +-�Versuche �%s�... +-�Typ : %s +-�UNBEKANNT�Die Echtheit des NIS+-Clients kann nicht gepr�ft werden�Die Echtheit des NIS+-Servers kann nicht gepr�ft werden�Die Callback-Prozedur kann nicht erstellt werden�Es kann kein Proze� auf dem Server gestartet werden�Unbekannt (Typ = %d, Bits = %d) +-�Unbekanntes Schl�sselwort �%s� in der Datei �.netrc��Unbekannter NIS-Fehlercode�Unbekannte Datenbank: %s +-�Unbekannter Fehler�Unbekannter Fehler �Unbekannter Rechner�Unbekanntes Objekt�Unbekannte Option: %s %s %s�Unbekannter Fehler des �Resolvers��Unbekannter Fehler des Servers�Unbekanntes Signal %d�Unbekannter Systemfehler�Unbekannter Fehler im �ypbind���(� oder �\(� ohne schlie�ende Klammer��)� oder �\)� ohne �ffnende Klammer��[� oder �[^� ohne schlie�ende Klammer��\{� ohne schlie�ende Klammer�Unbekannte Variable �%s��Dringende Ein-/Ausgabebedingung�Syntax:�Syntax: %s Variablenname [Pfadname] +-�Syntax: rpcinfo [ -n Portnummer ] -u Rechner Programmnummer [ Versionsnummer ] +-�Verwende f�r jeden Benutzer einen eigenen Cache�Benutzerdefiniertes Signal 1�Benutzerdefiniertes Signal 2�Der Wert ist zu gro� f�r den definierten Datentyp�Der virtuelle Zeitnehmer ist abgelaufen�Wildes Ergebnis aus der Kommandoausf�hrung�Die Fenstergr��e wurde ver�ndert�Gibt die Namen der verf�gbaren �charmaps� aus�Gibt die Namen der verf�gbaren Lokalen aus�Gibt die Namen von ausgew�hlten Kategorien aus�Gibt die Namen von ausgew�hlten Schl�sselw�rtern aus�Schreibe die Ausgabe in die Datei NAME�Implementiert von %s. +-�Falscher Medien-Typ�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Ja, 42 ist die Antwort auf die Frage nach dem Leben, dem Sein und allem sonst�Diesmal hast Du es wirklich kaputtgemacht�Die Ende-Zeit der Fortsetzungszeile ist nicht sp�ter als die Ende-Zeit der vorangegangenen Zeile�[Datei...]�__get_myaddress: ioctl (Holen der Schnittstellen-Konfiguration)�Die Definition von �%1$s� ist nicht durch �END %1$s� abgeschlossen��%s� ist keine g�ltige Profiledaten-Datei f�r �%s���-1� mu� der letzte Eintrag im �%s�-Feld in der �%s�-Kategorie sein��...� darf nur in �...� und �UNDEFINED� Eintr�gen verwendet werden��from� erwartet nach dem ersten Argument von �collating-element��Der �from�-String in der Deklaration des Sortierelements enth�lt unbekannte Zeichen��ai_family� wird nicht unterst�tzt��ai_family� wird nicht unterst�tzt�ist bereits gestartet�Das Argument f�r �<%s>� mu� ein einzelnes Zeichen sein�Das Argument zu �%s� mu� ein einzelnes Zeichen sein�auth_none.c - Fatales �marshalling�-Problem�authunix_create: Hauptspeicher ersch�pft +-�Das Argument ist ung�ltig�Ung�ltiger Eigent�mer�Leeres FROM-Feld in der Link-Zeile�Leeres TO-Feld in der Link-Zeile�Speicherblock zum zweiten Mal freigegeben +-�Eigenartiger �mcheck_status�, die Bibliothek enth�lt Fehler +-�Broadcast: ioctl (Holen der Konfiguration der Schnittstelle)�Broadcast: ioctl (Holen der Parameter der Schnittstelle)�Puffer�berlauf�cache_set: Kann keinen neuen RPC-Puffer �rcp_buffer� anlegen�cache_set: Das Opfer wurde nicht alloziert�cache_set: Das Opfer wurde nicht gefunden�Kann die Abk�rzung der Zeitzone zur Verwendung direkt nach der Ende-Zeit nicht bestimmen�Kann die Prozedurnummer %d nicht erneut zuweisen +-�Kann den Status der Lokale-Datei �%s� nicht bestimmen�Nicht gen�gend Hauptspeicher f�r Symboldaten verf�gbar�Kann keinen internen Deskriptor erzeugen�Kann keine internen Deskriptoren erzeugen�Der Socken kann nicht zum Annehmen von Verbindungen aktiviert werden: %s�Kann den C Pr�prozessor nicht finden: %s +-�Kann keinen C Pr�prozessor finden (cpp) +-�Kann die alte Version %d nicht verarbeiten; aktuelle Version ist %d�Kann das Sortierelement �%.*s� nicht einf�gen�Kann nicht in die Ergebnistabelle einf�gen�Kann die neue Sortiersymboldefinition nicht einf�gen: %s�Kann die Profiling-Daten nicht laden��ffnen fehlgeschlagen��ffnen von �%s� fehlgeschlagen�Kann die Ausgabedatei �%s� nicht �ffnen: %s�Kann die Eingabedatei �%s� nicht �ffnen�Kann die Lokale-Definitionsdatei �%s� nicht �ffnen�Kann die Ausgabedatei nicht �ffnen�Kann die Ausgabedatei �%s� nicht �ffnen�Kann die Ausgabedatei �%s� f�r die Kategorie �%s� nicht �ffnen�Kann den Socket nicht �ffnen: %s�Kann die Spezifikation der Sortierreihenfolge nicht verarbeiten�Das Verzeichnis �%s� der Zeichensatz-Definitionen kann nicht gelesen werden�Kann die Konfigurationsdatei nicht lesen; das ist fatal�Kann nicht vom Client lesen�Kann den Header von �%s� nicht lesen�Kann das Lokale-Verzeichnis �%s� nicht lesen�Kann die Lokale-Datei �%s� nicht lesen�Kann die �repertoire�-Map �%s� nicht lesen�Kann keine Statistikdaten lesen�Kann den Status (stat()) der Datei �%s� nicht lesen: %s�Kann die Ausgabedatei �%s� nicht schreiben�Kann das Ergebnis nicht schreiben: %s�Kann die Statistik nicht schreiben: %s�Kann nicht zum Client schreiben�Die Daten einer Kategorie sind mehrfach angefordert worden, das sollte nicht passieren�Das Zeichen �%s�, das in der Zeichenklasse �%s� enthalten ist, mu� auch in der Zeichenklasse �%s� enthalten sein�Das Zeichen �%s� in der Zeichenklasse �%s� darf nicht in der Zeichenklasse �%s� enthalten sein�Das Zeichen �<SP>� ist in der Zeichen-Definition nicht enthalten�Das Zeichen L�%s� (Index %Zd), das in der Zeichenklasse �%s� enthalten ist, mu� auch in der Zeichenklasse �%s� enthalten sein�Das Zeichen L�%s� (Index %Zd) in der Zeichenklasse �%s� darf nicht in der Zeichenklasse �%s� enthalten sein�Das Zeichen �%s� ist nicht definiert, wird aber als Vorgabewert ben�tigt�Die Zeichenklasse �%s� ist bereits definiert�Die Zeichensatzbeschreibung �%s� ist bereits definiert�Die Zeichensatzbeschreibungsdatei �%s� wurde nicht gefunden�clnt_raw.c - Fataler Fehler bei der Header-Serialisierung.�clnttcp_create: Hauptspeicher ersch�pft +-�clntudp_create: Hauptspeicher ersch�pft +-�clntunix_create: Hauptspeicher ersch�pft +-�Das Sortierungselement �%.*s� ist mehr als einmal angegeben: Die Zeile wird ignoriert�Das Sortierungssymbol �%.*s� ist mehr als einmal angegeben; die Zeile wird ignoriert�Nach �%s� wird ein Sortierungssymbol erwartet�Verbindungsaufbau zur Adresse %s: �Konstante oder Bezeichner erwartet�Konvertierung von �%s� nach �%s� wird nicht unterst�tzt�Die Konvertierung wurde wegen Problemen bei der Ausgabe beendet�Kann keinen RPC-Server erzeugen +-�Kann das Programm �%d� Version �%d� nicht registrieren +-�Datenbank [Schl�ssel ...]�Die Default-Zeichensatzbeschreibung in der Datei �%s� wurde nicht gefunden�Der Richtungsanzeiger in der Zeichenkette %d im �era�-Feld in der Kategorie �%s� ist weder �+� noch �-��Der Richtungsanzeiger in der Zeichenkette %d im �era�-Feld in der Kategorie �%s� ist kein einzelnes Zeichen�Der Name des Zeichens �%s� ist mehrfach angegeben�Mehrfache Definition des Sortierungselementes�Mehrfache Definition des Eintrages �%.*s��Doppelter Schl�ssel�Doppelte �set�-Definition�Doppelter Zonenname �%s� (Datei �%s�, Zeile %d)�Der Nachrichtenbezeichner ist mehrfach vorhanden�Die Nachrichtennummer ist mehrfach vorhanden�Leere Zeichenkette�Leerer Name des Sortiergewichtes: Die Zeile wird ignoriert�enablecache: Cache ist bereits aktiv�enablecache: Kann keinen Cache anlegen�enablecache: Kann die Cache-Daten nicht anlegen�enablecache: Kann keinen FIFO-Cache anlegen�Kodierung f�r die Ausgabe�Kodierung f�r den urspr�nglichen Text�Das Ende eines Auslassungsintervalls ist gr��er als der Start�Fehler beim Feststellen der Identit�t des Aufrufers: %s�Fehler beim Schlie�en der Eingabedatei �%s��Fehler beim Schlie�en der Ausgabedatei �Fehler beim Schlie�en der Datei mit den Profiling-Daten�Fehler beim Einf�gen des Sortierelementes in die Hash-Tabelle�Fehler beim Einf�gen in die Hash-Tabelle�Fehler beim Lesen der Eingabe�F�r �copy� wird ein String-Argument erwartet�Die erwartete Fortsetzungszeile ist nicht vorhanden�Fehler beim Laden des Shared Objects �%s��Fehler beim Laden der Symboldaten�Fehler beim �mmap� der Datei mit den Profiling-Daten�Fehler beim Start der Konvertierung�Fehler beim Schreiben der Daten f�r die Kategorie �%s��fcntl: F_SETFD�Der Eintrag �%s� in der Kategorie �%s� ist nicht definiert�Die Datei �%s� existiert bereits und w�rde �berschrieben +-�Der �From�-Wert eines Sortierelementes mu� ein String sein�Fehler beim Holen des Datei-Status mit �fstat��Murks am Ende einer Zeichensatzspezifikation�Am Ende der Zahl sind unsinnige Eintr�ge�Unsinnige Eintr�ge am Ende des Offset-Wertes in der Zeichenkette %d im �era�-Feld der Kategorie �%s��Unsinnige Eintr�ge am Ende des Start-Datums in der Zeichenkette %d im �era�-Feld der Kategorie �%s��Unsinnige Eintrage am Ende des Stop-Datums in der Zeichenkette %d im �era�-Feld der Kategorie �%s��Erzeuge einen Aufruf-Graphen�Erzeuge ein 'flaches' Profile mit Aufrufzahlen und -zeiten�get_myaddress: ioctl (Holen der Schnittstellen-Konfiguration)�getent - lese Eintr�ge aus administrativen Datenbanken.�handle_request: Anforderung empfangen (Version = %d)�Hardlink fehlgeschlagen, es wird ein symbolischer Link verwendet�Ist irgendwo ein Hard-Link�ung�ltiges �CORRECTION�-Feld in der �Leap�-Zeile�ung�ltiges �Rolling/Stationary�-Feld in der �Leap�-Zeile�Ung�ltige Zeichenkonstante in der Zeichenkette�Ung�ltiges Zeichen in der Datei: �Ung�ltiges Sortierelement�Ung�ltige Definition�Ung�ltige Kodierung angegeben�ung�ltige Escape-Sequenz am Ende der Zeichenkette�ung�ltige Eingabe-Sequenz an der Stelle %ld�ung�ltige Namen f�r den Zeichenbereich�ung�ltiger nettype : �%s� +-�ung�ltige Nummer f�r den Offset in der Zeichenkette %d im �era�-Feld in der Kategorie �%s��ung�ltige �set�-Nummer�ung�ltiges Start-Datum in der Zeichenkette %d im �era�-Feld in der Kategorie �%s��ung�ltiges Ende-Datum in der Zeichenkette %d im �era�-Feld in der Kategorie �%s��Limit der Implementation: Es sind nicht mehr als %d Zeichen-Klassen erlaubt�Limit der Implementation: Es sind nicht mehr als %d Zeichen-Maps erlaubt�unvollst�ndige Zeichen- oder Shift-Folge am Ende des Puffers�ung�ltig formatierte Datei�Die Eingabezeile ist von einem unbekannten Typ�interner Fehler (ung�ltiger Descriptor)�Interner Fehler - �addtype� wurde mit einer ung�ltigen �isdst� aufgerufen�Interner Fehler - �addtype� wurde mit einem ung�ltigen �ttisgmt� aufgerufen�Interner Fehler - �addtype� wurde mit einem ung�ltigen �ttisstd� aufgerufen�Interner Fehler in der Datei �%s�, Zeile %u�ung�ltiger UTC-Offset�ung�ltiges Abk�rzungsformat�Ung�ltiger Tag des Monats�Ung�ltiges Ende-Jahr�Ung�ltiges Schaltjahr�Ung�ltiger Mode f�r dlopen()�ung�ltiger Monatsname�Ung�ltige gespeicherte Zeit�Ung�ltiges Anfangsjahr�Ung�ltige Tageszeit�ung�ltiger Name f�r einen Wochentag�Die Schl�ssell�nge in der Anforderung ist zu lang: %Zd�Die Zeile nach einem Auslassungintervall mu� eine Zeichen-Definition enthalten�Die Zeile vor einem Auslassungsintervall mu� eine Zeichen-Konstante enthalten�Die Zeile ist zu lang�Gib alle bekannten Zeichensatz-Kodierungen aus�Die Lokale-Datei �%s�, die im �copy�-Befehl verwendet wird, ist nicht vorhanden�Fehler beim Holen des Link-Status mit �lstat��ung�ltige Eingabezeile ignoriert�Das Mappen der Section-Header String-Tabelle ist fehlgeschlagen�Das Mapping der Section-Headers ist fehlgeschlagen�Der Speicher vor dem allozierten Block wurde �berschrieben +-�Der Speicher nach dem Ende des allozierten Blockes wurde �berschrieben +-�Kein Hauptspeicher mehr verf�gbar�Die Speicherverwaltung ist konsistent, die Bibliothek enth�lt Fehler +-�fehlendes �era�-Format in der Zeichenkette %d im �era�-Feld in der Kategorie �%s��fehlender �era�-Name in der Zeichenkette %d im �era� Feld in der Kategorie �%s��Regel ohne Name�Weder die urspr�ngliche noch die Ziel-Kodierung angegeben�netname2user: (NIS+ Lookup): %s +-�netname2user: DES Eintrag f�r �%s� im Verzeichnis �%s� ist nicht eindeutig�netname2user: LOCAL Eintrag f�r �%s� im Verzeichnis �%s� ist nicht eindeutig�netname2user: fehlende Group-ID Liste in �%s�.�netname2user: der Principal-Name �%s� ist zu lang�netname2user: Sollte nicht die Benutzernummer 0 haben�Das Programm %d wurde nie registriert +-�Kein <Uxxxx> oder <Uxxxxxxxx> Wert angegeben�Kein g�ltiger regul�rer Ausdruck f�r den Eintrag �%s� in der Kategorie �%s�: %s�Kein Tag des Monats pa�t zur angegebenen Regel�Keine Definition f�r �UNDEFINED��Kein Dateiname f�r Profiling-Datenn angegeben und das Shared Object �%s� hat keinen �soname��Es d�rfen keine anderen Schl�sselworte angegeben werden, wenn �copy� verwendet wird�Es wurde keine Ausgabedatei erzeugt, weil Warnungen ausgegeben wurden�keine �repertoire�-Map angegeben: Verarbeitung abgebrochen�Kein symbolischer Name angegeben�Kein symbolischer Name f�r das Ende des Intervalles angegeben�Kein Sortiergewicht (�Weight�) f�r das Symbol �%s� definiert�Keine regul�re Datei�nscd Konfiguration: +- +-%15d Server Debug Level +-�nscd l�uft nicht! +-�Nur �WIDTH�-Definitionen d�rfen nach einer �CHARMAP�-Definition folgen�Die urspr�ngliche Kodierung nicht mit �-f� angegeben�Ausgabedatei�pmap_getmaps RPC Problem�poll: Protokollfehler im Verbindungsaufbau +-�Fehler beim Aufruf des Pr�prozessors�Gib eine Liste der gez�hlten Pfade und der Anzahl der Benutzung aus�Gebe Informationen �ber den Bearbeitungsstand aus�Probleme beim Lesen von �%s��Die Datei �%s� mit Profiling-Daten pa�t nicht zum Shared Object �%s��Das Programm %lu ist nicht verf�gbar +-�Das Programm %lu ist in der Version %lu nicht verf�gbar +-�Program %lu Version %lu ist bereit und wartet +-�rcmd: poll (Vorbereiten der Standardfehlerausgabe): %m +-�rcmd: Socket: Alle Ports sind zur Zeit belegt +-�rcmd: write (Vorbereiten der Standardfehlerausgabe): %m +-�registerrpc: Hauptspeicher ersch�pft +-�Wiederholung der �Leap�-Sekunde�Die �repertoire� Map-Datei �%s� wurde nicht gefunden�rpcgen: Kodierungsfehler bei der �arglist� +-�rpcgen: Zu viele Defines +-�rpcinfo: �%s� ist ein unbekannter Rechner +-�rpcinfo: �%s� ist ein unbekannter Service +-�rpcinfo; Kann die Registrierung des Programms �%s� Version �%s� nicht l�schen +-�rpcinfo: Broadcast ist fehlgeschlagen: %s +-�rpcinfo: Kann den Portmapper nicht erreichen�Dieselbe Regel ist in mehreren Dateien enthalten�Kurzer Read beim Lesen des Anforderungsschl�ssels: %s�Kurzer Read beim Lesezugriff: %s�Kurzer Write in �%s�: %s�socket: Protokollfehler im Verbindungsaufbau +-�Die Anweisungen �forward� und �backward� schlie�en sich aus�Die Angabe eines Sortiergewichtes f�r ein Sortiersymbol ist nicht sinnvoll�Standardeingabe�Standardausgabe�Das Start-Datum in der Zeichenkette %d im �era�-Feld der Kategorie �%s� ist ung�ltig�Das Start-Jahr ist gr��er als das Ende-Jahr�Das Startjahr ist zu gro� f�r die Darstellung�Das Startjahr ist zu klein f�r die Darstellung�Das Ende-Datum in der Zeichenkette %d im �era�-Feld in der Kategorie �%s� ist ung�ltig�svc_run - �select� ist fehlgeschlagen�svc_tcp.c - �getsockname� oder �listen� nicht m�glich�svc_tcp.c - Problem bei der Erstellung des TCP-Sockets�svc_tcp: makefd_xprt: Hauptspeicher ersch�pft +-�svc_unix.c - Problem bei der Erstellung des AF_UNIX-Sockets�svc_unix.c - �getsockname� oder �listen� nicht m�glich�svc_unix: makefd_xprt: Hauptspeicher ersch�pft +-�svctcp_create: Hauptspeicher ersch�pft +-�svcudp_create - �getsockname� fehlgeschlagen�svcudp_create: Hauptspeicher ersch�pft +-�svcudp_create: Problem bei der Erstellung des Sockets�svcunix_create: Hauptspeicher ersch�pft +-�Das Symbol f�r das Mehr-Zeichen Sortierelement �%.*s� wiederholt die Elementdefinition�Das Symbol f�r das 'multicharacter' Sortierelement �%.*s� wiederholt eine andere Symboldefinition�Das Symbol f�r das 'multicharacter' Sortierelement �%.*s� wiederholt eine Symboldefinition�Das Symbol f�r das 'multicharacter' Sortierelement �%.*s� kollidiert mit einem symbolischen Namen in der Zeichensatzbeschreibung�Syntaxfehler in der �%s�-Definition: %s�Syntaxfehler in der �order_start�-Anweisung�Syntaxfehler in der Zeichenklassendefinition�Syntaxfehler in der Zeichensatzumwandlungsdefinition�Syntaxfehler in der Definition der Sortierreihenfolge�Syntaxfehler in der Definition der Sortierung�Syntaxfehler in der Definition der �LC_CTYPE�-Kategorie�Syntaxfehler in der Definition einer neuen Zeichenklasse�Syntaxfehler in der Definition eines neuen Zeichensatzes�Syntaxfehler in der Lokale-Definitionsdatei, Abschnitt �message��Syntaxfehler in der Lokale-Definitionsdatei, Abschnitt �monetary��Syntaxfehler in der Lokale-Definitionsdatei, Abschnitt �numeric��Syntaxfehler in der Lokale-Definitionsdatei, Abschnitt �order��Syntaxfehler im Prolog: %s�Syntaxfehler in der �epertoire� Map-Definition: %s�Syntaxfehler in der Lokale-Definition zur Zeit (Abschnitt �time�)�Syntaxfehler: nicht in einem Abschnitt der Lokale-Definition�Die Zielkodierung ist nicht mittels �-t� angegeben�Dies ist die erste Definition�Zeit vor Null��berlauf der Zeit�Zu wenige Bytes in der Zeichenkodierung�Zu viele Bytes in der Zeichenkodierung�Zu viele Zeichenklassen definiert�Zu viele Schaltsekunden�Zu viele Ortszeittypen�Zu viele �berg�nge?!�Zu viele Sortiergewichte�Zu viele oder zu lange Abk�rzungen f�r Zeitzonen�Am Zeilenende sind unsinnige Eintr�ge�Schwierigkeiten bei der Antwort an das Programm %d +-�Zwei aufeinanderfolgende Zeilen mit �...� sind nicht erlaubt�Ein einzelnes Jahr angegeben�Fehler beim Allozieren des Puffers f�r die Eingabe�Fehler beim Freigeben des Speichers f�r die Argumente�nicht definiert�unbekanntes Zeichen �%s��Ung�ltiges Zeichen im Feld �%s� in der Kategorie �%s��unbekannte �collation�-Anweisung�unbekannte Anweisung �%s�: Die Zeile wurde ignoriert�unbekannter iconv()-Fehler %d�Unbekanntes Set �%s��Unbekanntes Symbol �%.*s�: Die Zeile wurde ignoriert�Zeitzone ohne Regeln�Die Nachricht ist nicht abgeschlossen�Zeichenkette wird nicht beendet�Zeichenkette wird nicht beendet�Der symbolische Name wird nicht beendet�Der Name des Sortiergewichtes wird nicht beendet�Das obere Ende des Intervalls ist nicht kleiner als das untere Ende�Syntax: %s Eingabedatei +-�Der 29. Februar wurde in einem nicht-Schaltjahr verwendet�Der Wert f�r �%s� mu� eine Ganzzahl sein�Der Wert f�r �<%s>� mu� zwischen eins und vier liegen�Der Eintrag f�r das Feld �%s� in der Kategorie �%s� darf nicht leer sein�Der Wert von �<mb_cur_max>� mu� gr��er als der Wert von �<mb_cur_min>� sein�Der Wert im Feld �int_curr_symbol� in der Kategorie �LC_MONETARY� geh�rt nicht zu einem g�ltigen Namen in ISO-4217�Der Wert im Feld �int_curr_symbol� in der Kategorie �LC_MONETARY� hat die falsche L�nge�Der Wert f�r den Eintrag �%s� in der Kategorie �%s� mu� kleiner als 127 sein.�Warnung: �Beim Annehmen der Verbindung: %s�Beim Anfordern eines Cache-Eintrages�Fehler beim Allozieren des Eintrages in die Hash-Tabelle�Beim Anfordern einer Schl�ssel-Kopie�beim �ffnen der alten Katalogdatei�beim Aufbereiten der Ausgabe�beim Lesen der Datenbank�beim Holen des Dateistatus der Datei mit den Profiling-Daten�beim Schreiben der Datenbankdatei�Der 'Write' wurde nur unvollst�ndig ausgef�hrt�ist auch f�r andere Benutzer als den Dateieigent�mer beschreibbar�Falsche Anzahl an Argumenten�Falsche Anzahl an Feldern in der Leap-Zeile�Falsche Anzahl der Felder in der Link-Zeile�Falsche Anzahl der Felder in der Rule-Zeile�Falsche Anzahl der Felder in der Zeitzonen-Fortsetzungszeile�Falsche Anzahl an Feldern in der Zone-Zeile�xdr_reference: Hauptspeicher ersch�pft +-�xdrrec_create: Hauptspeicher ersch�pft +-�yp_update: Kann den Rechnername nicht in einen Netzname umwandeln +-�yp_update: Kann die Adresse des Servers nicht finden +-� +\ No newline at end of file +diff -Naur ../glibc-2.1.3/po/el.mo glibc-2.1.3/po/el.mo +--- ../glibc-2.1.3/po/el.mo 1999-07-18 18:19:41.000000000 -0700 ++++ glibc-2.1.3/po/el.mo 1969-12-31 16:00:00.000000000 -0800 +@@ -1,282 +0,0 @@ +-������J�����l�����$������1��"��� 1��"���,1�����O1��:���k1������1������1������1������1��3����1��3���,2�����`2��&���t2��%����2������2��%����2��3����2�����23��"���K3��!���n3������3������3������3������3������3��"���4��*���)4�����T4��&���n4��&����4��&����4��&����4��&��� +-5��$���15�����V5�����q5������5��,����5������5��%����5��,���6��-���C6�� ���q6��&����6������6������6������6�����7������27��2����7��#����7�� ���8�����8�����.8��'���N8�����v8��(���8�� ����8������8������8��$����8������8��(���9�����89�����H9�����T9��/���k9������9������9������9������9������9������9�����:�����:�����):�����B:�� ���N:�����X:��&���p:��-����:��!����:������:�����;�����#;�����:;��&���Z;��%����;��!����;������;��-����;�����<��%���,<�����R<�����n<�����{<������<������<��@����<��D���=�����Q=�����d=�����}=�� ����=�������=�����d>�����{>������>������>������>������>������>������>�����?�����$?�����-?�����6?��)���V?�� ����?������?��1����?������?������?����� +-@�����@�����2@�����E@�����^@�����m@������@������@������@������@������@������@������@�����A�����A�����A�����2A�����FA��!���SA�����uA��.����A������A������A������A������A�� ���B�����B��+���5B�����aB�����rB������B������B������B������B������B�����C�����&C��1���7C��$���iC������C������C������C������C������C�����D�����D�����D�����4D�����;D�����JD�����cD�� ���rD������D������D������D��!����D������D����� E�����E�����+E��9���>E�����xE������E������E��#����E������E������E����� +-F�����%F�����CF�����cF�����lF������F������F������F������F������F������F������F�����G�����1G�����QG�����bG�����zG������G������G������G������G������G�� ���H�����#H�����AH�����RH�����pH������H������H��!����H������H������H�����I�����)I�����?I�� ���QI��#���_I������I������I������I������I������I������I�����J�����2J�����7J�����JJ�����hJ������J������J������J������J������J������J�����K�����*K�����FK��!���fK������K������K������K������K������K�����L��"���(L�����KL�����XL�����gL�����~L������L������L��-����L������L������L�����M�����*M��2���AM��;���tM������M������M������M������M�� ���N�� ���"N�����CN�����VN�����qN������N������N������N�� ����N�� ����N������N�����O�����O�����%O�����6O�����JO�����_O�����rO������O��"����O�� +-����O������O�� ����O��!����O������P�����P�����#P�����AP��"���TP�����wP������P������P������P������P��'����P��#����P��&���Q�� ���AQ�����OQ�����iQ������Q������Q������Q������Q������Q������Q������Q�����R�����R�����(R�����:R�����GR�����bR��W��wR��V���T�����&W������Y��#����[��:����[������[�����\��%���&\�����L\��"���b\������\������\������\������\������\��F����\��.���1]��6���`]��8����]��;����]��I���^��+���V^��+����^��'����^������^�� ����^������^�����_�����'_��%���9_��.���__��&����_������_��C����_��#���`�����9`��&���X`�����`��1����`������`��"����`������a��'���a�����Da��.���aa��"����a��(����a��!����a������a��!���b��9���=b��4���wb��8����b��+����b��8���c��$���Jc��"���oc��!����c��.����c��<����c��;��� d��$���\d������d������d��"����d��)����d��N���e��U���Te������e��&����e��)����e�� ���f�����'f��+���@f�����lf������f������f��"����f��%����f��*��� g��*���8g��0���cg��7����g��#����g��!����g��$���h��,���7h�����dh��'���sh��%����h��2����h������h��.���i�����0i��K���Ii��L����i��L����i��2���/j�����bj��%���xj��-����j��$����j������j�����k�����k��(���5k��!���^k��F����k������k��B����k��B���l��?���`l��<����l������l������l��.���m��0���Bm��0���sm������m������m������m������m�����n�����n�����/n�����Bn�����Un�����kn�����n��5����n��G����n�� ���o��5��� o�����Vo�����co��'���zo��,����o������o������o��&����o��?���p��=���Yp�� ����p������p��A����p�����q�����q��7���;q��3���sq������q��'����q��!����q�����r��C���r�����]r�����yr��)����r��*����r��%����r�����s��$���2s�����Ws�����ss������s������s��>����s�����t��!���*t��#���Lt�� ���pt��*����t��*����t��=����t��H���%u�����nu�����}u��E����u��&����u��(����u��'���#v��E���Kv������v��$����v��(����v��'����v����� w��"���>w��&���aw��P����w��V����w��U���0x��O����x��V����x��!���-y��'���Oy��*���wy��/����y��*����y��$����y��/���"z��1���Rz��/����z��)����z��*����z��)��� {��#���3{�����W{��&���r{��4����{������{������{�� ����{��#��� +-|��$���.|��"���S|�����v|������|������|������|��.����|������|�����}��3���:}�����n}�� ����}������}��0����}������}��$����}�����~��#���$~�����H~�����T~�����i~�����}~������~��4����~������~�������'���#��B���K��D������j������K���>���?�������7���ʀ�����������������9������P������g�����������������#�������#���߁��#������0���'���#���X���*���|���%�������=��͂��9������9���E���������N�������$���������������1������9���<���M���<����������Dž��)���݅��*���������2���&���G���=���n���-�������9���چ��5������,���J���-���w���'�������$���͇��#������0������F���G����������2�������2���ވ��2������2���D���2���w���.�������#���ى���������������-���9���%���g���)�������-�������.������(������*���=���"���h����������#�������#���ȋ���������>�������"���Ɍ�� �������������+��� ���)���5��� +-���_���5���j���+����������̍�� �����:���؍��'������<���;������x��� �������,�������>�����������������������(������<���+���[���������������������������̏���������������"������H���8���L�������/���ΐ��+�������+���*���#���V���4���z���6�������=������/���$���+���T���H�������,���ɒ��<�������,���3���"���`���8�������%�������������R������Y���T����������������� ���ߔ����������������+���ە��#���������+������K������d���#��������������$���Ö�������� +-�������������%������5���7������m���%���~���5������� ���ڗ��'����������#���0���5������f���$��������������$����������ݘ�� ����������������0������9���'���R������z��� +-������������������������ƙ�����֙��&������������/���-������]������p�������������������������������7���ך�����������$���%���=���(���c���0�����������������ݛ��$����������!���5���5���(���k��������������������Ɯ��������+������� ���,������:������J��� ���j������t���������������������������ϝ��)������'������ ���4��� ���U������v�����������������N�������)������&���0������W���.���o���������� �������)���ן��'������)���)������S���(���`�����������������!���à���������������������=���&���(���d���-������� �������$���ܡ��%������#���'���4���K����������&����������Ģ��'���آ��/�������"���0������S������p�����������������-���ȣ��'�������'������!���F������h�����������������#�������%���Τ��*�������������*���2���!���]���������.����������Υ�����ե��!������"������$���5���-���Z���������� �������!���Ħ��������8�������6���8���%���o���!�����������������ק��&�������������(���7���&���`���A������� ���ɨ�����ר������������������������2���C���I�����������������#���ʩ�� ������L������O���\����������,���ê��(������!���������;���%���J���&���p���%�������!����������߫��!������&������'���/������W������f���$���u��� ������������������������ͬ���������������������#���������C������P������i���-����������������ɭ��+������������2���2������e��������������������������Į��&���ٮ��&�������4���'������\������o������������������������"���ѯ������������������������8������N������`������r��� ��������������"�����������+�����j�����0��z���-�������R���ټ��"���,���"���O���7���r����������-���ʽ������������������������4���"���K���k���n���,���ھ��M������M���U���B�������Y������;���@���;���|���%�������������������������������������9���6���Y���-�������*��������������m������8���v���7�������,�������,������6���A������x���5�������(�������/�������'������=���C���-�������6�������(�������&������)���6���K���`���C�������G�������4���8���E���m���$�������%�������+�������8���*���W���c���V�������)���������<���$���W���'���|���:�������f�������i���F����������"�������'����������������#���-���:������h����������)�������8�������2������<���6���7���s���G�������=�������)���1���(���[���+�������:��������������.�������.���)���C���X����������=��������������k������d���w���h�������0���E������v���7�������?�������0���������9������V������i���:�������)�������\����������I���T���`���X�������@������?���O�����������������2�������4�������4���1���"���f���������� �������������������������������������(������>������X������p���=�������C�������������I���������i���!���z���/�������6�������������������1���,���R���^���R�������������"������C���;���.�������������R�������<���!������^���.���y���)��������������@�������%���-���%���S���1���y���1�������&�������%������%���*������P������p���"�������#�������C�������������3���5���5���i���"�������3�������3�������Q���*���R���|�����������������^�������5���O���8�������7�������]����������T���(���s���)�������-�������!�������%������-���<���X���j���U�������T������W���n���^�������'���%���9���M���/�������3�������-�������'������4���A���8���v���6�������/�������1������0���H���'���y���"�������)�������9����������(������E������W���+���h���2�������#�������(�������$���������9������X���9���n���*�������,�������:����������;������Q������Y���6���r����������&��������������(����������$������0������H��� ���g����������:�������"�������)������2���.���S���a���M�������s������Q���w���Q�������H������ ���d���(��������������"�������)�������<���������U���$���n���$�������$�������.�������$������D���1���0���v����������n����������9��S��1����������������������)�������������q���p���1�����/���c���������"���L�������d���f�������0������������������������� +-�������������������������������� ������<�������������������������I�����������;������(��Y���U������������������@�����������������������'���������������������-������H��������������F��z�������o���������������'����������a�������n��H������C������F��������������m��j���_���>�����������������������������,������g�������������.��������������������������B�����������6������0���i�������?�������M��4�������������������������3�����������s��������������������������������������P�����E������`�����������������G�������I��-��l������������:���������������������A�����=������#��[��������������������+�� �������������������������������������������*�������������;��k���u���o��F��>��������������� ��������������p�������������������������@������"����������Q������7����������t������������������������?������=����������������*������V���B�����v��f������������E���H��7���������������������-��������7���������2������3������������������9������W��3������?�����������������������.���r��d�������������������������$�������������m���������%������u��K�������%�������������\��D��t������O����������G������������������������X��J��Z������������������������������������ ��8�����������������5���.��r������q������������=�������2������y������:���������������������������[����������������4����������/������������������������������������������{���c�������Q��`��z��+���h������������������������������������������^��������������������s�����h������R���������J��������������S���&��C�������������U��:������>�����"��������������(���|������K��������� ��������������������������i��������������������x���~��������J��� �������!��,����������������������T���������������������5������e�������������a�������������b���������������,������������j�����������������Y��P���L���������������������������������������������������������������D���N�����������C����������������&���<��l��}�����������������I�����������/������������������6��_���������1��������2�������*��D�����6���������������X�������������������+���������]������8���~���T��������(����������G��w������������������]������������W���V������������������������������A���������O���������������������������!���������������������������������������������������)��R��4����������������������g��k����������'�������v������Z����������������������������������������������������������y�� ������\���#����������������������@����������8��#��N��^������;������������������ ������������������������x��M�������{�����������������������������������������0��<���A��}��$�����������E��9���������|���������������������5��w��$��������� ��!������������ +-��b������ +-��������������������&������e�������������B������������)���%������� rpcinfo -b prognum versnum +-� rpcinfo -d prognum versnum +-� rpcinfo -p [ host ] +-� rpcinfo [ -n portnum ] -t host prognum [ versnum ] +-� program vers proto port +-� (rule from "%s", line %d)� done +-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed. +-�%s%s%s:%u: %s%sUnexpected error: %s. +-�%s%sUnknown signal %d +-�%s: %d did not sign extend correctly +-�%s: <mb_cur_max> must be greater than <mb_cur_min> +-�%s: Can't create %s: %s +-�%s: Can't create directory %s: %s +-�%s: Can't link from %s to %s: %s +-�%s: Can't open %s: %s +-�%s: Can't remove %s: %s +-�%s: Error closing %s: %s +-�%s: Error reading %s +-�%s: Error writing %s +-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s +-�%s: Memory exhausted: %s +-�%s: More than one -L option specified +-�%s: More than one -d option specified +-�%s: More than one -l option specified +-�%s: More than one -p option specified +-�%s: More than one -y option specified +-�%s: command was '%s', result was %d +-�%s: error in state machine�%s: illegal option -- %c +-�%s: invalid option -- %c +-�%s: option `%c%s' doesn't allow an argument +-�%s: option `%s' is ambiguous +-�%s: option `%s' requires an argument +-�%s: option `--%s' doesn't allow an argument +-�%s: option `-W %s' doesn't allow an argument +-�%s: option `-W %s' is ambiguous +-�%s: option requires an argument -- %c +-�%s: panic: Invalid l_value %d +-�%s: premature end of file�%s: unrecognized option `%c%s' +-�%s: unrecognized option `--%s' +-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ] +- [ -L leapseconds ] [ -y yearistype ] [ filename ... ] +-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ... +-�(unknown authentication error - %d)�(unknown)�*standard input*�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Accessing a corrupted shared library�Address already in use�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempting to link in too many shared libraries�Authentication OK�Authentication error�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Block device required�Broadcast select problem�Broken pipe�Bus error�CPU time limit exceeded�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Channel number out of range�Child exited�Client credential too weak�Communication error on send�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Copyright (C) %s Free Software Foundation, Inc. +-This is free software; see the source for copying conditions. There is NO +-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-�Cputime limit exceeded�Database is busy�Destination address required�Device not a stream�Device not configured�Device or resource busy�Directory not empty�Disc quota exceeded�Domain not bound�EMT trap�Error %d�Error in unknown error system: �Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�Filesize limit exceeded�Floating point exception�Function not implemented�Gratuitous error�Hangup�Host is down�Host name lookup failure�I/O possible�IOT trap�Identifier removed�Illegal Instruction�Illegal instruction�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Killed�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link has been severed�Link number out of range�Local domain name not set�Local resource allocation failure�Machine is not on the network�Memory exhausted�Message too long�Multihop attempted�NIS client/server version mismatch - can't supply service�NIS map data base is bad�Name not unique on network�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with name�No anode�No buffer space available�No child processes�No data available�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered. +-�No route to host�No space left on device�No such file or directory�No such key in map�No such map in server's domain�No such process�Not a XENIX named type file�Not a directory�Numerical argument out of domain�Numerical result out of range�Object is remote�Odd number of quotation marks�Operation already in progress�Operation not permitted�Operation not supported�Operation not supported by device�Operation now in progress�Operation would block�Out of streams resources�Package not installed�Permission denied�Power failure�Premature end of regular expression�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RTLD_NEXT used in code not dynamically loaded�Read-only file system�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Report bugs using the `glibcbug' script to <bugs@gnu.org>. +-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Segmentation fault�Server rejected credential�Server rejected verifier�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Srmount error�Stack fault�Stale NFS file handle�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�System resource allocation failure�Terminated�Text file busy�Timer expired�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/BPT trap�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' for more information. +-�Trying %s... +-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown error �Unknown host�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage: %s [OPTION]... -o OUTPUT-FILE [INPUT-FILE]... +- %s [OPTION]... [OUTPUT-FILE [INPUT-FILE]...] +-Mandatory arguments to long options are mandatory for short options too. +- -H, --header=NAME create C header file NAME containing symbol definitions +- -h, --help display this help and exit +- --new do not use existing catalog, force new output file +- -o, --output=NAME write output to file NAME +- -V, --version output version information and exit +-If INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-�Usage: %s [OPTION]... INPUT-FILE OUTPUT-FILE +- %s [OPTION]... -o OUTPUT-FILE INPUT-FILE +- %s [OPTION]... -u INPUT-FILE +-Mandatory arguments to long options are mandatory for short options too. +- -f, --fold-case convert key to lower case +- -h, --help display this help and exit +- -o, --output=NAME write output to file NAME +- --quiet don't print messages while building database +- -u, --undo print content of database file, one entry a line +- -V, --version output version information and exit +-If INPUT-FILE is -, input is read from standard input. +-�Usage: %s [OPTION]... name +-Mandatory arguments to long options are mandatory for short options too. +- -c, --force create output even if warning messages were issued +- -h, --help display this help and exit +- -f, --charmap=FILE symbolic character names defined in FILE +- -i, --inputfile=FILE source definitions are found in FILE +- -u, --code-set-name=NAME specify code set for mapping ISO 10646 elements +- -v, --verbose print more messages +- -V, --version output version information and exit +- --posix be strictly POSIX conform +- +-System's directory for character maps: %s +- locale files : %s +-�Usage: %s [OPTION]... name +-Mandatory arguments to long options are mandatory for short options too. +- -h, --help display this help and exit +- -V, --version output version information and exit +- +- -a, --all-locales write names of available locales +- -m, --charmaps write names of available charmaps +- +- -c, --category-name write names of selected categories +- -k, --keyword-name write names of selected keywords +-�Usage: %s variable_name [pathname] +-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Written by %s. +-�Wrong medium type�YPBINDPROC_DOMAIN: %s +-�You really blew it this time�Zone continuation line end time is not after end time of previous line�`%1$s' definition does not end with `END %1$s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice�bogus mcheck_status, library is buggy�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d +-�cannot `stat' locale file `%s'�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot open�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot process order specification�cannot read character map directory `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot write output files to `%s'�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �couldn't create an rpc server +-�couldn't register prog %d vers %d +-�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�end point of ellipsis range is bigger then start�error while inserting collation element into hash table�error while inserting to hash table�expect string argument for `copy'�expected continuation line not found�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�get_myaddress: ioctl (get interface configuration)�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal names for character range�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incorrectly formatted file�input line of unknown type�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid GMT offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�memory clobbered before allocated block�memory clobbered past end of allocated block�memory exhausted�memory exhausted +-�memory is consistent, library is buggy�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�never registered prog %d +-�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�only WIDTH definitions are allowed to follow the CHARMAP definition�problems while reading `%s'�program %lu is not available +-�program %lu version %lu is not available +-�program %lu version %lu ready and waiting +-�rcmd: select (setting up stderr): %m +-�rcmd: socket: All ports in use +-�rcmd: write (setting up stderr): %m +-�registerrpc: out of memory +-�repeated leap second moment�rpcinfo: %s is unknown host +-�rpcinfo: %s is unknown service +-�rpcinfo: Could not delete registration for prog %s version %s +-�rpcinfo: broadcast failed: %s +-�rpcinfo: can't contact portmapper�rpcinfo: can't contact portmapper: �same rule name in multiple files�select: protocol failure in circuit setup +-�socket: protocol failure in circuit setup +-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp: makefd_xprt: out of memory +-�svctcp_.c - cannot getsockname or listen�svctcp_.c - udp socket creation problem�svctcp_create: out of memory +-�svcudp_create - cannot getsockname�svcudp_create: socket creation problem�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d +-�two lines in a row containing `...' are not allowed�typed single year�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�values for field `%s' in category `%s' must not be zero�while opening UTMP file�while opening old catalog file�while preparing output�while reading database�while writing database file�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�yp_update: cannot convert host to netname +-�yp_update: cannot get server address +-�Project-Id-Version: libc 2.0.7 +-POT-Creation-Date: 1998-07-26 08:57-0700 +-PO-Revision-Date: 1999-01-24 20:21+0000 +-Last-Translator: Mavroyanopoulos Nikos <nmav@i-net.paiko.gr> +-Language-Team: Greek <S.Xenitellis@rhbnc.ac.uk> +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=ISO-8859-7 +-Content-Transfer-Encoding: 8-bit +-� rpcinfo -b '�����. ������������' '�����. �������' +-� rpcinfo -d '�����. ������������' '�����. �������' +-� rpcinfo -p [ ������� ] +-� rpcinfo [-n ���� ] -t ������� '�����. ������������' ['�����. �������'] +-� ��������� ���. ���������� ���� +-� (������� ��� "%s", ������ %d)� ����� +-�"%s", ������ %d: %s�"���� %s" ������ ��� ������� -l ����� ��������� �������������"���� %s" ������ ��� ������� -p ����� ��������� �������������%s �� ���������� �����%s%s%s:%u: %s%s� ���������� %s' �������. +-�%s%s%s:%u: %s%s�� ����������� ������: %s. +-�%s%s������� ���� %d +-�%s: %d ��� ��������� ���������� ����� +-�%s: <mb_cur_max> ������ �� ����� ���������� ��� <mb_cur_min> +-�%s: ��� ����� ������� �� ������������ %s: %s +-�%s: ��� ����� ������� �� ������������ � ��������� %s: %s +-�%s: ��� ����� ������� �� �������� �� %s �� �� %s: %s +-�%s: ��� ����� ������� �� �������� �� %s: %s +-�%s: ��� ����� ������� �� ��������� �� %s: %s +-�%s: ������ ���� �� �������� ��� %s: %s +-�%s: ������ ���� ��� �������� ��� %s +-�%s: ������ ���� ��� ������� ��� %s +-�%s: ������ ���� ��� ������� ���� �������� ����� �%s: ������ ����������(leap) ��� ������ �� ���������� ������������� %s +-�%s: � ����� �����������: %s +-�%s: ������������ ��� ��� -L �������� ������������ +-�%s: ������������ ��� ��� -d �������� ������������ +-�%s: ������������ ��� ��� -l �������� ������������ +-�%s: ������������ ��� ��� -p �������� ������������ +-�%s: ������������ ��� ��� -y �������� ������������ +-�%s: � ������ ���� '%s', �� ���������� ���� %d +-�%s: ������ ��� ��������� �����������%s: �� �������� ������� -- %c +-�%s: �� ������ ������� -- %c +-�%s: � ������� `%c%s' ��� ��������� ��������� +-�%s: � ������� `%s' ����� ����������� +-�%s: � ������� `%s' ������� ��� ��������� +-�%s: � ������� `--%s' ��� ��������� ��������� +-�%s: � ������� `-W %s' ��� ��������� ��������� +-�%s: � ������� `-W %s' ����� ����������� +-�%s: � ������� ������� ��� ��������� -- %c +-�%s: �������: �� ������ l_value %d +-�%s: ������ ����� ��������%s: �� ������������ ������� `%c%s' +-�%s: �� ������������ ������� `--%s' +-�%s: � ����� ����� %s [ -s ] [ -v ] [ -l ������ ��� ] [ -p posix ������� ] +- [ -d ��������� ] [ -L ������������ ���������� ] [ -y ����� ����� ] [ ������ ... ] +-�%s: � ����� ����� %s [ -v ] [ -c ������� ] �������� ����� ... +-�(������� ������ ������������ - %d)�(�������)�*�������� �������*��� ����� .lib ��� a.out ����� ��������������; ����� ������ = %lu, ������ ������ = %lu�; ����� = �� <SP> ���������� ��� ������ �� ����� ���� ����� `%s'�� <SP> ���������� ��� ����� ���� ����� `%s'�?������������������������� ��� ������������� �������������� ������������ ��������� �������� ����� ��� �� ������� ���������� ����������� ��� ������������� ��� �� ����������������� ���������������������� ��������� ��� ���������� ����� ���� ����������������� �������� �� ���� ������ ��������������� ����������������������� �������������� ���������������������� �������������������� ����������� ����������������� ���������� ������� ������������������������ ���������������� ����� ��������������������� ������� �������������� ��� select ������������������� ��������������� ���� ������(bus)������������ �� ���� ������ ��� CPU���� ����� ������ � ���������� ���� ��������� ��������������� ��������������� ����� ������ � �������� �� ��� ���������� ��� ���������� ����� ��� ��������� ����� ������ � ����������� �� �� portmapper���� ����� ������ � ����������� �� �� ypbind���� ����� ������ � ����������� �� �� ypserv���� ����� ������ �� ��������� ��������� ����� ������ � �������� ��� ��������� �������������� ����� ������ � ���������� �������� ��� ������� rpc���� ����� ������ � ����� �������� ��������������� ��������������� ����� ������ � ���� ���������� ���� ����������� ����� ������ � ���������� ��� ������������� ����� ������ � �������� ���� �� �������� ��� ���� ����� ���������������� ����� ������ � �������� ������� ������������ ����� ������ � ������ ��� �������� �������� SO_BROADCAST�� ������� ��� �������� ����� ��� ��� �� ������ ��������� ��������� ��������������� �������������� ��� ��������������� ����� ���� �������������� ������������ ���� ��� ���������� ����������� ���� ��� ������������������� �������� ������ ��� ������� ����������, ������ �� +-������������ ����...������������ �������� ������ ��� ��� ����������� ���������, ������ �� +-������������ ����...��������� ���������� ������� ������� ��� �� ���������� ���������������������Copyright (C) %s Free Software Foundation, Inc. +-���� ����� �������� ���������� ����� ��� ������ ������ ��� ����� ����������. +-��� ������� �������� ���� ����� ��� ��������I������� � ������������� ��� +-������ ������������ �����. +-��� ���� ������ ���� ����������� ������������� ���� ��������� ����� ����������������������� ��������� ������������ ������� ��� ����� ������ ������� ��� ���� ������������������� � ����� ����� ��������������� ��������� ��� ����� ����������������� �� ���� ������ ��� ������� ������ ��� ��������EMT ������������ %d������� �� ������� ������� ���������: �������: �� .netrc ������ ����� ���������� ��� ������.���������� ������������� ��� ���������� ��� �������������������: �� ������� ��� ������ �� `_POSIX2_LOCALEDEF'��������� (�� ����������� ������)�� ����������� ������� �� ���� ������������ ������ ���������� �������� ������� �������� �� ������ �������������� ������ ����� ������������������� �� ���� �������� ������������ ������ ������������������ �� ���� �������� ���������������� ������� �������������� ���������� ��� ���� ������������������������ ����������������� ������� �� ������������������� ���������� �������� ����������������� � �������/�������IOT �������������������� ������������������� ��������������� ��������������� �������������������� ����� ������� � ���������������������� ioctl ��� ������������������ ���������� ��� ��������� ������������������ ������������������ �������/���������������� ������ NIS���������� ������ ypbind������������������� ����� ������������ ���������� ����� ���������� �� ������ �� ��������������� ������ ������������� ������ ����-������������ ������� ���������� �������� ��������� ������ �������������� ������������������ ������� �����������(verifier) ������������������ ������� ���������� ������������ ������ ����������� ��� \{\}��� ������� ��������� ������ ����������� ������ ������������ ������ � ����������� multibyte � ������ ������������� ������ ������������� �������� ���������� ������ ����� ��������� ������ �������� ���������� ������� ������� ���������� ������� ����������� ���������� ������� �����������(verifier) ������������� ������ ��������� ��������������� ��� ������� ����� ������������������������� 2 ����������������� 2 ��� ��������������������� 3 ����������������� 3 �������������� ��������� �������� ������� ��������� ����� ��� ��� �� �������� ���� ������� �� ����� ������� �������������� ��������� ������� �������� �������� ��� ����� ��� �������� ����� ���������������������� ������ ����������������� multihop�������������� ������� ���������/��������������� NIS - ��� ��������� +-� �������������� ���� � ���� ��������� ��� ����� NIS��� ����� ��� ����� �������� ��� ����������������� ��������������� ������ ����� ��� ������� ���� ��� ������������ ������ �� ������������� ������ ��� ����� ���������������� ����� ��������� � CSI ����(structure)���� ����� ���������� �� XENIX ��������������� ��������� ��� ��������� �� �� ������������ anode���� ������� ���������� ����� ����������������� ��������� ������������� �������� ��������� ������������ �������� ��������� ����������������� ������������� ������� ����������� ������ ���������� ��������� �������� ����� ������������ ��� ����� ��� ����� ������������� ������� ����������� �������� �������������� ������������� ��������� ��� ��������. +-���� ������� �������� ��� ����������� ������ ������� ����� ��� ����������� ������� ������ ������ � ������������� ������� ������ ������ ��� ��������� ������� ������� ������ ���� ����� ��� �������������� ������� ������ ������������� ����� XENIX ����� �������� ����������� ����� �������������������� ���������� ��� ��� ��� �������� ���������� ���������� ����� ��� ��� �� �������� ����������� ����� ���������������������� ������� ������������� ���������� ���������� ����� ���������� ��� ������������� ���������� ��� ��������������� ���������� ��� ������������� ��� �� ��������� ���������� ��������� ���� �� ���������� ���������� �� ������ �� ������(block)���� ��������� ����� ����(streams)��� ������ ��� �������������������� ������������������ ������������������ ����� ��� ��������� ���������� ������������� ��������������� ������� ������ ����������� ��� ���� ������������������� ������������� ���������� ����������� ��� ����������������� ����� ��������� �� ������������� ���������� ��� ������������������� ����� ���������� ��� ��� �������(socket)�������������������� �� RFS �������RPC ���� ���������� ��� ������������������ RPC �� ���������� ��� NIS��� ��������� RPC ��� ����� ����������� ������ ��� RPC ������������ ��� ����� ������� RPC ���� ��� ����� ������� ������ ��� RPC ��� ����� ������RPC: (�������� ������� ���������)�RPC: ������ �������������RPC: ��� ����� ������� �� ���������������� �� �����������RPC: ��� ����� ������� �� �������������� �� �����������RPC: �������� (�� ����������� ������)�RPC: �� �������� �������� ��� RPC�RPC: �������� ����������� ������RPC: �� ��������� �����������RPC: �� ��������� ��� ���� ������������RPC: �� ��������� ����������RPC: �������������� ������������/��������RPC: ������ ��������������� �����������RPC: � ����������� ��� ������ �� ���������������� ��� ������������RPC: ���������RPC: ���� �������RPC: �������� ������RPC: �������� ����������RPC: ������� ����� �����������RPC: ������� ������������ RTLD_NEXT ��� ��������������� ���� ������ ��� ��������� �������������������-���� ������� ������������ ������ �������� ��������������������� ������ �������/�������� ������������� ��������� ������������������� �� ����������� � ����� �� ������ ��-���������� ��� ���� ������.���������� �������� ��������������� �� `glibcbug' ��������� ��� <bugs@gnu.org>. +-����� ������ ����������������� ������� ����������� 0 (������ ������)���������� ������ ��� ������� ����������������������� �������� ������ ������� ����� �������� ����� ����� ��������� �� ����������������� ���������� (segmentation fault)�� ����������� �������� ���������������� ����������� �������� ��������������� 0����������� �������� �� ��-��������� ����� ��� �������� ��� ���������������� ��������� ��������� ������� ��������������� srmount������� ���������� ������� ��� NFS ��������� ��������������������������� (����)���������� (������� tty)���������� (������ tty)������� ��������� ������ ���� ���������� ��������������������������� ��������� ����� ������������������������������ �������� �� ������� ������������� ���������������� ����� ������� ���������� �������������������� ������ �������������������� ����� ������� ����������������� ����� ������� ������ ��� ������������������ ������ ��������������������� ������ ������������ �������� ��������������������� ������ �������������� Trace/BPT������� Trace/breakpoint���������� ��������� ��������� ����������� �������� ���� ��������� ����� ��� ������������� ���� ��������� ��� ����� ��������������������� `%s --help' ��� ������������ �����������. +-������������ %s... +-�������� .netrc ������� %s��������� ������� ��������� NIS�������� ������ �������� ����� ������������������ ������ ������� ������������������� ������ ������������������ ���� %d�������� ������ ������������������ ������ ypbind����������� ( � \(����������� ) � \)����������� [ � [^����������� \{��� ������������ ��������� `%s'���������� ��������� �������/������������: %s [�������]... -o ������-����� [������-�������]... +- %s [�������]... [������-������ [������-�������]...] +-������������ ���������� ���� ������ �������� ����� ������������ ��� ��� ��� +-�������� ��������. +- -H, --header=����� �������������� ��� ������ ������������ C �������� ����� +- ����������� ���� �������� ��� �������� +- -h, --help �������� ����� ��� �������� ��� ����������� +- --new ��� ��������������� ������� ���������, ������������� ��� ������ ������ +- -o, --output=����� �������� � ������ ��� ������ ����� +- -V, --version �������� ����������� ������� ��� ����������� +-��� �� ������-������� ����� -, � ������� ���������� ��� ��� �������� ������. +-��� �� ������-������ ����� -, � ������ �������� ���� �������� �����. +-������: %s [�������]... ������-������� ������-������ +- %s [�������]... -o ������-������ ������-������� +- %s [�������]... -u ������-������� +-������������ ���������� ���� ������ �������� ����� ������������ ��� ��� ��� +-�������� ��������. +- -f, --fold-case ���������� �� ������ �� ���� �������� +- -h, --help �������� ����� ��� �������� ��� ����������� +- -o, --output=����� �������� � ������ ��� ������ ����� +- --quiet �� ��� ������������ �������� ����� ������������� � ���� +- ��������� +- -u, --undo �������� ��� ������������ ��� ������� ��� ����� +- ���������, ��� ���������� ��� ������ +- -V, --version �������� ����������� ������� ��� ����������� +-��� �� ������-������� ����� -, � ������� ���������� ��� ��� �������� ������. +-������: %s [�������]... ����� +-������������ ���������� ���� ������ �������� ����� ������������ ��� ��� ��� +-�������� ��������. +- -c, --force ������������� ������ ����� ��� �� �������� +- �������������� ��������� +- -h, --help �������� ����� ��� �������� ��� ����������� +- -f, --charmap=������ ��������� ������� ���������� �������� ��� ������ +- -i, --inputfile=������ �� ������� ����� ���������� ��� ������ +- -u, --code-set-name=����� ����������� ��� ������� ��� ������������ +- ��� ISO 10646 ��������� +- -v, --verbose �������� ������������ ��������� +- -V, --version �������� ����������� ������� ��� ����������� +- --posix ������� ��������� �� POSIX +- +-� ��������� ���������� ��� ������ ����������: %s +- ������ locale: %s +-������: %s [�������]... ����� +-������������ ���������� ���� ������ �������� ����� ������������ ��� ��� ��� +-�������� ��������. +- -h, --help �������� ����� ��� �������� ��� ����������� +- -V, --version �������� ����������� ������� ��� ����������� +- +- -a, --all-locales ��������� �� ������� ��� ���������� locales +- -m, --charmaps ��������� �� �������� ��� ���������� ������ ���������� +- +- -c, --category-name ��������� �� �������� ��� ����������� ���������� +- -k, --keyword-name ��������� �� ������� ��� ����������� ������-�������� +-������: %s �����_���������� [�����_���������] +-������: rpcinfo [ -n �����. ����� ] -u ������� �����. �������. [ �����. ������� ] +-������������� ��� ��� ������ ���� 1������������� ��� ��� ������ ���� 2�� ���� ����� ���� ������ ��� ����������� ���� ����������� ��������� ������������� ����������� ���������� ��� ��� �������� ��� ���������� �������� ���������������� ��� %s. +-���������� ����� ������YPBINDPROC_DOMAIN: %s +-����������� ��� ������ ���� �� ������ ������ ������ ��� ������� ��������� ��� ����� ��� ����� ���� ��� �� ����� ������ ��� ������������ ��������� ������� `%1$s' ��� ��������� �� `END %1$s'�`-1' ������ �� ����� � ��������� ���������� ��� `%s' ����� ��� `%s' ������������ `...' ������ �� ��������������� ���� �� `...' ��� `UNDEFINED' ����������������������� `from' ���� ��� ����� ��������� ��� `collating-element'�� ������� ���������� `from' ��� ������ ��� ��������� ��������� �������� +-������� ����������� ���������� ��� <%s> ������ �� ����� ���� ����� ������������ ���������� ��� `%s' ������ �� ����� ���� ����� �����������auth_none.c - ������� ����� �������������� ������������ ���������������� ����� FROM �� ������ Link������ ����� TO �� ������ Link��� ����� ������������ ��� ������������� mcheck_status, � ���������� ����� �������������broadcast: ioctl (���� ��������� �����������)�broadcast: ioctl (���� ��������� ��������)�cache_set: �� ���� ��� ����������� ����� ������� �� ���������� � ���������� ��� ����� ���� ��� +-�� �������������� ������ ���� �� 'until time'���� ����� ������� �� ��������� � ������� ����������� %d +-���� ����� ������� �� ����� `stat' �� locale ������ `%s'��������� ��������� �������� ��������� `%.*s'��������� ��������� ���� ������ ���������������������� ��������� ���� ������� �������� ���������: %s��������� ������������������� ���������� ������� ������ ��������� `%s': %s��������� ���������� ������� ������� `%s'��������� ���������� ������� ������� locale `%s'��������� ���������� ������� ������ `%s'��������� ���������� ������� ����� `%s' ��� ��� ��������� `%s'��������� ������������ ��� ������������ ��������������� ��������� ��������� ��� ����� ���������� `%s'��������� ��������� ��������� locale `%s'��������� ��������� ������� locale `%s'��������� �������� ������� ������ ��� `%s'��� �������� ���������� ��������� ���� ��� ��� ����: ��� �� ������ �� �������� ���������� %s'%s' ���� ����� `%s' ������ �� ����� ���� ����� `%s'�� ���������� %s'%s' ���� ����� `%s' ��� ������ �� ����� ���� ����� `%s'�� ���������� <SP> ��� �������� ���� ����� ������������ ���������� `%s' ��� �������� ��� ���������� ��� �������������� ������ ����� ���������� `%s' �������� ����� ������ ���������� `%s' �������� ������ ������ ����� ���������� `%s' ��� ��������clnt_raw.c - ������� ������ ��������������� ��������������� �������� ��������� `%.*s' ����������� ������������ ��� ��� �����: +-��������� � ��������� ������� ��������� `%.*s' ����������� ������������ ��� ��� �����: +-��������� � ����������������� ������� ��������� ���� �� `%s'�������� ��� ��������� %s: ��������� ����������� rpc ���������� +-��������� ����������� �����. %d ���. %d +-��� �������������� ������ ����� ���������� `%s' ��� ��������� ������������� ������ ��� ������������� %d ��� ����� `era' ���� +-��������� `%s' ��� ����� '+' ���� '-'�� ������������� ������ ��� ������������� %d ��� ����� `era' ���� +-��������� `%s' ��� ����� ���� ���������������� ����� ��������� `%s'������� ������� ��������� ���������������� ������� ��� ��� ��������� `%.*s'������ ������������� ������� ������������� ����� ����� %s (������ "%s", ������ %d)������� ������������� ���������������� ������� ��������������� �������� ��������: ������ ����������enablecache: � ���������� ����� ����� ��� ���������������enablecache: �������� ��������� ����������� �������enablecache: �������� ��������� ��������� ����������� �������enablecache: �������� ��������� fifo ����������� ��������� ������ ������ ��� ������ ��� �������� ����� ���������� ��� �� ������������� ���� ��� �������� ��������� ��������� ���� hash ������������� ���� ��� �������� ���� hash ����������������� ������� ���������� ��� `copy'����������� ������ ��������� ��� ��� ���������������� ���� ��� ������� ��������� ��� ��� ��������� `%s'�fcntl: F_SETFD��� ����� `%s' ���� ��������� `%s' ��� ����������� ����� `%s' ���� ��������� `%s' ��� ���������� ���� from ��� `��������� ���������' ������ �� ����� ���������������� fstat ����������������� ��� ����� ��� ��������������� ��� ������ �������������������� ��� ����� ��� ����������������� ��� ����� ����������������(offset) ����� ��� ������������� %d +-��� ����� `era' ���� ��������� `%s'���������� ��� ����� ��� ����������� ������� ��� ������������� %d +-��� ����� `era' ���� ��������� `%s'���������� ��� ����� ��� ����������� ����������� ��� ������������� %d +-��� ����� `era' ���� ��������� `%s'�get_myaddress: ioctl (���� ����������� ��������)�������� ����������� �������� ������ CORRECTION ����� ��� ������ ���������� (Leap)��� ������ Rolling/Stationary ����� ��� ������ ���������� (Leap)��� ������� �������� ���������� ��� ���������������� ������ �������� ������������ ������� �������������� �� ������ ��������������� ������ ���������� �������� ��� ����� ��� ����������������� ������ ������� ��� �� ����� ������������� ������� ������� ��� ������������ ��o ������������� %d ��� ����� `era' ���� ��������� `%s'��� ������� ������� ������ ������ ���������� ������� ��� ������������� %d ��� ����� `era'���� ��������� `%s'��� ������ ���������� ����������� ��� ������������� %d ��� ����� `era'���� ��������� `%s'����� ����������: ��� ������������ ���� ��� %d ������� ��������������� ����������: ��� ������������ ���� ��� %d ������ ����������������� ����� ������������������� ��������� �������� ��������������� ������ - ������� � addtype �� ���� isdst���������� ������ - ������� � addtype �� ���� ttisgmt���������� ������ - ������� � addtype �� ���� ttisstd���������� ������ ��� %s, ������ %u��� ������� GMT ����������������� ������ ���������� �������������� ������ ���� ��� ������� ������� ������ �������� ������� ������ ����������� ������ ����� ������� ������ ������� ������ ������� ������ ���������� ������ ��� ��� �������� ������ ����� ����������� ������ ���� ��� ������� ������ �� �������� ������ ����������� ������ ���� ��� ������� ��� �������� ������ ��� ������� �������������� ������ ��������� locale ������ `%s', ��� ��������������� ���� `copy' ������ ��� ���������� lstat ������������������������ ������ ����������� ����� ���������� ���� ��� �� ���������� ������� ����� ���������� ���� �� ����� ��� ����������� ������� ����� ������������� ����� ����������� +-�� ����� ����� �������, � ���������� ���� ��������������� � ���������� ������ ��� ������������� %d ��� `era' ��������� ��������� `%s'������� �� ����� ��� ������ ��� ������������� %d ��� `era' ��������� ��������� `%s'�������� ����� ���������� ��� �������� �� ��������� %d +-��� ����� �������� ������� ��� �� ����� `%s' ���� ��������� `%s': %s������ ���� ��� ���� ��� �������� �� ��� �������������� ������� ��� `UNDEFINED'������ ���� ���� ������ ��� �� ������ �� ����������� ���� ��������������� �� `copy'���� ��������� ������ ������ ������ ��������� ������������������� ������ ��������� ��������� ������ ��������� ����� ��� �� ����� ���������� �������� �������� ��� �� ������� `%s'���� ����� �������� ����������� ������� WIDTH ������������ �� ���������� ��� CHARMAP ����������������� ���� ��� �������� ��� `%s'��� ��������� %lu ��� ����� ��������� +-��� ��������� %lu ������� %lu ��� ����� ��������� +-��� ��������� %lu ������� %lu ������ ��� �������� +-�rcmd: select (������� ��� stderr): %m +-�rcmd: socket: ���� �� ����� �� ����� +-�rcmd: write (������� ��� stderr): %m +-�registerrpc: ����� ����������� +-�repeated leap second moment�rpcinfo: %s ����� ������� ������� +-�rpcinfo: %s ����� ������� �������� +-�rpcinfo: �������� ��������� ������� ��� �� ��������� %s ������� %s +-�rpcinfo: ������� �������: %s +-�rpcinfo: �������� ������������ �� ����������� ������rpcinfo: �������� ������������ �� ����������� �����: �� ����� ������� �� �������� �������select: �������� ���������� ��� ������� ���������� +-�socket: �������� ���������� ��� ������� ���������� +-��� ������������ ����������� `forward' ��� `backward' ����� �������� ���������������� �������������� ��� ��������� ����������� ��� ������� ��������� ��� ������ �������������� ���������������� �������� ���������� ������� ��� ����� ������ ��� ������������� %d ��� ����� `era' ���� ��������� `%s'��� ���� ������� ����� ����������� �� ���� ������������� ������ ������� ����� ���� ������� ��� �� ��������������� ������ ������� ����� ���� ������ ��� �� ��������������� ���������� ����������� ��� ����� ������ ���� ������� %d ��� ����� `era' ���� ��������� `%s'�svc_run: - �������� ��� select�svc_tcp: makefd_xprt: ����� ����������� +-�svctcp_.c - �������� getsockname � listen�svctcp_.c - �������� ����������� �������� udp�svctcp_create: ����� ����������� +-�svcudp_create - �������� getsockname�svcudp_create - �������� ����������� ���������������� ��� ������������� ��������� ��������� `%.*s' ����������� ��� ��������� ����������������� ��� ������������� ��������� ��������� `%.*s' ����������� ���� ����������������������� ��� ������������� ��������� ��������� `%.*s' ����������� ���� ���������������������� ��� ������������� ��������� ��������� `%.*s' ����������� ��� ��������� ���������������� ��� ������������� ��������� ��������� `%.*s' ����������� �� �������������� ��� charset����������� ������ ��� ������ ��� %s: %s����������� ������ ���� `order_start' ������������� ����������������� ������ ���� ������ ������ ��������������������� ������ ���� ������ ���������� ��������������������� ������ ���� �������� ����� ������������������ ������ ���� �������� ������������������ ������ ���� ������ ��� LC_TYPE ��������������������� ������ ���� ������ ��� ���� ������ ��������������������� ������ ���� ������ ��� ��� ����� ��������������������� ������ ���� ������� locale �������������������� ������ ���� ������ ������������ locale����������� ������ ���� ������ ����������� locale����������� ������ ���� ��������� ����������������� ������ ���� �������: %s����������� ������ ���� ������ locale ��������������� ������: ��� ����� ���� �� ����� locale ������������� ����� � ������ ����������� ���� �� ����������������� ��������� ���� bytes ���� ������������ �������������������� ����� bytes ���� ������������ ������������������� ������ ������� ��������������������� ����� ������������ ��������������������� ������ ����� ������� ��������������� ������ ����������;!����������� ����� ��������������� ������, � ���� ������, ������������ ����� ��������������� ��������� ��� ����� ��� ���������������� ���� ��� �������� ��� ��������� %d +-���� ����������� ��� ����������� ������� �� ��������� `...'��������� ����� ����������������������� ���������� `%s'��������� ���������� ��� ����� `%s' ��� ���������� `%s'�������� ������� ����������������o ������� `%s': ������ ����������������� ��� `%s'�������� ������� `%.*s': ������ ���������������� ������� ������������� ��������� ������������o ���������������� ������������� ��������� �������� ������������� ����� ��������� ����� ���� ��� ����� ��� ����� ��������� ��� ���� ����������� ��� 2/29 �� ����� �� ��������� ���� ��� �� %s ������ �� ����� ���������� ���� ��� <%s> ������ �� ��������� ������ 1 ��� 4�� ���� ��� �� ����� `%s' ���� ��������� `%s' ��� ������ �� ����� ���� ��������������� ���� ��� <mb_cur_max> ������ �� ����� ���������� ��� ����� ��� <mb_cur_min>�� ���� ��� ������ `int_curr_symbol' ���� ��������� `LC_MONETARY' ����������� �� ������ ����� ������� �� �� ISO 4217�� ���� ��� ������ `int_curr_symbol' ���� ��������� `LC_MONETARY' ���� ����� �������� ����� ��� �� ����� `%s' ���� ��������� `%s' ������ �� ����� ���������� ��� 127��� ����� ��� �� ����� `%s' ���� ��������� `%s' ��� ������ �� ����� ���������� �� ������� ��� UTMP ������������ �� ������� ������ ������� �������������� ��� ������������ ����������� ��� �������� ������ �������������� ��� ������� ������� ������ ������������ ������ ����� ��������� ��� ��� ������ ����� ��� ��������������� ������� ���������������� ������� ������ ��� ������ Leap������ ������� ������ ��� ������ Link������ ������� ������ ��� ������ Rule������ ������� ������ ��� ������ ��������� Zone������ ������� ������ ��� ������ Zone�yp_update: �������� ���������� �������� ���������� �� ����� ������� +-�yp_update: �������� ����� ���������� ���������� +-� +\ No newline at end of file +diff -Naur ../glibc-2.1.3/po/es.mo glibc-2.1.3/po/es.mo +--- ../glibc-2.1.3/po/es.mo 1999-07-18 18:19:41.000000000 -0700 ++++ glibc-2.1.3/po/es.mo 1969-12-31 16:00:00.000000000 -0800 +@@ -1,490 +0,0 @@ +-�������������������8�������K������K������K��M���L��E���UL��&����L��(����L������L������L�����M�����&M�����5M�����IM�����dM�����~M��n���M�����O�����O��"���%O��"���HO�����kO��:����O������O������O������O������O�����P�����P�����2P�����LP�����eP������P������P������P������P������P�����Q�����#Q�����*Q�����EQ�����RQ�����YQ��3���kQ��3����Q��4����Q��.���R��%���7R�����]R��&���qR��%����R������R��%����R��3����R��,���/S��)���\S������S��"����S��!����S������S������S�����T�����.T�����DT��"���ZT��*���}T������T��&����T��&����T��&���U��&���7U��&���^U������U�� ����U��$����U������U������U�����V��,���2V�����_V��%���}V��,����V��-����V�� ����V��&���W�����FW�����eW������W������W������W������W�������W��2���|X������X��"����X��4����X�����"Y��#���4Y�� ���XY��=���bY������Y��<����Y������Y��'���Z�����6Z��)���?Z��(���iZ�� ����Z������Z������Z������Z��$����Z������Z��)��� +-[��(���4[�����][�����m[�����y[��#����[��/����[������[������[�� ���\�����\�����%\�����9\�����N\�����Z\�����j\������\������\������\������\������\�� ����\������\������\�� ���]��&���]��-���<]��!���j]������]������]������]������]��&����]��%���&^��0���L^��!���}^������^��-����^������^��%���_��)���(_��'���R_��%���z_��&����_������_������_������_����� +-`�����%`�����<`�����X`�����u`��@����`��D����`�����a�����'a�����@a�� ���Ua��=���_a������a�������a�����b��7����b��2����b��-��� c�����7c��$���Jc�� +-���oc�����zc������c��!����c������c������c������c������c�����d�����d�����/d�����Jd�����^d�����rd��3����d��-����d��2����d�����e�����,e�����5e�����<e�����Le�����fe��<���}e������e��$����e��)����e�� ���)f�����7f��1���If��8���{f������f������f������f������f�����g�����'g�����@g�����Og�����gg��"����g������g������g������g�������g�����oh�� ����h������h������h������h������h�� ����h�����i��$���'i�����Li��"���Si��%���vi��"����i��"����i��%����i�����j�����j�����.j��>���;j�����zj������j������j������j��!����j������j��!����j������j��.���k�����Mk�����ak�����nk��"���{k������k������k������k�� ����k������k��+����k�����(l�����El�����Vl�����ml������l������l������l������l������l����� +-m��1���m��$���Mm�����rm������m������m������m������m������m������m�����n�� +-���n�����#n�����*n��2���0n�����cn�����rn������n�� ����n������n������n������n������n����� o�����o��!���3o�����Uo�����so��s����o�����p��*���p�����Cp�����]p�����np�����p������p������p������p������p������p�����q�����q�����q��9���q�����Vq�����nq������q��,����q�� +-����q������q������q������q�����r�����#r�����>r�����Xr�����pr������r��#����r������r������r������r�����s��#���&s�����Js�����js�����ss������s������s������s������s������s������s������s�����t�����1t�����Pt�����pt������t������t������t������t������t������t�����u��*���#u�����Nu�����Uu�����mu������u�� ����u��!����u�� ����u������u������u�� ���v�����"v�����@v�����Mv�����av�����rv������v������v��(����v������v�����w�����w�����5w�����Ow�����ew�����~w������w������w������w������w������w������w��.����w�����"x�� ���4x��#���Bx��0���fx��%����x������x������x������x������x�����y�����#y�����@y�����Oy�����my������y������y������y������y������y������y�����z�����+z�����Ez�����_z�����qz������z������z������z������z������z��!���{�����.{�����G{�����b{�����~{������{������{��"����{������{������{����� |�����$|�����8|�����J|�����`|��-���o|��-����|��!����|������|�����}�����}�����2}�����C}��2���Z}��#����}������}������}��;����}�����~�����$~�����@~�����X~�� ���r~�� ����~������~������~������~������~������~���������������/�����J��&���c�������������������������������� ������������$���0��� ���U������c������o����������������������������������ˀ�����߀����������������� ���*���(���(���S������|����������"������������������D������K���$���e��� +-������������������������P��� ���`������n���!������������������������DŽ��������"����������������*������@������S���'���c���#�������6������� ������ +-�������������"������"���*������M���"���g��������������������Ć�����ۆ�� ����������������������������*������C������Z������o����������������������������������χ����������������� ���������#���%���:���I�����������������%����������ֈ��"������������!������ ���@���"���a��� ������������������������ω�����������������������������!���F���>��� �������.�������-�������6������8���#���;���\���I��������������������������+���$���+���P���'���|�������������Č�� ���ь�����ی���������������&���(���.���O���&���~����������,�������������������C������#���a�����������������!�������"������.������ ���4���%���U���;���{���&����������ޏ��1����������0������K������W���"���h����������'����������ϐ��������.���������3���"���J���(���m���-����������đ�����ܑ��!����������������8������X������t���!�����������������ʒ��������9�������4���7���8���l���+�������8���ѓ��$��� +-���"���/���!���R���.���t���������������������<������;���>���$���z�����������������*���ו��7���������:���"���Y������|���)�������N�������U���������^���&���|���)������� ���͗�����ۗ��+���������� ������>������X������j���"�������%�������*���Ә��*����������)������=���0���W�����������������+���Ǚ��7������#���+������O���!���m���$�������!����������֚��&������%������,���>������k���'���z���%�������0���ț��2����������,���.���9������h���K�������L���͜��L���������g���+���{���2�������2���ڝ��/��� ���$���=������b���%���x���-�������$���̞����������� ������'������:���(���Q���&���z���!����������ß��F���ڟ�����!���B���4���B���w���?�������<�������7���7������o����������#�������.���ɡ��0�������0���)������Z������x���������������������������Т������������������������%������;������O���#���d���5�������G������� ������#������5���8������n������{���-�������!�������(������-���������9������J���'���\���?�������=���ĥ�� ������.������ ���?���9���`���;�������,���֦��*������#���.������R���%���l���A����������ԧ��������I������7���X���3�������+���Ĩ��������'������!���/������Q���.���b����������C�������*������������������(���8������a���1���t�����������������:���ݪ��������)���6���*���`���#��������������$���ϫ���������������"���,������O������m�����������������>���Ĭ��������!���"��� ���D���(���e���$��������������*���ɭ��=�������H���2������{����������E�������&������(������'���0���E���X����������(�������'������$������,���-���)���Z���%��������������"���Ȱ��������&��� ������0���P���O���V�������U�������O���M���V�������!�������'������*���>���/���i���*�������$���ij��/������1������/���K���)���{���*�������)���д��#�������������-���9���&���g���4�������(���õ����������� ��� ������#���(���$���L���"���q��������������������Ķ�����۶��.���������������;���3���X����������#����������·�� ���۷��������0����������-���$���I������n����������#�����������������ȸ�����ݸ�����������������)���4���B������w�����������������'���ǹ��B������D���2���j���w���K������?���.������n����������!����������̻��������������������"���3������V������r�����������������#�������#�����#������0���'���#���X������|����������*�������%������-�� ������7������O���`���b���[���ÿ��<������>���\������������������������������������������������������3������G����������������"���*���"���M������p���<��������������������������������������������,������C���!���]���$������!�������$�������!�������$��� ������2��� ���I������j������o������������������������<�������<�������R���/���2�������)��������������1�������%���+������Q���*���k���6�������<�������0��� +-������;���+���Y���.�������������� �����������������������%���,���?���]���l����������3�������3������3���K���3������3��������������0������+���3���"���_�����������������0��������������)������0���0���1���a���!�������)�������!����������������!������@��� ���V��� ���w�����������@���7������x���5�������>�������������+���"������N���I���b����������L�������+������*���8��� +-���c���A���n���/�������)���������� +-���������������:���+������f���<�������>�������������������)������&���I���8���p��������������������������������������$���������B������R������m���1��������������%�������%������������� ���$������2���#���6������Z���9���o���G�������1�������0���#���0���T����������+�������E�������;������=���N���/������� �������;�������(������>���B���5�������5�������+�������?���������Y������x����������-���������������������$������-���8���S���f���X�������������-���%������S������p���K���y������������������,�������P�������0���=���B���n����������-��������������������������(���������5���%���S���+���y��� �������������������������������������.��� ���J���9���k���=�������A�������"���%��� ���H������V������_���"���o����������K��������������,������7���E������}��� �������5�������G����������.���#���L������p���'�������!�������'����������������� ������+���8���F����������������$������������������o���-�����������������������������������������'���&���0���N���������-�������3�������.�������/��� ���3���P������������������������S������� ���.������<��� ���@������a������t����������&�������.�������4����������5������M������Z���,���o��������������������������������������=������!���L������n����������$�������"�������!����������������&���.���A������p���?�������+����������������� ������)���.���G���"���v������������������������ ���������������������@����������@������Q������i������z���#����������������������������������0������,���H������u���#������������������F���B���Z���!���������������������$����������������&���'���?������g�������������������������������d�������/���#������S���)���n���7����������������������������(�������#���%������I������i���!�������$��������������-����������������0���%���F���%���l���.�������.��������������(���������-������H���+���a���"����������������������������(��� ���,���2���*���_���&�������"��������������$�������������.���3������b���4���x���/������� �������$�������'���������4������H���/���\������������������������2�������!���������(������5������M������`���$���t����������%�������'�����������������������6������I���,���d��������������������������������������������� ������=���������]������n���'�������J�������5����������-������B������b������q������������������������"��������������������-���#���&���Q������x����������+���������������������#����������#������C���"���]����������)�������,�������"�������#������#���<��� ���`�����������������(��������������2����������3������C������Y������r������������������������K�������>������$���W���#���|����������(�������!�������������=���#���.���a�����������������A�������-�������2���%��)���X��$������������#������,����������������� ����:�,���P����}�!�����"�����&����� �������)����<�'���D����l�)����������0�������������!���&����H����^����v����}�%�����%����������#����� +-���"�0���-�5���^�����������.���������������������*����� ����� ���������������������+�(���@����i����|�*����������,�������� �'��� �"���A ����d �!���~ �0���� �8���� ���� +- +-� +-��� +-����' +-�(���3 +-�)���\ +-�'���� +-�+���� +-�#���� +-�&���� +-����%����>����]����o����������������-�����������������'�,���E����r�������������������������������-��� +- �I���8 ����� ����� �5���� �&���� �-�������M�A���d�.�����3�����7��� �)���A����k����|����������������#����������\��������P�.���]�@�����Q�����@����H���`�f������������(����A�1���U�1�����:�����!������������(�#���?�!���c������>�����4�����3�������H�=���`�:�����%�����P�����1���P�7�����5�����'�����(����;���A�1���}�6�����I�����1���0�.���b�E�����,�������������.���-�,���\�:�����&�����+�����B����!���Z�3���|�;�����A��������.�$���K�,���p�+�����#�����*�����5����1���N�%�����*����������?�����?���1�A���q�;�����K�����)���;�,���e�5�����4����� ����� ����!���?�M���a�D�����)���������,���;�)���h�J�����!�����/��������/ �D���G �b���� �h���� �!���X!�*���z!�(����!�����!� ����!�4����!�"���4"����W"����s"�/����"�(����"�3����"�>���#�<���Z#�����#�����#�I����#���� $�$���@$�2���e$�C����$�&����$����%�:���%�1���W%�)����%�%����%�:����%�*���&�2���?&����r&�3����&�4����&�4����&�N���'����n'�E���'�#����'�j����'�f���T(�d����(���� )�2���<)�8���o)�=����)�0����)�2���*�"���J*�9���m*�;����*�����*�"����+����#+����<+�$���N+�>���s+�.����+�1����+����,�V���+,�����,�O����,�M����,�J���:-�J����-�D����-�"���.�$���8.�!���].�;���.�=����.�=����.����7/����U/�!���q/�����/�����/�����/�����/�����/���� 0����)0����B0�&���X0�>���0�O����0�[���1����j1�.����1�H����1�����1�+��� 2�B���52�/���x2�6����2�@����2���� 3����03�6���A3�N���x3�P����3����4�:���)4�"���d4�D����4�F����4�5���5�9���I5�$����5�'����5�0����5�P���6�(���R6�"���{6�l����6�?���7�L���K7�M����7�-����7�E���8�0���Z8�����8�<����8�����8�I����8�>���F9�����9�����9�3����9�����9�9����:�'���::����b:�W����:�#����:�/����:�3���.;�7���b;�0����;�8����;����<����"<�5���><�8���t<�����<�%����<�)����<�F���=�*���`=�:����=�(����=�?����=�5���/>� ���e>�5����>�=����>�M����>����H?����Y?�S���i?�&����?�:����?�:���@�P���Z@�����@�A����@�-���A�&���3A�2���ZA�B����A�'����A�����A�6���B����OB�/���oB� ����B�e����B�_���&C�^����C�^����C�t���DD�,����D�/����D�3���E�?���JE�5����E�.����E�9����E�A���)F�B���kF�9����F�7����F�8��� G�/���YG�#����G�7����G�8����G�L���H�;���kH�0����H�����H�����H�<���I�0���?I�)���pI� ����I�����I�����I�����I�;��� J�(���EJ�+���nJ�:����J�����J�4����J�#��� K����DK����PK�<���jK�$����K�1����K�����K����L�,���8L����eL����uL�!����L�$����L�����L�����L�?���M�'���KM�!���sM�/����M�)����M�D����M�I���4N�u���~N�]����N�M���RO�����O�.����O�5����O�,��� P�'���MP����uP�����P�;����P�����P�����Q�5���Q����KQ�:���kQ�8����Q�;����Q�F���R�6���bR�����R�����R�F����R�;��� S��������k��������������������������@������,�������(�������������:��C����������������p��}���������2�������������k��D����������!��a���S����q�������J������������w��7������������@��������������E��V��H���������s������l���s���������u���[���������v������������������:������������������6��=������u������������������o���.������ ����|��d�����p���������������9�������������������$���������[�������������������l��?���������������C��`��������������*�����X���9��I������S��V��p������!������������y��d������������������������������Q������1�����������������n��^�� +-��� ���m���4���������?��������m������r�������������������������������]�������������������������������#������������������/���_��J����������������������������������������������s��f��Q��8�����r����������z���������<������������������x������B��{��K�������������>����������D��M����������������������������>����������������o���������i�������@����������x����������������b������� �������g���a�����������������E��o��e�������-��x��W������������������������������������������������Z�������s���R��"�������������4���������������/��������������������*����������(�������������������1�������k������L��V������N����)��������A������y���������*�����f���$������X������Q��)��#���K����������������[�������q�������D�����������T������a����������.���������T�������,��'�������u��\������������!�������3������������g�� +-������=��H���]�����-��5��O��z��������������������j�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��`�����������������������������������U������m�����{�����Q������c��P��������������������������������������������6���r����������������`���������t�����e��5�������������F��h��|�������������������b�������������������e�����\���~��2��E������� ���j�������#����������� ���������m��������������y������������1��M����������\����������4��f�������R����������7��Y�������������f��L�������F������������������������������������<����������� �� ���������������{��i���������Y�������������������������������� ���%���������(������c����������������������������~��������,����������{��������������������������������C���5��"���������?������v���)�������?������ +-����������+��������������/��~��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��P������������������������y���`�� ��<��w���}�����_�����'��H������d��������������n����������������H���������G������5��>����+�������S�����������-���������Y������������!����������������I����������g����l���������^��z������������v����������������������������������������N��A������|�����t���������W��������������������������+��������$��3��h�����������������c����������������������b��&��A������i���������������������b��[�� �������8�������������O��������o�����Y��#���������������r�����N���0����������������;��n��������������%����������������������������������������������������������E�� ������K������������ +-��M��������������������������h�������X��������������T��t������������������^�����9�����M�� ��J���������������>���+�����������������(���������2��c���������6��&��������V���)��������������������������������U��=�������B�������������;���v����������������0���������������Z�����������%��������������������~���������]������������������������1���������������N��������p��2��i���'��:��0������-���D�����������S������������������������W������L��8�����������������������������������}�������������������,�����������������������t�������������&�����B��w�������������l�����������������I�����������������������������6��'��������������������U�������������������������:������*������F�������������������������������������������n���������.�����q������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��T��Z��F����������������g��4�����q�����_��O��K��P��\����������������X�������������I�����������z��������������������������������������������������������G����������0�����a��A�����B�����j��U�����������������������������������<��$������k���������������]��P�����������h���������������3��������������9���������� Access Rights : � Attributes : � %s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile] +-� %s [-n netid]* [-o outfile] [infile] +-� %s [-s nettype]* [-o outfile] [infile] +-� Access rights: � Entry data of type %s +-� Name : %s +-� Public Key : � Type : %s +-� Universal addresses (%u) +-� [%d] Name : %s +-� [%u] - [%u bytes] � +-%s cache: +- +-%15s cache is enabled +-%15Zd suggested size +-%15ld seconds time to live for positive entries +-%15ld seconds time to live for negative entries +-%15ld cache hits on positive entries +-%15ld cache hits on negative entries +-%15ld cache misses on positive entries +-%15ld cache misses on negative entries +-%15ld%% cache hit rate +-%15s check /etc/%s for changes +-� +-Group Members : +-� +-Time to Live : � rpcinfo -b prognum versnum +-� rpcinfo -d prognum versnum +-� rpcinfo -p [ host ] +-� rpcinfo [ -n portnum ] -t host prognum [ versnum ] +-� no� yes� Data Length = %u +-� Explicit members: +-� Explicit nonmembers: +-� Implicit members: +-� Implicit nonmembers: +-� No explicit members +-� No explicit nonmembers +-� No implicit members +-� No implicit nonmembers +-� No recursive members +-� No recursive nonmembers +-� Recursive members: +-� program vers proto port +-� or: � (rule from "%s", line %d)� [OPTION...]� done +-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags. +-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed. +-�%s%s%s:%u: %s%sUnexpected error: %s. +-�%s%sUnknown signal %d +-�%s: %d did not sign extend correctly +-�%s: <mb_cur_max> must be greater than <mb_cur_min> +-�%s: C preprocessor failed with exit code %d +-�%s: C preprocessor failed with signal %d +-�%s: Can't create %s: %s +-�%s: Can't create directory %s: %s +-�%s: Can't link from %s to %s: %s +-�%s: Can't open %s: %s +-�%s: Can't remove %s: %s +-�%s: Error closing %s: %s +-�%s: Error reading %s +-�%s: Error writing %s +-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s +-�%s: Memory exhausted: %s +-�%s: More than one -L option specified +-�%s: More than one -d option specified +-�%s: More than one -l option specified +-�%s: More than one -p option specified +-�%s: More than one -y option specified +-�%s: Too many arguments +-�%s: cannot get modification time�%s: command was '%s', result was %d +-�%s: error in state machine�%s: illegal option -- %c +-�%s: invalid option -- %c +-�%s: option `%c%s' doesn't allow an argument +-�%s: option `%s' is ambiguous +-�%s: option `%s' requires an argument +-�%s: option `--%s' doesn't allow an argument +-�%s: option `-W %s' doesn't allow an argument +-�%s: option `-W %s' is ambiguous +-�%s: option requires an argument -- %c +-�%s: output would overwrite %s +-�%s: panic: Invalid l_value %d +-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s' +-�%s: unrecognized option `--%s' +-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ] +- [ -L leapseconds ] [ -y yearistype ] [ filename ... ] +-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ... +-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object) +-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible +-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]... +-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT +-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data +-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag! +-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file! +-�Cannot use netid flag with inetd flag! +-�Cannot use netid flag without TIRPC! +-�Cannot use table flags with newstyle! +-�Channel number out of range�Character Separator : %c +-�Child exited�Client credential too weak�Columns : +-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc. +-This is free software; see the source for copying conditions. There is NO +-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique +-�DIRECTORY +-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights : +-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits) +-�Directory : %s +-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY +-�Encrypted data +-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file. Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP +-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group : %s +-�Group Flags :�Group entry for "%s.%s" group: +-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos. +-�Killed�LINK +-�LOCAL entry for UID %d in directory %s not unique +-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s +-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server : +-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME +-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT +-�NUMBER�Name : '%s' +-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered. +-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None. +-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns : %d +-�Number of objects : %u +-�Numerical argument out of domain�Numerical result out of range�Object #%d: +-�Object Name : %s +-�Object Type : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner : %s +-�PRIVATE +-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits) +-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate : +-�Report bugs to %s. +-�Report bugs using the `glibcbug' script to <bugs@gnu.org>. +-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path : %s +-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root +-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status : %s +-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%s�TABLE +-�Table Type : %s +-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known. This does +-not necessarily mean that all combinations of these names can be used for +-the FROM and TO command line parameters. One coded character set can be +-listed with several different names (aliases). +- Some of the names are no plain strings but instead regular expressions and +-they match a variety of names which can be given as parameters to the +-program. +- +- �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information. +-�Trying %s... +-�Type : %s +-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d) +-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s +-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname] +-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s. +-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory +-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice +-�bogus mcheck_status, library is buggy +-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d +-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s +-�cannot find any C preprocessor (cpp) +-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory +-�clntudp_create: out of memory +-�clntunix_create: out of memory +-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server +-�couldn't register prog %d vers %d +-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten +-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s' +-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block +-�memory clobbered past end of allocated block +-�memory exhausted�memory exhausted +-�memory is consistent, library is buggy +-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s +-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d +-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration: +- +-%15d server debug level +-�nscd not running! +-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup +-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available +-�program %lu version %lu is not available +-�program %lu version %lu ready and waiting +-�rcmd: poll (setting up stderr): %m +-�rcmd: socket: All ports in use +-�rcmd: write (setting up stderr): %m +-�registerrpc: out of memory +-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error +-�rpcgen: too many defines +-�rpcinfo: %s is unknown host +-�rpcinfo: %s is unknown service +-�rpcinfo: Could not delete registration for prog %s version %s +-�rpcinfo: broadcast failed: %s +-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup +-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory +-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory +-�svctcp_create: out of memory +-�svcudp_create - cannot getsockname�svcudp_create: out of memory +-�svcudp_create: socket creation problem�svcunix_create: out of memory +-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d +-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage: %s infile +-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory +-�xdrrec_create: out of memory +-�yp_update: cannot convert host to netname +-�yp_update: cannot get server address +-�Project-Id-Version: GNU libc 2.1 +-POT-Creation-Date: 1998-11-28 09:29-0800 +-PO-Revision-Date: 1998-12-12 21:19+0100 +-Last-Translator: Santiago Vila Doncel <sanvila@unex.es> +-Language-Team: Spanish <es@li.org> +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=ISO-8859-1 +-Content-Transfer-Encoding: 8-bit +-� Derechos de Acceso : � Atributos : � %s [-abkCLNTM][-Dnombre[=valor]] [-i tama�o] [-I [-K segundos]] [-Y camino] fichero_de_entrada +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o fichero_de_salida] [fichero_de_entrada] +-� %s [-n netid]* [-o fichero_de_salida] [fichero_de_entrada] +-� %s [-s tipored]* [-o fichero_de_salida] [fichero_de_entrada] +-� Derechos de acceso: � Entrada de tipo %s +-� Nombre : %s +-� Clave P�blica : � Tipo : %s +-� Direcci�n universal (%u) +-� [%d] Nombre : %s +-� [%u] - [%u bytes] � +-%s cach�: +- +-%15s el cach� est� activado +-%15Zd tama�o sugerido +-%15ld segundos de vida para las entradas positivas +-%15ld segundos de vida para las entradas negativas +-%15ld aciertos de cach� en las entradas positivas +-%15ld aciertos de cach� en las entradas negativas +-%15ld fallos de cach� en las entradas positivas +-%15ld fallos de cach� en las entradas negativas +-%15ld%% tasa de aciertos de cach� +-%15s compruebe /etc/%s para cambios +-� +-Miembros del Grupo : +-� +-Tiempo de Vida : � rpcinfo -b n�mprog n�mvers +-� rpcinfo -d n�mprog n�mvers +-� rpcinfo -p [ host ] +-� rpcinfo [ -n n�mpuerto ] -t host n�mprog [ n�mvers ] +-� no� si� Longitud de los datos = %u +-� Miembros expl�citos: +-� No-miembros expl�citos: +-� Miembros impl�citos: +-� No-miembros impl�citos: +-� No hay ning�n miembro expl�cito +-� No hay ning�n no-miembro expl�cito +-� No hay ning�n miembro impl�cito +-� No hay ning�n no-miembro impl�cito +-� No hay ning�n miembro recursivo +-� No hay ning�n no-miembro recursivo +-� Miembros recursivos: +-� programa vers proto puerto +-� o: � (regla desde "%s", l�nea %d)� [OPCI�N...]� hecho +-�"%s", l�nea %d: %s�la l�nea "Zone %s" y la opci�n -l son mutuamente excluyentes�la l�nea "Zone %s" y la opci�n -p son mutuamente excluyentes�se necesita un "fichero_de_entrada" para las opciones de generaci�n +-de plantillas +-�%.*s: El argumento ARGP_HELP_FMT requiere un valor�%.*s: Par�metro ARGP_HELP_FMT desconocido�%s en una zona sin reglas�%s%s%s:%u: %s%sLa declaraci�n `%s' no se cumple. +-�%s%s%s:%u: %s%sError inesperado: %s. +-�%s%sSe�al desconocida %d +-�%s: %d no extendi� el signo correctamente +-�%s: <mb_cur_max> debe ser m�s grande que <mb_cur_min> +-�%s: El preprocesador de C fall� con un c�digo de retorno %d +-�%s: El preprocesador de C fall� con la se�al %d +-�%s: No se puede crear %s: %s +-�%s: No se puede crear el directorio %s: %s +-�%s: No se pudo crear un enlace de %s a %s: %s +-�%s: No se puede abrir %s: %s +-�%s: No se puede eliminar %s: %s +-�%s: Error al cerrar %s: %s +-�%s: Error al leer %s +-�%s: Error al escribir %s +-�%s: Error al escribir en la salida est�ndar �%s: L�nea de segundos intercalares en un fichero que no es el de +-ajuste de a�os bisiestos %s +-�%s: Memoria agotada: %s +-�%s: La opci�n -L se ha especificado m�s de una vez +-�%s: La opci�n -d se ha especificado m�s de una vez +-�%s: La opci�n -l se ha especificado m�s de una vez +-�%s: La opci�n -p se ha especificado m�s de una vez +-�%s: La opci�n -y se ha especificado m�s de una vez +-�%s: Demasiados argumentos +-�%s: no se puede obtener la fecha de modificaci�n�%s: la orden fue `%s', el resultado fue %d +-�%s: error en la m�quina de estados�%s: opci�n ilegal -- %c +-�%s: opci�n inv�lida -- %c +-�%s: la opci�n `%c%s' no admite ning�n argumento +-�%s: la opci�n `%s' es ambigua +-�%s: la opci�n `%s' requiere un argumento +-�%s: la opci�n `--%s' no admite ning�n argumento +-�%s: la opci�n `-W %s' no admite ning�n argumento +-�%s: la opci�n `-W %s' es ambigua +-�%s: la opci�n requiere un argumento --%c +-�%s: la salida sobreescribir�a %s +-�%s: grave: valor_l %d inv�lido +-�%s: fin de fichero no esperado�%s: no se pudo abrir �%s: opci�n no reconocida `%c%s' +-�%s: opci�n no reconocida `--%s' +-�%s: el modo de empleo es %s [ -s ] [ -v ] [ -l hora_local ] [ -p reglasposix ] +- [ -d directorio ] [ -L segundos_intercalares ] [ -y tipoa�o ] [ fichero ... ] +-�%s: el modo de empleo es %s [ -v ] [ -c cutoff ] nombrezona ... +-�%s: al escribir el resultado: �(ERROR DEL PROGRAMA) ��No se conoce ninguna versi�n!?�(ERRROR DEL PROGRAMA) ��La opci�n deber�a haberse reconocido!?�(Objeto desconocido) +-�(error de autentificaci�n desconocido - %d)�(se�al desconocida)�*** El fichero `%s' est� `stripped': no es posible un an�lisis detallado +-�*entrada est�ndar*�-o FICHERO-SALIDA [FICHERO-ENTRADA]... +-[FICHERO-SALIDA [FICHERO-ENTRADA]...]�la secci�n .lib en el a.out est� corrompida�; versi�n menor = %lu, versi�n mayor = %lu�; causa = �<%s> y <%s> son nombres no permitidos para el rango de caracteres�El car�cter <SP> no debe estar en la clase `%s'�El car�cter <SP> no est� en la clase `%s'�?�Abortado�Derechos de acceso : �Accediendo a una biblioteca compartida que est� corrompida�La direcci�n ya se est� usando�Esta familia de direcciones no est� soportada para el `host'�Esta familia de direcciones no est� soportada por el protocolo�Error de anuncio�Temporizador�La lista de argumentos es demasiado larga�Se intent� eliminar una tabla no vac�a�Se intentaron enlazar demasiadas bibliotecas compartidas�Autentificaci�n v�lida�Error de autentificaci�n�OBJETO INV�LIDO +-�Direcci�n incorrecta�Descriptor de fichero err�neo�Formato de fichero fuente incorrecto�Mensaje err�neo�Llamada al sistema err�nea�Valor err�neo para ai_flags�Act�a estrictamente de acuerdo con la norma POSIX�Datos binarios +-�Se requiere un dispositivo de bloques�Problema en el `poll' del `broadcast'�Tuber�a rota�Error del bus�CDS�Rebasado el l�mite de tiempo de CPU�El cach� ha expirado�No se puede acceder a una biblioteca compartida necesaria�Ha fallado la llamada a bind() con el servidor que sirve a este dominio�No se puede comunicar con el asignador de puertos�No se puede establecer comunicaci�n con `ypbind'�No se puede establecer comunicaci�n con `ypserv'�No se pudo asignar memoria�No se puede asignar la direcci�n solicitada�No se puede crear `socket' para enviar un mensaje `broadcast' del rpc�No se puede ejecutar una biblioteca compartida directamente�No se puede tener m�s de una opci�n de generaci�n de fichero +-�No se puede recibir la respuesta al `broadcast'�No se pudo registrar el servicio�No se puede enviar tras la destrucci�n del punto de destino�No se pudo enviar el mensaje `broadcast'�No se pudo especificar la opci�n SO_BROADCAST para el `socket'�No se puede especificar m�s de un fichero de entrada +-�No se puede usar la opci�n netid con la opci�n inetd +-�No se puede usar la opci�n netid sin TIRPC +-�No se pueden usar las opciones de la tabla con el nuevo estilo +-�N�mero de canal fuera de rango�Separador de Caracteres : %c +-�El proceso hijo termin��Las credenciales del cliente son poco fiables�Columnas : +-�Error de comunicaci�n al enviar�Compila una especificaci�n de locale�Anda, vete a casa y t�mate un vasito de leche�El c�lculo del tama�o de la tabla de clases de caracteres podr�a tardar un +-rato ...�El c�lculo del tama�o de la tabla de informaci�n de secuencias podr�a tardar +-un rato ...�Conexi�n rehusada�Conexi�n reinicializada por la m�quina remota�Expir� el tiempo de conexi�n�Contin�a�Convierte la codificaci�n de los ficheros dados de una codificaci�n a otra.�Convierte la clave a min�sculas�Copyright (C) %s Free Software Foundation, Inc. +-Esto es software libre; vea el c�digo fuente para las condiciones de copia. +-No hay NINGUNA garant�a; ni siquiera de COMERCIABILIDAD o IDONEIDAD PARA UN +-FIN DETERMINADO. +-�No se pudo crear el fichero de registro "%s"�Crea un fichero de cabecera C, NOMBRE, que contiene las definiciones de s�mbolos�Crea la salida incluso si hubo mensajes de aviso�Crea una base de datos DB simple a partir de una entrada de texto.�Fecha de creaci�n : %s�La entrada DES para el nombre %s no es �nica +-�DIRECTORIO +-�DNANS�DNS�No existe la base de datos para la tabla�La base de datos est� ocupada�Derechos de acceso predeterminados : +-�Se debe especificar la direcci�n de destino�El dispositivo no es un `stream'�Dispositivo no configurado�Dispositivo o recurso ocupado�Diffie-Hellmann (%d bits) +-�Directorio : %s +-�El directorio no est� vac�o�Se ha excedido la cuota de disco�No se divide y muestra los mensajes en la terminal actual�No muestra ning�n mensaje mientras construye la base de datos�No utiliza el cat�logo existente, crea un nuevo fichero de salida�No se pudo conectar con el dominio�`trap' de EMT�ENTRADA +-�Datos cifrados +-�Discordancia de tipo Entrada/Tabla�Error en el subsistema RPC�Error al acceder al fichero de comienzo frio de NIS+. �Est� NIS+ instalado?�Error de sistema desconocido: �Error al hablar con el proceso de `callback'�Error: el fichero .netrc es legible por otros usuarios.�Intercambio lleno�Formato de ejecutable incorrecto�Error fatal: el sistema no define `_POSIX2_LOCALEDEF'�El FICHERO contiene una asignaci�n de nombres simb�licos a valores UCS4�Fall� (error no especificado)�Descriptor de fichero en mal estado�El fichero existe�error `deadlock' al bloquear el fichero�Nombre de fichero demasiado largo�Superado el l�mite de tama�o de fichero�Fichero demasiado grande�Cadena Primero/Siguiente rota�Excepci�n de coma flotante�Se necesita una resincronizaci�n completa del directorio�Funci�n no implementada�GRUPO +-�Inconsistencias en ARGP_HELP_FMT: %s�Genera un cat�logo de mensajes.\vSi FICHERO-ENTRADA es -, la entrada se lee +-de la entrada est�ndar. Si FICHERO-SALIDA es -, el resultado se escribe en la +-salida est�ndar. +-�Error del sistema gen�rico�Obtiene la informaci�n espec�fica del locale.�Da un mensaje corto de uso�Da esta lista de ayuda�Error injustificado�Grupo : %s +-�Opciones de Grupo :�Entrada de grupo para el grupo "%s.%s" +-�Cuelga durante SECS segundos (por omisi�n, 3600)�Colgar (hangup)�No se ha encontrado "%d" en el cach� de grupo�No se ha encontrado "%d" en el cach� de contrase�as�No se ha encontrado "%s" en el cach� de grupos�No se ha encontrado "%s" en el cach� de `hosts'�No se ha encontrado "%s" en el cach� de contrase�as�El `host' no est� operativo�Nombre de `host' no encontrado�Operaci�n de E/S permitida�FICHERO-ENTRADA FICHERO-SALIDA +--o FICHERO-SALIDA FICHERO-ENTRADA +--u FICHERO-ENTRADA�`trap' de IOT�IVY�El identificador se ha eliminado�Instrucci�n ilegal�Objeto ilegal para la operaci�n�Desplazamiento ilegal�Formato o tipo de fichero no apropiado�Funci�n ioctl no apropiada para el dispositivo�Operaci�n no v�lida para un proceso en segundo plano�Petici�n de informaci�n�Informaci�n:�Ficheros de Entrada:�Especificaci�n de formato de Entrada/Salida:�Error de entrada/salida�Error interno de NIS�Error interno en ypbind�Interrupci�n�Llamada al sistema interrumpida�La llamada al sistema interrumpida deber�a volverse a iniciar�Objeto inv�lido para la operaci�n�Argumento inv�lido�Referencia hacia atr�s inv�lida�Nombre de clase de car�cter inv�lido�Credenciales del cliente inv�lidas�Verificaci�n del cliente inv�lida�Car�cter de uni�n inv�lido�Contenido de \{\} inv�lido�Enlace cruzado entre dispositivos no permitido�Intercambio inv�lido�El car�cter multibyte o extendido est� incompleto o es inv�lido�La expresi�n regular precedente es inv�lida�Final de rango inv�lido�La expresi�n regular es err�nea�C�digo de petici�n incorrecto�El descriptor de fichero solicitado es err�neo�Verificaci�n del servidor inv�lido�`slot' incorrecto�Es un directorio�Es un fichero de tipo `named'�Cerbero. +-�Terminado (killed)�ENLACE +-�La entrada LOCAL para el UID %d en el directorio %s no es �nica +-�Nivel 2 detenido�Nivel 2 no sincronizado�Nivel 3 detenido�Nivel 3 restablecido�En enlace apunta a un nombre ilegal�El enlace se ha cortado�N�mero de enlace fuera de rango�Tipo de objeto enlazado : �Enlazado a : %s +-�No se ha establecido el nombre del dominio local�La asignaci�n de recursos locales ha fallado�La m�quina no est� en red�Nombre mal escrito, o nombre ilegal�Los argumentos obligatorios u opcionales para las opciones largas son +-tambi�n obligatorios u opcionales para las opciones cortas correspondientes.�Servidor Maestro : +-�El servidor maestro est� ocupado, el volcado completo se postpone.�Fallo en la asignaci�n de memoria�Memoria agotada�Mensaje demasiado largo�Falta un atributo o est� mal escrito�Fecha de modificaci�n: %s�Fallo en la modificaci�n�La operaci�n de modificaci�n ha fallado�Modifica el formato de salida:�Se ha intentado un `multihop'�NOMBRE�NOMBRE +-[-a|-m]�NIS�Discordancia en las versiones de NIS del cliente y el servidor. +-No se puede suministrar el servicio.�La base de datos de la tabla NIS no es correcta�Fall� la operaci�n de NIS+�No se puede acceder a los servidores NIS+�El servicio NIS+ no est� disponible o no est� instalado�NO HAY NING�N OBJETO +-�N�MERO�Nombre : `%s' +-�Daemon de Cach� del Servicio de Nombres.�Nombre no servido por este servidor�El nombre no es �nico en la red�Nombre o servicio desconocido�El par nombre/entrada no es �nico�El objeto nombrado no es localizable�Se necesita un autentificador�La conexi�n de red se perdi� al reinicializar�La red no est� activa�La red es inaccesible�No quedan estructuras CSI disponibles�No quedan sem�foros XENIX disponibles�No existe ninguna direcci�n asociada al nombre�No existe ninguna direcci�n asociada al nombre�No hay ning�n �nodo�No queda espacio para memoria intermedia�No hay ning�n proceso hijo�No hay datos disponibles�No queda espacio de ficheros en el servidor�No se pueden bloquear m�s ficheros�No hay ninguna coincidencia�No se ha encontrado el medio�Ning�n mensaje del tipo deseado�No hay m�s registros en la base de datos�No existe ninguna expresi�n regular anterior�No hay ning�n programa remoto registrado. +-�No existe ninguna ruta hasta el `host'�No queda espacio en el dispositivo�No existe tal dispositivo�No existe el fichero o el directorio�No exite esta clave en la tabla�No existe esa tabla en el dominio del servidor�No existe tal proceso�Se ha encontrado un nombre de espacio que no es NIS+�Fallo irrecuperable en la resoluci�n del nombre�Ninguno. +-�No se encontr�, no existe ese nombre�No es un fichero XENIX del tipo `named'�No es un directorio�No se ha encontrado�No existe un servidor maestro para este dominio�No es el propietario�N�mero de Columnas : %d +-�N�mero de objetos : %u +-�Argumento num�rico fuera del dominio de la funci�n�Resultado num�rico fuera de rango�Objeto #%d: +-�Nombre del Objeto : %s +-�Tipo del Objeto : �El objeto es remoto�Existe un objeto con el mismo nombre�N�mero impar de comillas�Solamente root puede usar esta opci�n�La operaci�n ya se est� llevando a cabo�Operaci�n no permitida�La operaci�n no est� soportada�Operaci�n en curso�La operaci�n se bloquear�a�Alcanzado el l�mite de recursos de `streams'�Control del resultado:�Selecci�n del resultado:�Propietario : %s +-�PRIVADO +-�El paquete no est� instalado�Error de an�lisis: %s��xito parcial�El objeto pasado no es el mismo objeto que hay en el servidor�Permiso denegado�Fallo de alimentaci�n�Fin no esperado de la expresi�n regular�Muestra el contenido de un fichero de base de datos, una entrada por l�nea�Muestra una estad�stica sobre la configuraci�n actual�Muestra m�s mensajes�Muestra la versi�n del programa��xito probable�Probablemente no se encontr��El tiempo de CPU expir��Protocolo no disponible�Error de protocolo�Familia de protocolos no soportada�Protocolo no disponible�Protocolo no soportado�Tipo de protocolo incorrecto para el `socket'�Consulta ilegal para la tabla nombrada�Abandona�error espec�fico de RFS�RPC: procedimiento err�neo para el programa�Fallo RPC en una operaci�n NIS�Programa RPC no disponible�Versi�n del programa RPC incorrecta�la estructura RPC es incorrecta�versi�n de RPC incorrecta�RPC: (c�digo de error desconocido)�RPC: Error de autentificaci�n�RPC: No se pudo descodificar la respuesta�RPC: No se pudieron codificar los argumentos�RPC: Fall� (error no especificado)�RPC: Versiones incompatibles de RPC�RPC: Fallo del asignador de puertos�RPC: Procedimiento no disponible�RPC: Programa no registrado�RPC: Programa no disponible�RPC: La versi�n del programa no coincide�RPC: Error del sistema remoto�RPC: El servidor no puede descifrar los argumentos�RPC: Conseguido�RPC: El tiempo expir��RPC: No se puede recibir�RPC: No se puede enviar�RPC: `Host' desconocido�RPC: Protocolo desconocido�RSA (%d bits) +-�Se ha usado RTLD_NEXT en una parte del c�digo que no se carg� din�micamente�Lee y visualiza los datos de `profiling' del objeto compartido�Lee datos de configuraci�n de NOMBRE�Sistema de ficheros de s�lo lectura�Se�al de tiempo real %d�La expresi�n regular es demasiado grande�Error de E/S en la m�quina remota�La direcci�n remota ha cambiado�Elimine la contrase�a o haga el fichero no legible por otros.�La reapertura del objeto compartido `%s' fall��Replicado : +-�Comunicar `bugs' a %s. +-�Comunicar `bugs' usando el programa `glibcbug' a <bugs@gnu.org>. +-�Los argumentos de la petici�n son incorrectos�Error del determinador de nombres 0 (ning�n error)�Error interno del determinador de nombres�Se ha evitado un bloqueo de recursos�Recurso perdido�Recurso no disponible temporalmente�Resultados enviados al proceso de `callback'�SHOBJ [DATOSPROF]�SUNYP�Ruta de b�squeda : %s +-�Violaci�n de segmento�El servidor est� ocupado, int�ntelo de nuevo�Memoria agotada en el servidor�El servidor rechaz� la credencial�El servidor rechaz� el verificador�No se admite servname para ai_socktype�Establece el nombre del programa�Apagar el servidor�Se�al 0�Operaci�n de `socket' en un `no-socket'�Tipo de `socket' no soportado�El programa provoc� el fin de la conexi�n�Lo siento. Usted no es root +-�Las definiciones fuente se encuentran en FICHERO�Error de `srmount'�Fallo en la pila�`handle' de fichero NFS en desuso�Comienza N�MERO hilos�Estado : %s +-�Parado�Parado (por una se�al)�Parado (requiere entrada de terminal)�Parado (requiere salida por terminal)�Error de tuber�a de `streams'�La estructura necesita una limpieza�Conseguido�Suprime los avisos y los mensajes de informaci�n�Nombres simb�licos de caracteres definidos en FICHERO�Error del sistema�Informaci�n del sistema:�Fallo en la asignaci�n de recursos del sistema�Directorio del sistema para asignaciones de caracteres : %s +- asignaciones de repertorios: %s +- ruta de b�squeda de locales: %s +-%s�TABLA +-�Tipo de Tabla : %s +-�Fallo temporal en la resoluci�n del nombre�Terminado�El fichero de texto est� ocupado�La siguiente lista contiene todos los conjuntos de caracteres conocidos. +-Esto no quiere decir necesariamente que todas las combinaciones de estos +-nombres se puedan usar como par�metros FROM y TO en la l�nea de �rdenes. +-Un determinado conjunto de caracteres puede aparecer con varios nombres +-(aliases). +-Algunos de los nombres no son cadenas normales sino expresiones regulares y +-pueden corresponderse con una variedad de nombres que pueden darse como +-par�metros al programa. +- +- �Tiempo de vida : �El temporizador lleg� al final�Demasiados atributos�Demasiados niveles de enlaces simb�licos�Demasiados enlaces�Demasiados ficheros abiertos�Demasiados ficheros abiertos en el sistema�Demasiados procesos�Demasiadas referencias: no se pueden solapar�Demasiados usuarios�`trap' para punto de parada/seguimiento�Barra invertida extra al final `\'�El traductor ha terminado�El otro extremo ya est� conectado�El otro extremo de la conexi�n no est� conectado�Pruebe `%s --help' o `%s --usage' para m�s informaci�n. +-�Intentando %s... +-�Tipo : %s +-�DESCONOCIDO�No se puede autentificar el cliente NIS+�No se puede autentificar el servidor NIS+�No se puede crear la llamada de regreso�No se puede crear el proceso en el servidor�Desconocido (tipo = %d, bits = %d) +-�Palabra clave %s desconocida en .netrc�Error de NIS desconocido�Base de datos desconocida: %s +-�Error desconocido�Error desconocido �`Host' desconocido�Objeto desconocido�Opci�n desconocida: %s %s %s�Error del determinador de nombres desconocido�Error del servidor desconocido�Se�al desconocida %d�Error del sistema desconocido�Error desconocido en la llamada a `ypbind()'�( � \( desemparejados�) � \) desemparejados�[ � ^[ desemparejados�\{ desemparejado�Variable no reconocida `%s'�Condici�n urgente de E/S�Modo de empleo:�Modo de empleo: %s nombre_de_variable [ruta] +-�Modo de empleo: rpcinfo [ -n n�mpuerto ] -u host progrn�m [ numversi�n ] +-�Se�al definida por el usuario 1�Se�al definida por el usuario 2�Valor demasiado grande para el tipo de datos definido�El temporizador virtual lleg� al final�Resultado salvaje en la ejecuci�n de la orden�La ventana ha cambiado�Escribe los nombres de las asignaciones de caracteres disponibles�Escribe los nombres de los locales disponibles�Escribe los nombres de las categor�as seleccionadas�Escribe los nombres de las palabras clave seleccionadas�Escribe el resultado en el fichero NOMBRE�Escrito por %s. +-�Tipo de medio err�neo�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�S�, 42 es el significado de la vida�Esta vez s� que lo has roto�La l�nea de continuaci�n de la zona no est� despu�s del tiempo de final +-de la l�nea anterior�[FICHERO...]�La definici�n `%1$s' no termina con `END %1$s'�`%s' no es un fichero de datos para `profile' correcto para `%s'�`-1' tiene que ser la �ltima especificaci�n en el campo `%s' de la categor�a +-`%s'�`...' debe usarse �nicamente en las entradas `...' y `UNDEFINED'�Se esperaba `from' despu�s del primer argumento para `collating-element'�La cadena de caracteres `from' en la declaraci�n de elemento de uni�n contiene +-un car�cter desconocido�No se admite ai_familiy�No se admite ai_socktype�ya est� funcionando�el argumento para <%s> debe ser un �nico car�cter�el argumento para `%s' debe ser un �nico car�cter�auth_none.c - Problema muy grave con autorizaci�n marshall�authunix_create: memoria agotada +-�Argumento err�neo�propietario incorrecto�Campo FROM vac�o en la l�nea `Link'�Campo TO vac�o en la l�nea `Link'�bloque liberado dos veces +-�valor de mcheck_status incorrecto, la biblioteca tiene un bug +-�broadcast: iotcl (lee la configuraci�n del interfaz)�broadcast: iotcl (lee las propiedades del interfaz)�desbordamiento de b�fer�cache_set: no se pudo asignar espacio para un nuevo b�fer rpc�cache_set: fall� la asignaci�n de espacio para el objetivo�cache_set: no se encontr� el objetivo�No se puede determinar la abreviaci�n de zona horaria que se usar� justo +-despu�s�no se puede reasignar el procedimiento n�mero %d +-�la llamada a `stat' fall� en el fichero de locales `%s'�no se pudo asignar espacio para los datos del s�mbolo�no se puede crear un descriptor interno�no se pueden crear descriptores internos�no se puede activar el `socket' para aceptar conexiones: %s�no se puede encontrar el preprocesador de C: %s +-�no se puede encontrar ning�n preprocesador de C (cpp) +-�no se pueden manejar peticiones de la versi�n %d, la versi�n +-actual es %d�no se puede insertar el elemento de uni�n `%.*s' �no se puede insertar el la tabla de resultados�no se puede insertar la nueva definici�n para el s�mbolo de uni�n: %s�no se pueden cargar los datos de `profiling'�no se puede abrir�no se puede abrir `%s'�no se puede abrir el fichero de datos `%s': %s�no se puede abrir el fichero de entrada `%s'�no se puede abrir el fichero de definici�n de locales `%s'�no se puede abrir el fichero de salida�no se puede abrir el fichero de salida `%s'�no se puede abrir el fichero de salida `%s' para la categor�a `%s'�no se puede abrir el `socket': %s�no se pueden procesar las especificaciones de orden�no se puede leer el directorio de tablas de caracteres `%s'�no se puede leer el fichero de configuraci�n; este error es fatal�no se puede leer del cliente�no se puede leer la cabecera de `%s'�No se puede leer el directorio de locales %s�no se puede leer el fichero de locales `%s'�no se puede leer la asignaci�n `%s'�no se pueden leer los datos de estad�stica�no se puede ejecutar stat() sobre el fichero `%s': %s�no se puede escribir en el fichero de salida `%s'�no se puede escribir el resultado: %s�no se pueden escribir las estad�sticas: %s�no se puede escribir al cliente�categor�a de datos reclamada m�s de una vez, no deber�a ocurrir�el car�cter %s'%s' en la clase `%s' debe estar en la clase `%s'�el car�cter %s'%s' en la clase `%s' no debe estar en la clase `%s�el car�cter <SP> no est� definido en la tabla de caracteres�el car�cter `%s' no est� definido cuando se necesit� como valor por defecto�la clase de car�cter `%s' ya fue definida�la tabla de caracteres `%s' ya est� definida�el fichero de tabla de caracteres `%s' no se encontr��clnt_raw.c - Error grave en la secuencia de cabecera�clnttcp_create: memoria agotada +-�clntudp_create: memoria agotada +-�clntunix_create: memoria agotada +-�el elemento de uni�n `%.*s' aparece m�s de una vez: pasando por alto la l�nea�s�mbolo de uni�n `%.*s' aparece m�s de una vez: descartando la l�nea�s�mbolo de uni�n esperado despu�s de `%s'�conexi�n a la direcci�n %s: �se esperaba una constante o un identificador�no se admite la conversi�n de `%s' a `%s'�la conversi�n se ha detenido debido a un problema al escribir el resultado�no se pudo crear un servidor rpc +-�no se pudo registrar el programa %d versi�n %d +-�basededatos [clave ...]�no se encontr� el fichero de tabla de caracteres predeterminado `%s'�el indicador de direcci�n en la cadena %d en el campo `era' de la categor�a +-`%s' no es '+' ni '-'�el indicador de direcci�n en la cadena %d en el campo `era' de la categor�a +-`%s' no es un �nico car�cter�nombre de car�cter duplicado `%s'�definici�n duplicada del elemento de uni�n�definici�n duplicada del car�cter `%.*s'�clave duplicada�definici�n de conjunto duplicada�nombre de zona %s duplicado (fichero "%s", l�nea %d)�identificador de mensaje duplicado�n�mero de mensaje duplicado�cadena de caracteres vac�a�nombre de peso vac�o: la l�nea se pasa por alto�enablecache: el cach� ya estaba activado�enablecache: no se pudo crear espacio para el cach��enablecache: no se pudo crear espacio para los datos del cach��enablecache: no se pudo crear espacio para la pila del cach��codificaci�n para el resultado�codificaci�n del texto original�el punto de final para el rango de la elipsis es mayor que el de comienzo�error al cerrar la entrada `%s'�error al cerrar el fichero de salida�error al cerrar el fichero de datos de `profiling'�error cuando se insertaba el elemento de uni�n en la tabla enlazada�error al insertar en la tabla enlazada�error al leer la entrada�se espera un argumento de cadena de caracteres para `copy'�la l�nea de continuaci�n esperada no se encuentra�fallo al cargar el objeto compartido `%s'�fallo al cargar los datos del s�mbolo�no se pudo hacer mmap con el fichero de datos de `profile'�fallo al comenzar el proceso de conversi�n�error al escribir los datos para la categor�a `%s'�fcntl: F_SETFD�el campo `%s' en la categor�a `%s' no est� definido�el campo `%s' en la categor�a `%s' no se ha definido�el fichero `%s' ya existe y podr�a ser sobreescrito +-�el valor `from-value' del elemento de uni�n ha de ser una cadena de caracteres�fstat ha fallado�inconsistencia al final de la especificaci�n del c�digo de caracteres�inconsistencias al final del n�mero�incongruencias al final del valor de desplazamiento en la cadena %d en el +-campo `era' de la categor�a `%s'�incongruencias al final de la fecha de comienzo en la cadena %d en el +-campo `era' de la categor�a `%s'�incongruencias al final de la fecha de parada en la cadena %d en el +-campo `era' de la categor�a `%s'�genera el grafo de llamadas�genera un `profile' plano con contadores y `ticks'�get_myaddress: ioctl (lee la configuraci�n del interfaz)�getent - obtiene entradas de la base de datos administrativa.�handle_request: petici�n recibida (Versi�n = %d)�el enlace duro fall�, se usar� un enlace simb�lico�hay un enlace duro en alguna parte�El campo CORRECTION en la l�nea de a�o bisiesto es ilegal�Campo Rolling/Stationary ilegal en la l�nea de a�o bisiesto�car�cter ilegal en la cadena�car�cter no v�lido en el fichero: �elemento de uni�n ilegal�definici�n ilegal�especificada una codificaci�n ilegal�secuencia de escape ilegal al final de la cadena de caracteres�secuencia de entrada ilegal en la posici�n %ld�nombres no permitidos para el rango de caracteres�tipodered ilegal :`%s' +-�n�mero de desplazamiento ilegal en la cadena %d en el campo `era' de la +-categor�a `%s'�n�mero de conjunto ilegal�fecha de comienzo ilegal en la cadena %d en el campo `era' de la +-categor�a `%s'�fecha de parada ilegal en la cadena %d en el campo `era' de la +-categor�a `%s'�l�mite de la implementaci�n: no se permiten m�s de %d clases de caracteres�l�mite de la implementaci�n: no se permiten m�s de %d tablas de caracteres�car�cter o secuencia de desplazamiento incompleta al final del b�fer�fichero formateado incorrectamente�l�nea de entrada de tipo desconocido�error interno (descriptor ilegal)�error interno - se llam� a `addtype' con un `isdst' err�neo�error interno - se llam� a `addtype' con un `ttisgmt' err�neo�error interno - se llam� a `addtype' con un `ttisstd' err�neo�error interno en %s, l�nea %u�desplazamiento UTC inv�lido�formato de abreviaci�n incorrecto�d�a del mes inv�lido�a�o de final inv�lido�a�o bisiesto inv�lido�modo inv�lido para dlopen()�nombre de mes incorrecto�la hora almacenada no es v�lida�a�o de comienzo inv�lido�hora del d�a inv�lida�nombre del d�a de la semana incorrecto�la longitud de la clave en la petici�n es demasiado larga: %Zd�la l�nea de despu�s de la elipsis tiene que contener una definici�n de car�cter�la l�nea posterior a la elipsis no contiene una definici�n para una constante +-de caracteres�l�nea demasiado larga�lista todos los juegos de caracteres conocidos�fichero de locales `%s', que se usa en una orden `copy', no se encuentra�lstat ha fallado�una l�nea incorrecta no se tendr� en cuenta�fall� la asignaci�n de la tabla de cadenas de cabeceras de secci�n�fall� la asignaci�n de las cabeceras de secci�n�memoria alterada antes del bloque de memoria asignado +-�memoria alterada pasado el final del bloque de memoria asignado +-�memoria agotada�memoria agotada +-�la memoria es consistente, la biblioteca tiene un bug +-�falta el formato de era en la cadena %d en el campo `era' de la +-categor�a `%s'�falta el nombre de la era en la cadena %d en el campo `era' de la +-categor�a `%s'�regla sin nombre�no se ha especificado la codificaci�n original ni la final�netname2user: (b�squeda nis+): %s +-�netname2user: la entrada DES para %s en el directorio %s no es �nica�netname2user: la entrada LOCAL para %s en el directorio %s no es �nica�netname2user: falta la lista de ids de grupo en `%s'.�netname2user: el nombre principal `%s' es demasiado largo�netname2user: no deber�a tener uid 0�el programa %d no fue registrado nunca +-�no se ha dado ning�n valor <Uxxxx> o <Uxxxxxxxx>�falta una expresi�n regular correcta para el campo `%s' en la categor�a `%s': +-%s�ning�n d�a del mes coincide con la regla�no hay definici�n para `UNDEFINED'�no se ha dado un nombre de fichero para los datos de `profiling' +-y el objeto compartido `%s' no tiene soname�ninguna otra palabra clave debe ser especificada al usar `copy'�no se ha producido ning�n fichero de salida debido a la existencia de avisos�no se ha especificado ninguna asignaci�n de repertorio: no se puede continuar�no se ha especificado ning�n nombre simb�lico�no se ha especificado ning�n nombre simb�lico para el final del rango�no hay ning�n peso definido para el s�mbolo `%s'�no es un fichero regular�configuraci�n nscd: +- +-%15d nivel de depuraci�n del servidor +-�nscd no est� en ejecuci�n +-�solamente se permiten ANCHO definiciones despu�s de la definici�n CHARMAP�la codificaci�n original no se ha especificado utilizando `-f'�fichero de salida�pmap_getmaps problema de rpc�poll: fallo de protocolo al configurar el circuito +-�error del preprocesador�muestra la lista de contadores de ruta y su n�mero de uso�muestra informaci�n sobre el desarrollo�problemas mientras se le�a `%s'�el fichero de datos para `profiling' %s no se corresponde con el +-objeto compartido `%s'�el programa %lu no est� disponible +-�el programa %lu versi�n %lu no est� disponible +-�el programa %lu versi�n %lu est� listo y esperando +-�rcmd: poll (activando la salida de error est�ndar): %m +-�rcmd: socket: Se est�n usando todos los puertos +-�rcmd: write (activando la salida de error est�ndar): %m +-�registerrpc: memoria agotada +-�segundo intercalar repetido�el fichero de tabla de caracteres `%s' no se encontr��rpcgen: error de codificaci�n de la lista de argumentos +-�rpcgen: demasiados defines +-�rpcinfo: el `host' %s es desconocido +-�rpcinfo: el servicio `%s' es desconocido +-�rpcinfo: No se pudo borrar el registro para el programa %s versi�n %s +-�rpcinfo: el `broadcast' no tuvo �xito: %s +-�rpcinfo: no se puede comunicar con el asignador de puertos�mismo nombre de regla en varios ficheros�se acabaron los datos mientras se le�a la clave de petici�n: %s�lectura insuficiente mientras se le�a la petici�n: %s�escritura insuficiente en %s: %s�socket: fallo de protocolo al configurar el circuito +-�los �rdenes `forward' y `backward' son mutuamente excluyentes�la especificaci�n para el orden de peso del s�mbolo de uni�n no tiene sentido�entrada est�ndar�salida est�ndar�la fecha de comienzo es ilegal en la cadena %d del campo `era' de la +-categor�a `%s'�a�o de comienzo mayor que a�o de final�el a�o de comienzo es demasiado alto para ser representado�el a�o de comienzo es demasiado bajo para ser representado�la fecha de final es ilegal en la cadena %d del campo `era' de la +-categor�a `%s'�svc_run: - select fall��svc_tcp.c - fallo en la ejecuci�n de `getsockname()' o `listen()'�svc_tcp.c - problema al crear el `socket' tcp�svc_tcp: makefd_xprt: memoria agotada +-�svc_unix.c - problema al crear el `socket' AF_UNIX�svc_unix.c - fallo en la ejecuci�n de `getsockname()' o `listen()'�svc_unix: makefd_xprt: memoria agotada +-�svctcp_create: memoria agotada +-�svcudp_create - fallo en la ejecuci�n de `getsockname'�svcudp_create: memoria agotada +-�svcudp_create: problemas para crear el `socket'�svcunix_create: memoria agotada +-�el s�mbolo para el elemento de uni�n para multi-car�cter `%.*s' repite la +-definici�n de otro elemento�el s�mbolo para el elemento de uni�n multicar�cter `%.*s' repite la definici�n +-de otro elemento�el s�mbolo para el elemento de uni�n multicar�cter `%.*s' repite la definici�n +-de otro s�mbolo�el s�mbolo para el elemento de uni�n multicar�cter `%.*s' repite la definici�n +-de otro s�mbolo�el s�mbolo para el elemento de uni�n multicar�cter `%.*s' repite otro nombre +-de s�mbolo en el conjunto de caracteres�error de sintaxis en la definici�n de %s: %s�error de sintaxis en la directiva `order_start'�error de sintaxis en el nombre de clase de car�cter�error de sintaxis en la definici�n de la conversi�n de car�cter�error de sintaxis en la definici�n del orden de uni�n�error de sintaxis en la definici�n de la uni�n�error de sintaxis en una definici�n de categor�a LC_CTYPE�error de sintaxis en la definici�n de una nueva clase de car�cter�error de sintaxis en la definici�n de un nueva tabla de caracteres�error de sintaxis en la definici�n de local para mensajes�error de sintaxis en la definici�n de local para moneda�error de sintaxis en la definici�n de local para n�meros�error de sintaxis en la especificaci�n de orden�error de sintaxis en el pr�logo: %s�error de sintaxis en la definici�n de la asignaci�n: %s�error de sintaxis en la definici�n de local para la hora�error de sintaxis: no est� dentro de una secci�n de definici�n para un local�no se ha especificado la codificaci�n final utilizando `-t'�esta es la primera vez que aparece la definici�n�hora antes de cero�desbordamiento horario�insuficiente n�mero de bytes en la codificaci�n del car�cter�demasiados bytes en la codificaci�n del car�cter�demasiadas clases de caracteres definidas�demasiados segundos intercalares�demasiados tipos de hora local���demasiadas transiciones?!��demasiados pesos!�demasiadas abreviaturas de zona horaria, o demasiado largas�hay inconsistencias al final de la l�nea�dificultades para responder al programa %d +-�no est�n permitidas dos l�neas en una misma fila con `...'�tecleado un �nico a�o�no se puede asignar espacio para el b�fer de entrada�no se pueden liberar los argumentos�sin definir�car�cter desconocido `%s'�car�cter no reconocido en el campo `%s' de la categor�a `%s'�la directiva de uni�n es desconocida�directiva desconocida `%s': l�nea pasada por alto�error de iconv() desconocido %d�conjunto `%s' desconocido�s�mbolo desconocido `%.*s': l�nea descartada�zona sin reglas�mensaje sin terminar�cadena de caracteres sin terminar�constante de caracteres sin terminar�nombre simb�lico sin terminar�nombre de peso sin terminar�el l�mite superior del rango no es menor que el l�mite inferior�modo de empleo: %s fichero_de_entrada +-�uso de 2/29 en un a�o no bisiesto�el valor para %s tiene que ser un n�mero entero�el valor para <%s> debe estar entre 1 y 4�el valor para el campo `%s' en la categor�a `%s' no debe estar vac�o�el valor de <mb_cur_max> tiene que ser mayor que el valor de <mb_cur_min>�el valor del campo `int_curr_symbol' en la categor�a `LC_MONETARY' no se +-corresponde con un nombre v�lido en ISO 4217�el valor del campo `int_curr_symbol' en la categor�a `LC_MONETARY' tiene +-una longitud err�nea�los valores para el campo `%s' en la categor�a `%s' deben ser menores +-que 127�al aceptar la conexi�n: %s�al asignar espacio para la entrada en el cach��al asignar espacio para la entrada en la tabla `hash'�al asignar espacio para la copia de la clave�al abrir el fichero de cat�logo antiguo�al preparar la salida�al leer el fichero de datos�al ejecutar `stat' sobre el fichero de datos de `profiling'�al escribir la base de datos�escritura incompleta�puede ser modificado por otros adem�s del propietario�n�mero incorrecto de argumentos�n�mero incorrecto de campos en la l�nea de bisiesto (Leap)�n�mero incorrecto de campos en la l�nea de enlace (Link)�n�mero incorrecto de argumentos en la l�nea de regla (Rule)�n�mero de campos incorrecto en la l�nea de continuaci�n de zona (Zone)�n�mero de campos incorrecto en la l�nea de zona (Zone)�xdr_reference: memoria agotada +-�xdrrec_create: memoria agotada +-�yp_update: no se puede convertir el nombre del `host' a nombre de red +-�yp_update: no se puede encontrar la direcci�n del servidor +-� +\ No newline at end of file +diff -Naur ../glibc-2.1.3/po/fr.mo glibc-2.1.3/po/fr.mo +--- ../glibc-2.1.3/po/fr.mo 1999-08-18 18:02:29.000000000 -0700 ++++ glibc-2.1.3/po/fr.mo 1969-12-31 16:00:00.000000000 -0800 +@@ -1,486 +0,0 @@ +-�������������������8�������K������K������K��M���L��E���UL��&����L��(����L������L������L�����M�����&M�����5M�����IM�����dM�����~M��n���M�����O�����O��"���%O��"���HO�����kO��:����O������O������O������O������O�����P�����P�����2P�����LP�����eP������P������P������P������P������P�����Q�����#Q�����*Q�����EQ�����RQ�����YQ��3���kQ��3����Q��4����Q��.���R��%���7R�����]R��&���qR��%����R������R��%����R��3����R��,���/S��)���\S������S��"����S��!����S������S������S�����T�����.T�����DT��"���ZT��*���}T������T��&����T��&����T��&���U��&���7U��&���^U������U�� ����U��$����U������U������U�����V��,���2V�����_V��%���}V��,����V��-����V�� ����V��&���W�����FW�����eW������W������W������W������W�������W��2���|X������X��"����X��4����X�����"Y��#���4Y�� ���XY��=���bY������Y��<����Y������Y��'���Z�����6Z��)���?Z��(���iZ�� ����Z������Z������Z������Z��$����Z������Z��)��� +-[��(���4[�����][�����m[�����y[��#����[��/����[������[������[�� ���\�����\�����%\�����9\�����N\�����Z\�����j\������\������\������\������\������\�� ����\������\������\�� ���]��&���]��-���<]��!���j]������]������]������]������]��&����]��%���&^��0���L^��!���}^������^��-����^������^��%���_��)���(_��'���R_��%���z_��&����_������_������_������_����� +-`�����%`�����<`�����X`�����u`��@����`��D����`�����a�����'a�����@a�� ���Ua��=���_a������a�������a�����b��7����b��2����b��-��� c�����7c��$���Jc�� +-���oc�����zc������c��!����c������c������c������c������c�����d�����d�����/d�����Jd�����^d�����rd��3����d��-����d��2����d�����e�����,e�����5e�����<e�����Le�����fe��<���}e������e��$����e��)����e�� ���)f�����7f��1���If��8���{f������f������f������f������f�����g�����'g�����@g�����Og�����gg��"����g������g������g������g�������g�����oh�� ����h������h������h������h������h�� ����h�����i��$���'i�����Li��"���Si��%���vi��"����i��"����i��%����i�����j�����j�����.j��>���;j�����zj������j������j������j��!����j������j��!����j������j��.���k�����Mk�����ak�����nk��"���{k������k������k������k�� ����k������k��+����k�����(l�����El�����Vl�����ml������l������l������l������l������l����� +-m��1���m��$���Mm�����rm������m������m������m������m������m������m�����n�� +-���n�����#n�����*n��2���0n�����cn�����rn������n�� ����n������n������n������n������n����� o�����o��!���3o�����Uo�����so��s����o�����p��*���p�����Cp�����]p�����np�����p������p������p������p������p������p�����q�����q�����q��9���q�����Vq�����nq������q��,����q�� +-����q������q������q������q�����r�����#r�����>r�����Xr�����pr������r��#����r������r������r������r�����s��#���&s�����Js�����js�����ss������s������s������s������s������s������s������s�����t�����1t�����Pt�����pt������t������t������t������t������t������t�����u��*���#u�����Nu�����Uu�����mu������u�� ����u��!����u�� ����u������u������u�� ���v�����"v�����@v�����Mv�����av�����rv������v������v��(����v������v�����w�����w�����5w�����Ow�����ew�����~w������w������w������w������w������w������w��.����w�����"x�� ���4x��#���Bx��0���fx��%����x������x������x������x������x�����y�����#y�����@y�����Oy�����my������y������y������y������y������y������y�����z�����+z�����Ez�����_z�����qz������z������z������z������z������z��!���{�����.{�����G{�����b{�����~{������{������{��"����{������{������{����� |�����$|�����8|�����J|�����`|��-���o|��-����|��!����|������|�����}�����}�����2}�����C}��2���Z}��#����}������}������}��;����}�����~�����$~�����@~�����X~�� ���r~�� ����~������~������~������~������~������~���������������/�����J��&���c�������������������������������� ������������$���0��� ���U������c������o����������������������������������ˀ�����߀����������������� ���*���(���(���S������|����������"������������������D������K���$���e��� +-������������������������P��� ���`������n���!������������������������DŽ��������"����������������*������@������S���'���c���#�������6������� ������ +-�������������"������"���*������M���"���g��������������������Ć�����ۆ�� ����������������������������*������C������Z������o����������������������������������χ����������������� ���������#���%���:���I�����������������%����������ֈ��"������������!������ ���@���"���a��� ������������������������ω�����������������������������!���F���>��� �������.�������-�������6������8���#���;���\���I��������������������������+���$���+���P���'���|�������������Č�� ���ь�����ی���������������&���(���.���O���&���~����������,�������������������C������#���a�����������������!�������"������.������ ���4���%���U���;���{���&����������ޏ��1����������0������K������W���"���h����������'����������ϐ��������.���������3���"���J���(���m���-����������đ�����ܑ��!����������������8������X������t���!�����������������ʒ��������9�������4���7���8���l���+�������8���ѓ��$��� +-���"���/���!���R���.���t���������������������<������;���>���$���z�����������������*���ו��7���������:���"���Y������|���)�������N�������U���������^���&���|���)������� ���͗�����ۗ��+���������� ������>������X������j���"�������%�������*���Ә��*����������)������=���0���W�����������������+���Ǚ��7������#���+������O���!���m���$�������!����������֚��&������%������,���>������k���'���z���%�������0���ț��2����������,���.���9������h���K�������L���͜��L���������g���+���{���2�������2���ڝ��/��� ���$���=������b���%���x���-�������$���̞����������� ������'������:���(���Q���&���z���!����������ß��F���ڟ�����!���B���4���B���w���?�������<�������7���7������o����������#�������.���ɡ��0�������0���)������Z������x���������������������������Т������������������������%������;������O���#���d���5�������G������� ������#������5���8������n������{���-�������!�������(������-���������9������J���'���\���?�������=���ĥ�� ������.������ ���?���9���`���;�������,���֦��*������#���.������R���%���l���A����������ԧ��������I������7���X���3�������+���Ĩ��������'������!���/������Q���.���b����������C�������*������������������(���8������a���1���t�����������������:���ݪ��������)���6���*���`���#��������������$���ϫ���������������"���,������O������m�����������������>���Ĭ��������!���"��� ���D���(���e���$��������������*���ɭ��=�������H���2������{����������E�������&������(������'���0���E���X����������(�������'������$������,���-���)���Z���%��������������"���Ȱ��������&��� ������0���P���O���V�������U�������O���M���V�������!�������'������*���>���/���i���*�������$���ij��/������1������/���K���)���{���*�������)���д��#�������������-���9���&���g���4�������(���õ����������� ��� ������#���(���$���L���"���q��������������������Ķ�����۶��.���������������;���3���X����������#����������·�� ���۷��������0����������-���$���I������n����������#�����������������ȸ�����ݸ�����������������)���4���B������w�����������������'���ǹ��B������D���2���j���w���K������?���.������n����������!����������̻��������������������"���3������V������r�����������������#�������#�����#������0���'���#���X������|����������*�������%������;�� ������E������Y���T���l���Y�������>������@���Z����������������������������������������������� ������:������O������$������:���(���L���(���u����������C�����������������������������/������H������e������~���������� �������������� ����������������3������S���)���k������������������������ +-��������������>�������>���"���M���a���4�������%���������� +-���+���*���%���V������|���A�������8�������8������8���H����������'�������/��������������������*���*������U������r���,�������M���������� +-���(���#���(���L���(���u���(�������(��������������+������1���4���&���f�����������������0��������������(������/���<���0���l���!�������)��������������2���������9������W������n������������������<���@���$���}���(�������9�������������)������ ���@���D���J����������T�������)�������*��� ��� ���K���7���Y���7�������0���������������������������0���������F���6���\���1����������������������������)��� ���E���3������y���������� ���������������������#���������������� ���,���5���3���b�����������������+�������������� ������������������ ���,���0���:���>���k���2���������������������������$���9���6���^���3�������=�������D���������L���D���k���+�������5�������.������<���A���4���~���:�������%������������� ���2������S������q���/������� �������!�������]�������i���Y����������-�������4������ ���8���>���B���'����������������������L�������C�������C���B����������5����������������������������.����������������7������T���+���s���������� ������������������������ +-���$���(���V���M���F�������P����������<��� +-���[������f������n���3��������������U�������0���,���4���]���A���������������������=������P���F����������3��������������,����������(���0���A������r�����������������9��������������������)����������A���������'������*���B������m������������������������)�������-�������������,���;���4���h���,�������8�������4������$���8���)���]����������\������� +-���������������������������&���,������S���%���d���'�������7������������������������ ���*��� ������K������b������x�����������������3��������������������������$���9������^������z���"��������������"��������������C��� +-���(���N������w������������������������ ���������� ���������$���*��� +-���O������Z������k���?���r����������������������������������������$������=������\������p���-���}���(�������)��������������}�������������0������������������������ ��� ���������<������U���$���k���!�������9����������������������������M�������/���N������~���*�������1����������������������� ���'���������>���&���^�������������������������������;����������1������N������n��� �������-�������#����������������������:������Q���-���j�������������������������������>�������&���3���,���Z���0�������+��������������&������!���)���1���K������}���"�������2�������������� �������#���������;��� +-���S���+���^������������������������+�������4���������7������C������W������g����������&�������/�����������������������(������@��� ���^���1��������������������������������������������������4���/���C������s����������(�������G�������6���������H��� ���c�����������������<�������%�������������#���#������G������`���(���w���&���������������������#������� ��� ������.��� ���K���%���l������������������������ �������#������!���(���"���J���!���m���&�������&�������&�������/������$���4���.���Y����������(�������'�������*����������������"������9���C���H���;�������(�������3����������%��� ���=���'���^���)�������Q�������,��������/��!���>��Q���`��(������,����������&���%����L�'���]�,�������������������������!������������7�#���W�/���{����������������/���������1���3����e�=�������������������� �������#����;����B����Q����o� �����%����������7�����;�������P����_�(���t����������9����@�*���Z�������������������������������$����� �������� +- �(���# ����L �%���^ ����� �%���� � ���� ����� �&���� �+��� +-�>���A +-����� +-� +-���� +-����� +-�'���� +-�(���� +-� ���� +-�.�������D����d�������������������������� �����������������1����K����]����u������������������������ ���� ����6 �+���= �=���i ����� ����� �1���� �$����;���:����v�6�����/�����-�����,���!�&���N����u���������������������%�����-�����n���������5�����4�����A�����H���:�@�����T������������1����J�3���\�3�����-�����!������������&�.���;�,���j������;�����;�����C���&����j�8�����)����������T����-���W�:�����(�����$�����'����:���6�'���q�)�����P�����0����;���E�F�����2������������� +-�5����'���T�0���|�#�����(�����:��������5�1���T�>�����8��������������>���4�.���s�*�����(�����.�����4���%�"���Z�%���}������J�����@����G���M�6�����B�����&����%���6�5���\�5����� ����� �����!��� +-�F���,�F���s�*�����"�����#����4���,�A���a������2����������2��� �h���A �l���� �"���!�4���:!�.���o!�����!� ����!�5����!�(���"����/"����N"� ���h"�����"�&����"�1����"�3���#����6#����L#�>���g#�4����#�0����#�>���$�O���K$�3����$�%����$�+����$�+���!%�+���M%�)���y%�A����%�-����%�6���&����J&�-���Y&�%����&�1����&�@����&���� '�4���;'����p'�a����'�S����'�S���B(�����(�N����(�?����)�D���@)�,����)�?����)�����)�9���*�>���B*�-����*�!����*�����*�����*����+�5���+�1���S+�,����+�����+�Y����+����%,�G���;,�G����,�I����,�H���-�@���^-�����-�����-�$����-�G���.�I���J.�I����.� ����.�����.����/����</����R/����h/�����/�����/�����/�����/�����/�����/�:���0�D���W0�Z����0�����0�)��� 1�H���31����|1�����1�6����1�)����1�%���2�,���72����d2����t2�6����2�N����2�?���3����K3�3���Z3�(����3�G����3�I����3�E���I4�.����4�+����4�+����4�,���5�C���C5�*����5�%����5�Y����5�D���26�E���w6�6����6�����6�8���7�(���I7����r7�7����7�����7�^����7�3���E8����y8� ����8�:����8�����8�A����8�(���A9�#���j9�R����9�'����9�6��� :�8���@:�)���y:�*����:�-����:�����:�$���;�5���?;�5���u;�����;� ����;�#����;�I��� <� ���W<�0���x<�)����<�<����<�7���=����H=�=���f=�H����=�Q����=����?>����O>�J���_>�-����>�1����>�1��� +-?�J���<?�����?�J����?�0����?�&���!@�7���H@�K����@�'����@�����@�B���A����WA�-���wA� ����A�w����A�y���>B�z����B�w���3C������C�.���3D�1���bD�?����D�?����D�?���E�4���TE�G����E�H����E�G���F�9���bF�E����F�J����F�;���-G�!���iG�D����G�L����G�J���H�.���hH� ����H�����H�����H�0����H�,��� I�,���MI����zI�7����I�����I�����I�8���J�%���:J�%���`J�>����J�����J�+����J�#��� K����-K����6K�6���MK�"����K�&����K�����K�����K�%����K����#L����3L����EL�!���WL����yL�����L�T����L�����L�.���M�$���IM�2���nM�J����M�N����M�~���;N�Z����N�M���O�&���cO�+����O�7����O�'����O�1���P�#���HP�(���lP�B����P�0����P���� Q�7���Q����UQ�4���rQ�4����Q�4����Q�D���R�4���VR�����R�����R�H����R�0���S��������k��������������������������@������,�������(�������������:��C����������������p��}���������2�������������k��D����������!��a���S����q�������J������������w��7������������@��������������E��V��H���������s������l���s���������u���[���������v������������������:������������������6��=������u������������������o���.������ ����|��d�����p���������������9�������������������$���������[�������������������l��?���������������C��`��������������*�����X���9��I������S��V��p������!������������y��d������������������������������Q������1�����������������n��^�� +-��� ���m���4���������?��������m������r�������������������������������]�������������������������������#������������������/���_��J����������������������������������������������s��f��Q��8�����r����������z���������<������������������x������B��{��K�������������>����������D��M����������������������������>����������������o���������i�������@����������x����������������b������� �������g���a�����������������E��o��e�������-��x��W������������������������������������������������Z�������s���R��"�������������4���������������/��������������������*����������(�������������������1�������k������L��V������N����)��������A������y���������*�����f���$������X������Q��)��#���K����������������[�������q�������D�����������T������a����������.���������T�������,��'�������u��\������������!�������3������������g�� +-������=��H���]�����-��5��O��z��������������������j�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��`�����������������������������������U������m�����{�����Q������c��P��������������������������������������������6���r����������������`���������t�����e��5�������������F��h��|�������������������b�������������������e�����\���~��2��E������� ���j�������#����������� ���������m��������������y������������1��M����������\����������4��f�������R����������7��Y�������������f��L�������F������������������������������������<����������� �� ���������������{��i���������Y�������������������������������� ���%���������(������c����������������������������~��������,����������{��������������������������������C���5��"���������?������v���)�������?������ +-����������+��������������/��~��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��P������������������������y���`�� ��<��w���}�����_�����'��H������d��������������n����������������H���������G������5��>����+�������S�����������-���������Y������������!����������������I����������g����l���������^��z������������v����������������������������������������N��A������|�����t���������W��������������������������+��������$��3��h�����������������c����������������������b��&��A������i���������������������b��[�� �������8�������������O��������o�����Y��#���������������r�����N���0����������������;��n��������������%����������������������������������������������������������E�� ������K������������ +-��M��������������������������h�������X��������������T��t������������������^�����9�����M�� ��J���������������>���+�����������������(���������2��c���������6��&��������V���)��������������������������������U��=�������B�������������;���v����������������0���������������Z�����������%��������������������~���������]������������������������1���������������N��������p��2��i���'��:��0������-���D�����������S������������������������W������L��8�����������������������������������}�������������������,�����������������������t�������������&�����B��w�������������l�����������������I�����������������������������6��'��������������������U�������������������������:������*������F�������������������������������������������n���������.�����q������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��T��Z��F����������������g��4�����q�����_��O��K��P��\����������������X�������������I�����������z��������������������������������������������������������G����������0�����a��A�����B�����j��U�����������������������������������<��$������k���������������]��P�����������h���������������3��������������9���������� Access Rights : � Attributes : � %s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile] +-� %s [-n netid]* [-o outfile] [infile] +-� %s [-s nettype]* [-o outfile] [infile] +-� Access rights: � Entry data of type %s +-� Name : %s +-� Public Key : � Type : %s +-� Universal addresses (%u) +-� [%d] Name : %s +-� [%u] - [%u bytes] � +-%s cache: +- +-%15s cache is enabled +-%15Zd suggested size +-%15ld seconds time to live for positive entries +-%15ld seconds time to live for negative entries +-%15ld cache hits on positive entries +-%15ld cache hits on negative entries +-%15ld cache misses on positive entries +-%15ld cache misses on negative entries +-%15ld%% cache hit rate +-%15s check /etc/%s for changes +-� +-Group Members : +-� +-Time to Live : � rpcinfo -b prognum versnum +-� rpcinfo -d prognum versnum +-� rpcinfo -p [ host ] +-� rpcinfo [ -n portnum ] -t host prognum [ versnum ] +-� no� yes� Data Length = %u +-� Explicit members: +-� Explicit nonmembers: +-� Implicit members: +-� Implicit nonmembers: +-� No explicit members +-� No explicit nonmembers +-� No implicit members +-� No implicit nonmembers +-� No recursive members +-� No recursive nonmembers +-� Recursive members: +-� program vers proto port +-� or: � (rule from "%s", line %d)� [OPTION...]� done +-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags. +-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed. +-�%s%s%s:%u: %s%sUnexpected error: %s. +-�%s%sUnknown signal %d +-�%s: %d did not sign extend correctly +-�%s: <mb_cur_max> must be greater than <mb_cur_min> +-�%s: C preprocessor failed with exit code %d +-�%s: C preprocessor failed with signal %d +-�%s: Can't create %s: %s +-�%s: Can't create directory %s: %s +-�%s: Can't link from %s to %s: %s +-�%s: Can't open %s: %s +-�%s: Can't remove %s: %s +-�%s: Error closing %s: %s +-�%s: Error reading %s +-�%s: Error writing %s +-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s +-�%s: Memory exhausted: %s +-�%s: More than one -L option specified +-�%s: More than one -d option specified +-�%s: More than one -l option specified +-�%s: More than one -p option specified +-�%s: More than one -y option specified +-�%s: Too many arguments +-�%s: cannot get modification time�%s: command was '%s', result was %d +-�%s: error in state machine�%s: illegal option -- %c +-�%s: invalid option -- %c +-�%s: option `%c%s' doesn't allow an argument +-�%s: option `%s' is ambiguous +-�%s: option `%s' requires an argument +-�%s: option `--%s' doesn't allow an argument +-�%s: option `-W %s' doesn't allow an argument +-�%s: option `-W %s' is ambiguous +-�%s: option requires an argument -- %c +-�%s: output would overwrite %s +-�%s: panic: Invalid l_value %d +-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s' +-�%s: unrecognized option `--%s' +-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ] +- [ -L leapseconds ] [ -y yearistype ] [ filename ... ] +-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ... +-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object) +-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible +-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]... +-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT +-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data +-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag! +-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file! +-�Cannot use netid flag with inetd flag! +-�Cannot use netid flag without TIRPC! +-�Cannot use table flags with newstyle! +-�Channel number out of range�Character Separator : %c +-�Child exited�Client credential too weak�Columns : +-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc. +-This is free software; see the source for copying conditions. There is NO +-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique +-�DIRECTORY +-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights : +-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits) +-�Directory : %s +-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY +-�Encrypted data +-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file. Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP +-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group : %s +-�Group Flags :�Group entry for "%s.%s" group: +-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos. +-�Killed�LINK +-�LOCAL entry for UID %d in directory %s not unique +-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s +-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server : +-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME +-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT +-�NUMBER�Name : '%s' +-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered. +-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None. +-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns : %d +-�Number of objects : %u +-�Numerical argument out of domain�Numerical result out of range�Object #%d: +-�Object Name : %s +-�Object Type : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner : %s +-�PRIVATE +-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits) +-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate : +-�Report bugs to %s. +-�Report bugs using the `glibcbug' script to <bugs@gnu.org>. +-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path : %s +-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root +-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status : %s +-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%s�TABLE +-�Table Type : %s +-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known. This does +-not necessarily mean that all combinations of these names can be used for +-the FROM and TO command line parameters. One coded character set can be +-listed with several different names (aliases). +- Some of the names are no plain strings but instead regular expressions and +-they match a variety of names which can be given as parameters to the +-program. +- +- �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information. +-�Trying %s... +-�Type : %s +-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d) +-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s +-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname] +-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s. +-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory +-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice +-�bogus mcheck_status, library is buggy +-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d +-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s +-�cannot find any C preprocessor (cpp) +-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory +-�clntudp_create: out of memory +-�clntunix_create: out of memory +-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server +-�couldn't register prog %d vers %d +-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten +-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s' +-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block +-�memory clobbered past end of allocated block +-�memory exhausted�memory exhausted +-�memory is consistent, library is buggy +-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s +-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d +-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration: +- +-%15d server debug level +-�nscd not running! +-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup +-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available +-�program %lu version %lu is not available +-�program %lu version %lu ready and waiting +-�rcmd: poll (setting up stderr): %m +-�rcmd: socket: All ports in use +-�rcmd: write (setting up stderr): %m +-�registerrpc: out of memory +-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error +-�rpcgen: too many defines +-�rpcinfo: %s is unknown host +-�rpcinfo: %s is unknown service +-�rpcinfo: Could not delete registration for prog %s version %s +-�rpcinfo: broadcast failed: %s +-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup +-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory +-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory +-�svctcp_create: out of memory +-�svcudp_create - cannot getsockname�svcudp_create: out of memory +-�svcudp_create: socket creation problem�svcunix_create: out of memory +-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d +-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage: %s infile +-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory +-�xdrrec_create: out of memory +-�yp_update: cannot convert host to netname +-�yp_update: cannot get server address +-�Project-Id-Version: GNU libc 2.1 +-POT-Creation-Date: 1998-11-28 09:29-0800 +-PO-Revision-Date: 1999-08-13 08:52-0500 +-Last-Translator: Michel Robitaille <robitail@IRO.UMontreal.CA> +-Language-Team: French <traduc@traduc.org> +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=ISO-8859-1 +-Content-Transfer-Encoding: 8-bit +-� Droits d'acc�s : � Attributs : � %s [-abkCLNTM][-Dname[=valeur]] [-i taille] [-I [-K secondes]] [-Y chemin] fichier +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o fichier_de_sortie] [fichier_d_entr�e] +-� %s [-n id_r�seau]* [-o fichier_de_sortie] [fichier_d_entr�e] +-� %s [-s type_r�seau]* [-o fichier_de_sortie] [fichier_d_entr�e] +-� Droits d'acc�s : � Donn�es entr�es de type %s +-� Nom : %s +-� Cl� publique : � Type : %s +-� Adresses universelles (%u) +-� [%d] Nom : %s +-� [%u] - [%u octets] � +-%s m�moire cache: +- +-%15s m�moire cache est activ�e +-%15Zd taille sugg�r�e +-%15ld dur�e de vie en secondes pour les entr�es positives +-%15ld dur�e de vie en secondes pour les entr�es n�gatives +-%15ld succ�s de rep�rage sur les entr�es positives +-%15ld succ�s de rep�rage sur les entr�es n�gatives +-%15ld �chec de rep�rage sur les entr�es positives +-%15ld �chec de rep�rage sur les entr�es n�gatives +-%15ld%% taux de rep�rage +-%15s v�rifier /etc/%s pour les changements +-� +-Membres du groupe : +-� +-Dur�e de vie : � rpcinfo -b no_program no_version +-� rpcinfo -d no_program no_version +-� rpcinfo -p [ h�te ] +-� rpcinfo [ -n no_de_port ] -t h�te no_program [ no_version ] +-� non� oui� Longueur des donn�es = %u +-� Membres explicites: +-� Non-membres explicites: +-� Membres implicites: +-� Non-membres implicites: +-� Pas de membre explicite +-� Pas de non-membre explicite +-� Pas de membre implicite +-� Pas de non-membre implicite +-� Pas de membre r�cursif +-� Pas de non-membre r�cursif +-� Membres r�cursifs: +-� program no_version protocole no_port +-� ou: � (r�gles de "%s", ligne %d)� [OPTION...]� compl�t� +-�"%s", ligne %d: %s�La ligne "Zone %s" et l'option -l sont mutuellement exclusifs.�La ligne "Zone %s" et l'option -p sont mutuellement exclusifs.�"fichier_d_entr�e" est requis pour la g�n�ration du gabarit des indicateurs. +-�%.*s: le param�tre ARGP_HELP_FMT requiert une valeur�%.*s: param�tre ARGP_HELP_FMT inconnu�%s est dans une zone sans r�gle�%s%s%s:%u: %s%s l'assertion `%s' a �chou�. +-�%s%s%s:%u: %s%s erreur impr�vue: %s. +-�%s%ssignal inconnu %d. +-�%s: %d n'a pas fait correctement l'expansion de la valeur sign�e +-�%s: <mb_cur_max> doit �tre plus grande que <mb_cur_min> +-�%s: �chec du pr�processeur C -- code de terminaison: %d +-�%s: �chec du pr�processeur C -- code de terminaison: %d +-�%s: ne peut cr�er %s: %s +-�%s: ne peut cr�er le r�pertoire %s: %s +-�%s: ne peut �tablir un lien entre %s et %s: %s +-�%s: ne peut ouvrir %s: %s +-�%s: ne peut enlever %s: %s +-�%s: erreur lors de la fermeture de %s: %s +-�%s: erreur de lecture de %s +-�%s: erreur d'�criture de %s +-�%s: erreur d'�criture sur la sortie standard�%s: ligne de type `Leap' dans un fichier qui n'a pas +-de d�lai en secondes %s +-�%s: m�moire �puis�e: %s +-�%s: option -L sp�cifi�e plus d'une fois +-�%s: option -d sp�cifi�e plus d'une fois +-�%s: option -l sp�cifi�e plus d'une fois +-�%s: option -p sp�cifi�e plus d'une fois +-�%s: option -y sp�cifi�e plus d'une fois +-�%s: trop de param�tres +-�%s: ne peut obtenir la date de modification�%s: la commande �tait '%s', le r�sultat �tait %d +-�%s: erreur de l'automate � �tats finis�%s: option ill�gale -- %c +-�%s: option invalide -- %c +-�%s: l'option `%c%s' ne permet pas de param�tre. +-�%s: l'option `%s' est ambigu� +-�%s: l'option `%s' requiert un param�tre +-�%s: l'option `--%s' ne permet pas de param�tre +-�%s: l'option `-W %s' ne permet pas de param�tre +-�%s: l'option `-W %s' est ambigu� +-�%s: l'option requiert un param�tre -- %c +-�%s: la sortie �craserait %s +-�%s: panique: valeur %d de type `l_value' invalide +-�%s: fin pr�matur�e du fichier�%s: incapable d'ouvrir�%s: option non reconnue `%c%s' +-�%s: option non reconnue `--%s' +-�%s: usage: %s [ -s ] [ -v ] [ -l temps_local ] [ -p r�gles_posix ] [ -d r�pertoire ] +- [ -L secondes_�coul�es ] [ -y type_ann�e ] [ fichier ... ] +-�%s: usage: %s [ -v ] [ -c seuil ] nom_du_fuseau_horaire ... +-�%s: lors de l'�criture sur la sortie�(ERREUR DU PROGRAMME) Version inconnue!?�(ERREUR DU PROGRAMME) L'option aurait d�e �tre reconnue!?�(Objet inconnu) +-�(erreur inconnue d'authentification - %d)�(inconnu)�*** Le fichier `%s' a �t� �lagu�: aucune analyse d�taill�e possible +-�*entr�e standard*�-o FICHIER_DE_SORTIE [FICHIER_D_ENTR�E]... +-[FICHIER_DE_SORTIE [FICHIER_D_ENTR�E]...]�La section .lib dans a.out est corrompue.�; version basse = %lu, version haute = %lu�; pourquoi = �<%s> et <%s> sont des noms ill�gaux pour un intervalle.�Le caract�re <SP> ne doit pas �tre dans la classe `%s'.�Le caract�re <SP> n'est pas dans la classe `%s'.�?�Abandon�Droits d'acc�s :�Acc�s d'une librairie partag�e qui est corrompue�Adresse d�j� utilis�e�Famille d'adresses non support�e pour le nom de l'h�te�Famille d'adresses non support�e par le protocole�Erreur d'annonce�Minuterie d'alerte�Liste de param�tres trop longue�Tentative de retrait d'une table non vide�Tentative d'�dition de liens � partir de trop de librairies partag�es�Succ�s d'authentification�Erreur d'authentification�OBJET ERRON� +-�Mauvaise adresse�Mauvais descripteur de fichier�Mauvais format du fichier de fontes�Message invalide�Appel syst�me erron��Mauvaise valeur pour l'indicateur `ai_flags'�Doit se conformer de fa�on stricte � la norme POSIX�Valeur binaire +-�Bloc de p�riph�rique requis�Probl�me de scrutation lors de la diffusion�Relais bris� (pipe)�Erreur du bus�CDS�Temps UCT limite expir��Cache expir�e�Ne peut acc�der � la librairie partag�e demand�e�Ne peut �tablir un lien avec le serveur qui dessert ce domaine�Ne peut communiquer avec le convertisseur de ports�Ne peut communiquer par ypbind�Ne peut communiquer par ypserv�Ne peut allouer de la m�moire�Ne peut attribuer l'adresse demand�e�Ne peut cr�er un socket pour une diffusion de type RPC�Ne peut ex�cuter une librairie partag�e directement�Ne peut avoir plus d'un fichier de g�n�ration de s�maphores! +-�Ne peut recevoir l'accus� r�ception � la requ�te faite par diffusion�Ne peut enregistrer le service�Ne peut transmettre suite � la fermeture du noeud final de transport�Ne peut transmettre le paquet par diffusion�Ne peut initialiser l'option `SO_BROADCAST' du socket�Ne peut sp�cifier plus d'un fichier d'entr�e! +-�Ne utiliser le s�maphore `netid' avec le s�maphore `inetd'! +-�Ne peut utiliser le s�maphore `netid' sans `TIRPC'! +-�Ne peut utiliser la table des s�maphores avec `newstyle'! +-�Num�ro de canal en dehors des limites�Caract�re de s�paration : %c +-�Le processus `enfant' a termin�.�Identit� du client peu fiable�Colonnes : +-�Erreur de communication lors de la transmission�Compiler la sp�cification locale�L'ordinateur a achet� la ferme...�Le calcul de la taille de la table des classes de caract�res +-peut prendre un certain temps...�Le calcul de la taille de la table pour le fusionnement des informations +-peut prendre un certain temps...�Connexion refus�e�Connexion r�-initialis�e par le correspondant�Connexion termin�e par expiration du d�lai d'attente�Poursuite�Conversion de l'encodage des fichiers d'un encodage � l'autre.�Conversion des caract�res en minuscules�Copyright � %s Free Software Foundation, Inc. +-Ce logiciel est gratuit; voir les sources pour les conditions de +-reproduction. AUCUNE garantie n'est donn�e; tant pour des raisons +-COMMER�IALES que pour R�PONDRE � UN BESOIN PARTICULIER. +-�Ne peut cr�er le journal "%s"�Cr�ation du NOM du fichier d'en-t�te C contenant les d�finitions de symboles�Cr�er la sortie m�me si des messages d'avertissement sont affich�es�Cr�er une base de donn�es DB simple � partir des entr�es textuelles�Date de cr�ation : %s�Entr�e DES pour le nom de r�seau %s n'est pas unique +-�R�PERTOIRE +-�DNANS�DNS�La base de donn�es de la table est inexistante�La base de donn�es est occup�e.�Droits d'acc�s par d�faut : +-�Adresse de destination requise�Le p�riph�rique n'est pas de type `stream'.�P�riph�rique non configur��P�riph�rique ou ressource occup��Diffie-Hellmann (%d bits) +-�R�pertoire : %s +-�Le r�pertoire n'est pas vide.�D�bordement du quota d'espace disque�Ne pas cloner le processus par fork() et ne pas afficher de message sur le tty courant�Ne pas afficher de message lors de la g�n�ration de la base de donn�es�Ne pas utiliser le catalogue existant, forcer la g�n�ration d'un nouveau fichier�Le domaine n'est pas d�limit�.�Trappe EMT�ENTR�E +-�Donn�es encrypt�es +-�Mauvais appariement de type des entr�es de la table�Erreur dans le sous-syst�me RPC�Erreur lors de l'acc�s au fichier de d�marrage � froid de NIS+. NIS+ est-il install�?�Erreur provenant d'une erreur syst�me inconnue: �Erreur lors d'�change par la proc�dure de callback()�Erreur: le fichier .netrc est lisible par tous les autres usagers�L'�changeur est plein.�Erreur de format pour exec()�ERREUR FATALE: le syst�me ne peut d�finir `_POSIX2_LOCALEDEF'�FICHIER contient la table d'adressage des noms symboliques vers les valeurs UCS4��chec (erreur non sp�cifi�e)�Le descripteur du fichier est dans un mauvais �tat.�Le fichier existe.�Erreur de verrou bloquant l'acc�s au fichier�Nom de fichier trop long�D�bordement de la taille permise pour un fichier�Fichier trop gros�Cha�ne Premier/Suivant bris�e�Exception en point flottant�Resynchronisation compl�te est requise pour ce r�pertoire�Fonction non implant�e�GROUPE +-�Rebut dans le param�tre ARGP_HELP_FMT: %s�G�n�rer le catalogue de messages.\vSi le FICHIER_D_ENTR�E est -, l'entr�e est lue � partir de l'entr�e standard. Si le FICHIER_DE_SORTIE +-est -, la sortie est affich�e sur la sortie standard. +-�Erreur syst�me g�n�rique�Trouver l'information locale sp�cifique�Donner un court message expliquant l'usage�Donner cette liste d'aide�Erreur gratuite�Groupe : %s +-�Groupe de s�maphores :�Entr�e de groupe pour le groupe "%s.%s": +-�Raccrocher apr�s N secondes (3600 par d�faut)�Fin de la connexion (raccroch�)�N'a pas trouv� "%d" dans la cache du groupe!�N'a pas trouv� "%d" dans la cache des mots de passe!�N'a pas trouv� "%s" dans la cache du groupe!�N'a pas trouv� "%s" dans la cache de la liste des h�tes!�N'a pas trouv� "%s" dans la cache des mots de passe!�L'h�te cible est arr�t� ou en panne.�Erreur de rep�rage du nom de l'h�te cible�E/S possible�FICHIER_D_ENTR�E FICHIER_DE_SORTIE +--o FICHIER_DE_SORTIE FICHIER_D_ENTR�E +--u FICHIER_D_ENTR�E�Trappe IOT�IVY�Identificateur �limin��Instruction ill�gale�Objet ill�gal pour ce type d'op�ration�Rep�rage ill�gal�Type de fichier ou format inappropri��Ioctl() inappropr� pour un p�riph�rique�Op�ration inappropri�e pour un processus d'arri�re-plan�Requ�te d'information�Information:�Fichiers d'entr�e:�Sp�cification des formats d'entr�e/sortie:�Erreur d'entr�e/sortie�Erreur interne de NIS�Erreur interne de ypbind�Interruption�Appel syst�me interrompu�Appel syst�me interrompu, il aurait d� �tre relanc��Objet invalide pour l'op�ration�Param�tre invalide�R�f�rence arri�re invalide�Nom de classe de caract�res invalide�Identit� du client invalide�V�rificateur du client invalide�Caract�re de fusionnement invalide�Contenu invalide de \{\}�Lien crois� de p�riph�que invalide��change invalide�Cha�ne multi-octets ou �tendue de caract�res invalide ou incompl�te�Expression r�guli�re pr�c�dente invalide�Fin d'intervalle invalide�Expression r�guli�re invalide�Code de requ�te invalide�Descripteur de requ�te invalide�V�rificateur du serveur invalide�Dalot invalide�est un r�pertoire�est un type de fichier nomm� (named)�Kerberos. +-�Processus arr�t��LIENS +-�Entr�e LOCALE du UID %d dans le r�pertoire %s n'est pas unique +-�Niveau 2 en halte�Niveau 2 non synchronis��Niveau 3 en halte�Niveau 3 r�initialis��Lien pointe sur un nom ill�gal�Le lien a �t� endommag�.�Num�ro du lien hors intervalle�Type d'objet li� : �Li�s � : %s +-�Le nom du domaine local n'est pas initialis�.��chec d'allocation de ressources locales�La machine cible n'est pas sur le r�seau.�Nom mal compos� ou nom ill�gal�Les param�tres obligatoires ou optionnels pour les options de formes longues +-le sont aussi pour les options de forme courtes.�Serveur ma�tre : +-�Serveur ma�tre occup�, vidange compl�te report�e��chec d'allocation m�moire�M�moire �puis�e�Message trop long�Attribut manquant ou mal compos��Date de modification: %s��chec de modification��chec de l'op�ration de modification�Format de sortie de modification:�Tentative de connexion par des noeuds multiples de relais�NOM�NOM +-[-a|-m]�NIS�Non concordance de la version client/serveur NIS - ne peut fournir le service�La table de la base de donn�es NIS est erron�e.��chec de l'op�ration NIS+�Les serveurs NIS+ ne sont pas accessibles.�Le service NIS+ n'est pas disponible ou install�.�PAS D'OBJET +-�NUM�RO�Nom : '%s' +-�`Daemon' de la cache du service de noms�Nom pas desservi par ce serveur�Le nom n'est pas unique sur le r�seau.�Nom ou service inconnu�Nom entr�e n'est pas unique�Objet nomm� n'est pas rep�rable�Besoin d'un authentificateur�Le r�seau a rompu la connexion lors de la r�initialisation.�Le r�seau ne fonctionne pas.�Le r�seau n'est pas accessible.�Aucune structure CSI disponible�Aucun s�maphore XENIX disponible�Aucune adresse associ�e avec le nom de l'h�te�Aucune adresse associ�e avec le nom�Aucune `anode' disponible�Aucun espace tampon disponible�Aucun processus enfant�Aucune donn�e disponible�Aucun espace disque disponible sur le serveur�Aucun verrou disponible�Pas de concordance�Aucun medium trouv��Aucun message du type d�sir��Aucun autre enregistrement dans la table de la base de donn�es�Aucune expression r�guli�re pr�c�dente�Aucun programme enregistr� sur l'h�te cible +-�Aucun chemin d'acc�s pour atteindre l'h�te cible�Aucun espace disponible sur le p�riph�rique�Aucun p�riph�rique de ce type�Aucun fichier ou r�pertoire de ce type�Cette cl� n'est pas dans la table�Cette table n'est pas dans le domaine du serveur.�Aucun processus de ce type�Espace des noms non-NIS+ rencontr���chec non r�cup�rable lors de la r�solution du nom�Aucun. +-�Pas rep�r�, aucun nom de ce type�Aucun fichier de type `XENIX named'�N'est pas un r�pertoire�Pas rep�r��N'est pas un serveur ma�tre pour ce domaine�N'est pas le propri�taire�Nombre de colonnes : %d +-�Nombre d'objets : %u +-�Le param�tre num�rique est hors du domaine.�Le r�sultat num�rique est en dehors de l'intervalle.�Objet #%d: +-�Nom de l'objet: %s +-�Type d'objet :�L'objet est t�l�-accessible.�Objet ayant le m�me nom existe�Nombre impair de caract�res apostrophe�Seul ROOT est autoris� � utiliser cette option!�Op�ration d�j� en cours�Op�ration non permise�Op�ration non support�e�Op�ration maintenant en cours�L'op�ration pourrait se bloquer.�Aucune autre ressource de type streams disponible�Contr�le de sortie:�S�lection de sortie:�Propri�taire : %s +-�PRIV� +-�Le package n'est pas install�.�Erreur d'analyse syntaxique: %s�Succ�s partiel�L'objet fourni n'est pas le m�me sur le serveur�Permission non accord�e�Panne d'alimentation�Fin pr�matur�e de l'expression r�guli�re�Afficher le contenu du fichier de base de donn�es, une entr�e par ligne�Afficher les statistiques de la configuration courante�Afficher d'autres messages�Afficher la version du programme�Succ�s probable�Probablement pas rep�r��Expiration de la minuterie durant l'�tablissement du profile�Pilote du protocole n'est pas attach��Erreur de protocole�Famille de protocoles non support�e�Protocole non disponible�Protocole non support��Mauvais type pour un socket de protocole�Requ�te ill�gale pour la table `named'�Quitter�Erreur sp�cifique � `RFS'�Mauvaise proc�dure RPC du programme��chec RPC durant l'op�ration NIS�Programme RPC non disponible�Version de programme RPC erron�e�La d�claration struct RPC est erron�e�Mauvaise version RPC�RPC: (code d'erreur inconnu)�RPC: erreur d'authentification�RPC: ne peut d�coder le r�sultat�RPC: ne peut encoder les param�tres�RPC: �chec (erreur non sp�cifi�e)�RPC: versions incompatibles de RPC�RPC: �chec de conversion de ports�RPC: la proc�dure n'est pas disponible�RPC: le programme n'est pas enregistr��RPC: le programme n'est pas disponible�RPC: non concordance de programme ou de version�RPC: erreur syst�me sur l'h�te cible�RPC: le serveur ne peut d�coder les param�tres�RPC: succ�s�RPC: expiration du d�lai de la minuterie�RPC: incapable d'effectuer la r�ception�RPC: incapable d'effectuer la transmission�RPC: h�te inconnu�RPC: protocole inconnu�RSA (%d bits) +-�Le `RTLD_NEXT' utilis� dans le code n'est pas charg� dynamiquement.�Lire et afficher les donn�es partag�es d'objet de profilage�Lire les donn�es de configuration du NOM�Syst�me de fichiers accessible en lecture seulement�Signal de Temps-R�el %d�Expression r�guli�re trop grosse�Erreur d'entr�e/sortie sur l'h�te cible�L'adresse de l'h�te cible a �t� modifi�e.�Retirer le mot de passe ou rendre les fichiers illisibles pour les autres usagers��chec de r�ouverture de l'objet partag� `%s'�Duplication : +-�Rapporter toutes anomalies � %s. +-�Rapporter toutes anomalies via le script `glibcbug' � l'adresse: +-<bugs@gnu.org>. +-�Le param�tre de la requ�te est invalide.�Code d'erreur 0 du `resolver' (pas d'erreur)�Erreur interne du `resolver'�Blocage �vit� des acc�s aux ressources�Ressource perdue�Ressource temporairement non disponible�R�sultats transmis � la proc�dure callback()�SHOBJ [PROFDATA]�SUNYP�Chemin de recherche : %s +-�Erreur de segmentation�Serveur occup�, essayer plus tard�M�moire du serveur �puis�e�Le serveur a rejet� l'identit�.�Le server a rejet� la v�rification.�Servname() n'est pas support�e pour ai_socktype�Initialiser le nom du programme�Arr�ter le serveur�Signal 0�Op�ration de type socket sur un type non socket�Type de socket non support��Le logiciel a provoqu� l'abandon de la connexion.�D�sol�. Vous n'�tes pas ROOT +-�Les d�finitions des sources ont �t� rep�r�es dans le FICHIER.�Erreur srmount()�Erreur sur la pile�Panne d'acc�s au fichier NFS�D�marrage du NOMBRE de `threads'�Statut : %s +-�Arr�t��Signal d'arr�t�Arr�t� (via l'entr�e sur tty)�Arr�t� (via la sortie sur tty)�Erreur de relais de type streams�La structure a besoin d'un nettoyage.�Succ�s�Supprimer les messages d'avertissement et d'information�Les noms symboliques des caract�res d�finis dans le FICHIER�Erreur syst�me�Information syst�me:��chec d'allocation de ressources syst�me�R�pertoire syst�me de la table des caract�res : %s +- de la table des r�pertoires: %s +- du chemin des localisations: %s +-%s�TABLE +-�Type de table : %s +-��chec temporaire dans la r�solution du nom�Compl�t��Fichier texte occup��La liste suivante contient tous les jeux des codes de caract�res connus. Ceci +-ne signifie pas n�cessairement que toutes les combinaisons de ces noms peuvent +-�tre utilis�es dans les param�tres FROM et TO des commandes. Un jeu de codes de +-caract�res peut �tre affich� avec diff�rents noms (aliases). +-Quelques uns des noms ne contiennent pas de cha�nes ordinaires mais plut�t +-des expressions r�guli�res qui concordent avec une vari�t� de noms qui +-peuvent �tre pass�s en param�tres au programme. +- +- �Dur�e de vie restante : �Expiration de la minuterie�Trop d'attributs�Trop de niveaux de liens symboliques�Trop de liens�Trop de fichiers ouverts�Trop de fichiers ouverts dans le syst�me�Trop de processus�Trop de r�f�rences: ne peut segmenter�Trop d'usagers�Trappe pour point d'arr�t et de trace�Barre oblique inverse en suffixe�Panne du traducteur�Noeud final de transport d�j� connect��Noeud final de transport n'est pas connect��Pour en savoir davantage, faites: `%s --help ou `%s --usage'. +-�On tente %s... +-�Type : %s +-�INCONNU�Incapable d'authentifier le client NIS+�Incapable d'authentifier le serveur NIS+�Incapable de cr�er un callback()�Incapable de cr�er un processus sur le serveur�Inconnu (type = %d, bits = %d) +-�Mot cl� inconnu %s dans .netrc�Code d'erreur NIS inconnu�Base de donn�es inconnue: `%s' +-�Erreur inconnue�Erreur inconnue �H�te inconnu�Objet inconnu�Option inconnue: %s %s %s�Erreur inconnue du `resolver'�Erreur du serveur inconnu�Signal inconnu %d�Erreur syst�me inconnue�Erreur inconnue de ypbind��chec du pairage de ( ou de \(��chec du pairage de ) ou de \)��chec du pairage de [ ou de [^��chec du pairage de \{�Variable non reconnue `%s'�Condition d'E/S urgente�Usage:�Usage: %s nom_de_variable [chemin_d_acc�s] +-�Usage: rpcinfo [ -n no_port ] -u h�te no_prog [ no_version ] +-�Signal #1 d�fini par l'usager�Signal #2 d�fini par l'usager�Valeur trop grande pour le type d�fini de donn�es�Expiration de la minuterie virtuelle�R�sultat anarchique r�sultant de l'ex�cution de la commande�La fen�tre a chang�e.��criture des noms disponibles des tables de caract�res��criture des noms disponibles des localisations��criture des noms s�lectionn�s des cat�gories��criture des noms s�lectionn�s des mots cl�s��criture sur la sortie dans le FICHIER��crits par %s. +-�Mauvais type de medium�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Oui, 42 est la cl� du sens de la vie.�Vous avez vraiment tout g�cher cette fois-ci.�Temps final de la ligne de continuation du fuseau horaire est ant�rieur +-au temps final de la ligne pr�c�dente.�[FICHIER...]�`%1$s' la d�finition ne se termine pas par `END %1$s'�`%s' est un fichier de profilage incorrect pour `%s'�`-1' doit �tre la derni�re entr�e du champ `%s' de cat�gorie `%s'�`...' doit �tre utilis� seulement avec les entr�es `...' et `UNDEFINED'�`from' attendu apr�s le premier param�tre de `collating-element'�La cha�ne `FROM' d�clarant un �l�ment de fusionnement contient un caract�re inconnu.�ai_family non support�e�ai_socktype non support��d�j� en ex�cution�Le param�tre de <%s> doit �tre un caract�re simple.�Le param�tre de `%s' doit �tre un caract�re simple.�auth_none.c - probl�me fatal de mise en ordre�authunix_create: m�moire �puis�e +-�Mauvais param�tre�Mauvais propri�taire�Champ `FROM' vide dans la ligne de type `Link'�Champ `TO' vide dans la ligne de type `Link'�Bloc lib�r� deux fois +-�Statut de `mcheck_status' erron�, la librarie est erron�e. +-�Diffusion: ioctl (a obtenu la configuration de l'interface)�Diffusion: ioctl (a obtenu la valeur des s�maphores de l'interface)�D�bordement du tampon�cache_set: ne peut allouer une nouveau tampon rpc_buffer�cache_set: �chec d'allocation de `victim'�cache_set: `victim' non rep�r��Ne peut d�terminer l'abr�viation du fuseau horaire � utiliser +-juste apr�s telle date�Ne peut r�assigner le num�ro de proc�dure %d +-�Ne peut �valuer par `stat' le fichier de localisation `%s'�Ne peut allouer les donn�es des symboles�Ne peut cr�er un descripteur interne�Ne peut cr�er les descripteurs internes�Ne peut activer le socket pour accepter des connexions: %s�Ne peut trouver le pr�processeur C: %s +-�Ne peut trouver un pr�processeur C (cpp) +-�Ne peut traiter une requ�te d'une vieille version %d; la version courante est %d�Ne peut ins�rer l'�l�ment de fusionnement `%.*s'�Ne peut effectuer une insertion dans la table des r�sultats�Ne peut ins�rer une nouvelle d�finition de symbole de fusionnement: %s�Ne peut charger le fichier de donn�es de profilage�Ne peut ouvrir�Ne peut ouvrir `%s'�Ne peut ouvrir le fichier de base de donn�es `%s': %s�Ne peut ouvrir le fichier d'entr�e `%s'�Ne peut ouvrir le fichier des localisations `%s'�Ne peut ouvrir le fichier de sortie�Ne peut ouvrir le fichier de sortie `%s'�Ne peut ouvrir le fichier de sortie `%s' de cat�gorie `%s'�Ne peut ouvrir le socket: `%s'�Ne peut traiter la sp�cification d'ordonnancement�Ne peut lire via le r�pertoire de la table des caract�res `%s'�Ne peut lire le fichier de configuration; cela est fatal�Ne peut lire du client�Ne peut lire l'en-t�te de `%s'�Ne peut lire via le r�pertoire des d�finitions localis�es `%s'�Ne peut lire le fichier des localisations `%s'�Ne peut lire la table des r�pertoires `%s'�Ne peut lire les donn�es de statistiques�Ne peut �valuer par stat() le fichier `%s': %s�Ne peut �crire dans les fichiers de sortie vers `%s'�Ne peut �crire les r�sultats: `%s'�Ne peut �crire les statistiques: `%s'�Ne peut �crire vers le client�Cat�gorie de donn�es requises plus d'une fois: n'aurait pas d� se produire�Caract�re %s'%s' de la classe `%s' doit �tre dans la classe `%s'�Caract�re %s'%s' de la classe `%s' ne doit pas �tre dans la classe `%s'�Caract�re <SP> non d�fini dans la table des caract�res�Caract�re `%s' non d�fini alors qu'attendu comme valeur par d�faut�Classe de caract�res `%s' d�j� d�finie�Table de caract�res `%s' d�j� d�finie�Fichier de la table des caract�res `%s' non rep�rable�clnt_raw.c - Erreur fatale de s�rialisation d'en-t�te�clnttcp_create: m�moire �puis�e +-�clntudp_create: m�moire �puis�e +-�clntunix_create: m�moire �puis�e +-��l�ment de fusionnement `%.*s' appara�t plus d'une fois: ligne ignor�e�Symbole de fusionnement `%.*s' appara�t plus d'une fois: ligne ignor�e�Symbole de fusionnement attendu apr�s `%s'�Connexion �tablie � l'adresse %s: �Constante ou identificateur attendu�La conversion de `%s' vers `%s' n'est pas support�e.�Conversion arr�t�e en raison d'un probl�me d'�criture � la sortie�Ne peut cr�er un serveur RPC +-�Ne peut enregistrer le programme %d de version %d +-�base de donn�es [cl� ...]�Fichier de la table des caract�res `%s' non rep�r��L'indicateur de direction dans la cha�ne %d du champ `era' de +-cat�gorie `%s' n'est pas un `+' ni un `-'.�L'indicateur de direction dans la cha�ne %d du champ `era' de +-cat�gorie `%s' n'est pas un caract�res simple.�Duplicit� du nom de caract�re `%s'�Duplicit� de la d�finition d'�l�ment de fusionnement�Duplicit� de la d�finition du caract�re `%.*s'�Duplicit� de cl��Duplicit� de jeux de d�finitions�Duplicit� du nom de zone %s (fichier "%s", ligne %d)�Duplicit� de l'identificateur de message�Duplicit� du num�ro de message�Cha�ne vide de caract�res�Nom du poids vide: ligne ignor�e�enablecache: cache d�j� activ�e�enablecache: ne peut allouer une cache�enablecache: ne peut allouer une cache de donn�es�enablecache: ne peut allouer une cache de type fifo�encodage de la sortie�encodage du texte original�Noeud final de l'intervalle d'ellipse plus grand que l'initial�Erreur lors de la fermeture du fichier d'entr�e `%s'�Erreur lors de la fermeture du fichier de sortie�Erreur lors de la fermeture du fichier de donn�es de profilage�Erreur durant l'insertion d'un �l�ment de fusionnement dans la table de hachage�Erreur lors de l'insertion dans la table de hachage�Erreur lors de la lecture de l'entr�e�Cha�ne attendue pour le param�tre de `copy'�Ligne de continuation attendue, non rep�r�e��chec de chargement de l'objet partag� `%s'��chec du chargement de donn�es de symbole��chec de la proc�dure mmap sur le fichier de donn�es de profilage��chec de d�marrage du processus de conversion��chec lors de l'�criture des donn�es de cat�gorie `%s'�fcntl: F_SETFD�Champ `%s' de cat�gorie `%s' n'est pas d�fini�Champ `%s' de cat�gorie `%s' ind�fini�Le fichier '%s' existe d�j� et peut �tre �cras�. +-�La valeur de d�part de `collating-element' doit �tre une cha�ne.��chec d'�valuation fstat()�Rebut � la fin du caract�re du code de sp�cification�Rebut � la fin des chiffres�Rebut � la fin de la valeur du saut d'adresse dans la cha�ne %d +-du champ `era' de cat�gorie `%s'�Rebut � la fin de la date finale dans la cha�ne %d du champ `era' +-de cat�gorie `%s'�Rebut � la fin de la date finale dans la cha�ne %d du champ `era' +-de cat�gorie `%s'�g�n�rer un appel de graphe�G�n�rer un ficher de profilage plat avec les d�comptes et les marques de temps�get_myaddress: ioctl (a obtenu la configuration de l'interface)�getent() - obtenir les entr�es de la base de donn�es administratives�handle_request: requ�te re�ue (Version = %d)��chec de cr�ation du lien direct, cr�ation d'un lien symbolique�lien direct rencontr��CORRECTION ill�gale du champ dans la ligne de type `Leap'�Champ `Rolling/Stationary' ill�gal sur la ligne de type `Leap'�Caract�re ill�gal de constante dans la cha�ne�Caract�re ill�gal dans le fichier��l�ment de fusionnement ill�gal�D�finition ill�gale�Encodage fourni ill�gal�S�quence d'�chappement ill�gale � la fin de la cha�ne�S�quence d'�chappement ill�gale � la position %ld�Nom ill�gal pour un intervalle de caract�res�`nettype' ill�gal :'%s' +-�Nombre ill�gal pour la valeur de saut dans la cha�ne %d du champ `era' +-de cat�gorie `%s'.�Num�ro de jeu ill�gal�Date finale ill�gale dans la cha�ne %d du champ `era' +-de cat�gorie `%s'�Date finale ill�gale dans la cha�ne %d du champ `era' +-de cat�gorie `%s'�Limite d'implantation: pas plus de %d classes de caract�res sont permises�Limite d'implantation: pas plus de %d tables de caract�res sont permises�Caract�re ou s�quence de changement incomplet � la fin du tampon�Fichier incorrectement format��Ligne d'entr�e de type inconnu�Erreur interne (descripteur ill�gal)�Erreur interne - addtype() appell� avec un mauvais bloc de type `isdst'�Erreur interne - addtype() appell� avec un mauvais bloc de type `ttisgmt'�Erreur interne - addtype() appell� avec un mauvais bloc de type `ttisstd'�Erreur interne dans %s, ligne %u�Adressage relatif GMT invalide�Format d'abr�viation invalide�Jour du mois invalide�Ann�e finale invalide�Ann�e bissextile invalide�mode invalide pour dlopen()�Nom de mois invalide�Temps sauvegard� invalide�Ann�e initiale invalide�Heure du jour invalide�Nom du jour de semaine invalide�La longueur de la cl� dans la requ�te est trop longue: %Zd�La ligne apr�s l'ellipse doit contenir la d�finition d'un caract�re.�La ligne avant l'ellipse ne doit pas contenir la d�finition d'une constante de caract�res.�Ligne trop longue�Liste tous les jeux de code de caract�res�Fichier localis� `%s', utilis� dans la d�claration de `copy', non rep�r���chec d'�valuation lstat()�Ligne incorrecte ignor�e��chec d'adressage de la cha�ne de la section d'en-t�te��chec d'adressage de la section d'en-t�te�M�moire �cras�e avant le bloc allou� +-�M�moire �cras�e apr�s la fin du bloc allou� +-�M�moire �puis�e�M�moire �puis�e +-�La m�moire est consistente, la librairie est fautive. +-�Format de type era manquant dans la cha�ne %d du champ `era' +-de cat�gorie `%s'�Nom manquant dans la cha�ne %d du champ `era' de cat�gorie `%s'�R�gle sans nom�Ni l'encodage d'origine et cible n'ont �t� sp�cifi��netname2user(): (consultation NIS+): %s +-�netname2user(): entr�e DES de %s dans le r�pertoire %s n'est pas unique�netname2user(): entr�e LOCAL de %s dans le r�pertoire %s n'est pas unique�netname2user(): identificateur de liste de groupes manquant dans '%s'�netname2user: nom principal '%s' est trop long�netname2user: ne devrait pas avoir le UID 0�Le programme %d n'a jamais �t� enregistr�. +-�Aucune valeur <Uxxxx> ou <Uxxxxxxxx> fournie�Expression r�guli�re incorrecte du champ `%s' de cat�gorie `%s': %s�Pas de jour dans les r�gles de concordance�Pas de d�finition de type `UNDEFINED'�Aucun fichier de donn�es de profilage fourni et l'objet partag� `%s' n'a pas le nom donn��Aucun autre mot cl� ne doit �tre sp�cifi� lorsque `copy' est utilis��Aucun fichier de sortie g�n�r� en raison d'un avertissement d�j� �mis�Aucune table de r�pertoire sp�cifi�e: ne peut proc�der�Aucun nom symbolique fourni�Pas de nom symbolique fourni pour la fin de l'intervalle�Pas de poids d�fini pour le symbole `%s'�N'est pas un fichier r�gulier�Configuration nscd: +- +-%15d niveau serveur de d�boggage +-�nscd n'est pas en ex�cution! +-�Seules les d�finitions de type `WIDTH' sont permises suite +-� une d�finition de type `CHARMAP'.�Encodage d'origine non sp�cifi� utilisation de `-f'�fichier de sortie�probl�me RPC avec pmap_getmaps()�poll: �chec du protocole dans la configuration du circuit +-�Erreur du pr�processeur�Afficher le d�compte des chemins et le nombre de leur utilisation�Afficher des informations de progression�Probl�me lors de la lecture de `%s'�Le fichier de donn�es de profilage `%s' ne concorde pas avec l'objet partag� `%s'.�Le programme %lu n'est pas disponible. +-�Le programme %lu de version %lu n'est pas disponible. +-�Le programme %lu de version %lu est pr�t et en attente. +-�rcmd: poll (configuration de stderr): %m +-�rcmd: socket: tous les ports sont occup�s +-�rcmd: �criture (configuration de stderr): %m +-�registerrpc: m�moire �puis�e +-�R�p�tition du d�lai une seconde fois�Fichier de la table des caract�res `%s' non rep�rable�rpcgen: erreur dans la liste de param�tres de codage +-�rpcgen: trop de d�finitions +-�rpcinfo: %s est un h�te inconnu +-�rpcinfo: %s est un service inconnu +-�rpcinfo: ne peut �liminer l'enregistrement du programme %s de version %s +-�rpcinfo: �chec de diffusion: %s +-�rpcinfo: ne peut contacter l'aiguilleur de ports�M�me nom de r�gle dans plusieurs fichiers�Lecture �court�e lors de la lecture de la cl� de requ�te: %s�Lecture �court�e lors de la lecture de la requ�te: `%s'��criture �court�e dans %s: %s�socket: �chec de protocole dans la configuration du circuit. +-�Les options de tri `forward' et `backward' sont mutuellement exclusives.�La sp�cification de tri par le poids des symboles de +-fusionnement n'a aucun sens.�entr�e standard�sortie standard�Date initiale ill�gale dans la cha�ne %d du champ `era' +-de cat�gorie `%s'.�Ann�e initiale plus grande que l'ann�e finale�Ann�e de d�part trop grande pour �tre repr�sent�e�Ann�e de d�part trop petite pour �tre repr�sent�e�Date finale ill�gale dans la cha�ne %d du champ `era'\n" +-de cat�gorie `%s'�svc_run: - �chec de s�lection�svc_tcp.c - ne peut rep�rer le nom du socket par getsockname() ou listen()�svc_tcp.c - probl�me de cr�ation d'un socket TCP�svc_tcp: makefd_xprt: m�moire �puis�e +-�svc_unix.c - probl�me de cr�ation d'un socket `AF_UNIX'�svc_unix.c - ne peut rep�rer le nom du socket par getsockname() ou listen()�svc_unix: makefd_xprt: m�moire �puis�e +-�svctcp_create: m�moire �puis�e +-�svcudp_create - ne peut rep�rer le nom du socket par getsockname()�svctcp_create: m�moire �puis�e +-�svcudp_create: probl�me de cr�ation du socket�svcunix_create: m�moire �puis�e +-�Le symbole d'un �l�ment de fusionnement multi-caract�res `%.*s' +-provoque la duplication de la d�finition d'un �l�ment.�Le symbole d'un �l�ment de fusionnement multi-caract�res `%.*s' +-provoque la duplication d'autres d�finitions d'�l�ments.�Le symbole d'un �l�ment de fusionnement multi-caract�res `%.*s' +-provoque la duplication d'autres d�finitions de symboles.�Le symbole d'un �l�ment de fusionnement multi-caract�res `%.*s' +-provoque la duplication de la d�finition d'un symbole.�Le symbole d'un �l�ment de fusionnement multi-caract�res `%.*s' +-provoque la duplication d'un nom symbolique dans le jeu de caract�res.�Erreur de syntaxe dans la d�finition de %s: %s�Erreur de syntaxe dans la directive `order_start'�Erreur de syntaxe dans la d�finition de la classe de caract�res�Erreur de syntaxe dans la d�finition du caract�re de conversion�Erreur de syntaxe dans l'ordre de la d�finition du fusionnement�Erreur de syntaxe dans la d�finition du fusionnement�Erreur de syntaxe dans la d�finition d'une cat�gorie de type `LC_CTYPE'�Erreur de syntaxe dans la d�finition d'une nouvelle classe de caract�res�Erreur de syntaxe dans la d�finition d'une nouvelle table de caract�res�Erreur de syntaxe dans la d�finition localis�e du message�Erreur de syntaxe dans la d�finition localis�e des valeurs mon�taires�Erreur de syntaxe dans la d�finition localis�e de repr�sentation num�rique�Erreur de syntaxe dans la sp�ficication de l'ordonnancement�Erreur de syntaxe du prologue: %s�Erreur de syntaxe dans le r�pertoire de la table des d�finitions: %s�Erreur de syntaxe dans la d�finition localis�e de la repr�sentation du temps�Erreur de syntaxe: pas � l'int�rieur d'une section de d�finition localis�e�encodage cible non sp�cifi�e par l'option `-t'�Ceci est la premi�re d�finition.�Temps d�fini avant le z�ro�D�bordement du temps allou��Trop peu d'octets pour l'encodage des caract�res�Trop d'octets pour l'encodage des caract�res�Trop de d�finitions de classes de caract�res�Trop de d�lai en secondes�Trop de types localis�s pour la repr�sentation du temps�Trop de transitions d�finies?!�Trop de poids d�finis�Trop ou de trop longues abr�viations de fuseaux horaires�Suffixe en rebut � la fin de la ligne�Probl�me � r�pondre au programme %d. +-�Deux lignes cons�cutives contenant `...' ne sont pas permises.�Une seule ann�e fournie�incapable d'allouer un tampon pour l'entr�e�incapable de lib�rer des param�tres�ind�fini�Caract�re inconnu `%s'�Caract�re inconnu dans le champ `%s' de cat�gorie `%s'�Directive de fusionnement inconnue�Directive inconnue `%s': ligne ignor�e�erreur inconnue de iconv() %d�Jeu inconnu `%s'�Symbole inconnu `%.*s': ligne ignor�e�Zone sans r�gle�Message incomplet�Cha�ne incompl�te�Cha�ne d'une constante incompl�te�Nom symbolique incomplet�Nom de poids incomplet�La limite sup�rieure de l'intervalle n'est pas plus petite +-que la limite inf�rieure.�usage: %s fichier_d_entr�e +-�Utiliser 2/29 pour les ann�es non-bissextiles.�La valeur de %s doit �tre un entier.�La valeur de <%s> doit �tre comprise entre 1 et 4.�La valeur du champ `%s' de cat�gorie `%s' ne doit pas �tre un cha�ne vide.�La valeur de <mb_cur_max> doit �tre plus grande que la valeur de +-<mb_cur_min>.�La valeur du champ `int_curr_symbol' de cat�gorie `LC_MONETARY' ne doit pas correspondre � un nom valide de la norme ISO 4217.�La valeur du champ `int_curr_symbol' de cat�gorie `LC_MONETARY' n'a pas la bonne longueur.�Les valeurs du champ `%s' de cat�gorie `%s' doivent �tre plus petite que 127.�lors de l'acceptation de connexion: %s�lors de l'allocation d'entr�e dans la cache�lors de l'allocation d'entr�es dans la table de hachage�lors de l'allocation d'une copie de cl��lors de l'ouverture du vieux fichier du catalogue�lors de la pr�paration de la sortie�lors de la lecture de la base de donn�es�lors de l'�valuation par `stat' du fichier de donn�es de profilage�lors de l'�criture du fichier de base de donn�es��criture incompl�te�accessible en �criture par d'autres que le propri�taire�Mauvais nombre de param�tres�Mauvais nombre de champs sur la ligne de type `Leap'�Mauvais nombre de champs sur la ligne de type `Link'�Mauvais nombre de champs sur la ligne de type `Rule'�Mauvais nombre de champs sur la ligne de type continuation de `Zone'�Mauvais nombre de champs sur la ligne de type `Zone'�xdr_reference: m�moire �puis�e +-�xdrrec_create: m�moire �puis�e +-�yp_update: ne peut convertir le nom de l'h�te � un nom r�seau (netname) +-�yp_update: ne peut obtenir l'adresse du serveur +-� +\ No newline at end of file +diff -Naur ../glibc-2.1.3/po/gl.mo glibc-2.1.3/po/gl.mo +--- ../glibc-2.1.3/po/gl.mo 2000-02-24 18:13:10.000000000 -0800 ++++ glibc-2.1.3/po/gl.mo 1969-12-31 16:00:00.000000000 -0800 +@@ -1,453 +0,0 @@ +-���������������'���=������XR�����YR�����lR��M���R��E����R��&���S��(���:S�����cS�����tS������S������S������S������S������S������S��n�� +-T�����yU������U��"����U��"����U������U��:����U�����:V�����CV�����LV�����bV�����yV������V������V������V������V������V�����W�����.W�����HW�����eW�����}W������W������W������W������W������W��3����W��3���X��4���KX��.����X��%����X������X��&����X��%���Y�����6Y��%���MY��3���sY��,����Y��)����Y������Y��"���Z��!���:Z�����\Z�����sZ������Z������Z������Z������Z������Z��*����Z�����*[��&���D[��&���k[��&����[��&����[��&����[�����\�� ���\��$���@\�����e\������\������\��,����\������\��%����\��,���%]��-���R]�� ����]��&����]������]������]�����^����� ^�����;^�����[^������{^��2���_�����8_��"���X_��4���{_������_��#����_�� ����_��=����_�����.`��<���?`�����|`��'����`������`��)����`��(����`�� ��� a�����Aa�����Ca�����Ka��$���\a������a��)����a��(����a��/����a�����b�����+b�����7b�����Lb�����^b�����ub��#����b��=����b��/����b�����c�����0c�� ���Ec�����Sc�����_c�����wc������c������c������c������c������c������c������c�����d�����%d�����2d�����Hd�����_d�� ���kd�����ud�����yd�� ����d��&����d��&����d��-����d��!���e�����=e�����[e�����ye������e��&����e��%����e��0����e��!���.f�����Pf��!���hf��-����f������f��%����f��)����f��'���%g��%���Mg��&���sg������g������g������g������g������g�����h�����+h�����Hh��@���ah��D����h������h������h�����i�� ���(i��=���2i�����pi�������i�����Rj��7���qj��2����j��-����j����� +-k�����k��$���/k�� +-���Tk�����_k�����ek��!���ik������k��#����k������k������k������k�����l�����l�����,l�����Dl�����_l�����sl������l������l��3����l��-����l��2���m�����Dm�����Um�����^m�����em�����um������m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ���n�� ���n�� ���n�� ���#n�� ���-n�� ���7n�� ���An�� ���Kn�� ���Un�� ���_n�� ���in�����sn�����|n������n������n������n������n������n������n������n��<����n�����o��$���/o��)���To�� ���~o������o��1����o������o��8����o�����p�����)p�����Fp�����Rp�����hp������p������p������p������p������p������p��"���q�����'q�����@q�����Gq������dq������q�� ���r�����)r�����Dr�����Xr�����ir�� ���}r������r��$����r������r��"����r��%����r��"��� s��"���Cs��%���fs������s������s�� ����s������s��>����s�����t�����t�����t�����(t�����>t��!���Rt�����tt��!����t������t��.����t������t�����u�����u��"���u�����Bu�����Uu�����hu�� ���~u������u��+����u������u������u������u�����v�����+v�����Cv�����_v�����wv������v������v��1����v��$����v�����w�����(w�����Cw�����Xw�����sw������w������w������w������w������w�� +-����w������w������w��2���x�����5x�����Dx�����]x�� ���lx�����zx������x������x������x������x������x��!���y�����'y�����Ey��s���ey������y��*����y�����z�����/z�����@z�����Tz�����ez������z������z������z������z������z������z������z������z��9���{�����<{�����T{�����j{��,����{�� +-����{������{������{������{������{����� |�����$|�����>|�����V|�����u|��+����|��#����|������|������|������|�����}��#���8}�����\}�����|}������}������}������}������}������}������}������}�����~�����#~�����C~�����b~�����|~������~������~������~������~������~���������������:�����J��*���i�������������������������������������� ������������ ���������'���!���?��� ���a��� ���k������y����������S������� ���������� ������>������K������_������p�����������������(����������������������������/������G���-���_����������������� ����������ނ������������������������1������E������N������d������t���.�������������� ���Ń��#���Ӄ��0�������%���(������N������b������x���������������������������ф�������������������������,������K������i������n���������������������������օ������������������������.������H������a������}���!�����������������؆�����������������(������F���"���_����������������������������������ɇ�����ۇ��������-�������-���.���!���\������~��������������������È�����Ԉ��2������#���������B������O���;���c��������������������͉�������������� ������ ���)������J������[������y����������������������������������Ԋ��������������&���������D������Y������n������w���������� ����������ы��$������ ���������������)������?������T������l������t����������������������������������ڌ��*������(��� ������6������C���"���W�������z���������������� ������������$���/��� +-���T������_������n��������� ���*������8���!���L������n������}�����������������"��������������������� +-���������'���-���#���U���6���y��� ������� +-����������ɑ��"���ё��"�������������"���1������T������t����������������� ����������ɒ�����ؒ������������������ ������$������9������K������`������u����������������������������������ӓ��������#������:������ ���N������o����������%��������������"���ה���������!��� ��� ���+���"���L��� ���o���������������������������̕�����ѕ�����֕��������������F���)��� ���p���4���z���.�������-���ޖ��6������8���C���;���|���I����������������������4���+���D���+���p���'����������Ę�������� ����������������������5���&���H���.���o���&����������ř��,���ՙ�����������!���C���=���#�����������������Ě��!�������"������.���%��� ���T���%���u���;�������&���כ���������1���������P������k������w���"��������������'���ǜ��������������.���$������S���"���j���(�������-��������������������!���������;������X������x����������!����������Ҟ��������������9������2���W���6�������+�������?������C���-���8���q���$�������"���Ϡ��!������.���������C������b����������<�������;���ޡ��$���������?������W���*���w���7����������ڢ��"�������������)���/���N���Y���U��������������&������)���C��� ���m������{���+�����������������ޤ������������ +-���"���*���%���M���*���s���*����������ɥ�����ݥ��0����������(������E������d���+�������7�������#������������!���*���$���L���!���q����������&�������%���է��,����������(���%���7���0���]���2��������������.���Ψ���������K������L���b���L��������������+������2���<���2���o���/�������$���Ҫ���������%��� ���-���3���$���a���������������������������ϫ��(������&������!���6������X���F���o����������B���ɬ��B������?���O���<�������7���̭��������������#���:���.���^���0�������0���������������� ������ ������<������Q������e������z���������������������������Я��������#�������5������G���S��� �������#�������5���Ͱ��������������-���'���!���U���(���w���-����������α��'���߱��?������=���G��� �������.������� ���²��9������;������,���Y���*�������#����������ճ��%������A���������W������t���I�������7���۴��3������+���G������s���'�������!����������Ե��.������������C���'���*���k�����������������(�������������1����������)������D���:���`����������)�������*������#���������2���$���R������w����������"����������Ҹ����������� +-������'���>���G����������!������� ���ǹ��(������$���������6���*���L���=���w���H����������������� ���E������&���c���(�������'�������E���ۻ�����!���(���:���'���c���$�������,�������)���ݼ��%���������-���"���K������n���&��������������P���ҽ��U���#���O���y���V���ɾ��!��� ���'���B���*���j���/�������*���ſ��$������/������1���E���/���w���)�������*�������)�������#���&������J���-���e���&�������4�������(����������������5��� ���F���#���T���$���x���"����������������������������������.���������G������g���3��������������#�������������� ������������0���(������Y���$���u�����������������#������������������������ ������������:������U���4���n������������������������'�������B������D���]���j�������K��� ���?���Y��� ���������������������!����������������������:������Q���"���h�������������������������������#�������#������#���8���0���\���#���������������������*�������%������:��>������y����������Q�������D�������&���@���(���g������������������������������������������������������2������F������������� ���"������"���B������e���?�������������������������������������� ������*������C������`���#��������������#��������������#���������,������E������c������j������������������������8�������8�������L������1���j���)��������������2�������$���������7���1���Q���3�������6�������,�������������*���9���&���d�����������������)����������������� ������!������7���C���P����������#�������#�������#�������#������#���>������b���4���}���-���������������������������*���5������`���(���}���*�������+��������������)���������G���"���g��������������������������������������.��������������.�������1���������4���*���K��� ���v���I��������������N������� ���0���)���Q��� +-���{���.�������,�������&���������� ���������������1���*������\���:���u���1�������=������� ��� ������.��� ���;���#���\���#�������#�������(�������9�������4���+������`������y�����������������$�������!��������������/���������I������\���!���z�����������������$��������������$������$���1������V������h������}�����������������:�������<�������9���)���+���c���"������� ��������������%�������5������<���L���;�������.������� �������2������A���H���+�������3�������3�������7������0���V���9�������!��������������������)���������@������W���$���w����������P�������T��� ������^���&���q�����������������8���������������������.�������J��� ���8���X���A���������������������1��� ������;������G������M���'���Q������y���+�������!�������!����������������������7������S������r�������������������������������8�������4������?���T���������� ���������������������!�����������������������������������������&������/������8������A������J������S������\������e������n������w�������������������������������������������������������������������������������������������������������������������������K������%���k���-�������1��������������������.���$������S���<���\����������$��������������$�������,������ ���C���%���d���#����������������������������6����������7������P������W�������q������ ���)���&���'���P������x�������������������������������)�������������$������*���@���$���k���(�������*��������������"���������� ������,���V���8��� ��������������������� ��������������*�������������'���4���$���\���;����������������������������+����������$������:������N������e������r���8��������������"�������&������ ���*���!���K���!���m����������.��������������#�������4������'���I������q�����������������!�������"����������������������<������L������b��� +-���������������������;�������������������������������������!������3������R������q���������� �������!�����������������������������������7�����������������������������5���&���M������t����������"�����������������������������������������P������%���`����������&�������0����������������������� ���#������"���>������a������|����������$��������������+�������(��� ������I������]���&���w���#�������0�������$�������������$���)������N������e���(������������� ��������������%�������0�����)���@��(���j��'������������$������������#����"���:����]�'���w������&�����,���������'�������8����T����h��������������������������)��������� ���.����<����U�Y���m�"����� ����������������1����D�"���W����z������%�����������������������4���3����h������#���������������������������&����8����A����W� ���k�2���y�����������$�����H�����0���<����m� ��������������������'���������#���(����L����e�*���}�$���������������$�������� ����0 �"���L ����o ����� �!���� ����� �)���� �(��� +-�"���9 +-�"���\ +-���� +-� ���� +-����� +-����� +-�(���� +-�����3���8� +-���l����w��������������������������3�����9���4�%���n�"����������"������������� �?��� �,���^ ����� ����� �?���� �"���� ��������-����M� ���h������$����������*��������������������1�!���C����e� ���z�!�����'������������������"�������@����]����|�(���������� �����#���������������������&����5����R����m�"����������+�����0������������!�%���9�����_������������������%���(� ���N����X����q��������.����=�'���R����z������'����������(���������%���#����I����g�)�����*�����A��������� +-���)����4�'���@�(���h������(�����#�����������������9����X����i����{���������������������������������.����I����]����q��������������������������8�����*���&����Q����o�2����������)���������5����+���G�.���s�*�����!��������������������������"����9����X�\���w� �����;�����-����<���H�B�����8�����D����T���F����������������+�����+��� �*���5�"���`��������������������������*��� �8���4 �6���m ����� �3���� �7���� � ���(!�H���I!�/����!�.����!�+����!�'���"�(���E"�3���n"�*����"�,����"�G����"�4���B#�+���w#�C����#�%����#���� $����$�7���6$�,���n$�:����$�%����$�*����$�@���'%����h%�-����%�9����%�9����%����*&�#���E&�,���i&�*����&�)����&�&����&�2���'�2���E'�$���x'�)����'�����'�>����'�6���&(�:���](�0����(�D����(�H���)�G���W)�$����)�#����)�/����)�7���*�!���P*�!���r*�"����*�E����*�E����*�3���C+����w+�-����+�'����+�:����+�#���$,�)���H,����r,�;����,�T����,�Z���-����x-�.����-�'����-�����-� ����-�2��� .�#���S.����w.�����.�#����.�����.�7����.�A���*/�?���l/�����/�����/�?����/�-���!0����O0�"���m0�,����0�7����0�����0����1�*���+1�4���V1�-����1�+����1�;����1�1���!2�3���S2�����2�)����2�2����2�=����2����13�4���J3����3�N����3�G����3�E���+4����q4�)����4�8����4�;����4�0���*5�;���[5�����5�$����5�,����5�'��� 6����16����O6����m6����6�)����6�+����6�(����6����7�O���27�����7�B����7�>����7�H���8�G���g8�2����8�����8�#���9� ���&9�6���G9�8���~9�8����9�����9����:�!���):����K:����a:����u:�����:�����:�����:�����:�����:���� ;�4���";�F���W;�W����;�����;�A���<�D���M<�����<�����<�;����<�*���=�+���1=�-���]=�����=�.����=�I����=�F���>����\>�C���k>�����>�>����>�@���?�J���O?�1����?�#����?�����?�*��� +-@�O���5@�$����@�&����@�W����@�7���)A�;���aA�>����A�����A�0����A�*���*B����UB�>���nB�����B�>����B�8���C����DC����VC�7���sC�����C�:����C�$����C����!D�J���7D�#����D�/����D�/����D�%���E�4���,E�&���aE�����E�)����E�6����E�4���F����=F�%���]F�%����F�>����F�$����F�,��� G�1���:G�6���lG�-����G�#����G�9����G�L���/H�O���|H�����H�����H�F����H�$���3I�8���XI�9����I�L����I�$���J�6���=J�+���tJ�'����J�0����J�7����J�(���1K� ���ZK�0���{K� ����K�*����K�!����K�Z���L�\���uL�Y����L�l���,M�$����M�*����M�4����M�9���N�+���XN�+����N�3����N�9����N�9���O�3���XO�1����O�0����O�)����O����P�7���8P�4���pP�F����P�:����P����'Q����DQ����XQ�5���oQ�.����Q�)����Q�#����Q����"R����AR����\R�<���mR�����R�"����R�4����R����S�5���)S�!���_S�����S�����S�4����S�#����S�)���T����+T����JT�)���dT�����T�����T�����T�����T�����T����U�9���U����VU�)���sU�!����U�%����U�G����U�?���-V�j���mV�[����V�D���4W����yW�����W�+����W�0����W�)����W�'���%X����MX����aX�(���xX�)����X�����X�-����X����Y�(���.Y�(���WY�(����Y�;����Y�(����Y� ���Z� ���/Z�;���PZ�4����Z������������:��c���������������� +-�����������}�������������H��8�� ���������������1����������������������C��������������������������������� ���������V�������������R���������V��z����������������������a������m��������������+��������� +-���������������� ������� ��k�����������O��F���������������������8������M��D�����N��f��4����A���r�����������������������������X����������������������q�������������v��5������Q��V���\���F���B���������������������|�������������4������������������>����������������������$��]�����$�����������������������I��J���C��h������q��������������\��u������"��M�������������������������������������h�����M���]�����������������������p��s��G��������������������N��������e��@������������������������w����������������<���_������B�����������������������������������������������v�����=���G����������������������G������)��)������� ��1��&���������@���������������������P������6������3��L������������W��<�����������������!���7��������������������������U���������.��������r����������S���������������:��������<��g�����������s�������������"�������������������������������0��A��4����������#��������������E��u�����������a���������Q���������9��~��`��X��������5�����������`��c�������2�����4�����������������&�����������������������(��9��������������>�������������������K���������{��������/��[�������������������������+������������h���������!��������l��<����������������������A��g���������� �������������������������N������������B���������X�����������������������������������������6�����*��o���������������������������������R������-���I����������������������a�����������9��:�������������������������8�������������������e�������������������������Z���i���������������(������6������������(������������������������������������������S�����>�����,��i����������������������������w������f����������@������F��������y��0������J�������������������������n���������������|������������������������m��;��X���p��x��-��5������%��w������H���:�����������������������1���#�������7�����������������W�����������������?������������������������/��a����[��������T�������F����D�������3����������k����������'��E��r��}��~����,���������*�����n������W��������9�������������'������.������C�������������0�����O��������\����2���f��^����������������b���������3�������������%��-��#��\��j�������v����������������2������e�����������u��;��y�������������������������=�����k�������n�������������������������O�������������]����t���L������D������������d�����z����������������������P�����i�����t��������)����P��������"�������� �����=�������������������������R�����f�������������������[���Z���������?�����Z��D��������T���������������������������������������������������������{������k��������������������������������������������T���������_�������������������������c��������H������������Z��K�����s�����������������������������p��������������]�������������+����������������g����������z����������`��0���o�����������������������B��|������L��%�����������^������p���*��{�������"����������x�������������������Y���������>�������������!�����y��;��U�����@�����������7�����Y��x������������.��������L���������������l�����,���Q���[������h�����������v�������b������������� �����������������Y������������������������������I�������������/�������������5��/�������������������i���K������%��;�������������������_�������������������r������#��1��������������������s����������������������U��8���e����������������m��}������ �������=������2��?��������*���������������u����������������z������������������$������J��^����������� ���c�������$���J������������������I������������t��������������������������������������������&�����m��G�����������S������������������������ +-����������������������������d���o�������������'������������V��E������t��_�������������������������� +-�����������U��������������M�����������x��~�������������������d��A��.������ ����������y�����������������������������������������T��������������������!����������������������������7��g������+���������j�����,�����(������K���b��)���������q��S��3���������������������������������������������������������������W��������������N������������������E������O�������������������������w���������`�������������������������������������o������b���{��|�����6�����q��������&����������������H����������������l����������������}�����������������j��������������������������������������������������C������������d�������������������j������l�������-�����P�������������n��R���������������������������������~�������������������^��Y��� ����������Q��?��������������'���� Access Rights : � Attributes : � %s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile] +-� %s [-n netid]* [-o outfile] [infile] +-� %s [-s nettype]* [-o outfile] [infile] +-� Access rights: � Entry data of type %s +-� Name : %s +-� Public Key : � Type : %s +-� Universal addresses (%u) +-� [%d] Name : %s +-� [%u] - [%u bytes] � +-%s cache: +- +-%15s cache is enabled +-%15Zd suggested size +-%15ld seconds time to live for positive entries +-%15ld seconds time to live for negative entries +-%15ld cache hits on positive entries +-%15ld cache hits on negative entries +-%15ld cache misses on positive entries +-%15ld cache misses on negative entries +-%15ld%% cache hit rate +-%15s check /etc/%s for changes +-� +-Group Members : +-� +-Time to Live : � rpcinfo -b prognum versnum +-� rpcinfo -d prognum versnum +-� rpcinfo -p [ host ] +-� rpcinfo [ -n portnum ] -t host prognum [ versnum ] +-� no� yes� Data Length = %u +-� Explicit members: +-� Explicit nonmembers: +-� Implicit members: +-� Implicit nonmembers: +-� No explicit members +-� No explicit nonmembers +-� No implicit members +-� No implicit nonmembers +-� No recursive members +-� No recursive nonmembers +-� Recursive members: +-� program vers proto port +-� or: � (rule from "%s", line %d)� [OPTION...]� done +-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags. +-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed. +-�%s%s%s:%u: %s%sUnexpected error: %s. +-�%s%sUnknown signal %d +-�%s: %d did not sign extend correctly +-�%s: <mb_cur_max> must be greater than <mb_cur_min> +-�%s: C preprocessor failed with exit code %d +-�%s: C preprocessor failed with signal %d +-�%s: Can't create %s: %s +-�%s: Can't create directory %s: %s +-�%s: Can't link from %s to %s: %s +-�%s: Can't open %s: %s +-�%s: Can't remove %s: %s +-�%s: Can't unlink %s: %s +-�%s: Error closing %s: %s +-�%s: Error reading %s +-�%s: Error writing �%s: Error writing %s +-�%s: Leap line in non leap seconds file %s +-�%s: Memory exhausted: %s +-�%s: More than one -L option specified +-�%s: More than one -d option specified +-�%s: More than one -l option specified +-�%s: More than one -p option specified +-�%s: More than one -y option specified +-�%s: Too many arguments +-�%s: cannot get modification time�%s: command was '%s', result was %d +-�%s: error in state machine�%s: illegal option -- %c +-�%s: invalid option -- %c +-�%s: option `%c%s' doesn't allow an argument +-�%s: option `%s' is ambiguous +-�%s: option `%s' requires an argument +-�%s: option `--%s' doesn't allow an argument +-�%s: option `-W %s' doesn't allow an argument +-�%s: option `-W %s' is ambiguous +-�%s: option requires an argument -- %c +-�%s: output would overwrite %s +-�%s: panic: Invalid l_value %d +-�%s: premature end of file�%s: unable to open %s: %m +-�%s: unrecognized option `%c%s' +-�%s: unrecognized option `--%s' +-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ] +- [ -L leapseconds ] [ -y yearistype ] [ filename ... ] +-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ... +-�%s: while writing output %s: %m�(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object) +-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible +-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]... +-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Address family not supported by protocol family�Advertise error�Alarm clock�Anode table overflow�Arg list too long�Argument list too long�Argument out of domain�Attempt to remove a non-empty table�Attempting to link in more shared libraries than system limit�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT +-�Bad address�Bad exchange descriptor�Bad file descriptor�Bad file number�Bad font file format�Bad message�Bad request code�Bad request descriptor�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data +-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can not exec a shared library directly�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag! +-�Cannot receive reply to broadcast�Cannot register service�Cannot send after socket shutdown�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file! +-�Cannot use netid flag with inetd flag! +-�Cannot use netid flag without TIRPC! +-�Cannot use table flags with newstyle! +-�Channel number out of range�Character Separator : %c +-�Child exited�Client credential too weak�Columns : +-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc. +-This is free software; see the source for copying conditions. There is NO +-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�Cross-device link�DES entry for netname %s not unique +-�DIRECTORY +-�DNANS�DNS�Database for table does not exist�Database is busy�Deadlock situation detected/avoided�Default Access rights : +-�Destination address required�Device busy�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits) +-�Directory : %s +-�Directory not empty�Disc quota exceeded�Disk quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY +-�Encrypted data +-�Entry/table type mismatch�Error 0�Error 100�Error 101�Error 102�Error 103�Error 104�Error 105�Error 106�Error 107�Error 108�Error 109�Error 110�Error 111�Error 112�Error 113�Error 114�Error 115�Error 116�Error 117�Error 118�Error 119�Error 136�Error 142�Error 58�Error 59�Error 72�Error 73�Error 75�Error 76�Error 91�Error 92�Error in RPC subsystem�Error in accessing NIS+ cold start file. Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock�File locking deadlock error�File name too long�File size limit exceeded�File table overflow�File too large�First/next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP +-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group : %s +-�Group Flags :�Group entry for "%s.%s" group: +-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O error�I/O possible�INPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal byte sequence�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid object for operation�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Invalidate the specified cache�Is a directory�Is a name file�Is a named type file�Kerberos. +-�Killed�LINK +-�LOCAL entry for UID %d in directory %s not unique +-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link has been severed�Link number out of range�Link points to illegal name�Linked Object Type : �Linked to : %s +-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server : +-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message tables full�Message too long�Missing or malformed attribute�Mod. Time : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME +-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT +-�NUMBER�Name : `%s' +-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection because of reset�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No record locks available�No remote programs registered. +-�No route to host�No space left on device�No such device�No such device or address�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None. +-�Not a XENIX named type file�Not a data message�Not a directory�Not a name file�Not a stream device�Not available�Not enough space�Not found�Not found, no such name�Not master server for this domain�Not owner�Not supported�Number of Columns : %d +-�Number of objects : %u +-�Number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS�Numerical argument out of domain�Numerical result out of range�Object #%d: +-�Object Name : %s +-�Object Type : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation canceled�Operation not applicable�Operation not permitted�Operation not supported�Operation not supported on transport endpoint�Operation now in progress�Operation would block�Option not supported by protocol�Out of stream resources�Out of streams resources�Output control:�Output selection:�Owner : %s +-�PRIVATE +-�Package not installed�Parse error: %s�Partial success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits) +-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate : +-�Report bugs to %s. +-�Report bugs using the `glibcbug' script to <bugs@gnu.org>. +-�Request arguments bad�Reserved for future use�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Result too large�Results sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path : %s +-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root +-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status : %s +-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%s�TABLE�TABLE +-�TABLE,yes�Table Type : %s +-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known. This does +-not necessarily mean that all combinations of these names can be used for +-the FROM and TO command line parameters. One coded character set can be +-listed with several different names (aliases). +- Some of the names are no plain strings but instead regular expressions and +-they match a variety of names which can be given as parameters to the +-program. +- +- �Time to live : �Timer expired�Too many attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information. +-�Trying %s... +-�Type : %s +-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d) +-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s +-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname] +-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-�Use separate cache for each user�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s. +-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�__get_myaddress: ioctl (get interface configuration)�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory +-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice +-�bogus mcheck_status, library is buggy +-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d +-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s +-�cannot find any C preprocessor (cpp) +-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character '%s' in class `%s' must be in class `%s'�character '%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character L'%s' (index %Zd) in class `%s' must be in class `%s'�character L'%s' (index %Zd) in class `%s' must not be in class `%s'�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory +-�clntudp_create: out of memory +-�clntunix_create: out of memory +-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server +-�couldn't register prog %d vers %d +-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error getting callers id: %s�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' undefined�file `%s' already exists and may be overwritten +-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :`%s' +-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block +-�memory clobbered past end of allocated block +-�memory exhausted�memory is consistent, library is buggy +-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s +-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in `%s'.�netname2user: principal name `%s' too long�netname2user: should not have uid 0�never registered prog %d +-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration: +- +-%15d server debug level +-�nscd not running! +-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup +-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available +-�program %lu version %lu is not available +-�program %lu version %lu ready and waiting +-�rcmd: poll (setting up stderr): %m +-�rcmd: socket: All ports in use +-�rcmd: write (setting up stderr): %m +-�registerrpc: out of memory +-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error +-�rpcgen: too many defines +-�rpcinfo: %s is unknown host +-�rpcinfo: %s is unknown service +-�rpcinfo: Could not delete registration for prog %s version %s +-�rpcinfo: broadcast failed: %s +-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup +-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory +-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory +-�svctcp_create: out of memory +-�svcudp_create - cannot getsockname�svcudp_create: out of memory +-�svcudp_create: socket creation problem�svcunix_create: out of memory +-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d +-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage: %s infile +-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�warning: �while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory +-�xdrrec_create: out of memory +-�yp_update: cannot convert host to netname +-�yp_update: cannot get server address +-�Project-Id-Version: libc 2.1.3 +-POT-Creation-Date: 2000-02-16 10:39-0800 +-PO-Revision-Date: 2000-02-21 10:04+0200 +-Last-Translator: Jacobo Tarrio <jtarrio@iname.com> +-Language-Team: Galician <gpul-traduccion@ceu.fi.udc.es> +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=iso-8859-1 +-Content-Transfer-Encoding: 8bit +-� Dereitos de Acceso : � Atributos : � %s [-abkCLNTM][-Dnome[=valor]] [-i tama�o] [-I [-K segundos]] [-Y rota] entrada +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o sa�da] [entrada] +-� %s [-n idrede]* [-o sa�da] [entrada] +-� %s [-s tiporede]* [-o sa�da] [entrada] +-� Dereitos de Acceso: � Datos da entrada do tipo %s +-� Nome : %s +-� Chave p�blica : � Tipo : %s +-� Enderezos universais (%u) +-� [%d] Nome : %s +-� [%u] - [%u bytes] � +-%s cach�: +- +-%s15s a cach� est� activada +-%15Zd tama�o aconsellado +-%15ld segundos de vida para as entradas positivas +-%15ld segundos de vida para as entradas negativas +-%15ld acertos de cach� para entradas positivas +-%15ld acertos cach� para entradas negativas +-%15ld fallos de cach� para entradas positivas +-%15ld fallos de cach� para entradas negativas +-%15ld%% tasa de acertos de cach� +-%15s comprobe /etc/%s para ve-los cambios +-� +-Membros do Grupo : +-� +-Tempo de Vida : � rpcinfo -b numprog numvers +-� rpcinfo -d numprog numvers +-� rpcinfo -p [ servidor ] +-� rpcinfo [ -n numporto ] -t servidor numprog [ numvers ] +-� non� si� Lonxitude de Datos = %u +-� Membros expl�citos: +-� Non-membros expl�citos: +-� Membros impl�citos: +-� Non-membros impl�citos: +-� Non hai membros expl�citos +-� Non hai non-membros expl�citos +-� Non hai membros impl�citos +-� Non hai non-membros impl�citos +-� Non hai membros recursivos +-� Non hai non-membros recursivos +-� Membros recursivos: +-� programa vers proto porto +-� ou: � (regra de "%s", li�a %d)� [OPCI�N...]� feito +-�"%s", li�a %d: %s�A li�a "Zone %s" e a opci�n -l son mutuamente exclusivas�A li�a "Zone %s" e a opci�n -p son mutuamente exclusivas�Prec�sase dun ficheiro de "entrada" para as opci�ns de xeraci�n de patr�ns. +-�%.*s: O par�metro ARGP_HELP_FMT precisa dun valor�%.*s: Par�metro ARGP_HELP_FMT desco�ecido�%s nunha zona sen regras�%s%s%s:%u: %s%sNon se cumpr�u a aseveraci�n `%s'. +-�%s%s%s:%u: %s%sErro inesperado: %s. +-�%s%sSinal desco�ecido %d +-�%s: %d non foi estendido con signo correctamente +-�%s: <mb_cur_max> debe ser meirande ca <mb_cur_min> +-�%s: O preprocesador de C fallou co c�digo de sa�da %d +-�%s: O preprocesador de C fallou co sinal %d +-�%s: Non se pode crear %s: %s +-�%s: Non se pode crea-lo directorio %s: %s +-�%s: Non se pode enlazar %s con %s: %s +-�%s: Non se pode abrir %s: %s +-�%s: Non se pode borrar %s: %s +-�%s: Non se pode elimina-lo enlace %s: %s +-�%s: Erro ao pechar %s: %s +-�%s: Erro ao ler %s +-�%s: Erro ao escribir �%s: Erro ao escribir %s +-�%s: Li�a de axuste no ficheiro %s, que non � de axuste de segundos +-�%s: Memoria esgotada: %s +-�%s: Indicouse m�is dunha opci�n -L +-�%s: Indicouse m�is dunha opci�n -d +-�%s: Indicouse m�is dunha opci�n -l +-�%s: Indicouse m�is dunha opci�n -p +-�%s: Indicouse ma�s dunha opci�n -y +-�%s: Demasiados par�metros +-�%s: non se puido obte-la data de �ltima modificaci�n�%s: o comando foi '%s', e o resultado foi %d +-�%s: erro na m�quina de estados�%s: opci�n ilegal -- %c +-�%s: opci�n incorrecta -- %c +-�%s: a opci�n `%c%s' non acepta par�metros +-�%s: a opci�n `%s' � ambigua +-�%s: a opci�n `%s' precisa dun par�metro +-�%s: a opci�n `--%s' non acepta par�metros +-�%s: a opci�n `-W %s' non acepta par�metros +-�%s: a opci�n `-W %s' � ambigua +-�%s: a opci�n precisa dun par�metro -- %c +-�%s: a sa�da sobreescribir�a %s +-�%s: p�nico: l_value %d incorrecto +-�%s: fin de ficheiro prematuro�%s: non puiden abrir %s: %m +-�%s: opci�n desco�ecida `%c%s' +-�%s: opci�n desco�ecida `--%s' +-�%s: �sase %s [ -s ] [ -v ] [ -l horalocal ] [ -p regrasposix ] [ -d directorio ] +- [ -L axuste ] [ -y tipoano ] [ ficheiro ... ] +-�%s: �sase %s [ -v ] [ -c corte ] nomezona ... +-�%s: ao escribir � sa�da %s: %m�(ERRO DE PROGRAMA) ��Non se co�ece a versi�n!?�(ERRO DE PROGRAMA) ��Deber�ase co�ece-la opci�n!?�(Obxecto desco�ecido) +-�(erro de autentificaci�n desco�ecido - %d)�(desco�ecido)�*** O ficheiro `%s' est� recortado: non � posible unha an�lise detallada +-�*entrada est�ndar*�-o FICHEIRO-SA�DA [FICHEIRO-ENTRADA]... +-[FICHEIRO-SA�DA [FICHEIRO-ENTRADA]...]�secci�n .lib do a.out corrompida�; versi�n baixa = %lu, versi�n alta = %lu�; causa = �<%s> e <%s> son nomes incorrectos para o rango�O car�cter <SP> non debe estar na clase `%s'�O car�cter <SP> non est� na clase `%s'�?�Abortado�Dereitos de Acceso : �Accedendo a unha biblioteca compartida corrompida�Estase usando o enderezo�Familia de enderezos para o nome do servidor non soportada�O protocolo non soporta esta familia de enderezos�A familia de protocolos non soporta esta familia de enderezos�Anunciar erro�Temporizador�Desbordamento da t�boa de anodes�Lista de par�metros demasiado longa�Lista de par�metros demasiado longa�O argumento non est� no seu dominio�Intentouse borrar unha t�boa non baleira�Intentouse sobrepasa-lo l�mite de bibliotecas compartidas�Intentouse cargar demasiadas bibliotecas compartidas�Autentificaci�n correcta�Erro na autentificaci�n�OBXECTO FALSO +-�Enderezo incorrecto�Descriptor de intercambio incorrecto�Descriptor de ficheiro incorrecto�N�mero de ficheiro incorrecto�Formato do ficheiro de tipo de letra incorrecto�Mensaxe incorrecta�C�digo de petici�n incorrecto�Descriptor de petici�n incorrecto�Chamada ao sistema incorrecta�Valor de ai_flags incorrecto�Ser estrictamente conforme con POSIX�Datos binarios +-�Prec�sase dun dispositivo de bloques�Problema cunha chamada multidifusi�n�Canalizaci�n rota�Erro no bus de datos�CDS�L�mite de tempo de CPU superado�A cach� caducou�Non se pode acceder a unha biblioteca compartida necesaria�Non se pode executar unha biblioteca compartida directamente�Non se pode conectar co servidor que serve a este dominio�Non se pode comunicar co mapeador de portos�Non se pode comunicar con `ypbind'�Non se pode comunicar con ypserv�Non se pode reservar memoria�Non se pode asigna-lo enderezo pedido�Non se pode crear un socket para un rpc multidifusi�n�Non se pode executar unha biblioteca compartida directamente�Non se pode ter m�is dunha opci�n de xeraci�n de ficheiros +-�Non se pode recibi-la resposta � multidifusi�n�Non se pode rexistra-lo servicio�Non se pode enviar despois de desconecta-lo socket�Non se pode enviar despois de desconecta-lo destino do transporte�Non se pode enviar un paquete multidifusi�n�Non se pode activa-la opci�n SO_BROADCAST do socket��Non se pode indicar m�is dun ficheiro de entrada! +-��Non se pode utiliza-la opci�n netid coa opci�n inetd! +-��Non se pode utiliza-la opci�n netid sen TIRPC! +-��Non se poden utiliza-las opci�ns de t�boa con newstyle! +-�N�mero de canal f�ra do seu rango�Separador de Caracteres : %c +-�O proceso fillo sa�u�A credencial do cliente � demasiado feble�Columnas : +-�Erro de comunicaci�ns ao enviar�Compile a especificaci�n do `locale'�O ordenador mercou a granxa�O c�lculo do tama�o da t�boa para as clases de caracteres pode levar un pouco...�O c�lculo do tama�o da t�boa para a informaci�n de ordenaci�n pode levar un pouco...�Conexi�n rexeitada�Conexi�n reiniciada polo outro estremo�A conexi�n espirou�Continuaci�n�Converti-los ficheiros dados dunha codificaci�n a outra.�Converti-la clave a min�sculas�Copyright (C) %s Free Software Foundation, Inc. +-Isto � software libre; vexa o c�digo fonte polas condici�ns de copia. NON hai +-garant�a; nin sequera de COMERCIABILIDADE ou APTITUDE PARA UN FIN DETERMINADO. +-�Non se puido crea-lo ficheiro de rexistro "%s"�Crea-lo ficheiro de cabeceira C NOME que cont�n as definici�ns de s�mbolos�Crea-la sa�da incluso se se produciron mensaxes de aviso�Crear unha base de datos DB simple a partires da entrada textual.�Hora de Creaci�n : %s�Enlace a trav�s de dispositivos�A entrada DES para o nome de rede %s non � �nica +-�DIRECTORIO +-�DNANS�DNS�A base de datos para a t�boa non existe�A base de datos est� ocupada�Situaci�n de interbloqueo detectada/evitada�Dereitos de acceso por Omisi�n : +-�Prec�sase dun enderezo de destino�Dispositivo ocupado�O dispositivo non � de fluxo�Dispositivo non configurado�Dispositivo ou recurso ocupado�Diffie-Hellmann (%d bits) +-�Directorio : %s +-�Directorio non baleiro�Cota de disco superada�Cota de disco superada�Non bifurcar e visualiza-las mensaxes no terminal actual�Non visualizar mensaxes ao construi-la base de datos�Non usa-lo cat�logo existente, forzar un ficheiro de sa�da novo�Non se conectou co dominio�Trampa de EMT�ENTRADA +-�Datos encriptados +-�Diferentes tipos de entrada/t�boa�Erro 0�Erro 100�Erro 101�Erro 102�Erro 103�Erro 104�Erro 105�Erro 106�Erro 107�Erro 108�Erro 109�Erro 110�Erro 111�Erro 112�Erro 113�Erro 114�Erro 115�Erro 116�Erro 117�Erro 118�Erro 119�Erro 136�Erro 142�Erro 58�Erro 59�Erro 72�Erro 73�Erro 75�Erro 76�Erro 91�Erro 92�Erro no subsistema RPC�Erro ao acceder ao ficheiro de arranque en fr�o de NIS+. �Instalouse NIS+?�Erro no sistema de erro desco�ecido: �Erro ao falar ao procedemento de retrochamada�Erro: o ficheiro .netrc pode ser lido por outros.�Ficheiro de intercambio cheo.�Exec erro de formato�FATAL: o sistema non define `_POSIX2_LOCALDEF'�FICHEIRO�O FICHEIRO cont�n mapeado de nomes simb�licos a valores UCS4�Fallo (erro non especificado)�Descriptor de ficheiro en mal estado�O ficheiro xa existe�Interbloqueo en bloqueos de ficheiro�Erro de interbloqueo en bloqueos de ficheiro�Nome de ficheiro demasiado longo�L�mite de tama�o de ficheiro superado�Desbordamento da t�boa de ficheiros�Ficheiro demasiado grande�Primeira/seguinte cadea rota�Excepci�n de coma frotante�Prec�sase unha resincronizaci�n completa do directorio�Funci�n non implementada�GRUPO +-�Lixo en ARGP_HELP_FMT: %s�Xera-lo cat�logo de mensaxes. +-Se o FICHEIRO-ENTRADA � -, a entrada lese da entrada est�ndar. Se o +-FICHEIRO-SA�DA � -, a sa�da escr�bese na sa�da est�ndar. +-�Erro de sistema xen�rico�Obter informaci�n espec�fica do `locale'.�Devolver unha mensaxe curta sobre o uso�Devolver esta lista de axuda�Erro inxustificado�Grupo : %s +-�Opci�ns do Grupo :�Entrada do grupo "%s.%s": +-�Agardar SEGS segundos (por omisi�n, 3600)�Colgar��Non atopei "%d" na cach� de grupos!��Non atopei "%d" na cach� de contrasinais!��Non atopei "%s" na cach� de grupos!��Non atopei "%s" na cach� de servidores!��Non atopei "%s" na cach� de contrasinais!�O servidor est� inactivo�Fallo ao busca-lo nome do servidor�Erro de E/S�E/S posible�FICHEIRO-ENTRADA FICHEIRO-SA�DA +--o FICHEIRO-SA�DA FICHEIRO-ENTRADA +--u FICHEIRO-ENTRADA�Trampa de IOT�IVY�Identificador borrado�Secuencia de bytes non permitida�Instrucci�n non permitida�Tipo de obxecto non permitido na operaci�n�B�squeda non permitida�Tipo ou formato de ficheiro inapropiado�ioctl inapropiado para o dispositivo�Operaci�n inapropiada para un proceso que traballa de fondo�Petici�n de informaci�n�Informaci�n:�Ficheiros de Entrada:�Especificaci�n do formato de Entrada/Sa�da:�Erro de Entrada/sa�da�Erro interno de NIS�Erro interno de ypbind�Interrupci�n�Chamada ao sistema interrompida�A chamada ao sistema interrompida deber�a ser recomezada�Par�metro incorrecto�Referencia cara a atr�s incorrecta�Nome da clase de caracteres incorrecto�Credencial do cliente incorrecta�Verificador do cliente incorrecto�Car�cter de ordenaci�n incorrecto�Contido de \{\} incorrecto�Enlace entre dispositivos distintos incorrecto�Intercambio incorrecto�Obxecto incorrecto para a operaci�n�Car�cter ancho ou multibyte incorrecto ou incompleto�Expresi�n regular precedente incorrecta�Final do rango incorrecto�Expresi�n regular incorrecta�C�digo de petici�n incorrecto�Descriptor de petici�n incorrecto�Verificador de servidor incorrecto�Ra�ura incorrecta�Invalida-la cach� especificada�� un directorio�� un ficheiro de nome�� un ficheiro de tipo con nome�Kerberos. +-�Matado�ENLACE +-�A entrada LOCAL para o UID %d no directorio %s non � �nica +-�Nivel 2 detido�Nivel 2 non sincronizado�Nivel 3 detido�Nivel 3 reiniciado�O enlace foi roto�N�mero de enlace f�ra de rango�O enlace leva a un nome ilegal�Tipo do Obxecto Enlazado : �Enlazado a : %s +-�Nome de dominio local non fixado�Fallo ao reservar recursos locais�A m�quina non est� na rede�Nome mal formado, ou ilegal�Os par�metros obrigatorios ou opcionais das opci�ns longas son tam�n obrigatorios ou opcionais para calquera opci�n curta que se corresponda.�Servidor Mestre : +-�Servidor mestre ocupado, volcado completo reprogramado.�Fallo ao reservar memoria�Memoria esgotada�T�boas de mensaxes cheas�Mensaxe demasiado longa�Falta un atributo, ou est� mal formado�Hora de Modificaci�n : %s�Fallo ao modificar�Fallo na operaci�n de modificaci�n�Modifica-lo formato de sa�da:�Tentouse un multisalto�NOME�NOME +-[-a|-m]�NIS�Non coinciden as versi�ns do cliente e o servidor NIS - non se pode dar servicio�A base de datos de mapas NIS est� mal�Fallou unha operaci�n NIS+�Non se pode chegar aos servidores NIS+�O servicio NIS+ non est� dispo�ible ou instalado�SEN OBXECTO +-�N�MERO�Nome : `%s' +-�Demo de Cache de Servicio de Nomes.�Nome non servido por este servidor�O nome non � �nico na rede�Nome ou servicio desco�ecido�O nome/entrada non � �nico�Non se pode busca-lo obxecto nomeado�Preciso dun autentificador�A rede cortou a conexi�n debido ao reinicio�A rede cortou a conexi�n por un reinicio�A rede non funciona�Non se pode chegar � rede�Non hai unha estructura CSI dispo�ible�Non hai sem�foros XENIX dispo�ibles�Non hai un enderezo asociado ao nome de servidor�Non hai un enderezo asociado ao nome�Non hai un anodo�Non hai espacio dispo�ible no buffer�Non hai procesos fillo�Non hai datos dispo�ibles�Non hai espacio de ficheiros no servidor�Non hai bloqueos dispo�ibles�Nada coincide�Non se atopou o medio�Non hai unha mensaxe do tipo desexado�Non hai m�is rexistros na base de datos de mapas�Non hai unha expresi�n regular precedente�Non hai bloqueos de rexistro dispo�ibles�Non hai programas remotos rexistrados. +-�Non hai unha rota ao servidor�Non hai espacio libre no dispositivo�Non hai tal dispositivo�Non hai tal dispositivo ou enderezo�Non hai tal ficheiro ou directorio�Non hai tal clave no mapa�Non hai tal mapa no dominio do servidor�Non hai tal proceso�Non se atopou un espacio de nomes NIS+�Fallo non recuperable na resoluci�n de nomes�Ning�n. +-�Non � un ficheiro de tipo nomeado XENIX�Non � unha mensaxe de datos�Non � un directorio�Non � un ficheiro de nome�Non � un dispositivo de fluxo�Non dispo�ible�Non hai espacio abondo�Non atopado�Non atopado, non hai tal nome�Non hai servidor mestre para este dominio�Non � o propietario�Non soportado�N�mero de Columnas : %d +-�N�mero de obxectos: %u +-�O n�mero de enlaces simb�licos atopados durante o percorrido pola rota supera MAXSYMLINKS�Par�metro num�rico f�ra do dominio�Resultado num�rico f�ra de rango�Obxecto n� %d: +-�Nome do Obxecto : %s +-�Tipo do Obxecto : �O obxecto � remoto�Xa existe un obxecto co mesmo nome�N�mero de comi�as impar��S� root pode usar esa opci�n!�A operaci�n xa se est� levando a cabo�Operaci�n cancelada�Operaci�n non aplicable�Operaci�n non permitida�Operaci�n non soportada�Operaci�n non soportada no punto final do transporte�Operaci�n lev�ndose a cabo�A operaci�n bloquear�ase�Opci�n non soportada polo protocolo�Acab�ronse os recursos de fluxo�Acab�ronse os recursos de fluxo�Control de sa�da:�Selecci�n de sa�da:�Propietario : %s +-�PRIVADO +-�Paquete non instalado�Erro na an�lise: %s��xito parcial�O obxecto pasado non � o mesmo obxecto no servidor�Permiso denegado�Fallo de enerx�a�Final prematura da expresi�n regular�Visualiza-lo contido do ficheiro de base de datos, unha entrada por li�a�Visualiza-la estat�stica da configuraci�n actual�Visualizar m�is mensaxes�Visualiza-la versi�n do programa��xito probable�Probablemente non atopado�Rematado o tempo de perfilado�Controlador de protocolos non conectado�Erro de protocolo�Familia de protocolos non soportada�Protocolo non dispo�ible�Protocolo non soportado�Tipo incorrecto de protocolo para o socket�Petici�n ilegal para a t�boa nomeada�Abandoar�Erro espec�fico de RFS�Mal procedemento RPC para o programa�Fallo de RPC na operaci�n NIS�Programa RPC non dispo�ible�Versi�n incorrecta do programa RPC�A estructura RPC � incorrecta�Versi�n de RPC incorrecta�RPC: (c�digo de erro desco�ecido)�RPC: Erro de autentificaci�n�RPC: Non se pode descodifica-lo resultado�RPC: Non se pode codifica-los par�metros�RPC: Fallo (erro non especificado)�RPC: Versi�ns de RPC incompatibles�RPC: Fallo do portmapper�RPC: Procedemento non dispo�ible�RPC: Programa non rexistrado�RPC: Programa non dispo�ible�RPC: Non coinciden os programas/versi�ns�RPC: Erro do sistema remoto�RPC: O servidor non pode descodifica-los par�metros�RPC: �xito�RPC: Tempo esgotado�RPC: Non se pode recibir�RPC: Non se pode enviar�RPC: Servidor desco�ecido�RPC: Protocolo desco�ecido�RSA (%d bits) +-��sase RTLD_NEXT en c�digo non cargado dinamicamente�Ler e visualiza-los datos do perfil do obxecto compartido�Le-los datos de configuraci�n de NOME�Sistema de ficheiros de s� lectura�Sinal de tempo real %d�Expresi�n regular demasiado grande�Erro de E/S remota�O enderezo remoto cambiou�Elimina-lo contrasinal ou face-lo ficheiro ilexible por outros.�A apertura do obxecto compartido `%s' fallou�Replicar : +-�Informe dos erros a %s. +-�Informe dos erros usando o script `glibcbug' a <bugs@gnu.org>. +-�Par�metros da petici�n incorrectos�Reservado para uso futuro�Erro do resolvedor 0 (sen erro)�Erro interno do resolvedor�Interbloqueo de recursos evitado�Recurso perdido�Recurso non dispo�ible temporalmente�Resultado demasiado grande�Resultado enviado ao procedemento callback�SOBJ [PROFDATA]�SUNYP�Rota de B�squeda : %s +-�Fallo de segmento�Servidor ocupado, probe outra vez�Servidor sen memoria�O servidor rexeitou a credencial�O servidor rexeitou o verificador�Servname non soportado para ai_socktype�Establece-lo nome do programa�Apaga-lo servidor�Sinal 0�Operaci�n de socket nun non-socket�Tipo de socket non soportado�Un programa abortou a conexi�n�S�ntocho. Non es root +-�As definici�ns de fonte at�panse en FICH�Erro de srmount�Fallo de pila�Manexador de ficheiro NFS trabucado�Comezar N�MERO f�os�Estado : %s +-�Detido�Detido (sinal)�Detido (entrada do terminal)�Detido (sa�da do terminal)�Erro de canalizaci�n de fluxo�A estructura precisa dunha limpeza��xito�Elimina-las mensaxes de aviso e informaci�n�Nomes de caracteres simb�licos definidos en FICH�Erro de sistema�Informaci�n do sistema:�Fallo ao reservar recursos do sistema�Directorio do sistema para mapas de caracteres : %s +- mapas de repertorios: %s +- locale : %s +-%s�T�BOA�T�BOA +-�T�BOA,si�Tipo de T�boa : %s +-�Fallo temporal na resoluci�n de nomes�Terminado�Ficheiro de texto en uso�A seguinte lista cont�n t�dolos xogos de caracteres co�ecidos. Isto non +-significa necesariamente que t�dalas combinaci�ns deses nomes poidan ser usadas +-para os par�metros de li�a de comandos DE e A. Un xogo de caracteres pode ser +-listado con distintos nomes (alias). +- Alg�ns dos nomes non son cadeas normais, sen�n expresi�ns regulares e +-coinciden cunha variedade de nomes que poden ser dados como par�metros do +-programa +- +- �Tempo de vida : �Acabou o tempo�Demasiados atributos�Demasiados niveis de enlaces simb�licos�Demasiados enlaces�Demasiados ficheiros abertos�Demasiados ficheiros abertos no sistema�Demasiados procesos�Demasiadas referencias: non se pode unir�Demasiados usuarios�Trampa de seguemento/punto de ruptura�Barra invertida extra � final�O proceso traductor morreu�O destino do transporte xa est� conectado�O destino do transporte non est� conectado�Escriba `%s --help' ou `%s --usage' para obter m�is informaci�n. +-�Probando %s... +-�Tipo : %s +-�DESCO�ECIDO�Non se pode autentifica-lo cliente NIS+�Non se pode autentifica-lo servidor NIS+�Non se pode crea-lo callback�Non se pode crear un proceso no servidor�Desco�ecido (tipo = %d, bits = %d) +-�Clave %s desco�ecida no .netrc�C�digo de erro NIS desco�ecido�Base de datos desco�ecida: %s +-�Erro desco�ecido�Erro desco�ecido �Servidor desco�ecido�Obxecto desco�ecido�Opci�n desco�ecida: %s %s %s�Erro do resolvedor desco�ecido�Erro do servidor desco�ecido�Sinal %d desco�ecida�Erro de sistema desco�ecido�Erro de ypbind desco�ecido�( ou \( sen parella�) ou \) sen parella�[ ou [^ sen parella�\{ sen parella�Variable `%s' non reco�ecida�Condici�n de E/S urxente�Uso:�Uso: %s nome_variable [nome] +-�Uso: rpcinfo [ -n numport ] -u host numprog [ numvers ] +-�Usar unha cach� separada para cada usuario�Sinal 1 definido polo usuario�Sinal 2 definido polo usuario�Valor grande de m�is para o tipo de datos definido�Tempo virtual esgotado�Resultado salvaxe da execuci�n do comando�A vent� cambiou�Escribi-los nomes dos mapas de caracteres dispo�ibles�Escribi-los nomes dos `locales' dispo�ibles�Escribi-los nomes das categor�as seleccionadas�Escribi-los nomes das claves seleccionadas�Escribi-la sa�da no ficheiro NOME�Escrito por %s. +-�Tipo de medio incorecto�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Si, 42 � o significado da vida�Si que a fastidiaches esta vez�A hora final da li�a de continuaci�n de fuso horario non segue � hora final da li�a anterior�[FICH...]�__get_myaddress: ioctl (obte-la configuraci�n da interface)�A definici�n `%1$s' non remata con `END %1$s'�`%s' non � un ficheiro de datos de perf�s correcto para `%s'�`-1' debe se-la derradeira entrada do campo '%s' na categor�a `%s'�`...' debe ser usado s� nas entradas `...' e `UNDEFINED'�Esper�base un `from' tralo primeiro par�metro de `collating-element'�A cadea `from' da delaraci�n de elemento de ordeaci�n cont�n un car�cter desco�ecido�ai_family non soportado�ai_socktype non soportado�xa en execuci�n�o par�metro de <%s> debe ser un s� car�cter�o par�metro de `%s' debe ser un s� car�cter�auth_none.c - Problema fatal de ordenaci�n�authunix_create: memoria esgotada +-�par�metro incorrecto�propietario incorrecto�campo FROM baleiro na li�a Link�campo TO baleiro na li�a Link�bloque liberado d�as veces +-�mcheck_status falso, a librer�a ten erros +-�multidifusi�n: ioctl (obte-la configuraci�n do interfaz)�multidifusi�n: ioctl (obte-los par�metros do interfaz)�desbordamento do buffer�cache_set: non se puido reserver un novo rpc_buffer�cache_set: fallou a reserva de espacio para o obxectivo�cache_set: obxectivo non atopado�non podo determina-la abreviatura do fuso horario a usar despois da hora�non se pode reasigna-lo procedemento n�mero %d +-�non se pode avalia-lo ficheiro de locales `%s'�non se poden localiza-los datos de s�mbolos�non se pode crear un descriptor interno�non se poden crear descriptores internos�non se pode facer que o socket acepte conexi�ns: %s�non podo atopa-lo preprocesador de C: %s +-�non podo atopar un preprocesador de C (cpp) +-�non se pode manexa-la antiga petici�n versi�n %d; a versi�n actual � %d�non se pode inserta-lo elemento de ordenaci�n `%.*s'�non se pode insertar na t�boa de resultados�non se pode inserta-la nova definici�n de s�mbolo de ordenaci�n: %s�non se pode carga-los datos de perf�s�non se pode abrir�non se pode abrir `%s'�non se pode abri-lo ficheiro de bases de datos `%s': %s�non se pode abri-lo ficheiro de entrada `%s'�non se pode abri-lo ficheiro de definici�n de locales `%s'�non se pode abri-lo ficheiro de sa�da�non se pode abri-lo ficheiro de sa�da `%s'�non se pode abri-lo ficheiro de sa�da `%s' para a categor�a `%s'�non se pode abrir un socket: %s�non se pode procesa-la especificaci�n de orde�non se pode ler no directorio de mapas de caracteres `%s'�non se pode le-lo ficheiro de configuraci�n; isto � fatal�non se pode ler do cliente�non se pode le-la cabeceira de `%s'�non se pode le-lo directorio de locales `%s'�non se pode le-lo ficheiro de locales `%s'�non se pode le-lo mapa de repertorio `%s'�non se poden le-los datos estat�sticos�non se pode facer stat() sobre o ficheiro `%s': %s�non se poden escribi-los ficheiros de sa�da a `%s'�non se pode escribi-lo resultado: %s�non se poden escribi-las estat�sticas: %s�non se pode escribir no cliente�datos de categor�a pedidos m�is dunha vez: non deber�a ocorrer�o car�cter '%s' na clase `%s' debe estar na clase `%s'�o car�cter '%s' na clase `%s' non debe estar na clase `%s'�car�cter <SP> non definido no mapa de caracteres�o car�cter L'%s' (�ndice %Zd) na clase `%s' debe estar na clase `%s'�o car�cter L'%s' (�ndice %Zd) na clase `%s' non debe estar na clase `%s'�car�cter `%s' non definido, cando fac�a falta por ser valor por omisi�n�clase de caracteres `%s' xa definida�mapa de caracteres `%s' xa definido�ficheiro de mapa de caracteres `%s' non atopado�clnt_raw.c - Erro fatal de serializaci�n de cabeceiras.�clnttcp_create: memoria esgotada +-�clntudp_create: memoria esgotada +-�clntunix_create: memoria esgotada +-�o elemento de ordenaci�n `%.*s' aparece m�is dunha vez: li�a ignorada�o elemento de ordenaci�n `%.*s' aparece m�is dunha vez: li�a ignorada�esper�base un s�mbolo de ordenaci�n despois de `%s'�conectarse ao enderezo %s: �esper�base unha constante ou un identificador�conversi�n de `%s' a `%s' non soportada�conversi�n detida debido a un problema escribindo na sa�da�non se puido crear un servidor rpc +-�non se puido rexistra-lo prog %d vers %d +-�base-de-datos [clave ...]�ficheiro de mapa de caracteres por defecto `%s' non atopado�a opci�n de direcci�n na cadea %d no campo `era' na categor�a `%s' non � '+' nin '-'�a opci�n de direcci�n na cadea %d no campo `era' na categor�a `%s' non � un �nico car�cter�nome do car�cter `%s' duplicado�definici�n do elemento de ordenaci�n duplicada�definici�n do car�cter `%.*s' duplicada�clave duplicada�definici�n de conxunto duplicada�fuso horario %s duplicado (ficheiro "%s", li�a %d)�identificador de mensaxes duplicado�n�mero de mensaxe duplicado�cadea de caracteres baleira�nome de peso baleiro: li�a ignorada�enablecache: cach� xa activada�enablecache: non se puido reservar espacio para a cach��enablecache: non se puido reservar espacio para os datos da cach��enablecache: non se puido reservar espacio para o fifo da cach��codificaci�n de sa�da�codificaci�n do texto orixinal�o final do rango dos puntos suspensivos � maior que o principio�erro ao obte-lo identificador do chamante: %s�erro ao pecha-la entrada `%s'�erro ao pecha-lo ficheiro de sa�da�erro ao pecha-lo ficheiro de datos de perf�s�erro ao inserta-lo elemento de ordenaci�n na t�boa hash�erro ao insertar na t�boa hash�erro ao ler da entrada�esp�rase un par�metro de cadea para `copy'�non se atopou a li�a de continuaci�n que se esperaba�non se puido carga-lo obxecto compartido `%s'�non se puideron carga-los datos de s�mbolos�non se puido facer mmap sobre o ficheiro de datos de perf�s�non se puido comeza-lo procesamento de conversi�n�non se puideron escribi-los datos da categor�a `%s'�fcntl: F_SETFD�campo `%s' na categor�a `%s' non definido�o ficheiro `%s' xa existe e pode ser sobreescrito +-�o valor-dende do `elemento-de-ordenaci�n' debe ser unha cadea�fallou a chamada a fstat�lixo � fin da especificaci�n do c�digo de caracteres�lixo � fin do n�mero�lixo � fin do valor desprazamento na cadea %d no campo `era' da categor�a `%s'�lixo � fin da data inicial na cadea %d no campo `era' da categor�a `%s'�lixo � fin da data final na cadea %d no campo `era' da categor�a `%s'�xera-lo grafo de chamadas�xerar un perfil plano con contas e tempos�get_myaddress: ioctl (obte-la configuraci�n do interfaz)�getent - obte-las entradas da base de datos administrativa.�handle_request: petici�n recibida (Version = %d)�non se pode facer un enlace duro, �sase un enlace simb�lico�ten un enlace duro nalg�n sitio�campo CORRECTION ilegal na li�a Leap�campo Rolling/Stationary ilegal na li�a Leap�constante de caracteres ilegal na cadea�car�cter ilegal no ficheiro: �elemento de ordenaci�n ilegal�definici�n ilegal�codificaci�n dada ilegal�secuencia de escape ilegal � fin da cadea�secuencia de entrada ilegal na posici�n %ld�nomes ilegais para o rango de caracteres�tipo de rede ilegal :`%s' +-�n�mero ilegal para o desprazamento na cadea %d no campo `era' da categor�a `%s'�n�mero de conxunto ilegal�data de inicio ilegal na cadea %d no campo `era' da categor�a `%s'�data final ilegal na cadea %d no campo `era' da categor�a `%s'�l�mite da implementaci�n: non se admiten m�is de %d clases de caracteres�l�mite da implementaci�n: non se admiten m�is de %d mapas de caracteres�secuencia de caracteres incompleta � fin do buffer�ficheiro con formato incorrecto�li�a de entrada de tipo desco�ecido�erro interno (descriptor ilegal)�erro interno - chamouse a addtype cun isdst incorrecto�erro interno - chamouse a addtype cun ttisgmt incorrecto�erro interno - chamouse a addtype cun ttisstd incorrecto�erro interno en %s, li�a %u�desprazamento UTC incorrecto�formato de abreviatura incorrecto�d�a do mes incorrecto�ano final incorecto�ano bisesto incorrecto�modo incorrecto para dlopen()�nome do mes incorrecto�hora gravada incorrecta�ano de inicio incorrecto�hora do d�a incorrecta�d�a da semana incorrecto�lonxitude da clave da petici�n demasiado grande: %Zd�a li�a tralos puntos suspensivos debe conte-la definici�n dun car�cter�a li�a antes dos puntos suspensivos non cont�n a definici�n dunha constante de car�cter�li�a demasiado longa�listar t�dolos conxuntos de caracteres codificados que se co�ecen�non se atopou o ficheiro de locale `%s', usado na instrucci�n `copy'�fallou a chamada a lstat�ign�rase unha li�a mal formada�fallou o mapeado da t�boa de cadeas da cabeceira da secci�n�fallou o mapeado das cabeceiras da secci�n�memoria alterada antes do bloque reservado +-�memoria alterada despois do bloque reservado +-�memoria esgotada�a memoria � consistente, a librer�a ten erros +-�non se atopou un formato era na cadea %d no campo `era' da categor�a `%s'�non se atopou un nome era na cadea %d no campo `era' da categor�a `%s'�regra sen nome�non se especificou unha codificaci�n nin do orixinal nin do destino�netname2user: (busca nis+): %s +-�netname2user: a entrada DES de %s no directorio %s non � �nica�netname2user: a entrada LOCAL de %s no directorio %s non � �nica�netname2user: non se atopou unha lista de identificadores de grupo en `%s'�netname2user: nome principal `%s' demasiado longo�netname2user: non deber�a ter uid 0�prog %d nunca rexistrado +-�non se deu un valor <Uxxxx> ou <Uxxxxxxxx>�non hai unha expresi�n regular correcta para o campo `%s' da categor�a `%s': %s�ning�n d�a do mes coincide coa regra�non hai unha definici�n de `UNDEFINED'�non se deu un nome de ficheiro para os datos de perfil e o obxecto `%s' non ten so-nome�non se debe especificar outra clave cando se usa `copy'�non se produc�u un ficheiro de sa�da porque se deron avisos�non se especificou un mapa de repertorio: non se pode proceder�non se deu un nome simb�lico�non se deu un nome simb�lico para a fin do rango�non se defin�u un peso para o s�mbolo `%s'�non � un ficheiro normal�configuraci�n de nscd: +- +-%15d nivel de depuraci�n do servidor +-��Non se est� a executar nscd! +-�s� se permiten definici�ns WIDTH seguindo � definici�n CHARMAP�a codificaci�n orixinal non foi especificada usando `-f'�ficheiro de sa�da�pmap_getmaps problema de rpc�poll: fallo de protocolo no establecemento do circuito +-�erro de preprocesador�visualiza-la lista de rotas de conta e o seu n�mero de uso�visualiza-la informaci�n do progreso�problemas ao ler `%s'�o ficheiro de datos de perfil `%s' non coincide co obxecto compartido `%s'�o programa %lu non est� dispo�ible +-�o programa %lu versi�n %lu non est� dispo�ible +-�programa %lu versi�n %lu preparado e agardando +-�rcmd: poll (configurando stderr): %m +-�rcmp: socket: T�dolos portos est�n sendo utilizados +-�rcmd: write (configurando stderr): %m +-�registerrpc: memoria esgotada +-�momento de segundo de correcci�n repetido�o ficheiro de mapa de repertorios `%s' non foi atopado�rpcgen: erro de codificaci�n da lista de par�metros +-�rpcgen: demasiadas definici�ns +-�rpcinfo: o servidor %s � desco�ecido +-�rpcinfo: o servicio %s � desco�ecido +-�rpcinfo: Non se puido borra-lo rexistro do prog %s versi�n %s +-�rpcinfo: fallou a multidifusi�n: %s +-�rpcinfo: non se pode contactar co portmapper�o mesmo nome de regra aparece en varios ficheiros�lectura demasiado curta ao le-la clave de petici�n: %s�lectura demasiado curta ao le-la petici�n: %s�escritura demasiado curta en %s: %s�socket: fallo do protocolo no establecemento do circuito +-�as direcci�ns de ordenaci�n `forward' e `backward' son mutuamente exclu�ntes�a especificaci�n do peso na ordenaci�n do s�mbolo de ordenaci�n non ten sentido�entrada est�ndar�sa�da est�ndar�a data de comezo � ilegal na cadea %d no campo `era' da categor�a `%s'�o ano de comezo � maior c� ano final�o ano de comezo � demasiado grande para ser representado�o ano de comezo � demasiado pequeno para ser representado�a data de finalizaci�n � ilegal na cadea %d no campo `era' da categor�a `%s'�svc_run: - fallou a chamada a select�svc_tcp.c - non se pode chamar a getsockname ou listen�svc_tcp.c - problema ao crear un socket tcp�svc_tcp: makefd_xprt: memoria esgotada +-�svc_unix.c - problema ao crear un socket AF_UNIX�svc_unix.c - non se pode chamar a getsockname ou listen�svc_unix: makefd_xprt: memoria esgotada +-�svctcp_create: memoria esgotada +-�svcudp_create - non se pode chamar a getsockname�svcudp_create: memoria esgotada +-�svcudp_create: problema ao crear un socket�svcunix_create: memoria esgotada +-�o s�mbolo do elemento de ordenaci�n multicar�cter `%.*s' duplica a definici�n dun elemento�o s�mbolo do elemento de ordenaci�n multicar�cter `%.*s' duplica a definici�n doutro s�mbolo�o s�mbolo do elemento de ordenaci�n multicar�cter `%.*s' duplica a definici�n dun s�mbolo�o s�mbolo do elemento de ordenaci�n multicar�cter `%.*s' duplica un nome simb�lico no conxunto de caracteres�erro de sintaxe na definici�n %s: %s�erro de sintaxe na directiva `order_start'�erro de sintaxe na definici�n da clase de caracteres�erro de sintaxe na definici�n de conversi�n de caracteres�erro de sintaxe na definici�n de ordenaci�n�erro de sintaxe na definici�n de ordenaci�n�erro de sintaxe na definici�n da categor�a LC_CTYPE�erro de sintaxe na definici�n da nova clase de caracteres�erro de sintaxe na definici�n dun novo mapa de caracteres�erro de sintaxe na definici�n do locale de mensaxes�erro de sintaxe na definici�n do locale monetario�erro de sintaxe na definici�n do locale num�rico�erro de sintaxe na especificaci�n de orde�erro de sintaxe no pr�logo: %s�erro de sintaxe na definici�n do mapa de repertorio: %s�erro de sintaxe na definici�n do locale de data/hora�erro de sintaxe: non est� dentro dunha secci�n de definici�n de locale�a codificaci�n do destino non foi especificada usando `-t'�esta � a primeira definici�n�tempo antes de cero�desbordamento de tempo�demasiados poucos bytes na codificaci�n de caracteres�demasiados bytes na codificaci�n de caracteres�demasiadas clases de caracteres definidas�demasiados segundos de compensaci�n�demasiados tipos de hora local�!�demasiadas transici�ns?!�demasiados pesos�demasiadas abreviaturas de fuso horario, ou demasiado longas�lixo na fin da li�a�problemas ao respostar ao prog %d +-�non se permiten d�as li�as nunha fila contendo `...'�ano �nico con tipo�non se pode reservar espacio para o buffer de entrada�non se pode libera-los par�metros�non definido�car�cter `%s' desco�ecido�car�cter desco�ecido no campo `%s' da categor�a `%s'�directiva de ordenaci�n desco�ecida�directiva `%s' desco�ecida: li�a ignorada�erro %d de iconv() desco�ecido�conxunto `%s' desco�ecido�s�mbolo `%.*s' desco�ecido: li�a ignorada�fuso sen regras�mensaxe non rematada�cadea non rematada�constante de cadea non rematada�nome simb�lico non rematado�nome de peso non rematado�o l�mite superior do rango non � menor c� l�mite inferior�uso: %s ficheiro-de-entrada +-�uso do 29 de febreiro nun ano non bisesto�o valor de %s debe ser un enteiro�o valor de <%s> debe caer entre 1 e 4�o valor do campo `%s' da categor�a `%s' non debe ser unha cadea baleira�o valor de <mb_cur_max> debe ser maior c� valor de <mb_cur_min>�o valor do campo `int_curr_symbol' da categor�a `LC_MONETARY' non corresponde a un nome v�lido en ISO 4217�o valor do campo `int_curr_symbol' da categor�a `LC_MONETARY' ten unha lonxitude incorrecta�os valores do campo `%s' da categor�a `%s' deben ser menores que 127�aviso: �ao aceptar unha conexi�n: %s�ao reservar espacio para a entrada de cach��ao reservar espacio para a entrada da t�boa hash�ao reservar espacio para a copia da clave�ao abrir un antigo ficheiro de cat�logo�ao prepara-la sa�da�ao le-la base de datos�ao avalia-lo ficheiro de datos de perf�s�ao escribir no ficheiro de bases de datos�escritura incompleta�escribible por algu�n distinto do propietario�n�mero de par�metros incorrecto�n�mero de campos na li�a Leap incorrecto�n�mero de campos na li�a Link incorrecto�n�mero de campos na li�a Rule incorrecto�n�mero de campos na li�a de continuaci�n de Zone incorrecto�n�mero de campos na li�a Zone incorrecto�xdr_reference: memoria esgotada +-�xdrrec_create: memoria esgotada +-�yp_update: non se pode converti-lo servidor a nome de rede +-�yp_update: non se pode obte-lo enderezo do servidor +-� +\ No newline at end of file +diff -Naur ../glibc-2.1.3/po/it.mo glibc-2.1.3/po/it.mo +--- ../glibc-2.1.3/po/it.mo 2000-02-24 18:13:10.000000000 -0800 ++++ glibc-2.1.3/po/it.mo 1969-12-31 16:00:00.000000000 -0800 +@@ -1,514 +0,0 @@ +-���������������'���=������XR�����YR�����lR��M���R��E����R��&���S��(���:S�����cS�����tS������S������S������S������S������S������S��n�� +-T�����yU������U��"����U��"����U������U��:����U�����:V�����CV�����LV�����bV�����yV������V������V������V������V������V�����W�����.W�����HW�����eW�����}W������W������W������W������W������W��3����W��3���X��4���KX��.����X��%����X������X��&����X��%���Y�����6Y��%���MY��3���sY��,����Y��)����Y������Y��"���Z��!���:Z�����\Z�����sZ������Z������Z������Z������Z������Z��*����Z�����*[��&���D[��&���k[��&����[��&����[��&����[�����\�� ���\��$���@\�����e\������\������\��,����\������\��%����\��,���%]��-���R]�� ����]��&����]������]������]�����^����� ^�����;^�����[^������{^��2���_�����8_��"���X_��4���{_������_��#����_�� ����_��=����_�����.`��<���?`�����|`��'����`������`��)����`��(����`�� ��� a�����Aa�����Ca�����Ka��$���\a������a��)����a��(����a��/����a�����b�����+b�����7b�����Lb�����^b�����ub��#����b��=����b��/����b�����c�����0c�� ���Ec�����Sc�����_c�����wc������c������c������c������c������c������c������c�����d�����%d�����2d�����Hd�����_d�� ���kd�����ud�����yd�� ����d��&����d��&����d��-����d��!���e�����=e�����[e�����ye������e��&����e��%����e��0����e��!���.f�����Pf��!���hf��-����f������f��%����f��)����f��'���%g��%���Mg��&���sg������g������g������g������g������g�����h�����+h�����Hh��@���ah��D����h������h������h�����i�� ���(i��=���2i�����pi�������i�����Rj��7���qj��2����j��-����j����� +-k�����k��$���/k�� +-���Tk�����_k�����ek��!���ik������k��#����k������k������k������k�����l�����l�����,l�����Dl�����_l�����sl������l������l��3����l��-����l��2���m�����Dm�����Um�����^m�����em�����um������m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ����m�� ���n�� ���n�� ���n�� ���#n�� ���-n�� ���7n�� ���An�� ���Kn�� ���Un�� ���_n�� ���in�����sn�����|n������n������n������n������n������n������n������n��<����n�����o��$���/o��)���To�� ���~o������o��1����o������o��8����o�����p�����)p�����Fp�����Rp�����hp������p������p������p������p������p������p��"���q�����'q�����@q�����Gq������dq������q�� ���r�����)r�����Dr�����Xr�����ir�� ���}r������r��$����r������r��"����r��%����r��"��� s��"���Cs��%���fs������s������s�� ����s������s��>����s�����t�����t�����t�����(t�����>t��!���Rt�����tt��!����t������t��.����t������t�����u�����u��"���u�����Bu�����Uu�����hu�� ���~u������u��+����u������u������u������u�����v�����+v�����Cv�����_v�����wv������v������v��1����v��$����v�����w�����(w�����Cw�����Xw�����sw������w������w������w������w������w�� +-����w������w������w��2���x�����5x�����Dx�����]x�� ���lx�����zx������x������x������x������x������x��!���y�����'y�����Ey��s���ey������y��*����y�����z�����/z�����@z�����Tz�����ez������z������z������z������z������z������z������z������z��9���{�����<{�����T{�����j{��,����{�� +-����{������{������{������{������{����� |�����$|�����>|�����V|�����u|��+����|��#����|������|������|������|�����}��#���8}�����\}�����|}������}������}������}������}������}������}������}�����~�����#~�����C~�����b~�����|~������~������~������~������~������~���������������:�����J��*���i�������������������������������������� ������������ ���������'���!���?��� ���a��� ���k������y����������S������� ���������� ������>������K������_������p�����������������(����������������������������/������G���-���_����������������� ����������ނ������������������������1������E������N������d������t���.�������������� ���Ń��#���Ӄ��0�������%���(������N������b������x���������������������������ф�������������������������,������K������i������n���������������������������օ������������������������.������H������a������}���!�����������������؆�����������������(������F���"���_����������������������������������ɇ�����ۇ��������-�������-���.���!���\������~��������������������È�����Ԉ��2������#���������B������O���;���c��������������������͉�������������� ������ ���)������J������[������y����������������������������������Ԋ��������������&���������D������Y������n������w���������� ����������ы��$������ ���������������)������?������T������l������t����������������������������������ڌ��*������(��� ������6������C���"���W�������z���������������� ������������$���/��� +-���T������_������n��������� ���*������8���!���L������n������}�����������������"��������������������� +-���������'���-���#���U���6���y��� ������� +-����������ɑ��"���ё��"�������������"���1������T������t����������������� ����������ɒ�����ؒ������������������ ������$������9������K������`������u����������������������������������ӓ��������#������:������ ���N������o����������%��������������"���ה���������!��� ��� ���+���"���L��� ���o���������������������������̕�����ѕ�����֕��������������F���)��� ���p���4���z���.�������-���ޖ��6������8���C���;���|���I����������������������4���+���D���+���p���'����������Ę�������� ����������������������5���&���H���.���o���&����������ř��,���ՙ�����������!���C���=���#�����������������Ě��!�������"������.���%��� ���T���%���u���;�������&���כ���������1���������P������k������w���"��������������'���ǜ��������������.���$������S���"���j���(�������-��������������������!���������;������X������x����������!����������Ҟ��������������9������2���W���6�������+�������?������C���-���8���q���$�������"���Ϡ��!������.���������C������b����������<�������;���ޡ��$���������?������W���*���w���7����������ڢ��"�������������)���/���N���Y���U��������������&������)���C��� ���m������{���+�����������������ޤ������������ +-���"���*���%���M���*���s���*����������ɥ�����ݥ��0����������(������E������d���+�������7�������#������������!���*���$���L���!���q����������&�������%���է��,����������(���%���7���0���]���2��������������.���Ψ���������K������L���b���L��������������+������2���<���2���o���/�������$���Ҫ���������%��� ���-���3���$���a���������������������������ϫ��(������&������!���6������X���F���o����������B���ɬ��B������?���O���<�������7���̭��������������#���:���.���^���0�������0���������������� ������ ������<������Q������e������z���������������������������Я��������#�������5������G���S��� �������#�������5���Ͱ��������������-���'���!���U���(���w���-����������α��'���߱��?������=���G��� �������.������� ���²��9������;������,���Y���*�������#����������ճ��%������A���������W������t���I�������7���۴��3������+���G������s���'�������!����������Ե��.������������C���'���*���k�����������������(�������������1����������)������D���:���`����������)�������*������#���������2���$���R������w����������"����������Ҹ����������� +-������'���>���G����������!������� ���ǹ��(������$���������6���*���L���=���w���H����������������� ���E������&���c���(�������'�������E���ۻ�����!���(���:���'���c���$�������,�������)���ݼ��%���������-���"���K������n���&��������������P���ҽ��U���#���O���y���V���ɾ��!��� ���'���B���*���j���/�������*���ſ��$������/������1���E���/���w���)�������*�������)�������#���&������J���-���e���&�������4�������(����������������5��� ���F���#���T���$���x���"����������������������������������.���������G������g���3��������������#�������������� ������������0���(������Y���$���u�����������������#������������������������ ������������:������U���4���n������������������������'�������B������D���]���j�������K��� ���?���Y��� ���������������������!����������������������:������Q���"���h�������������������������������#�������#������#���8���0���\���#���������������������*�������%������ ��>������_������w���O�������E�������&��� ���(���G������p������������������������ ������������������������ ���w�� �����������������"�������"�������������:���#������^������g������p�������������������������������������� ���������'��� ���D������e��� ����������������������������������� ���������� +-���������:���$���9���_���>�������3�������)���������6���(���R���$���{����������,�������6�������=��� ���4���^����������+�������,�������������!���*���"���L������o������������������������5���������� ���.���#���.���R���.�������.�������.�������������-���$���)���R���!���|�����������������+�������������)���&���+���P���,���|��� �������*�������!�������"���������:������V���$���u���$���������������1���H������z���4�������>�������������+���#��� ���O���D���]����������<�������#�������'���������<���1���H���3���z���)����������������������������-����������'���2���<���2���o���A���������������������"�������"���#���"���F������i���/�������D�������1����������,������>��� ���W������e���!���z�����������������#��������������������#���2������V������u�����������������%�������������� +-������� ��� +-���������#������ ���<���9���J���8�������;�������(�������!���"���!���D������f���+�������0�������8�������:������.���T���"�������/�������A�������*������7���C���1���{���3�������-�������<������'���L������t����������$��������������$�������&���������-���\���L���c���������� ���(���#������L��� +-���f���<���q����������m������&���<���;���c���A�������1����������������,���*���A��� +-���l������w������}���%��������������.������� �������(���������7������L������l����������������������������������������� ���0���$���+���U���<���������������������������� �������%������������� +-���!��� +-���,��� +-���7��� +-���B��� +-���M��� +-���X��� +-���c��� +-���n��� +-���y��� +-������� +-������� +-������� +-������� +-������� +-������� +-������� +-������� +-������� +-������� +-������� +-������� +-������ ������ ������ ���'��� ���1��� ���;��� ���E��� ���O��� ���Y������c���P������,�������*�������,���(��� ���U������c���4���}����������<������� �������0���������F���$���U���.���z����������)�������������������� ���!������B���0���[�����������������������������������g���5�������#���������������������������������'���+���-���S����������+�������/�������+�������+������/���<������l���,���y��� ������� �������>���������������� +-������������%������?���)���S��� ���}���&�������(�������7����������������-������<���'���K������s�������������������������������:���������� ���#���5���)���Y���!�������"�������"�����������������������(���#���;���3���_���*����������������������������#������!���A������c������s������������������������ +-���������������������:����������������1������M������_������y���%������� ���������������������0������*���9������d������~���m�������������6������#���O������s������������������������������������������������������<������P������U������b���L���f���(���������������������5���������H������Z������a���(���n���!����������������������������$��� ������2���6���I���6������� ��������������"�������&������1���+���'���]��� �������$���������������������"���������������0�����G��(���e��1������)������&������$�������6�$���U����z�#���������������%���������#���*�.���N� ���}����������������������������� ��������3����?�)���]���������������������`�����$���<����a� ��������������������$����������$�������3����K����a����|������3���������������"�������;����Z����y�������������������������������4�������:����J�(���\�<�����2���������� �������,����?����Y�#���t������#���������������*��� �&���. ����U ����Z �)���r �#���� ����� �$���� ���� +-���� +-�#���8 +-����\ +-�*���z +-�)���� +-�%���� +-�"���� +-��������3����R����p�*����������1����� �����������,����F����_����u� �����4�����=�����&��� ����9 ����U �"���j ����� �!���� �@���� �1�������7����D�>���[�$����������%����������!���� ���<�'���J����r�,������������������������������ ����%���7�&���]�$��������������� �����&���������1���'����Y�%���r������������������������������������������,����D�(���^������0�����-��������������.��������J����������� +-���������1���� ���Q����[����n����8� ���H����V� ���g���������������������(����� �������� ����&����7�$���M�$���r�=���������� +-����������&�����&���#����J�)���i�"�����&�����#����������������-����A����R����f���������������������������������&����9����L����[����{������"�����9�����&������������=�1���\������-����������2�����.����)���F�-���p�������������������������������"����/���&�m���V� �����C�����0����?���C�B�����;�����:����c���=����������������2�����2��� �,���G �"���t ����� ����� �$���� �"���� ����!�.���'!�;���V!�0����!�����!�3����!�.���"����:"�\���Y"�2����"�7����"�'���!#�)���I#�(���s#�<����#�+����#�'���$�R���-$�4����$�5����$�F����$�*���2%����]%����p%�0����%�(����%�C����%�$���&&�)���K&�?���u&�!����&�-����&�>���'�>���D'�����'�$����'�7����'�2����'�*���2(�%���](�)����(�-����(�$����(�'����)����()�D���H)�A����)�E����)�4���*�O���J*�S����*�F����*�%���5+�$���[+�+����+�9����+�!����+�!���,�"���*,�F���M,�F����,�+����,����-�'���&-�&���N-�K���u-�!����-�/����-����.�7���).�`���a.�e����.����(/�-���H/�,���v/�����/�����/�.����/�#���0����&0����B0�$���]0� ����0�*����0�4����0�5���1����91����O1�@���l1�'����1�����1�"����1�3���2�C���J2�(����2�����2�%����2�����2�-���3�'���C3�9���k3�/����3�2����3����4�1���4�7���I4�D����4� ����4�<����4����5�e���15�`����5�`����5� ���Y6�*���z6�?����6�0����6�6���7�*���M7� ���x7�*����7�2����7�)����7����!8����?8����_8����t8�*����8�.����8�+����8����9�Y���,9�����9�M����9�K����9�B���=:�A����:�=����:�!����;�"���";�%���E;�2���k;�4����;�4����;����<����&<�$���A<����f<����}<�����<�����<�����<�����<�����<����=����=�8���6=�B���o=�E����=�����=�/��� +->�F���:>� ����>�����>�I����>�,����>�/���?�6���O?�����?�,����?�P����?�M���@����c@�M���r@� ����@�>����@�@��� A�2���aA�/����A�"����A�+����A�5���B�P���IB�.����B�"����B�l����B�>���YC�9����C�=����C����D�9���.D�(���hD�����D�;����D�����D�D����D�6���DE����{E�����E�4����E�����E�5����E�!���+F����MF�R���dF�#����F�8����F�;���G�(���PG�)���yG�)����G�����G�(����G�$���H�)���:H����dH�!���{H�&����H�Y����H����I�-���>I�!���lI�8����I�.����I� ����I�6���J�@���NJ�I����J�����J�����J�M����J�'���FK�4���nK�5����K�S����K����-L�1���GL�0���yL�'����L�5����L�2���M�(���;M� ���dM�,����M� ����M�/����M�!���N�b���%N�h����N�`����N�W���RO�.����O�0����O�?��� +-P�D���JP�>����P�5����P�-���Q�E���2Q�D���xQ�G����Q�C���R�B���IR�1����R�"����R�=����R�C���S�I���cS�<����S�����S����T���� T�-���3T�'���aT�#����T�����T�����T�����T�����T�3���U����9U�%���YU�7���U�����U�*����U�"����U����V����(V�9���CV�#���}V�)����V� ����V�����V�)���W����/W����AW����YW����oW�����W�����W�@����W����X�"���X�"���:X�0���]X�Q����X�I����X�n���*Y�Y����Y�J����Y����>Z����KZ����iZ�!����Z�����Z�$����Z�����Z�����Z�)���[����>[����][�)���n[�����[�'����[�'����[�'���\�8���.\�'���g\� ����\� ����\�4����\�7���]������������:��c���������������� +-�����������}�������������H��8�� ���������������1����������������������C��������������������������������� ���������V�������������R���������V��z����������������������a������m��������������+��������� +-���������������� ������� ��k�����������O��F���������������������8������M��D�����N��f��4����A���r�����������������������������X����������������������q�������������v��5������Q��V���\���F���B���������������������|�������������4������������������>����������������������$��]�����$�����������������������I��J���C��h������q��������������\��u������"��M�������������������������������������h�����M���]�����������������������p��s��G��������������������N��������e��@������������������������w����������������<���_������B�����������������������������������������������v�����=���G����������������������G������)��)������� ��1��&���������@���������������������P������6������3��L������������W��<�����������������!���7��������������������������U���������.��������r����������S���������������:��������<��g�����������s�������������"�������������������������������0��A��4����������#��������������E��u�����������a���������Q���������9��~��`��X��������5�����������`��c�������2�����4�����������������&�����������������������(��9��������������>�������������������K���������{��������/��[�������������������������+������������h���������!��������l��<����������������������A��g���������� �������������������������N������������B���������X�����������������������������������������6�����*��o���������������������������������R������-���I����������������������a�����������9��:�������������������������8�������������������e�������������������������Z���i���������������(������6������������(������������������������������������������S�����>�����,��i����������������������������w������f����������@������F��������y��0������J�������������������������n���������������|������������������������m��;��X���p��x��-��5������%��w������H���:�����������������������1���#�������7�����������������W�����������������?������������������������/��a����[��������T�������F����D�������3����������k����������'��E��r��}��~����,���������*�����n������W��������9�������������'������.������C�������������0�����O��������\����2���f��^����������������b���������3�������������%��-��#��\��j�������v����������������2������e�����������u��;��y�������������������������=�����k�������n�������������������������O�������������]����t���L������D������������d�����z����������������������P�����i�����t��������)����P��������"�������� �����=�������������������������R�����f�������������������[���Z���������?�����Z��D��������T���������������������������������������������������������{������k��������������������������������������������T���������_�������������������������c��������H������������Z��K�����s�����������������������������p��������������]�������������+����������������g����������z����������`��0���o�����������������������B��|������L��%�����������^������p���*��{�������"����������x�������������������Y���������>�������������!�����y��;��U�����@�����������7�����Y��x������������.��������L���������������l�����,���Q���[������h�����������v�������b������������� �����������������Y������������������������������I�������������/�������������5��/�������������������i���K������%��;�������������������_�������������������r������#��1��������������������s����������������������U��8���e����������������m��}������ �������=������2��?��������*���������������u����������������z������������������$������J��^����������� ���c�������$���J������������������I������������t��������������������������������������������&�����m��G�����������S������������������������ +-����������������������������d���o�������������'������������V��E������t��_�������������������������� +-�����������U��������������M�����������x��~�������������������d��A��.������ ����������y�����������������������������������������T��������������������!����������������������������7��g������+���������j�����,�����(������K���b��)���������q��S��3���������������������������������������������������������������W��������������N������������������E������O�������������������������w���������`�������������������������������������o������b���{��|�����6�����q��������&����������������H����������������l����������������}�����������������j��������������������������������������������������C������������d�������������������j������l�������-�����P�������������n��R���������������������������������~�������������������^��Y��� ����������Q��?��������������'���� Access Rights : � Attributes : � %s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile] +-� %s [-n netid]* [-o outfile] [infile] +-� %s [-s nettype]* [-o outfile] [infile] +-� Access rights: � Entry data of type %s +-� Name : %s +-� Public Key : � Type : %s +-� Universal addresses (%u) +-� [%d] Name : %s +-� [%u] - [%u bytes] � +-%s cache: +- +-%15s cache is enabled +-%15Zd suggested size +-%15ld seconds time to live for positive entries +-%15ld seconds time to live for negative entries +-%15ld cache hits on positive entries +-%15ld cache hits on negative entries +-%15ld cache misses on positive entries +-%15ld cache misses on negative entries +-%15ld%% cache hit rate +-%15s check /etc/%s for changes +-� +-Group Members : +-� +-Time to Live : � rpcinfo -b prognum versnum +-� rpcinfo -d prognum versnum +-� rpcinfo -p [ host ] +-� rpcinfo [ -n portnum ] -t host prognum [ versnum ] +-� no� yes� Data Length = %u +-� Explicit members: +-� Explicit nonmembers: +-� Implicit members: +-� Implicit nonmembers: +-� No explicit members +-� No explicit nonmembers +-� No implicit members +-� No implicit nonmembers +-� No recursive members +-� No recursive nonmembers +-� Recursive members: +-� program vers proto port +-� or: � (rule from "%s", line %d)� [OPTION...]� done +-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags. +-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed. +-�%s%s%s:%u: %s%sUnexpected error: %s. +-�%s%sUnknown signal %d +-�%s: %d did not sign extend correctly +-�%s: <mb_cur_max> must be greater than <mb_cur_min> +-�%s: C preprocessor failed with exit code %d +-�%s: C preprocessor failed with signal %d +-�%s: Can't create %s: %s +-�%s: Can't create directory %s: %s +-�%s: Can't link from %s to %s: %s +-�%s: Can't open %s: %s +-�%s: Can't remove %s: %s +-�%s: Can't unlink %s: %s +-�%s: Error closing %s: %s +-�%s: Error reading %s +-�%s: Error writing �%s: Error writing %s +-�%s: Leap line in non leap seconds file %s +-�%s: Memory exhausted: %s +-�%s: More than one -L option specified +-�%s: More than one -d option specified +-�%s: More than one -l option specified +-�%s: More than one -p option specified +-�%s: More than one -y option specified +-�%s: Too many arguments +-�%s: cannot get modification time�%s: command was '%s', result was %d +-�%s: error in state machine�%s: illegal option -- %c +-�%s: invalid option -- %c +-�%s: option `%c%s' doesn't allow an argument +-�%s: option `%s' is ambiguous +-�%s: option `%s' requires an argument +-�%s: option `--%s' doesn't allow an argument +-�%s: option `-W %s' doesn't allow an argument +-�%s: option `-W %s' is ambiguous +-�%s: option requires an argument -- %c +-�%s: output would overwrite %s +-�%s: panic: Invalid l_value %d +-�%s: premature end of file�%s: unable to open %s: %m +-�%s: unrecognized option `%c%s' +-�%s: unrecognized option `--%s' +-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ] +- [ -L leapseconds ] [ -y yearistype ] [ filename ... ] +-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ... +-�%s: while writing output %s: %m�(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object) +-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible +-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]... +-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Address family not supported by protocol family�Advertise error�Alarm clock�Anode table overflow�Arg list too long�Argument list too long�Argument out of domain�Attempt to remove a non-empty table�Attempting to link in more shared libraries than system limit�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT +-�Bad address�Bad exchange descriptor�Bad file descriptor�Bad file number�Bad font file format�Bad message�Bad request code�Bad request descriptor�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data +-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can not exec a shared library directly�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag! +-�Cannot receive reply to broadcast�Cannot register service�Cannot send after socket shutdown�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file! +-�Cannot use netid flag with inetd flag! +-�Cannot use netid flag without TIRPC! +-�Cannot use table flags with newstyle! +-�Channel number out of range�Character Separator : %c +-�Child exited�Client credential too weak�Columns : +-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc. +-This is free software; see the source for copying conditions. There is NO +-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�Cross-device link�DES entry for netname %s not unique +-�DIRECTORY +-�DNANS�DNS�Database for table does not exist�Database is busy�Deadlock situation detected/avoided�Default Access rights : +-�Destination address required�Device busy�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits) +-�Directory : %s +-�Directory not empty�Disc quota exceeded�Disk quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY +-�Encrypted data +-�Entry/table type mismatch�Error 0�Error 100�Error 101�Error 102�Error 103�Error 104�Error 105�Error 106�Error 107�Error 108�Error 109�Error 110�Error 111�Error 112�Error 113�Error 114�Error 115�Error 116�Error 117�Error 118�Error 119�Error 136�Error 142�Error 58�Error 59�Error 72�Error 73�Error 75�Error 76�Error 91�Error 92�Error in RPC subsystem�Error in accessing NIS+ cold start file. Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock�File locking deadlock error�File name too long�File size limit exceeded�File table overflow�File too large�First/next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP +-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group : %s +-�Group Flags :�Group entry for "%s.%s" group: +-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O error�I/O possible�INPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal byte sequence�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid object for operation�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Invalidate the specified cache�Is a directory�Is a name file�Is a named type file�Kerberos. +-�Killed�LINK +-�LOCAL entry for UID %d in directory %s not unique +-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link has been severed�Link number out of range�Link points to illegal name�Linked Object Type : �Linked to : %s +-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server : +-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message tables full�Message too long�Missing or malformed attribute�Mod. Time : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME +-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT +-�NUMBER�Name : `%s' +-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection because of reset�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No record locks available�No remote programs registered. +-�No route to host�No space left on device�No such device�No such device or address�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None. +-�Not a XENIX named type file�Not a data message�Not a directory�Not a name file�Not a stream device�Not available�Not enough space�Not found�Not found, no such name�Not master server for this domain�Not owner�Not supported�Number of Columns : %d +-�Number of objects : %u +-�Number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS�Numerical argument out of domain�Numerical result out of range�Object #%d: +-�Object Name : %s +-�Object Type : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation canceled�Operation not applicable�Operation not permitted�Operation not supported�Operation not supported on transport endpoint�Operation now in progress�Operation would block�Option not supported by protocol�Out of stream resources�Out of streams resources�Output control:�Output selection:�Owner : %s +-�PRIVATE +-�Package not installed�Parse error: %s�Partial success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits) +-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate : +-�Report bugs to %s. +-�Report bugs using the `glibcbug' script to <bugs@gnu.org>. +-�Request arguments bad�Reserved for future use�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Result too large�Results sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path : %s +-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root +-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status : %s +-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%s�TABLE�TABLE +-�TABLE,yes�Table Type : %s +-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known. This does +-not necessarily mean that all combinations of these names can be used for +-the FROM and TO command line parameters. One coded character set can be +-listed with several different names (aliases). +- Some of the names are no plain strings but instead regular expressions and +-they match a variety of names which can be given as parameters to the +-program. +- +- �Time to live : �Timer expired�Too many attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information. +-�Trying %s... +-�Type : %s +-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d) +-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s +-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname] +-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-�Use separate cache for each user�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s. +-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�__get_myaddress: ioctl (get interface configuration)�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory +-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice +-�bogus mcheck_status, library is buggy +-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d +-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s +-�cannot find any C preprocessor (cpp) +-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character '%s' in class `%s' must be in class `%s'�character '%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character L'%s' (index %Zd) in class `%s' must be in class `%s'�character L'%s' (index %Zd) in class `%s' must not be in class `%s'�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory +-�clntudp_create: out of memory +-�clntunix_create: out of memory +-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server +-�couldn't register prog %d vers %d +-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error getting callers id: %s�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' undefined�file `%s' already exists and may be overwritten +-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :`%s' +-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block +-�memory clobbered past end of allocated block +-�memory exhausted�memory is consistent, library is buggy +-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s +-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in `%s'.�netname2user: principal name `%s' too long�netname2user: should not have uid 0�never registered prog %d +-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration: +- +-%15d server debug level +-�nscd not running! +-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup +-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available +-�program %lu version %lu is not available +-�program %lu version %lu ready and waiting +-�rcmd: poll (setting up stderr): %m +-�rcmd: socket: All ports in use +-�rcmd: write (setting up stderr): %m +-�registerrpc: out of memory +-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error +-�rpcgen: too many defines +-�rpcinfo: %s is unknown host +-�rpcinfo: %s is unknown service +-�rpcinfo: Could not delete registration for prog %s version %s +-�rpcinfo: broadcast failed: %s +-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup +-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory +-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory +-�svctcp_create: out of memory +-�svcudp_create - cannot getsockname�svcudp_create: out of memory +-�svcudp_create: socket creation problem�svcunix_create: out of memory +-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d +-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage: %s infile +-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�warning: �while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory +-�xdrrec_create: out of memory +-�yp_update: cannot convert host to netname +-�yp_update: cannot get server address +-�Project-Id-Version: libc 2.1.3 +-POT-Creation-Date: 2000-02-16 10:39-0800 +-PO-Revision-Date: 2000-02-20 22:17+01:00 +-Last-Translator: Marco d'Itri <md@linux.it> +-Language-Team: Italian <it@li.org> +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=ISO-8859-1 +-Content-Transfer-Encoding: 8-bit +-� Diritti di Accesso : � Attributi : � %s [-abkCLNTM][-Dnome[=valore]] [-i dimes] [-I [-K secondi]] [-Y path] infile +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile] +-� %s [-n netid]* [-o outfile] [infile] +-� %s [-s nettype]* [-o outfile] [infile] +-� Diritti di accesso: � Dati della voce di tipo %s +-� Nome : %s +-� Chiave pubblica : � Tipo : %s +-� Indirizzi universali (%u) +-� [%d] Nome : %s +-� [%u] - [%u byte] � +-cache %s: +- +-%15s la cache � abilitata +-%15Zd dimensioni suggerite +-%15ld secondi di vita per le voci positive +-%15ld secondi di vita per le voci negative +-%15ld cache hit sulle voci positive +-%15ld cache hit sulle voci negative +-%15ld cache miss sulle voci positive +-%15ld cache miss sulle voci negative +-%15ld%% hit rate della cache +-%15s controlla i cambiamenti di /etc/%s +-� +-Membri del gruppo : +-� +-Tempo da vivere: � rpcinfo -b prognum versnum +-� rpcinfo -d prognum versnum +-� rpcinfo -p [ host ] +-� rpcinfo [ -n portnum ] -t host prognum [ versnum ] +-� no� si�Lunghezza dati = %u +-� Membri espliciti: +-� Non-membri espliciti: +-� Membri impliciti: +-� Non-membri impliciti: +-� Nessun membro esplicito +-� Nessun non-membro esplicito +-� Nessun membro implicito +-� Nessun non-membro implicito +-� Nessun membro ricorsivo +-� Nessun non-membro ricorsivo +-� Membri ricorsivi: +-� programma vers proto porta +-� o: � (regola da "%s", riga %d)� [OPZIONE...]� fatto +-�"%s", riga %d: %s�La riga "Zone %s" e l'opzione -l sono mutuamente esclusive�La riga Zone %s" e l'opzione -p sono mutuamente esclusive�"infile" � necessario per i flag di generazione del template. +-�%.*s: Il parametro ARGP_HELP_FMT richiede un valore�%.*s: Parametro ARGP_HELP_FMT sconosciuto�%s in una zona senza regole�%s%s%s:%u: %s%sAsserzione `%s' fallita. +-�%s%s%s:%u: %s%sErrore inatteso: %s. +-�%s%sSegnale %d sconosciuto +-�%s: %d non ha esteso correttamente il segno +-�%s: <mb_cur_max> deve essere maggiore di <mb_cur_min> +-�%s: il preprocessore C ha fallito con il codice di uscita %d +-�%s: il preprocessore C ha fallito con il segnale %d +-�%s: Impossibile creare %s: %s +-�%s: Impossibile creare la directory %s: %s +-�%s: Impossibile fare un link da %s a %s: %s +-�%s: Impossibile aprire %s: %s +-�%s: Impossibile rimuovere %s: %s +-�%s: Impossibile cancellare %s: %s +-�%s: Errore chiudendo %s: %s +-�%s: Errore leggendo %s +-�%s: Errore scrivendo �%s: Errore scrivendo %s +-�%s: riga leap nel file non di secondi intercalari %s +-�%s: Memoria esaurita: %s +-�%s: � stata specificata pi� di una opzione -L +-�%s: � stata specificata pi� di una opzione -d +-�%s: � stata specificata pi� di una opzione -l +-�%s: � stata specificata pi� di una opzione -p +-�%s: � stata specificata pi� di una opzione -y +-�%s: Troppi argomenti +-�%s: impossibile ottenere l'orario di modifica�%s: il comando era '%s', il risultato %d +-�%s: errore nella macchina a stati�%s: opzione non permessa -- %c +-�%s: opzione non valida -- %c +-�%s: l'opzione `%c%s' non accetta argomenti +-�%s: l'opzione `%s' � ambigua +-�%s: l'opzione `%s' richiede un argomento +-�%s: l'opzione `--%s' non accetta argomenti +-�%s: l'opzione `-W %s' non accetta argomenti +-�%s: l'opzione `-W %s' � ambigua +-�%s: l'opzione richiede un argomento -- %c +-�%s: l'output sovrascriverebbe %s +-�%s: panico: l_value %d non valido +-�%s: fine del file prematura�%s: impossibile aprire %s: %m +-�%s: opzione `%c%s' non riconosciuta +-�%s: opzione `--%s' non riconosciuta +-�%s: l'uso � %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] +- [ -d directory ] [ -L leapseconds ] [ -y yearistype ] [ nomefile ... ] +-�%s: l'uso � %s [ -v ] [ -c cutoff ] nomezona ... +-�%s: scrivendo l'output %s: %m�(ERRORE DEL PROGRAMMA) Nessuna versione conosciuta!?�(PROGRAM ERROR) L'opzione avrebbe dovuto essere riconosciuta!?�(Oggetto sconosciuto) +-�(errore di autenticazione sconosciuto - %d)�(sconosciuto)�*** Il file `%s' � stripped: impossibile fare l'analisi dettagliata +-�*standard input*�-o FILE-OUTPUT [FILE-INPUT]... +-[FILE-OUTPUT [FILE-INPUT]...]�sezione .lib nell'a.out danneggiata�; low version = %lu, high version = %lu�; motivo = �<%s> e <%s> non sono nomi leciti per l'intervallo�Il carattere <SP> non deve essere nella classe `%s'�Il carattere <SP> non � nella classe `%s'�?�Abortito�Diritti di Accesso : �Accesso ad una libreria condivisa danneggiata�Indirizzo gi� in uso�Famiglia dell'indirizzo non gestita per l'hostname�Famiglia dell'indirizzo non gestita dal protocollo�Famiglia dell'indirizzo non gestita dalla famiglia del protocollo�Advertise error�Alarm clock�Overflow della tabella degli anode�Lista degli argomenti troppo lunga�Lista degli argomenti troppo lunga�Argomento fuori dal dominio�Si � tentato di rimuovere una tabella non vuota�Si � tentato di linkare pi� librerie condivise del limite di sistema�Si � tentato di linkare troppe librerie condivise�Autenticazione OK�Errore di autenticazione�BOGUS OBJECT +-�Indirizzo non valido�Descrittore di scambio non valido�Descrittore di file non valido�Descrittore di file non valido�Formato del file di font non valido�Messaggio non valido�Codice di richiesta non valido�Descrittore di richiesta non valido�Chiamata di sistema non valida�Valore di ai_flags non valido�Conformit� POSIX rigorosa�Dati binari +-�� necessario un dispositivo a blocchi�Problema di poll del broadcast�Pipe rotta�Bus error�CDS�Superato il limite del tempo di CPU�Cache scaduta�Impossibile accedere ad una libreria condivisa necessaria�Impossibile eseguire direttamente una libreria condivisa�Impossibile fare il bind al server che serve questo dominio�Impossibile comunicare con il portmapper�Impossibile comunicare con ypbind�Impossibile comunicare con ypserv�Impossibile allocare memoria�Impossibile assegnare l'indirizzo richiesto�Impossibile creare il socket per l'rpc broadcast�Impossibile eseguire direttamente una libreria condivisa�Impossibile avere pi� di un flag di generazione del file! +-�Impossibile ricevere una risposta al broadcast�Impossibile registrare il servizio�Impossibile inviare dopo lo shutdown del socket�Impossibile inviare dopo lo shutdown dell'estremit� del trasporto�Impossibile inviare il pacchetto broadcast�Impossibile impostare l'opzione del socket SO_BROADCAST�Impossibile specificare pi� di un file di input! +-�Impossibile usare il flag netid con il flag inetd! +-�Impossibile usare il flag netid senza TIRPC! +-�Impossibile usare il flag della tabella con il nuovo stile! +-�Numero del canale fuori dall'intervallo�Separatore dei caratteri: %c +-�Il figlio � uscito�Credenziale del client troppo debole�Colonne: : +-�Errore di comunicazione durante send�Compila la specifica di localizzazione�Il computer ha tirato le cuoia�Calcolo le dimensioni della tabella per le classi di caratteri. +-Pu� essere una cosa lunga...�Calcolo le dimensioni della tabella per le informazioni di collazione. +-Pu� essere una cosa lunga...�Connessione rifiutata�Connessione abbattuta dal corrispondente�Timeout della connessione�Continuato�Converte in un'altra codifica la codifica dei file indicati.�Converte la chiave in minuscolo�Copyright (C) %s Free Software Foundation, Inc. +-This is free software; see the source for copying conditions. There is NO +-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-Questo � software libero; si veda il sorgente per le condizioni di copiatura. +-NON c'� alcuna garanzia; neppure di COMMERCIABILIT� o IDONEIT� AD UN +-PARTICOLARE SCOPO. +-�impossibile creare il file di log "%s"�Crea un header C NOME contenente le definizioni dei simboli�Crea l'output anche se sono stati emessi messaggi di avvertimento�Crea un semplice database DB dall'input testuale.�Orario di creazione : %s�Link tra dispositivi�La voce DES per il netname %s non � unica +-�DIRECTORY +-�DNANS�DNS�Non esiste un database per la tabella�Il database � occupato�Individuata/evitata una situazione di deadlock�Diritti di accesso predefiniti: +-�� necessario l'indirizzo di destinazione�Dispositivo occupato�Il dispositivo non � uno stream�Dispositivo non configurato�Dispositivo o risorsa occupata�Diffie-Hellmann (%d bit) +-�Directory : %s +-�La directory non � vuota�Superata la quota di disco�Superata la quota di disco�Non fa fork e stampa i messaggi sul tty corrente�Non stampa messaggi mentre crea il database�Non usa il catalogo esistente, forza un nuovo file di output�Dominio non collegato�trap EMT�ENTRY +-�Dati cifrati +-�I tipi di voce/tabella non coincidono�Errore 0�Errore 100�Errore 101�Errore 102�Errore 103�Errore 104�Errore 105�Errore 106�Errore 107�Errore 108�Errore 108�Errore 110�Errore 111�Errore 112�Errore 113�Errore 114�Errore 115�Errore 116�Errore 117�Errore 118�Errore 119�Errore 136�Errore 142�Errore 58�Errore 59�Errore 72�Errore 73�Errore 75�Errore 76�Errore 91�Errore 92�Errore nel sottosistema RPC�Errore nell'accesso al file per la partenza a freddo di NIS+. +-NIS+ � installato?�Errore in un sistema di errore sconosciuto: �Errore parlando alla procedura di callback�Errore: il file .netrc � leggibile da altri.�Scambio pieno�Errore di formato di exec�FATALE: il sistema non definisce `_POSIX2_LOCALEDEF'�FILE�FILE contiene la mappatura dai nomi simbolici ai valori UCS4�Fallito (errore non specificato)�Il descrittore di file � in uno stato non valido�Il file esiste�Deadlock durante il locking del file�Errore di deadlock durante il locking del file�Nome del file troppo lungo�Superato il limite di dimensione del file�Overflow della tabella dei file�File troppo grande�La prima/prossima catena � rotta�Errore di virgola mobile�� necessario un resync completo per la directory�Funzione non implementata�GRUPPO +-�Spazzatura in ARGP_HELP_FMT: %s�Genera un catalogo di messaggi.\vSe INPUT-FILE � -, l'input � letto dallo standard input. Se OUTPUT-FILE +-� -, l'output � scritto sullo standard output. +-�Errore di sistema generico�Legge le informazioni specifiche alla localizzazione.�D� un breve messaggio di istruzioni�D� questa lista di aiuto�Errore gratuito�Gruppo : %s +-�Flag del gruppo: �Voce del gruppo per il gruppo "%s.%s": +-�Si blocca per SECS secondi (predefiniti 3600)�Hangup�Non ho trovato "%d" nella cache dei gruppi!�Non ho trovato "%d" nella cache delle password!�Non ho trovato "%s" nella cache dei gruppi!�Non ho trovato "%s" nella cache degli host!�Non ho trovato "%s" nella cache delle password!�L'host � gi��Errore durante la ricerca del nome dell'host�Errore di I/O�I/O possibile�INPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILE�trap IOT�IVY�Identificatore rimosso�Sequenza di byte illecita�Istruzione illecita�Tipo di oggetto illecito per l'operazione�Seek illecito�Tipo di file o formato non appropriato�IOCTL non appropriata per il dispositivo�Operazione non appropriata per un processo sullo sfondo�Richiesta di informazioni�Informazioni: �File di input:�Specifiche del formato di input/output:�Errore di input/output�Errore interno di NIS�Errore interno di ypbind�Interruzione�Chiamata di sistema interrotta�La chiamata di sistema interrotta deve essere ricominciata�Argomento non valido�Riferimento all'indietro non valido�Nome della classe di caratteri non valido�Credenziali del client non valide�Verificatore del client non valido�Carattere di collazione non valido�Contenuto di \{\} non valido�Link tra dispositivi non valido�Scambio non valido�Oggetto non valido per l'operazione�Carattere largo o multibyte non valido o incompleto�Espressione regolare precedente non valida�Fine dell'intervallo non valida�Espressione regolare non valida�Codice di richiesta non valido�Descrittore di richiesta non valido�Verificatore di server non valido�Slot non valido�Invalida la cache indicata�� una directory�� un file con nome�� un tipo di file con nome�Kerberos. +-�Ucciso�LINK +-�La voce LOCAL per l'UID %d nella directory %s non � unica +-�Livello 2 fermato�Livello 2 non sincronizzato�Livello 3 fermato�Livello 3 reinizializzato�Il link � stato tagliato�Numero del link fuori dall'intervallo�Il link punta a un nome illecito�Tipo di oggetto collegato : �Collegato a : %s +-�Il nome del dominio locale non � stato impostato�Errore di allocazione delle risorse locali�La macchina non � in rete�Nome malformato o illecito�Gli argomenti obbligatori o opzionali delle opzioni lunghe lo sono anche +-per le corrispondenti opzioni corte.�Master Server : +-�Il master server � occupato, dump integrale rimandato.�Errore di allocazione della memoria�Memoria esaurita�Tabelle dei messaggi piene�Messaggio troppo lungo�Attributo mancante o malformato�Orario di modifica: %s�Modifica fallita�Operazione di modifica fallita�Modifica il formato di output:�Tentato un multihop�NOME�NOME +-[-a|-m]�NIS�versioni di client/server NIS incompatibili - non si pu� fornire il servizio�Il database della mappa NIS non � valido�Operazione NIS+ fallita�Server NIS+ non raggiungibile�Il servizio NIS+ non � disponibile o non � installato�OGGETTO MANCANTE +-�NUMERO�Nome : `%s' +-�Demone di caching del servizio dei nomi.�Nome non servito da questo server�Il nome non � unico sulla rete�Nome o servizio sconosciuto�Il nome/voce non � unico�L'oggetto indicato non � ricercabile�Serve un autenticatore�La rete ha lasciato cadere la connessione per il reset�La rete ha lasciato cadere la connessione per il reset�La rete � gi��La rete non � raggiungibile�La struttura CSI non � disponibile�Non ci sono semafori XENIX disponibili�Non ci sono indirizzi associati al nome dell'host�Non ci sono indirizzi associati al nome�Manca l'anode�Non c'� spazio di buffer disponibile�Non ci sono processi figli�Non ci sono dati disponibili�Non c'� spazio per file sul server�Non ci sono lock disponibili�Nessuna corrispondenza�Non � stato trovato un medium�Non ci sono messaggi del tipo desiderato�Non ci sono altri record nel database della mappa�Manca una precedente espressione regolare�Non ci sono lock di record disponibili�Nessun programma remoto registrato. +-�Non c'� una route verso l'host�Non � rimasto spazio sul dispositivo�Dispositivo inesistente�Dispositivo o indirizzo inesistente�File o directory inesistente�La chiave non � nella mappa�La mappa non � nel dominio del server�Processo inesistente�Incontrato un namespace non di NIS+�Errore irreparabile nella risoluzione dei nomi�Nessuno. +-�Non � un file con nome di XENIX�Non � un messaggio di dati�Non � una directory�Non � un file con nome�Non � un dispositivo stream�Non disponibile�Non c'� abbastanza spazio�Non trovato�Non trovato, nome inesistente�Non � un server master per questo dominio�Non � il proprietario�Non gestito�Numero di Colonne : %d +-�Numero di oggetti : %u +-�Il numero di link simbolici incontrati durante l'attraversamento del percorso eccede MAXSYMLINKS�Argomento numerico fuori dal dominio�Risultato numerico fuori scala�Oggetto #%d: +-�Nome dell'oggetto: %s +-�Tipo dell'oggetto: �L'oggetto � remoto�Esiste un oggetto con lo stesso nome�Numero dispari di virgolette�Solo root puo` usare questa opzione!�Operazione gi� in corso�Operazione cancellata�Operazione non applicabile�Operazione non permessa�Operazione non gestita�Operazione non gestita dall'estremit� del trasporto�L'operazione ora � in corso�L'operazione si bloccherebbe�Opzione non gestita dal protocollo�Risorse degli streams esaurite�Risorse degli streams esaurite�Controllo dell'output:�Selezione dell'output:�Proprietario : %s +-�PRIVATO +-�Pacchetto non installato�Errore di parsing: %s�Successo parziale�L'oggetto passato non � lo stesso oggetto sul server�Permesso negato�Manca la corrente�Fine prematura dell'espressione regolare�Stampa il contenuto del file del database, una voce per riga�Stampa le statistiche della configurazione attuale�Stampa altri messaggi�Stampa la versione del programma�Probabile successo�Probabilmente non trovato�Timer di profiling scaduto�Driver del protocollo non collegato�Errore di protocollo�Famiglia del protocollo non gestita�Protocollo non disponibile�Protocollo non gestito�Tipo di protocollo sbagliato per il socket�Query illecita per la tabella indicata�Quit�Errore specifico di RFS�Procedura RPC non valida per il programma�Errore di RPC su una operazione NIS�Programma RPC non disponibile�Versione sbagliata del programma RPC�La struct RPC non � valida�Versione di RPC sbagliata�RPC: (codice di errore sconosciuto)�RPC: Errore di autenticazione�RPC: Impossibile decodificare il risultato�RPC: Impossibile codificare gli argomenti�RPC: Fallito (errore non specificato)�RPC: Versioni di RPC incompatibili�RPC: Errore del portmapper�RPC: Procedura non disponibile�RPC: Programma non registrato�RPC: Programma non disponibile�RPC: Programma/versione non corrispondenti�RPC: Errore del sistema remoto�RPC: Il server non pu� decodificare gli argomenti�RPC: Successo�RPC: Tempo scaduto�RPC: Impossibile ricevere�RPC: Impossibile inviare�RPC: Host sconosciuto�RPC: Protocollo sconosciuto�RSA (%d bit) +-�RTLD_NEXT usato in codice non caricato dinamicamente�Legge e mostra i dati di profilazione degli oggetti condivisi�Legge i dati di configurazione da NOME�File system di sola lettura�Segnale real-time %d�Espressione regolare troppo grande�Errore di I/O remoto�� cambiato l'indirizzo del remoto�Rimuovere la password o rendere il file illeggibile dagli altri.�Fallita la riapertura dell'oggetto condiviso `%s'�Replica : +-�Segnalare i bug a %s. +-�Segnalare i bug a <bugs@gnu.org> usando lo script `glibcbug'. +-�Argomenti della richiesta non validi�Riservato per usi futuri�Errore 0 del resolver (nessun errore)�Errore interno del resolver�Evitato un deadlock sulle risorse�Risorsa persa�Risorsa temporaneamente non disponibile�Risultato troppo grande�Risultati inviati alla procedura di callback�SHOBJ [PROFDATA]�SUNYP�Percorso di ricerca : %s +-�Segmentation fault�Server occupato, riprovare�Il server ha esaurito la memoria�Il server ha rifiutato le credenziali�Il server ha rifiutato il verificatore�Servname non gestito per ai_socktype�Imposta il nome del programma�Disattiva il server�Segnale 0�Operazione per socket su un non socket�Tipo di socket non gestito�Il programma ha causato la fine della connessione�Spiacente, non sei root +-�Le definizioni sorgente sono nel FILE�Errore di srmount�Stack fault�Vecchio file handle NFS�Lancia NUMERO thread�Stato : %s +-�Fermato�Fermato (segnale)�Fermato (input da tty)�Fermato (output da tty)�Errore di pipe di streams�La struttura ha bisogno di essere pulita�Successo�Sopprime messaggi di avvertimento e informazione�Nomi simbolici dei caratteri definiti in FILE�Errore di sistema�Informazioni sul sistema:�Errore di allocazione delle risorse di sistema�Directory di sistema per le mappe dei caratteri: %s +- repertoire maps : %s +- percorso di localizzazione: %s +-%s�TABELLA�TABELLA +-�TABELLA,si�Tipo di tabella : %s +-�Errore temporaneo durante la risoluzione del nome�Terminato�File text occupato�La seguente lista contiene tutti i set di caratteri codificati noti. Questo +-non significa necessariamente che tutte le combinazioni di questi nomi possono +-essere usate per i parametri di linea di comando FROM e TO. Un set di +-caratteri codificato pu� essere elencato con diversi nomi diversi (alias). +-Alcuni nomi non sono semplici stringhe ma espressioni regolari e corrispondono +-a una variet� di nomi che possono essere dati come parametri al programma. +- +- �Tempo di vita: �Timer scaduto�Troppi attributi�Troppi livelli di link simbolici�Troppi link�Troppi file aperti�Troppi file aperti nel sistema�Troppi processi�Troppi riferimenti: impossibile dividere�Troppi utenti�Trap di trace/breakpoint�Backslash finale�Il traduttore � morto�Estremit� del trasporto gi� connesso�Estremit� del trasporto non connesso�Usare `%s --help' o `%s --usage' per ulteriori informazioni. +-�Proviamo %s... +-�Tipo : %s +-�SCONOSCIUTO�Impossibile autenticare il client NIS+�Impossibile autenticare il server NIS+�Impossibile creare il callback�Impossibile creare il processo sul server�Sconosciuto (tipo = %d, bit = %d) +-�Parola chiave di .netrc sconosciuta %s�Codice di errore di NIS sconosciuto�Databae sconosciuto: %s +-�Errore sconosciuto�Errore sconosciuto �Host sconosciuto�Oggetto sconosciuto�Opzione sconosciuta: %s %s %s�Errore conosciuto del resolver�Errore sconosciuto del server�Segnale %d sconosciuto�Errore di sistema sconosciuto�Errore sconosciuto di ypbind�( o \( sbilanciato�) o \) sbilanciato�[ o [^ sbilanciato�\{ sbilanciato�Variabile `%s' non riconosciuta�Condizione di I/O urgente�Uso:�Uso: %s nome_variabile [percorso] +-�Uso: rpcinfo [ -n numporta ] -u host numprog [ numvers ] +-�Usa una cache separata per ogni utente�Segnale 1 definito dall'utente�Segnale 2 definito dall'utente�Valore troppo grande per il tipo di dato definito�Virtual timer expired�Risultato assurdo dall'esecuzione del comando�Finestra cambiata�Scrive i nomi delle mappe di caratteri disponibili�Scrive i nomi delle localizzazioni disponibili�Scrive i nomi delle categorie selezionate�Scrive i nomi delle parole chiave selezionate�Scrive l'output nel file NOME�Scritto da %s. +-�Tipo di medium errato�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�S�, 42 � il significato della vita�Questa volta hai davvero combinato un pasticcio�Il tempo finale della riga di continuazione della zona +-non � successivo al tempo finale della riga precedente�[FILE...]�__get_myaddress: ioctl (ottiene la configurazione dell'interfaccia)�la definizione `%1$s' non finisce con `END %1$s'�`%s' non � un file con i dati di profilazione corretti per `%s'�`-1' deve essere l'ultima voce del campo `%s' nella categoria `%s'�`...' deve essere usata solo nelle voci `...' e `UNDEFINED'�manca `from' dopo il primo argomento a `collating-element'�la stringa `from' nella dichiarazione dell'elemento di collazione +-contiene un carattere sconosciuto�ai_family non gestita�ai_socktype non gestito�gi� in esecuzione�l'argomento di <%s> deve essere un unico carattere�l'argomento di `%s' deve essere un unico carattere�auth_none.c - Problema fatale di marshalling�authunix_create: memoria esaurita +-�argomenti non validi�proprietario non valido�campo FROM vuoto in una riga di Link�campo TO vuoto in una riga di Link�blocco liberato due volte +-�mcheck_status insensato, la libreria � bacata +-�broadcast: ioctl (leggi la configurazione dell'interfaccia)�broadcast: ioctl (leggi i flag dell'interfaccia)�overflow del buffer�cache_set: impossibile allocare un nuovo rpc_buffer�cache_set: fallita l'allocazione della vittima�cache_set: vittima non trovata�impossibile determinare l'abbreviazione del fuso orario +-da usare subito dopo il tempo finale�impossibile riassegnare il numero di procedura %d +-�impossibile fare `stat' sul file di localizzazione `%s'�impossibile allocare i dati dei simboli�impossibile creare il descrittore interno�impossibile creare i descrittori interni�impossibile abilitare il socket ad accettare connessioni: %s�impossibile trovare il preprocessore C: %s +-�impossibile trovare un preprocessore C +-�impossibile gestire una vecchia richiesta di versione %d; +-la versione attuale � %d�impossibile inserire l'elemento di collazione `%.*s'�impossibile l'inserimento nella tabella dei risultati�impossibile inserire la nuova definizione di simbolo di collazione: %s�impossibile leggere i dati di profilazione�impossibile aprire�impossibile aprire `%s'�impossibile aprire il file del database `%s': %s�impossibile aprire il file di input `%s'�impossibile aprire il file di definizione della localizzazione `%s'�impossibile aprire il file di output�impossibile aprire il file di output `%s'�impossibile aprire il file di output `%s' per la categoria `%s'�impossibile aprire il socket `%s'�impossibile elaborare le specifiche di ordine�impossibile leggere la directory delle mappe di caratteri `%s'�impossibile leggere il file di configurazione. Questo � fatale�impossibile leggere dal client�impossibile leggere l'header da `%s'�impossibile leggere la directory di localizzazione `%s'�impossibile leggere il file di localizzazione `%s'�impossibile leggere la repertoire map `%s'�impossibile leggere i dati statistici�impossibile fare stat() sul file `%s': %s�impossibile scrivere i file di output su `%s'�impossibile scrivere i risultati: %s�impossibile scrivere le statistiche: %s�impossibile scrivere sul client�dati di categoria richiesti pi� di una volta: non dovrebbe succedere�il carattere '%s' nella classe `%s' deve essere nella classe `%s'�il carattere '%s' nella classe `%s' non deve essere nella classe `%s'�carattere <SP> non definito nella mappa di caratteri�il carattere L'%s' (indice %Zd) nella classe `%s' deve essere nella classe `%s'�il carattere L'%s' (indice %Zd) nella classe `%s' non deve essere nella classe `%s'�carattere `%s' non definito sebbene necessario come valore predefinito�classe di caratteri `%s' gi� definita�mappa di caratteri `%s' gi� definita�file di mappa di caratteri `%s' non trovato�clnt_raw.c - Errore fatale di serializzazione dell'header�clnttcp_create: memoria esaurita +-�clntudp_create: memoria esaurita +-�clntunix_create: memoria esaurita +-�l'elemento di collazione `%.*s' appare pi� di una volta: riga ignorata�il simbolo di collazione `%.*s' appare pi� di una volta: riga ignorata�simbolo di collazione non trovato dopo `%s'�connessione all'indirizzo %s: �attesa una costante o un identificatore�conversione da `%s' a `%s' non gestita�conversione fermata a causa di un problema durante la scrittura dell'output�impossibile creare un server rpc +-�impossibile registrare il programma %d vers %d +-�database [chiave ...]�file di mappa di caratteri `%s' predefinito non trovato�il flag di direzione nella stringa %d, nel campo `era' +-della categoria `%s', non � n� '+' n� '-'�il flag di direzione nella stringa %d, nel campo `era' +-della categoria `%s', non � un unico carattere�nome di carattere `%s' ripetuto�definizione di eleento di collazione ripetuta�definizione ripetuta per il carattere `%.*s'�chiave ripetuta�definizione di insieme ripetuta�nome di zona %s duplicato (file "%s", riga %d)�identificatore del messaggio doppio�numero del messaggio doppio�stringa di caratteri vuota�nome del peso assente: riga ignorata�enablecache: cache gi� abilitata�enablecache: impossibile allocare la cache�enablecache: impossibile allocare i dati della cache�enablecache: impossibile allocare il fifo della cache�codifica per l'output�codifica del testo originale�punto terminale dell'intervallo dei puntini maggiore dell'inizio�errore ottenendo l'id dei chiamanti: %s�errore chiudendo l'input `%s'�errore chiudendo il file di output�errore chiudendo il file con i dati di profilazione�errore di inserimento dell'elemento di collazione nellatabella hash�errore di inserimento nella tabella hash�errore leggendo l'output�manca un argomento stringa per `copy'�manca la riga di continuazione�impossibile caricare l'oggetto condiviso `%s'�impossibile caricare i dati dei simboli�impossibile fare mmap del file con i dati di profilazione�impossibile iniziare il processo di conversione�errore di scrittura dei dati per la categoria `%s'�fcntl: F_SETFD�il campo `%s' nella categoria `%s' non � definito�il file `%s' esiste gi� e potrebbe essere sovrascritto +-�il valore di partenza di `collating-element' deve essere una stringa�fstat fallito�spazzatura alla fine della specifica del codice di carattere�spazzatura alla fine del numero�spazzatura alla fine del valore di scostamento nella stringa %d, +-nel campo `era' della categoria `%s'�spazzatura alla fine della data di inizio nella stringa %d, +-nel campo `era' della categoria `%s'�spazzatura alla fine della data terminale nella stringa %d, +-nel campo `era' della categoria `%s'�genera il grafico delle chiamate�genera un profilo piatto con totali e tick�get_myaddress: ioctl (leggi la configurazione dell'interfaccia)�getent - legge voci dal database amministrativo.�handle_request: ricevuta una richiesta (Versione = %d)�hard link fallito, usato un link simbolico�ha un hard link da qualche parte�campo CORRECTION illecito in una riga Leap�campo Rolling/Stationary illecito in una riga Leap�costante carattere illecita nella stringa�carattere illecito nel file: �elemento di collazione illecito�definizione illecita�codifica ottenuta illecita�sequenza di escape illecita a fine stringa�sequenza di escape illecita alla posizione %ld�nomi illeciti per l'intervallo di caratteri�nettype illecito:`%s' +-�numero illecito per lo scostamento nella stringa %d, +-nel campo `era' della categoria `%s'�numero dell'insieme illecito�data iniziale illecita nella stringa %d, +-nel campo `era' della categoria `%s'�data finale illecita nella stringa %d, +-nel campo `era' della categoria `%s'�limite di implementazione: permesse al piu` %d classi di caratteri�limite di implementazione: permesse al piu` %d mappe di caratteri�carattere o sequenza di shift incompleti alla fine del buffer�file formattato non correttamente�linea di input di tipo sconosciuto�errore interno (descrittore illecito)�errore interno - addtype chiamata con isdst errato�errore interno - addtype chiamata con ttisgmt errato�errore interno - addtype chiamata con ttisstd errato�errore interno in %s, riga %u�scostamento UTC non valido�formato di abbreviazione non ammesso�giorno del mese errato�anno finale errato�anno bisestile errato�modo di dlopen() non valido�nome del meso errato�orario salvato errato�anno iniziale errato�ora del giorno errata�giorno della settimana errato�lunghezza della chiave troppo lunga nella richiesta: %Zd�la riga dopo i puntini deve contenere una definizione di carattere�la riga prima dei puntini deve contenere una definizione di carattere�riga troppo lunga�elenca tutti i set di caratteri codificati noti�file di localizzazione `%s', usato nell'istruzione `copy', non trovato�lstat fallito�riga malformata ignorata�fallita la mappatura della tabella delle stringhe degli header di sezione�fallita la mappatura degli header di sezione�memoria sovrascritta prima del blocco allocato +-�memoria sovrascritta dopo la fine del blocco allocato +-�memoria esaurita�la memoria � coerente, la libreria � bacata +-�manca il formato dell'era nella stringa %d, +-nel campo `era' della categoria `%s'�manca il nome dell'era nella stringa %d, +-nel campo `era' della categoria `%s'�regola anonima�non sono state specificate n� la codifica originale n� quella di destinazione�netname2user: (nis+ lookup): %s +-�netname2user: la voce DES di %s nella directory %s non � unica�netname2user: la voce LOCAL di %s nella directory %s non � unica�netname2user: manca la lista dei group id in `%s'.�netname2user: nome principale `%s' troppo lungo�netname2user: non deve avere uid 0�il programma %d non � mai stato registrato +-�non � stato dato un valore tipo <Uxxxx> o <Uxxxxxxxx>�nessuna espressione regolare corretta per il campo `%s' +-della categoria `%s': %s�nessun giorno del mese corrisponde alla regola�nessuna definizione di `UNDEFINED'�non � stato indicato il nome del file per i dati di profilazione e l'oggetto +-condiviso `%s' non ha un soname�nessun'altra parola chiave va specificata quando si usa `copy'�nessun file di uscita prodotto a causa degli avvertimenti�non � stata indicata la repertoire map: impossibile procedere�nessun nome simbolico fornito�nessun nome simbolico fornito per la fine dell'intervallo�nessun peso definito per il simbolo `%s'�non � un file regolare�configurazione di nscd: +- +-%15d livello di debug del server +-�nscd non � in esecuzione! +-�una definizione CHARMAP pu� essere seguita solo da definizioni WIDTH�non � stata specificata con `-f' la codifica originale�file di output�problema rpc di pmap_getmaps�poll: problema di protocollo impostando il circuito +-�errore del preprocessore�stampa la lista dei count path e il loro numero d'uso�stampa informazioni sui progressi�problemi leggendo `%s'�Il file con i dati di profilazione `%s' non corrisponde all'oggetto +-condiviso `%s'�il programma %lu non � disponibile +-�la versione %2$lu del programma %1$lu non � disponibile +-�la versione %2$lu del programma %1$lu � pronta e in attesa +-�rcmd: poll (impostazione di stderr): %m +-�rcmd: socket: tutte le porte sono in uso +-�rcmd: write (impostazione di stderr): %m +-�registerrpc: memoria esaurita +-�momento del secondo intercalare ripetuto�repertoire map file `%s' non trovato�rpcgen: errore di codifica della arglist +-�rpcgen: troppi define +-�rpcinfo: %s � l'host sconosciuto +-�rpcinfo: %s � il servizio sconosciuto +-�rpcinfo: impossibile cancellare la registrazione per la versione %2$s +-del programma %1$s +-�rpcinfo: broadcast fallito: %s +-�rpcinfo: impossibile contattare il portmapper�stesso nome di regola in pi� file�lettura troppo corta leggendo la chiave di richiesta: %s�lettura troppo corta leggendo la richiesta: %s�scrittura troppo corta in %s: %s�socket: problema di protocollo impostando il circuito +-�gli ordinamenti `forward' e `backward' sono mutuamente esclusivi�non ha senso specificare pesi di ordinamento per il simbolo di collazione�standard input�standard output�data iniziale illecita nella stringa %d, +-nel campo `era' della categoria `%s'�anno iniziale maggiore dell'anno finale�anno iniziale troppo grande per essere rappresentato�anno iniziale troppo piccolo per essere rappresentato�la data di stop non � permessa nella stringa %d in campo `era' della +-categoria `%s'�svc_run: - select fallita�svc_tcp.c - impossibile fare getsockname o listen�svc_tcp.c - problema di creazione del socket tcp�svc_tcp: makefd_xprt: memoria esaurita +-�svc_unix.c - problema di creazione del socket AF_UNIX�svc_unix.c - impossibile fare getsockname o listen�svc_unix: makefd_xprt: memoria esaurita +-�svctcp_create: memoria esaurita +-�svcudp_create - impossibile fare getsockname�svcudp_create: memoria esaurita +-�svcudp_create: problema di creazione del socket�svcunix_create: memoria esaurita +-�il simbolo per l'elemento di collazione multicarattere `%.*s' +-replica la definizione dell'elemento�il simbolo per l'elemento di collazione multicarattere `%.*s' +-replica la definizione di un altro simbolo�il simbolo per l'elemento di collazione multicarattere `%.*s' +-replica la definizione del simbolo�il simbolo per l'elemento di collazione multicarattere `%.*s' +-replica il nome simbolico�errore di sintassi nella definizione di %s: %s�errore di sintassi nella direttiva `order_start'�errore di sintassi nella definizione della classe del carattere�errore di sintassi nella definizione della conversione del carattere�errore di sintassi nella definizione dell'ordine di collazione�errore di sintassi nella definizione della collazione�errore di sintassi nella categoria di LC_TYPE�errore di sintassi nella definizione di una nuova classe di caratteri�errore di sintassi nella definizione di una nuova mappa di caratteri�errore di sintassi nella definizione dalla localizzazione del messaggio�errore di sintassi nella definizione dalla localizzazione monetaria�errore di sintassi nella definizione dalla localizzazione numerica�errore di sintassi nella specifica di ordinamento�errore di sintassi nel prologo: %s�errore di sintassi nella definizione della repertoire map: %s�errore di sintassi nella definizione della localizzazione del tempo�errore di sintassi: fuori da una sezione di definizione di localizzazione�non � stata specificata con `-t' la codifica di destinazione�questa � la prima definizione�tempo precedente a zero�overflow del tempo�troppo pochi byte nella codifica di carattere�troppi byte nella codifica di carattere�definite troppe classi di carattere�troppi secondi intercalari�troppi tipi di tempi locali�troppe transizioni?!�troppi pesi�troppe o troppo lunghe abbreviazioni di fuso orario�spazzatura alla fine della riga�problema rispondendo al programma %d +-�non sono permesse due righe di seguito contenenti `...'�digitato un solo anno�impossibile allocare il buffer per l'input�impossibile liberare gli argomenti�non definito�carattere sconosciuto `%s'�carattere sconosciuto nel campo `%s' della categoria `%s'�direttiva di collazione sconosciuta�direttiva `%s' sconosciuta: riga ignorata�errore di iconv() sconosciuto %d�insieme `%s' sconosciuto�simbolo `%.*s' sconosciuto: riga ignorata�zona senza regole�messaggio non terminato�stringa non terminata�costante stringa non terminata�nome simbolico non terminato�nome di peso non terminato�limite superiore dell'intervallo non minore del limite inferiore�uso: %s infile +-�uso del 29/2 in anno non bisestile�il valore di %s deve essere intero�il valore di <%s> deve essere compreso fra 1 e 4�il valore per il campo `%s' della categoria `%s' +-non deve essere la stringa vuota�il valore di <mb_cur_max> deve essere maggiore del valore di <mb_cur_min>�il valore del campo `int_curr_symbol' della categoria `LC_MONETARY' +-non corriposnde ad un nome ISO 4217 valido�il valore del campo `int_curr_symbol' della categoria `LC_MONETARY' +-� di lunghezza errata�i valori dei campi `%s' della categoria `%s' devono essere +-inferiori a 127�attenzione: �accettando la connessione: %s�allocando la voce di cache�allocando voce della tabella hash�allocando la copia della chiave�aprendo il file del vecchio catalogo�preparando l'output�leggendo il database�facendo stat del database di profilazione�scrivendo il file del database�write incompleta�scrivibile da altri oltre il proprietario�numero di argomenti sbagliato�numero di campi errato su una riga Leap�numero di campi errato su una riga Link�numero di campi errato su una riga Rule�numero di campi errato su una riga Zone di continuazione�numero di campi errato su una riga Zone�xdr_reference: memoria esaurita +-�xdrrec_create: memoria esaurita +-�yp_update: impossibile convertire l'host in netname +-�yp_update: impossibile ottenere l'indirizzo del server +-� +\ No newline at end of file +diff -Naur ../glibc-2.1.3/po/ko.mo glibc-2.1.3/po/ko.mo +--- ../glibc-2.1.3/po/ko.mo 1999-07-18 18:19:41.000000000 -0700 ++++ glibc-2.1.3/po/ko.mo 1969-12-31 16:00:00.000000000 -0800 +@@ -1,453 +0,0 @@ +-�������������������8�������K������K������K��M���L��E���UL��&����L��(����L������L������L�����M�����&M�����5M�����IM�����dM�����~M��n���M�����O�����O��"���%O��"���HO�����kO��:����O������O������O������O������O�����P�����P�����2P�����LP�����eP������P������P������P������P������P�����Q�����#Q�����*Q�����EQ�����RQ�����YQ��3���kQ��3����Q��4����Q��.���R��%���7R�����]R��&���qR��%����R������R��%����R��3����R��,���/S��)���\S������S��"����S��!����S������S������S�����T�����.T�����DT��"���ZT��*���}T������T��&����T��&����T��&���U��&���7U��&���^U������U�� ����U��$����U������U������U�����V��,���2V�����_V��%���}V��,����V��-����V�� ����V��&���W�����FW�����eW������W������W������W������W�������W��2���|X������X��"����X��4����X�����"Y��#���4Y�� ���XY��=���bY������Y��<����Y������Y��'���Z�����6Z��)���?Z��(���iZ�� ����Z������Z������Z������Z��$����Z������Z��)��� +-[��(���4[�����][�����m[�����y[��#����[��/����[������[������[�� ���\�����\�����%\�����9\�����N\�����Z\�����j\������\������\������\������\������\�� ����\������\������\�� ���]��&���]��-���<]��!���j]������]������]������]������]��&����]��%���&^��0���L^��!���}^������^��-����^������^��%���_��)���(_��'���R_��%���z_��&����_������_������_������_����� +-`�����%`�����<`�����X`�����u`��@����`��D����`�����a�����'a�����@a�� ���Ua��=���_a������a�������a�����b��7����b��2����b��-��� c�����7c��$���Jc�� +-���oc�����zc������c��!����c������c������c������c������c�����d�����d�����/d�����Jd�����^d�����rd��3����d��-����d��2����d�����e�����,e�����5e�����<e�����Le�����fe��<���}e������e��$����e��)����e�� ���)f�����7f��1���If��8���{f������f������f������f������f�����g�����'g�����@g�����Og�����gg��"����g������g������g������g�������g�����oh�� ����h������h������h������h������h�� ����h�����i��$���'i�����Li��"���Si��%���vi��"����i��"����i��%����i�����j�����j�����.j��>���;j�����zj������j������j������j��!����j������j��!����j������j��.���k�����Mk�����ak�����nk��"���{k������k������k������k�� ����k������k��+����k�����(l�����El�����Vl�����ml������l������l������l������l������l����� +-m��1���m��$���Mm�����rm������m������m������m������m������m������m�����n�� +-���n�����#n�����*n��2���0n�����cn�����rn������n�� ����n������n������n������n������n����� o�����o��!���3o�����Uo�����so��s����o�����p��*���p�����Cp�����]p�����np�����p������p������p������p������p������p�����q�����q�����q��9���q�����Vq�����nq������q��,����q�� +-����q������q������q������q�����r�����#r�����>r�����Xr�����pr������r��#����r������r������r������r�����s��#���&s�����Js�����js�����ss������s������s������s������s������s������s������s�����t�����1t�����Pt�����pt������t������t������t������t������t������t�����u��*���#u�����Nu�����Uu�����mu������u�� ����u��!����u�� ����u������u������u�� ���v�����"v�����@v�����Mv�����av�����rv������v������v��(����v������v�����w�����w�����5w�����Ow�����ew�����~w������w������w������w������w������w������w��.����w�����"x�� ���4x��#���Bx��0���fx��%����x������x������x������x������x�����y�����#y�����@y�����Oy�����my������y������y������y������y������y������y�����z�����+z�����Ez�����_z�����qz������z������z������z������z������z��!���{�����.{�����G{�����b{�����~{������{������{��"����{������{������{����� |�����$|�����8|�����J|�����`|��-���o|��-����|��!����|������|�����}�����}�����2}�����C}��2���Z}��#����}������}������}��;����}�����~�����$~�����@~�����X~�� ���r~�� ����~������~������~������~������~������~���������������/�����J��&���c�������������������������������� ������������$���0��� ���U������c������o����������������������������������ˀ�����߀����������������� ���*���(���(���S������|����������"������������������D������K���$���e��� +-������������������������P��� ���`������n���!������������������������DŽ��������"����������������*������@������S���'���c���#�������6������� ������ +-�������������"������"���*������M���"���g��������������������Ć�����ۆ�� ����������������������������*������C������Z������o����������������������������������χ����������������� ���������#���%���:���I�����������������%����������ֈ��"������������!������ ���@���"���a��� ������������������������ω�����������������������������!���F���>��� �������.�������-�������6������8���#���;���\���I��������������������������+���$���+���P���'���|�������������Č�� ���ь�����ی���������������&���(���.���O���&���~����������,�������������������C������#���a�����������������!�������"������.������ ���4���%���U���;���{���&����������ޏ��1����������0������K������W���"���h����������'����������ϐ��������.���������3���"���J���(���m���-����������đ�����ܑ��!����������������8������X������t���!�����������������ʒ��������9�������4���7���8���l���+�������8���ѓ��$��� +-���"���/���!���R���.���t���������������������<������;���>���$���z�����������������*���ו��7���������:���"���Y������|���)�������N�������U���������^���&���|���)������� ���͗�����ۗ��+���������� ������>������X������j���"�������%�������*���Ә��*����������)������=���0���W�����������������+���Ǚ��7������#���+������O���!���m���$�������!����������֚��&������%������,���>������k���'���z���%�������0���ț��2����������,���.���9������h���K�������L���͜��L���������g���+���{���2�������2���ڝ��/��� ���$���=������b���%���x���-�������$���̞����������� ������'������:���(���Q���&���z���!����������ß��F���ڟ�����!���B���4���B���w���?�������<�������7���7������o����������#�������.���ɡ��0�������0���)������Z������x���������������������������Т������������������������%������;������O���#���d���5�������G������� ������#������5���8������n������{���-�������!�������(������-���������9������J���'���\���?�������=���ĥ�� ������.������ ���?���9���`���;�������,���֦��*������#���.������R���%���l���A����������ԧ��������I������7���X���3�������+���Ĩ��������'������!���/������Q���.���b����������C�������*������������������(���8������a���1���t�����������������:���ݪ��������)���6���*���`���#��������������$���ϫ���������������"���,������O������m�����������������>���Ĭ��������!���"��� ���D���(���e���$��������������*���ɭ��=�������H���2������{����������E�������&������(������'���0���E���X����������(�������'������$������,���-���)���Z���%��������������"���Ȱ��������&��� ������0���P���O���V�������U�������O���M���V�������!�������'������*���>���/���i���*�������$���ij��/������1������/���K���)���{���*�������)���д��#�������������-���9���&���g���4�������(���õ����������� ��� ������#���(���$���L���"���q��������������������Ķ�����۶��.���������������;���3���X����������#����������·�� ���۷��������0����������-���$���I������n����������#�����������������ȸ�����ݸ�����������������)���4���B������w�����������������'���ǹ��B������D���2���j���w���K������?���.������n����������!����������̻��������������������"���3������V������r�����������������#�������#�����#������0���'���#���X������|����������*�������%������'�� ������1������D���G���W���H�������*������,���������@������M������f������x�������������������������������`������ ���<��� ���J���(���X���(��������������C����������������������!������7������K������a������u�����������������������������������������������-������?������]������f��� ���������������������*�������*�������6�������*���/���"���Z������}���$�������%��������������,�������0���'���/���X���,��������������'�������%����������"������?���!���^�����������������$�������.�������������%���)���%���O���%���u���%�������%��������������"�������'��� ������H������b������y���+��������������"�������+�������,���+��� ���X���&���y��� �������������� ����������������������0�������P���5�������������'���,���+���T������������������������K�������������6���������O���"���l��� �������%�������)����������������������� +-������������������>���(���X���������� ���������������������$�������1������� ���&��� ���0������:������K������W������j��� ������������������������������������������������������� ���������������!������6���+���I���.���u���&��������������������������� ������/���@���)���p���.�������+��������������*������$���<���+���a���,�������4�������-�������4���������R������j��� ���|��� �����������������������������������<������;���?��� ���{������������������������>���������������������!�������-�������"���"���'���E������m���1������� ���������������������%����������������� ������������0������E������\������r������������������������(�������/�������8���)������b������{�����������������!��������������:������������� ���2���1���S��� ��������������;�������@������������� ���9������Z������l��������������������������������������&����������������/������5���o���U������������������������������ ���+������9��� ���M��� ���[������|����������(�������(�������(�������*������(���H������q�����������������7��������������������� ������� ������� ���������)������5������R������m��� �������������� +-��������������������� ����������������������������(���������,��� ���H������V������i�������������������������������������� ������/���������@������W������h������x����������������� ��������������������� +-���������������������@������� ���?������M��� ���f������t������������������������������� +-��������������������"���"������E���p���a��� +-�������1���������������� ������0������E������a������t���������������������������������������������=�������&���������=������L���@���k�������������������������������'�������$������!���3������U���+���t����������&������������������������ +-���!���&���!���H������j��������������������������������������������������� ���������+���)���J������t���!�������������������������������������� +-��� ��� ������A������V���'���q��������������������������������������������� ���������'������A������Y������q�������������������������������!��������������&���������-������A������V������k���������������� +-������� +-���������������������������� ������� �������1���������:��� ���F������T���3���s��������������������������������������!���������� ��� ���<������F������]������n������������������������������� �����������������������������:������T������f����������������� ������������������������������ ������:������X������r����������%������� �������������������������������������������1���0���@���+���q��������������������������������������������9������(���W�����������������C�����������������������������+������F������V������v�������������������������������/����������������������8���.���U��������������������������������������%�������#���������+������I��� ���V������`������u����������������� �������������������������������������� ���.������)���A������k������w����������q�������������������!���.������P������W���c��i���������������������������������������0������F������e���$���z�������������������������������&�������&������>���3��� ���r��� +-�������������� ��������������������� �������"���������(������D������]������|������������������������������������������������������������2������I������b������{��������������������������������������D����������;������N���#���a����������'������� �������&�������"������� ���������<������Z������o�������������������������������'��������������N������� ���K���*���U���2�������:�������2�������@���!���6���b������������������������'�������'������-���3������a��������� ����������������������������3�������'�����)���?�� ���i��-���w��#������������C������(���-�'���V� ���~� ����� �����-�����#����)���3�>���]�*����������2�����$�������;����J�+���`������&���������������0�������?����Z�*���y�&���������� �����'����!���4�*���V������&�����%�����������������!�F���=�D�����G�����)����/���;�"���k� �����!�����'�����������������3�B���Q�B�����(��������� ���� �*���, �7���W ����� �)���� ����� �&���� �R��� +-�T���e +-����� +-�#���� +-����� +-� ��������#���+����O����d� ���w�"�����(�����&�����+�����+��� ����L����X�(���g�����������,�����,�����%���* ����P �"���m ����� � ���� ����� �)���� �����'���0����X�1���g�1�����2�����6����� +-���5�(���@����i�S�����V�����V���3������+�����-�����,�����)���$�(���N����w� �����(����� �����������������&����8�+���O�$���{�����������B���������@���+�@���l�:�����9�����*���"����M����e����~�+�����-�����-�������� ����;����O����d����|� ��������������������������������� +-�����-���=�7���k������ �����9����� +-��������+���9����e�%�����*���������������2�����=���'�=���e� �����0����������G����I���I�/�����&�����(���������1���3�/���e�!����������H�����3����:���N�3����������"�����-��������%�#���6����Z�4���w�)����� ����������"����� ����+���'����S� ���d�?�����!�����*�����3�������F�!���f� ���������������%�������������&���5�&���\�7�����!�����&�����#��� ����( ����G ����e �$���} �4���� �@���� � ���!� ���"!�N���,!�"���{!�/����!�/����!�J����!����I"�*���`"�����"�"����"�#����"�+����"�#���#����A#�"���]#�����#�����#�����#�C����#�H���$�H���d$�C����$�G����$����9%�%���X%�!���~%�����%�����%�����%�'����%�#���&�(���B&�%���k&�#����&�#����&�����&�����&�"��� '�#���,'�&���P'�)���w'�����'� ����'� ����'�'����'�'����'�"���&(����I(����Z(����t(�����(�����(�#����(�&����(�,���)����.)�%���M)����s)� ����)�����)�6����)�����)�!���*����#*����>*�!���S*� ���u*�����*�����*�����*�����*�����*�)����*����#+����9+����R+�+���q+�7����+�5����+�V���,�D���b,�2����,�����,� ����,�#���-����:-����R-����o-�����-�"����-�����-�����-�#����-����.�"���3.�"���V.�"���y.�/����.�"����.�����.����/�2���'/�(���Z/��������k��������������������������@������,�������(�������������:��C����������������p��}���������2�������������k��D����������!��a���S����q�������J������������w��7������������@��������������E��V��H���������s������l���s���������u���[���������v������������������:������������������6��=������u������������������o���.������ ����|��d�����p���������������9�������������������$���������[�������������������l��?���������������C��`��������������*�����X���9��I������S��V��p������!������������y��d������������������������������Q������1�����������������n��^�� +-��� ���m���4���������?��������m������r�������������������������������]�������������������������������#������������������/���_��J����������������������������������������������s��f��Q��8�����r����������z���������<������������������x������B��{��K�������������>����������D��M����������������������������>����������������o���������i�������@����������x����������������b������� �������g���a�����������������E��o��e�������-��x��W������������������������������������������������Z�������s���R��"�������������4���������������/��������������������*����������(�������������������1�������k������L��V������N����)��������A������y���������*�����f���$������X������Q��)��#���K����������������[�������q�������D�����������T������a����������.���������T�������,��'�������u��\������������!�������3������������g�� +-������=��H���]�����-��5��O��z��������������������j�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��`�����������������������������������U������m�����{�����Q������c��P��������������������������������������������6���r����������������`���������t�����e��5�������������F��h��|�������������������b�������������������e�����\���~��2��E������� ���j�������#����������� ���������m��������������y������������1��M����������\����������4��f�������R����������7��Y�������������f��L�������F������������������������������������<����������� �� ���������������{��i���������Y�������������������������������� ���%���������(������c����������������������������~��������,����������{��������������������������������C���5��"���������?������v���)�������?������ +-����������+��������������/��~��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��P������������������������y���`�� ��<��w���}�����_�����'��H������d��������������n����������������H���������G������5��>����+�������S�����������-���������Y������������!����������������I����������g����l���������^��z������������v����������������������������������������N��A������|�����t���������W��������������������������+��������$��3��h�����������������c����������������������b��&��A������i���������������������b��[�� �������8�������������O��������o�����Y��#���������������r�����N���0����������������;��n��������������%����������������������������������������������������������E�� ������K������������ +-��M��������������������������h�������X��������������T��t������������������^�����9�����M�� ��J���������������>���+�����������������(���������2��c���������6��&��������V���)��������������������������������U��=�������B�������������;���v����������������0���������������Z�����������%��������������������~���������]������������������������1���������������N��������p��2��i���'��:��0������-���D�����������S������������������������W������L��8�����������������������������������}�������������������,�����������������������t�������������&�����B��w�������������l�����������������I�����������������������������6��'��������������������U�������������������������:������*������F�������������������������������������������n���������.�����q������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��T��Z��F����������������g��4�����q�����_��O��K��P��\����������������X�������������I�����������z��������������������������������������������������������G����������0�����a��A�����B�����j��U�����������������������������������<��$������k���������������]��P�����������h���������������3��������������9���������� Access Rights : � Attributes : � %s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile] +-� %s [-n netid]* [-o outfile] [infile] +-� %s [-s nettype]* [-o outfile] [infile] +-� Access rights: � Entry data of type %s +-� Name : %s +-� Public Key : � Type : %s +-� Universal addresses (%u) +-� [%d] Name : %s +-� [%u] - [%u bytes] � +-%s cache: +- +-%15s cache is enabled +-%15Zd suggested size +-%15ld seconds time to live for positive entries +-%15ld seconds time to live for negative entries +-%15ld cache hits on positive entries +-%15ld cache hits on negative entries +-%15ld cache misses on positive entries +-%15ld cache misses on negative entries +-%15ld%% cache hit rate +-%15s check /etc/%s for changes +-� +-Group Members : +-� +-Time to Live : � rpcinfo -b prognum versnum +-� rpcinfo -d prognum versnum +-� rpcinfo -p [ host ] +-� rpcinfo [ -n portnum ] -t host prognum [ versnum ] +-� no� yes� Data Length = %u +-� Explicit members: +-� Explicit nonmembers: +-� Implicit members: +-� Implicit nonmembers: +-� No explicit members +-� No explicit nonmembers +-� No implicit members +-� No implicit nonmembers +-� No recursive members +-� No recursive nonmembers +-� Recursive members: +-� program vers proto port +-� or: � (rule from "%s", line %d)� [OPTION...]� done +-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags. +-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed. +-�%s%s%s:%u: %s%sUnexpected error: %s. +-�%s%sUnknown signal %d +-�%s: %d did not sign extend correctly +-�%s: <mb_cur_max> must be greater than <mb_cur_min> +-�%s: C preprocessor failed with exit code %d +-�%s: C preprocessor failed with signal %d +-�%s: Can't create %s: %s +-�%s: Can't create directory %s: %s +-�%s: Can't link from %s to %s: %s +-�%s: Can't open %s: %s +-�%s: Can't remove %s: %s +-�%s: Error closing %s: %s +-�%s: Error reading %s +-�%s: Error writing %s +-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s +-�%s: Memory exhausted: %s +-�%s: More than one -L option specified +-�%s: More than one -d option specified +-�%s: More than one -l option specified +-�%s: More than one -p option specified +-�%s: More than one -y option specified +-�%s: Too many arguments +-�%s: cannot get modification time�%s: command was '%s', result was %d +-�%s: error in state machine�%s: illegal option -- %c +-�%s: invalid option -- %c +-�%s: option `%c%s' doesn't allow an argument +-�%s: option `%s' is ambiguous +-�%s: option `%s' requires an argument +-�%s: option `--%s' doesn't allow an argument +-�%s: option `-W %s' doesn't allow an argument +-�%s: option `-W %s' is ambiguous +-�%s: option requires an argument -- %c +-�%s: output would overwrite %s +-�%s: panic: Invalid l_value %d +-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s' +-�%s: unrecognized option `--%s' +-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ] +- [ -L leapseconds ] [ -y yearistype ] [ filename ... ] +-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ... +-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object) +-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible +-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]... +-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT +-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data +-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag! +-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file! +-�Cannot use netid flag with inetd flag! +-�Cannot use netid flag without TIRPC! +-�Cannot use table flags with newstyle! +-�Channel number out of range�Character Separator : %c +-�Child exited�Client credential too weak�Columns : +-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc. +-This is free software; see the source for copying conditions. There is NO +-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique +-�DIRECTORY +-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights : +-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits) +-�Directory : %s +-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY +-�Encrypted data +-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file. Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP +-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group : %s +-�Group Flags :�Group entry for "%s.%s" group: +-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos. +-�Killed�LINK +-�LOCAL entry for UID %d in directory %s not unique +-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s +-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server : +-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME +-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT +-�NUMBER�Name : '%s' +-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered. +-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None. +-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns : %d +-�Number of objects : %u +-�Numerical argument out of domain�Numerical result out of range�Object #%d: +-�Object Name : %s +-�Object Type : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner : %s +-�PRIVATE +-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits) +-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate : +-�Report bugs to %s. +-�Report bugs using the `glibcbug' script to <bugs@gnu.org>. +-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path : %s +-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root +-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status : %s +-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%s�TABLE +-�Table Type : %s +-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known. This does +-not necessarily mean that all combinations of these names can be used for +-the FROM and TO command line parameters. One coded character set can be +-listed with several different names (aliases). +- Some of the names are no plain strings but instead regular expressions and +-they match a variety of names which can be given as parameters to the +-program. +- +- �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information. +-�Trying %s... +-�Type : %s +-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d) +-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s +-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname] +-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s. +-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory +-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice +-�bogus mcheck_status, library is buggy +-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d +-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s +-�cannot find any C preprocessor (cpp) +-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory +-�clntudp_create: out of memory +-�clntunix_create: out of memory +-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server +-�couldn't register prog %d vers %d +-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten +-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s' +-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block +-�memory clobbered past end of allocated block +-�memory exhausted�memory exhausted +-�memory is consistent, library is buggy +-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s +-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d +-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration: +- +-%15d server debug level +-�nscd not running! +-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup +-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available +-�program %lu version %lu is not available +-�program %lu version %lu ready and waiting +-�rcmd: poll (setting up stderr): %m +-�rcmd: socket: All ports in use +-�rcmd: write (setting up stderr): %m +-�registerrpc: out of memory +-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error +-�rpcgen: too many defines +-�rpcinfo: %s is unknown host +-�rpcinfo: %s is unknown service +-�rpcinfo: Could not delete registration for prog %s version %s +-�rpcinfo: broadcast failed: %s +-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup +-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory +-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory +-�svctcp_create: out of memory +-�svcudp_create - cannot getsockname�svcudp_create: out of memory +-�svcudp_create: socket creation problem�svcunix_create: out of memory +-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d +-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage: %s infile +-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory +-�xdrrec_create: out of memory +-�yp_update: cannot convert host to netname +-�yp_update: cannot get server address +-�Project-Id-Version: GNU libc 2.1 +-POT-Creation-Date: 1998-11-28 09:29-0800 +-PO-Revision-Date: 1998-12-04 06:52+0900 +-Last-Translator: Changwoo Ryu <cwryu@adam.kaist.ac.kr> +-Language-Team: Korean <ko@li.org> +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=EUC-KR +-Content-Transfer-Encoding: 8-bit +-� ���� ���� : � �Ӽ� : � %s [-abkCLNTM][-D�̸�[=��]] [-i ũ��] [-I [-K ��]] [-Y ���] �Է����� +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o �������] [�Է�����] +-� %s [-n ��Ʈid]* [-o �������] [�Է�����] +-� %s [-s ��ƮŸ��]* [-o �������] [�Է�����] +-� ���� ����: � Ÿ�� %s�� entry ����Ÿ +-� �̸� : %s +-� ���� Ű : � Ÿ�� : %s +-� ���� �ּ� (%u) +-� [%d] �̸� : %s +-� [%u] - [%u ����Ʈ] � +-%s ij��: +- +-%15s ���� ij�� ����� +-%15Zd ��ŭ�� ������ ũ�� +-%15ld �ʵ��� positive entry ���� +-%15ld �ʵ��� negative entry ���� +-%15ld �� positive entriy�� ���� ij�� ��Ʈ +-%15ld �� negative entriy�� ���� ij�� ��Ʈ +-%15ld �� positive entriy�� ���� ij�� �̽� +-%15ld �� negative entriy�� ���� ij�� �̽� +-%15ld%% ij�� ��Ʈ�� +-%15s check /etc/%s for changes +-� +-�� ��� : +-� +-���� �ð� : � rpcinfo -b ���α���ȣ ������ȣ +-� rpcinfo -d ���α���ȣ ������ȣ +-� rpcinfo -p [ ȣ��Ʈ ] +-� rpcinfo [ -n ��Ʈ��ȣ ] -t ȣ��Ʈ ���α���ȣ [ ������ȣ ] +-� �ƴϿ�� ��� ����Ÿ ���� = %u +-� �������� ���: +-� �������� ����: +-� �Ϲ����� ���: +-� �Ϲ����� ����: +-� �������� ����� �ƴ� +-� �������� ������ �ƴ� +-� �Ϲ����� ������ �ƴ� +-� �Ϲ����� ����� �ƴ� +-� ������� ����� �ƴ� +-� ������� ������ �ƴ� +-� ����� ���: +-� ���α� ���� ���� ��Ʈ +-� Ȥ��: � ("%s"�� �ִ� ��Ģ, �� %d)�[�ɼ�...]� �Ϸ� +-�"%s", �� %d: %s�"���� %s" ��� -l �ɼ��� ��ȣ ��Ÿ���Դϴ��"���� %s" ��� -p �ɼ��� ��ȣ ��Ÿ���Դϴ�����ø� ���� �÷��� ���ؼ��� "�Է�����"�� �ʿ��մϴ� +-�%.*s: ARGP_HELP_FMT �μ��� ���� �ʿ��մϴ��%.*s: �˼� ���� ARGP_HELP_FMT �������Ģ���� ������ %s�� �����%s%s%s:%u: %s%sAssertion `%s' ����. +-�%s%s%s:%u: %s%s����ġ ���� ����: %s. +-�%s%s�� �� ���� ��ȣ %d +-�%s: %d�� ��ȣ Ȯ���� ����� ���� �ʾҽ��ϴ� +-�%s: <mb_cur_max>�� <mb_cur_min>���� Ŀ�� �մϴ� +-�%s: C ��ó���Ⱑ ���� �ڵ� %d�� �����Ͽ����ϴ� +-�%s: C ��ó���Ⱑ �ñ׳� %d�� �����Ͽ����ϴ� +-�%s: %s�� ���� �� �����ϴ�: %s +-�%s: %s ���丮�� ���� �� �����ϴ�: %s +-�%s: %s�� %s�� ��ũ�� �� �����ϴ�: %s +-�%s: %s�� �� �� �����ϴ�: %s +-�%s: %s�� ���� �� �����ϴ�: %s +-�%s: %s�� �ݴ� ���� ���� ��: %s +-�%s: %s�� �д� ���� ���� �� +-�%s: %s�� ���� ���� ���� �� +-�%s: ǥ�� ��¿� ���� ���� ���� �� �%s: ���� ������ �ƴ� %s ���Ͽ� Leap ���� ���� +-�%s: �� �ٴڳ�: %s +-�%s: �ϳ� �̻��� -L �ɼ��� �����Ǿ��� +-�%s: �ϳ� �̻��� -d �ɼ��� �����Ǿ��� +-�%s: �ϳ� �̻��� -l �ɼ��� �����Ǿ��� +-�%s: �ϳ� �̻��� -p �ɼ��� �����Ǿ��� +-�%s: �ϳ� �̻��� -y �ɼ��� �����Ǿ��� +-�%s: ���ڰ� �ʹ� ���� +-�%s: ���� �ð��� �˾Ƴ� �� �����ϴ��%s: ������ '%s'����, ����� %d�����ϴ� +-�%s: ���� ��迡 ���� ���%s: �߸��� �ɼ� -- %c +-�%s: �������� �ɼ� -- %c +-�%s: `%c%s' �ɼ��� �μ��� ������� �ʽ��ϴ� +-�%s: `%s'�� ��ȣ�� �ɼ��Դϴ� +-�%s: `%s' �ɼ��� �μ��� �ʿ��մϴ� +-�%s: `--%s' �ɼ��� �μ��� ������� �ʽ��ϴ� +-�%s: `-W %s' �ɼ��� �μ��� ������� �ʽ��ϴ� +-�%s: `-W %s'�� ��ȣ�� �ɼ��Դϴ� +-�%s: �� �ɼ��� �μ��� �ʿ��մϴ� -- %c +-�%s: ����� %s�� ��� ���Դϴ� +-�%s: panic: �������� ���װ� %d +-�%s: ������ �ϰ���� ���� ä �����%s: �� �� �����%s: �ν��� �� ���� �ɼ� `%c%s' +-�%s: �ν��� �� ���� �ɼ� `--%s' +-�%s: ������ %s [ -s ] [ -v ] [ -l �����ð� ] [ -p ���Ľ���Ģ ] [ -d ���丮 ] +- [ -L ���� ] [ -y ���������� ] [ �����̸� ... ] �Դϴ� +-�%s: ������ %s [ -v ] [ -c ���� ] ������ ... �Դϴ� +-�%s: ����ϴ� ���� ���� �� �(���α� ����) ������ �� �� �����ϴ�!?�(���α� ����) �ɼ��� �˼� �־�� �մϴ�!?�(�� �� ���� ������Ʈ) +-�(�� �� ���� ���� ���� - %d)�(�� �� ����)�*** `%s' ������ ����������� ���ŵǾ����ϴ�: �� �ڼ��� �м��� �Ұ����մϴ� +-�*ǥ�� �Է�*�-o ���-���� [�Է�-����]... +-[���-���� [�Է�-����]...]�a.out�� .lib ���� �ջ�Ǿ����; ���� ���� = %lu, ���� ���� = %lu�; ���� = ������� ������ �߸��� �̸� <%s>�� <%s>�<SP> ���ڴ� `%s' Ŭ������ ������ �ȵ˴ϴ��<SP> ���ڴ� `%s' Ŭ������ �����?������������ ���� : ��ջ�� ���� ���̺귯���� ��������ּҰ� �̹� ��� ���Դϴ��ȣ��Ʈ�̸��� ���� �ּұ��� �������� ������ּұ��� �Ծ�� �������� ��������� ������ڸ��� �ð���μ� ������ �ʹ� ��ϴ��������� ���� ���̺��� ������� �õ���ʹ� ���� ���� ���̺귯���� ��ũ�Ϸ��� �õ��Ͽ�������� ��������� ��������� ������Ʈ +-��߸��� �ּ���߸��� ���� �������߸��� ��Ʈ ���� ������߸��� ������߸��� �ý��� ȣ����߸��� ai_flags�� ��������ϰ� POSIX�� ��������� ����Ÿ +-����� ��ġ�� �ʿ������ε�ij��Ʈ ���� ������������� ����������� �����CDS�CPU �ð� ���� �ʰ����ij���� �ð� �ʰ�����ʿ��� ���� ���̺귯���� ������ �� �����ϴ���� �������� �����ϴ� ������ ������ �� �����ϴ��rpcinfo: ��Ʈ���ۿ� ����� �� �����ϴ��ypbind�� ����� �� �����ϴ��ypserv�� ����� �� �����ϴ���� �Ҵ��� �� �����ϴ����û�� �ּҸ� ������ �� �����ϴ����ε�ij��Ʈ rpc�� ���� ������ ���� �� �����ϴ������ ���̺귯���� ���� ������ �� �����ϴ���Ѱ� �̻��� ���� ���� �÷��� �� �� �����ϴ� +-���ε�ij��Ʈ�� ���� ������ ���� �� �����ϴ������ ����� �� �����ϴ������ ���������� ���� �Ŀ� ���� �� �����ϴ����ε�ij��Ʈ ��Ŷ�� ���� �� �����ϴ������ �ɼ� SO_BROADCAST�� ������ �� �����ϴ���Ѱ� �̻��� �Է� ������ ������ �� �����ϴ�! +-���Ʈid �÷��� inetd �÷��� �Բ� �� �� �����ϴ�! +-���Ʈid �÷��� TIRPC�� �Բ� �� �� �����ϴ�! +-����ο� ��Ÿ�Ͽ����� ���̺� �÷��� �� �� �����ϴ�! +-������� ��� ä�� ��ȣ����� ������ : %c +-��ڽ��� ������Ŭ���̾�Ʈ �ڰ� �ο��� �ʹ� ������� : +-����� �� ��� ����������� ������ ���������ǻ�Ͱ� ������ ����ϴ������ Ŭ������ ǥ ũ�� ����� �ð��� �ణ �ɸ� �� �ֽ��ϴ�...����� ������ ǥ ũ�� ����� �ð��� �ణ �ɸ� �� �ֽ��ϴ�... ������� �źε�������� ������� ���� ����������� �ð� �ʰ����ӵ���־��� ������ ���ڵ��� �� ���ڵ����� �Ǵٸ� ���ڵ����� ��ȯ��.�Ű�� �ҹ��ڷ� ��ȯ���Copyright (C) %s Free Software Foundation, Inc. +-�� ���α��� ���� ����Ʈ�����Դϴ�; ���������� �ҽ��� �����Ͻʽÿ�. ��ǰ�� +-�̳� Ư�� ������ ���� ���ռ��� ����Ͽ� ��� ������ ���� �ʽ��ϴ�. +-���� ���� `%s'�� ���� �� �����ϴ����ȣ ���Ǹ� ��� �ִ� C ��� ���� NAME�� �������� ������ ���� ��쿡�� �������ؽ�Ʈ �Է¿��� ������ DB ����Ÿ�� ������������ �ð� : %s���Ʈname %s�� ���� DES entry�� �������� �ʽ��ϴ� +-����丮 +-�DNANS�DNS����̺��� ���� ����Ÿ���̽��� �����ϴ�������ͺ��̽��� �۾� ���Դϴ���⺻ ���� ���� : +-������� �ּҰ� �ʿ������ġ�� ��Ʈ���� �ƴ����ġ�� �������� �ʾ������ġ�� �ڿ��� ���� ���Diffie-Hellman (%d ��Ʈ) +-����丮 : %s +-����丮�� ������� �������ũ �Ҵ緮�� �ʰ����fork���� �ʰ� ���� tty�� ������ ǥ���������Ÿ���̽��� ����� ���� ���� ǥ������ ������̹� �����ϴ� ����� ������� �ʰ�, ���ο� ���Ͽ� �������������� �ٿ����� �����EMT Ʈ���ENTRY +-���ȣȭ�� ����Ÿ +-�Entry/���̺� Ÿ���� ���� �ʽ��ϴ��RPC ���� �ý��ۿ� ����: �NIS+ ���� ���Ͽ� �����ϴ� �� ����. NIS+�� ��ġ�Ǿ����ϱ�?��� �� ���� ���� �ý��ۿ� ����: ��ݹ� ���ν����� ����ϴ� �� ���������: .netrc ������ �ٸ� ����� ���� �� �ֽ��ϴ�.���ȯ�� �������Exec ���� ������߿�: �ý��ۿ� `_POSIX2_LOCALEDEF'�� ���ǵǾ� ���� �ʽ��ϴ�������� ��ȣ�� ǥ�õ� �̸����� UCS4 �������� ������ ���� �ֽ��ϴ������ (�������� ���� ����)����� ����ڰ� �߸��� ���¿� ����������� �����մϴ������ ��� �������� ��������� �̸��� �ʹ� ��ϴ������ ũ�� ������ �ʰ���������� �ʹ� Ů�ϴ��First/Next ������ ��������ε� �Ҽ��� ��������丮�� ���� ������ resync�� �ʿ�����Լ��� �������� �ʾ������ +-�ARGP_HELP_FMT�� ������� ��: %s����� ����� ����ϴ�\v�Է� ������ - �̸� ǥ�� �Է��� �а� �˴ϴ�. ��� ������ - �̸� ǥ�� ��¿� ����մϴ� +-��Ϲ� �ý��� �����Ư�� ������ ���� ������ ����������� ���� ������ ǥ������� ���� ����Ʈ�� ǥ������������� ������� : %s +-��� �÷��� :�"%s.%s" ���� ���� �� entry: +-�SECS�� ���� ���� (�⺻�� 3600)���������� ij������ "%d"�� ã�� �� �������ϴ�!���ȣ ij������ "%d"�� ã�� �� �������ϴ�!��� ij������ "%s"�� ã�� �� �������ϴ�!�ȣ��Ʈ ij������ "%s"�� ã�� �� �������ϴ�!���ȣ ij������ "%s"�� ã�� �� �������ϴ�!�ȣ��Ʈ�� �����ϴ��ȣ��Ʈ �̸� Ž�� ���������� ������Է�-���� ���-���� +--o ���-���� �Է�-���� +--u �Է�-�����IOT Ʈ���IVY��ĺ��� ���ŵ���߸��� ���ɾ���۾��ϴ� �� �߸��� ������Ʈ Ÿ����߸��� Ž����������� ���� Ÿ�� �Ǵ� �������ġ�� ���� �������� ioctl���� ���μ����� �������� ��������� ��û�����:��Է� ����:���/��� ���� ����:��Է�/��� ��������� NIS ��������� ypbind ��������ͷ�Ʈ��ߴܵ� �ý��� ȣ����ߴܵ� �ý��� ȣ���� ����۵Ǿ�� �մϴ���۾��ϴ� �� �߸��� ������Ʈ��������� �μ���������� �Ĺ� ������������� ���� Ŭ���� �̸���������� Ŭ���̾�Ʈ �ڰ� �ο���������� Ŭ���̾�Ʈ ��������������� ���� �����\{\}�� �������� ���빰�� ������������� ��ġ�� ������������� ��ȯ��������ϰų� �ҿ����� ���߹���Ʈ �Ǵ� ���� ������ռ� ���Խ��� ����������������� ���� ����������� ���Խ���������� ��û �ڵ���߸��� ��û �������������� ���� ��������������� ��������丮�Դϴ��named Ÿ�� �����Դϴ��Kerberos. +-���������� +-����丮 %2$s�� UID %1$d�� ���� LOCAL entry�� �������� �ʽ��ϴ� +-���� 2 �ܾ������� 2�� ����ȭ���� �������� 3 �ܾ������� 3 ������� ������ �߸��� �̸��� �������ũ�� �ջ�Ǿ����ϴ�������� ��� ��ũ ��ȣ������ ������Ʈ Ÿ�� : �%s�� ���� +-����� �����θ��� �������� �ʾ�������� �ڿ� �Ҵ� �������谡 ��Ʈ��ũ �� ���� �ʽ��ϴ���߸��� ����, Ȥ�� Ʋ�� �̸���� �ɼǿ��� ���� �� �ʿ��ϰų� �������� ���ڴ� �� �� �ɼǿ� �ش��ϴ� ª�� �ɼǿ����� �� �ʿ��ϰų� �������Դϴ�.��� ���� : +-��� ������ �۾����̹Ƿ�, ������ ������ ����˴ϴ�.��� �Ҵ� ������� �ٴڳ�������� �ʹ� ��ϴ���Ӽ��� ���ų� ������ Ʋ��������� �ð� : %s������ϴ� �� ��������� �۾��� �����Ͽ������� ���� ����:��������� hop�� �õ�����̸���̸� +-[-a|-m]�NIS�NIS Ŭ���̾�Ʈ/���� ���� ����ġ - ���� ������ �� �����ϴ��NIS ���� �����ͺ��̽��� �߸��Ǿ����ϴ��NIS+ ���� �����NIS+ ������ ������ �� �����ϴ��NIS+ ���� ����� �� ���ų� NIS+ ���� ��ġ���� �ʾҽ��ϴ��������Ʈ�� ���� +-�������̸� : '%s' +-�Name ���� ij�� ����.��� �������� name ���� ���� �ʽ��ϴ���̸��� ��Ʈ��ũ �� �������� �����Name Ȥ�� ���� �� �� �����ϴ��Name/entry�� �������� �ʽ��ϴ���̸��� �ش�Ǵ� ������Ʈ�� ã�� �� �����ϴ�������Ⱑ �ʿ������Ʈ���� reset������ ������ �������ϴ����Ʈ��ũ�� �����ϴ����Ʈ��ũ�� ���� �Ұ����մϴ����� ������ CSI ������ �������� ������ XENIX ������� �����ȣ��Ʈ�̸��� �����Ǵ� �ּҰ� ������̸��� �����Ǵ� �ּҰ� �����anode�� �������� ������ ���� ������ ������ڽ� ���μ����� �������� ������ �ڷᰡ ����������� ���� ������ �������밡���� �����ġ�� ������´� ¦ ������Ű����� ����������� ���� ���� ������ ��������� �����ͺ��̽��� �� �̻��� ����� ����������� ���Խ��� ��������� ���α��� ��ϵ��� �ʾ���. +-�ȣ��Ʈ�� �� ��Ʈ�� �������ġ�� ���� ������ ������� ��ġ�� ������� �����̳� ���丮�� ����������� �� Ű�� ����������� �����ο� �� ������ ������� ���μ����� �����NIS+�� �ƴ� namespace �߰��name resolution���� ������ �� ���� ���������. +-�ã�� �� ����. �� �̸��� �����XENIX named Ÿ�� ������ �ƴ�����丮�� �ƴմϴ��ã�� �� ������� �������� �� ������ �ƴ�������ڰ� �ƴ������ �� : %d +-�������Ʈ�� �� : %u +-������� ��� ��ġ �μ�������� ��� ��ġ ����������Ʈ #%d: +-�������Ʈ �̸� : %s +-�������Ʈ Ÿ�� : ����� ��ü�Դϴ������ �̸��� ������Ʈ�� �����մϴ������ǥ�� Ȧ�� ���Դϴ��root���� �� �ɼ��� ����� �� �ֽ��ϴ�!��̹� ���� ���� ����������� ������ ����������� �������� ��������� ���� ���� ����������� ���� ���Դϴ����Ʈ�� �ڿ� �������� ����:���� ����:������� : %s +-����� +-���Ű���� ��ġ���� ������Ľ� ����: %s��κ����� ���������� ������Ʈ�� ������ ���� ������Ʈ�� �ƴմϴ���㰡 �źε�������� ����������Խ��� �ϰ���� ���� ä ���������Ÿ ���̽� ������ ������ ���ٿ� �� �� ǥ��������� ���� ���¸� ǥ������� ���� ���� ǥ������α� ���� ǥ����Ƹ��� ������Ƹ��� ������������ϸ� Ÿ�̸��� �ð��� �ʰ�����Ծ� ����� ������� ������Ծ� ������Ծ౺�� �������� ������Ծ� ��� �Ұ�����Ծ��� �������� ��������Ͽ� ���� �Ծ��� �߸�����̸� ���̺��� �߸��� ����������RFS�� ���ѵ� �����RPC ���α��� ���ν����� �߸����NIS ���� �� RPC �������RPC ���α� ��� �Ұ����RPC ���α� ������ �߸����RPC ������ �߸��Ǿ����ϴ��RPC ������ �߸����RPC: (�� �� ���� ���� �ڵ�)�RPC: ���� �����RPC: ����� �ص��� �� �����ϴ��RPC: �μ��� ��ȣȭ�� �� �����ϴ��RPC: ���� (�������� ���� ����)�RPC: ȣȯ���� �ʴ� RPC �����RPC: ��Ʈ ���� �����RPC: ���ν��� ��� �Ұ����RPC: ���α��� ��ϵ��� �����RPC: ���α� ��� �Ұ����RPC: ���α�/���� ����ġ�RPC: ���� �ý��� �����RPC: ������ �μ��� �ص��� �� �����ϴ��RPC: �����RPC: �ð� �ʰ��RPC: ���� �� �����RPC: ���� �� �����RPC: �� �� ���� ȣ��Ʈ�RPC: �� �� ���� �Ծ��RSA (%d ��Ʈ) +-��������� ������� ���� �ڵ忡 RTLD_NEXT�� ��������� ������Ʈ �������ϸ� ����Ÿ�� �а� ǥ���`�̸�'���� ���� ����Ÿ�� �б���б����� ���� �ý������-�ð� �ñ׳� %d����Խ��� �ʹ� Ů�ϴ������ ����� ��������� �ּҰ� �ٲ�������ȣ�� ����ų� �ٸ� ����� ���� �� ���� ������ ����ϴ�.����� ������Ʈ `%s'�� �ٽ� ���� �� ��������ߺ��� : +-����� %s�� �˷��ֽʽÿ�. +-����״� `glibcbug' ��ũ��Ʈ�� �̿��� <bugs@gnu.org>�� �����Ͻʽÿ�. +-���û�� �μ��� �߸�����ذ�� ���� 0 (�����ƴ�)��ذ�� ���� ������ڿ� �������¸� ���߽��ϴ���ڿ��� �ս�������ڿ��� �Ͻ������� ��� �Ұ�������ݹ� ���ν����� ����� �������SHOBJ [PROFDATA]�SUNYP�ã�� ��� : %s +-��������̼� ����������� �ٸ� ���� �ϰ� �ֽ��ϴ�, �ٽ� �õ��ϼ�������� �� ����������� �ڰ� �ο��� �ź��߽��ϴ�������� �����⸦ �ź��߽��ϴ��ai_socktype������ servname�� �������� �ʽ��ϴ�����α� �̸� ����������� �˴ٿ������ȣ 0�����ϻ��� ���� ��������� Ÿ���� �������� �ʽ��ϴ������Ʈ��� ���� �ߴ��� �ʷ��߽��ϴ���˼��մϴ�. ����� root�� �ƴմϴ� +-�`����'�� �ҽ� ���ǰ� �ֽ��ϴ��Srmount ��������� ����������� NFS ���� �ڵ��`����'���� �����带 ����������� : %s +-�������������� (��ȣ)������� (tty �Է�)������� (tty ���)���Ʈ�� ������ ����������� û�Ұ� �ʿ��մϴ���������� ������ ���� ���� ������ ǥ������ �����`����'�� ��ȣ�� ǥ�õ� ���� �̸��� ���ǵ���ý��� ������ý��� ����:��ý��� �ڿ� �Ҵ� ������ý����� ���丮, ���� ���� : %s +- �����丮 ����: %s +- ������ ��� : %s +-%s����̺� +-����̺� Ÿ�� : %s +-�name resolution���� �Ͻ����� ��������������� ���� ��� ������� ����Ʈ�� �˷��� ��� ���ڼ� �ڵ尡 ��� �ֽ��ϴ�. ������ ������ +-FROM�� TO �μ��� ������ ��� ���ڼ� �̸��� ������ ����� �� �ִ� ���� +-�ƴմϴ�. �Ѱ��� ���ڼ� �ڵ�� ��� �ٸ� �̸�(����)�� �Բ� ���ŵǾ� +-���� ���� �ֽ��ϴ�. +- �� �̸����� ��� ���� ���ڿ��� �ƴ϶� ���Խ��̰�, �� ���Խ��� +-���α��� ���ڷ� �־��� ���������� �̸��� �ش�˴ϴ� +- +- +- ������Ǵ� �ð� : �Ÿ�̸� �ð� �ʰ�����Ӽ��� �ʹ� �������ȣ ������ �ܰ谡 �ʹ� ����������� �ʹ� ��������� ������ �ʹ� ������ý��ۿ� ���� ������ �ʹ� ��������μ����� �ʹ� ����������� �ʹ� ����: ������ �� �����ϴ������ڰ� �ʹ� ���������/�ߴ��� ���������ٴ� �����������ȯ�Ⱑ ��������� ���������� �̹� ����Ǿ� �ֽ��ϴ������ ���������� ����Ǿ� ���� �ʽ��ϴ���� ���� ������ ������ `%s --help' Ȥ�� `%s --usage' �Ͻʽÿ�. +-�%s �õ���... +-�Ÿ�� : %s +-��˼������NIS+ Ŭ���̾�Ʈ�� ������ �� �����NIS+ ������ ������ �� ������ݹ��� ���� �� ������������� ���μ����� ���� �� ������˼����� (Ÿ�� = %d, ��Ʈ�� = %d) +-��� �� ���� .netrc Ű���� %s��� �� ���� NIS ���� �ڵ���� �� ���� ����Ÿ���̽�: `%s' +-��� �� ���� ������� �� ���� ������� �� ���� ȣ��Ʈ��� �� ���� ������Ʈ��� �� ���� �ɼ�: %s %s %s��� �� ���� �ذ�� ������� �� ���� ���� ������� �� ���� ��ȣ %d��� �� ���� �ý��� ������� �� ���� ypbind �����¦�� ���� �ʴ� ( �Ǵ� \(�¦�� ���� �ʴ� ) �Ǵ� \)�¦�� ���� �ʴ� [ �Ǵ� [^�¦�� ���� �ʴ� \{��ν��� �� ���� ���� `%s'��ñ��� ����� ��Ȳ�����:�����: %s ������ [��θ�] +-�����: rpcinfo [ -n ��Ʈ��ȣ ] -u ȣ��Ʈ ���α���ȣ [ ������ȣ ] +-������ ���� ��ȣ 1������ ��ȣ ��ȣ 2����ǵ� �ڷ������� ��� �ʹ� ū ������� Ÿ�̸� �ð� �ʰ������ ����� �� �ڴ���� ����� ������������� ��������� ������ ���������� �̸����� ��������� ������ �������� �̸��� ǥ�������� ������ ������ �̸��� ǥ��������õ� Ű������ �̸��� ǥ�����`�̸�' ���Ϸ� ������%s�� ��������ϴ�. +-��߸��� �Ű�ü Ÿ���X500�XCHS�YPBINDPROC_DOMAIN: %s +-���, 42�� ���������� �����Ѵٴ� ���մϴ���̹��� ������ �������Ƚ��ϴ����ӵǴ� Zone �ٿ� �ִ� �� �ð��� �� �ٿ� �ִ� ���ð����� ���� �ð��� �ƴմϴ��[����...]�`%1$s' ���ǰ� `END %1$s'�� ������ �ʽ��ϴ��`%s'�� `%s'�� �´� �������� ����Ÿ ������ �ƴմϴ��`-1'�� `%2$s' ������ `%1$s' �ʵ��� ������ entry���� �մϴ��`...'�� `...'�� `UNDEFINED' �� ������ �մϴ��`collating-element'�� ���� ù��° �μ� �ڿ� `from'�� �;� �մϴ���������� ��� ������� `from' ���ڿ��� �� �� ���� �����ai_family�� �������� �ʽ��ϴ��ai_socktype�� �������� �ʽ��ϴ���̹� �������<%s>�� ���� �μ��� ���� ���ڿ��� �մϴ��`%s'�� ���� �μ��� ���� ���ڿ��� �մϴ��auto_none.c - ġ������ ����(marshalling) �����authunix_create: �� ���� +-��߸��� �μ���߸��� �������Link �ٿ� FROM �ʵ尡 �����Link �ٿ� TO �ʵ尡 ����������� �ι� ������� +-����� mcheck_status, ���̺귯���� ���װ� �ֽ��ϴ� +-�broadcast: ioctl (�������̽� ���� ����)�broadcast: ioctl (�������̽� �÷��� ����)����� �귯��ħ�cache_set: �� rpc_buffer�� �Ҵ��� �� �����ϴ��cache_set: �������� �Ҵ����� �������cache_set: �������� ã�� ����������� ����ð� ���Ŀ� ����ϱ� ���� �ð��� �� ������ �� �����ϴ�����ν��� ��ȣ %d�� �������� �� �����ϴ� +-������� ���� `%s'�� `stat'�� �� �����ϴ����ȣ ����Ÿ�� �Ҵ��� �� �����ϴ�������� ����ڸ� ���� �� �����ϴ�������� ����ڸ� ���� �� �����ϴ�������� ������ �Ƶ��̵��� �� �� �����ϴ�: %s�C ��ó���⸦ ã�� �� �����ϴ�: %s +-�� C ��ó��� (cpp) ã�� �� �����ϴ� +-������� ��û ���� %d�� ó���� �� �����ϴ�; ���� ������ %d�Դϴ������ ���� ��� `%.*s'�� ������ �� �����ϴ�����ǥ�� ������ �� �����ϴ�����ο� �������� ��ȣ ���Ǹ� ������ �� �����ϴ�: %s��������ϸ� ����Ÿ�� ���� �� �����ϴ���� �� �����ϴ��`%s'�� �� �� �����ϴ�������ͺ��̽� ���� `%s'�� �� �� �����ϴ�: %s��Է� ���� `%s'�� �� �� �����ϴ�������� ���� ���� `%s'�� �� �� �����ϴ����� ������ �� �� �����ϴ����� ���� `%s'�� �� �� �����ϴ����� ���� `%s'�� ���� `%s'�� ���� �� �� �����ϴ������ `%s'�� �� �� �����ϴ������ ������ ó���� �� �����ϴ������ ���� ���丮 `%s'�� ���� �� �����ϴ������ ������ ���� �� �����ϴ�; ġ�������Ŭ���̾�Ʈ���� ���� �� �����ϴ��`%s'���� ����� ���� �� �����ϴ�������� ���丮 `%s'�� ���� �� �����ϴ�������� ���� `%s'�� �� �� �����ϴ�������丮 ���� ���� `%s'�� ���� �� �����ϴ����� ����Ÿ�� ���� �� �����ϴ��`%s'���Ͽ� stat()�� �� �� �����ϴ�: %s���� ������ `%s'�� ����� �� �����ϴ������� �� �� �����ϴ�: %s���踦 �� �� �����ϴ�: %s�Ŭ���̾�Ʈ�� �� �� �����ϴ������ ����Ÿ�� �ѹ� �̻� ��û�Ǿ����ϴ�: �̷� ���� �Ͼ���� �� �˴ϴ��`%3$s' Ŭ������ %1$s'%2$s' ���ڴ� `%4$s' Ŭ������ ��� �־�� �մϴ��`%3$s' Ŭ������ %1$s'%2$s' ���ڴ� `%4$s' Ŭ������ ��� ������ �� �˴ϴ������ <SP>�� ���� �������� ���ǵ��� �ʾ�������� `%s'�� ����ġ�� �ʿ������� ���ǵ��� �ʾ�������� Ŭ���� `%s'�� �̹� ���ǵǾ�������� ���� `%s'�� �̹� ���ǵǾ�������� ���� ���� `%s'�� ã�� �������clnt_raw.c - ġ������ ��� ����ȭ ����.�clnttcp_create: �� ���� +-�clntudp_create: �� ���� +-�clntunix_create: �� ���� +-����� ���� ��� `%.*s'�� �ѹ� �̻� ��Ÿ�����ϴ�: �� ���� �����մϴ������ ���� ��ȣ `%.*s'�� �ѹ� �̻� ��Ÿ�����ϴ�: �� ���� �����մϴ������ ���� �ɺ��� `%s' ������ �;� �մϴ���ּ� %s�� ����: ���� Ȥ�� �ĺ��ڰ� �;� ���`%s'���� `%s'���� ��ȯ�� �������� �ʽ��ϴ��������Ͽ� ���� ���� ������ ��ȯ�۾��� �ߴܵǾ����ϴ��rpc ������ ���� �� �����ϴ� +-����α� %d ���� %d�� ����� �� �����ϴ� +-�����Ÿ���̽� [Ű...]��⺻ ���� ���� ���� `%s'�� ã�� �������`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� `%1$d'�� ���� �÷��װ� '+'�� '-'�� �ƴմϴ��`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� `%1$d'�� ���� �÷��װ� �Ѱ��� ���ڰ� �ƴմϴ������ �̸� `%s'�� �ߺ������������ ��� ���ǰ� �ߺ��Ǿ����ϴ������ `%.*s'�� �ߺ� ��������ߺ��� Ű��ߺ��� ���� ������ߺ��� ������ %s (���� "%s", �� %d)��ߺ��� ���� �ĺ�����ߺ��� ���� ��ȣ��� ���ڿ���� weight �̸�: �� ���� ���õ˴ϴ��enablecache: ij���� �̹� Ȱ��ȭ�Ǿ� �����enablecache: ij���� �Ҵ��� �� �����ϴ��enablecache: ij�� �ڷḦ �Ҵ��� �� �����ϴ��enablecache: ij�� fifo�� �Ҵ��� �� �����ϴ����� ���ڵ���� ���� ���ڵ��������ǥ ������ ������ ���������� Ů�ϴ���Է� `%s'�� �ݴ� ���� ���� ������ ������ �ݴ� ���� ���� ����������ϸ� ����Ÿ ������ �ݴ� ���� ���� ����ؽ� ���̺��� �������� ��Ҹ� ������ �� ������ؽ� ���̺��� �����ϴ� ���� ���� ����Է��� �д� ���߿� ���� ���`copy'�� ���� ���ڿ� �μ��� �ʿ���������ߴ� ���� ���� ã�� ����������� ������Ʈ `%s'�� �дµ� �������ȣ ����Ÿ�� �д� �� ������������ϸ� ����Ÿ ������ mmap�ϴ� �� �������ȯ�۾��� �����ϴµ� ��������� `%s'�� �ڷḦ ���� �� �����߽��ϴ��fcntl: F_SETFD�`%2$s' ���ֿ��� `%1$s' �ʵ尡 ���ǵ��� �ʾҽ��ϴ��`%2$s' ���ֿ��� `%1$s' �ʵ尡 ���ǵ��� �ʾҽ��ϴ��`%s' ������ �̹� �����ϹǷ�, ���� ������ �ֽ��ϴ� +-�`collating-element'�� from-value�� ���ڿ��̾�� �մϴ��fstat ��������� �ڵ� ������ ���� ������� ���� ����������� ���� ������� ���� �����`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d���� ������ ���� ���� ������� ���� �����`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d���� ���� ��¥ ���� ���� ������� ���� �����`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d���� ���� ��¥ ���� ���� ������� ���� �����ȣ�� ������ �����Ƚ���� ƽ���� ����� �÷� ���������� ������get_myaddress: ioctl (�������̽� ������ ����)�getent - ���� ����Ÿ���̽����� entry�� ����.�handle_request: ��û�� ���� (���� = %d)��ϵ� ��ũ ����, �ɺ��� ��ũ�� ���˴ϴ����� �ϵ� ��ũ���Leap �ٿ� �߸��� CORRECTION �ʵ��Leap �ٿ� �߸��� Rolling/Stationary �ʵ�����ڿ��� �߸��� ���� ����� ��������Ͽ� �߸��� ���ڰ� ������߸��� �������� �������ǰ� �߸��Ǿ�����߸��� ��ȣȭ�� �־�������ڿ� ���� �߸��� �̽������� �������� �����%ld ��ġ�� �߸��� �Է� �������� ����������� ������ �߸��� �̸���߸��� ��ƮŸ�� :'%s' +-�`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d���� �߸��� ������ ũ������� ��ȣ�� �߸��Ǿ����`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d���� �߸��� ���� ��¥�`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d���� �߸��� ���� ��¥��������� ����: %d�� ���ں��� ū Ŭ������ ������ �ʽ��ϴ���������� ����: %d �� �̻��� ���� ������ ������ �ʽ��ϴ�������� ���� �ҿ����� ���� Ȥ�� ����Ʈ ������߸��� ������ ���� ������� �� ���� ������ �Է�������� ���� (�߸��� �����)����� ���� - Ʋ�� isdst�� addtype�� ȣ����������� ���� - Ʋ�� ttisgmt�� addtype�� ȣ����������� ���� - Ʋ�� ttisstd�� addtype�� ȣ�������%s, �� %u�� ���� ���� ���UTC �ɼ��� ������������ ������ ������������� ��¥ ���� ��������������� �ذ� ����������������� �����dlopen()�� �߸��� ������ �̸��� ������������� �ð��� ��������������ϴ� �ذ� ����������������� �Ϸ��� �ð���������� ���� �̸����û�� Ű�� ���̰� �ʹ� ��: %Zd�������ǥ �����ٿ��� ���� ���ǰ� �־�� �մϴ��������ǥ ���ٿ��� ���� ����� ���� ���ǰ� �־�� �մϴ������ �ʹ� ��ϴ���˷��� ��� ���ڼ� �ڵ带 �������`copy' ���忡�� ���̴� ������ ���� `%s'�� ã�� ���߽��ϴ��lstat ������߸��� ���¸� ���� ���� ���õ������ ����� ���ڿ� ���̺��� �����ϴµ� ��������� ����� �����ϴ� �� ����������� �Ҵ��ϱ� ���� �� �Ѽյ� +-������� �Ҵ��� ������ ���� �� �Ѽյ� +-��� �ٴڳ���� �ٴڳ� +-��� �߰�������, ���̺귯���� ���װ� �����ϴ� +-�`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d�� era ������ �����`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d�� era �̸��� ������̸����� ��Ģ��� ���ڵ��� ��� ���ڵ� ��� �������� �ʾҽ��ϴ��netname2user: (nis+ ã��): %s +-�netname2user: ���丮 %2$s�� %1$s�� ���� DES entry�� �������� �ʽ��ϴ��netname2user: ���丮 %2$s�� %1$s�� ���� LOCAL entry�� �������� �ʽ��ϴ��netname2user: '%s'�� �� �ĺ��� ����Ʈ�� ����.�netname2user: �ֿ� �̸� '%s'�� �ʹ� ���netname2user: uid�� 0���� �� �� �����ϴ������ ��ϵ��� ���� ���α� %d +-�<Uxxxx> Ȥ�� <Uxxxxxxxx> ���� �־����� �ʾҽ��ϴ��`%2$s' ������ `%1$s' �ʵ忡 �߸��� ���Խ�: %3$s���Ģ�� ���յǴ� ���� �� �ȿ� �����`UNDEFINED'�� ���ǰ� ������������ϸ� ����Ÿ�� ���� �̸��� ����, ���� ������Ʈ `%s'�� soname�� �����`copy'�� ���� �� �ٸ� Ű���带 �����ϸ� �� �˴ϴ������� ����Ǿ��� ������ ��� ������ ��������� �ʾҽ��ϴ�������丮 ������ ���ǵ��� �ʾ���: ����� �� �����ϴ����ȣ���� �־����� ����������� ������ ��ȣ �̸��� �����ϴ��`%s' ��ȣ�� ���� �߿䵵�� ���ǵ��� �ʾҽ��ϴ���Ϲ� ������ �ƴ��nscd ����: +- +-%15d ���� ����� ���� +-�nscd�� ������� �ʾҽ��ϴ�! +-�CHARMAP ���� �ٷ� �������� WIDTH ���Ǹ��� �����մϴ��`-f'�� ����� �� ���ڵ��� �������� �ʾ������� �����pmap_genmaps rcp �����poll: ȸ�� ������ �Ծ��� ������� +-���ó���� ������ܰ��� ��ϰ� �� �� �ܰ��� ��� Ƚ���� ǥ������� ������ ǥ���`%s'�� �д� ���� ������ ��������������ϸ� ����Ÿ ���� `%s'�� ���� ������Ʈ`%s'�� ���� �ʽ��ϴ�����α� %lu�� ��� �Ұ����մϴ� +-����α� %lu ���� %lu�� ��� �Ұ����մϴ� +-����α� %lu ���� %lu�� �غ�Ǿ� ��ٸ��� �ֽ��ϴ� +-�rcmd: poll (ǥ�ؿ��� ����): %m +-�rcmd: socket: ��� ��Ʈ�� ����� +-�rcmd: write (ǥ�ؿ��� ����): %m +-�registerrpc: �� ���� +-������� ũ�Ⱑ �ߺ��Ǿ���������丮 ���� ���� `%s'�� ã�� �������rcpgen: arglist �ڵ� ���� +-�rpcgen: �ʹ� ���� ���� +-�rpcinfo: %s�� �� �� ���� ȣ��Ʈ�Դϴ� +-�rpcinfo: %s�� �� �� ���� �����Դϴ� +-�rpcinfo: ���α� %s ���� %s�� ����� ���� �� �����ϴ� +-�rpcinfo: ��ε�ij��Ʈ ������: %s +-�rpcinfo: ��Ʈ���ۿ� ������ �� �����ϴ������ ���Ͽ� ���� �̸��� ��Ģ�� �������û�� Ű�� �� ���� ������: %s��䱸������ �� ���� ������: %s�%s�� �� ���� ������: %s�socket: ȸ�� ������ �Ծ��� ������� +-����� ���� `forward'�� `backward'�� ���� ��Ÿ���Դϴ���������� ��ȣ�� ���� ���� �߿䵵�� �����ص� �ƹ� �ǹ̰� �����ϴ��ǥ�� �Է��ǥ�� ���������ϴ� ��¥�� ���� `%2$s'�� `era' �ʵ忡 �ִ� ���ڿ� %1$d���� �߸��Ǿ����ϴ�������ϴ� �ذ� ������ �غ��� Ů�ϴ������ ������ �ʹ� ���� ���� ǥ���� �� �����ϴ������ ������ �ʹ� ���� ���� ǥ���� �� �����ϴ��`%2$s' ������ `era' �ʵ忡 �ִ� ���ڿ� %1$d���� ���� ��¥�� �߸��Ǿ����ϴ��svc_run: - select �����svc_tcp.c - getsockname Ȥ�� listen �Ұ����svc_tcp_c - tcp ���� ���� �����svc_tcp: makefd_xprt: �� ���� +-�svc_unix.c - AF_UNIX ���� ���� �����svc_unix.c - getsockname Ȥ�� listen �Ұ����svc_unix: makefc_xprt: �� ���� +-�svctcp_create: �� ���� +-�svcudp_create - getsockname �Ұ����svcudp_create: �� ���� +-�svcudp_create: ���� ���� �����svcunix_create: �� ���� +-����� ���ڷ� �� �������� ��� `%.*s'�� ��ȣ�� ��� ���ǰ� �ߺ��˴ϴ������ ���ڷ� �� �������� ��� `%.*s'�� ��ȣ�� �ٸ� ��� ���ǿ� �ߺ��˴ϴ������ ���ڷ� �� �������� ��� `%.*s'�� ��ȣ�� �ٸ� �ɺ� ���ǿ� �ߺ��˴ϴ������ ���ڷ� �� �������� ��� `%.*s'�� ��ȣ�� �ɺ� ���ǰ� �ߺ��˴ϴ������ ���ڷ� �� �������� ��� `%.*s'�� ��ȣ�� ���ڼ��� ��ȣ�� �ߺ��˴ϴ��%s ���Ǻο� ���� ���� ����: %s�`order_start' �����ڿ� ���� ���� ��������� Ŭ���� ���ǿ� ���� ���� ��������� ��ȯ ���ǿ� ���� ���� ��������� ���� ���ǿ� ���� ��������� ���� ���ǿ� ���� �����LC_CTYPE ������ ���Ǻο� ���� ���� ��������ο� ���� Ŭ���� ���ǿ� ���� ��������ο� ���� ���� ���Ǻο� ���� ���� ��������� ������ ���Ǻο� ���� ���� �����ȭ�� ������ ���Ǻο� ���� ���� ��������� ������ ���Ǻο� ���� ���� ��������� ������ �� ���� ������Ӹ����� ���� �ַ�: %s������丮 ���� ���ǿ� ���� ����: %s��ð� ������ ���Ǻο� ���� ���� ��������� �ַ�: ������ ���� �κ��� �ƴմϴ��`-t'�� ����� ��� ���ڵ� ������ �����ϴ���̰��� ù��° �����Դϴ��0 ������ �ð���ð� �귯��ħ����� ��ȣȭ�� �ʿ��� ����Ʈ�� �ʹ� ��������� ��ȣȭ�� �ʿ��� ����Ʈ�� �ʹ� ��������� Ŭ������ �ʹ� ���� ���ǵǾ�������ʰ� �ʹ� ������������� ������ �ʹ� ������ʹ� ���� ����?!��ʹ� ���� �߿䵵��ʹ� ���ų� �ʹ� �� �ð��� ���������� ���� ������� ���� �پ� ��������α� %d�� �����ϴ� �� ������ ���� +-�`...'�� ��� �ִ� � ������ �� �� �����ϴ���Ѱ��� ������ Ÿ�����Ǿ����ϴ���Է��� ���� ���۸� �Ҵ��� �� �����ϴ�����ڸ� ��� �� �����ϴ�����ǵ��� ������� �� ���� ���� `%s'�`%2$s' ������ `%1$s' �ʵ忡 �� �� ���� ���ڰ� �ֽ��ϴ���� �� ���� ���� ���� ���ù���� �� ���� ������ `%s': �� ���õ���� �� ���� iconv() ���� %d��� �� ���� ���� `%s'��� �� ���� ��ȣ `%.*s': �� ���õ����Ģ���� ������������ ���� ������������ ���� ���ڿ��������� ���� ���ڿ� ����������� ���� ��ȣ �̸��������� ���� weight �̸�������� ������ ���Ѻ��� ���� �ʾƾ� �մϴ������: %s �Է����� +-��� 2�� 29���� ������%s�� ���� ���� �������� �մϴ��<%s>�� ���� ���� 1�� 4 ���̿� �־�� �մϴ��`%s' ������ `%s' �ʵ��� ���� �� ���ڿ��� �Ǹ� �� �˴ϴ��<mb_cur_max>�� ���� <mb_cur_min>�� ������ Ŀ�� �մϴ��`LC_MONETARY' ������ `int_curr_symbol' �ʵ��� ���� ISO 4217�� ���Ǵ� �̸��� �ƴմϴ��`LC_MONETARY' ������ `int_curr_symbol' �ʵ��� ���� ���̰� Ʋ�Ƚ��ϴ��`%s' ������ `%s' �ʵ��� ���� 127���� �۾ƾ� �մϴ�������� �Ƶ��̴� ����: %s�ij���� ���� ���� �Ҵ��ϴ� ������ؽ� ���̺��� entry�� �Ҵ��ϴ� �����Ű ���縦 �Ҵ��ϴ� ����������� ��� ������ ���� ���������� �غ��ϴ� ����������ͺ��̽��� �д� ������������ϸ� ����Ÿ ������ ���� ����������� ���̽� ������ ���� ����������� ���� ���߽��ϴ�������ڰ� �ƴ� ����� ������ �� ������μ��� ������ �߸��Ǿ����Leap �ٿ� �ʵ��� ������ �߸��Ǿ����Link �ٿ� �ʵ��� ������ �߸��Ǿ����Rule �ٿ� �ʵ��� ������ �߸��Ǿ����Zone continuation �ٿ� �ʵ��� ������ �߸��Ǿ����Zone �ٿ� �ʵ��� ������ �߸��Ǿ����xdr_reference: �� ���� +-�xdrrec_create: �� ���� +-�yp_update: ȣ��Ʈ�� ��Ʈ�̸����� �ٲ� �� �����ϴ� +-�yp_update: ���� �ּҸ� ���� �� �����ϴ� +-� +\ No newline at end of file +diff -Naur ../glibc-2.1.3/po/nl.mo glibc-2.1.3/po/nl.mo +--- ../glibc-2.1.3/po/nl.mo 1999-07-18 18:19:41.000000000 -0700 ++++ glibc-2.1.3/po/nl.mo 1969-12-31 16:00:00.000000000 -0800 +@@ -1,274 +0,0 @@ +-������J�����l�����$������1��"��� 1��"���,1�����O1��:���k1������1������1������1������1��3����1��3���,2�����`2��&���t2��%����2������2��%����2��3����2�����23��"���K3��!���n3������3������3������3������3������3��"���4��*���)4�����T4��&���n4��&����4��&����4��&����4��&��� +-5��$���15�����V5�����q5������5��,����5������5��%����5��,���6��-���C6�� ���q6��&����6������6������6������6�����7������27��2����7��#����7�� ���8�����8�����.8��'���N8�����v8��(���8�� ����8������8������8��$����8������8��(���9�����89�����H9�����T9��/���k9������9������9������9������9������9������9�����:�����:�����):�����B:�� ���N:�����X:��&���p:��-����:��!����:������:�����;�����#;�����:;��&���Z;��%����;��!����;������;��-����;�����<��%���,<�����R<�����n<�����{<������<������<��@����<��D���=�����Q=�����d=�����}=�� ����=�������=�����d>�����{>������>������>������>������>������>������>�����?�����$?�����-?�����6?��)���V?�� ����?������?��1����?������?������?����� +-@�����@�����2@�����E@�����^@�����m@������@������@������@������@������@������@������@�����A�����A�����A�����2A�����FA��!���SA�����uA��.����A������A������A������A������A�� ���B�����B��+���5B�����aB�����rB������B������B������B������B������B�����C�����&C��1���7C��$���iC������C������C������C������C������C�����D�����D�����D�����4D�����;D�����JD�����cD�� ���rD������D������D������D��!����D������D����� E�����E�����+E��9���>E�����xE������E������E��#����E������E������E����� +-F�����%F�����CF�����cF�����lF������F������F������F������F������F������F������F�����G�����1G�����QG�����bG�����zG������G������G������G������G������G�� ���H�����#H�����AH�����RH�����pH������H������H��!����H������H������H�����I�����)I�����?I�� ���QI��#���_I������I������I������I������I������I������I�����J�����2J�����7J�����JJ�����hJ������J������J������J������J������J������J�����K�����*K�����FK��!���fK������K������K������K������K������K�����L��"���(L�����KL�����XL�����gL�����~L������L������L��-����L������L������L�����M�����*M��2���AM��;���tM������M������M������M������M�� ���N�� ���"N�����CN�����VN�����qN������N������N������N�� ����N�� ����N������N�����O�����O�����%O�����6O�����JO�����_O�����rO������O��"����O�� +-����O������O�� ����O��!����O������P�����P�����#P�����AP��"���TP�����wP������P������P������P������P��'����P��#����P��&���Q�� ���AQ�����OQ�����iQ������Q������Q������Q������Q������Q������Q������Q�����R�����R�����(R�����:R�����GR�����bR��W��wR��V���T�����&W������Y��#����[��:����[������[�����\��%���&\�����L\��"���b\������\������\������\������\������\��F����\��.���1]��6���`]��8����]��;����]��I���^��+���V^��+����^��'����^������^�� ����^������^�����_�����'_��%���9_��.���__��&����_������_��C����_��#���`�����9`��&���X`�����`��1����`������`��"����`������a��'���a�����Da��.���aa��"����a��(����a��!����a������a��!���b��9���=b��4���wb��8����b��+����b��8���c��$���Jc��"���oc��!����c��.����c��<����c��;��� d��$���\d������d������d��"����d��)����d��N���e��U���Te������e��&����e��)����e�� ���f�����'f��+���@f�����lf������f������f��"����f��%����f��*��� g��*���8g��0���cg��7����g��#����g��!����g��$���h��,���7h�����dh��'���sh��%����h��2����h������h��.���i�����0i��K���Ii��L����i��L����i��2���/j�����bj��%���xj��-����j��$����j������j�����k�����k��(���5k��!���^k��F����k������k��B����k��B���l��?���`l��<����l������l������l��.���m��0���Bm��0���sm������m������m������m������m�����n�����n�����/n�����Bn�����Un�����kn�����n��5����n��G����n�� ���o��5��� o�����Vo�����co��'���zo��,����o������o������o��&����o��?���p��=���Yp�� ����p������p��A����p�����q�����q��7���;q��3���sq������q��'����q��!����q�����r��C���r�����]r�����yr��)����r��*����r��%����r�����s��$���2s�����Ws�����ss������s������s��>����s�����t��!���*t��#���Lt�� ���pt��*����t��*����t��=����t��H���%u�����nu�����}u��E����u��&����u��(����u��'���#v��E���Kv������v��$����v��(����v��'����v����� w��"���>w��&���aw��P����w��V����w��U���0x��O����x��V����x��!���-y��'���Oy��*���wy��/����y��*����y��$����y��/���"z��1���Rz��/����z��)����z��*����z��)��� {��#���3{�����W{��&���r{��4����{������{������{�� ����{��#��� +-|��$���.|��"���S|�����v|������|������|������|��.����|������|�����}��3���:}�����n}�� ����}������}��0����}������}��$����}�����~��#���$~�����H~�����T~�����i~�����}~������~��4����~������~�������'���#��B���K��D������j������K���>���?�������7���ʀ�����������������9������P������g�����������������#�������#���߁��#������0���'���#���X���*���|���%�������'��͂��0�������/���&������V���K���r���������� ���܄���������������+������+���D������p���%�������%����������х��,������3���������K���!���i���$�������������� ���̆����������� +-������!���(���<���?���e����������"�������"������"������"���)���"���L���(���o��������������������̈��)������������$���-���)���R���*���|���"�������%���ʉ��"����������������3������O�������k���6������#���9��� +-���]������h������z���.����������ċ��2���Ћ��)���������-��� +-���/���.���:������i���,�������������� ����������ƌ��,������������������ ���2������@���"���]������������������������������������������������?��� ���3���M���$������� ������� ���ǎ��������"������'���(���3���P���(��������������/���ɏ�� �������,���������G������c���#���p���������� �������:���Ґ��B��� ������P������e���������� ������������������u���������������������������ג��������� ���������������3������H������Q������Y���.���y�����������������;���˓��������$��� ������E������U������p���#��������������#����������ޔ������������������0������9������T������s����������������������������������ѕ��*������!��� ���-���/������]������q�������������������������������6���Җ����� ������������3���!���L��� ���n�����������������+�������������.������*���0������[������p�����������������"�������������� +-����������������������������*������G������V������c������}��� ��������������*���ٙ�����������������&���?���:������z�����������������1���Ϛ�����������������3���!���R��� ���t��� +-������������������������ћ������������������������&���!���D������f���-�����������������͜��������������!��� ������B������R������r���"���{���#���������������؝������������������/���(���J������s���������������������������ڞ�� ������(����������#��� ���<��� ���]���!���k�����������������"�������������������&����������$������;������Z������w������������������������!���֠�� �������(������#���B������f������}���!��������������)���ߡ�� ��� ���/���*������Z������f������{��������������������Т��1���������������6������S������c���=���~���A�����������������������7������M��� +-���d������o����������"������� ���ä�� ��������������� ���)���*������T������a������m����������������������������������Х�� ��������������� +-������&������3������K���+���[�����������������%����������٦��+���������������*������9������W��� ���o���-�������/�������*���������������(������H������_������o���������������������������Ĩ�����ڨ�����������������,������J������c������|������������������������ֱ��%������G������ ���Y��� ���z���+����������Ǵ��-���ߴ����� ������������4������G���'���^���R�������,���ٵ��<������>���C���:�������F�������%������%���*���)���P������z���������������������������ٷ��-�������2���%���-���X���$�������I�������/�������&���%���*���L���$���w���:������������)������"������-���4���#���b���7�������/�������"������������"���0���$���S���>���x���0�������5������*������<���I���#�������"�������$���ͼ��-������B��� ���B���c���&������� ���ͽ��������,������.���9���Q���h���S����������������%���#���D������h������x���,�������!����������ܿ��"������!������%���6���*���\���*�������4�������9�������'���!���$���I���'���n���.��������������.�������*������7���.������f���1���s����������O�������F������L���\���5��������������,�������2���"���"���U������x�����������������/��������������H���������`���A���t���A�������=�������=���6������t����������9�������;�������;���&������b�����������������������������������������������������'������F������`���3���{���8������� �������@����������7������D���8���^���:���������������������,������B���>���@��������������!�������D�������3���8������l���L�������>�������������.���5���+���d����������?��������������"������-���$���(���R���(���{���$�������&�������,�������!���������?���!���^���F������� �������0�������2������'���L���,���t���-�������;�������D���������P������`���B���q���!�������.�������-������@���3������t���)�������1�������'�������.������'���A���&���i���T�������\�������[���B���T�������b�������%���V���,���|���*�������-�������1������,���4���4���a���5�������4�������-������/���/���/���_���*��������������*�������4���������:��� ���U��� ���c���#���q���!�������$������������������������������%���*���7���!���b���(�������<��������������������������0���)���!���Z���1���|����������(���������������������������#���.������R���=���q���-�������$�������*������A���-���G���o���q�������X���)���E�������=����������������������>������[������n���,��������������'�������%�������%���!���/���G���%���w���/�������,��������������n����������9��S��1����������������������)�������������q���p���1�����/���c���������"���L�������d���f�������0������������������������� +-�������������������������������� ������<�������������������������I�����������;������(��Y���U������������������A�����������������������'���������������������-������H��������������F��z�������o���������������'����������a�������n��H������C������F��������������m��j���_���>�����������������������������,������g�������������.��������������������������B�����������6������0���i�������?�������M��4�������������������������3�����������s��������������������������������������P�����E������`�����������������G�������I��-��l������������:���������������������A�����=������#��[��������������������+�� �������������������������������������������*�������������;��k���u������F��>��������������� ��������������p�������������������������@������"����������Q������7����������t������������������������?������=����������������*������V���B�����v��f������������E���H��7���������������������-��������7���������2������3������������������9������W��3������?�����������������������.���r��d�������������������������$�������������m���������%������u��K�������%�������������\��D��t������O����������G������������������������X��J��Z�����@����������������������������� ��8�����������������5���.��r������q������������=�������2������y������:���������������������������[����������������4����������/������������������������������������������{���c�������Q��`��z��+���h������������������������������������������^���������������������s�����h������R���������J��������������S���&��C�������������U��:������>�����"��������������(���|������K��������� ��������������������������i��������������������x���~��������J��� �������!��,����������������������T���������������������5������e���������!��a�������������b���������������,������������j�����������������Y��P���L���������������������������������������������������������������D���N�����������C����������������&���<��l��}�����������������I�����������/������������������6��_���������1��������2�������*��D�����6���������������X�������������������+���������]������8���~���T��������(����������G��w������������������]������������W���V������������������������������A���������O��������������������������������������������������������������������������������)��R��4����������������������g��k����������'�������v������Z����������������������������������������������������������y�� ������\���#����������������������@����������8��#��N��^������;������������������ ������������������������x��M�������{������������������������������o���������0��<�������}��$�����������E��9���������|���������������������5��w��$��������� ��!������������ +-��b������ +-��������������������&������e�������������B������������)���%������� rpcinfo -b prognum versnum +-� rpcinfo -d prognum versnum +-� rpcinfo -p [ host ] +-� rpcinfo [ -n portnum ] -t host prognum [ versnum ] +-� program vers proto port +-� (rule from "%s", line %d)� done +-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed. +-�%s%s%s:%u: %s%sUnexpected error: %s. +-�%s%sUnknown signal %d +-�%s: %d did not sign extend correctly +-�%s: <mb_cur_max> must be greater than <mb_cur_min> +-�%s: Can't create %s: %s +-�%s: Can't create directory %s: %s +-�%s: Can't link from %s to %s: %s +-�%s: Can't open %s: %s +-�%s: Can't remove %s: %s +-�%s: Error closing %s: %s +-�%s: Error reading %s +-�%s: Error writing %s +-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s +-�%s: Memory exhausted: %s +-�%s: More than one -L option specified +-�%s: More than one -d option specified +-�%s: More than one -l option specified +-�%s: More than one -p option specified +-�%s: More than one -y option specified +-�%s: command was '%s', result was %d +-�%s: error in state machine�%s: illegal option -- %c +-�%s: invalid option -- %c +-�%s: option `%c%s' doesn't allow an argument +-�%s: option `%s' is ambiguous +-�%s: option `%s' requires an argument +-�%s: option `--%s' doesn't allow an argument +-�%s: option `-W %s' doesn't allow an argument +-�%s: option `-W %s' is ambiguous +-�%s: option requires an argument -- %c +-�%s: panic: Invalid l_value %d +-�%s: premature end of file�%s: unrecognized option `%c%s' +-�%s: unrecognized option `--%s' +-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ] +- [ -L leapseconds ] [ -y yearistype ] [ filename ... ] +-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ... +-�(unknown authentication error - %d)�(unknown)�*standard input*�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Accessing a corrupted shared library�Address already in use�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempting to link in too many shared libraries�Authentication OK�Authentication error�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Block device required�Broadcast select problem�Broken pipe�Bus error�CPU time limit exceeded�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Channel number out of range�Child exited�Client credential too weak�Communication error on send�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Copyright (C) %s Free Software Foundation, Inc. +-This is free software; see the source for copying conditions. There is NO +-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-�Cputime limit exceeded�Database is busy�Destination address required�Device not a stream�Device not configured�Device or resource busy�Directory not empty�Disc quota exceeded�Domain not bound�EMT trap�Error %d�Error in unknown error system: �Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�Filesize limit exceeded�Floating point exception�Function not implemented�Gratuitous error�Hangup�Host is down�Host name lookup failure�I/O possible�IOT trap�Identifier removed�Illegal Instruction�Illegal instruction�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Killed�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link has been severed�Link number out of range�Local domain name not set�Local resource allocation failure�Machine is not on the network�Memory exhausted�Message too long�Multihop attempted�NIS client/server version mismatch - can't supply service�NIS map data base is bad�Name not unique on network�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with name�No anode�No buffer space available�No child processes�No data available�No locks available�No match�No medium found�No message of desired type�No more records in map databank�No previous regular expression�No remote programs registered. +-�No route to host�No space left on device�No such file or directory�No such key in map�No such map in server's domain�No such process�Not a XENIX named type file�Not a directory�Numerical argument out of domain�Numerical result out of range�Object is remote�Odd number of quotation marks�Operation already in progress�Operation not permitted�Operation not supported�Operation not supported by device�Operation now in progress�Operation would block�Out of streams resources�Package not installed�Permission denied�Power failure�Premature end of regular expression�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RTLD_NEXT used in code not dynamically loaded�Read-only file system�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Report bugs using the `glibcbug' script to <bugs@gnu.org>. +-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Segmentation fault�Server rejected credential�Server rejected verifier�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Srmount error�Stack fault�Stale NFS file handle�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�System resource allocation failure�Terminated�Text file busy�Timer expired�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/BPT trap�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' for more information. +-�Trying %s... +-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown error �Unknown host�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage: %s [OPTION]... -o OUTPUT-FILE [INPUT-FILE]... +- %s [OPTION]... [OUTPUT-FILE [INPUT-FILE]...] +-Mandatory arguments to long options are mandatory for short options too. +- -H, --header=NAME create C header file NAME containing symbol definitions +- -h, --help display this help and exit +- --new do not use existing catalog, force new output file +- -o, --output=NAME write output to file NAME +- -V, --version output version information and exit +-If INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-�Usage: %s [OPTION]... INPUT-FILE OUTPUT-FILE +- %s [OPTION]... -o OUTPUT-FILE INPUT-FILE +- %s [OPTION]... -u INPUT-FILE +-Mandatory arguments to long options are mandatory for short options too. +- -f, --fold-case convert key to lower case +- -h, --help display this help and exit +- -o, --output=NAME write output to file NAME +- --quiet don't print messages while building databank +- -u, --undo print content of databank file, one entry a line +- -V, --version output version information and exit +-If INPUT-FILE is -, input is read from standard input. +-�Usage: %s [OPTION]... name +-Mandatory arguments to long options are mandatory for short options too. +- -c, --force create output even if warning messages were issued +- -h, --help display this help and exit +- -f, --charmap=FILE symbolic character names defined in FILE +- -i, --inputfile=FILE source definitions are found in FILE +- -u, --code-set-name=NAME specify code set for mapping ISO 10646 elements +- -v, --verbose print more messages +- -V, --version output version information and exit +- --posix be strictly POSIX conform +- +-System's directory for character maps: %s +- locale files : %s +-�Usage: %s [OPTION]... name +-Mandatory arguments to long options are mandatory for short options too. +- -h, --help display this help and exit +- -V, --version output version information and exit +- +- -a, --all-locales write names of available locales +- -m, --charmaps write names of available charmaps +- +- -c, --category-name write names of selected categories +- -k, --keyword-name write names of selected keywords +-�Usage: %s variable_name [pathname] +-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Written by %s. +-�Wrong medium type�YPBINDPROC_DOMAIN: %s +-�You really blew it this time�Zone continuation line end time is not after end time of previous line�`%1$s' definition does not end with `END %1$s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice�bogus mcheck_status, library is buggy�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d +-�cannot `stat' locale file `%s'�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot open�cannot open databank file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot process order specification�cannot read character map directory `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot write output files to `%s'�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �couldn't create an rpc server +-�couldn't register prog %d vers %d +-�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�end point of ellipsis range is bigger then start�error while inserting collation element into hash table�error while inserting to hash table�expect string argument for `copy'�expected continuation line not found�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�get_myaddress: ioctl (get interface configuration)�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal names for character range�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incorrectly formatted file�input line of unknown type�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid GMT offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�memory clobbered before allocated block�memory clobbered past end of allocated block�memory exhausted�memory exhausted +-�memory is consistent, library is buggy�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�never registered prog %d +-�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�only WIDTH definitions are allowed to follow the CHARMAP definition�problems while reading `%s'�program %lu is not available +-�program %lu version %lu is not available +-�program %lu version %lu ready and waiting +-�rcmd: select (setting up stderr): %m +-�rcmd: socket: All ports in use +-�rcmd: write (setting up stderr): %m +-�registerrpc: out of memory +-�repeated leap second moment�rpcinfo: %s is unknown host +-�rpcinfo: %s is unknown service +-�rpcinfo: Could not delete registration for prog %s version %s +-�rpcinfo: broadcast failed: %s +-�rpcinfo: can't contact portmapper�rpcinfo: can't contact portmapper: �same rule name in multiple files�select: protocol failure in circuit setup +-�socket: protocol failure in circuit setup +-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp: makefd_xprt: out of memory +-�svctcp_.c - cannot getsockname or listen�svctcp_.c - udp socket creation problem�svctcp_create: out of memory +-�svcudp_create - cannot getsockname�svcudp_create: socket creation problem�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d +-�two lines in a row containing `...' are not allowed�typed single year�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�values for field `%s' in category `%s' must not be zero�while opening UTMP file�while opening old catalog file�while preparing output�while reading databank�while writing databank file�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�yp_update: cannot convert host to netname +-�yp_update: cannot get server address +-�Project-Id-Version: libc 2.0.7 +-POT-Creation-Date: 1998-07-26 08:57-0700 +-PO-Revision-Date: 1998-12-12 15:50+0100 +-Last-Translator: Andr� van Dijk <ady@unseen.demon.nl> +-Language-Team: Dutch <nl@li.org> +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=ISO-8859-1 +-Content-Transfer-Encoding: 8-bit +-� rpcinfo -b programma nummer versienummer +-� rpcinfo -d programmanummer versienummer +-� rpcinfo -p [ host ] +-� rpcinfo [ -n poortnummer ] -t host programmanummer [ versienummer ] +-� program vers proto port +-� (voorwaarde uit "%s", regel %d)� klaar +-�"%s", regel %d: %s�"Zone %s" regel en -l optie gaan niet samen�"Zone %s" regel en -p optie gaan niet samen�%s in regelloze zone�%s%s%s:%u: %s%sAssertie `%s' faalde. +-�%s%s%s:%u: %s%sOnverwachte fout: %s. +-�%s%sOnbekend signaal %d +-�%s: %d heeft `extend' niet juist gesigneerd +-�%s: <mb_cur_max> moet groter zijn dan <mb_cur_min> +-�%s: Kan %s niet aanmaken: %s +-�%s: Kan map %s niet aanmaken: %s +-�%s: Kan %s niet koppelen met %s: %s +-�%s: Kan %s niet openen: %s +-�%s: Kan %s niet verwijderen: %s +-�%s: Fout bij sluiten %s: %s +-�%s: Fout bij lezen %s +-�%s: Fout bij schrijven %s +-�%s: Fout bij schrijven standaarduitvoer �%s: Schrikkelregel in niet schrikkelseconde bestand %s (FIXME) +-�%s: Geheugen uitgeput: %s +-�%s: Meer dan een -L optie gegeven +-�%s: Meer dan een -d optie gegeven +-�%s: Meer dan een -l optie gegeven +-�%s: Meer dan een -p optie gegeven +-�%s: Meer dan een -y optie gegeven +-�%s: commando was '%s', resultaat was %d +-�%s: fout in state machine�%s: onjuiste optie -- %c +-�%s: onjuiste optie -- %c +-�%s: optie `%c%s' staat geen argument toe +-�%s: optie `%s' is ambiguous +-�%s: optie `%s' vereist een argument +-�%s: optie `--%s' staat geen argument toe +-�%s: optie `-W %s' staat geen argument toe +-�%s: optie `-W %s' is dubbelzinnig +-�%s: optie vereist een argument -- %c +-�%s: paniek: Onjuiste `l_value' %d +-�%s: voorbarig einde van bestand�%s: onbekende optie `%c%s' +-�%s: onbekende optie `--%s' +-�%s: gebruik is %s [ -s ] [ -v ] +-[ -l lokale tijd ] [ -p posixregels ] [ -d directory ] +-[ -L schrikkelseconden ] [ -y jaartype ] [ bestandsnaam ... ] +-�%s: gebruik is %s [ -v ] [ -c afbreken ] zonenaam ... +-�(onbekende authenticatie fout - %d)�(onbekend)�*standaardinvoer*�.lib deel in a.out corrupt�; lage versie = %lu, hoge versie = %lu (FIXME)�; waarom = �<SP> teken mag geen onderdeel zijn van klasse `%s'�<SP> teken geen onderdeel van klasse `%s'�?�Afgebroken�Benaderen van een beschadigde deel-bibliotheek�Adres reeds in gebruik�Adres familie niet ondersteund door protocol�Advertise fout�Alarmklok�Argumentenlijst is te lang�Tracht in te veel deelbibliotheken te linken�Authenticatie OK�Authenticatie fout�Onjuist adres�Onjuiste bestandsbeschrijver�Onjuist lettertype bestandsformaat�Onjuiste melding�Onjuiste systeemaanroep�Blokapparaat vereist�Omroep selectie probleem�Onderbroken pijp�Bus fout�CPU tijdlimiet overschreden�Kan geen toegang verkrijgen tot benodigd deelbibliotheekbestand�Kan geen verbinding maken met server van dit domein�Kan niet communiceren met portmapper�Kan niet communiceren met ypbind�Kan niet communiceren met ypserv�Kan geen geheugen reserveren�Kan gevraagde adres niet toewijzen�Kan geen `socket' maken voor omroep rpc�Kan een deelbibliotheek niet rechtstreeks uitvoeren�Kan geen antwoord ontvangen om te zenden�Kan dienst niet registreren�Kan niet zenden na afsluiting transporteindpunt�Kan omroep pakket niet verzenden�Kan socket optie SO_BROADCAST niet instellen�Kanaal nummer buiten domein�Kind gestopt�Klant credential is te zwak (FIXME)�Communicatie fout bij zenden�Computer heeft het loodje gelegd�Berekenen tabelgrootte voor tekenklassen kan even duren...�Berekenen tabelgrootte voor collation informatie kan even duren...�Verbinding geweigerd�Verbinding reset door `peer'�Verbinding timed out�Voorgezet�Kopierecht (C) %s Free Software Foundation, Inc. +-Dit is vrije programmatuur; zie de bron-code voor copieervoorwaarden. +-Er is GEEN garantie; zelfs niet voor VERKOOPBAARHEID of GESCHIKTHEID +-VOOR EEN BEPAALD DOEL. +-�CPU-tijdslimiet overschreden�Database is bezig�Bestemmingsadres vereist�Apparaat is geen `stream'�Apparaat niet geconfigureerd�Apparaat of bron bezig�Map niet leeg�Schijf quota overschreden�Domein niet gebonden�EMT trap�Fout %d�Fout in onbekend fout systeem: �Fout: .netrc bestand is leesbaar voor anderen.�Uitwisseling vol�Exec formaat fout�FATAAL: systeem heeft `_POSIX2_LOCALEDEF' niet gedefinieerd�Gefaald (onbekende fout)�Bestandsbeschrijver in slechte staat�Bestand bestaat�Bestandsslot deadlock fout�Bestandsnaam te lang�Bestandsgrootte limiet overschreden�Bestand te groot�Bestandsgrootte limiet overschreden�Drijvende komma uitzondering�Functie niet ge�mplementeerd�Gratuitous (FIXME) fout�Ophangen�Computer is buiten werking�Fout bij opzoeken computernaam�I/O mogelijk�IOT trap (FIXME)�Identifier verwijderd�Ongeldige instructie�Ongeldige instructie�Ongeldig spoelen�Ongeschikt bestandstype of bestandsformaat�Ongeschikte `ioctl' voor apparaat�Ongeschikte bewerking voor achtergrond proces�Informatie-aanvraag�Invoer/uitvoer fout�Interne NIS fout�Interne ypbind fout�Onderbreking�Onderbroken systeemaanroep�Onderbroken systeemaanroep moet opnieuw gestart worden�Onjuist argument�Onjuiste terugverwijzing�Onjuiste tekenklassenaam�Onjuiste klant credential (FIXME)�Ongeldige klant verifier (FIXME)�Ongeldig sorteerteken�Ongeldige inhoud van \{\}�Ongeldige apparaat overschrijende koppeling�Onjuiste uitwisseling�Ongeldig of incompleet multibyte of wijd teken�Ongeldige voorafgaande reguliere expressie�Onjuist bereik einde�Onjuiste reguliere expressie�Ongeldige vraag code�Onjuiste vraag beschrijver�Onjuiste `server' verifier (FIXME)�Onjuist slot�Is een map�Is een benoemd bestandstype�Gedood�Nivo 2 gestopt�Nivo 2 niet gesynchroniseerd�Nivo 3 gestopt�Nivo 3 reset�Verwijzing is onderbroken�Verwijzingsnummer buiten bereik�Lokale domeinnaam niet ingesteld�Lokale brontoewijzingsfout�Machine is niet aangesloten op het netwerk�Geheugen uitgeput�Melding te lang�Multihop geprobeerd�NIS klant/server versie verschillend - kan geen diensten bieden�NIS map databank is slecht�Naam is niet uniek op netwerk�Heb een authenticator nodig�Netwerk heeft verbinding verbroken bij herstellen�Netwerk is buiten werking�Netwerk is onbereikbaar�Geen CSI structuur beschikbaar�Geen XENIX semaphoren beschikbaar�Geen adres geassocieerd met naam�Geen anode�Geen bufferruimte beschikbaar�Geen kindprocessen�Geen data beschikbaar�Geen sloten beschikbaar�Geen overeenkomst�Geen medium gevonden�Geen melding van gewenst type�Niet meer records in map databank�Geen vorige reguliere expressie�Geen `op-afstand' programma's geregistreerd. +-�Geen route naar computer�Geen ruimte meer op apparaat�Onbekend bestand of map�Sleutel bestaat niet in kaart�Kaart bestat niet in serverdomein�Onbekend proces�Geen XENIX benoemd type bestand�Geen map�Numeriek argument is buiten domein�Numeriek resultaat is buiten domein�Object is niet lokaal�Oneven aantal aanhalingstekens�Bewerking al in voorbereiding�Bewerking niet toegestaan�Bewerking niet ondersteund�Bewerking niet ondersteund door apparaat�Bewerking in voorbereiding�Bewerking zou blokkeren�Geen streams bronnen meer�Pakket niet ge�nstalleerd�Toegang geweigerd�Stroomstoring�Voortijdig einde van reguliere expressie�Profiling timer verlopen�Protocol driver niet aangesloten�Protocol fout�Protocol familie niet ondersteund�Protocol niet beschikbaar�Protocol niet ondersteund�Protocol verkeerd type voor socket�Stop�RFS specifieke fout�RPC verkeerde procedure voor programma�RPC fout bij NIS actie�RPC programma niet beschikbaar�RPC programma versie onjuist�RPC structuur is onjuist�RPC versie onjuist�RPC: (onbekende fout code)�RPC: Authenticatie fout�RPC: Kan resultaat niet decoderen�RPC: Kan argumenten niet coderen�RPC: Gefaald (niet gespecificeerde fout)�RPC: Niet uitwisselbare RPC-versies�RPC: Port mapper faalt�RPC: Procedure niet beschikbaar�RPC: Programma niet geregistreerd�RPC: Programma niet beschikbaar�RPC: Programma/versie niet overeenkomstig�RPC: Remote systeem fout (FIXME)�RPC: Server kan argument niet decoderen (FIXME)�RPC: Succes�RPC: Tijd verstreken�RPC: Niet in staat te ontvangen�RPC: Niet in staat te zenden�RPC: Onbekende computer�RPC: Onbekend protocol�RTLD_NEXT gebruikt in niet dynamisch geladen code�Alleen-lezen bestandssysteem�Reguliere expressie te groot�Remote I/O fout�Op-afstand adres gewijzigd�Verwijder wachtwoord of maak bestand onleesbaar voor anderen.�Meld fouten met het `glibcbug' script aan <bugs@gnu.ai.mit.edu>. +-�Verkeerde verzoek argumenten�Resolver Fout 0 (geen fout)�Resolver interne fout�Bron deadlock vermeden�Bron kwijt�Bron tijdelijk niet beschikbaar�Segmentatie fout�Server rejected credential (FIXME)�Server rejected verifier (FIXME)�Signaal 0�Socket operatie op niet-socket�Socket type niet ondersteund�Software veroorzaakte afbreken verbinding�Srmount fout�Stapel fout�Stale NFS file handle (FIMXE)�Gestopt�Gestopt (signaal)�Gestopt (tty invoer)�Gestopt (tty uitvoer)�Stromen pijp fout�Struktuur heeft schoonmaak nodig�Succes�Systeembron toewijzingsfout�Getermineerd�Tekstbestand in gebruik�Timer afgelopen�Te veel nivo's van symbolische verwijzingen�Te veel verwijzingen�Te veel open bestanden�Te veel geopende bestanden op systeem�Te veel processen�Te veel referenties: kan `splice' niet doen�Te veel gebruikers�Trace/BPT trap�Trace/breakpoint trap (FIXME)�Aanhangende `backslash'�Vertaler overleden (da's jammer)�Er is al verbinding met het transporteindpunt�Er is geen verbinding met het transporteindpunt�Probeer `%s --help' voor meer informatie. +-�Probeer %s... +-�Onbekend .netrc sleutelwoord %s�Onbekende NIS foutcode�Onbekende fout �Onbekende computer�Onbekende resolver-fout�Onbekende server-fout�Onbekend signaal %d�Onbekende systeemfout�Onbekende ypbind-fout�Niet corresponderende ( of \(�Niet corresponderende ) of \)�Niet corresponderende [ of [^�Niet corresponderende \{�Onbekende variabele `%s'�Dringende I/O conditie�Gebruik: %s [OPTIE]... -o UITVOER-BESTAND [INVOER-BESTAND]... +- %s [OPTIE]... [UITVOER-BESTAND [INVOER-BESTAND]...] +-Verplichte argumenten bij lange opties zijn ook verplicht bij korte opties. +- -H, --header=NAAM maak C header bestand NAAM met symbooldefinities +- -h, --help toon hulp-tekst en be�indig programma +- --new gebruik niet een bestaande catalog, maak een nieuwe +- -o, --output=NAAM schrijf uitvoer naar bestand NAAM +- -V, --version toon versie-informatie en be�indig programma +-Als INVOER-BESTAND is -, lees invoer uit standardinvoer. Als UITVOER-BESTAND +-is -, schrijf uitvoer naar standaarduitvoer. +-�Gebruik: %s [OPTIE]... INVOER-BESTAND UITVOER-BESTAND +- %s [OPTIE]... -o UITVOER-BESTAND [INVOER-BESTAND] +- %s [OPTIE]... -u INVOER-BESTAND +-Verplichte argument bij lange opties zijn ook verplicht bij korte opties. +- -f, --fold-case converteer sleutel naar kleine letters +- -h, --help toon hulp-tekst en be�indig programma +- -o, --output=NAAM schrijf uitvoer naar bestand NAAM +- --quiet toon geen meldingen bij aanmaken databank +- -u, --undo toon inhoud van databank bestand, een item per regel +- -V, --version toon versie-informatie en be�indig programma +-Als INVOER-BESTAND is -, lees invoer uit standardinvoer. +-Meld fouten via <bug-glibc@prep.ai.mit.edu>. +-�Aanroep: %s [OPTIE]... naam +-Verplichte argumenten bij lange opties zijn ook verplicht bij korte opties. +- -c, --force maak uitvoer zelfs als waarschuwing werden gegeven +- -h, --help toon hulptekst en be�indig programma +- -f, --charmap=BESTAND symbolische tekennamen gedefinieerd in BESTAND +- -i, --inputfile=BESTAND bron definities zijn gevonden in BESTAND +- -u, --code-set-name=NAAM specificeer codeset voor mappen ISO 10646 elementen +- -v, --verbose toon meer meldingen +- -V, --version toon versie-informatie en be�indig programma +- --posix volg de POSIX afspraken +- +-Systeemmap voor tekenset: %s +- locale bestanden: %s +-Meld fouten aan <bug-glibc@prep.ai.mit.edu>. +-�Aanroep: %s [OPTIE]... naam +-Verplichte argumenten bij lange opties zijn ook verplicht bij korte opties. +- -h, --help toon hulptekst en be�indig programma +- -V, --version toon versie-informatie en be�indig programma +- +- -a, --all-locales toon namen van beschikbare localen +- -m, --charmaps toon namen van beschikbare tekensets +- +- -c, --category-name toon namen van geselecteerde categorie�n +- -k, --keyword-name toon namen van geselecteerde sleutelwoorden +-Meld fouten aan <bug-glibc@prep.ai.mit.edu>. +-�Gebruik: %s variabele_naam [padnaam] +-�Gebruik: rpcinfo [ -n portnummer ] -u host prognummer [ versienummer ] +-�Gebruiker gedefinieerd signaal 1�Gebruiker gedefinieerd signaal 2�Waarde te groot voor gedefinieerd data-type�Virtuele timer verlopen�Wild resultaat afkomstig uit commando uitvoer�Venster veranderd�Geschreven door %s. +-�Onjuist mediumtype�YPBINDPROC_DOMAIN: %s +-�Deze keer heb je het echt goed verknalt�Zone voortgangsregel eindigingstijd is niet na eindigingstijd van voorgaande regel�`%1$s' definitie eindigt niet met `END %1$s'�`-1' moet de laatste ingang zijn `%s' veld in `%s' categorie�`...' mag alleen gebruikt worden `...' en `UNDEFINED' ingangen�verwacht `from' na eerste argument van `collating-element'�`from' string in vergelijkende element declaratie bevat onbekend teken�argument van <%s> moet ��n teken zijn�argument van `%s' moet ��n teken zijn�auth_none.c - Fataal marshalling probleem�onjuist argument�onjuiste eigenaar�leeg FROM veld op `Link' regel�leeg TO veld op `Link' regel�blok is twee keer vrijgegeven�bogus mcheck_status, bibliotheek is maar zozo�broadcast: ioctl (verkrijg interface configuratie)�broadcast: ioctl (verkrijg interface vlaggen)�cache_set: slachtoffer niet gevonden�kan tijdzone-afkorting (te gebruiken na tijdsaanduiding) niet achterhalen�kan procedure nummer %d niet opnieuw toewijzen +-�kan locale bestand niet benaderen `%s'�kan collation element `%.*s' niet invoegen�kan niet invoegen in resultaat tabel�kan geen nieuw vergelijking symbool definitie invoegen: %s�kan niet openen�kan databank bestand `%s' niet openen: %s�kan invoerbestand `%s' niet openen�kan locale definitie bestand `%s' niet openen�kan uitvoerbestand `%s' niet openen�kan uitvoerbestand `%s' niet openen voor categorie `%s'�kan de gespecificeerde volgorde niet afhandelen�kan tekenkaart map `%s' niet lezen�kan locale map `%s' niet lezen�kan locale bestand `%s' niet lezen�kan uitvoer niet schrijven naar `%s'�categorie data meer dan eens gevraagd: zou niet mogen gebeuren�teken %s'%s' in klasse `%s' hoort in klasse `%s'�teken %s'%s' in klasse `%s' hoort niet in klasse `%s'�teken <SP> niet gedefinieerd in tekenkaart�teken `%s' niet gedefinieerd maar nodig als standaard waarde�tekenklasse `%s' is al gedefinieerd�tekenkaart `%s' is al gedefinieerd�tekenkaartbestand `%s' niet gevonden�clnt_raw.c - Fataal header serializatie fout.�vergelijkings element `%.*s' komt meer dan eens voor: negeer regel�vergelijkings symbool `%.*s' komt meer dan eens voor: negeer regel�vergelijkings symbool verwacht na `%s'�verbinding maken naar adres %s: �kan geen rpc server aanmaken +-�kan programma %d versie %d niet registreren +-�standaard tekenkaartbestand `%s' niet gevonden�richtingsvlag in string %d in tijdperkveld in categorie `%s' is niet '+' noch '-'�richtingsvlag in string %d in tijperkveld in categorie `%s' is niet een enkel teken�dubbele tekennaam `%s'�dubbel sorteerelementdefinitie�dubbele definitie voor teken `%.*s'�dubbele sleutel�tweede set definitie�dubbele zonenaam %s (bestand "%s", regel %d)�gedupliceerde meldings identifier�dubbel meldingnummer�lege gewicht naam: regel genegeerd�enablecache: cache is al mogelijk�enablecache: kan geen cache alloceren�enablecache: kan geen cache data alloceren�enablecache: kan geen cache fifo alloceren�eindpunt van ellipsis bereik is groter dan startpunt�fout tijdens invoegen vergelijkings element in hash tabel�fout tijdens bij invoegen in hash tabel�verwacht string argument voor `copy'�verwachte voortgangsregel niet gevonden�gefaald bij schrijven data voor categorie `%s'�fcntl: F_SETFD�veld `%s' uit categorie `%s' niet gedefinieerd�veld `%s' uit category `%s' ongedefinieerd�van-waarde van `collating-element' moet een string zijn�fstat faalde�rommel aan het einde van de tekencodespecificatie�rommel aan het einde van nummer�rommel aan einde van offset waarde in string %d in `era' veld in categorie `%s'�rommel aan einde van begin datum in %d in `era' veld in categorie `%s'�rommel aan einde van eind datum in string %d in `era' veld in categorie `%s'�get_myaddress: ioctl (haal interface configuratie op)�ergens hard gekoppeld�ongeldige CORRECTION veld op schrikkel regel�ongeldig Rolling/Stationary veld op schrikkelregel�ongeldige tekenconstante in string�ongelding vergelijkings element�ongeldige definitie�ongeldige codering gegeven�ongeldige escape reeks aan het einde van string�ongeldige namen voor tekenreeks�ongeldig nummer voor offset in string %d in `era' veld in categorie `%s'�ongeldig set nummer�ongeldig begin datum in string %d in `era' veld in categorie `%s'�ongeldige eind datum in string %d in `era' veld in categorie `%s'�implementatielimiet: niet meer dan %d tekenklassen toegestaan�implementatielimiet: niet meer dan %d tekenkaarten toegestaan�onjuist geformateerd bestand�invoer regel van onbekend type�interne fout - `addtype' aangeroepen met onjuiste `isdst'�interne fout - `addtype' aangeroepen met onjuiste `ttisgmt'�interne fout - `addtype' aangeroepen met onjuiste `ttisstd'�interne fout in %s, regel %u�onjuiste GMT offset�onjuist afkortingsformaat�ongeldige dag van de maand�ongeldig ending jaar (FIXME)�ongeldig schrikkeljaar�ongeldige maandnaam�ongeldig bewaarde tijd�ongeldig starting jaar (FIXME)�ongeldige tijd van de dag�ongeldig naam voor weekdag�regel na ellipsis moet een teken definitie bevatten�regel voor ellipsis bevat geen constante teken definitie�regel te lang�locale bestand `%s', gebruikt in `copy' statement, niet gevonden�lstat faalde�verkeerde regel genegeerd�geheugen clobbered voordat blok gereserveerd was (FIXME)�geheugen `clobbered' na het einde van een gealloceerd blok�geen geheugen meer beschikbaar�geen geheugen meer beschikbaar +-�geheugen is consistent, bibliotheek is buggy�ontbrekend era formaat in string %d in `era' veld in category `%s'�ontbrekende era naam in string %d in `era' veld in category `%s'�naamloze regel�nooit geregistreerd programma %d +-�geen correct reguliere expressie voor veld `%s' in category `%s': %s�geen enkele dag van de maand voldoet aan voorwaarde�geen definitie van `UNDEFINED'�geen ander sleutelwoord mag worden gespecificeerd wanneer `copy' is gebruikt�geen uitvoer bestand gemaakt omdat waarschuwingen zijn gegeven�geen symbolische naam gegeven�geen symbolisch naam gegeven voor einde bereik�geen gewicht gedefinieerd voor symbool `%s'�geen gewoon bestand�alleen WIDTH definities zijn toegestaan na de CHARMAP definitie�problemem tijdens lezen `%s'�programma %lu is niet beschikbaar +-�programma %lu versie %lu is niet beschikbaar +-�programma %lu versie %lu klaar en wacht +-�rcmd: selecteer (setting up stderr): %m +-�rcmd: socket: Alle ports in gebruik +-�rcmd: schrijf (setting up stderr): %m +-�registerrpc: geen geheugen meer beschikbaar +-�herhalend schrikkelseconde moment�rpcinfo: %s is onbekende host +-�rpcinfo: %s is onbekende service +-�rpcinfo: Kan geen registratie verwijderen voor programma %s versie %s +-�rpcinfo: uitzending mislukt: %s +-�rpcinfo: kan geen kontakt krijgen met portmapper�rpcinfo: kan geen kontakt krijgen met portmapper: �zelfde regel naam in meerdere bestanden�select: protocol mislukt in opstart circuit +-�socket: protocol mislukt in opstart circuit. +-�sorteervolgorde `forward' en `backward' zijn niet eenduidig�specificatie van sorteergewich voor collation symbool heeft geen zin�standaardinvoer�standaarduitvoer�begindatum is ongeldig in string %d in `era' veld in category `%s'�beginjaar is groter dan eindejaar�beginjaar is te groot om weergegeven te worden�beginjaar is te laag om weergegeven te worden�einddatum is onjuist in string %d in `era' veld in category `%s'�svc_run: - select mislukt�svc_tcp: makefd_xprt: geen geheugen meer +-�svctcp_.c - `getsockname' of `listen' lukken niet�svctcp_.c - udp socket aanmaak probleem�svctcp_create: geen geheugen meer beschikbaar +-�svcudp_create - `getsockname' lukt niet�svcudp_create: socket aanmaak probleem�symbool voor multikarakter vergelijkings element `%.*s' dupliceerd +-element definitie�symbool voor multikarakter vergelijkings element `%.*s' dupliceert +-andere element definities�symbool voor multikarakter vergelijkings element `%.*s' dupliceert +-andere symbool definitie�symbool voor multikarakters vergelijkings element `%.*s' dupliceerd symbooldefinitie�symbool voor multikarakter vergelijkings element `%.*s' dupliceerd symbolische naam in karakterset�syntactische fout in %s definitie: %s�syntactische fout in `order_start' directief�syntactische fout in tekenklasse definitie�syntactische fout in tekenomzettingsdefinitie�syntactische fout in collating volgorde definitie�syntactische fout in vergelijkings definitie�syntactische fout in definitie van LC_CTYPE category�syntactische fout in definitie van nieuwe tekenklasse�syntactische fout in definitie van nieuwe tekenkaart�syntactische fout in melding locale definitie�syntactische fout in monetaire locale definitie�syntactische fout in numerieke locale definitie�syntactische fout in volgorde specificatie�syntactische fout in prolog: %s�syntactische fout in tijd locale definitie�syntactische fout: niet in een locale definitie deel�dit is de eerste definitie�tijd voor nul�tijd overflow�te weinig bytes in karaktercodering�te veel bytes in karaktercodering�te veel karakterklassen gedefinieerd�te veel schrikkelseconden�te veel lokale tijd typen�te veel overgangen?!�te veel gewichten�te veel, of te lange, tijdzone afkortingen�rommel aan het einde van de regel�moeite met antwoorden naar programma %d +-�twee regels in een rij bevattende `...' zijn niet toegestaan�typed enkel jaar (FIMXE)�ongedefinieerd�onbekend karakter `%s'�onbekend karakter in veld `%s' uit category `%s'�onbekende vergelijkings afgeleide�onbekende richtlijn `%s': regel genegeerd (FIXME)�onbekende set `%s'�onbekend symbool `%.*s': regel genegeerd�regelloze zone�niet getermineerde melding�niet getermineerde string�niet getermineerde symbolische naam�niet getermineerde gewichtnaam�grootste limiet in bereik is niet kleiner dan kleinste limiet�gebruik van 29 februari in niet schrikkeljaar�waarde voor %s moet een integer zijn�waarde voor <%s> moet tussen 1 en 4 liggen�waarde voor veld `%s' in categorie `%s' mag geen lege string zijn�waarde van <mb_cur_max> moet groter zijn dan de waarde van <mb_cur_min>�waarde van veld `int_curr_symbol' in categorie `LC_MONETARY' +-korrespondeert niet met een geldige naam in ISO 4217�de lengte van waarde van veld `int_curr_symbol' in categorie +-`LC_MONETARY' is niet juist�waarden voor veld `%s' uit categorie `%s' moeten kleiner zijn dan 127�waarden voor veld `%s' uit categorie `%s' mogen geen nul zijn�bij openen UTMP bestand�bij openen oud catalogusbestand�tijdens voorbereiden uitvoer�bij lezen databank�bij schrijven databankbestand�overschrijfbaar door anderen dan de eigenaar�onjuist aantal argumenten�onjuist aantal velden op schrikkelregel�onjuist aantal velden op `Link' regel�onjuist aantal velden op `Rule' regel�onjuist aantal velden op `Zone' voortgangsregel�onjuist aantal velden op `Zone' regel�yp_update: kan host niet omzetten naar netnaam +-�yp_update: kan geen server adres verkrijgen +-� +\ No newline at end of file +diff -Naur ../glibc-2.1.3/po/no.mo glibc-2.1.3/po/no.mo +--- ../glibc-2.1.3/po/no.mo 1999-07-18 18:19:42.000000000 -0700 ++++ glibc-2.1.3/po/no.mo 1969-12-31 16:00:00.000000000 -0800 +@@ -1,448 +0,0 @@ +-������m������������6������8I�����9I�����LI��M���_I��E����I��&����I��(���J�����CJ�����TJ�����lJ�����~J������J������J������J������J��n���J�����YL�����kL��"���}L��"����L������L��:����L�����M�����#M�����,M�����BM�����YM�����sM������M������M������M������M������M�����N�����(N�����EN�����]N�����{N������N������N������N������N��3����N��3����N��4���+O��.���`O��%����O������O��&����O��%����O�����P��%���-P��3���SP��,����P��)����P������P��"����P��!���Q�����<Q�����SQ�����lQ������Q������Q��"����Q��*����Q������R��&���R��&���AR��&���hR��&����R��&����R������R�� ����R��$���S�����;S�����VS�����pS��,����S������S��%����S��,����S��-���(T�� ���VT��&���wT������T������T������T������T����� +-U�����*U������JU��2����U�����V��"���"V��4���EV�����zV��#����V�� ����V��=����V������V��<��� W�����FW��'���fW������W��)����W��(����W�� ����W�����X����� X�����X��$���&X�����KX��)���bX��(����X������X������X������X��#����X��/���Y�����<Y�����NY�� ���cY�����qY�����}Y������Y������Y������Y������Y������Y������Y������Z�����Z�� ���"Z�����,Z�����0Z�� ���HZ��&���VZ��-���}Z��!����Z������Z������Z����� [����� [��&���@[��%���g[��0����[��!����[������[��-����[�����&\��%���C\��)���i\��'����\��%����\��&����\�����]�����$]�����>]�����K]�����f]�����}]������]������]��@����]��D���^�����U^�����h^������^�� ����^��=����^������^�������^������_��2����_��-���`�����@`��$���S`�� +-���x`������`������`��!����`������`������`������`������`����� +-a����� a�����8a�����Sa�����ga�����{a��3����a��-����a��2����a�����$b�����5b�����>b�����Eb�����Ub�����ob��<����b������b��)����b�� ��� c�����c��1���-c��8���_c������c������c������c������c������c�����d�����$d�����3d�����Kd��"���dd������d������d������d�������d�����Se�� ���he������e������e������e������e�� ����e������e��$���f�����0f��"���7f��%���Zf��"����f��"����f��%����f������f������f�����g��>���g�����^g�����gg�����kg�����~g��!����g������g��!����g������g��.���h�����1h�����Eh�����Rh��"���_h������h������h������h�� ����h������h��+����h�����i�����)i�����:i�����Qi�����ni������i������i������i������i������i��1����i��$���1j�����Vj�����hj������j������j������j������j������j������j�� +-����j�����k�����k��2���k�����Gk�����Vk�����ok�� ���~k������k������k������k������k������k������k��!���l�����9l�����Wl��s���wl������l�����m�����m�����'m�����Fm�����Ym�����mm������m������m������m������m������m��9����m������m�����n�����,n��,���En�� +-���rn�����}n������n������n������n������n������n��#����n�����o�����%o�����<o�����Wo��#���uo������o������o������o������o������o�����p�����p�����,p�����5p�����Ep�����`p������p������p������p������p������p������p�����q�����$q�����Cq��*���Sq�����~q������q������q������q�� ����q�� ����q������q������q�� ���r�����0r�����Nr�����[r�����or������r������r������r��(����r������r�����s�����+s�����Cs�����]s�����ss������s������s������s������s������s��.����s�����t�� ��� t��#���.t��0���Rt��%����t������t������t������t������t������t�����u�����*u�����Hu�����_u�����vu������u������u������u������u������u�����v�����v�����.v�����@v�����Zv�����tv������v������v��!����v������v�����w�����w�����;w�����Tw�����rw��"����w������w������w������w������w������w�����x�����x��-���,x��-���Zx��!����x������x������x������x������x��2���y��#���6y�����Zy�����gy��;���{y������y������y������y�����z�� ���z�� ���)z�����Jz�����Pz�����jz�����}z������z������z������z��&����z�����{�����{�����.{�����7{�����V{�� ���p{������{��$����{�� ����{������{������{������{�����|�����,|�����4|�����E|�����Y|�����n|������|������|��*����|��(����|������|�����}��"���}�����:}�����A}��$���[}�� +-����}������}������}�����F�� ���V�����d��!���x��������������������������"��������������� ������6������I���'���Y���#�������6������� ���܀�� +-�������������"�������"��� ������C���"���]���������������������������с�� ���������������������������� ������9������P������e������w���������������������������ł�����ׂ���������������������#������:���?������z����������%����������̃��"������������ ������"���5��� ���X������y�����������������������������������������ք���������F������ ���Y���.���c���-�������6�������8�������;���0���I���l�������������Ά��������+�������+���$���'���P������x���������� �����������������͇��������&�������.���#���&���R���,���y�������������ň��C������#���%������I������h���!�������"�������.���ɉ�� �������%������;���?���&���{����������1�����������������������"���,������O���'���k�����������������.���ȋ���������"������(���1���-���Z�����������������!����������ߌ���������������!���4������V������n����������9�������4���ۍ��8������+���I���8���u���$�������"���ӎ��!�������.���������G������f����������<�������;������$���������C������[���*���{���7����������ސ��"���������� ���)���3���N���]���U�������������&��� ���)���G��� ���q���������+����������Ē���������������������"���.���%���Q���*���w���*����������͓��������0����������,������K���+���k���7�������#���ϔ��������!������$���3���!���X������z���&�������%�������,������������'������%���F���0���l���2����������Ж��.���ݖ��������K���%���L���q���L�������������2������2���R���/�������$����������ژ��%������-������$���D������i������������������������(���ə��&������!���������;���F���R����������B�������B������?���2���<���r�������������ʛ��#������.��� ���0���8���0���i��������������������˜������������������������%������?������R������e������{����������#�������5���ȝ��G������� ���F���#���T���5���x�����������������!���Ҟ��(�������-���������K������\���'���n���?�������=���֟�� ������.���"��� ���Q���9���r���;�������,������#���������9���%���S���A���y�������������ء��7�������3���-������a���'���x���!����������¢��.���Ӣ��������C������*���Y����������������������������������ף��:���������.���)���L���*���v���#����������Ť��$��������� +-������&������B������\������y���>����������إ��!������� ������$���:������_���*���u���=�������H���ަ�����'������6���E���F���&�������(�������'���ܧ��E���������J���(���c���'�������$�������,���٨��)������%���0������V���"���t����������&����������ܩ��P�������V���L���U�������O�������V���I���!�������'���«��*������/������*���E���$���p���/�������1���Ŭ��/�������)���'���*���Q���)���|���#����������ʭ��-������&������4���:���(���o����������������� ���Ʈ��#���Ԯ��$�������"���������@������V������p����������.����������ǯ��������3���������8���#���J������n��� ��������������0����������ٰ��$����������������3���#���D������h������t���������������������������ձ��4���������#������6������S���'���s���B�������D�����j���#���K�������?���ڳ�����������9���!���V������x��������������������ȴ��"���ߴ�����������������/������M���#���g���#�������#�������0���ӵ��#���������(������F���*���d���%�������(������������������W������C���f���%�������&���и������������������(������?������S������j���������������������������d������x��� ������� ����������λ��7������ ���"������,������4������I��� ���e����������������� �������%������������$���(������M���#���l����������������� ���Ƚ�����ҽ���������������������1������1���H���3���z���/�������$�����������7������!���P������r���&�������1�������-������*���������:���(���X���-�������������������������������������!���&���?���6���f����������%�������%�������%������%���(���%���N������t���#�������+���������������������������'���-������U���#���t���'�������(�������!�������$������!���0������R������r��������������������������������1���d����������#�������/���������� ���$���������?���:���H����������(��������������)�������������,������(���;���"���d������������������������#��������������-�������.���������N������_������l���,�������0������������������������ ������������(������>������^������n����������������������������������������������������"�������"������.���9���+���h���#����������������������������%������.���5���,���d���.�������%��������������;������!���?���(���a���(�������-�������(�������(��� +-���$���3������X������r���!�����������������������������������?������M���O����������$�������"������� +-�������A������"���D�������g��� ���E���%���f���)��������������*���������������������������#���������,������A������a������s��������������������������������������������;���,���/���h���=�������������� ��������������������)���������=���>���X���������� ��������������!�������3������:���5������p��� ��������������%��������������#����������������&���&���A���)���h������������������������{����������Q���'���e������������������������������� �������#�������#���������4���(���E���)���n���(�������'�������)����������������'��� ���C���&���M��� ���t������~����������������� ������������������������ +-���%���#���!���I������k��� ���x���������������������������������������������#���������� ������*������;������Q������h������������������������"��������������5�������#���4������X������o������������������������ ��������������������� +-������������������5���"������X������g������������������������������� ����������������� +-��������� ���9������Z������y���}����������������)������9���#���J������n����������������������������������������������������6����������#������A���"���W���4���z������������������������"�����������������������-���+���J������v����������"�������#�������%�������"���������9���"���E������h������}��������������������������������������������!���)��� ���K������l�������������������������������$�������������!���)������K��� ���S������t����������������� ���������������������,�������*���������B������O������c������t��� ��������������,�������'����������������2���#���N������r���������������������������������������������6��� +-������A��� ���N���$���\���;�������+������������������������������.���!���J��� ���l���"���z��� ������� �������*������� ��� +-���������"���'������J���#���e������������������������������������������������ ������>���"���^���������� ���������������������&�������������'���;������c������p��������������������������������������2�������+���'������S������s������������������������4�������%������ +-���4������?���C���W���&�������!��������������0���������2���#���?������c������i��������������������������������������%����������%������8������H���-���Q���������(��������������#������������� ���������������4������H������`������h������y�������������������������������-�������!������ +-���;������F��� ���Y������z����������������� ��������������������� ���������������������%������������������������������� ���-���4������b������t�����������������/�������+�������9������ ���I��� ���W������a���*���h���*�������#�������/����������������1������L������`������u����������������� ���������������������������������������������������"������8������N��� ���d������r����������������� �������6��������������������/���*������Z���)���z����������'�������#�������"���������&������@��� ���P������^������c������h���������&�������T�������������-���!���+���O���3���{���4�������>�������L���#������p�����������������)�������)���������� +-��� ���*������K��� ���\��� ���f�����������������/�������0�������)���!���.���K���"���z����������D�������&�������(���&������O���#���l���&�������3�������"�������)������K���8���/�������#�������<�������#������ ���9������G���"���Z������}���'���������������������*������������-���0��-���^��0������������������,�������������<�&���Y� �����!�����#����������7����3���:�9���n�&�����8�����"����!���+����M�2���l����������� �����C�����B���D�)����������#�����+�����?����"���X�&���{������"�����L�����N���(����w�-�����#���������������*�������:����Z����s������0�����1�����6����6���:����q������>�������������� �-��� �;���H �"���� ����� �#���� �(���� �$��� +-����6 +-�/���U +-�.���� +-�+���� +-����� +-�'���� +-�#����5���;�3���q������*����������K�����G���C�G����������5�����1��� �2���M �%���� ����� �)���� �1���� ����!����?����U����s������'�����'��������������G�������e�:���y�:�����A�����>���1����p������ �����.�����0�����0���"����S����n������������������������������������������(����=�(���Q�+���z�;����������$�����+�������B����O�&���h�+�����+���������������,����:���5�8���p� �����0�����!�����;��� +-�=���F�.�����"����������+�����<����&���Y������2�����/���������2����#���R����v�0����������B�����,�������=����C����\����m������8�����!�����-�����'���-�#���U�!���y�-����������������������%�"���D�?���g������%����������-�������4�2���O�@�����J������������ �B���1����t�'�����'�����B��������%�3���>�0���r�%�����5�����4�����&���4����[�*���z������/����������M����W���b�U�����L��� �Q���] �"���� �'���� �&���� �,���!!�3���N!�)����!�/����!�)����!�)���"�*���0"�)���["�+����"�%����"�����"�,����"�&���#�,���D#�'���q#� ����#�����#�����#�����#�����#����$����/$����G$����b$����y$�.����$�)����$�����$�3����%����4%�,���N%����{%� ����%�����%�'����%�����%�%����%����!&����8&�$���I&����n&����}&�����&�����&�����&�����&�4����&����'����2'����M'�%���k'�@����'�B����'�b���(�L���x(�?����(�$���)�%���*)�&���P)����w)�#����)�����)�����)�#����)����*����+*����A*����\*� ���s*� ����*� ����*�-����*� ���+����%+����D+�1���c+�(����+����������������������|��������������Q�����&����������������������������������������������������������������"���F���������/��e��t�����I�����������������V������������������������������������Q�����������������������I��������l�������������'��� ������ ��]���������_��������������������� +-����������������������<������5����������������������%���g��Y��w�����������������8�� �����������������������6��+����������y����������e�� +-������G������������������������������������������J��6�����������5��H��0������������k���������M����������N��C������V������j��������k�����������������c����������������������������������������,���C��d��3��������^�������������T�������������f��*��������<���8����������T�������� ��d��@��q��0��J��B�����������p���������P�����)���������������%����������Z��[��|������������X�������p���������������;��g�������o��i��]������.��������������������������F������6�������������O������������*���������������������������������3��$��B����������Z�������D��n��������������������������������������������-���������`������:��Y���/������������������������������������������2�������7�����S��z��"��\������ ���!�������������������������#�����������y��������w������������U���H���L��z��'������m��%��=���I��U���������:��������������������j��������������������������e������E�������^���������A�� ����������5������(�����������������f���o����������=��r���\��b��i������k�������������-���O��{��`�� ���4������������9����������k��������B�������������������������������,����������������������f���������������u������������0��x��������������:��1������&�������������������H������������������P�����K���������������������L���L��������������������������X��������������v������������1������ ��d����������&���K���$������������������������������������Y��������������������_���I�����n��7������8��h��N������������������\���;������������������������������u���B��M���������������������������^������r��������R������~��������� +-�� �������������������Z�����)�����m��9�������������������|��X�����������������E�������������������������1������(��"����������������������������;�����*��D��}���������������������������������������������������������{������������������������W�������m���������������������������������N��������y��Q��(������8���������������������A������������������O�����K���������>��_������������t��������������&�����[����������������,������7����������������������@���]�������*���������������������������i���J��-�����o������p�������������<��E��������a������,������?������j��M��������������������.��P�����������"���������c�������Y��z���������(�����������x��g��������w���������v���������������������������������R����������~�������Z�����������������������3��0���������������������`����������h���'��s����������2�����G�������5������F��������������c������C�������������?��%��q���b����������������.��������������������W��A�����K��g����������������9�������s���:��������������m������������������j���>�������h����������@������>�������������������e���P��u������a�����[���������W��\�����l���������������q��������/������������#��������������O��2���������V��S��#���������������������������������������+�������������������D��6�����������d���������������������������������U�����R����������������������������������#����������������l��������������������������������9��!���������������������������������X����������������7���h��!��������b���F����`������H�� +-�����!��i�����r��������T������[��������$�������������f������S���{������ ����������=��U����������������s������������@��L��c�����<��������~�������^������n�����b��x������2�����������4����������������������������V�������������.���)������D���$���������������������a�����������������]��l����������������C����������G����������������v�����+��������;������?���_��?��������������}��������������������������T��E���M���������N�����������������������}�������������=�����������J���'��4��R��/���>���-������ ������������4������Q������+������������������G�������������������������t���������)��������a���W������S��1��������������������3�������������� ���A������� Access Rights : � Attributes : � %s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile] +-� %s [-n netid]* [-o outfile] [infile] +-� %s [-s nettype]* [-o outfile] [infile] +-� Access rights: � Entry data of type %s +-� Name : %s +-� Public Key : � Type : %s +-� Universal addresses (%u) +-� [%d] Name : %s +-� [%u] - [%u bytes] � +-%s cache: +- +-%15s cache is enabled +-%15Zd suggested size +-%15ld seconds time to live for positive entries +-%15ld seconds time to live for negative entries +-%15ld cache hits on positive entries +-%15ld cache hits on negative entries +-%15ld cache misses on positive entries +-%15ld cache misses on negative entries +-%15ld%% cache hit rate +-%15s check /etc/%s for changes +-� +-Group Members : +-� +-Time to Live : � rpcinfo -b prognum versnum +-� rpcinfo -d prognum versnum +-� rpcinfo -p [ host ] +-� rpcinfo [ -n portnum ] -t host prognum [ versnum ] +-� no� yes� Data Length = %u +-� Explicit members: +-� Explicit nonmembers: +-� Implicit members: +-� Implicit nonmembers: +-� No explicit members +-� No explicit nonmembers +-� No implicit members +-� No implicit nonmembers +-� No recursive members +-� No recursive nonmembers +-� Recursive members: +-� program vers proto port +-� or: � (rule from "%s", line %d)� [OPTION...]� done +-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags. +-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed. +-�%s%s%s:%u: %s%sUnexpected error: %s. +-�%s%sUnknown signal %d +-�%s: %d did not sign extend correctly +-�%s: <mb_cur_max> must be greater than <mb_cur_min> +-�%s: C preprocessor failed with exit code %d +-�%s: C preprocessor failed with signal %d +-�%s: Can't create %s: %s +-�%s: Can't create directory %s: %s +-�%s: Can't link from %s to %s: %s +-�%s: Can't open %s: %s +-�%s: Can't remove %s: %s +-�%s: Error closing %s: %s +-�%s: Error reading %s +-�%s: Error writing %s +-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s +-�%s: Memory exhausted: %s +-�%s: More than one -L option specified +-�%s: More than one -d option specified +-�%s: More than one -l option specified +-�%s: More than one -p option specified +-�%s: More than one -y option specified +-�%s: Too many arguments +-�%s: cannot get modification time�%s: command was '%s', result was %d +-�%s: error in state machine�%s: illegal option -- %c +-�%s: invalid option -- %c +-�%s: option `%c%s' doesn't allow an argument +-�%s: option `%s' is ambiguous +-�%s: option `%s' requires an argument +-�%s: option `--%s' doesn't allow an argument +-�%s: option `-W %s' doesn't allow an argument +-�%s: option `-W %s' is ambiguous +-�%s: option requires an argument -- %c +-�%s: output would overwrite %s +-�%s: panic: Invalid l_value %d +-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s' +-�%s: unrecognized option `--%s' +-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ] +- [ -L leapseconds ] [ -y yearistype ] [ filename ... ] +-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ... +-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object) +-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible +-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]... +-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT +-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data +-�Block device required�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag! +-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file! +-�Cannot use netid flag with inetd flag! +-�Cannot use netid flag without TIRPC! +-�Cannot use table flags with newstyle! +-�Channel number out of range�Character Separator : %c +-�Child exited�Client credential too weak�Columns : +-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc. +-This is free software; see the source for copying conditions. There is NO +-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-�Could not create log file "%s"�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique +-�DIRECTORY +-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights : +-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits) +-�Directory : %s +-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY +-�Encrypted data +-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file. Is NIS+ installed?�Error in unknown error system: �Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP +-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group : %s +-�Group Flags :�Group entry for "%s.%s" group: +-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos. +-�Killed�LINK +-�LOCAL entry for UID %d in directory %s not unique +-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s +-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME +-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT +-�NUMBER�Name : '%s' +-�Name not unique on network�Name or service not known�Name/entry isn't unique�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered. +-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non-recoverable failure in name resolution�None. +-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not owner�Number of Columns : %d +-�Number of objects : %u +-�Numerical argument out of domain�Numerical result out of range�Object #%d: +-�Object Name : %s +-�Object Type : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Owner : %s +-�PRIVATE +-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits) +-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate : +-�Report bugs to %s. +-�Report bugs using the `glibcbug' script to <bugs@gnu.org>. +-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�SUNYP�Search Path : %s +-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root +-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status : %s +-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�TABLE +-�Table Type : %s +-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known. This does +-not necessarily mean that all combinations of these names can be used for +-the FROM and TO command line parameters. One coded character set can be +-listed with several different names (aliases). +- Some of the names are no plain strings but instead regular expressions and +-they match a variety of names which can be given as parameters to the +-program. +- +- �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information. +-�Trying %s... +-�Type : %s +-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d) +-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s +-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname] +-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s. +-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory +-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice +-�bogus mcheck_status, library is buggy +-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d +-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s +-�cannot find any C preprocessor (cpp) +-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory +-�clntudp_create: out of memory +-�clntunix_create: out of memory +-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server +-�couldn't register prog %d vers %d +-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten +-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s' +-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section headers failed�memory clobbered before allocated block +-�memory clobbered past end of allocated block +-�memory exhausted�memory exhausted +-�memory is consistent, library is buggy +-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s +-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: should not have uid 0�never registered prog %d +-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration: +- +-%15d server debug level +-�nscd not running! +-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�preprocessor error�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available +-�program %lu version %lu is not available +-�program %lu version %lu ready and waiting +-�rcmd: poll (setting up stderr): %m +-�rcmd: socket: All ports in use +-�rcmd: write (setting up stderr): %m +-�registerrpc: out of memory +-�repeated leap second moment�rpcgen: too many defines +-�rpcinfo: %s is unknown host +-�rpcinfo: %s is unknown service +-�rpcinfo: Could not delete registration for prog %s version %s +-�rpcinfo: broadcast failed: %s +-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup +-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory +-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory +-�svctcp_create: out of memory +-�svcudp_create - cannot getsockname�svcudp_create: out of memory +-�svcudp_create: socket creation problem�svcunix_create: out of memory +-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d +-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage: %s infile +-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory +-�xdrrec_create: out of memory +-�yp_update: cannot convert host to netname +-�yp_update: cannot get server address +-�Project-Id-Version: libc 2.1 +-POT-Creation-Date: 1998-11-28 09:29-0800 +-PO-Revision-Date: 1999-01-16 14:00+0100 +-Last-Translator: Eivind Tagseth <eivindt@multinet.no> +-Language-Team: Norwegian <no@li.org> +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=ISO-8859-1 +-Content-Transfer-Encoding: 8bit +-� Tilgangsrettigheter :� Attrbiutter :� %s [-abkCLNTM] [-Dnavn[=verdi]] [-i st�rrelse] [-I [-K sekunder]] [-Y s�kesti] innfil +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o utfil] [innfil] +-� %s [-n nettid]* [-o utfil] [innfil] +-� %s [-s nettype]* [-o utfil] [innfil] +-� Tilgangsrettigheter: � Innslagsdata av type %s +-� Navn : %s +-� Offentlig n�kkel: � Type : %s +-� Universale adresser (%u) +-� [%d] Navn : %s +-� [%u] - [%u bytes] � +-%s hurtigbuffer (cache): +- +-%15s hurtigbuffer er p� +-%15Zd foresl�tt st�rrelse +-%15ld sekunders levetid for positive innslag +-%15ld sekunders levetid for negative innslag +-%15ld treff i hurtigbuffer for positive innslag +-%15ld treff i hurtigbuffer for negative innslag +-%15ld bom i hurtigbuffer for positive innslag +-%15ld bom i hurtigbuffer for negative innslag +-%15ld%% treffrate for hurtigbuffer +-%15s sjekk /etc/%s for endringer +-� +-Gruppemedlemmer : +-� +-Levetid : � rpcinfo -b prognr versnr +-� rpcinfo -d prognr versnr +-� rpcinfo -p [ vert ] +-� rpcinfo [ -n portnr ] -t vert prognr [ versnr ] +-� nei� ja� Datalengde = %u +-� Eksplisitte medlemmer: +-� Eksplisitte ikke-medlemmer: +-� Implisitte medlemmer: +-� Implisitte ikke-medlemmer: +-� Ingen eksplisitte medlemmer +-� Ingen eksplisitte ikke-medlemmer +-� Ingen implisitte medlemmer +-� Ingen implisitte ikke-medlemmer +-� Ingen rekursive medlemmer +-� Ingen rekursive ikke-medlemmer +-� Rekursive medlemmer: +-� program vers proto port +-� eller: � (regel fra �%s�, linje %d)� [FLAGG...]� ferdig +-��%s�, linje %d: %s��Zone %s�-linje og flagget -l utelukker hverandre��Zone %s�-linje og flagget -p utelukker hverandre��innfil� er n�dvendig for flagg for malgenerering. +-�%.*s: ARGP_HELP_FMT-parameteren krever en verdi�%.*s: Ukjent ARGP_HELP_FMT-parameter�%s i sone uten regel�%s%s%s:%u: %s%sForutsetningen (assertion) �%s� feilet. +-�%s%s%s:%u: %s%sUventet feil: %s. +-�%s%sUkjent signal %d +-�%s: fortegnsutvidelsen av %d ble feil +-�%s: <mb_cur_max> m� v�re st�rre enn <mb_cur_min> +-�%s: C-preprosessoren feilet med sluttkode %d +-�%s: C-preprosessoren feilet med signal %d +-�%s: Kan ikke opprette %s: %s +-�%s: Kan ikke opprette filkatalog %s: %s +-�%s: Kan ikke opprette link fra %s til %s: %s +-�%s: Kan ikke �pne %s: %s +-�%s: Kan ikke fjerne %s: %s +-�%s: Feil ved lukking av %s: %s +-�%s: Feil ved lesing fra %s +-�%s: Feil ved skriving til %s +-�%s: Feil ved skriving til standard ut �%s: �Leap�-linje i fil %s som ikke er skuddsekundsfil +-�%s: Minnet oppbrukt: %s +-�%s: Mer enn ett -L-flagg spesifisert +-�%s: Mer enn ett -d-flagg spesifisert +-�%s: Mer enn ett -l-flagg spesifisert +-�%s: Mer enn ett -p-flagg spesifisert +-�%s: Mer enn ett -y-flagg spesifisert +-�%s: For mange argumenter +-�%s: kan ikke finne modifiseringstid�%s: kommandoen var '%s', resultatet ble %d +-�%s: feil i tilstandsmaskinen�%s: ulovlig flagg -- %c +-�%s: ugyldig flagg -- %c +-�%s: flagget �%c%s� tar ikke argumenter +-�%s: flagget �%s� er flertydig +-�%s: flagget �%s� m� ha et argument +-�%s: flagget �--%s� tar ikke argumenter +-�%s: flagget �-W %s� tar ikke argumenter +-�%s: flagget �-W %s� er flertydig +-�%s: flagget m� ha et argument -- %c +-�%s: utskrift wille overskrive %s +-�%s: panikk: ugyldig l_value %d +-�%s: for tidlig slutt p� filen�%s: kan ikke �pne �%s: ukjent flagg �%c%s� +-�%s: ukjent flagg �--%s� +-�%s: bruk er %s [ -s ] [ -v ] [ -l lokaltid ] [ -p posixregler ] [ -d katalog ] +- [ -L skuddsekunder ] [ -y �rkontrollprogram ] [ filnavn ... ] +-�%s: bruk er %s [ -v ] [ -c grense ] sonenavn ... +-�%s: under skriving av utdata: �(PROGRAMFEIL) Ingen versjon kjent!?�(PROGRAMFEIL) Flagg skulle ha blitt gjenkjent!?�(Ukjent objekt) +-�(ukjent feil ved autentisering - %d)�(ukjent)�*** Filen �%s� er strippet: ingen detaljert analyse mulig +-�*standard inn*�-o UTFIL [INNFIL]... +-[UTFIL [INNFIL]...]�.lib-seksjon i a.out skadet�; nedre versjon = %lu, �vre versjon = %lu�; hvorfor = �<%s> og <%s> er ulovlige navn for tegnomr�de�tegnet <SP> kan ikke v�re i klassen �%s��tegnet <SP> er ikke i klassen �%s��?�Avbrutt (SIGABRT)�Tilgangsrettigheter: �Aksesserer et skadet delt bibliotek�Adressen er allerede i bruk�Adressefamilien for vertsnavn er ikke st�ttet�Adressefamilien er ikke st�ttet av protokollen�Annonseringsfeil�Alarmen gikk�Argumentlisten er for lang�Fors�k p� � fjerne en tabell som ikke er tom�Fors�ker � linke inn for mange delte biblioteker�Autentisering OK�Autentiseringsfeil�FALSKT OBJEKT +-�Ugyldig adresse�Ugyldig fildeskriptor�Ugyldig format p� typesnittsfil�Ugyldig melding�Ugyldig systemkall�Ugyldig verdi for ai_flags�V�r strengt POSIX-konform�Bin�re data +-�Blokk-enhet kreves�R�ret ble brutt�Bussfeil�CDS�Begrensning av CPU-tid overskredet�Tidsgrense for hurtigbuffer l�p ut�Kan ikke aksessere et n�dvendig delt bibliotek�Kan ikke koble til tjener for dette domenet�Kan ikke kommunisere med portmapper�Kan ikke kommunisere med ypbind�Kan ikke kommunisere med ypserv�Kan ikke tildele minne�Kan ikke benytte den �nskede adressen�Kan ikke opprette socket for kringkastings-rpc�Kan ikke eksekvere et delt bibliotek direkte�Kan ikke ha mer enn ett fil-genereringsflagg! +-�Kan ikke ta imot svar p� kringkasting�Kan ikke registrere tjeneste�Kan ikke sende etter at transportendepunktet har koblet ned�Kan ikke sende kringkastingspakke�Kan ikke sette socket-flagg SO_BROADCAST�Kan ikke spesifisere mer enn en innfil! +-�Kan ikke bruke nettid-flagg med inetd-flagg! +-�Kan ikke bruke nettid-flagg uten TIRPC! +-�Kan ikke bruke tabellflagg med ny stil! +-�Kanalnummer utenfor gyldig intervall�Tegn-separator : %c +-�Barnet avsluttet�Klientens referanser er for svake�Kolonner : +-�Kommunikasjonsfeil ved sending�Kompiler lokal-spesifikasjon�Datamaskinen tok ferie�Beregning av tabellst�rrelse for tegnklasser kan ta en stund...�Beregning av tabellst�rrelse for sammenligningsinformasjon kan ta en stund...�Oppkobling nektes�Forbindelsen brutt i den andre enden�Oppkoblingen overskred tidsgrensen�Fortsetter�Konverter innkoding av gitte filer fra en innkoding til en annen.�Konverter n�kkel til sm� bokstaver�Copyright (C) %s Free Software Foundation, Inc. +-Dette er gratis programvare. Se kildekoden for kopieringsbetingelser. +-Programvaren har ingen garanti, ikke en gang for SALGBARHET eller EGNETHET +-TIL NOEN SPESIELL OPPGAVE. +-�Kunne ikke opprette loggfil �%s��Lag utdata selv om advarsler ble gitt�Lag en enkel DB-database fra tekst-input.�Opprettelsestid: %s�DES-innslag for nettnavn %s er ikke unikt +-�KATALOG +-�DNANS�DNS�Database for tabell eksisterer ikke�Databasen er opptatt�Forvalgte tilgangsrettigheter: +-�M�ladresse kreves�Enheten er ikke en stream�Enheten er ikke konfigurert�Enheten eller ressursen opptatt�Diffie-Hellmannn (%d bits) +-�Katalog : %s +-�Filkatalogen er ikke tom�Diskkvoten er overskredet�Ikke spalt ut ny prossess og vis meldinger p� n�v�rende tty�Ikke skriv meldinger under bygging av databasen�Ikke bruk eksisterende katalog, tving opprettelse av ny utfil�Domenet er ikke bundet�Emulatorfelle�INNSLAG +-�Kryptert data +-�Innslag-/tabell-type stemmer ikke overens�Feil i undersystem til RPC�Feil ved aksessering av NIS+ kaldstartfil. Er NIS+ installert?�Feil i ukjent feilsystem: �Feil: .netrc kan leses av andre.�Veksel full�Ugyldig format p� eksekverbar fil�FATALT: systemet definerer ikke �_POSIX2_LOCALEDEF��FIL inneholder mapping fra symbolske navn til UCS4-verdier�Feilet (uspesifisert feil)�Fildeskriptor i ugyldig tilstand�Filen eksisterer�Fill�sing feilet p� grunn av vrangl�s�For langt filnavn�Grense for filst�rrelse overskredet�For stor fil�F�rste/neste-kjede �delagt�Unntakstilfelle ved flyttallsoperasjon�Full resynkoronisering trengs for katalog�Funksjonen er ikke implementert�GRUPPE +-�S�ppel i ARGP_HELP_FMT: %s�Generer meldingskatalog.\vHvis INNFIL er - lese inndata fra standard inn. Hvis UTFIL +-er - skrives utdata til standard ut. +-�Generell systemfeil�Hent informasjon spesifikk for lokalet.�Gi en kort bruksmelding�Gi denne hjelpelisten�Umotivert feil�Gruppe : %s +-�Gruppeflagg :�Gruppeinnslag for �%s.%s�-gruppen: +-�Heng i SEK sekunder (forvalgt 3600)�Legg p� (SIGHUP)�Har ikke funnet �%d� i gruppe-n�rbuffer!�Har ikke funnet �%d� i passord-n�rbuffer!�Har ikke funnet �%s� i gruppe-n�rbuffer!�Har ikke funnet �%s� i verts-n�rbuffer!�Har ikke funnet �%s� i passord-n�rbuffer!�Vertsmaskin er nede�Oppslag av vertsnavn feilet�I/O mulig�INNFIL UTFIL +--o UTFIL INNFIL +--u INNFIL�IOT-felle�IVY�Identifikator tatt bort�Ulovlig instruksjon (SIGILL)�Ulovlig objekttype for operasjon�Ulovlig s�keoperasjon�Uegnet filtype eller format�Uegnet �ioctl� for enhet�Uegnet operasjon for bakgrunnsprosess�Informasjonsforesp�rsel (SIGINFO)�Informasjon:�Innfiler:�Inn-/ut-formatspesifikasjon:�Inn/ut-feil�Intern NIS-feil�Intern ypbind-feil�Avbrutt�Avbrutt systemkall�Avbrutt systemkall burde startes om�Ugyldig objekt for operasjon�Ugyldig argument�Ugyldig bak-referanse�Ugyldig tegnklassenavn�Ugyldige klientreferanser�Ugyldig klientverifikator�Ugyldig sammenligningstegn�Ugyldig bruk av \{\}�Ugyldig link over adskilte enheter�Ugyldig veksel�Ugyldig eller ufullstendig multibyte eller bredt tegn�Ugyldig foreg�ende regul�rt uttrykk�Ugyldig intervallslutt�Ugyldig regul�rt uttrykk�Ugyldig tilgangskode�Ugyldig foresp�rseldeskriptor�Ugyldig tjenerverifikator�Ugyldig plass�Er en filkatalog�Er en navngitt filtype�Kerberos. +-�Drept�LINK +-�LOKALT innslag for UID %d i katalog %s er ikke unikt +-�Niv� 2 stoppet�Niv� 2 ikke synkronisert�Niv� 3 stoppet�Niv� 3 startet om�Link peker til ugyldig navn�Linken har blitt skadet�Linknummer utenfor gyldig omr�de�Linket objekttype: �Linket til: %s +-�Lokalt domenenavn er ikke satt�Tildelingsfeil for lokal ressurs�Maskinen er ikke p� nettverket�Feilaktig eller ulovlig navn�Obligatoriske eller frivillige argumenter til lange flagg er ogs� obligatoriske eller frivillige for tilsvarende korte flagg.�Minneallokeringsfeil�Minnet oppbrukt�For lang melding�Atributt mangler eller er feilaktig�Endringstid : %s�Endring feilet�Endringsoperasjon feilet�Endre format for utdata:�Fors�kte viderehopp�NAVN�NAVN +-[-a|-m]�NIS�NIS klient/tjener versjonsforskjell - kan ikke betjene�NIS' kart-database er korrupt�NIS+-operasjon feilet�NIS+-tjenere er ikke tilgjengelige�NIS+-tjeneste er utilgjengelig eller ikke installert�IKKE NOE OBJEKT +-�NUMMER�Navn : �%s� +-�Navnet er ikke unikt p� nettverket�Navn eller tjeneste ukjent�Navn/innslag er ikke unikt�M� ha noen til � autentisere�Nettverket tok ned forbindelsen ved omstart�Nettverket er nede�Nettverket er ikke tilgjengelig�Ingen CSI-strukturer tilgjengelige�Ingen XENIX-semaforer tilgjengelige�Ingen adresse assosiert med vertsnavn�Ingen adresse assosiert med navnet�Ingen anode�Ikke mer buffer-plass tilgjengelig�Ingen barneprosesser�Ingen data er tilgjengelige�Ikke mer plass p� enheten�Ingen l�ser tilgjengelige�Ingen treff�Medium ikke funnet�Ingen meldinger av �nsket type�Ingen flere poster i tabellen�Intet foreg�ende regul�rt uttrykk�Ingen fjernprogram registrerte. +-�Ingen rute til vertsmaskinen�Ikke mer plass p� enheten�Ingen slik enhet�Ingen slik fil eller filkatalog�Ingen slik n�kkel i tabellen�Ingen slik tabell i tjenerens domene�Ingen slik prosess�Uoverkommelig feil i navneoppslag�Ingen. +-�Ikke funnet, ikke noe slikt navn�Ikke en XENIX navngitt fil�Ikke en filkatalog�Ikke funnet�Ikke eier�Antall kolonner : %d +-�Antall objekter : %u +-�Numerisk argument er utenfor definert omr�de�Numerisk resultat er utenfor gyldig omr�de�Objekt #%d: +-�Objektnavn : %s +-�Objekttype : �Er et fjernobjekt�Objekt med samme navn eksisterer�Odde antall siteringstegn�Bare root har lov til � bruke dette flagget!�Operasjonen er allerede under utf�relse�Operasjonen er ikke tillatt�Operasjonen er ikke st�ttet�Operasjonen er n� under bearbeiding�Operasjonen ville ha blokkert�Ikke flere streams-ressurser�Eier : %s +-�PRIVAT +-�Pakken er ikke installert�Feil under tolkning: %s�Delvis suksess�Overf�rt objekt er ikke det samme objektet p� tjeneren�Ikke tilgang�Str�mmen gikk�For tidlig slutt p� regul�rt uttrykk�Skriv ut innholdet av en databasefil, ett innslag per linje�Skriv ut n�v�rende konfigurasjonsstatistikk�Skriv flere meldinger�Skriv programversjon�Sannsynligvis ikke funnet�Profileringstiden tok slutt�Protokolldriver er ikke tilkoblet�Protokollfeil�Protokoll-familien er ikke st�ttet�Protokollen er ikke tilgjengelig�Protokollen er ikke tilgjengelig�Protokollen er ikke riktig type for socket�Avsluttet�RFS-spesifikk feil�RPC: ugyldig prosedyre for program�RPC-feil ved NIS-operasjon�RPC-programmet er ikke tilgjengelig�RPC: feil programversjon�RPC-strukturen er ugyldig�feil RPC-versjon�RPC: (ukjent feilkode)�RPC: Feil ved autentisering�RPC: Kan ikke dekode resultatet�RPC: Kan ikke kode argumentet�RPC: Feilet (uspesifisert feil)�RPC: Inkompatible versjoner av RPC�RPC: Feil i portmapper�RPC: Prosedyre ikke tilgjengelig�RPC: Programmet ikke registrert�RPC: Programmet utilgjengelig�RPC: Program/versjon-uoverensstemmelse�RPC: Systemfeil hos mottaker�RPC: Tjener kan ikke dekode argumentene�RPC: Suksess�RPC: Tidsgrensen overskredet�RPC: Kan ikke ta imot�RPC: Kan ikke sende�RPC: Ukjent vertsmaskin�RPC: Ukjent protokoll�RSA (%d bits) +-�RTLD_NEXT brukt i kode som ikke er dynamisk lastet�Led og vis profileringsdata for delt objekt�Led konfigurasjonsdata fra NAME�Filsystem med kun lesetilgang�Regul�rt uttrykk for stort�I/O-feil p� fjern maskin�Fjernadresse endret�Ta bort passord, eller gj�r filen ulesbar for andre.�Gjen�pning av delt objekt �%s� feilet�Replik�r: +-�Rapporter bugs til %s. +-�Rapporter feil ved � bruke skriptet �glibcbug� til <bugs@gnu.org>. +-�Argumenter for foresp�rsel er ugyldige�Navnetjeneste-feil 0 (ingen feil)�Intern feil i navnetjenesten�Klarte � unng� vrangl�s ved tildeling av ressurs�Ressurs tapt�Ressursen midlertidig utilgjengelig�SUNYP�S�kesti : %s +-�Minnesegmentsfeil�Tjener opptatt, pr�v igjen�Tjener tom for minne�Tjener forkastet referansene�Tjener forkastet verifikator�Servname ikke st�ttet for ai_socktype�Sett programnavnet�Sl� av tjeneren�Signal 0�Socket-operasjon p� noe som ikke er en socket�Socket-typen er ikke st�ttet�Programvare for�rsaket forbindelsesbrudd�Beklager. Du er ikke root +-�Kildedefinisjoner ikke funnet i FIL�Srmount-feil�Stakkfeil�Foreldet NFS-filh�ndtak�Start ANTALL tr�der�Status : %s +-�Stoppet�Stoppet (signal)�Stoppet (ville lese fra tty)�Stoppet (ville skrive til tty)�Streams-r�rfeil�Strukturen trenger opprydding�Suksess�Undertrykk advarsler og informasjonsmeldinger�Symbolske tegnnavn definert i FIL�Systemfeil�Systeminformasjon:�Kunne ikke tildele systemressurs�TABELL +-�Tabelltype : %s +-�Midlertidig feil i navneoppslag�Terminert�Programfil opptatt�Den f�lgende listen inneholder alle de kjente kodede tegnsettene. Dette +-betyr ikke n�dvendigvis at alle kombinasjoner av disse navnene kan bli brukt +-som FRA- og TIL-kommandolinjeparametre. Et kodet tegnsett kan v�re listet +-med flere forskjellige navn (alias). +- Noen av navnene er ikke vanlige strenger men er isteden regul�re uttrykk +-og de tilsvarer en variasjon av navn som kan bli gitt som parametre til +-programmet. +- +- �Levetid: �Tidsgrense l�p ut�For mange attributter�For mange niv�er med symbolske linker�For mange linker�For mange �pne filer�For mange �pne filer i systemet�For mange prosesser�For mange referanser: kan ikke spleise sammen�For mange brukere�Sporings-/stoppunkts-felle�Etterf�lgende backslash�Tolken d�de�Transport-endepunktene er allerede sammenkoblet�Transport-endepunktene er ikke sammenkoblet�Pr�v �%s --help� eller �%s --usage� for mer informasjon. +-�Pr�ver %s... +-�Type: %s +-�UKJENT�Ikke i stand til � autentisere NIS+-klient�Ikke i stand til � autentisere NIS+-tjener�Ikke i stand til � lage tilbakekall�Ikke i stand til � opprette prosess p� tjeneren�Ukjent (type = %d, bits = %d) +-�Ukjent .netrc-n�kkelord %s�Ukjent NIS-feilkode�Ukjent database: %s +-�Ukjent feil�Ukjent feil �Ukjent vert�Ukjent objekt�Ukjent flagg: %s %s %s�Ukjent navnetjeneste-feil�Ukjent tjener-feil�Ukjent signal %d�Ukjent systemfeil�Ukjent ypbind-feil�Ubalansert ( eller \(�Ubalansert ) eller \)�Ubalansert [ eller [^�Ubalansert \{�Ukjent variabel �%s��Kritisk I/O-tilstand�Bruk:�Bruk: %s variabelnavn [s�kesti] +-�Bruk: rpcinfo [ -n portnr ] -u vert prognr [ versnr ] +-�Brukerdefinert signal 1�Brukerdefinert signal 2�Verdien er for stor for den definerte datatypen�Virtuell tidsgrense overskredet�Vilt resultat fra eksekvering av kommando�Vinduet ble endret�Skriv navnene til tilgjengelige lokaler�Skriv navnene til valgte kategorier�Skriv navnene til valgte n�kkelord�Skriv utdata til fil NAVN�Skrevet av %s. +-�Gal mediatype�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Ja, 42 er meningen med livet�Denne gangen rotet du det virkelig til�Sluttiden p� fortsetningslinjen til en sone kommer f�r sluttiden p� foreg�ende linje�[FIL...]��%1$s� definisjon slutter ikke med �END %1$s���%s� er ikke korrekt profildatafil for �%s���-1� m� v�re siste post i felt �%s� i kategori �%s���...� kan bare brukes i postene �...� og �UNDEFINED���from� forventet etter f�rste argument til �collating-element���from�-streng i deklarasjon av sammenligningsselement inneholder ukjent tegn�ai_family er ikke st�ttet�ai_socktype er ikke st�ttet�kj�rer allerede�argument til <%s> m� v�re ett enkelt tegn�argument til �%s� m� v�re ett enkelt tegn�auth_none.c - Fatal kodingsfeil�authunix_create: ikke mer minne +-�ugyldig argument�feil eier�tomt �FROM�-felt p� �Link�-linje�tomt �TO�-felt p� �Link�-linje�blokk frigjort to ganger +-�feilaktig mcheck_status, biblioteket er bugget +-�broadcast: ioctl (hent grensesnittkonfigurasjon)�broadcast: ioctl (hent grensesnittsflagg)�cache_set: kunne ikke allokere nytt rpc-buffer�cache_set: offer-allokering feilet�cache_set: offer ikke funnet�kan ikke avgj�re tidssoneforkortning for bruk rett etter �until�-tid�kan ikke omfordele prosedyrenummer %d +-�kan ikke utf�re �stat� p� lokalefil �%s��kan ikke allokere symboldata�kan ikke opprette intern deskriptor�kan ikke opprette interne deskriptorer�kan ikke f� socket til � akseptere forbindelser: %s�kan ikke finn C-preprosessor: %s +-�kan ikek finne noen C-preprosessor (cpp) +-�kan ikke h�ndtere gammel foresp�rsel av versjon %d. N�v�rende versjon er %d�kan ikke sette inn sammenligningselement �%.*s��kan ikke sette inn i resultattabell�kan ikke sette inn ny definisjon av sammenligningssymbol: %s�kan ikke laste inn profileringsdata�kan ikke �pne�kan ikke �pne �%s��kan ikke �pne databasefil �%s�: %s�kan ikke �pne innfil �%s��kan ikke �pne lokaledefinisjonsfil �%s��kan ikke �pne utfil�kan ikke �pne utfil �%s��kan ikke �pne utfil �%s� for kategori �%s��kan ikke �pne socket: %s�kan ikke behandle spesifikasjon av rekkef�lge�kan ikke lese filkatalogen for tegnkart, �%s��kan ikke lese konfigurasjonsfil; dette er fatalt�kan ikke lese fra klient�kan ikke lese hode fra �%s��kan ikke lese filkatalogen for lokaler, �%s��kan ikke lese lokalefil �%s��kan ikke lese statisitkkdata�kan ikke utf�re stat() p� fil �%s�: %s�kan ikke skrive utfiler til �%s��kan ikke skrive ut resultat: �%s��kan ikke skrive ut statistikk: �%s��kan ikke skrive til klient�kategoridata forespurt mer enn en gang: burde ikke skje�tegnet %s'%s' i klassen �%s� m� v�re i klassen �%s��tegnet %s'%s' i klassen �%s� kan ikke v�re i klassen �%s��tegnet <SP> ikke definert i tegnkartet�tegnet �%s� ikke definert, men beh�ves som standardverdi�tegnklassen �%s� allerede definert�tegnkartet �%s� allerede definert�tegnkartfilen �%s� ikke funnet�clnt_raw.c - Fatal feil ved serialisering av hode.�cnlttcp_create: ikke mer minne +-�cnltudp_create: ikke mer minne +-�cnlsunix_create: ikke mer minne +-�sammenligningselement �%.*s� finnes mer enn en gang: linje ignorert�sammenligningssymbol �%.*s� finnes mer enn en gang: linje ignorert�sammenligningssymbol forventet etter �%s��koble til adresse %s: �konstant eller identifikator ventet�konvertering fra �%s� til �%s� ikke st�ttet�konvertering stoppet p� grunn av problem ved skriving av utdata�kunne ikke opprette en rpc-tjener +-�kunne ikke registrere prog %d vers %d +-�database [n�kkel ...]�standard tegnkart �%s� ikke funnet�retningsflagg i streng %d i �era�-felt i kategori �%s� er +-ikke �+� eller �-��retningsflagg i streng %d i �era�-felt i kategori �%s� er +-ikke ett enkelt tegn�duplisert tegnnavn �%s��duplisert definisjon av sammenligningselement�duplisert definisjon av tegn �%.*s��duplisert n�kkel�duplisert definition av sett�duplisert sonenavn %s (fil �%s�, linje %d)�duplisert meldingsidentifikator�duplisert meldingsnummer�tom tegnstreng�tomt vektnavn: linje ignorert�enablecache: cache/hurtigminne allerede sl�tt p��enablecache: kunne ikke tildele cache/hurtigminne�enablecache: kunne ikke tildele cache/hurtigminne-data�enablecache: kunne ikke tildele cache/hurtigminne-fifo�innkoding for utdata�innkoding av original tekst�sluttverdien for ellipseintervallet er st�rre enn startverdien�feil ved lukking av input �%s��feil ved lukking av utfil�feil ved lukking av datafilen for profilering�feil ved innsetting av sammenligningselement i hashtabellen�feil ved innsetting i hashtabellen�feil under lesing av inndata�forventet strengargument for �copy��forventet fortsettelseslinje ikke funnet�klarte ikke � laste delt objekt �%s��klarte ikke � laste symboldata�klarte ikke � mmap'e filen med profileringsdata�klarte ikke � starte konverteringsprosessering�feil ved skriving av data for kategori �%s��fcntl: F_SETFD�felt �%s� i kategori �%s� ikke definert�felt �%s� i kategori �%s� udefinert�filen �%s� eksisterer fra f�r og kan bli overskrevet +-�fra-verdi for �collating-element� m� v�re en streng�fstat feilet�s�ppel p� slutten av tegnkodespesifikasjon�s�ppel p� slutten av tall�s�ppel p� slutten av tilleggsverdi i streng %d i �era�-felt i kategori �%s��s�ppel p� slutten av startdato i streng %d i �era�-felt i kategori �%s��s�ppel p� slutten av sluttdato i streng %d i �era�-felt i kategori �%s��generer kall-graf�get_myaddress: ioctl (hent grensesnittskonfigurasjon)�getent - hent innslag fra administrativ database.�handle_request: foresp�rsel mottatt (versjon = %d)�hard link feilet, symbolsk link brukt�hardlinket et eller annet sted�ulovlig �CORRECTION�-felt p� �Leap�-linje�ulovlig �Rolling/Stationary�-felt p� �Leap�-linje�ulovlig tegnkonstant i streng�ulovlig tegn i file: �ulovlig sammenligningselement�ulovlig definisjon�ulovlig koding gitt�ulovlig tegnsekvens ved slutt av streng�ulovlig inndatasekvens ved posisjon %ld�ulovlig navn for tegnomr�de�ulovlig nettype: �%s� +-�ulovlig tall for tilleggsverdi i streng %d i �era�-felt i kategori �%s��ulovlig sett-nummer�ulovlig startdato i streng %d i �era�-felt i kategori �%s��ulovlig sluttdato i streng %d i �era�-felt i kategori �%s��implementasjonsbegrensning: ikke flere enn %d tegnklasser tillatt�implementasjonsbegrensning: ikke flere enn %d tegnkart tillatt�feilaktig formattert fil�innlinje av ukjent type�intern feil (ulovlig deskriptor)�intern feil - addtype kalt med feilaktig isdst�intern feil - addtype kalt med feilaktig ttisgmt�intern feil - addtype kalt med feilaktig ttisstd�intern feil i %s, linje %u�ugyldig UTC-forskyvning�ugyldig forkortningsformat�ugyldig dag i m�neden�ugyldig slutt�r�ugyldig skudd�r�ugyldig modus for dlopen()�ugyldig m�nedsnavn�ugyldig lagret tid�ugyldig start�r�ugyldig tid p� dagen�ugyldig ukedagsnavn�n�kkellengde i foresp�rsel for lang: %Zd�linje etter ... m� inneholde tegndefinisjon�linje foran ... inneholder ikke definisjon for tegnkonstant�for lang linje�list opp alle kjente kodede tegnsett�lokalefil �%s�, brukt i �copy�, ikke funnet�lstat feilet�feilaktig linje ignorert�mapping av seksjonsoverskrifter feilet�omr�det foran tildelt minneblokk tilgriset +-�omr�det etter tildelt minneblokk tilgriset +-�minnet oppbrukt�minnet oppbrukt +-�minnet er konsistent, biblioteket er bugget +-�eraformat i streng %d i �era�-felt i kategori �%s� mangler�eranavn i streng %d i �era�-felt i kategori �%s� mangler�navnl�s regel�verken original- eller m�l-innkoding spesifisert�netname2user: (nis+-oppslag): %s +-�netname2user: DES-innslag for %s i katalog %s er ikke unikt�netname2user: LOKAL-innslag for %s i katalog %s er ikke unikt�netname2user: manglende gruppeid-liste i �%s�.�netname2user: skulle ikke ha uid 0�aldri registrert prog %d +-�ingen <Uxxxx>- eller <Uxxxxxxxx>-verdi gitt�feilaktig regul�rt uttrykk for felt �%s� i kategori �%s�: %s�ingen dag i m�neden passer til regelen�ingen definisjon av �UNDEFINED��ingen andre n�kkelord skal angis n�r �copy� brukes�p� grunn av advarsler ble ingen utfil opprettet�ikke noe symbolsk navn gitt�ikke noe symbolsk navn gitt for slutten p� omr�det�ingen vekt definert for symbol �%s��ikke en vanlig fil�nscd-konfigurasjon: +- +-%15d debugniv� for tjener +-�nscd kj�rer ikke! +-�bare definisjon av �WIDTH� f�r komme etter definisjon av �CHARMAP��original innkoding ikke spesifisert med �-f��utfil�pmap_getmaps rpc-problem�preprosessorfeil�skriv framdriftsinformasjon�problem ved lesing av �%s��profileringsdatafil �%s� passer ikke med del objekt �%s��program %lu er ikke tilgjengelig +-�program %lu versjon %lu er ikke tilgjengelig +-�program %lu versjon %lu klar og venter +-�rcmd: poll (setter opp stderr): %m +-�rcmd: socket: Alle porter i bruk +-�rcmd: write: (setter opp standard error): %m +-�registerrpc: ikke mer minne +-�repetert skuddsekundstidspunkt�rpcgen: for mange definisjoner +-�rpcinfo: %s er en ukjent vert +-�rpcinfo: %s er en ukjent tjeneste +-�rpcinfo: Kunne ikke ta bort registrering av prog %s versjon %s +-�rpcinfo: broadcast feilet: %s +-�rpcinfo: kan ikke kontakte portmapper�samme regel i flere filer�avkortet lesing ved lesing av foresp�rsel: %s�avkortet skriving i %s: %s�socket: protokollfeil i oppsetting av forbindelse +-�sorteringsrekkef�lge �forward� og �backward� utelukker hverandre�spesifikasjon av sorteringsvekter for sammenligningssymbol gir ikke mening�standard innkanal�standard utkanal�startdato er ikke tillatt i streng %d i �era�-felt i kategori �%s��start�r er st�rre enn slutt�r�start�r for h�yt til � bli representert�start�r for lavt til � bli representert�sluttdato er ikke tillatt i streng %d i �era�-felt i kategori �%s��svc_run: - select feilet�svc_tcp.c - kan ikke kalle getsockname eller listen�svc_tcp.c - problem med oppretting av tdp-socket�svc_tcp: makefd_xprt: ikke mer minne +-�svc_unix.c - problem med oppretting av AF_UNIX-socket�svc_unix.c - kan ikke kalle getsockname eller listen�svc_unix: makefd_xprt: ikke mer minne +-�svctcp_create: ikke mer minne +-�svcudp_create - kan ikke kalle getsockname�svcudp_create: ikke mer minne +-�svcudp_create: problem ved oppretting av socket�svcunix_create: ikke mer minne +-�symbol for flertegnssammenligningselement �%.*s� dupliserer elementdefinisjon�symbol for flertegnssammenligningsselement �%.*s� dupliserer en annen +-elementdefinisjon�symbol for flertegnssammenligningselement �%.*s� dupliserer en annen +-symboldefinisjon�symbol for flertegnssammenligningselement �%.*s� dupliserer +-symboldefinisjon�symbol for flertegnssammenligningselement �%.*s� dupliserer +-symbolnavn i tegnsett�syntaksfeil i definisjon av %s: %s�syntaksfeil i n�kkelordet �order_start��syntaksfeil i definisjon av tegnklasse�syntaksfeil i definisjon av tegnkonvertering�syntaksfeil i definisjon av sammenligningssortering�syntaksfeil i definisjon av sammenligning�syntaksfeil i definisjon av kategorien LC_CTYPE�syntaksfeil i definisjon av ny tegnklasse�syntaksfeil i definisjon av nytt tegnkart�syntaksfeil i definisjon av meldingslokale�syntaksfeil i definisjon av monet�rlokale�syntaksfeil i definisjon av numerisk lokale�syntaksfeil i sorteringsspesifikasjon�syntaksfeil i prolog: %s�syntaksfeil i ferdeighetskart-definisjon: %s�syntaksfeil i definisjon av tidslokale�syntaksfeil: ikke inne i en lokaledefinisjon�m�l-innkoding ikke spesifisert med �-t��dette er den f�rste definisjonen�tid f�r null�for stor tidsverdi�for f� bytes i tegnkoding�for mange tegn i tegnkoding�for mange tegnklasser definert�for mange skuddsekunder�for mange lokale tidstyper�for mange overganger?!�for mange vekter�for mange eller for lange tidssoneforkortelser�etterf�lgende s�ppel p� slutten av linjen�problem med � svare prog %d +-�to linjer etter hverandre med �...� er ikke tillatt�satte type p� bare ett �r�ikke istand til � allokere buffer to inndata�kan ikke frigj�re argumenter�udefinert�ukjent tegn �%s��ukjent tegn i felt �%s� i kategori �%s��ukjent sammenligningssn�kkelord�ukjent n�kkelord �%s�: linje ignorert�ukjent iconv()-feil %d�ukjent sett �%s��ukjent symbol �%.*s�: linje ignorert�vanskelig sone�uavsluttet melding�uavsluttet streng�uavsluttet strengkonstant�uavsluttet symbolisk navn�uavsluttet vektnavn��vre grense i omr�de er ikke mindre enn nedre grense�bruk: %s innfil +-�bruker 29/2 i ikke-skudd�r�verdien p� %s m� v�re heltall�verdien p� <%s> m� v�re mellom 1 og 4�verdien p� felt �%s� i kategori �%s� kan ikke v�re en tom streng�verdien p� <mb_cur_max> m� v�re st�rre enn verdien p� <mb_cur_min>�verdien p� feltet �int_curr_symbol� i kategorien LC_MONETARY er ikke gyldig i henhold til ISO 4217�verdien p� feltet �int_curr_symbol� i kategorien LC_MONETARY har feil lengde�verdien p� feltet �%s� i kategorien �%s� m� v�re lavere enn 127�under akseptering av forbindelse: %s�under allokering av n�rbuffer-innslag�under allokering av hashtabell-innslag�under allokering av n�kkelkopi�da den gamle katalogfilen ble �pnet�da utdata ble forberedt�da databasen ble lest�under stat() av profileringsdatafil�under skriving til databasefil�skriving ufullstendig�skrivbar av andre enn eier�feil antall argumenter�feil antall felt p� �Leap�-linje�feil antall felt p� �Link�-linje�feil antall felt p� �Rule�-linje�feil antall felt p� �Zone�-fortsettelseslinje�feil antall felt p� �Zone�-linje�xdr_reference: ikke mer minne +-�xdrrec_create: ikke mer minne +-�yp_update: kan ikke konvertere vert til nettnavn +-�yp_update: kan ikke hente tjeneradresse +-� +\ No newline at end of file +diff -Naur ../glibc-2.1.3/po/pl.mo glibc-2.1.3/po/pl.mo +--- ../glibc-2.1.3/po/pl.mo 2000-02-17 20:10:14.000000000 -0800 ++++ glibc-2.1.3/po/pl.mo 1969-12-31 16:00:00.000000000 -0800 +@@ -1,458 +0,0 @@ +-�������������������8�������K������K������K��M���L��E���UL��&����L��(����L������L������L�����M�����&M�����5M�����IM�����dM�����~M��n���M�����O�����O��"���%O��"���HO�����kO��:����O������O������O������O������O�����P�����P�����2P�����LP�����eP������P������P������P������P������P�����Q�����#Q�����*Q�����EQ�����RQ�����YQ��3���kQ��3����Q��4����Q��.���R��%���7R�����]R��&���qR��%����R������R��%����R��3����R��,���/S��)���\S������S��"����S��!����S������S������S�����T�����.T�����DT��"���ZT��*���}T������T��&����T��&����T��&���U��&���7U��&���^U������U�� ����U��$����U������U������U�����V��,���2V�����_V��%���}V��,����V��-����V�� ����V��&���W�����FW�����eW������W������W������W������W�������W��2���|X������X��"����X��4����X�����"Y��#���4Y�� ���XY��=���bY������Y��<����Y������Y��'���Z�����6Z��)���?Z��(���iZ�� ����Z������Z������Z������Z��$����Z������Z��)��� +-[��(���4[�����][�����m[�����y[��#����[��/����[������[������[�� ���\�����\�����%\�����9\�����N\�����Z\�����j\������\������\������\������\������\�� ����\������\������\�� ���]��&���]��-���<]��!���j]������]������]������]������]��&����]��%���&^��0���L^��!���}^������^��-����^������^��%���_��)���(_��'���R_��%���z_��&����_������_������_������_����� +-`�����%`�����<`�����X`�����u`��@����`��D����`�����a�����'a�����@a�� ���Ua��=���_a������a�������a�����b��7����b��2����b��-��� c�����7c��$���Jc�� +-���oc�����zc������c��!����c������c������c������c������c�����d�����d�����/d�����Jd�����^d�����rd��3����d��-����d��2����d�����e�����,e�����5e�����<e�����Le�����fe��<���}e������e��$����e��)����e�� ���)f�����7f��1���If��8���{f������f������f������f������f�����g�����'g�����@g�����Og�����gg��"����g������g������g������g�������g�����oh�� ����h������h������h������h������h�� ����h�����i��$���'i�����Li��"���Si��%���vi��"����i��"����i��%����i�����j�����j�����.j��>���;j�����zj������j������j������j��!����j������j��!����j������j��.���k�����Mk�����ak�����nk��"���{k������k������k������k�� ����k������k��+����k�����(l�����El�����Vl�����ml������l������l������l������l������l����� +-m��1���m��$���Mm�����rm������m������m������m������m������m������m�����n�� +-���n�����#n�����*n��2���0n�����cn�����rn������n�� ����n������n������n������n������n����� o�����o��!���3o�����Uo�����so��s����o�����p��*���p�����Cp�����]p�����np�����p������p������p������p������p������p�����q�����q�����q��9���q�����Vq�����nq������q��,����q�� +-����q������q������q������q�����r�����#r�����>r�����Xr�����pr������r��#����r������r������r������r�����s��#���&s�����Js�����js�����ss������s������s������s������s������s������s������s�����t�����1t�����Pt�����pt������t������t������t������t������t������t�����u��*���#u�����Nu�����Uu�����mu������u�� ����u��!����u�� ����u������u������u�� ���v�����"v�����@v�����Mv�����av�����rv������v������v��(����v������v�����w�����w�����5w�����Ow�����ew�����~w������w������w������w������w������w������w��.����w�����"x�� ���4x��#���Bx��0���fx��%����x������x������x������x������x�����y�����#y�����@y�����Oy�����my������y������y������y������y������y������y�����z�����+z�����Ez�����_z�����qz������z������z������z������z������z��!���{�����.{�����G{�����b{�����~{������{������{��"����{������{������{����� |�����$|�����8|�����J|�����`|��-���o|��-����|��!����|������|�����}�����}�����2}�����C}��2���Z}��#����}������}������}��;����}�����~�����$~�����@~�����X~�� ���r~�� ����~������~������~������~������~������~���������������/�����J��&���c�������������������������������� ������������$���0��� ���U������c������o����������������������������������ˀ�����߀����������������� ���*���(���(���S������|����������"������������������D������K���$���e��� +-������������������������P��� ���`������n���!������������������������DŽ��������"����������������*������@������S���'���c���#�������6������� ������ +-�������������"������"���*������M���"���g��������������������Ć�����ۆ�� ����������������������������*������C������Z������o����������������������������������χ����������������� ���������#���%���:���I�����������������%����������ֈ��"������������!������ ���@���"���a��� ������������������������ω�����������������������������!���F���>��� �������.�������-�������6������8���#���;���\���I��������������������������+���$���+���P���'���|�������������Č�� ���ь�����ی���������������&���(���.���O���&���~����������,�������������������C������#���a�����������������!�������"������.������ ���4���%���U���;���{���&����������ޏ��1����������0������K������W���"���h����������'����������ϐ��������.���������3���"���J���(���m���-����������đ�����ܑ��!����������������8������X������t���!�����������������ʒ��������9�������4���7���8���l���+�������8���ѓ��$��� +-���"���/���!���R���.���t���������������������<������;���>���$���z�����������������*���ו��7���������:���"���Y������|���)�������N�������U���������^���&���|���)������� ���͗�����ۗ��+���������� ������>������X������j���"�������%�������*���Ә��*����������)������=���0���W�����������������+���Ǚ��7������#���+������O���!���m���$�������!����������֚��&������%������,���>������k���'���z���%�������0���ț��2����������,���.���9������h���K�������L���͜��L���������g���+���{���2�������2���ڝ��/��� ���$���=������b���%���x���-�������$���̞����������� ������'������:���(���Q���&���z���!����������ß��F���ڟ�����!���B���4���B���w���?�������<�������7���7������o����������#�������.���ɡ��0�������0���)������Z������x���������������������������Т������������������������%������;������O���#���d���5�������G������� ������#������5���8������n������{���-�������!�������(������-���������9������J���'���\���?�������=���ĥ�� ������.������ ���?���9���`���;�������,���֦��*������#���.������R���%���l���A����������ԧ��������I������7���X���3�������+���Ĩ��������'������!���/������Q���.���b����������C�������*������������������(���8������a���1���t�����������������:���ݪ��������)���6���*���`���#��������������$���ϫ���������������"���,������O������m�����������������>���Ĭ��������!���"��� ���D���(���e���$��������������*���ɭ��=�������H���2������{����������E�������&������(������'���0���E���X����������(�������'������$������,���-���)���Z���%��������������"���Ȱ��������&��� ������0���P���O���V�������U�������O���M���V�������!�������'������*���>���/���i���*�������$���ij��/������1������/���K���)���{���*�������)���д��#�������������-���9���&���g���4�������(���õ����������� ��� ������#���(���$���L���"���q��������������������Ķ�����۶��.���������������;���3���X����������#����������·�� ���۷��������0����������-���$���I������n����������#�����������������ȸ�����ݸ�����������������)���4���B������w�����������������'���ǹ��B������D���2���j���w���K������?���.������n����������!����������̻��������������������"���3������V������r�����������������#�������#�����#������0���'���#���X������|����������*�������%������&�� ������0������C���X���V���F�������*�������+���!������M������^������u�����������������������������������������������������������(�������(�������������A���������_������h������p����������!���������������������"������&���(������O���#���o����������"������������������������������������3������?������L���3���_���3�������9�������4������%���6���.���\���2�������'��������������$�������3���#���.���W���0��������������&�������#���������� ���%���>������d�����������������'�������?�������������%���+���%���Q���%���w���%�������%��������������1���������4������T������t����������*�������$�������"�������*������+���G���'���s���#�������������� �����������������������5������P�������k���3�������$���-���!���R���1���t���������� ������� +-�������L����������2���.���H���#���w���,��������������7�������.������ ���7������X��� ���Z������d���-���u����������8�������.����������#������;������B���&���\���6��������������������������������������������������<������M������h���������� ��������������"�������������� +-�������������"��� +-������-���.���J���4���y���*�������$�������$����������#���+���<���0���h���>�������;�������������&���4���/���[���&�������5�������(�������,������(���>���9���g������������������������$�������������"���'���"���J������m���>�������=�������������%������+���B������n���=���z������������������/�������E�������.���5���+���d����������+��������������������������������������������������6������S���"���s��������������������������������������<������7���U���9�����������������������������������'���������3���O���J���"�������,�������1�������������!���1���4���S���=��������������������� ������0���������@���"���U������x���)�������(�������0����������������*������1�������Q����������%�������0���"������S������n���������� ��������������(��������������.�������/��� ���.���P���0������/��������������(�������������-���,������Z������f������j����������#�������������� ������� �������+���������@������S������_���%���p������������������������ +-��������������,����������,������K������X������o�������������������������������%�������������%���$���(���J������s��������������������������������������������������� +-���������'������4���8���@������y������������������������#�����������������������2������M���!���`���5�������$��������������z����������x���H�������#�����������������������������;������N���%���k����������(�������������� ��������������E����������5������L������k���:������� �������������� �������*�������+���������<���!���\������~���*��������������$����������������������,���$���F���$���k���������� +-��������������������������������������������%������4���!���@������b����������*����������������������������!���������4���$���P������u���0�������+��������������!�������+���������>������R���+���a������������������������!����������������������� ������4���3���E��� ���y����������!��������������������������� ���'������H������c������~����������������� ����������������������������8����������9������F���+���W���)�������*������������������������������%������C���'���`����������"���������������������#�������$���������1������9������B������a��������������������������������������������������"���(���$���K������p������������������������������� �������������*���:������e���"���q��������������������������������������6�������5���6��� ���l���"�������������� �������������� ������1���1���9���c��� �������$�������M����������������:������X������r�����������������-����������������� +-������������-������H������h�����������������%������������������������ ���-���������D���0���`����������'�������������� +-����������������� +-������"��� +-���6������A������U������p��� ���������������������$�������0����������)������8���7���O���h���������������������+������ +-���?������J������b��� ���������������������� �����=�����L��#���e��������(�������������������������������!����A�B���a������ +-����������-�����-�����/���#�7���S������#��������������� ��������� �������%����5�+���N����z��������������������������������������"����=� ���O�&���Y�D���������������.���������"���:����]�%���l�&�����#�����)������������&����2����I����N����S�0���j������>����� �����7�����9���4�;���n�7�����<�����E����"���e�����������*�����*�����%��� ����5 ����T ����d ����} ����� ����� �/���� �2���� �,���1 +-����^ +-�:���s +-�A���� +-�E���� +-�K���6�,�����2�����1�����3����3���H�=���|�1�����2�����H��� �5���h �-���� �=���� �2��� +-����=����V�3���t�*�����2�����*����*���1�=���\�$�����5�����+�����A���!�(���c�,�����/�����(�����0����0���C�6���t�4�����$�����'����.���-�:���\�.�����3�����+�����:���&�'���a�)�����(�����2������������-����K�@���j�@�����%���������#���,�-���P�L���~�"�����'���������,���'�R���T�Z�����&����&���)�"���P����s������.�����!��������������#���!�#���E�'���i�.�����3��������������,���$�,���Q�1���~�<�����C�����.���1�1���`�/�����#�����4�����*����&���F�!���m�0����������0�����0�����/���1�D���a������'����������K�����J���G�H����������-�����;���!�1���]�.�����6����������#����*���*����U����u����������������.�����)�����$���) ����N �H���f ����� �G���� �D���!�@���P!�?����!�B����!����"����/"�*���M"�3���x"�5����"�5����"����#����7#����V#����r#�����#�����#�����#�����#�����#���� $����*$����B$�*���_$�0����$�A����$�����$�(���%�6���5%����l%����{%�6����%�.����%�6����&�3���7&����k&�����&�-����&�<����&�:���'����F'�.���X'�&����'�=����'�A����'�5���.(�.���d(�)����(�(����(�3����(�H���)�)���c)�����)�T����)�:����)�.���8*�:���g*�����*�)����*�$����*���� +�=���"+����`+�:���|+�,����+� ����+�����+�/���,����;,�.���M,�)���|,�(����,�C����,����-�(���1-�)���Z-�+����-�%����-�,����-����.����.�*���<.�!���g.�����.�����.�����.�5����.�#���/�*���6/�,���a/�/����/�*����/�����/�9����/�C���80�6���|0�����0�����0�G����0�&���#1����J1����f1�D����1�����1�7����1�/���2�#���E2�4���i2�8����2�$����2�����2�0���3����J3�.���g3�����3�b����3�d���4�c���|4�a����4�m���B5�"����5�*����5�&����5�+���%6�1���Q6�&����6�.����6�.����6�-���7�1���67�+���h7�0����7�)����7�����7�/��� 8�*���=8�8���h8�&����8�����8�����8�����8����9����!9�#���?9����c9����9�����9�����9�-����9�����9�(���:�5���+:����a:�;���w:�&����:�����:�����:�(����:����&;�*���C;����n;�����;�)����;�����;�����;�����;����<����<����9<�1���R<�����<�!����<�$����<�&����<�@���=�>���I=�]����=�I����=�>���0>�#���o>�/����>�.����>�����>�#���?����5?����U?�-���k?�����?�����?�'����?�����?����@����*@����F@�'���b@�����@�����@�����@�@����@�4���!A��������k��������������������������@������,�������(�������������:��C����������������p��}���������2�������������k��D����������!��a���S����q�������J������������w��7������������@��������������E��V��H���������s������l���s���������u���[���������v������������������:������������������6��=������u������������������o���.������ ����|��d�����p���������������9�������������������$���������[�������������������l��?���������������C��`��������������*�����X���9��I������S��V��p������!������������y��d������������������������������Q������1�����������������n��^�� +-��� ���m���4���������?��������m������r�������������������������������]�������������������������������#������������������/���_��J����������������������������������������������s��f��Q��8�����r����������z���������<������������������x������B��{��K�������������>����������D��M����������������������������>����������������o���������i�������@����������x����������������b������� �������g���a�����������������E��o��e�������-��x��W������������������������������������������������Z�������s���R��"�������������4���������������/��������������������*����������(�������������������1�������k������L��V������N����)��������A������y���������*�����f���$������X������Q��)��#���K����������������[�������q�������D�����������T������a����������.���������T�������,��'�������u��\������������!�������3������������g�� +-������=��H���]�����-��5��O��z��������������������j�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��`�����������������������������������U������m�����{�����Q������c��P��������������������������������������������6���r����������������`���������t�����e��5�������������F��h��|�������������������b�������������������e�����\���~��2��E������� ���j�������#����������� ���������m��������������y������������1��M����������\����������4��f�������R����������7��Y�������������f��L�������F������������������������������������<����������� �� ���������������{��i���������Y�������������������������������� ���%���������(������c����������������������������~��������,����������{��������������������������������C���5��"���������?������v���)�������?������ +-����������+��������������/��~��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��P������������������������y���`�� ��<��w���}�����_�����'��H������d��������������n����������������H���������G������5��>����+�������S�����������-���������Y������������!����������������I����������g����l���������^��z������������v����������������������������������������N��A������|�����t���������W��������������������������+��������$��3��h�����������������c����������������������b��&��A������i���������������������b��[�� �������8�������������O��������o�����Y��#���������������r�����N���0����������������;��n��������������%����������������������������������������������������������E�� ������K������������ +-��M��������������������������h�������X��������������T��t������������������^�����9�����M�� ��J���������������>���+�����������������(���������2��c���������6��&��������V���)��������������������������������U��=�������B�������������;���v����������������0���������������Z�����������%��������������������~���������]������������������������1���������������N��������p��2��i���'��:��0������-���D�����������S������������������������W������L��8�����������������������������������}�������������������,�����������������������t�������������&�����B��w�������������l�����������������I�����������������������������6��'��������������������U�������������������������:������*������F�������������������������������������������n���������.�����q������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��T��Z��F����������������g��4�����q�����_��O��K��P��\����������������X�������������I�����������z��������������������������������������������������������G����������0�����a��A�����B�����j��U�����������������������������������<��$������k���������������]��P�����������h���������������3��������������9���������� Access Rights : � Attributes : � %s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile] +-� %s [-n netid]* [-o outfile] [infile] +-� %s [-s nettype]* [-o outfile] [infile] +-� Access rights: � Entry data of type %s +-� Name : %s +-� Public Key : � Type : %s +-� Universal addresses (%u) +-� [%d] Name : %s +-� [%u] - [%u bytes] � +-%s cache: +- +-%15s cache is enabled +-%15Zd suggested size +-%15ld seconds time to live for positive entries +-%15ld seconds time to live for negative entries +-%15ld cache hits on positive entries +-%15ld cache hits on negative entries +-%15ld cache misses on positive entries +-%15ld cache misses on negative entries +-%15ld%% cache hit rate +-%15s check /etc/%s for changes +-� +-Group Members : +-� +-Time to Live : � rpcinfo -b prognum versnum +-� rpcinfo -d prognum versnum +-� rpcinfo -p [ host ] +-� rpcinfo [ -n portnum ] -t host prognum [ versnum ] +-� no� yes� Data Length = %u +-� Explicit members: +-� Explicit nonmembers: +-� Implicit members: +-� Implicit nonmembers: +-� No explicit members +-� No explicit nonmembers +-� No implicit members +-� No implicit nonmembers +-� No recursive members +-� No recursive nonmembers +-� Recursive members: +-� program vers proto port +-� or: � (rule from "%s", line %d)� [OPTION...]� done +-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags. +-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed. +-�%s%s%s:%u: %s%sUnexpected error: %s. +-�%s%sUnknown signal %d +-�%s: %d did not sign extend correctly +-�%s: <mb_cur_max> must be greater than <mb_cur_min> +-�%s: C preprocessor failed with exit code %d +-�%s: C preprocessor failed with signal %d +-�%s: Can't create %s: %s +-�%s: Can't create directory %s: %s +-�%s: Can't link from %s to %s: %s +-�%s: Can't open %s: %s +-�%s: Can't remove %s: %s +-�%s: Error closing %s: %s +-�%s: Error reading %s +-�%s: Error writing %s +-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s +-�%s: Memory exhausted: %s +-�%s: More than one -L option specified +-�%s: More than one -d option specified +-�%s: More than one -l option specified +-�%s: More than one -p option specified +-�%s: More than one -y option specified +-�%s: Too many arguments +-�%s: cannot get modification time�%s: command was '%s', result was %d +-�%s: error in state machine�%s: illegal option -- %c +-�%s: invalid option -- %c +-�%s: option `%c%s' doesn't allow an argument +-�%s: option `%s' is ambiguous +-�%s: option `%s' requires an argument +-�%s: option `--%s' doesn't allow an argument +-�%s: option `-W %s' doesn't allow an argument +-�%s: option `-W %s' is ambiguous +-�%s: option requires an argument -- %c +-�%s: output would overwrite %s +-�%s: panic: Invalid l_value %d +-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s' +-�%s: unrecognized option `--%s' +-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ] +- [ -L leapseconds ] [ -y yearistype ] [ filename ... ] +-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ... +-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object) +-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible +-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]... +-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT +-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data +-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag! +-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file! +-�Cannot use netid flag with inetd flag! +-�Cannot use netid flag without TIRPC! +-�Cannot use table flags with newstyle! +-�Channel number out of range�Character Separator : %c +-�Child exited�Client credential too weak�Columns : +-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc. +-This is free software; see the source for copying conditions. There is NO +-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique +-�DIRECTORY +-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights : +-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits) +-�Directory : %s +-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY +-�Encrypted data +-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file. Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP +-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group : %s +-�Group Flags :�Group entry for "%s.%s" group: +-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos. +-�Killed�LINK +-�LOCAL entry for UID %d in directory %s not unique +-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s +-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server : +-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME +-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT +-�NUMBER�Name : '%s' +-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered. +-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None. +-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns : %d +-�Number of objects : %u +-�Numerical argument out of domain�Numerical result out of range�Object #%d: +-�Object Name : %s +-�Object Type : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner : %s +-�PRIVATE +-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits) +-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate : +-�Report bugs to %s. +-�Report bugs using the `glibcbug' script to <bugs@gnu.org>. +-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path : %s +-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root +-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status : %s +-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%s�TABLE +-�Table Type : %s +-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known. This does +-not necessarily mean that all combinations of these names can be used for +-the FROM and TO command line parameters. One coded character set can be +-listed with several different names (aliases). +- Some of the names are no plain strings but instead regular expressions and +-they match a variety of names which can be given as parameters to the +-program. +- +- �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information. +-�Trying %s... +-�Type : %s +-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d) +-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s +-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname] +-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s. +-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory +-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice +-�bogus mcheck_status, library is buggy +-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d +-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s +-�cannot find any C preprocessor (cpp) +-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory +-�clntudp_create: out of memory +-�clntunix_create: out of memory +-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server +-�couldn't register prog %d vers %d +-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten +-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s' +-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block +-�memory clobbered past end of allocated block +-�memory exhausted�memory exhausted +-�memory is consistent, library is buggy +-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s +-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d +-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration: +- +-%15d server debug level +-�nscd not running! +-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup +-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available +-�program %lu version %lu is not available +-�program %lu version %lu ready and waiting +-�rcmd: poll (setting up stderr): %m +-�rcmd: socket: All ports in use +-�rcmd: write (setting up stderr): %m +-�registerrpc: out of memory +-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error +-�rpcgen: too many defines +-�rpcinfo: %s is unknown host +-�rpcinfo: %s is unknown service +-�rpcinfo: Could not delete registration for prog %s version %s +-�rpcinfo: broadcast failed: %s +-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup +-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory +-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory +-�svctcp_create: out of memory +-�svcudp_create - cannot getsockname�svcudp_create: out of memory +-�svcudp_create: socket creation problem�svcunix_create: out of memory +-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d +-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage: %s infile +-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory +-�xdrrec_create: out of memory +-�yp_update: cannot convert host to netname +-�yp_update: cannot get server address +-�Project-Id-Version: libc 2.1.2 +-POT-Creation-Date: 1998-11-28 09:29-0800 +-PO-Revision-Date: 1999-09-11 22:25+02:00 +-Last-Translator: Pawe� Krawczyk <kravietz@ceti.pl> +-Language-Team: Polish <pl@li.org> +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=ISO-8859-2 +-Content-Transfer-Encoding: 8-bit +-� Prawa dost�pu : � Atrybuty : � %s [a-bkCLNTM][-Dnazwa[=warto��]] [-i wielko��] [-I [-K sekundy]] [-Y �cie�ka] plik_we +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o plik_wy] [plik_we] +-� %s [-s id_sieci]* [-o plik_wy] [plik_we] +-� %s [-s typ_sieci]* [-o plik_wy] [plik_we] +-� Prawa dost�pu: � Dane rekordu typu %s +-� Nazwa :%s +-� Klucz publiczny : � Typ : %s +-� Adresy uniwersalne (%u) +-� [%d] Nazwa : %s +-� [%u] - [%u bajt�w] � +-cache %s: +- +-%15s cache jest w��czony +-%15Zd zalecany rozmiar +-%15ld sekund czasu przez kt�ry b�d� utrzymywane wpisy pozytywne +-%15ld sekund czasu przez kt�ry b�d� utrzymywane wpisy negatywne +-%15ld trafionych wpis�w pozytywnych +-%15ld trafionych wpis�w negatywnych +-%15ld nietrafiownych wpis�w pozytywnych +-%15ld nietrafionych wpis�w negatywnych +-%15ld%% procent trafie� +-%15s sprawd� zmiany w /etc/%s +-� +-Cz�onkowie grupy : +-� +-Czas �ycia : � rpcinfo -b nr_programu nr_wersji +-� rpcinfo -d nr_programu nr_wersji +-� rpcinfo -p [ host ] +-� rpcinfo [ -n nr_portu ] -t host nr_programu [ nr_wersji ] +-� nie� tak� Rozmiar danych = %u +-� Cz�onkowie zadeklarowani: +-� Nie-cz�onkowie zadeklarowani: +-� Cz�onkowie domniemani: +-� Nie-cz�onkowie domniemani: +-� Brak zadeklarowanych cz�onk�w +-� Brak zadeklarowanych nie-cz�onk�w +-� Brak domniemanych cz�onk�w +-� Brak domniemanych nie-cz�onk�w +-� Brak rekursywnych cz�onk�w +-� Brak rekursywnych nie-cz�onk�w +-� Cz�onkowie rekursywni: +-� program wer. proto port +-� lub: � (regu�a z "%s", linia %d)� [OPCJA...]� zako�czone +-�"%s", linia %d: %s�Linia "Zone %s" i opcja -l wykluczaj� si� wzajemnie�Linia "Zone %s" i opcja -p wykluczaj� si� wzajemnie�flagi generowania szablon�w wymagaj� podania "pliku_we". +-�%.*s: parametr ARGP_HELP_FMT wymaga podania warto�ci�%.*s: Nieznany parametr ARGP_HELP_FMT�%s w strefie dla kt�rej nie zdefiniowano regu��%s%s%s:%u: %s%sWarunek `%s' nie zosta� spe�niony. +-�%s%s%s:%u %s%sNiespodziewany b��d: %s. +-�%s%sNieznany sygna� %d +-�%s: %d niepoprawnie rozszerzy� znak +-�%s: <mb_cur_max> musi by� wi�kszy ni� <mb_cur_min> +-�%s: preprocesor C zako�czy� prac� z b��dem %d +-�%s: preprocesor C zako�czy� prac� z sygna�em %d +-�%s: Nie mog� stworzy� %s: %s +-�%s: Nie mog� stworzy� katalogu %s: %s +-�%s: Nie mog� dowi�za� %s do %s: %s +-�%s: Nie mog� otworzy� %s: %s +-�%s: Usuni�cie %s jest niemo�liwe: %s +-�%s: B��d przy zamykaniu %s: %s +-�%s: B��d odczytu %s +-�%s: B��d zapisu %s +-�%s: B��d zapisu na standardowe wyj�cie �%s: linia Leap nie znajduje si� w pliku sekund przest�pnych %s +-�%s: Brak pami�ci: %s +-�%s: Podano wi�cej ni� jedn� opcj� -L +-�%s: Podano wi�cej ni� jedn� opcj� -d +-�%s: Podano wi�cej ni� jedn� opcj� -l +-�%s: Podano wi�cej ni� jedn� opcj� -p +-�%s: Podano wi�cej ni� jedn� opcj� -y +-�%s : Za du�o argument�w +-�%s: sprawdzenie czasu modyfikacji jest niemo�liwe�%s: polecenie `%s' zwr�ci�o %d +-�%s: b��d w automacie sko�czonym�%s: niew�a�ciwa opcja -- %c +-�%s: b��dna opcja -- %c +-�%s: opcja `%c%s' nie mo�e mie� argument�w +-�%s: opcja `%s' jest niejednoznaczna +-�%s: opcja `%s' musi mie� argument +-�%s: opcja `--%s' nie mo�e mie� argument�w +-�%s: opcja `-W %s' nie mo�e mie� argument�w +-�%s: opcja `-W %s' jest niejednoznaczna +-�%s: opcja musi mie� argument -- %c +-�%s: wyj�cie nadpisze %s +-�%s: panika: B��dna l-warto�� %d +-�%s: przedwczesny koniec pliku�%s: otwarcie jest niemo�liwe �%s: nieznana opcja `%c%s' +-�%s: nieznana opcja `--%s' +-�%s: sk�adnia: %s [ -s ] [ -v ] [ -l czas_lokalny ] [ -p regu�y_POSIX ] +- [ -d katalog ] [ -L sek_przest�pne ] [ -y yearistype ] +- [ plik ... ] +-�%s: sk�adnia: %s [ -v ] [ -c rok ] nazwa_strefy... +-�%s: podczas zapisywania na wyj�cie: �(B��D PROGRAMU) Nieznana wersja!?�(B��D PROGRAMU) Opcja powinna zosta� rozpoznana?!�(Nieznany obiekt) +-�(nieznany b��d autoryzacji - %d)�(nieznany)�*** Symbole zosta�y usuni�te z pliku `%s', dok�adna analiza jest niemo�liwa +-�*standardowe wej�cie*�-o PLIK-WY [PLIK-WE]... +-[PLIK-WY [PLIK-WE]...]�sekcja .lib w a.out jest uszkodzona�; wersja poboczna = %lu, wersja g��wna = %lu�; bo = �<%s> i <%s> nie s� niepoprawnymi nazwami dla przedzia�u�znak <SP> nie mo�e znajdowa� si� w klasie `%s'�znak <SP> nie jest w klasie `%s'�?�Przerwane�Prawa dost�pu : �Pr�ba u�ycia uszkodzonej biblioteki dzielonej�Adres jest ju� w u�yciu�Rodzina adres�w dla tej nazwy hosta nie jest obs�ugiwana�Rodzina adres�w nie obs�ugiwana przez protok��B��d podczas og�aszania�Budzik�Lista argument�w za d�uga�Pr�ba skasowania tablicy z zawarto�ci��Pr�ba ��czenia ze zbyt wieloma bibliotekami dzielonymi�Uwierzytelnienie OK�B��d uwierzytelnienia�NIEISTNIEJ�CY OBIEKT +-�B��dny adres�B��dny deskryptor pliku�B��dny format pliku czcionek�B��dny komunikat�B��dne wywo�anie systemowe�B��dna warto�� dla ai_flags�Przestrzegaj �ci�le POSIX�Dane binarne +-�Wymagane urz�dzenie blokowe�Problem podczas pr�by rozg�aszania�Przerwany potok�B��d szyny�CDS�Przekroczony limit czasu procesora�Dezaktualizacja bufora cache�Brak dost�pu do wymaganej biblioteki dzielonej�Po��czenie z serwerem dla tej domeny jest niemo�liwe�Komunikacja z portmapperem jest niemo�liwa�Komunikacja z ypbind jest niemo�liwa�Komunikacja z ypserv jest niemo�liwa�Brak pami�ci do alokacji�Przypisanie ��danego adresu jest niemo�liwe�Stworzenie gniazda dla transmisji rpc niemo�liwe�Bezpo�rednie uruchomienie biblioteki dzielonej jest niemo�liwe�Nie mo�na poda� wi�cej ni� jednej flagi generowania pliku! +-�Brak odpowiedzi na rozg�aszanie�Zarejestrowanie us�ugi jest niemo�liwe�Wysy�anie po zamkni�ciu gniazda jest niemo�liwe�Wys�anie pakietu transmisji niemo�liwe�Ustawienie opcji gniazda SO_BROADCAST jest niemo�liwe�Mo�na poda� tylko jeden plik wej�ciowy! +-�Nie mo�na u�ywa� flagi netid z flag� inetd! +-�Flagi netid mo�na u�ywa� tylko z TIRPC! +-�Nowa sk�adnia opcji nie pozwala na u�ywanie flagi table! +-�Numer kana�u poza zakresem�Separator znak�w : %c +-�Potomek zako�czy� prac��Wierzytelno�� klienta jest zbyt ma�a�Kolmny : +-�B��d komunikacji podczas wysy�ania�Skompiluj specyfikacj� lokalizacji�Komputer wyjecha� na wakacje�Obliczanie rozmiaru tablicy klas znak�w mo�e chwil� potrwa�...�Obliczanie rozmiaru tablicy sortowania mo�e chwil� potrwa�...�Po��czenie odrzucone�Po��czenie zerwane przez drug� stron��Przekroczony czas oczekiwania na po��czenie�Kontynuacja�Konwertuje podanych plik�w mi�dzy r�nymi metodami kodowania.�Konwertuj klucz na ma�e znaki�Copyright (C) %s Free Software Foundation, Inc. +-Oprogramowanie darmowe. Warunki kopiowania zamieszczone s� w kodzie �r�d�owym. +-Nie podlega �adnej gwarancji, nawet gwarancji przydatno�ci do jakiegokolwiek +-zastosowania lub sprzeda�y. +-�Stworzenie pliku dziennika "%s" jest niemo�liwe�Tworzy plik nag��wkowy C o nazwie NAZWA zawieraj�cy definicje symboli�brak pliku wyj�ciowego - wyst�pi�y ostrze�enia�Tworzy prost� baz� DB z wej�cia tekstowego.�Czas stworzenia : %s�Pozycja DES dla sieci %s nie jest unikalna +-�KATALOG +-�DNANS�DNS�Brak bazy danych dla tej tabeli�Baza danych jest zaj�ta�Domy�lne prawa dost�pu : +-�Wymagany jest adres docelowy�Urz�dzenie nie jest strumieniem�Urz�dzenie nie jest skonfigurowane�Urz�dzenie lub zasoby s� zaj�te�Diffie-Hellmann (%d bit�w) +-�Katalog : %s +-�Katalog nie jest pusty�Przekroczony limit dyskowy�Nie pracuje w tle i wy�wietla komunikaty na bie��cy terminal�Nie wy�wietla komunikat�w podczas budowania bazy danych�Zamiast do istniej�cego katalogu zapisuje do nowego pliku�Domena nie zosta�a zwi�zana�pu�apka EMT�POZYCJA +-�Zaszyfrowane dane +-�Typy wpisu/tablicy nie pasuj� do siebie�B��d w podsystemie RPM�Znalezienie pliku startowego NIS+ jest niemo�liwe. Czy NIS+ jest zainstalowany?�B��d w nieznanym systemie b��d�w: �Wyst�pi� b��d podczas odwo�ania do callbacka�B��d: plik .netrc mo�e by� czytany przez ka�dego.�Przepe�niona wymiana�B��dny format pliku wykonywalnego�PRZERWANIE: system nie definiuje `_POSIX2_LOCALEDEF'�PLIK zawiera odwzorowania nazw symbolicznych na warto�ci UCS4�Nieudane (nieustalony b��d)�Deskryptor pliku w z�ym stanie�Plik istnieje�Podczas blokowania pliku wyst�pi�o zakleszczenie�Za d�uga nazwa pliku�Przekroczony limit wielko�ci pliku�Plik jest za du�y��a�cuch pierwszy/nast�pny jest uszkodzony�B��d w obliczeniach zmiennoprzecinkowych�Katalog wymaga powt�rzenia pe�nej synchronizacji�Niezaimplementowana funkcja�GRUPA +-�B��dne dane w ARGP_HELP_FMT: %s�Generuje katalog komunikat�w. +-Je�li PLIK-WE to -, dane s� czytane ze standardowego wej�cia. Je�li PLIK-WY +-to -, dane s� zapisywane na standardowe wyj�cie. +-�B��d systemowy�Wy�wietla dane dotycz�ce lokalizacji.�Wy�wietla kr�tkie informacje o sk�adni polecenia�Wy�wietla ten tekst pomocy�Nieoczekiwany b��d�Grupa : %s +-�Flagi grupy :�Wpis dla grupy "%s.%s": +-�Czekaj przez SEK sekund (domy�lnie 3600)�Roz��czenie�Nie znaleziono "%d" w pami�ci podr�cznej grup!�Nie znaleziono "%d" w pami�ci podr�cznej hase�!�Nie znaleziono "%s" w pami�ci podr�cznej grup!�Nie znaleziono "%s" w pami�ci podr�cznej host�w!�Nie znaleziono "%s" w pami�ci podr�cznej hase�!�Host nie odpowiada�Odnalezienie nazwy hosta jest niemo�liwe�We/Wy dozwolone�PLIK-WE PLIK-WY +--o PLIK-WY PLIK-WE +--u PLIK-WE�pu�apka IOT�IVY�Identyfikator zosta� usuni�ty�B��dna instrukcja�B��dny typ obiektu dla tej operacji�B��dne przesuni�cie�Niew�a�ciwy typ lub format pliku�Niew�a�ciwy dost�p do urz�dzenia�Dzia�anie niedopuszczalne dla procesu w tle���danie informacji�Informacja:�Pliki wej�ciowe:�Specyfikacja formatu wej�cia/wyj�cia:�B��d wej�cia/wyj�cia�B��d wewn�trzny NIS�B��d wewn�trzny ypbind�Przerwanie�Przerwane wywo�anie systemowe�Nale�y wznowi� przerwane wywo�anie systemowe�B��dny obiekt dla tej operacji�Z�y argument�B��dny odno�nik wstecz�B��dna nazwa klasy znaku�B��dne uwierzytelnienie klienta�B��dny weryfikator klienta�B��dny znak sortowany�B��dna zawarto�� \{\}�B��dne dowi�zanie mi�dzy urz�dzeniami�B��dna wymiana�B��dny lub niepe�ny znak wielobajtowy�B��dne poprzedzaj�ce wyra�enie regularne�B��dny koniec zakresu�B��dne wyra�enie regularne�Z�y kod ��dania�B��dny deskryptor ��dania�B��dny weryfikator serwera�B��dny kana��Jest katalogiem�Jest plikiem nazwanym�Kerberos. +-�Unicestwiony�DOWI�ZANIE +-�Wpis LOKALNY dla UID %d w katalogu %s nie jest unikalny +-�Poziom 2 zatrzymany�Poziom 2 brak synchronizacji�Poziom 3 zatrzymany�Poziom 3 wyzerowany�Dowi�zanie wskazuje na b��dn� nazw��Po��czenie zosta�o przerwane�Numer dowi�zania poza zakresem�Typ dowi�zanego obiektu : �Dowi�zany do : %s +-�Lokalna domena nie jest ustawiona�Wyst�pi� b��d podczas przydzielania lokalnych zasob�w�Maszyna nie znajduje si� w tej sieci�Zniekszta�cona lub b��dna nazwa�Argumenty obowi�zkowe lub opcjonalne dla d�ugich opcji s� r�wnie� obowi�zkowe lub lokalne dla odpowiednich kr�tkich opcji.�Serwer nadrz�dny : +-�Serwer nadrz�dny jest zaj�ty, pe�ny zrzut danych przesuni�ty na p�niej.�Wyst�pi� b��d przydzielania pami�ci�Pami�� wyczerpana�Komunikat za d�ugi�Brakuj�cy lub b��dny atrybut�Modyfikacja : %s�Modyfikacja nie powiod�a si��Operacja modyfikacji nie powiod�a si��Modyfikuje format wyj�ciowy:�Pr�ba przej�cia przez zbyt wiele ruter�w�NAZWA�NAZWA +-[-a|-m]�NIS�Niezgodno�� wersji mi�dzy klientem i serwerem NIS - us�uga niemo�liwa�Mapa NIS zawiera b��dy�Operacja NIS+ nie powiod�a si��Serwery NIS+ s� niedost�pne�Us�uga NIS+ jest niedost�pna lub nie zosta�a zainstalowana�BRAK OBIEKTU +-�LICZBA�Nazwa : '%s' +-�Demon buforuj�cy us�ugi odwzorowania nazw.�Nazwa nie jest obs�ugiwana przez ten serwer�Nazwa nie jest unikalna w sieci�Ta nazwa lub us�uga jest nieznana�Nazwa/zapis nie jest unikalny�Wskazany obiekt nie mo�e by� przeszukiwany�Wymagane uwierzytelnienie�Sie� przerwa�a po��czenie po resecie�Sie� nie dzia�a�Sie� jest niedost�pna�Struktura CSI niedost�pna�Brak dost�pnych semafor�w XENIXowych�Brak adresu zwi�zanego z nazw� hosta�Brak adresu zwi�zanego z nazw��Brak anody�Brak miejsca w buforze�Brak proces�w potomnych�Brak danych�Brak miejsca na serwerze�Brak dost�pnych blokad�Nic nie pasuje�Brak medium�Brak komunikatu o po��danym typie�Nie ma wi�cej rekord�w w mapie�Brak wyra�enia regularnego�Brak zarejestrowanych zdalnych program�w. +-�Brak drogi do systemu�Brak miejsca na urz�dzeniu�Nie ma takiego urz�dzenia�Nie ma takiego pliku ani katalogu�Brak takiego klucza w mapie�Nie ma takiej mapy w domenie serwera�Nie ma takiego procesu�Napotkano nazwy nie nale��ce do przestrzeni NIS+�Wyst�pi� krytyczny b��d w odwzorowaniu nazw�Brak. +-�Nie znaleziono, brak takiej nazwy�To nie jest nazwanego pliku w wersji XENIXa�To nie jest katalog�Nie znaleziono�To nie jest serwer nadrz�dny dla tej domeny�To nie jest w�a�ciciel�Liczba kolumn : %d +-�L. obiekt�w : %u +-�Argument numeryczny poza zakresem�Wynik numeryczny poza zakresem�Obiekt #%d: +-�Nazwa obiektu : %s +-�Typ obiektu : �Zdalny obiekt jest obiektem podmontowanym przez NFS�Istnieje ju� obiekt o tej nazwie�Nieparzysta liczba cudzys�ow�w�Tylko root mo�e u�ywa� tej opcji!�Operacja jest ju� wykonywana�Operacja niedozwolona�Operacja nie obs�ugiwana�Operacja jest w�a�nie wykonywana�Operacja spowoduje blokad��Brak dodatkowych strumieni�Kontrola wyj�cia:�Wyb�r wyj�cia:�W�a�ciciel : %s +-�PRYWATNY +-�Pakiet nie jest zainstalowany�B��d parsowania: %s�Cz�ciowy sukces�Uzyskany obiekt nie jest taki sam jak obiekt na serwerze�Brak dost�pu�Awaria zasilania�Niespodziewany koniec wyra�enia regularnego�Wy�wietla rekordy bazy linijka po linijce�Wy�wietla aktualne statystyki konfiguracji�Wy�wietla wi�cej komunikat�w�Wy�wietla wersj� programu�Prawdopodobnie sukces�Prawdopodobnie nie znaleziony�Koniec stopera profiluj�cego�Sterownik protoko�u nie jest pod��czony�B��d protoko�u�Nie obs�ugiwana rodzina protoko��w�Protok� niedost�pny�Protok� nie obs�ugiwany�Typ protoko�u nie pasuje do gniazda�B��dne zapytanie dla podanej tablicy�Wyj�cie�B��d RFS�RPC z�a procedura dla programu�B��d RPC podczas operacji NIS�RPC program niedost�pny�RPC z�a wersja programu�RPC b��dna struktura�RPC z�a wersja�RPC: (nieznany kod b��du)�RPC: B��d uwierzytelniania�RPC: Nie mog� zdekodowa� wyniku�RPC: Nie mog� zakodowa� argument�w�RPC: Nieudane (niesprecyzowany b��d)�RPC: Niekompatybilne wersje RPC�RPC: Awaria portmappera�RPC: Niedost�pna procedura�RPC: Niezarejestrowany program�RPC: Niedost�pny program�RPC: Niezgodno�� programu/wersji�RPC: B��d w odleg�ym systemie�RPC: Serwer nie mo�e zdekodowa� argument�w�RPC: Sukces�RPC: Czas oczekiwania przekroczony�RPC: Niemo�liwy odbi�r�RPC: Niemo�liwe wysy�anie�RPC: Nieznany host�RCP: Nieznany protok��RSA (%d bit�w) +-�RTLD_NEXT wyst�pi�o w kodzie nie �adowanym dynamicznie�Czyta i wy�wietla dane profiluj�ce obiektu dzielonego�Czyta konfiguracj� z pliku NAZWA�System plik�w wy��cznie do odczytu�Sygna� w czasie rzeczywistym %d�Wyra�enie regularne jest za du�e�B��d we/wy w odleg�ym systemie�Zmieni� si� adres drugiego ko�ca�Usu� has�o lub uczy� plik niedost�pnym dla innych�Nie powiod�o si� ponowne otwarcie dzielonego obiektu `%s'�Replikacja : +-�Prosimy zg�asza� b��dy na adres %s. +-�Prosimy zg�asza� b��dy za pomoc� skryptu `glibcbug' na adres <bugs@gnu.org>. +-�Argumenty ��dania s� b��dne�B��d 0 resolvera (bez b��d�w)�B��d wewn�trzny resolvera�Unikni�to zakleszczenia zasob�w�Zasoby zosta�y stracone�Zasoby chwilowo niedost�pne�Wyniki zosta�y wys�ane do procedury callbacka�OBJ_DZIEL [DANE_PROF]�SUNYP��cie�ka przeszukiwania : %s +-�Naruszenie ochrony pami�ci�Serwer zaj�ty, spr�buj ponownie�Brak pami�ci dla serwera�Serwer odrzuci� wierzytelno���Serwer odrzuci� weryfikacj��Nazwa nie obs�ugiwana dla ai_socktype�Okre�la nazw� programu�Ko�czy prac� serwera�Sygna� 0�Operacja na obiekcie, kt�ry nie jest gniazdem�Nie obs�ugiwany typ gniazda�Oprogramowanie spowodowa�o przerwanie po��czenia�Niestety nie jeste� rootem +-�Definicje �r�d�owe znajduj� si� w PLIKU�B��d srmount�B��d stosu�Nieaktualny uchwyt pliku NFS�Uruchamia LICZB� w�tk�w�Stan : %s +-�Zatrzymany�Zatrzymany (sygna�)�Zatrzymany (wej�cie z tty)�Zatrzymany (wyj�cie na tty)�B��d potoku biblioteki strumieni�Struktura wymaga wyczyszczenia�Sukces�Nie wy�wietla ostrze�e� i informacji�Nazwy symboliczne znak�w s� zdefiniowane w PLIKU�B��d systemowy�Informacja o systemie:�Wyst�pi� b��d podczas przydzielania zasob�w systemowych�Katalog systemowy map znak�w : %s +- map repertuar�w : %s +- �cie�ka lokalizacji: %s +-%s�TABLICA +-�Typ tablicy : %s +-�Odwzorowanie nazwy jest chwilowo niemo�liwe�Zako�czony�Plik wykonywalny zaj�ty�Poni�sza lista zawiera wszystkie zakodowane zestawy znak�w. Nie oznacza to, +-�e wszystkie kombinacje zestaw�w mog� by� u�ywane jako parametry OD i DO. Jeden +-zestaw znak�w mo�e znajdowa� si� na li�cie pod wieloma nazwami (aliasami). +- Niekt�re nazwy nie s� zwyk�ymi napisami, tylko wyra�eniami regularnymi +-pasuj�cymi do okre�lonego zbioru nazw. One tak�e mog� by� u�ywane jako +-parametry programu. +- +- �Czas �ycia : �Koniec stopera�Za du�o atrybut�w�Za du�o wzajemnych symlink�w�Za du�o link�w�Za du�o otwartych plik�w�Za du�o otwartych plik�w w systemie�Za du�o proces�w�Za du�o odniesie�: dowi�zanie niemo�liwe�Za du�o u�ytkownik�w�Pu�apka debuggera/breakpoint�Ko�cz�cy znak `\'�Translator przerwa� prac��Drugi koniec jest ju� po��czony�Drugi koniec nie jest po��czony�Napisz `%s --help' lub `%s --usage' by uzyska� wi�cej informacji. +-�Pr�buj� %s... +-�Typ : %s +-�NIEZNANY�Uwierzytelnienie klienta NIS+ jest niemo�liwe�Uwierzytelnienie serwera NIS+ jest niemo�liwe�Utworzenie procedury callbacka nie jest mo�liwe�Uruchomienie nowego procesu na serwerze jest niemo�liwe�Nieznany (typ = %d, bity = %d) +-�Nieznane s�owo kluczowe w .netrc %s�Nieznany kod b��du NIS�Nieznana baza `%s' +-�Nieznany b��d�Nieznany b��d �Nieznany host�Nieznany obiekt�Nieznana opcja: %s %s %s�Nieznany b��d biblioteki odwzoruj�cej nazwy�Nieznany b��d serwera�Nieznany sygna� %d�Nieznany b��d systemowy�Nieznany b��d ypbind�Niesparowane ( lub \(�Niesparowane ) lub \)�Niesparowane [ lub [^�Niesparowane \{�Nierozpoznana zmienna `%s'�Nag�y wypadek I/O�Sk�adnia:�Sk�adnia: %s nazwa_zmiennej [�cie�ka] +-�Sk�adnia: rpcinfo [ -n nr_portu ] -u host nr_programu [ nr_wersji ] +-�Sygna� u�ytkownika 1�Sygna� u�ytkownika 2�Warto�� za du�a dla zdefiniowanego typu danych�Wirtualny stoper wyczerpany�Osobliwy wynik wykonania polecenia�Okno zmienione�Wy�wietla nazwy dost�pnych map znak�w�Wy�wietla nazwy dost�pnych lokalizacji�Wy�wietla nazwy wybranych kategorii�Wy�wietla nazwy wybranych s��w kluczowych�Zapisuje wyniki do pliku NAZWA�Autor: %s. +-�Niew�a�ciwy typ medium�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Tak, 42 jest odpowiedzi� na pytanie o sens �ycia�Tym razem da�e� popali��Koniec czasu nie znajduje si� po ko�cu czasu poprzedniej linii�[PLIK...]�definicja `%1$s' musi ko�czy� si� wyra�eniem `END %1$s'�`%s' nie zawiera poprawnych danych profiluj�cych dla `%s'�`-1' musi by� ostatnim elementem w polu `%s' kategorii `%s'�`...' mo�e by� u�yte wy��cznie dla `...' i `UNDEFINED'�`from' spodziewane po pierwszym argumencie `collate-element'��a�cuch `from' w deklaracji elementu sortowania zawiera nieznany znak�Nie obs�ugiwana rodzina protoko��w�Nie obs�ugiwany typ gniazda�jest ju� uruchomiony�argument <%s> musi by� pojedynczym znakiem�argument `%s' musi by� pojedynczym znakiem�auth_none.c - Problem z prze��czaniem�authunix_create: brak pami�ci +-�b��dny argument�nieodpowiedni w�a�ciciel�puste pole FROM w linii Link�puste pole TO w linii Link�blok zwalniany dwa razy +-�b��dny mcheck_status, biblioteka zawiera b��dy +-�transmisja: ioctl (info o konfiguracji interfejsu)�transmisja: ioctl (info o flagach interjesu)�przepe�nienie bufora�cache_set: przydzielenie nowego rpc_buffer jest niemo�liwe�cache_set: przydzielenie pami�ci dla nowego wpisu jest niemo�liwe�cache_set: nie znaleziono wpisu mo�liwego do powt�rnego wykorzystania�okre�lenie skr�tu strefy czasowej po ko�cu przedzia�u czasu jest niemo�liwe�przypisanie procedury nr %d jest niemo�liwe +-�znalezienie pliku lokalizacji `%s' jest niemo�liwe�przydzielenie pami�ci dla symboli jest niemo�liwe�stworzenie wewn�trznego deskryptora jest niemo�liwe�stworzenie wewn�trznego deskryptora jest niemo�liwe�otwarcie gniazda do przyjmowania po��cze� jest niemo�liwe: %s�odnalezienie preprocesora C jest niemo�liwe: %s +-�odnalezienie preprocesora C (cpp) jest niemo�liwe +-�obs�uga ��da� w starej wersji %d nie jest mo�liwa; aktualna wersja to %d�wstawienie elementu sortowania `%.*s' jest niemo�liwe�wstawienie do tablicy wynik�w jest niemo�liwe�wstawienie definicji nowego symbolu sortowania niemo�liwe: %s�za�adowanie danych do profilowania jest niemo�liwe�otwarcie jest niemo�liwe�otwarcie `%s' jest niemo�liwe�otwarcie pliku bazy danych `%s' jest niemo�liwe: %s�otwarcie wej�ciowego pliku `%s' niemo�liwe�otwarcie pliku definicji lokalnych `%s' niemo�liwe�otwarcie wyj�ciowego pliku jest niemo�liwe�otwarcie wyj�ciowego pliku `%s' niemo�liwe�otwarcie wyj�ciowego pliku `%s' dla kategorii `%s' niemo�liwe�otwarcie gniazda jest niemo�liwe: %s�przetwarzanie specyfikacji kolejno�ci jest niemo�liwe�odczyt katalogu mapy znak�w `%s' niemo�liwy�przeczytanie pliku konfiguracyjnego jest niemo�liwe: koniec pracy�odczyt danych od klienta jest niemo�liwy�przeczytanie nag��wka z `%s' jest niemo�liwe�odczyt katalogu lokalizacji %s' jest niemo�liwy�odczyt pliku lokalizacji `%s' niemo�liwy�odczytanie mapy repertuar�w `%s' jest niemo�liwe�odczytanie danych statystycznych jest niemo�liwe�znalezienie pliku bazy danych `%s' jest niemo�liwe: %s�zapisanie plik�w wyj�ciowych do `%s' jest niemo�liwe�zapisanie wyniku jest niemo�liwe: %s�zapisanie statystyk jest niemo�liwe: %s�zwracanie odpowiedzi klientowi jest niemo�liwe�wielokrotne ��danie kategorii danych: nie powinno wyst�pi��znak %s'%s' z klasy`%s' musi by� w klasie `%s'�znak %s'%s' z klasy `%s' nie mo�e by� w klasie `%s'�znak <SP> nie zdefiniowany w tablicy znak�w�znak `%s', wymagany jako domy�lny, nie zosta� zdefiniowany�klasa znak�w `%s' jest ju� zdefiniowana�tablica znak�w `%s' jest ju� zdefiniowana�nie znaleziono pliku tablicy znak�w `%s'�clnt_raw.c - Krytyczny b��d serializacji nag��wka.�clnttcp_create: brak pami�ci +-�clntudp_create: brak pami�ci +-�clntunix_create: brak pami�ci +-�element sortowania `%.*s' wyst�pi� wielokrotnie: linia pomini�ta�element sortowania `%.*s' wyst�pi� wielokrotnie: linia pomini�ta�oczekiwano symbolu sortowania po `%s'�po��czenie do adresu %s: �spodziewana sta�a lub identyfikator�konwersja z `%s' do `%s' nie jest obs�ugiwana�konwersja zosta�a przerwana poniewa� wyst�pi�y problemy z zapisaniem wynik�w�stworzenie serwera rpc niemo�liwe +-�rejestracja prog %d wer. %d niemo�liwa +-�baza [klucz ...]�nie znaleziono domy�lnej tablicy znak�w `%s'�znacznik kierunku w �a�cuchu %d w polu `era' w kategorii `%s' nie jest '+' +-lub '-'�znacznik kierunku w �a�cuchu %d w polu `era' w kategorii `%s' nie jest +-pojedynczym znakiem�dwukrotne wyst�pienie nazwy znaku `%s'�podw�jna definicja elementu sortowania�wielokrotna definicja znaku `%.*s'�dwukrotne wyst�pienie klucza�podw�jna definicja zbioru�podw�jna nazwa strefy %s (plik "%s", linia %d)�podw�jny identyfikator komunikatu�podw�jny numer komunikatu�pusty napis�pusta nazwa wagi: linia zignorowana�enablecache: bufor jest ju� aktywny�enablecache: niemo�liwa alokacja bufora�enablecache: niemo�liwa alokacja danych bufora�enablecache: niemo�liwa alokacja kolejki dla bufora�kodowanie wynik�w�kodowanie oryginalnego tekstu�koniec zakresu wyrzutni wi�kszy niz pocz�tek�wyst�pi� b��d podczas zamykania wej�cia `%s'�wyst�pi� b��d podczas zamykania pliku wyj�ciowego�wyst�pi� b��d podczas zamykania pliku z danymi profiluj�cymi�b��d podczas wstawiania elementu sortowanego do tablicy mieszaj�cej�b��d podczas wstawiania do tablicy mieszaj�cej�wyst�pi� b��d podczas czytania danych wej�ciowych�spodziewanym argumentem dla `copy' jest �a�cuch�brak spodziewanej linii kontynuacji�Nie powiod�o si� za�adowanie dzielonego obiektu `%s'�Nie uda�o si� za�adowa� danych o symbolach�Nie uda� si� mmap danych profiluj�cych�Nie uda�o si� rozpocz�� konwersji�niepowodzenie przy zapisie danych kategorii `%s'�fcntl: F_SETFD�pole `%s' w kategorii `%s' nie jest zdefiniowane�pole `%s' w kategorii `%s' nie jest zdefiniowane�plik '%s' ju� istnieje i mo�e zosta� nadpisany +-�argument from-value definicji `collating-element' musi by� �a�cuchem�fstat nie powi�d� si���mieci na ko�cu specyfikacji kodu znaku��mieci na ko�cu liczby��mieci na ko�cu warto�ci offset w �a�cuchu %d w polu `era' w kategorii `%s'��mieci na ko�cu pierwszej daty w �a�cuchu %d w polu `era' w kategorii `%s'��mieci na ko�cu drugiej daty w �a�cuchu %d w polu `era' w kategorii `%s'�generuje wykres odwo�a��generuje prosty profil z licznikami i czasami�get_myaddress: ioctl (informacja o konfiguracji interfejsu)�getent - wy�wietla wpisy z bazy administracyjnej.�handle_request: odebrano ��danie (Wersja = %d)�stworzenie dowi�zania nie powiod�o si�, u�yto symlinka�gdzie� dowi�zany�b��dne pole CORRECTION w linii Leap�b��dne ple Rolling/Stationary w linii Leap�b��dna sta�a znakowa w �a�cuchu�b��dn znak w pliku: �b��dny element sortowania�niepoprawna definicja�niepoprawne kodowanie�niepoprawna sekwencja escape na ko�cu �a�cucha�b��dna sekwencja wej�ciowa na pozycji %ld�niepoprawne nazwy dla zakresu znak�w�b��dny typ sieci :'%s' +-�nieprawid�owa warto�� offset w �a�cuchu %d w polu `era' w kategorii `%s'�b��dny numer zbioru�nieprawid�owa pierwsza data w �a�cuchu %d w polu `era' w kategorii `%s'�nieprawid�owa druga data w �a�cuchu %d w polu `era' w kategorii `%s'�ograniczenie implementacji: dozwolone maksymalnie %d klas znak�w�ograniczenie implementacji: dozwolone maksymalnie %d map znak�w�na ko�cu bufora wyst�pi� niekompletny znak lub sekwencja steruj�ca�nieprawid�owy format pliku�nieznany typ linii wej�ciowej�b��d wewn�trzny (nieprawid�owy deskryptor)�b��d wewn�trzny - addtype wywo�ane ze b��dnym isdst�b��d wewn�trzny - addtype wywo�ane ze b��dnym ttisgmt�b��d wewn�trzny - addtype wywo�ane ze b��dnym ttisstd�b��d wewn�trzny w %s, linia %u�nieprawid�owe przesuni�cie UTC�nieprawid�owy format skr�tu�nieprawid�owy dzie� miesi�ca�nieprawid�owy rok ko�cowy�nieprawid�owy rok przest�pny�b��dny typ dla dlopen()�nieprawid�owy miesi�c�b��dny czas oszcz�dno�ci�nieprawid�owy rok pocz�tkowy�nieprawid�owa pora dnia�nieprawid�owy dzie� tygodnia�d�ugo�� klucza w ��daniu jest za du�a: %Zd�linia za wyrzutni� musi zawiera� definicj� znaku�linia przed wyrzutni� nie mo�e zawiera� definicji sta�ej znakowej�za d�uga linia�wy�wietla wszystkie znane zestawy znak�w�brak pliku lokalizacji `%s' u�ytego w wyra�eniu `copy'�nieudany lstat�b��dna linia zosta�a pomini�ta�nie powiod�o si� odwzorowanie tablicy nag��wk�w sekcji�nie powiod�o si� odwzorowanie nag��wk�w sekcji�pami�� zosta�a uszkodzona przed przydzielonym blokiem +-�pami�� zosta�a uszkodzona za przydzielonym blokiem +-�pami�� zosta�a wyczerpana�pami�� zosta�a wyczerpana +-�pami�� jest zwarta, biblioteka zawiera b��dy +-�brak formatu ery w �a�cuchu %d w polu `era' w kategorii `%s'�brak nazwy ery w �a�cuchu %d w polu `era' w kategorii `%s'�bezimienna regu�a�nie podano kodowania �r�d�owego ani docelowego�netname2user: (odwzorowanie nis+): %s +-�netname2user: wpis DES dla %s w katalogu %s nie jest unikalny�netname2user: wpis LOKALNY dla %s w katalogu %s nie jest unikalny�netname2user: brak listy identyfikator�w grup w '%s'.�name2user: nazwa nadzorcy '%s' jest zbyt d�uga�netname2user: UID 0 nie powinien wyst�pi��program %d nie by� nigdy zarejestrowany +-�nie podano �adnych warto�ci <Uxxxx> lub <Uxxxxxxxx>�brak poprawnego wyra�enia regularnego dla pola `%s' w kategorii `%s': %s��aden z dni miesi�ca nie pasuje do regu�y�brak definicji `UNDEFINED'�nie podano nazwy pliku dla danych profiluj�cych a obiekt dzielony `%s' nie ma soname��adne s�owo kluczowe nie powinno wyst�powa� razem z `copy'�brak pliku wyj�ciowego - wyst�pi�y ostrze�enia�nie podano �adnej mapy repertuar�w: kontynuacja niemo�liwa�brak nazwy symbolicznej�brak nazwy symbolicznej dla ko�ca zakresu�brak definicji wagi dla symbolu `%s'�nie jest zwyk�ym plikiem�konfiguracja nscd: +- +-%15d poziom komunikat�w diagnostycznych +-�nscd nie jest uruchomiony! +-�po definicji CHARMAP mog� wyst�powa� tylko definicje WIDTH�nie podano kodowania �r�d�owego w opcji `-f'�plik wynikowy�problem rpc pmap_getmaps�poll: b��d protoko�u podczas zestawiania p�tli +-�b��d preprocesora�wy�wietla list� �cie�ek zliczania i ich numery�wy�wietla informacje o post�pie konwersji�wyst�pi�y problemy podczas czytania `%s'�dane profiluj�ce w pliku `%s' nie pasuj� do obiektu dzielonego `%s'�program %lu jest niedost�pny +-�program %lu wersja %lu jest niedost�pny +-�program %lu wersja %lu gotowy i oczekuje +-�rcmd: poll (podczas ustawiania stderr): %m +-�rcmd: socket: Wszystkie porty zaj�te +-�rcmd: write (podczas ustawiania stderr): %m +-�registerrpc: brak pami�ci +-�powt�rzone sekundy przest�pne�nie znaleziono pliku mapy repertuar�w `%s'�rpcgen: b��dne kodowanie arglist +-�rpcgen: za du�o definicji +-�rpcinfo: nieznany host %s +-�rpcinfo: nieznana us�uga %s +-�rpcinfo: Nie mog� usun�� rejestracji prog %s wer. %s +-�rpcinfo: rozg�aszanie nieudane: %s +-�rpcinfo: kontakt z portmapperem niemo�liwy�ta sama nazwa nazwa regu�y w r�nych plikach�brak danych podczas czytania klucza ��dania: %s�brak danych podczas czytania ��dania: `%s'�b��d zapisu w %s: %s�socket: protok� zawi�d� podczas konfiguracji po��czenia +-�porz�dki sortowania `forward' i `backward' wykluczaj� si� wzajemnie�specyfikacja wagi dla elementu sortowania nie ma sensu�standardowe wej�cie�standardowe wyj�cie�nieprawid�owa pierwsza data w �a�cuchu %d w polu `era' w kategorii `%s'�pierwszy rok jest p�niejszy ni� drugi�pierwszy rok jest zbyt du�y�pierwszy rok jest zbyt ma�y�nieprawid�owa druga data w �a�cuchu %d w polu `era' w kategorii `%s'�svc_run - b��d select�svc_tcp.c - wykonanie getsockname lub listen niemo�liwe�svc_tcp.c - problemy przy tworzeniu gniazda tcp�svc_tcp: makefd_xprt: brak pami�ci +-�svc_unix.c - problemy przy tworzeniu gniazda AF_UNIX�svc_unix.c - wykonanie getsockname lub listen niemo�liwe�svc_unix: makefd_xprt: brak pami�ci +-�svctcp_create: brak pami�ci +-�svcudp_create - wykonanie getsockname niemo�liwe�svcudp_create: brak pami�ci +-�svcudp_create: problemy przy tworzeniu gniazda�svcunix_create: brak pami�ci +-�symbol zarezerwowany dla wieloznakowego elementu sortowania `%.*s' powiela definicj� tego elementu�symbol zarezerwowany dla wieloznakowego elementu sortowania `%.*s' powiela definicj� innego elementu�symbol zarezerwowany dla wieloznakowego elementu sortowania `%.*s' powiela definicj� innego symbolu�symbol zarezerwowany dla wieloznakowego elementu sortowania `%.*s' powiela definicj� tego symbolu�symbol zarezerwowany dla wieloznakowego elementu sortowania `%.*s' powiela nazw� symboliczn� z zestawu znak�w�b��d sk�adniowy w definicji %s: %s�b��d sk�adniowy w dyrektywie `order_start'�b��d sk�adniowy definicji klasy znak�w�b��d sk�adniowy w definicji konwersji znaku�b��d sk�adniowy w definicji kolejno�ci sortowania�b��d sk�adniowy w definicji sortowania�b��d sk�adniowy w definicji kategorii LC_CTYPE�b��d sk�adniowy w definicji nowej klasy znak�w�b��d sk�adniowy w definicji nowej mapy znak�w�b��d sk�adniowy w definicji lokalnych komunikat�w�b��d sk�adniowy w definicji lokalnej waluty�b��d sk�adniowy w lokalnej definicji numerycznej�b��d sk�adniowy w specyfikacji kolejno�ci�b��d sk�adniowy w prologu: %s�b��d sk�adniowy w definicji mapy repertuaru: %s�b��d sk�adniowy w lokalnej definicji czasu�b��d sk�adniowy: nie wewn�trz sekcji definicji lokalnych�nie podano docelowego kodowania w `-t'�to pierwsza definicja�czas przed zerem�przepe�nienie czasu�za ma�o bajt�w w kodzie znaku�za du�o bajt�w w kodzie znaku�zdefiniowane zbyt wiele klas znak�w�za du�o sekund przest�pnych�za du�o lokalnych typ�w czasu�za duzo konwersji?!�za du�o wag�za d�ugie lub za du�o skr�t�w stref czasowych��miecie na ko�cu linii�problem przy odpowiadaniu programowi %d +-�dwie kolejne linie zawieraj�ce `...' nie s� dozwolone�podany pojedy�czy rok�przydzielenie bufora dla danych wej�ciowych by�o niemo�liwe�zwolnienie argument�w nie powiod�o si��niezdefiniowana�nieznany znak `%s'�nieznany znak w polu `%s' kategorii `%s'�nieznana dyrektywa sortuj�ca�nieznana dyrektywa `%s': linia zignorowana�nieznany b��d iconv() %d�nieznany zestaw `%s'�nieznany symbol `%.*s': linia zignorowana�strefa bez regu��niezako�czony komunikat�niezako�czony �a�cuch�niezako�czony napis�niezako�czona nazwa symboliczna�niezako�czona nazwa wagi�g�rna granica zakresu nie jest mniejsza ni� dolna�sk�adnia: %s plik_we +-�u�ycie 2/29 w roku nieprzest�pnym�warto�� %s musi by� liczb� ca�kowit��warto�� <%s> musi by� z zakresu 1 do 4�warto�� pola `%s' w kategorii `%s' nie mo�e by� pustym �a�cuchem�warto�� <mb_cur_max> musi by� wi�ksza ni� warto�� <mb_cur_min>�zawarto�� pola `int_curr_symbol' w kategorii `LC_MONETARY' nie jest zgodna z nazwami ISO 4217�zawarto�� pola `int_curr_symbol' w kategorii `LC_MONETARY' ma z�� d�ugo���warto�ci pola `%s' w kategorii `%s' musz� by� mniejsze ni� 127�podczas przyjmowania po��czenia: %s�podczas dokonywania wpisu do pami�ci podr�cznej�b��d podczas wstawiania do tablicy mieszaj�cej�podczas tworzenia kopii klucza�podczas otwierania starego katalogu�podczas przygotowywania wynik�w�podczas czytania bazy�podczas szukania pliku z danymi profiluj�cymi�podczas zapisywania pliku bazy�zapis nie by� kompletny�zapisywalny nie tylko przez w�a�ciciela�z�a liczba argument�w�z�a liczba p�l w linii Leap�z�a liczba p�l w linii Link�z�a liczba p�l w linii Rule�z�a liczba p�l w linii kontynuacji Zone�z�a liczba p�l w linii Zone�xdr_reference: brak pami�ci +-�xdrrec_create: brak pami�ci +-�yp_update: konwersja nazwy hosta na nazw� sieci jest niemo�liwa +-�yp_update: uzyskanie adresu serwera jest niemo�liwe +-� +\ No newline at end of file +diff -Naur ../glibc-2.1.3/po/pt_BR.mo glibc-2.1.3/po/pt_BR.mo +--- ../glibc-2.1.3/po/pt_BR.mo 1999-08-18 18:02:29.000000000 -0700 ++++ glibc-2.1.3/po/pt_BR.mo 1969-12-31 16:00:00.000000000 -0800 +@@ -1,448 +0,0 @@ +-�������������������8�������K������K������K��M���L��E���UL��&����L��(����L������L������L�����M�����&M�����5M�����IM�����dM�����~M��n���M�����O�����O��"���%O��"���HO�����kO��:����O������O������O������O������O�����P�����P�����2P�����LP�����eP������P������P������P������P������P�����Q�����#Q�����*Q�����EQ�����RQ�����YQ��3���kQ��3����Q��4����Q��.���R��%���7R�����]R��&���qR��%����R������R��%����R��3����R��,���/S��)���\S������S��"����S��!����S������S������S�����T�����.T�����DT��"���ZT��*���}T������T��&����T��&����T��&���U��&���7U��&���^U������U�� ����U��$����U������U������U�����V��,���2V�����_V��%���}V��,����V��-����V�� ����V��&���W�����FW�����eW������W������W������W������W�������W��2���|X������X��"����X��4����X�����"Y��#���4Y�� ���XY��=���bY������Y��<����Y������Y��'���Z�����6Z��)���?Z��(���iZ�� ����Z������Z������Z������Z��$����Z������Z��)��� +-[��(���4[�����][�����m[�����y[��#����[��/����[������[������[�� ���\�����\�����%\�����9\�����N\�����Z\�����j\������\������\������\������\������\�� ����\������\������\�� ���]��&���]��-���<]��!���j]������]������]������]������]��&����]��%���&^��0���L^��!���}^������^��-����^������^��%���_��)���(_��'���R_��%���z_��&����_������_������_������_����� +-`�����%`�����<`�����X`�����u`��@����`��D����`�����a�����'a�����@a�� ���Ua��=���_a������a�������a�����b��7����b��2����b��-��� c�����7c��$���Jc�� +-���oc�����zc������c��!����c������c������c������c������c�����d�����d�����/d�����Jd�����^d�����rd��3����d��-����d��2����d�����e�����,e�����5e�����<e�����Le�����fe��<���}e������e��$����e��)����e�� ���)f�����7f��1���If��8���{f������f������f������f������f�����g�����'g�����@g�����Og�����gg��"����g������g������g������g�������g�����oh�� ����h������h������h������h������h�� ����h�����i��$���'i�����Li��"���Si��%���vi��"����i��"����i��%����i�����j�����j�����.j��>���;j�����zj������j������j������j��!����j������j��!����j������j��.���k�����Mk�����ak�����nk��"���{k������k������k������k�� ����k������k��+����k�����(l�����El�����Vl�����ml������l������l������l������l������l����� +-m��1���m��$���Mm�����rm������m������m������m������m������m������m�����n�� +-���n�����#n�����*n��2���0n�����cn�����rn������n�� ����n������n������n������n������n����� o�����o��!���3o�����Uo�����so��s����o�����p��*���p�����Cp�����]p�����np�����p������p������p������p������p������p�����q�����q�����q��9���q�����Vq�����nq������q��,����q�� +-����q������q������q������q�����r�����#r�����>r�����Xr�����pr������r��#����r������r������r������r�����s��#���&s�����Js�����js�����ss������s������s������s������s������s������s������s�����t�����1t�����Pt�����pt������t������t������t������t������t������t�����u��*���#u�����Nu�����Uu�����mu������u�� ����u��!����u�� ����u������u������u�� ���v�����"v�����@v�����Mv�����av�����rv������v������v��(����v������v�����w�����w�����5w�����Ow�����ew�����~w������w������w������w������w������w������w��.����w�����"x�� ���4x��#���Bx��0���fx��%����x������x������x������x������x�����y�����#y�����@y�����Oy�����my������y������y������y������y������y������y�����z�����+z�����Ez�����_z�����qz������z������z������z������z������z��!���{�����.{�����G{�����b{�����~{������{������{��"����{������{������{����� |�����$|�����8|�����J|�����`|��-���o|��-����|��!����|������|�����}�����}�����2}�����C}��2���Z}��#����}������}������}��;����}�����~�����$~�����@~�����X~�� ���r~�� ����~������~������~������~������~������~���������������/�����J��&���c�������������������������������� ������������$���0��� ���U������c������o����������������������������������ˀ�����߀����������������� ���*���(���(���S������|����������"������������������D������K���$���e��� +-������������������������P��� ���`������n���!������������������������DŽ��������"����������������*������@������S���'���c���#�������6������� ������ +-�������������"������"���*������M���"���g��������������������Ć�����ۆ�� ����������������������������*������C������Z������o����������������������������������χ����������������� ���������#���%���:���I�����������������%����������ֈ��"������������!������ ���@���"���a��� ������������������������ω�����������������������������!���F���>��� �������.�������-�������6������8���#���;���\���I��������������������������+���$���+���P���'���|�������������Č�� ���ь�����ی���������������&���(���.���O���&���~����������,�������������������C������#���a�����������������!�������"������.������ ���4���%���U���;���{���&����������ޏ��1����������0������K������W���"���h����������'����������ϐ��������.���������3���"���J���(���m���-����������đ�����ܑ��!����������������8������X������t���!�����������������ʒ��������9�������4���7���8���l���+�������8���ѓ��$��� +-���"���/���!���R���.���t���������������������<������;���>���$���z�����������������*���ו��7���������:���"���Y������|���)�������N�������U���������^���&���|���)������� ���͗�����ۗ��+���������� ������>������X������j���"�������%�������*���Ә��*����������)������=���0���W�����������������+���Ǚ��7������#���+������O���!���m���$�������!����������֚��&������%������,���>������k���'���z���%�������0���ț��2����������,���.���9������h���K�������L���͜��L���������g���+���{���2�������2���ڝ��/��� ���$���=������b���%���x���-�������$���̞����������� ������'������:���(���Q���&���z���!����������ß��F���ڟ�����!���B���4���B���w���?�������<�������7���7������o����������#�������.���ɡ��0�������0���)������Z������x���������������������������Т������������������������%������;������O���#���d���5�������G������� ������#������5���8������n������{���-�������!�������(������-���������9������J���'���\���?�������=���ĥ�� ������.������ ���?���9���`���;�������,���֦��*������#���.������R���%���l���A����������ԧ��������I������7���X���3�������+���Ĩ��������'������!���/������Q���.���b����������C�������*������������������(���8������a���1���t�����������������:���ݪ��������)���6���*���`���#��������������$���ϫ���������������"���,������O������m�����������������>���Ĭ��������!���"��� ���D���(���e���$��������������*���ɭ��=�������H���2������{����������E�������&������(������'���0���E���X����������(�������'������$������,���-���)���Z���%��������������"���Ȱ��������&��� ������0���P���O���V�������U�������O���M���V�������!�������'������*���>���/���i���*�������$���ij��/������1������/���K���)���{���*�������)���д��#�������������-���9���&���g���4�������(���õ����������� ��� ������#���(���$���L���"���q��������������������Ķ�����۶��.���������������;���3���X����������#����������·�� ���۷��������0����������-���$���I������n����������#�����������������ȸ�����ݸ�����������������)���4���B������w�����������������'���ǹ��B������D���2���j���w���K������?���.������n����������!����������̻��������������������"���3������V������r�����������������#�������#�����#������0���'���#���X������|����������*�������%������R�� ������\������s���Y�������T������7���9���9���q����������������������������������������������1������K���M��_�����������������"�������"�������������;���8������t������|������������������������������������������������������1������J������f������~����������%����������������������������������������8���!���8���Z���F�������-�������*���������3���&���M���$���t����������.�������1�������4������*���J��� ���u���,�������3������� �������"���������;������U������h���&�������:��������������+�������+���(���'���T���'���|���'��������������4�������'���������@������_������w���*��������������#�������*�������+���%������Q���$���n���!������� ���������������������!������!���1�������S���/�������������(���3���7���\����������(��������������S����������8���I���I����������'��������������6�������+������%���I������o������q������z���1��������������7�������1��� ��� ���?������M������]���5���}���4��������������������� ��� ������������-���"���K������n�����������������&���������������������!������ ���1������?������R������V������l���5���{���4�������.�������*������*���@������k���/�������1�������B�������?���0���0���p���"�������D�������+��� ���2���5���:���h���;�������/�������<������!���L������n����������!��������������������� �������������G���4���W���|���������� ����������������"���F���+���%���r�����������+���\���B�������8�������8���������=���7���U��� +-���������������������$�������������������������������������9���#���U������y������������������������4�������4������9���=��� ���w������������������������$��������������>�������'���9���*���a���*���������������������-�������:��� ������D���"���b����������&��������������"��������������"���������2���/���M������}����������������������������S���-���p���!�������������� ���������������������%������+���=��� +-���i���&���t���'�������&�������)�������(���������=��� ���Q������r���Q����������������������������������%���������,���'���;���#���c���1����������������������������*����������������4������E������\������h���3����������������������������#��� +-������.������M������m���������� ��������������$�������%����������"������;������V��� ���t��� ������� ��������������������� +-���������������������6���������<������V������o������~������������������������$�������������)��� ���"���J������m���������������������)���C���<��������������������������������������������������� ���'������H������^������c������p���K���t���$���������������������4���������O������[������b������o���#���������������������������� ����������!��� ���>������_������s����������"�������$�������$������� ������"���&������I������a���$���z������������������������!�������+�������!���'���&���I������p���'��������������#��������������*���������-������B���(���`���������� ����������������������������*������� ��� ������.������H���"���`���"������������������������������������������������,���������J������c������z�����������������������������������������������������$��� ���9������Z���/���j�����������������"�������C�������(���#������L������b������|�������������������������������"����������������6���$���N���$���s�����������������#��������������������� ���������/������F���"���[������~���%�������$�������#�������!���������)������C������b���������"��������������2����������������������-������E������\������s����������5�������3������� ������(���)������R������i�����������������5�������.����������������%���?���D���"�������"���������������������������$������*���6������a������r������x����������!���������������������������+��� ������L������i������|���(��������������'�������#�������*���������>������N���%���]���"������������������������������������������������� ���������2���(���:���2���c�����������������(����������������������������%������� ���������������������������������������!��������������"���*����M�'���^���������������������+�����,�����9���&����`� +-���p����{�"�����#����������%�����$����'���4����\����|���������������������������������$����B����X����u���������������������������������� �#����9���6����p������1����������*��������'�<���7�4���t�*�����-�����#�������&����7����O����T����Y����p�#�����J����������+����8���4�?���m�;�����@�����R���* �.���} �'���� ����� �0���� �0��� +-�+���F +-�+���r +-����� +-� ���� +-�"���� +-� ���� +-�����6����2���U�+����������2�����$����� ����7���?�5���w�-����������&�����)���" �7���L �+���� �6���� �K���� �4���3�.���h�B�����#��������������7���)�,���a�5�����%�����*�����>����"���T�.���w�5�����4���������$���/�(���T�&���}�*�����#�����0�����2���$�%���W�(���}�&�����K�����8����<���R�0�����A�����#����#���&�3���J�5���~�*�����*�����*��� +-�G���5�F���}�(����������#����+���/�8���[�'�����+����������7����M���:�V����������-�����(���-����V����f�2�����$���������������"�������8�*���V�3�����/����������!�����5��� ����V����q�(�����=��������������*���-�'���X�2�����%�����5�����*����+���:����f�)���u�)�����.�����:��������3�4���B����w�R�����K�����K���.����z�$�����6�����6�����1���&�.���X�%�����.�����6�����(��� ����< ����\ ����z ����� �-���� �*���� �&���� ����#!�E���9!����!�A����!�A����!�K���"�I���i"�?����"� ����"�%���#����:#�2���Z#�4����#�4����#�����#����$����.$����M$����a$����t$�����$�����$�����$�����$�����$�����$�/���%�3���K%�E���%�����%�1����%�@��� &����J&����Y&�<���q&�)����&�+����&�1���'����6'����G'�4���Y'�>����'�<����'���� +-(�-���(� ���G(�=���h(�?����(�3����(�-���)�$���H)����m)�+����)�D����)�!����)����*�a���:*�F����*�B����*�9���&+����`+�0���{+�)����+�����+�4����+���� ,�K���8,�1����,�����,�����,�5����,����-�3���3-����g-�����-�L����-�!����-�,��� +-.�,���7.�%���d.�%����.�&����.�'����.�"����.�(���"/�*���K/����v/�#����/�&����/�A����/����0�(���=0�)���f0�.����0�����0�����0�7����0�K���%1�@���q1�����1�����1�A����1����2�,���02�-���]2�D����2�����2�=����2�3���'3�0���[3�3����3�����3�1����3�)���4�*���:4�)���e4�)����4�*����4�X����4�X���=5�[����5�W����5�A���J6�#����6�)����6�4����6�7���7�3���G7�*���{7�2����7�=����7�:���8�/���R8�-����8�,����8�)����8����9�)���%9�,���O9�A���|9�0����9�����9����:���� :�'���1:�'���Y:�&����:�����:�����:�����:�����:�9���;����>;�!���U;�:���w;�����;�%����;�����;� +-��� <����<�3���3<�#���g<�*����<�����<�����<�+����<����=����+=����B=����W=����l=�����=�<����=�����=�����=�!���>�&���9>�D���`>�B����>�j����>�S���S?�H����?�����?�"���@�(���3@����\@�+���z@�����@�����@�3����@�%���A����2A� ���EA����fA�(����A�(����A�(����A�:����B�(���;B�)���dB�)����B�6����B�7����B��������k��������������������������@������,�������(�������������:��C����������������p��}���������2�������������k��D����������!��a���S����q�������J������������w��7������������@��������������E��V��H���������s������l���s���������u���[���������v������������������:������������������6��=������u������������������o���.������ ����|��d�����p���������������9�������������������$���������[�������������������l��?���������������C��`��������������*�����X���9��I������S��V��p������!������������y��d������������������������������Q������1�����������������n��^�� +-��� ���m���4���������?��������m������r�������������������������������]�������������������������������#������������������/���_��J����������������������������������������������s��f��Q��8�����r����������z���������<������������������x������B��{��K�������������>����������D��M����������������������������>����������������o���������i�������@����������x����������������b������� �������g���a�����������������E��o��e�������-��x��W������������������������������������������������Z�������s���R��"�������������4���������������/��������������������*����������(�������������������1�������k������L��V������N����)��������A������y���������*�����f���$������X������Q��)��#���K����������������[�������q�������D�����������T������a����������.���������T�������,��'�������u��\������������!�������3������������g�� +-������=��H���]�����-��5��O��z��������������������j�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��`�����������������������������������U������m�����{�����Q������c��P��������������������������������������������6���r����������������`���������t�����e��5�������������F��h��|�������������������b�������������������e�����\���~��2��E������� ���j�������#����������� ���������m��������������y������������1��M����������\����������4��f�������R����������7��Y�������������f��L�������F������������������������������������<����������� �� ���������������{��i���������Y�������������������������������� ���%���������(������c����������������������������~��������,����������{��������������������������������C���5��"���������?������v���)�������?������ +-����������+��������������/��~��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��P������������������������y���`�� ��<��w���}�����_�����'��H������d��������������n����������������H���������G������5��>����+�������S�����������-���������Y������������!����������������I����������g����l���������^��z������������v����������������������������������������N��A������|�����t���������W��������������������������+��������$��3��h�����������������c����������������������b��&��A������i���������������������b��[�� �������8�������������O��������o�����Y��#���������������r�����N���0����������������;��n��������������%����������������������������������������������������������E�� ������K������������ +-��M��������������������������h�������X��������������T��t������������������^�����9�����M�� ��J���������������>���+�����������������(���������2��c���������6��&��������V���)��������������������������������U��=�������B�������������;���v����������������0���������������Z�����������%��������������������~���������]������������������������1���������������N��������p��2��i���'��:��0������-���D�����������S������������������������W������L��8�����������������������������������}�������������������,�����������������������t�������������&�����B��w�������������l�����������������I�����������������������������6��'��������������������U�������������������������:������*������F�������������������������������������������n���������.�����q������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��T��Z��F����������������g��4�����q�����_��O��K��P��\����������������X�������������I�����������z��������������������������������������������������������G����������0�����a��A�����B�����j��U�����������������������������������<��$������k���������������]��P�����������h���������������3��������������9���������� Access Rights : � Attributes : � %s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile] +-� %s [-n netid]* [-o outfile] [infile] +-� %s [-s nettype]* [-o outfile] [infile] +-� Access rights: � Entry data of type %s +-� Name : %s +-� Public Key : � Type : %s +-� Universal addresses (%u) +-� [%d] Name : %s +-� [%u] - [%u bytes] � +-%s cache: +- +-%15s cache is enabled +-%15Zd suggested size +-%15ld seconds time to live for positive entries +-%15ld seconds time to live for negative entries +-%15ld cache hits on positive entries +-%15ld cache hits on negative entries +-%15ld cache misses on positive entries +-%15ld cache misses on negative entries +-%15ld%% cache hit rate +-%15s check /etc/%s for changes +-� +-Group Members : +-� +-Time to Live : � rpcinfo -b prognum versnum +-� rpcinfo -d prognum versnum +-� rpcinfo -p [ host ] +-� rpcinfo [ -n portnum ] -t host prognum [ versnum ] +-� no� yes� Data Length = %u +-� Explicit members: +-� Explicit nonmembers: +-� Implicit members: +-� Implicit nonmembers: +-� No explicit members +-� No explicit nonmembers +-� No implicit members +-� No implicit nonmembers +-� No recursive members +-� No recursive nonmembers +-� Recursive members: +-� program vers proto port +-� or: � (rule from "%s", line %d)� [OPTION...]� done +-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags. +-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed. +-�%s%s%s:%u: %s%sUnexpected error: %s. +-�%s%sUnknown signal %d +-�%s: %d did not sign extend correctly +-�%s: <mb_cur_max> must be greater than <mb_cur_min> +-�%s: C preprocessor failed with exit code %d +-�%s: C preprocessor failed with signal %d +-�%s: Can't create %s: %s +-�%s: Can't create directory %s: %s +-�%s: Can't link from %s to %s: %s +-�%s: Can't open %s: %s +-�%s: Can't remove %s: %s +-�%s: Error closing %s: %s +-�%s: Error reading %s +-�%s: Error writing %s +-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s +-�%s: Memory exhausted: %s +-�%s: More than one -L option specified +-�%s: More than one -d option specified +-�%s: More than one -l option specified +-�%s: More than one -p option specified +-�%s: More than one -y option specified +-�%s: Too many arguments +-�%s: cannot get modification time�%s: command was '%s', result was %d +-�%s: error in state machine�%s: illegal option -- %c +-�%s: invalid option -- %c +-�%s: option `%c%s' doesn't allow an argument +-�%s: option `%s' is ambiguous +-�%s: option `%s' requires an argument +-�%s: option `--%s' doesn't allow an argument +-�%s: option `-W %s' doesn't allow an argument +-�%s: option `-W %s' is ambiguous +-�%s: option requires an argument -- %c +-�%s: output would overwrite %s +-�%s: panic: Invalid l_value %d +-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s' +-�%s: unrecognized option `--%s' +-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ] +- [ -L leapseconds ] [ -y yearistype ] [ filename ... ] +-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ... +-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object) +-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible +-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]... +-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT +-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data +-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag! +-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file! +-�Cannot use netid flag with inetd flag! +-�Cannot use netid flag without TIRPC! +-�Cannot use table flags with newstyle! +-�Channel number out of range�Character Separator : %c +-�Child exited�Client credential too weak�Columns : +-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc. +-This is free software; see the source for copying conditions. There is NO +-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique +-�DIRECTORY +-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights : +-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits) +-�Directory : %s +-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY +-�Encrypted data +-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file. Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP +-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group : %s +-�Group Flags :�Group entry for "%s.%s" group: +-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos. +-�Killed�LINK +-�LOCAL entry for UID %d in directory %s not unique +-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s +-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server : +-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME +-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT +-�NUMBER�Name : '%s' +-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered. +-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None. +-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns : %d +-�Number of objects : %u +-�Numerical argument out of domain�Numerical result out of range�Object #%d: +-�Object Name : %s +-�Object Type : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner : %s +-�PRIVATE +-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits) +-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate : +-�Report bugs to %s. +-�Report bugs using the `glibcbug' script to <bugs@gnu.org>. +-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path : %s +-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root +-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status : %s +-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%s�TABLE +-�Table Type : %s +-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known. This does +-not necessarily mean that all combinations of these names can be used for +-the FROM and TO command line parameters. One coded character set can be +-listed with several different names (aliases). +- Some of the names are no plain strings but instead regular expressions and +-they match a variety of names which can be given as parameters to the +-program. +- +- �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information. +-�Trying %s... +-�Type : %s +-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d) +-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s +-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname] +-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s. +-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory +-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice +-�bogus mcheck_status, library is buggy +-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d +-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s +-�cannot find any C preprocessor (cpp) +-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory +-�clntudp_create: out of memory +-�clntunix_create: out of memory +-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server +-�couldn't register prog %d vers %d +-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten +-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s' +-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block +-�memory clobbered past end of allocated block +-�memory exhausted�memory exhausted +-�memory is consistent, library is buggy +-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s +-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d +-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration: +- +-%15d server debug level +-�nscd not running! +-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup +-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available +-�program %lu version %lu is not available +-�program %lu version %lu ready and waiting +-�rcmd: poll (setting up stderr): %m +-�rcmd: socket: All ports in use +-�rcmd: write (setting up stderr): %m +-�registerrpc: out of memory +-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error +-�rpcgen: too many defines +-�rpcinfo: %s is unknown host +-�rpcinfo: %s is unknown service +-�rpcinfo: Could not delete registration for prog %s version %s +-�rpcinfo: broadcast failed: %s +-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup +-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory +-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory +-�svctcp_create: out of memory +-�svcudp_create - cannot getsockname�svcudp_create: out of memory +-�svcudp_create: socket creation problem�svcunix_create: out of memory +-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d +-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage: %s infile +-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory +-�xdrrec_create: out of memory +-�yp_update: cannot convert host to netname +-�yp_update: cannot get server address +-�Project-Id-Version: libc 2.1 +-POT-Creation-Date: 1998-11-28 09:29-0800 +-PO-Revision-Date: 1999-06-29 18:07-0300 +-Last-Translator: Rodrigo Parra Novo <rodarvus@conectiva.com.br> +-Language-Team: Brazilian Portuguese <ldp-br@bazar.conectiva.com.br> +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=ISO-8859-1 +-Content-Transfer-Encoding: 8-bit +-� Direitos de Acesso: � Atributos : �%s [-abkCLNTM][-Dname[=valor]] [-i tamanho] [-I [-K segundos]] [-Y rota] arquivo_entrada +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o arquivo-sa�da] [arquivo-entrada] +-� %s [-n id-rede]* [-o arquivo-sa�da] [arquivo-entrada] +-� %s [-s tipo-rede]* [-o arquivo-sa�da] [arquivo-entrada] +-� Direitos acesso: � Entrada de dados de tipo %s +-� Nome : %s +-� Chave p�blica: � Tipo : %s +-� Endere�o universal (%u) +-� [%d] Nome : %s +-� [%u] - [%u bytes] � +-cache %s: +- +-%15s cache est� habilitado +-%15Zd tamanho sugerido%15ld segundos de vida para entradas positivas +-%15ld segundos de vida para entradas negativas +-%15ld hits do cache para entradas positivas +-%15ld hits do cache para entradas negativas +-%15ld%% quantidade de hits no cache +-%15s verifique o arquivo /etc/%s para mudan�as +-� +-Membros do Grupo : +-� +-Tempo de Vida : � rpcinfo -b n�mprog n�mvers +-� rpcinfo -b n�mprog n�mvers +-� rpcinfo -p [ host ] +-� rpcinfo [ -n n�mporta ] -t host n�mprog [ n�mvers ] +-� n�o� sim� Tamanho dados = %u +-� Membros expl�citos: +-� N�o-membros expl�citos: +-� Membros impl�citos: +-� N�o-membros impl�citos: +-� Membros n�o expl�citos +-�N�o-membros n�o expl�citos +-� Membros n�o impl�citos +-�N�o-membros n�o impl�citos +-�Membros n�o recursivos +-�N�o-membros n�o recursivos +-� Membros recursivos: +-� programa vers�o protocolo porta +-� ou: � (regra de "%s", linha %d)� [OP��O...]� feito +-�"%s", linha %d: %s�A linha "Zone %s" e a op��o -l s�o mutuamente exclusivas�A linha "Zone %s" e a op��o -p s�o mutuamente exclusivas�"arquivo-entrada" � necess�rio para gera��o de indicadores do modelo. +-�%.*s: ARGP_HELP_FMT par�metro requer um valor�%.*s: Par�metro ARGP_HELP_FMT desconhecido�%s em uma zona sem regras�%s%s%s:%u: %s%sAssertiva `%s' falhou. +-�%s%s%s:%u: %s%sErro inesperado: %s. +-�%s%sSinal desconhecido %d +-�%s: %d n�o fez extens�o de sinal corretamente +-�%s: <mb_cur_max> deve ser maior que <mb_cur_min> +-�%s: Pr�-processador C falhou com c�digo de sa�da %d +-�%s: Pr�-processador C falhou com sinal %d +-�%s: N�o � poss�vel criar %s: %s +-�%s: N�o � poss�vel criar o diret�rio %s: %s +-�%s: N�o � poss�vel criar um link de %s para %s: %s +-�%s: N�o � poss�vel abrir %s: %s +-�%s: N�o � poss�vel remover %s: %s +-�%s: Erro fechando %s: %s +-�%s: Erro lendo %s +-�%s: Erro escrevendo %s +-�%s: Erro escrevendo para sa�da padr�o �%s: linha Leap no arquivo %s, que n�o � arquivo de ajuste +-�%s: Mem�ria esgotada: %s +-�%s: Mais que uma op��o -L foi especificada +-�%s: Mais que uma op��o -d foi especificada +-�%s: Mais que uma op��o -l especificada +-�%s: Mais que uma op��o -p especificada +-�%s: Mais que uma op��o -y especificada +-�%s: Muitos par�metros +-�%s: n�o � poss�vel processar modifica��es de hor�rio�%s: comando era '%s', resultado era %d +-�%s: erro na m�quina de estados�%s: op��o ilegal -- %c +-�%s: op��o inv�lida -- %c +-�%s: op��o `%c%s' n�o permite um argumento +-�%s: op��o `%s' � amb�gua +-�%s: op��o `%s' requer um argumento +-�%s: op��o `--%s' n�o permite um argumento +-�%s: op��o `-W %s' n�o permite um argumento +-�%s: op��o `-W %s' � amb�gua +-�%s: op��o requer um argumento -- %c +-�%s: sa�da poder� sobrescrever %s +-�%s: p�nico: l_value inv�lido %d +-�%s: fim de arquivo prematuro�%s: N�o foi poss�vel abrir �%s: op��o n�o reconhecida `%c%s' +-�%s: op��o n�o reconhecida `--%s' +-�%s: uso � %s [ -s ] [ -v ] [ -l tempolocal ] [ -p regrasposix ] [ -d diret�rio ] +- [ -L segundosajuste ] [ -y tipoano ] [ nome do arquivo ... ] +-�%s: uso � %s [ -v ] [ -c cutoff ] nomezona ... +-�%s: enquanto escrevendo sa�da: �(ERRO DE PROGRAMA) Vers�o desconhecida!?�(ERRO DE PROGRAMA) Op��o deveria ter sido reconhecida!?�(Objeto desconhecido) +-�(erro de autentica��o desconhecido - %d)�(desconhecido)�*** O arquivo `%s' est� sem s�mbolos (stripped): a an�lise detalhada � imposs�vel +-�*entrada padr�o*�-o ARQUIVO-SA�DA [ARQUIVO-ENTRADA]... +-[ARQUIVO-SA�DA [ARQUIVO-ENTRADA...]�se��o .lib corrompida em a.out�; vers�o baixa = %lu, vers�o alta = %lu�; porque = �<%s> e <%s> s�o nomes ilegais para faixa de caracteres�<SP> caracter n�o deve estar na classe `%s'�<SP> caracter n�o est� na classe `%s'�?�Abortado�Direitos de Acesso : �Acessando uma biblioteca compartilhado corrompida�Endere�o j� em uso�Fam�lia de endere�os n�o suportada para nome de m�quina�Fam�lia de endere�os n�o suportada pelo protocolo�Erro de aviso�Alarme de tempo�Lista de argumentos muito longa�Tentativa de remo��o de uma tabela que n�o est� vazia�Tentando o link em muitas bibliotecas compartilhadas�Autentica��o OK�Erro de autentica��o�OBJETO FALSO +-�Endere�o inv�lido�Descritor de arquivo inv�lido�Formato do arquivo fonte inv�lido �Mensagem inv�lida�Chamada de sistema inv�lida�Valor inv�lido para ai_flags�Se extremamente compat�vel com o POSIX�Dados bin�rios +-�Dispositivo de bloco requerido�Problema em select para broadcast�Pipe quebrado�Erro no barramento�CDS�Tempo de CPU excedido�Tempo expirado�N�o foi poss�vel acessar uma biblioteca compartilhada�N�o posso executar bind com o servidor deste dom�nio�N�o foi poss�vel comunicar-se com o portmapper�N�o foi poss�vel comunicar-se com o ypbind�N�o foi poss�vel comunicar-se com o ypserv�N�o foi poss�vel alocar mem�ria�N�o foi poss�vel acessar o endere�o requisitado�N�o � poss�vel criar socket para rpc de broadcast�N�o foi poss�vel executar uma biblioteca compartilhado diretamente�N�o � poss�vel ter mais de um indicador de gera��o de arquivo! +-�N�o foi poss�vel receber resposta para broadcast�N�o foi poss�vel registrar servi�o�N�o � poss�vel enviar ap�s desligamento do ponto final de transporte�N�o foi poss�vel enviar pacote de broadcast�N�o foi poss�vel usar op��o do socket SO_BROADCAST�Nao � poss�vel especificar mais de um arquivo de entrada! +-�N�o � poss�vel user tabela de indicadores com novo estilo! +-�N�o � poss�vel usar indicador netid sem TIRPC! +-�N�o � poss�vel usar indicadores de tabelas com novo estilo! +-�N�mero do canal fora do intervalo�Separador de caracteres "%c +-�Filho finalizado�Credencial do cliente muito fraca�Colunas : +-�Erro de communica��o ao enviar�Compila especifica��o localizada�O computador comprou a fazenda�O c�lculo do tamanho da tabela de classes de caracteres pode demorar...�O c�lculo do tamanho da tabela de informa��es de compara��o (collation) pode demorar...�Conex�o recusada�Conex�o fechada pela outra ponta�Tempo esgotado para conex�o�Continua�Converte codifica��o dos arquivos dados de uma codifica��o para outra.�Converte chave para letras min�sculas�Copyright (C) %s Free Software Foundation, Inc. +-Este � um software free; leia os fontes para condic�es de c�pia. N�o existe +-garantia; nem para com�rcio ou adequac�o para prop�stios particulares. +-�n�o � poss�vel ler arquivo de registro "%s"�Cria arquivo NOME com cabe�alho C contendo defini��es de s�mbolos �Cria sa�da mesmo que mensagens de aviso forem produzidas�Cria um base de dados DB simples de uma entrada textual.�Hor�rio de cria��o : %s�Entrada DES para nome de rede (netname) %s n�o � �nica +-�DIRET�RIO +-�DNANS�DNS�Base de dados para tabela n�o existe�Base de dados est� ocupada�Direitos de Acesso padr�o : +-�Endere�o de destino requerido�Dispositivo n�o � um stream�Dispositivo n�o configurado�Dispositivo ou recurso est� ocupado�Diffie-Hellmann (%d bits) +-�Diret�rio : %s +-�Diret�rio n�o vazio�Cota de disco excedida�N�o divide (fork) e mostre mensagens na tty corrente�N�o mostra mensagens enquanto constr�i base de dados�N�o usar cat�logo existente, for�ar novo arquivo de sa�da�Dom�nio n�o limitado (not bound)�trap EMT�ENTRADA +-�Dado criptografado +-�Tipo de entrada/tabela incompat�veis�Erro no subsistema RPC�Erro acessando arquivo inicial do NIS+. O NIS+ est� instalado?�Falha no erro desconhecido do sistema: �Erro durante a chamada a processo callback�Erro: arquivo .netrc � leg�vel por outros.�Troca completa�Erro no formato exec�FATAL: sistema n�o define `_POSIX2_LOCALEDEF'�ARQUIVO cont�m mapas de nomes simb�licos para valores UCS4�Falha (erro n�o especificado)�Descritor de arquivo em mal estado�Arquivo existe�Erro de bloqueio em arquivo (deadlock)�Nome de arquivo muito longo�Excedido tamanho limite de arquivo�Arquivo muito grande�Primeira/pr�xima corrente quebrada�Exce��o de ponto flutuante�Resincronismo total necess�rio para o diret�rio�Fun��o n�o implementada�GRUPO +-�Lixo em ARGP_HELP_FMT: %s�Gera cat�logo de mensagens.\vSe ARQUIVO-DE-ENTRADA � -, a entrada � lidada entrada padr�o. Se ARQUIVO-DE-SA�DA +-� -, a sa�da � escrita para a sa�da padr�o. +-�Erro desconhecido de sistema�Pegar informa��es espec�ficas de localiza��o.�Retorna uma mensagem de uso curta�Retorna este arquivo de ajuda�Erro gratuito�Grupo : %s +-�Indicadores de Grupo :�Entrada de Grupo para grupo "%s.%s": +-�Pendurar por SEG segundos (o padr�o � 3600)�Desconex�o�N�o encontrado "%d" no cache de grupo!�N�o encontrado "%d" no cache de senhas!�N�o encontrado "%s" no cache de grupo!�N�o encontrado "%s" no cache de m�quinas!�N�o encontrado "%s" no cache de senhas! �Host est� desligado�Falha na procura do nome de host�poss�vel E/S�ARQUIVO-ENTRADA ARQUIVO-SA�DA +--o ARQUIVO-SA�DA ARQUIVO-ENTRADA +--u ARQUIVO-ENTRADA�trap IOT�IVY�Identificador removido�Instru��o ilegal�Tipo ilegal de objeto para a opera��o�Procura ilegal�Tipo ou formato de arquivo inapropriado�ioctl inapropriado para dispositivo�Opera��o inapropriada para processo em background�Requesi��o de informa��o�Informa��o:�Arquivos de entrada:�Especifica��o de formato de Entrada/Sa�da:�Erro de entrada/sa�da�Erro NIS interno�Erro interno de ypbind�Interrup��o�Chamada de sistema interrompida�Chamada de sistema interrompida deve ser reiniciada�Objeto inv�lido para opera��o�Argumento inv�lido�Refer�ncia anterior inv�lida�Nome de classe de caracter inv�lido�Credencial de cliente inv�lido�Verificador de cliente inv�lido�Caracter de compara��o inv�lido�Conte�do inv�lido de \{\}�Link entre dispositivos inv�lido�Troca inv�lida�Multibyte ou caracter largo inv�lido�Express�o regular precedente inv�lida�Intervalo final inv�lida�Express�o regular inv�lida�C�digo de requisi��o inv�lido�Descritor de requisi��o inv�lido�Verificador de servidor inv�lido�Slot inv�lido�� um diret�rio�� um arquivo tipo nome�vel�Kerberos. +-�Morto�LINK +-�Entrada LOCAL para UID %d no diret�rio %s n�o � �nica +-�Parada de sistema n�vel 2�N�vel 2 n�o sincronizado�N�vel 3 parado�N�vel 3 resetado�V�nculo aponta para nome ilegal�Link foi cortado�N�mero de link fora da faixa�Tipo de Objeto Vinculado (linked) : �Vinculado (linked) para : %s +-�N�o foi configurado nome de dom�nio local�Falha na aloca��o de recurso local�A maquina n�o est� na rede�Nome malformado ou ilegal�Par�metros obrigat�rios ou opcionais para op��es longas s�o tamb�m obrigat�rios ou opcionais para qualquer op��o curta correspondente.�Servidor Mestre : +-�Servidor Mestre ocupado, descarregamento completo (dump) remarcado.�Falha de aloca��o de mem�ria�Mem�ria esgotada�Mensagem muito longa�Atributo perdido ou malformado�Hor�rio Mod. : %s�Modifica��o falhou�Opera��o de modifica��o falhou�Formato de modifica��o de sa�da:�Tentativa de Multihop�NOME�NOME +-[-a|-m]�NIS�Vers�es cliente/servidor NIS n�o conferem - n�o � poss�vel oferecer servi�o�Base de dados de mapas NIS est� ruim�Opera��o NIS+ falhou�Servidores NIS+ fora do alcance�Servi�o NIS+ est� indispon�vel ou n�o est� instalado�SEM OBJETO +-�N�MERO�Nome : `%s' +-�Servidor de Cache de Nomes.�Nome n�o servidor por este servidor�O nome n�o � �nico na rede�Nome ou servi�o desconhecido�Nome/entrada n�o � �nico�Objeto nomeado n�o � pesquis�vel�� necess�rio um autenticador�A rede desconectou-se ao resetar�A rede n�o responde�A rede est� fora de alcance�N�o h� estrutura CSI dispon�vel�N�o h� sem�foros XENIX dispon�veis�N�o h� endere�o associado com o nome�N�o h� endere�o associado com o nome�Sem anode�N�o h� espa�o de buffer dispon�vel�N�o h� processos filhos�N�o h� dados dispon�veis�N�o h� espa�o dispon�vel no servidor�N�o h� locks dispon�veis�N�o confere�M�dia n�o encontrada�N�o h� mensagens do tipo desejado�N�o h� mais registros no banco de dados map�N�o h� express�o regular anterior�N�o h� programas remotos registrados. +-�N�o h� rota para o host�N�o h� espa�o dispon�vel no dispositivo�Dispositivo inexistente�Arquivo ou diret�rio n�o encontrado�Chave no est� no mapa�Mapa n�o encontrado no dom�nio do servidor�Processo inexistente�Namespace NIS+ n�o encontrado�Falha irrecuper�vel na resolu��o de nome�nenhum. +-�N�o encontrado, nome inexistente�N�o � um arquivo nome�vel XENIX�N�o � um diret�rio�N�o encontrado�N�o � um servidor mestre para este dom�nio�Dono inv�lido�N�mero de Colunas : %d +-�N�mero de objetos : %u +-�Argumento num�rico fora de dom�nio�Resultado num�rico fora de alcance�Objeto #%d: +-�Nome do Objeto: %s +-�Tipo do Objeto: �Objeto � remoto�Objeto com o mesmo nome existe�N�mero �mpar de aspas�Somente o superusu�rio pode usar esta op��o!�Opera��o j� em progresso�Opera��o n�o permitida�Opera��o n�o suportada �Opera��o agora em progresso�Operation causaria bloqueio�Sem recursos de streams�Controle de Sa�da:�Sele��o de Sa�da:�Dono : %s +-�PRIVADO +-�Pacote n�o instalado�Erro de verifica��o (parser): %s�Sucesso Parcial�Objeto passado n�o � o mesmo objeto no servidor�Permiss�o negada�Falha de energia�Fim prematuro da express�o regular�Mostra o conte�do da base de dados do arquivo, um entrada por linha�Mostra estat�stica da configura��o atual�Mostra mais mensagens�Mostra vers�o do programa�Sucesso prov�vel�Provavelmente n�o encontrado�Tempo expirado para profiling�Driver de protocolo n�o anexado�Erro de protocolo�Fam�lia de protocolo n�o suportada�Protocolo n�o dispon�vel�Protocolo n�o suportado�Tipo errado de protocolo para socket�Pergunta ilegal para tabela nominada�Sair�Erro espec�fico de RFS�Procedimento RPC ruim para programa�Falha RPC na opera��o NIS�Programa RPC n�o dispon�vel�Vers�o incorreta de programa RPC�Estrutura RPC inv�lida�Vers�o RPC incorreta�RPC: (c�digo de erro desconhecido)�RPC: Erro de autentica��o�RPC: Imposs�vel decodificar resultado�RPC: imposs�vel codificar argumentos�RPC: Falhou (erro n�o especificado)�RPC: Vers�es incompat�veis de RPC�RPC: Falha no Port mapper�RPC: Procedimento indispon�vel�RPC: Programa n�o registrado�RPC: Programa indispon�vel�RPC: Programa/vers�o incompat�veis�RPC: Erro remoto de sistema�RPC: O servidor n�o pode decodificar os argumentos�RPC: Sucesso�RPC: Tempo esgotado�RPC: Imposs�vel receber�RPC: Imposs�vel enviar�RPC: Host desconhecido�RPC: Protocolo desconhecido�RSA (%d bits) +-�RTLD_NEXT usado em c�digo n�o dinamicamente carregado�L� e mostra perfil de dados do objeto compartilhado�L� configura��o de dados de NOME�Sistema de arquivos somente para leitura�Sinal de tempo-real %d�Express�o regular muito longa�Erro de E/S remota�Endere�o remoto alterado�Remova senha ou torne arquivo n�o-leg�vel por outros.�Reabertura de objeto compartilhado `%s' falhou�Duplicado : +-�Reporte erros (bugs) para %s. +-�Reportar erros usando o script `glibcbug' para <bugs@gnu.org>. +-�Argumentos de requisi��o inv�lidos�Erro de resolvedor 0 (n�o h� erro)�Erro interno do resolvedor�Evitado deadlock de recurso�Recurso perdido�Recurso temporariamente indispon�vel�Resultados enviados para processo chamador�SHOBJ [PROFDATA]�SUNYP�Rota de Busca :%s +-�Falha de segmenta��o�Servidor ocupado, tente novamente�Mem�ria do servidor exaurida�Servidor rejeitou credencial�Servidor rejeitou verificador�`Servname' n�o suportado para `ai_socktype'�Configura o nome do programa�Encerra o servidor�Sinal 0�Opera��o socket em um arquivo n�o-socket�Tipo socket n�o suportado�T�rmino de conex�o causada por software�Lamento. Voc� n�o � o superusu�rio +-�Defini��es fonte s�o encontrada no ARQUIVO�Erro de Srmount�Falha de pilha�Manipulador de arquivo NFS corrompido�Iniciar N�MERO de linhas (threads)�Posi��o : %s +-�Parado�Parado (sinal)�Parado (entrada tty)�Parado (sa�da tty)�Erro de pipe streams�A estrutura necessita de limpeza�Sucesso�Suprime avisos e mensagens de informa��o�Nomes de caracteres simb�licos definido en ARQUIVO�Erro de sistema�Informa��o do Sistema:�Falha de aloca��o de recursos do sistema�Diret�rio do sistema para mapas de caracteres: %s +- mapas de repert�rio: %s +- rota de localiza��o: %s +-%s�TABELA +-�Tipo de Tabela : %s +-�Falha tempor�rio na resolu��o de nome�Terminado��rea de texto ocupada�A lista seguinte cont�m todos os conjuntos de codifica��o de caracteres +-conhecidos. Isto n�o quer dizer necess�riamente que todas as combina��es +-destes nomes podem ser utilizadas nos par�metros FROM e TO. Um conjunto +-de caracteres pode ser listado com v�rios nomes diferentes (apelidos). +- Alguns destes nomes n�o strings simples mas sim, express�es regulares, e +-eles combinam com uma variedade de nomes que podem ser dados como par�metrosao programa. +- +- �Tempo de vida : �Tempo expirado�Muitos atributos�Muitos n�veis de links simb�licos�Muitos links�Muitos arquivos abertos�Muitos arquivos abertos no sistema�Muitos processos�Muitas refer�ncias: n�o � poss�vel unir�Muitos usu�rios�Trace/breakpoint trap�Contrabarra final�Tradutor morto�Ponto final de transporte j� est� conectado�Ponto final de transporte n�o est� conectado�Tente `%s --help' ou `%s --usage' para mais informa��es. +-�Tentando %s... +-�Tipo : %s +-�DESCONHECIDO�Imposs�vel autenticar cliente NIS+�Imposs�vel autenticar servidor NIS+�Imposs�vel criar chamador�Imposs�vel criar processo no servidor�Desconhecido (tipo = %d, bits = %d) +-�Palavra-chave em .netrc desconhecida %s�C�digo de erro NIS desconhecido�Base de dados desconhecida: %s +-�Erro desconhecido�Erro desconhecido �Host desconhecido�Objeto desconhecido�Op��o desconhecida: %s %s %s�Erro desconhecido do resolvedor�Erro desconhecido de servidor�Sinal desconhecido %d�Erro desconhecido de sistema�Erro desconhecido de ypbind�( ou \( descasados�) ou \) descasados�[ ou [^ descasados�\{ descasado�Vari�vel n�o reconhecida `%s'�Condi��o urgente de E/S�Uso:�Uso: %s nome_da_vari�vel [caminho] +-�Uso: rpcinfo [ -n n�mporta ] -u host n�mprog [ n�mvers ] +-�Sinal 1 definido pelo usu�rio�Sinal 2 definido pelo usu�rio�Valor muito extenso para o tipo de dados definido�Temporizador virtual expirado�Resultado insensato da execu��o do comando�Janela alterada�Escreve nomes dos mapas de caracteres (charmaps) dispon�veis�Escreve nomes das localiza��es (locales) dispon�veis�Escreve nomes das categorias selecionadasd�Escreve nomes das palavras-chave selecionadas�Escreve a sa�da para o arquivo NOME�Escrito por %s. +-�Tipo de m�dia incorreta�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Sim, 42 � o sentido da vida�Voc� realmente o destruiu desta vez�Tempo final da linha de zona n�o est� ap�s o tempo final da linha anterior�[ARQUIVO...]�`%1$s' defini��o n�o termina com `END %1$s'�`%s' n�o � o arquivo deperfil de dados correto para `%s'�`-1' deve ser o �ltimo registro no `%s' campo na `%s' categoria�`...' deve ser usado apenas em `...' e entradas `UNDEFINED'�`from' esperado ap�s primeiro argumento para `collating-element'�string `from' na declara��o de elemento de compara��o cont�m caracter desconhecido�Fam�lia de protocolo (ai_family) n�o suportada�Tipo socket (ai_socktype) n�o suportado�j� est� rodando�argumento para <%s> deve ser um caracter simples�argumento para `%s' deve ser um caracter simples�auth_none.c - Problema fatal de marshalling�authunix_create: n�o h� mem�ria suficiente +-�argumento inv�lido�dono inv�lido�campo FROM em branco na linha Link�campo TO em branco na linha Link�bloco liberado duas vezes +-�mcheck_status inv�lido, biblioteca est� com problemas +-�broadcast: ioctl (obter configura��o de interface)�broadcast: ioctl (obter flags de interface)�estouro de buffer�cache_set: n�o foi poss�vel alocar novo rpc_buffer�cache_set: aloca��o de v�tima falhou�cache_set: v�tima n�o localizada�n�o � poss�vel determinar abrevia��o para zona de tempo�n�o � poss�vel reassinalar n�mero de procedimento %d +-�n�o � poss�vel acessar arquivo de locale `%s'�N�o foi poss�vel alocar mem�ria�n�o � poss�vel criar descritor interno�n�o � possivel criar descritores internos�imposs�vel habilitar soquete para aceitar conec��es: %s�imposs�vel encontrar pr�-processador C: %s +-�imposs�vel encontrar qualquer pr�-processador C (cpp) +-�imposs�vel lidar com requisi��es de vers�es antigas %d; a vers�o atual � %d�n�o � poss�vel inserir elemento de compara��o `%.*s'�n�o � poss�vel inserir na tabela de resultados�n�o � poss�vel inserir nova defini��o de s�mbolo de compara��o: %s�imposs�vel carregar perfis de dados�imposs�vel abrir�n�o � poss�vel abrir `%s'�n�o � poss�vel abrir arquivo de banco de dados `%s': %s�n�o � poss�vel abrir arquivo de entrada `%s'�n�o � poss�vel abrir arquivo de defini��o locale `%s'�n�o � poss�vel abrir arquivo de sa�da�n�o � poss�vel abrir arquivo de sa�da `%s'�n�o � poss�vel abrir arquivo de sa�da `%s' para categoria `%s'�n�o � poss�vel abrir soquete: `%s'�n�o � poss�vel processar specifica��o de ordem�n�o � poss�vel ler diret�rio de mapa de caracter `%s'�imposs�vel ler arquivo de configura��o; isto � fatal�n�o � poss�vel ler do cliente�n�o � poss�vel ler cabe�alho de `%s'�n�o � poss�vel ler diret�rio locale `%s'�n�o � poss�vel ler arquivo locale `%s'�n�o � poss�vel ler mapa de repert�rio `%s'�imposs�vel ler dados de estat�stica�n�o � poss�vel ler atributos do arquivo `%s': %s�n�o � poss�vel escrever arquivo de sa�da para `%s'�n�o � poss�vel escrever resultado: %s�n�o � poss�vel escrever estatisticas: %s�n�o � poss�vel escrever para o cliente�categoria de dados requisitada mais que uma vez: isto n�o deveria acontecer�caracter %s'%s' na classe `%s' deve estar na classe `%s'�caracter %s'%s' na classe `%s' n�o deve estar na classe `%s'�caracter <SP> n�o definido no mapa de caracteres�caracter `%s' n�o definido enquanto necess�rio como valor default�classe de caracter `%s' j� definida�mapa de caracteres `%s' j� definido�arquivo de mapa de caracter `%s' n�o foi localizado�clnt_raw.c - Erro fatal no cabe�alho de serializa��o.�clnttcp_create: n�o h� mem�ria suficiente +-�clntudp_create: n�o h� mem�ria suficiente +-�clntunix_reate: n�o h� mem�ria suficiente +-�o elemento de compara��o `%.*s' aparece mais que uma vez: ignorar linha�o s�mbolo de compara��o `%.*s' aparece mais que uma vez: ignorar linha�s�mbolo de compara��o esperado ap�s `%s'�connectar-se ao endere�o %s: �identificador ou constante esperado�convers�o de `%s' para `%s' n�o � suportada�a convers�o parou devido a problemas de escrita na sa�da�n�o foi poss�vel criar um servidor rpc +-�n�o foi poss�vel registrar prog %d vers %d +-�base de dados [chave ...]�arquivo default de mapa de caracter `%s' n�o localizado�flag de dire��o na string %d no campo `era', categoria `%s', n�o � '+'nem '_'�flag de dire��o na string %d no campo `era', categoria `%s', n�o � um caracter simples�nome de caracter duplicado `%s'�defini��o de elemento de compara��o duplicada�defini��o para caracter duplicada `%.*s'�chave duplicada�defini��o de conjunto duplicada�nome de zona duplicado %s (arquivo "%s", linha %d)�identificador de mensagens duplicado�n�mero de mensagem duplicado�cadeia de caractere vazia�nome do peso vazio: linha ignorada�enablecache: cache j� ativado�enablecache: n�o foi poss�vel alocar cache�enablecache: n�o foi poss�vel alocar dados do cache�enablecache: n�o foi poss�vel alocar cache fifo�codifica��o para a sa�da�codifica��o para o texto original�o ponto final da �rea da elipse � maior que o in�cio �erro fechando entrada `%s'�erro fechando arquivo de sa�da�erro fechando arquivo de dados de perfil�erro enquanto inserindo elemento de compara��o na tabela hash�erro ao inserir na tabela hash�enquanto lendo entrada�esperado argumento tipo string para `copy'�linha de continua��o n�o foi localizada�falha no carregamento do objeto compartilhado `%s'�falha para carregar dados de s�mbolos�falha para mapear (mmap) o arquivo de dados do perfil�falha para iniciar o processo de convers�o�falha ao escrever dados para categoria `%s'�fcntl: F_SETFD�campo `%s' na categoria `%s' n�o definido�campo `%s' na categoria `%s' n�o definido�arquivo `%s' j� existe e pode ser sobrescrito +-�valor `from' do elemento de compara��o deve ser uma string�falha em fstat�lixo no final da especifica��o do c�digo de caracter�lixo no final do n�mero�lixo no final do valor do deslocamento na string %d no campo `era', categoria `%s'�lixo no final da data de in�cio na string %d no campo `era', categoria `%s'�lixo no final da data de parada na string %d no campo `era', categoria `%s'�gera gr�fico de chamadas�gera perfil com contadores e `ticks'�get_myaddress: ioctl (obt�m configura��o de interface)�getent - pega entrada da base de dados administrativa.�handle_request: requisi��o recebida (Vers�o = %d)�v�nculo (link( falhou, v�nculo simb�lico usado�vinculo (hard linked) em alg�m lugar�Campo CORRECTION ilegal em linha Leap (ajuste)�campo Rolling/Stationary ilegal em linha Leap (ajuste)�constante de caracteres ilegal na string�caracteres ilegais no arquivo: �elemento de compara��o ilegal�defini��o ilegal�dada codifica��o ilegal�sequ�ncia de escape ilegal no final da string�sequ�ncia de entrada ilegal na posi��o %ld�nomes ilegais para faixa de caracteres�nettype ilegal: `%s' +-�n�mero ilegal para offset na string %d no campo `era', categoria `%s'�n�mero de conjunto ilegal�data de in�cio ilegal na string %d no campo `era', categoria `%s'�data de parada ilegal na string %d no campo `era', categoria `%s'�limite de implementac�o: n�o s�o permitidas mais que %d classes de caracter�limite de implementac�o: n�o s�o permitidos mais que %d mapas de caracter�caractere incompleto ou mudan�a de seq�encia no final do buffer�arquivo formatado incorretamente�linha de entrada de tipo desconhecido�erro interno (descritor ilegal)�erro interno - addtype chamado com isdst incorreto�erro interno - addtype chamado com ttisgmt incorreto�erro interno - addtype chamado com ttisstd incorreto�erro interno em %s, linha %u�deslocamento UTC inv�lido�formato de abrevia��o inv�lido�dia do m�s inv�lido�ano final inv�lido�ano bissexto inv�lido�modo inv�lido para dlopen()�nome do m�s inv�lido�tempo gravado inv�lido�ano inicial inv�lido�hora do dia inv�lida�nome de dia de semana inv�lido�tamanho de chave na requisi��o muito longa: %Zd�linha ap�s elipse deve conter defini��o de caracter�linha antes da elipse n�o cont�m defini��o para constante de caracter�linha muito longa�lista todas as cole��es de caracteres codificados�arquivo locale `%s', usado na declara��o `copy' , n�o encontrado�falha em lstat�linha inv�lida ignorada�mapeamento da tabela de cadeias do cabe�alho da se��o falhou�mapeamento dos cabe�alhos da se��o falhou�mem�ria sobrescrita antes do bloco alocado +-�mem�ria sobrescrita ap�s o fim do bloco allocado +-�mem�ria esgotada�mem�ria esgotada +-�a mem�ria est� consistente, problemas na biblioteca +-�formato era ausente na string %d no campo `era', categoria`%s'�nome era ausente na string %d no campo `era', categoria `%s'�regra sem nome�codifica��o original nem destino especificada�netname2user: (nis+ lookup): %s +-�netname2user: entrada DES para %s no diret�rio %s n�o � �nica�netname2user: entrada LOCAL para %s no diret�rio %s n�o � �nica�netname2user: lista de id do grupo perdida em `%s'.�netname2user: nome principal `%s' muito longo�netname2user: n�o deve possuir uid 0�nunca registrado prog %d +-�Valores <Uxxxx> ou <Uxxxxxxxx> n�o entrados�n�o h� express�o regular correta para campo `%s', categoria `%s': %s�nehum dia do m�s satisfaz a norma�n�o h� defini��o de `UNDEFINED'�nome de arquivo para perfil de dados n�o informado e objetos compartilhados `%s' n�o tem `soname'�nehuma outra palavra-chave deve ser especificada quando `copy' � usado�nenhum arquivo de sa�da foi produzido porque avisos foram emitidos�mapa de repert�rio n�o especificado: n�o posso prosseguir�nenhum nome simb�lico dado�nenhum nome simb�lico dado para fim do intervalo�n�o foi definido peso para o s�mbolo `%s'�n�o � arquivo normal�configura��o nscd: +- +-%15d n�vel de debug do servidor +-�nscd n�o est� rodando! +-�apenas defini��es de WIDTH s�o permitidas em seguida � defini��o de CHARMAP�codifica��o original n�o especificada usando `-f'�arquivo de sa�da�problemas de pmap_getmaps rpc�poll: falha de protocolo na configura��o do circuito +-�Erro de pr�-processador�mostra lista de n�mero de rotas e seu n�mero de uso�mostra informa��es de progresso�problems lendo `%s'�arquivo de dados de perfil `%s' n�o coincide com objetos compartilhados `%s'�programa %lu n�o est� dispon�vel +-�programa %lu vers�o %lu n�o est� dispon�vel +-�programa %lu vers�o %lu pronto e aguardando +-�rcmd: poll (configurando stderr): %m +-�rcmd: socket: Todas as portas em uso +-�rcmd: write (configurando stderr): %m +-�registerrpc: n�o h� mem�ria suficiente +-�ajuste repetido em segundo momento�arquivo de mapas `%s' n�o foi localizado�rpcgen: erro na codifica��o de par�metros +-�rpcgen: muitas defini��es +-�rpcinfo: %s � um host desconhecido +-�rpcinfo: %s � um servi�o desconhecido +-�rpcinfo: N�o foi poss�vel apagar registro para prog %s vers�o %s +-�rpcinfo: broadcast falhou: %s +-�rpcinfo: imposs�vel contactar portmapper�mesmo nome de regra em m�ltiplos arquivos�falha na leitura lendo chave de requisi��o: %s�problems lendo `%s'�Erro escrevendo em %s: %s�socket: falha de protocolo na configura��o do circuito +-�as ordens de classifica��o `forward' e `backward' s�o mutuamente exclusivas�especifica��o de peso para s�mbolo de compara��o n�o faz sentido�entrada padr�o�sa�da padr�o�data inicial � ilegal na string %d no campo `era', categoria `%s'�ano inicial maior que ano final�ano inicial muito alto para ser representado�ano inicial muito baixo para ser representado�data de t�rmino � ilegal na string %d no campo `era', categoria `%s'�svc_run: - select falhou�svc_tcp_.c - n�o � poss�vel receber `getsocknome' ou `listen'�svc_tcp_.c - problema na cria��o do soquete AF_UNIX�svc_tcp: makefd_xprt: n�o h� mem�ria suficiente +-�svc_tcp_.c - problema na cria��o do soquete AF_UNIX�svc_tcp_.c - mem�ria exaurida�svc_unix: makefd_xprt: n�o h� mem�ria suficiente +-�svctcp_create: n�o h� mem�ria suficiente +-�svcudp_create - n�o � poss�vel getsockname�svcucp_create: n�o h� mem�ria suficiente +-�svcudp_create: problema na cria��o socket�svcunix_create: n�o h� mem�ria suficiente +-�s�mbolo para elemento de compara��o multicaracter `%.*s' duplica a defini��o do elemento�s�mbolo para elemento de compara��o multicaracter `%.*s' duplica a defini��o do elemento�s�mbolo para elemento de compara��o multicaracter `%.*s' duplica outra defini��o de s�mbolo�s�mbolo para elemento de compara��o multicaracter `%.*s' duplica a defini��o do s�mbolo�s�mbolo para elemento de compara��o multicaracter `%.*s duplicado�erro de sintaxe na defini��o %s: %s�erro de sintaxe na diretiva `order_start'�erro de sintaxe na defini��o de classe de caracteres�erro de sintaxe na defini��o de convers�o de caracteres�erro de sintaxe na defini��o de ordem de compara��o�erro de sintaxe na defini��o de compara��o�erro de sintaxe na defini��o da categoria LC_CTYPE�erro de sintaxe na defini��o de uma nova classe de caracteres�erro de sintaxe na defini��o de um novo mapa de caracteres�erro de sintaxe na defini��o da mensagem locale�erro de sintaxe na defini��o monet�ria locale�erro de sintaxe na defini��o num�rica locale�erro de sintaxe na especifica��o de ordem�erro de sintaxe em prolog: %s�erro de sintaxe no mapa de repert�rio: %s�erro de sintaxe na defini��o de tempo locale�erro de sintaxe: n�o est� dentro de uma defini��o de se��o locale�codifica��o destino n�o especificada usando `-t'�esta � a primeira defini��o�tempo menor que zero�estouro de tempo�poucos bytes na codifica��o do caracter�muitos bytes na codifica��o do caracter�muitas classes de caracteres definidas�excessivos ajustes em segundos�muitos tipos de tempo local�muitas transi��es?!�muitos pesos�abrevia��es de zona de tempo excessivas ou muito extensas�lixo no final da linha�problemas respondendo ao prog %d +-�duas linhas em uma lista contendo `...' n�o s�o permitidas�digitado ano simples�incapaz de alocar espa�o para entrada�n�o consegui liberar par�metros�indefinido�caracter desconhecido `%s'�caracter desconhecido no campo `%s', categoria `%s'�diretiva de compara��o desconhecida�diretiva desconhecida `%s': linha ignorada�erro iconv() desconhecido: %d�conjunto desconhecido `%s'�s�mbolo desconhecido `%.*s': linha ignorada�zona sem regras�mensagem n�o terminada�string n�o terminada�string n�o terminada�nome simb�lico n�o terminado�nome do peso n�o terminado�o limite inferior do intervalo � maior que o limite superior�uso: %s arquivo_entrada +-�use 2/29 em ano n�o bissexto�valor para %s deve ser um inteiro�valor para <%s> deve estar entre 1 e 4�valor para campo `%s', categoria `%s', n�o deve ser uma string vazia�o valor de <mb_cur_max> deve ser maior que o valor de <mb_cur_min>�o valor do campo `int_curr_symbol' na categoria `LC_MONETARY' n�o corresponde a um nome v�lido na ISO 4217�o valor do campo `int_curr_symbol' na categoria `LC_MONETARY' possui tamanho errado�os valores para o campo `%s' na categoria `%s' devem ser menores que 127�enquanto aceitando conec��o: %s�enquanto alocando entrada de cache�enquanto alocando entrada na tabela hash�enquanto alocando chave c�pia�enquanto abrindo antigo arquivo de cat�logo�enquanto preparando sa�da�enquanto lendo database�enquanto escrevendo arquivo data de dados de perfil�enquanto escrevendo arquivo data base�escrita incompleta�permiss�o de escrita para outros�n�mero incorreto de argumentos�n�mero incorreto de campos na linha Leap�n�mero incorreto de campos na linha Link�n�mero incorreto de campos na linha Rule�n�mero incorreto de campos na linha de continua��o de Zone�n�mero incorreto de campos na linha Zone�xdr_reference: n�o h� mem�ria suficiente +-�xdrrec_create: n�o h� mem�ria suficiente +-�yp_update: n�o � poss�vel converter host para netname +-�yp_update: n�o � poss�vel obter o endere�o do servidor +-� +\ No newline at end of file +diff -Naur ../glibc-2.1.3/po/sk.mo glibc-2.1.3/po/sk.mo +--- ../glibc-2.1.3/po/sk.mo 1999-07-18 18:19:42.000000000 -0700 ++++ glibc-2.1.3/po/sk.mo 1969-12-31 16:00:00.000000000 -0800 +@@ -1,451 +0,0 @@ +-������������t������8�������K������K������K��M����K��E���5L��&���{L��(����L������L������L������L�����M�����M�����)M�����DM�����^M��n��rM������N������N��"���O��"���(O�����KO��:���gO������O������O������O������O������O������O�����P�����,P�����EP�����aP�����zP������P������P������P������P�����Q����� +-Q�����%Q�����2Q�����9Q��3���KQ��3���Q��4����Q��.����Q��%���R�����=R��&���QR��%���xR������R��%����R��3����R��,���S��)���<S�����fS��"���S��!����S������S������S������S�����T�����$T��"���:T��*���]T������T��&����T��&����T��&����T��&���U��&���>U�����eU�� ���}U��$����U������U������U������U��,���V�����?V��%���]V��,����V��-����V�� ����V��&����V�����&W�����EW�����dW�����~W������W������W�������W��2���\X������X��"����X��4����X�����Y��#���Y�� ���8Y��=���BY������Y��<����Y������Y��'����Y�����Z��)���Z��(���IZ�� ���rZ������Z������Z������Z��$����Z������Z��)����Z��(���[�����=[�����M[�����Y[��#���p[��/����[������[������[�� ����[������[�����\�����\�����.\�����:\�����J\�����a\�����{\������\������\������\�� ����\������\������\�� ����\��&����\��-���]��!���J]�����l]������]������]������]��&����]��%���^��0���,^��!���]^�����^��-����^������^��%����^��)���_��'���2_��%���Z_��&����_������_������_������_������_�����`�����`�����8`�����U`��@���n`��D����`������`�����a����� a�� ���5a��=���?a�����}a�������a�����_b��7���~b��2����b��-����b�����c��$���*c�� +-���Oc�����Zc�����`c��!���dc������c������c������c������c������c������c�����d�����*d�����>d�����Rd��3���fd��-����d��2����d������d�����e�����e�����e�����,e�����Fe��<���]e������e��$����e��)����e�� ��� f�����f��1���)f��8���[f������f������f������f������f������f�����g����� g�����/g�����Gg��"���`g������g������g������g�������g�����Oh�� ���dh������h������h������h������h�� ����h������h��$���i�����,i��"���3i��%���Vi��"���|i��"����i��%����i������i������i�����j��>���j�����Zj�����cj�����gj�����zj��!����j������j��!����j������j��.����j�����-k�����Ak�����Nk��"���[k�����~k������k������k�� ����k������k��+����k�����l�����%l�����6l�����Ml�����jl������l������l������l������l������l��1����l��$���-m�����Rm�����dm�����m������m������m������m������m������m�� +-����m�����n����� +-n��2���n�����Cn�����Rn�����kn�� ���zn������n������n������n������n������n������n��!���o�����5o�����So��s���so������o��*����o�����#p�����=p�����Np�����_p�����~p������p������p������p������p������p������p������p��9����p�����6q�����Nq�����dq��,���}q�� +-����q������q������q������q������q�����r�����r�����8r�����Pr�����or��#����r������r������r������r������r��#���s�����*s�����Js�����Ss�����ms������s������s������s������s������s������s������s�����t�����0t�����Pt�����at�����yt������t������t������t������t������t��*���u�����.u�����5u�����Mu�����iu�� ���yu��!����u�� ����u������u������u�� ����u�����v����� v�����-v�����Av�����Rv�����cv������v��(����v������v������v������v�����w�����/w�����Ew�����^w�����nw������w������w������w������w������w��.����w�����x�� ���x��#���"x��0���Fx��%���wx������x������x������x������x������x�����y����� y�����/y�����My�����dy�����{y������y������y������y������y������y�����z�����%z�����?z�����Qz�����cz�����}z������z������z������z��!����z�����{�����'{�����B{�����^{�����w{������{��"����{������{������{������{�����|�����|�����*|�����@|��-���O|��-���}|��!����|������|������|������|�����}�����#}��2���:}��#���m}������}������}��;����}������}�����~����� ~�����8~�� ���R~�� ���`~������~������~������~������~������~������~������~����������*��&���C�����j������������������������� ������������$������ ���5������C������O������e������z����������������������������������Ԁ���������������*������(���3������\������i���"���}��������������$������+���$���E��� +-���j������u�������������0��� ���@������N���!���b���������������������������ń��"��������������� +-������ ������3���'���C���#���k���6������� ���ƅ�� +-���ԅ�����߅��"������"��� +-������-���"���G������j������������������������ ���ц�����߆������������������ +-������#������:������O������a������v����������������������������������·���������������#������:���)������d������z���%��������������"���̈��������!������� ��� ���"���A��� ���d����������������������������������Ɖ�����ˉ��������������F������ ���e���.���o���-�������6���̊��8������;���<���I���x�����������ڋ��������+������+���0���'���\����������������� �����������������ٌ���������&������.���/���&���^����������,������������������C�������#���A������e����������!�������"�����.������ ������%���5���;���[���&��������������1���ޏ�����������+���"���7������Z���'���v�����������������.���Ӑ��������"������(���<���-���e�����������������!���ȑ�����������������'������C���!���_������������������������9���̒��4������8���;���+���t���8�������$���ٓ��"�������!���!���.���C������r����������<�������;������$���*������O������g���*�������7�������������"��� ������,���)���?���N���i���U�������������&���,���)���S��� ���}����������+����������З��������������������"���:���%���]���*�������*����������٘��������0���������8������W���+���w���7�������#���ۙ���������!������$���?���!���d����������&�������%���Ț��,������������'���*���%���R���0���x���2����������ܛ��.������������K���1���L���}���L���ʜ��������+���+���2���W���2�������/�������$������������%���(���-���N���$���|��������������������מ��������(������&���*���!���Q������s���F����������џ��B������B���'���?���j���<�������7���������������:���#���U���.���y���0�������0���١����� +-������(������;������W������l���������������������������¢�����բ���������������#������5���8���G���n��� �������#���ģ��5���������������+���-���B���!���p���(�������-��������������������'������?���4���=���t��� �������.������� ������9������;���J���,�������*�������#���ަ��������%������A���B�����������������I�������7������3���@���+���t����������'�������!���ߨ��������.���������A���C���T���*����������é�����ϩ��(������������1���$������V������q���:����������Ȫ��)������*������#���;������_���$��������������������"���ܫ������������������7������T���>���t����������!���Ҭ�� �������(������$���>������c���*���y���=�������H���������+������:���E���J���&�������(�������'������E���������N���(���g���'�������$�������,���ݯ��)��� +-���%���4������Z���"���x����������&�������������P�������V���P���U�������O�������V���M���!�������'���Ʋ��*������/������*���I���$���t���/�������1���ɳ��/�������)���+���*���U���)�������#����������δ��-������&������4���>���(���s����������������� ���ʵ��#���ص��$�������"���!������D������Z������t����������.����������˶��������3���������<���#���N������r��� ��������������0����������ݷ��$����������������7���#���H������l������x���������������������������ٸ��4���������'������:������W���'���w���B�������D������j���'���K�������?��������������=���!���Z������|��������������������̻��"���������������"������3������Q���#���k���#�������#�������0�����#���������,������J���*���h���%�������1������������������W������K���o���,�������.���������������+������C������X������j����������������������������������V������k���.�������.��������������M������� ���K������U������^������u�������������������������������!���������#���!���C������e���!��������������������� ��������������������������������0���0���0���a���>�������.�������%����������&���*���>���&���i����������*�������2�������.������(���4���!���]���)������4������� �������"������� ���"������C������\���*���u���8��������������!�������!������!���8���!���Z���!���|����������!�������%�����������������������9���,���Q���"���~���!�������,�������-�������%������"���D������g���,��������������������������������������#���3��������������!������/���%������U���-���g��� �������U��������������I���������R���*���p��� +-�������-�������"����������������������������� ���'���4������\���*���p���+����������������������������&�������+���'������S������i���������� �������������� ������� ������������������������������,������;���0���Y������������������������$��������������3�������;���!���'���]���!�������!��������������*�������/������-���@���:���n���(�������!�������=�������#���2���3���V���1�������4�������-�������?������$���_�����������������#���������������������,���������B���A���V���I���������������������!���������8���,���E������r�����������*���<���?���g���/�������6�������������3���$������X������a������g������k�����������������!��������������!�������'���������@������\������s����������F�������(�������9���������M������e������t������|�����������������G�������#������5���+���/���a����������"�������4�������<����������5���!���U������w���)�����������������������������������!������'���:������b����������������������������A���4���Y��� �����������������������������������$�������$������ ���C������M������l����������!���������������������!������� ��� ���M���*������x������������������������$�������������� �������"��� ���%���C������i������~����������(���������������������������� +-���������� +-���4���$������Y������v��������������������������������������������$���,������Q���;���d���*������������������������������������;������U��� +-���i������t��� +-���������������������9���������������������������'���!���#���I������m�����������������������%�������%�������������(���3���{���\����������7����������!������;������K���(���^�������������������������������������������� ��� +-���������F���������c������~����������/��������������������� �������������'���������F������f����������$��������������7����������������+������@������Y���$���s�����������������,��������������������-���!������O������i������v���������� �������%�������.���������� ���$���<������a������|��� �������(��������������%�������%���#������I���"���R������u���������� �������$���������������������������,������(���I������r�����������������������!��������������,����������&������B������[������w�������������������������������������� �����������������������'���5���8������n����������#�������9�������)����������������.������F������[������s�����������������$���������������������$������#���@������d������k��� ��������������������������������������������"������>���$���Z���%������$���������������������"������� ���#��� ���D���#���e����������&�������������������������������������&������;������Q���=���a���8�������$�������$����������"������:������W������k���7�������.���������������������C���������^��� ���x����������&���������������������+��� ������5������O������U������r���"����������������������������+����������������7������G���2���P����������#�������!�������)������� ��������� ������0������M������c��� ���~��������������������������������������������$������.���1��� ���`������n���&������������������/������8������U������u������~���K��������������������������#���������B������R���$���m����������'���������������������������������%���0��&���V��<���}�� ������ +-������������*������*����$���1�'���V����~�"��������������� ���������������������*����B����Z����p���������������������������������������� ����$���#�P���H� ����� �����'���������!�������?�&���O�,���v�!�����&���������������������(����-����2����I�!���b�[����� +-�����#�����/����;���?�:���{�:�����D��������6����S����r�%���z�%�����(�����#������������#����3����Q����o�*�����2�����/�������� �7���3 ����k ����� �J���� �/���� �?��� +-�0���Z +-�(���� +-�)���� +-�2���� +-�$����.���6�F���e�,�����)�����-����'���1����Y�.���n�'�����>�����#��� �(���( �;���Q � ���� �+���� �/���� �6��� +-����A�%���_�5�����5�����)�����&����+���B�,���n�!�����%����������>�����0���?�2���p�+�����@�����#����"���4�&���W�5���~�"�����#�����A�����@���=�%���~������'�����+�����5����!���F�0���h������1�����I�����H���)����r�'�����!���������������/�������1����Q����i�%�����.�����3�����>��� +-�@���I�����������0�����"�����(��� +-�2���3�8���f�%����������*�����*����*���0�&���[�2�����#�����(���������*����%���<�,���b�3����������(����������I����K���`�H����������-��� �6���7�4���n�-�����&����������)����1���>����p���������������������(�����,���!�"���N����q�F����������C�����@���)�:���j�8�����J��������)����E�%���c�1�����3�����3��������# ����B ����a ����| ����� ����� ����� ����� ����� ����!����1!����G!�'���]!�5����!�C����!�����!����"�G���."����v"�����"�2����"�"����"�'����"�,���#����J#����\#�*���o#�9����#�7����#����$�2���$� ���Q$�;���r$�=����$�0����$�/���%� ���M%�$���n%�*����%�E����%�-���&�$���2&�S���W&�;����&�5����&�6���'�$���T'�7���y'� ����'�����'�1����'� ���(�8���)(�,���b(�����(�����(�,����(�����(�/����(����')����F)�<���b)�����)�'����)�-����)�#���*�&���6*�$���]*�����*�$����*�(����*�+����*����+����5+����U+�?���t+�����+�.����+�+���,�"���.,����Q,����p,�,����,�=����,�=����,����0-����A-�E���S-� ����-�&����-�%����-�B���.����J.�9���c.�-����.�(����.�2����.�5���'/�)���]/�!����/�+����/�!����/�,����/�"���$0�L���G0�E����0�Q����0�K���,1�Y���x1� ����1�'����1�'���2�*���C2�+���n2�#����2�,����2�-����2�-���3�4���G3�?���|3�8����3�$����3����4�-���64�6���d4�B����4�*����4���� 5���� 5����35����C5����c5�!����5�����5�����5�����5�����5�2����5����16�"���H6�4���k6�����6�2����6�����6����7����7�'���"7����J7�*���f7�����7�����7�)����7�����7�����7����8����8����=8����X8�&���m8�����8�(����8�"����8�$����8�;���"9�=���^9�[����9�F����9�9���?:����y:�����:�%����:�����:� ����:����;����/;�,���F;����s;� ����;�"����;�����;�����;�����;����<�,���2<����_<�!���<�!����<�@����<�.���=��������k��������������������������>������,�������(�������������:��C����������������p��{���������2�������������i��D������������a���Q����q�������J������������v��5������������@���������������E��V��F���������r������l���s���������u���Z���������v������������������:������������������6��;������t������������������o���.������������z��b�����p���������������9�������������������"���������[�������������������l��?���������������A��^�����}���������*��~��X���9��I������S��T��n������!������������w��d������������������������������O������1�����������������n��]�� +-��� ���m���2���������?��������m������r�������������������������������]�������������������������������!������������������/���^��J���������������������������������������������q��d��Q��8�����p��������������������<������������������x������B��y��I�������������<����������D��M����������������������������>����������������o���������h�������@����������v����������������b��������������g���`�����������������E��n��e�������-��w��U������������������������������������������������Z�������s���R�� �������������4���������������-��������������������*����������(�������������������1�������j������J��V������L����)��������A������x���������*�����f���$������X������Q��'��#���K����������������[�������q�������B�����������T������_����������,���������T�������,��'�������s��Z������������!�������1������������f��������=��H���\�����-��5��M��x��������������������i�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��_�����������������������������������U������l�����y�����Q������c��P��������������������������������������������6���r����������������`���������s�����d��5�������������F��f��|�������������������`�������������������c�����\���~��2��E������� ���j�������#����������� ���������k��������������y�� ����������1��M����������[����������4��e����� ��P�� +-��������7��W�������������f��L�������F�����������������������������������<����������� �� ���������������{��g���������Y�������������������������������� ���%���������(������b����������������������������|��������*����������{��������������������������������C���3��"���������?������v���)�������=������ +-����������+��������������/��|��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��N������������������������y���`�� ��:��w���}������_�����%��H������c��������������m����������������H���������E������5��>����+�������S�����������+���������Y������������!����������������I����������e����j���������\��z������������u����������������������������������������N��?������z�����t���������W��������������������������)��������$��3��h�����������������c����������������������b��&��A������i���������������������a��Y���������6�������������O��������m�����Y��#���������������q�����N���0����������������9��l��������������%����������������������������������������������������������C�� ������K������������ +-��M�������������}�������������g�������V��������������T��t������������������^�����9�����K�� ��H���������������>���+�����������������&���������2��a���������4��$��������V���)��������������������������������U��=�������B�������������;���t����������������.��������������������������#��������������������~���������]������������������������/���������������N��������o��0��i���'��8��0������-���D�����������S������������������������W������L��8�����������������������������������{�������������������,�����������������������r�������������&�����B��u�������������k�����������������G�����������������������������6��'��������������������S�������������������������:������(������D�������������������������������������������n���������.�����p������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��R��X��F����������������g��4�����o�����]��O��K��P��\����������������X�������������I�����������z���������������������������������������������������������G����������0�����a��A�����@�����h��U��������������������~��������������<��$������k���������������[��P�����������h���������������3��������������7���������� Access Rights : � Attributes : � %s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile] +-� %s [-n netid]* [-o outfile] [infile] +-� %s [-s nettype]* [-o outfile] [infile] +-� Access rights: � Entry data of type %s +-� Name : %s +-� Public Key : � Type : %s +-� Universal addresses (%u) +-� [%d] Name : %s +-� [%u] - [%u bytes] � +-%s cache: +- +-%15s cache is enabled +-%15Zd suggested size +-%15ld seconds time to live for positive entries +-%15ld seconds time to live for negative entries +-%15ld cache hits on positive entries +-%15ld cache hits on negative entries +-%15ld cache misses on positive entries +-%15ld cache misses on negative entries +-%15ld%% cache hit rate +-%15s check /etc/%s for changes +-� +-Group Members : +-� +-Time to Live : � rpcinfo -b prognum versnum +-� rpcinfo -d prognum versnum +-� rpcinfo -p [ host ] +-� rpcinfo [ -n portnum ] -t host prognum [ versnum ] +-� no� yes� Data Length = %u +-� Explicit members: +-� Explicit nonmembers: +-� Implicit members: +-� Implicit nonmembers: +-� No explicit members +-� No explicit nonmembers +-� No implicit members +-� No implicit nonmembers +-� No recursive members +-� No recursive nonmembers +-� Recursive members: +-� program vers proto port +-� or: � (rule from "%s", line %d)� [OPTION...]� done +-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags. +-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed. +-�%s%s%s:%u: %s%sUnexpected error: %s. +-�%s%sUnknown signal %d +-�%s: %d did not sign extend correctly +-�%s: <mb_cur_max> must be greater than <mb_cur_min> +-�%s: C preprocessor failed with exit code %d +-�%s: C preprocessor failed with signal %d +-�%s: Can't create %s: %s +-�%s: Can't create directory %s: %s +-�%s: Can't link from %s to %s: %s +-�%s: Can't open %s: %s +-�%s: Can't remove %s: %s +-�%s: Error closing %s: %s +-�%s: Error reading %s +-�%s: Error writing %s +-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s +-�%s: Memory exhausted: %s +-�%s: More than one -L option specified +-�%s: More than one -d option specified +-�%s: More than one -l option specified +-�%s: More than one -p option specified +-�%s: More than one -y option specified +-�%s: Too many arguments +-�%s: cannot get modification time�%s: command was '%s', result was %d +-�%s: error in state machine�%s: illegal option -- %c +-�%s: invalid option -- %c +-�%s: option `%c%s' doesn't allow an argument +-�%s: option `%s' is ambiguous +-�%s: option `%s' requires an argument +-�%s: option `--%s' doesn't allow an argument +-�%s: option `-W %s' doesn't allow an argument +-�%s: option `-W %s' is ambiguous +-�%s: option requires an argument -- %c +-�%s: output would overwrite %s +-�%s: panic: Invalid l_value %d +-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s' +-�%s: unrecognized option `--%s' +-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ] +- [ -L leapseconds ] [ -y yearistype ] [ filename ... ] +-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ... +-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object) +-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible +-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]... +-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT +-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data +-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag! +-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file! +-�Cannot use netid flag with inetd flag! +-�Cannot use netid flag without TIRPC! +-�Cannot use table flags with newstyle! +-�Channel number out of range�Character Separator : %c +-�Child exited�Client credential too weak�Columns : +-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc. +-This is free software; see the source for copying conditions. There is NO +-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique +-�DIRECTORY +-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights : +-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits) +-�Directory : %s +-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY +-�Encrypted data +-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file. Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP +-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group : %s +-�Group Flags :�Group entry for "%s.%s" group: +-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos. +-�Killed�LINK +-�LOCAL entry for UID %d in directory %s not unique +-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s +-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server : +-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME +-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT +-�NUMBER�Name : '%s' +-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered. +-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None. +-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns : %d +-�Number of objects : %u +-�Numerical argument out of domain�Numerical result out of range�Object #%d: +-�Object Name : %s +-�Object Type : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner : %s +-�PRIVATE +-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits) +-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate : +-�Report bugs to %s. +-�Report bugs using the `glibcbug' script to <bugs@gnu.org>. +-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path : %s +-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root +-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status : %s +-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%s�TABLE +-�Table Type : %s +-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known. This does +-not necessarily mean that all combinations of these names can be used for +-the FROM and TO command line parameters. One coded character set can be +-listed with several different names (aliases). +- Some of the names are no plain strings but instead regular expressions and +-they match a variety of names which can be given as parameters to the +-program. +- +- �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information. +-�Trying %s... +-�Type : %s +-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d) +-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s +-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname] +-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s. +-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory +-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice +-�bogus mcheck_status, library is buggy +-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d +-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s +-�cannot find any C preprocessor (cpp) +-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory +-�clntunix_create: out of memory +-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server +-�couldn't register prog %d vers %d +-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten +-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s' +-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block +-�memory clobbered past end of allocated block +-�memory exhausted�memory exhausted +-�memory is consistent, library is buggy +-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s +-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d +-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration: +- +-%15d server debug level +-�nscd not running! +-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup +-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available +-�program %lu version %lu is not available +-�program %lu version %lu ready and waiting +-�rcmd: poll (setting up stderr): %m +-�rcmd: socket: All ports in use +-�rcmd: write (setting up stderr): %m +-�registerrpc: out of memory +-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error +-�rpcgen: too many defines +-�rpcinfo: %s is unknown host +-�rpcinfo: %s is unknown service +-�rpcinfo: Could not delete registration for prog %s version %s +-�rpcinfo: broadcast failed: %s +-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup +-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory +-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory +-�svctcp_create: out of memory +-�svcudp_create - cannot getsockname�svcudp_create: out of memory +-�svcudp_create: socket creation problem�svcunix_create: out of memory +-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d +-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage: %s infile +-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory +-�xdrrec_create: out of memory +-�yp_update: cannot convert host to netname +-�yp_update: cannot get server address +-�Project-Id-Version: libc 2.1 +-POT-Creation-Date: 1998-11-28 09:29-0800 +-PO-Revision-Date: 1998-12-02 22:02+01:00 +-Last-Translator: Stanislav Meduna <stano@eunet.sk> +-Language-Team: Slovak <sk-i18n@rak.isternet.sk> +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=ISO-8859-2 +-Content-Transfer-Encoding: 8bit +-� Pr�stupov� pr�va : � Atrib�ty : � %s [-abkCLNTM][-Dn�zov[=hodnota]] [-i ve�kos�] [-I [-K sekundy]] [-Y cesta] vst_s�bor +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o v�st_s�bor] [vst_s�bor] +-� %s [-n netid]* [-o v�st_s�bor] [vst_s�bor] +-� %s [-s nettype]* [-o v�st_s�bor] [vst_s�bor] +-� Pr�stupov� pr�va: � Vstupn� �daje typu %s +-� N�zov : %s +-� Verejn� k��� : � Typ : %s +-� Univerz�lne adresy (%u) +-� [%d] N�zov : %s +-� [%u] - [%u bajtov] � +-%s cache: +- +-%15s cache je povolen� +-%15Zd navrhovan� ve�kos� +-%15ld sek�nd �ivotnos� pozit�vnych z�znamov +-%15ld sek�nd �ivotnos� negat�vnych z�znamov +-%15ld �spechov cache pre pozit�vne z�znamy +-%15ld �spechov cache pre negat�vne z�znamy +-%15ld ne�spechov cache pre pozit�vne z�znamy +-%15ld ne�spechov cache pre negat�vne z�znamy +-%15ld%% �spe�nos� cache +-%15s skontrolujte /etc/%s na zmeny +-� +-�lenovia skup�n : +-� +-�ivotnos� : � rpcinfo -b ��slo_programu ��slo_verzie +-� rpcinfo -d ��slo_programu ��slo_verzie +-� rpcinfo -p [ po��ta� ] +-� rpcinfo [ -n ��slo_portu ] -t po��ta� ��slo_programu [ ��slo_verzie ] +-� nie� �no� D�ka �dajov = %u +-� Explicitn� �lenovia: +-� Explicitn� ne�lenovia: +-� Implicitn� �lenovia: +-� Implicitn� ne�lenovia: +-� �iadni explicitn� �lenovia +-� �iadni explicitn� ne�lenovia +-� �iadni implicitn� �lenovia +-� �iadni implicitn� ne�lenovia +-� �iadni rekurz�vni �lenovia +-� �iadni rekurz�vni ne�lenovia +-� Rekurz�vni �lenovia: +-� program verz proto port +-� alebo: � (pravidlo z "%s", riadok %d)� [VO�BA...]� hotovo +-�"%s", riadok %d: %s�Riadok "Zone %s" a vo�ba -l sa navz�jom vylu�uj��Riadok "Zone %s" a vo�ba -p sa navz�jom vylu�uj��"vst_s�bor" je vy�adovan� pri pou�it� pr�znakov tvorby vzoru. +-�%.*s: Parameter ARGP_HELP_FMT vy�aduje hodnotu�%.*s: Nezn�my parameter ARGP_HELP_FMT�%s v z�ne bez pravidiel�%s%s%s:%u: %s%sPredpoklad `%s' nesplnen�. +-�%s%s%s:%u: %s%sNeo�ak�van� chyba: %s. +-�%s%sNezn�my sign�l %d +-�%s: nespr�vne roz��renie znamienka pre %d +-�%s: <mb_cur_max> mus� by� v��ie ako <mb_cur_min> +-�%s: C preprocesor zlyhal s v�stupn�m k�dom %d +-�%s: C preprocesor zlyhal so sign�lom %d +-�%s: Nie je mo�n� vytvori� %s: %s +-�%s: Nie je mo�n� vytvori� adres�r %s: %s +-�%s: Nie je mo�n� vytvori� prepojenie z %s na %s: %s +-�%s: Nie je mo�n� otvori� %s: %s +-�%s: Nie je mo�n� odstr�ni� %s: %s +-�%s: Chyba pri uzatv�ran� %s: %s +-�%s: Chyba pri ��tan� %s +-�%s: Chyba pri z�pise %s +-�%s: Chyba pri z�pise na �tandardn� v�stup �%s: Priestupn� riadok v s�bore nepriestupn�ch sek�nd %s +-�%s: Nedostatok pam�ti: %s +-�%s: Vo�ba -L zadan� viac ako raz +-�%s: Vo�ba -d zadan� viac ako raz +-�%s: Vo�ba -l zadan� viac ako raz +-�%s: Vo�ba -p zadan� viac ako raz +-�%s: Vo�ba -y zadan� viac ako raz +-�%s: Prive�a argumentov +-�%s: nie je mo�n� zisti� �as zmeny�%s: pr�kaz bol '%s', v�sledok bol %d +-�%s: chyba v stavovom automate�%s: nepr�pustn� vo�ba -- %c +-�%s: chybn� vo�ba -- %c +-�%s: vo�ba `%c%s' nedovo�uje pou�i� argument +-�%s: vo�ba `%s' nie je jednozna�n� +-�%s: vo�ba `%s' vy�aduje argument +-�%s: vo�ba `--%s' nedovo�uje pou�i� argument +-�%s: vo�ba `-W %s' nedovo�uje pou�i� argument +-�%s: vo�ba `-W %s' nie je jednozna�n� +-�%s: vo�ba vy�aduje argument -- %c +-�%s: v�stup by prep�sal %s +-�%s: fat�lna chyba: Nepr�pustn� l_hodnota %d +-�%s: pred�asn� koniec s�boru�%s: Nie je mo�n� otvori� �%s: nerozpoznan� vo�ba `%c%s' +-�%s: nerozpoznan� vo�ba `--%s' +-�%s: Pou�itie: %s [ -s ] [ -v ] [ -l lok�lny_�as ] [ -p posix_pravidl� ] +- [ -d adres�r ] [ -L priestupn�_sekundy ] [ -y typ_roku ] [ s�bor ... ] +-�%s: Pou�itie: %s [ -v ] [ -c limit ] meno_z�ny ... +-�%s: po�as z�pisu v�stupu: �(CHYBA PROGRAMU) Verzia nezn�ma!?�(CHYBA PROGRAMU) Vo�ba by mala by� rozpoznan�!?�(Nezn�my objekt) +-�(nezn�ma chyba pri overovan� toto�nosti - %d)�(nezn�my)�*** Zo s�boru `%s' boli odstr�nen� ladiace inform�cie: podrobn� anal�za nie je mo�n� +-�*�tandardn� vstup*�-o V�STUPN�_S�BOR [VSTUPN�_S�BOR]... +-[ V�STUPN�_S�BOR [VSTUPN�_S�BOR]...]�Po�koden� sekcia .lib v a.out�; ni��ia verzia = %lu, vy��ia verzia = %lu�; d�vod = �<%s> and <%s> s� nepr�pustn� n�zvy pre rozsah�<SP> znak nesmie by� v triede `%s'�<SP> znak nie je v triede `%s'�?�Zru�en��Pr�stupov� pr�va : �Pr�stup k po�kodenej zdie�anej kni�nici�Adresa je pou��van��Trieda adries nie je podporovan� po��ta�om�Trieda adries nie je podporovan� protokolom�Chyba pri zverejnen��Bud�k�Pr�li� dlh� zoznam argumentov�Pokus o odstr�nenie nepr�zdnej tabu�ky�Pokus o pou�itie prive�a zdie�an�ch kni�n�c�Overenie pr�v �spe�n��Overenie pr�v ne�spe�n��POCHYBN� OBJEKT +-�Chybn� adresa�Chybn� deskriptor s�boru�Chybn� form�t s�boru rezov p�sma�Chybn� spr�va�Chybn� volanie syst�mu�Chybn� hodnota ai_flags�Presn� s�lad s POSIX�Bin�rne �daje +-�Vy�adovan� blokov� zariadenie�Probl�m pri volan� poll pre v�eobecn� vysielanie�Preru�en� r�ra�Chyba na zbernici�CDS�Prekro�en� �asov� limit pre procesor��ivotnos� cache vypr�ala�Pr�stup k potrebnej zdie�anej kni�nici nie je mo�n��Pripojenie k serveru obsluhuj�cemu t�to dom�nu nie je mo�n��Komunik�cia s portmapperom nie je mo�n��Komunik�cia s ypbind nie je mo�n��Komunik�cia s ypserv nie je mo�n��Nie je mo�n� prideli� pam��Priradenie po�adovanej adresy nie je mo�n��Nie je mo�n� vytvori� z�suvku pre broadcast rpc�Nie je mo�n� priamo spusti� zdie�an� kni�nicu�Nie je mo�n� pou�i� viac ako jeden pr�znak tvorby s�boru! +-�Nie je mo�n� prija� odpove� na broadcast�Nie je mo�n� zaregistrova� slu�bu�Nie je mo�n� vysiela� po ukon�en� �innosti komunika�n�ho bodu�Nie je mo�n� vysla� broadcast bal�k�Nie je mo�n� nastavi� pre socket vo�bu SO_BROADCAST�Nie je mo�n� zada� viac ako jeden vstupn� s�bor! +-�Pr�znaky netid a inetd nie je mo�n� pou�i� s��asne! +-�Nie je mo�n� pou�i� pr�znak netid bez TIRPC! +-�Pri pou�it� nov�ho �t�lu nie je mo�n� pou�i� pr�znaky tabu�ky! +-���slo kan�lu mimo povolen�ho rozsahu�Odde�ova� znakov : %c +-�Detsk� proces skon�il�Opr�vnenia klienta s� neposta�uj�ce�St�pce : +-�Chyba komunik�cie pri vysielan��Kompil�cia �pecifik�cie n�rodn�ho prostredia�Po��ta� k�pil farmu�V�po�et ve�kosti tabu�ky pre triedy znakov (m��e chv��u trva�)...�V�po�et ve�kosti tabu�ky pre inform�cie o trieden� (m��e chv��u trva�)...�Spojenie odmietnut��Spojenie zru�en� druhou stranou��asov� limit pre spojenie vypr�al�Pokra�ovanie�Konverzia k�dovania zadan�ch s�borov na in�.�Zmeni� k��� na mal� p�smen��Copyright (C) %s Free Software Foundation, Inc. +-Toto je vo�ne ��rite�n� software; pre podmienky kop�rovania pozri +-zdrojov� k�d.Na software nie je poskytovan� �IADNA z�ruka. +-�Nie je mo�n� vytvori� �urn�lov� s�bor "%s"�Vytvori� C hlavi�kov� s�bor N�ZOV obsahuj�ci defin�cie symbolov�Vytvori� v�stupn� s�bor aj pri v�skyte varovan��Vytvorenie jednoduchej DB datab�zy z textov�ho vstupu.��as vytvorenia : %s�DES z�znam pre sie�ov� n�zov %s nie je jednozna�n� +-�ADRES�R +-�DNANS�DNS�Datab�za pre tabu�ku neexistuje�Datab�za je pou��van��Implicitn� pr�st. pr�va : +-�Je potrebn� zada� cie�ov� hodnotu�Zariadenie nie je pr�d�Zariadenie nie je nakonfigurovan��Zariadenie alebo in� zdroj je pou��van��Diffie-Hellmann (%d bitov) +-�Adres�r : %s +-�Adres�r nie je pr�zdny�Diskov� kv�ta prekro�en��Nesp���a� samostatn� proces a zobrazova� spr�vy na aktu�lnom termin�li�Po�as tvorby datab�zy nevypisova� spr�vy�Nepou��va� existuj�ci katal�g, vn�ti� nov� v�stupn� s�bor�Dom�na nie je pripojen��EMT preru�enie�Z�ZNAM +-��ifrovan� �daje +-�Nes�lad z�znamu s tabu�kou�Chyba v RPC subsyst�me�Chyba pri pr�stupe NIS+ s�boru studen�ho �tartu. Je NIS+ nain�talovan�?�Chyba v nezn�mom chybovom syst�me: �Chyba po�as komunik�cie s proced�rou sp�tn�ho volania�Chyba: s�bor .netrc je �itate�n� pre ostatn�ch.�Stredisko pln��Chybn� form�t spustite�n�ho s�boru�FAT�LNA CHYBA: syst�m nedefinuje `_POSIX2_LOCALEDEF'�S�BOR obsahuje mapovanie symbolick�ch n�zvov na UCS4 hodnoty�Zlyhalo (ne�pecifikovan� chyba)�Deskriptor s�boru v chybnom stave�S�bor existuje�Vz�jomn� zablokovanie pri zamykan� s�boru�Meno s�boru pr�li� dlh��Prekro�en� limit d�ky s�boru�S�bor je pr�li� ve�k��Chyba zre�azenia prv�/�al���V�nimka pohyblivej r�dovej �iarky�Adres�r vy�aduje �pln� resynchroniz�ciu�Funkcia nie je implementovan��SKUPINA +-�Nezmysly v ARGP_HELP_FMT: %s�Tvorba katal�gu spr�v.\vAk je VSTUPN�_S�BOR -, vstup je na��tan� zo �tandardn�ho vstupu. Ak je +-V�STUPN�_S�BOR -, v�stup je zap�san� na �tandardn� v�stup. +-�V�eobecn� chyba syst�mu�Z�ska� inform�ciu �pecifick� pre n�rodn� prostredie.�Vyp�sa� kr�tky n�vod na pou�itie�Vyp�sa� t�to pomoc�V�a�n� chyba�Skupina : %s +-�Pr�znaky skupiny :�Z�znam skupiny pre skupinu "%s.%s": +-�Po�ka� SECS sek�nd (implicitne 3600)�Zavesenie�Nen�jden� "%d" v cache skup�n!�Nen�jden� "%d" v cache hesiel!�Nen�jden� "%s" v cache skup�n!�Nen�jden� "%s" v cache po��ta�ov!�Nen�jden� "%s" v cache hesiel!�Po��ta� je vypnut��Nepodarilo sa n�js� meno po��ta�a�V/V mo�n��VSTUPN�_S�BOR V�STUPN�_S�BOR +--o V�STUPN�_S�BOR VSTUPN�_S�BOR +--u VSTUPN�_S�BOR�IOT preru�enie�IVY�Identifik�tor odstr�nen��Nepr�pustn� in�trukcia�Nepr�pustn� typ objektu pre oper�ciu�Nepr�pustn� nastavenie poz�cie�Nevhodn� typ alebo form�t s�boru�Nevhodn� ioctl pre toto zariadenie�Nevhodn� oper�cia pre proces v pozad���iados� o inform�ciu�Inform�cia:�Vstupn� s�bory:��pecifik�cia vstupno/v�stupn�ho form�tu:�Chyba vstupu/v�stupu�Intern� chyba NIS�Intern� chyba ypbind�Preru�enie�Preru�en� volanie syst�mu�Preru�en� volanie syst�mu by malo by� znovu spusten��Neplatn� objekt pre oper�ciu�Nepr�pustn� argument�Nepr�pustn� sp�tn� odkaz�Nepr�pustn� n�zov triedy znakov�Neplatn� opr�vnenie klienta�Neplatn� overenie klienta�Nepr�pustn� znak triedenia�Nepr�pustn� obsah \{\}�Nepr�pustn� odkaz medzi zariadeniami�Nepr�pustn� v�mena�Nepr�pustn� alebo nekompletn� viacbajtov� alebo �irok� znak�Nepr�pustn� predch�dzaj�ci regul�rny v�raz�Nepr�pustn� koniec rozsahu�Nepr�pustn� regul�rny v�raz�Nepr�pustn� k�d �iadosti�Nepr�pustn� deskriptor �iadosti�Neplatn� overenie servera�Neplatn� priehradka�Je adres�r�Je pomenovan� s�bor�Kerberos. +-�Zabit��ODKAZ +-�LOCAL z�znam pre UID %d v adres�ri %s nie je jednozna�n� +-��rove� 2 zastaven���rove� 2 nie je synchronizovan���rove� 3 zastaven���rove� 3 nastaven� na v�chodzie hodnoty�Odkaz odkazuje na nepr�pustn� n�zov�Odkaz bol zni�en����slo odkazu mimo rozsahu�Typ odkazovan�ho objektu : �Odkazuje na : %s +-�Meno miestnej dom�ny nie je nastaven��Chyba pri pridelen� miestnych zdrojov�Po��ta� nie je zapojen� v sieti�Chybne formovan� alebo nepr�pustn� n�zov�Povinn� alebo volite�n� argumenty dlh�ch tvarov volieb s� povinn� alebo volite�n� pre �ubovo�n� zodpovedaj�ce kr�tke vo�by.�Hlavn� server : +-�Hlavn� server zanepr�zdnen�, �pln� prenos prepl�novan�.�Pridelenie pam�ti zlyhalo�Pam� vy�erpan��Pr�li� dlh� spr�va�Ch�baj�ci alebo chybne formovan� atrib�t��as zmeny :%s�Modifik�cia zlyhala�Oper�cia zmeny zlyhala�Modifikova� v�stupn� form�t:�Pokus o spojenie cez viac uzlov�N�ZOV�N�ZOV +-[-a|-m]�NIS�Rozdielne verzie NIS klienta a serveru - nie je mo�n� poskytn�� slu�bu�Datab�za m�p NIS je chybn��NIS+ oper�cia zlyhala�NIS+ server nie je dostupn��Slu�ba NIS+ nie je dostupn� alebo nain�talovan���IADNY OBJEKT +-�PO�ET�N�zov : '%s' +-�D�mon cache slu�by n�zvov.�N�zov nie je obsluhovan� t�mto serverom�Meno nie je v sieti jednozna�n��N�zov alebo slu�ba nezn�me�N�zov/z�znam nie s� jednozna�n��Zadan� objekt nie je preh�ad�vate�n��Potrebuje overovac� objekt�Sie� zru�ila spojenie (probl�m so vzdialen�m po��ta�om)�Sie� je nefunk�n��Sie� nie je dostupn��CSI �trukt�ra nedostupn��XENIX semaf�ry nedostupn��N�zov po��ta�a nem� priraden� adresu�N�zov nem� priraden� adresu��iadny anode�Nie je mo�n� prideli� pam� pre V/V oper�cie�Detsk� procesy neexistuj��D�ta nie s� k dispoz�cii�Na serveri u� nie je �iadne miesto pre s�bory�Z�mky nie s� k dispoz�cii��iadna zhoda�Nen�jden� �iadne m�dium��iadna spr�va �elan�ho typu��iadne �al�ie z�znamy v datab�ze��iadny predch�dzaj�ci regul�rny v�raz�Nie s� registrovan� �iadne vzdialen� programy +-�Cesta k po��ta�u neexistuje�Na zariaden� u� nie je �iadne miesto�Tak� zariadenie neexistuje�Adres�r alebo s�bor neexistuje�Tento k��� v datab�ze neexistuje�T�to mapa sa v dom�ne servera nenach�dza�Tento proces neexistuje�Zaznamenan� priestor n�zvov mimo NIS+�Neopravite�n� chyba pri rie�en� n�zvu��iadne. +-�Nen�jden�, tak�to n�zov neexistuje�Nejde o pomenovan� XENIX s�bor�Nie je adres�r�Nen�jden��Nie je hlavn� server pre t�to dom�nu�Nie je vlastn�kom�Po�et st�pcov : %d +-�Po�et objektov : %u +-���seln� rozsah mimo dom�ny defin�cie funkcie���seln� v�sledok mimo povolen�ho rozsahu�Objekt #%d: +-�N�zov objektu : %s +-�Typ objektu : �Objekt je vzdialen��Existuje objekt s rovnak�m n�zvom�Nep�rny po�et �vodzoviek�T�to vo�ba je dostupn� iba superu��vate�ovi!�Oper�cia je u� rozpracovan��Oper�cia nie je povolen��Oper�cia nie je podporovan��Oper�cia prebieha�Oper�cia by blokovala�Pr�dov� zdroje vy�erpan��Riadenie v�stupu:�V�ber v�stupu:�Vlastn�k : %s +-�S�KROMN� +-�Bal�k nie je nain�talovan��Chyba anal�zy: %s��iasto�n� �spech�Odovzdan� objekt nie je na serveri t�m ist�m objektom�Pr�stup odmietnut��V�padok nap�jania�Pred�asn� koniec regul�rneho v�razu�Vyp�sa� obsah datab�zov�ho s�boru, jeden z�znam na riadok�Vyp�sa� �tatistiku aktu�lnej konfigur�cie�Vyp�sa� viac spr�v�Vyp�sa� verziu programu�Pravdepodobn� �spech�Pravdepodobne nen�jden��Profilovac� �asova� vypr�al�Ovl�da� protokolu nepripojen��Chyba protokolu�Rodina protokolov nie je podporovan��Protokol nie je k dispoz�cii�Protokol nie je podporovan��Protokol nie je socketom podporovan��Nepr�pustn� ot�zka pre dan� tabu�ku�Koniec�RFS-�pecifick� chyba�Chybn� RPC proced�ra pre program�Zlyhal RPC pri NIS oper�cii�RPC program nie je k dispoz�cii�Chybn� verzia RPC programu�RPC �trukt�ra je chybn��Chybn� verzia RPC�RPC: (nezn�mny chybov� k�d)�RPC: Chyba pri overen� pr�v�RPC: Nie je mo�n� dek�dova� v�sledok�RPC: Nie je mo�n� zak�dova� argumenty�RPC: Zlyhalo (ne�pecifikovan� chyba)�RPC: Nekompatibiln� verzie RPC�RPC: Chyba portmappera�RPC: Proced�ra nie je k dispoz�cii�RPC: Program nie je registrovan��RPC: Program nie je k dispoz�cii�RPC: Nes�hlas� program alebo verzia�RPC: Chyba vzdialen�ho syst�mu�RPC: Server nem��e dek�dova� argumenty�RPC: �spech�RPC: �asova� vypr�al�RPC: Nie je mo�n� prij�ma��RPC: Nie je mo�n� vysiela��RPC: Nezn�my po��ta��RPC: Nezn�my protokol�RSA (%d bitov) +-�RTLD_NEXT je pou�it� pre k�d, ktor� nie je dynamicky zaveden��Pre��ta� a vyp�sa� profilovacie �daje zdie�an�ho objektu�Na��ta� �daje o konfigur�cii z N�ZOV�S�borov� syst�m dovo�uje len ��tanie�Sign�l re�lneho �asu %d�Regul�rny v�raz pr�li� ve�k��Vzdialen� V/V chyba�Vzdialen� adresa sa zmenila�Odstr��te heslo alebo zak�te ��tanie s�boru ostatn�mi.�Znovuotvorenie zdie�an�ho objektu `%s' zlyhalo�Replika : +-�Chyby hl�ste na adrese %s. +-�Chyby hl�ste na adrese <bugs@gnu.org> - pou�ite skript `glibcbug'. +-�Chybn� argumenty �iadosti�Chyba resolvera 0 (�iadna chyba)�Vn�torn� chyba resolvera�Bolo zabr�nen� vz�jomn�mu zablokovaniu�Zdroj bol straten��Zdroj je do�asne nepr�stupn��V�sledky poslan� proced�re sp�tn�ho volania�ZDIE�_OBJEKT [PROF_�DAJE]�SUNYP�Preh�ad�van� cesta : %s +-�Chyba segment�cie�Server zanepr�zdnen�, sk�ste znovu�Vy�erpan� pam� servera�Server odmietol opr�vnenie�Server odmietol overenie�Servname nie je pre ai_socktype podporovan��Nastavi� n�zov programu�Zastavi� server�Sign�l 0�Socketov� oper�cia na objekte, ktor� nie je socket�Typ socketu nie je podporovan��Software sp�sobil zru�enie spojenia�Bohu�ia� - nie ste superu��vate� +-�Zdrojov� defin�cie sa nach�dzaj� v S�BORe�Chyba srmount�Chyba z�sobn�ka�Zastaral� odkaz na NFS s�bor�Spusti� PO�ET vl�kien�Stav : %s +-�Zastaven��Zastaven� (sign�l)�Zastaven� (vstup z termin�lu)�Zastaven� (v�stup na termin�l)�Chyba r�ry pr�dov��trukt�ra potrebuje opravu��spech�Potla�i� varovn� a informa�n� spr�vy�Symbolick� n�zvy znakov s� definovan� v S�BORe�Chyba syst�mu�Syst�mov� inform�cie:�Pridelenie syst�mov�ch zdrojov zlyhalo�Syst�mov� adres�r pre mapy znakov: : %s +- mapy reperto�rov: %s +- cestu locale : %s +-%s�TABU�KA +-�Typ tabu�ky : %s +-�Do�asn� chyba pri rie�en� n�zvu�Ukon�en��Spustite�n� s�bor je pou��van��Nasleduj�ci zoznam obsahuje v�etky zn�me znakov� sady. To nutne neznamen�, +-�e v�etky kombin�cie t�chto n�zvov m��u by� pou�it� pre argumenty Z a DO. +-Jedna sada znakov m��e by� uveden� pod viacer�mi n�zvami (aliasmi). +- Niektor� z n�zvov nie s� oby�ajn� re�azce, ale regul�rne v�razy, ktor� +-�pecifikuj� mo�n� parametre programu. +- +- ��ivotnos� : ��asova� vypr�al�Prive�a atrib�tov�Prive�a �rovn� symbolick�ch odkazov�Prive�a odkazov�Prive�a otvoren�ch s�borov�Prive�a otvoren�ch s�borov v syst�me�Prive�a procesov�Prive�a odkazov - nie je mo�n� rozdeli��Prive�a pou��vate�ov�Trasovacie/ladiace preru�enie�Koncov� sp�tn� lom�tko�Prekladac� program skon�il�Koncov� komunika�n� bod je u� spojen��Koncov� komunika�n� bod nie je spojen��Pou�ite `%s --help' alebo `%s --usage' pre viac inform�ci�. +-�Sk��am %s... +-�Typ : %s +-�NEZNAMY�Nie je mo�n� overi� toto�nos� NIS+ klienta�Nie je mo�n� overi� toto�nos� NIS+ servera�Nie je mo�n� vytvori� sp�tn� volanie�Nie je mo�n� vytvori� proces na serveri�Nezn�me (typ = %d, bitov = %d) +-�Nezn�me k���ov� slovo v .netrc: %s�Nezn�my chybov� k�d NIS�Nezn�ma datab�za %s +-�Nezn�ma chyba�Nezn�ma chyba �Nezn�my po��ta��Nezn�my objekt�Nezn�ma vo�ba: %s %s %s�Nezn�ma chyba resolvera�Nezn�ma chyba servera�Nezn�my sign�l %d�Nezn�ma chyba syst�mu�Nezn�ma chyba ypbind�Nep�rov� ( or \(�Nep�rov� ) or \)�Nep�rov� [ or [^�Nep�rov� \{�Nerozpoznan� premenn� `%s'�Urgentn� V/V stav�Pou�itie:�Pou�itie: %s meno_premennej [cesta] +-�Pou�itie: rpcinfo [ -n ��slo_portu ] -u po��ta� ��slo_programu [ ��slo_verzie ] +-�Pou��vate�om definovan� sign�l 1�Pou��vate�om definovan� sign�l 2�Hodnota je pre dan� d�tov� typ prive�k��Vypr�al virtu�lny �asova���udn� v�sledok vykonania programu�Okno sa zmenilo�Vyp�sa� n�zvy dostupn�ch znakov�ch s�d�Vyp�sa� n�zvy dostupn�ch n�rodn�ch prostred��Vyp�sa� n�zvy vybran�ch kateg�ri��Vyp�sa� n�zvy vybran�ch k���ov�ch slov�Zap�sa� v�stup do s�boru S�BOR�Autor: %s. +-�Chybn� typ m�dia�X500�XCHS�YPBINDPROC_DOMAIN: %s +-��no, 42 je v�znam �ivota�Tentokr�t si to skuto�ne poondial�Koncov� �as pokra�ovacieho riadku z�ny nie je v��� ako koncov� �as predch�dzaj�ceho riadku�[S�BOR...]�Defin�cia `%1$s' nekon�� `END %1$s'�`%s' nie s� spr�vne profilovacie �daje pre `%s'�`-1' mus� by� posledn�m z�znamom v poli `%s' kateg�rie `%s'�`...' m��e by� pou�it� iba v z�znamoch `...' a `UNDEFINED'�`from' je o�ak�van� po prvom argumente `collating-element'�`from' re�azec v deklar�cii elementu triedenia obsahuje nezn�my znak�ai_family nie je podporovan��ai_socktype nie je podporovan��u� be���argument pre <%s> mus� by� jeden znak�argument pre `%s' mus� by� jeden znak�auth_none.c - Fat�lna chyba marshallingu�authunix_create: nedostatok pam�ti +-�chybn� argument�chybn� vlastn�k�pr�zdne pole OD v riadku Link�pr�zdne pole DO v riadku Link�blok uvo�nen� dvakr�t +-�pochybn� mcheck_status, kni�nica m� chyby +-�broadcast: ioctl (z�skanie konfigur�cie rozhrania)�broadcast: ioctl (z�skanie nastaven� rozhrania)�prete�enie vyrovn�vacej pam�ti�cache_set: nebolo mo�n� prideli� rpc vyrovn�vaciu pam��cache_set: obe� nen�jden��cache_set: obe� nen�jden��nie je mo�n� n�js� skratku �asovej z�ny pre pou�itie hne� po koncovom �ase�nie je mo�n� znovu prideli� ��slo proced�ry %d +-�nie je mo�n� vykona� `stat' pre s�bor n�rodn�ho prostredia `%s'�nie je mo�n� prideli� pam� pre symbolick� �daje�nie je mo�n� vytvori� intern� deskriptor�nie je mo�n� vytvori� intern� deskriptory�nie je mo�n� povoli� socketu prij�ma� spojenia: %s�nie je mo�n� n�js� preprocesor: %s +-�nie je mo�n� n�js� �iadny C preprocesor (cpp) +-�nie je mo�n� spracova� star� verziu �iadosti %d; aktu�lna verzia je %d�nie je mo�n� vlo�i� element triedenia `%.*s'�nie je mo�n� vklada� do v�slednej tabu�ky�nie je mo�n� vlo�i� nov� symbol triedenia: %s�nie je mo�n� na��ta� profilovacie �daje�nie je mo�n� otvori��nie je mo�n� otvori� datab�zov� s�bor `%s': %s�nie je mo�n� otvori� vstupn� s�bor `%s'�nie je mo�n� otvori� s�bor defin�cie n�rodn�ho prostredia `%s'�nie je mo�n� otvori� v�stupn� s�bor�nie je mo�n� otvori� v�stupn� s�bor `%s'�nie je mo�n� otvori� v�stupn� s�bor `%s' pre kateg�riu `%s'�nie je mo�n� otvori� socket `%s'�nie je mo�n� spracova� �pecifik�ciu poradia�nie je mo�n� na��ta� adres�r znakov�ch s�d `%s'�nie je mo�n� na��ta� konfigura�n� s�bor; to je fat�lne�nie je mo�n� ��ta� od klienta�nie je mo�n� pre��ta� hlavi�ku z `%s'�nie je mo�n� na��ta� adres�r n�rodn�ch prostred� `%s'�nie je mo�n� pre��ta� s�bor n�rodn�ho prostredia `%s'�nie je mo�n� na��ta� mapu reperto�ru `%s'�nie je mo�n� na��ta� �tatistick� �daje�nie je mo�n� vykona� stat() s�boru `%s': %s�nie je mo�n� zap�sa� v�stupn� s�bory do `%s'�nie je mo�n� zap�sa� v�sledok: %s�nie je mo�n� zap�sa� �tatistiku: `%s'�nie je mo�n� p�sa� klientovi��daje kateg�rie po�adovan� viac ako raz - to by sa nemalo sta��znak %s'%s' v triede `%s' mus� by� v triede `%s'�znak %s'%s' v triede `%s' nesmie by� v triede `%s'�znak <SP> nie je definovan� v znakovej sade�znak `%s' nie je definovan� a je potrebn� ako implicitn� hodnota�trieda znakov `%s' je u� definovan��znakov� sada `%s' je u� definovan��s�bor znakovej sady `%s' nebol n�jden��clnt_raw.c - Fat�lna chyba pri serializ�cii hlavi�ky.�clnttcp_create: nedostatok pam�ti +-�clntunix_create: nedostatok pam�ti +-�element triedenia `%.*s' uveden� viac ako raz - riadok ignorovan��symbol triedenia `%.*s' uveden� viac ako raz - riadok ignorovan��po `%s' je o�ak�van� symbol triedenia�spojenie s adresou %s: �o�ak�van� kon�tanta alebo identifik�tor�konverzia z `%s' do `%s' nie je podporovan��konverzia zastaven� kv�li probl�mu pri z�pise v�stupu�nebolo mo�n� vytvori� rpc server +-�nebolo mo�n� zaregistrova� program %d verzie %d +-�datab�za [k��� ...]�implicitn� s�bor znakovej sady `%s' nebol n�jden��pr�znak smeru v re�azci %d po�a `era' v kateg�rii `%s' nie je '+' ani '-'�pr�znak smeru v re�azci %d po�a `era' v kateg�rii `%s' nie je jeden znak�duplicitn� meno znaku `%s'�duplicitn� defin�cia elementu triedenia�duplicitn� defin�cia znaku `%.*s'�duplicitn� k����duplicitn� defin�cia sady�duplicitn� meno z�ny %s (s�bor "%s", riadok %d)�duplicitn� identifik�tor spr�vy�duplicitn� ��slo spr�vy�pr�zdny znakov� re�azec�pr�zdne meno v�hy - riadok ignorovan��enablecache: vyrovn�vacia pam� je u� povolen��enablecache: nebolo mo�n� prideli� vyrovn�ciu pam��enablecache: nebolo mo�n� prideli� d�ta pre vyrovn�vaciu pam��enablecache: nebolo mo�n� prideli� frontu pre vyrovn�vaciu pam��k�dovanie v�stupu�k�dovanie p�vodn�ho textu�koncov� bod pokra�ovania je v��� ako po�iato�n��chyba po�as zatv�rania vstupu `%s'�chyba po�as zatv�rania v�stupn�ho s�boru�chyba po�as zatv�rania s�boru profilovac�ch �dajov�chyba po�as vkladania elementu triedenia do hash-tabu�ky�chyba po�as vkladania do hash-tabu�ky�po�as ��tania vstupu�pre `copy' je o�ak�van� re�azcov� argyment�o�ak�van� pokra�ovac� riadok nebol n�jden��nepodarilo sa na��ta� zdie�an� objekt `%s'�nepodarilo sa na��ta� symbolick� �daje�nepodarilo sa mmap-ova� s�bor profilovac�ch �dajov�nepodarilo sa od�tartova� konverziu�chyba po�as z�pisu �dajov kateg�rie `%s'�fcntl: F_SETFD�pole `%s' keteg�rie `%s' nie je definovan��pole `%s' kateg�rie `%s' nedefinovan��s�bor '%s' u� existuje a m��e by� prep�san� +-�hodnota od pre `collating-element' mus� by� re�azec�fstat sa nepodaril�smetie za koncom �pecifik�cie k�du znaku�smetie za koncom ��sla�smetie za koncom hodnoty posunutia v re�azci %d po�a `era' kateg�rie `%s'�smetie za koncom po�iato�n�ho d�tumu v re�azci %d po�a `era' kateg�rie `%s'�smetie za koncom koncov�ho d�tumu v re�azci %d po�a `era' kateg�rie `%s'�tvorba grafu volan��tvorba jednoduch�ho profilu s po�tami a tikmi�get_myaddress: ioctl (z�skanie konfigur�cie rozhrania)�getent - z�ska� z�znamy z administrat�vnej datab�zy.�handle_request: �iados� prijat� (verzia = %d)�pevn� odkaz zlyhal, pou�it� symbolick��niekde existuje pevn� odkaz�nepr�pustn� pole CORRECTION v riadku Leap�nepr�pustn� pole Rolling/Stationary v riadku Leap�nepr�pustn� znak v re�azci�nepr�pustn� znak v s�bore: �nepr�pustn� element triedenia�nepr�pustn� defin�cia�zadan� nepr�pustn� k�dovanie�chybn� escape-sekvencia na konci re�azca�nepr�pustn� vstupn� sekvencia na poz�cii %ld�nepr�pustn� men� pre rozsah znakov�chybn� nettype :'%s' +-�nepr�pustn� ��slo pre posunutie v re�azci %d po�a `era' kateg�rie `%s'�nepr�pustn� ��slo sady�nepr�pustn� po�iato�n� d�tum v re�azci %d po�a `era' kateg�rie `%s'�nepr�pustn� koncov� d�tum v re�azci %d po�a `era' kateg�rie `%s'�limit implement�cie: maxim�lne mno�stvo tried znakov je %d�limit implement�cie: maxim�lne mno�stvo s�d znakov je %d�nekompletn� znak alebo prera�ovacia sekvencia na konci vyrovn�vacej pam�ti�nespr�vne form�tovan� s�bor�vstupn� riadok nezn�meho typu�vn�torn� chyba (nespr�vny deskriptor)�vn�torn� chyba - addtype zavolan� s chybn�m isdst�vn�torn� chyba - addtype zavolan� s chybn�m ttisgmt�vn�torn� chyba - addtype zavolan� s chybn�m ttisstd�vn�torn� chyba %s na riadku %u�nepr�pustn� posunutie vo�i UTC�nepr�pustn� form�t skratky�nepr�pustn� de� mesiaca�nepr�pustn� koncov� rok�nepr�pustn� priestupn� rok�nepr�pustn� m�d pre dlopen()�nepr�pustn� n�zov mesiaca�nepr�pustn� ulo�en� �as�nepr�pustn� po�iato�n� rok�nepr�pustn� �as v dni�nepr�pustn� n�zov d�a�d�ka k���a v �iadosti pr�li� dlh�: %Zd�riadok za pokra�ovan�m mus� obsahova� defin�ciu znaku�riadok pred pokra�ovan�m neobsahuje defin�ciu pre znakov� kon�tantu�pridlh� riadok�vyp�� v�etky zn�me znakov� sady�s�bor n�rodn�ho prostredia `%s' pou�it� v pr�kaze `copy' nebol n�jden��lstat zlyhal�nespr�vny riadok ignorovan��zlyhalo mapovanie tabu�ky re�azcov hlavi�ky sekcie�zlyhalo mapovanie hlavi�iek sekcie�pam� pred pridelen�m blokom prep�san� +-�pam� za koncom pridelen�ho bloku prep�san� +-�nedostatok pam�ti�nedostatok pam�ti +-�pam� je konzistentn�, kni�nica je chybn� +-�ch�ba form�t �ry v re�azci %d v poli `era' kateg�rie `%s'�ch�ba meno �ry v re�azci %d v poli `era' kateg�rie `%s'�bezmenn� pravidlo�nie je �pecifikovan� p�vodn� ani cie�ov� k�dovanie�netname2user: (nis+ lookup): %s +-�netname2user: DES z�znam pre %s v adres�ri %s nejednozna�n��netname2user: LOCAL z�znam pre %s v adres�ri %s nejednozna�n��netname2user: ch�baj�ci zoznam id skup�n v '%s'.�netname2user: n�zov princip�la '%s' pr�li� dlh��netname2user: nemal by ma� uid 0�program %d nebol nikdy registrovan� +-�nezadan� <Uxxxx> alebo <Uxxxxxxxx> hodnota�pre pole `%s' v kateg�rii `%s' neexistuje spr�vny regul�rny v�raz: %s�s pravidlom sa nezhoduje �iadny de� v mesiaci�neexistuje defin�cia pre `UNDEFINED'�nebol zadan� n�zov s�boru pre profilovacie �daje a zdie�an� objekt `%s' nem� soname�pri pou�it� `copy' nem� by� zadan� �iadne in� k���ov� slovo�v�stupn� s�bor nebol vytvoren� kv�li v�skytu varovan��nebola zadan� mapa reperto�ru: nie je mo�n� pokra�ova��nebolo zadan� �iadne symbolick� meno�nebolo zadan� �iadne symbolick� meno pre koniec rozsahu�symbol `%s' nem� definovan� v�hu�nie je regul�rny s�bor�nscd konfigur�cia: +- +-%15d ladiaca �rove� servera +-�nscd nebe��! +-�po defin�cii CHARMAP m��u nasledova� iba defin�cie WIDTH�p�vodn� k�dovanie nebolo zadan� pomocou `-f'�v�stupn� s�bor�pmap_getmaps rpc probl�m�poll: chyba protokolu po�as pr�pravy okruhu +-�chyba preprocesora�vyp�sa� zoznam ciest po�tov a po�et ich pou�it��vypisova� inform�ciu o postupe�probl�my po�as ��tania `%s'�profilovacie �daje `%s' nes�hlasia so zdie�an�mobjektom `%s'�program %lu nie je dostupn� +-�program %lu verzie %lu nie je dostupn� +-�program %lu verzie %lu pripraven� a �akaj�ci +-�rcmd: poll (nastavenie stderr): %m +-�rcmd: socket: V�etky porty s� pou�it� +-�rcmd: write (nastavenie stderr): %m +-�registerrpc: nedostatok pam�ti +-�opakovan� moment priestupnej sekundy�s�bor mapy reperto�ru `%s' nebol n�jden��rpcgen: chyba k�dovania zoznamu argumentov +-�rpcgen: prive�a defines +-�rpcinfo: %s je nezn�my po��ta� +-�rpcinfo: %s je nezn�ma slu�ba +-�rpcinfo: Nie je mo�n� zru�i� registr�ciu programu %s verzie %s +-�rpcinfo: broadcast zlyhal: %s +-�rpcinfo: nie je mo�n� spoji� sa s portmapperom�rovnak� meno pravidla vo viacer�ch s�boroch�ne�pln� ��tanie k���a �iadosti: %s�ne�pln� ��tanie �iadosti: `%s'�ne�pln� z�pis v %s: %s�socket: chyba protokolu pri pr�prave okruhu +-�poradie triedenia `forward' a `backward' sa navz�jom vylu�uj���pecifik�cia v�h triedenia pre symbol triedenia ned�va zmysel��tandardn� vstup��tandardn� v�stup�nepr�pustn� po�iato�n� d�tum v re�azci %d v poli `era' kateg�rie `%s'�po�iato�n� rok v��� ako koncov��po�iato�n� rok prive�k� pre zobrazenie�po�iato�n� rok primal� pre zobrazenie�nepr�pustn� koncov� d�tum v re�azci %d v poli `era' kateg�rie `%s'�svc_run: - select zlyhal�svc_tcp.c - nie je mo�n� vykona� getsockname alebo listen�svc_tcp.c - probl�m pri vytv�ran� tcp socketu�svc_tcp: makefd_xprt: nedostatok pam�ti +-�svc_unix.c - probl�m pri vytv�ran� AF_UNIX socketu�svc_unix.c - nem��em vykona� getsockname alebo listen�svc_unix: makefd_xprt: nedostatok pam�ti +-�svctcp_create: nedostatok pam�ti +-�svcudp_create - nem��em vykona� getsockname�svcudp_create: nedostatok pam�ti +-�svcudp_create: probl�m pri vytv�ran� socketu�svcunix_create: nedostatok pam�ti +-�symbol pre viacznakov� element triedenia `%.*s' duplikuje defin�ciu elementu�symbol pre viacznakov� element triedenia `%.*s' duplikuje in� element�symbol pre viacznakov� element triedenia `%.*s' duplikuje defin�ciu in�ho symbolu�symbol pre viacznakov� element triedenia `%.*s' duplikuje defin�ciu symbolu�symbol pre viacznakov� element triedenia `%.*s' duplikuje symbolick� meno v znakovej sade�chyba syntaxe v defin�cii %s: %s�chyba syntaxe v direkt�ve `order_start'�chyba syntaxe v defin�cii triedy znakov�chyba syntaxe v defin�cie konverzie znakov�chyba syntaxe v defin�cii poradia triedenia�chyba syntaxe v defin�cii triedenia�chyba syntaxe v defin�cii kateg�rie LC_CTYPE�chyba syntaxe v defin�cii novej triedy znakov�chyba syntaxe v defin�cii novej znakovej sady�chyba syntaxe v defin�cii n�rodn�ho prostredia spr�v�chyba syntaxe v defin�cii n�rodn�ho prostredia pe�a�n�ch hodn�t�chyba syntaxe v defin�cii n�rodn�ho prostredia pre ��sla�chyba syntaxe v �pecifik�cii poradia�chyba syntaxe v prol�gu: %s�chyba syntaxe v defin�cii mapy reperto�ru: %s�chyba syntaxe v defin�cii n�rodn�ho prostredia pre �as�chyba syntaxe: nie je vn�tri sekcie defin�cie n�rodn�ho prostredia�k�dovanie cie�a nebolo zadan� pomocou `-t'�toto je prv� defin�cia��as men�� ako nula�prete�enie �asu�prim�lo bajtov v k�dovan� znaku�prive�a bajtov v k�dovan� znaku�prive�a definovan�ch tried znakov�prive�a priestupn�ch sek�nd�prive�a lok�lnych typov �asu�prive�a prechodov?!�prive�a v�h�pr�li� ve�a alebo pr�li� dlh� skratku �asovej z�ny�smetie na konci riadku�probl�my pri odpovedi programu %d +-�dva riadky za sebou obsahuj�ce `...' nie s� povolen��zadan� jeden rok�nie je mo�n� prideli� vyrovn�vaciu pam� pre vstup�nie je mo�n� uvo�ni� argumenty�nedefinovan��nezn�my znak `%s'�nezn�my znak v poli `%s' kateg�rie `%s'�nezn�ma direkt�va triedenia�nezn�ma direkt�va `%s' - riadok ignorovan��nezn�ma iconv() chyba %d�nezn�ma sada `%s'�nezn�my symbol `%.*s' - riadok ignorovan��z�na bez pravidiel�neukon�en� spr�va�neukon�en� re�azec�neukon�en� re�azcov� kon�tanta�neukon�en� symbolick� meno�neukon�en� meno v�hy�horn� limit rozsahu je men�� ako doln��pou�itie: %s vstupn�_s�bor +-�29. febru�r pou�it� v nepriestupnom roku�hodnota pre %s mus� by� cel� ��slo�honota pre <%s> mus� by� medzi 1 a 4�hodnota po�a `%s' kateg�rie `%s' nesmie by� pr�zdny re�azec�hodnota <mb_cur_max> mus� by� v��ia ako hodnota <mb_cur_min>�hodnota po�a `int_curr_symbol' kateg�rie `LC_MONETARY' nezodpoved� platn�mu menu v ISO 4217�hodnota po�a `int_curr_symbol' kateg�rie `LC_MONETARY' m� chybn� d�ku�hodnoty po�a `%s' kateg�rie `%s' musia by� men�ie ako 127�po�as prijatia spojenia: %s�po�as pridelenia z�znamu cache�po�as pridelenia z�znamu hash-tabu�ky�po�as pridelenia k�pie k���a�po�as otv�rania star�ho katal�gu�po�as pr�pravy v�stupu�po�as ��tania datab�zy�po�as stat-u s�boru profilovac�ch inform�ci��po�as z�pisu datab�zy�ne�pln� z�pis�zapisovate�n� nielen pre vlastn�ka�chybn� po�et argumentov�chybn� po�et pol� v riadku Leap�chybn� po�et pol� v riadku Link�chybn� po�t pol� v riadku Rule�chybn� po�et pol� v pokra�ovacom riadku Zone�chybn� po�et pol� v riadku Zone�xdr_reference: nedostatok pam�ti +-�xdrrec_create: nedostatok pam�ti +-�yp_update: nie je mo�n� konvertova� meno po��ta�a na meno siete +-�yp_update: nie je mo�n� z�sti� adresu servera +-� +\ No newline at end of file +diff -Naur ../glibc-2.1.3/po/sv.mo glibc-2.1.3/po/sv.mo +--- ../glibc-2.1.3/po/sv.mo 1999-07-18 18:19:42.000000000 -0700 ++++ glibc-2.1.3/po/sv.mo 1969-12-31 16:00:00.000000000 -0800 +@@ -1,456 +0,0 @@ +-�������������������8�������K������K������K��M���L��E���UL��&����L��(����L������L������L�����M�����&M�����5M�����IM�����dM�����~M��n���M�����O�����O��"���%O��"���HO�����kO��:����O������O������O������O������O�����P�����P�����2P�����LP�����eP������P������P������P������P������P�����Q�����#Q�����*Q�����EQ�����RQ�����YQ��3���kQ��3����Q��4����Q��.���R��%���7R�����]R��&���qR��%����R������R��%����R��3����R��,���/S��)���\S������S��"����S��!����S������S������S�����T�����.T�����DT��"���ZT��*���}T������T��&����T��&����T��&���U��&���7U��&���^U������U�� ����U��$����U������U������U�����V��,���2V�����_V��%���}V��,����V��-����V�� ����V��&���W�����FW�����eW������W������W������W������W�������W��2���|X������X��"����X��4����X�����"Y��#���4Y�� ���XY��=���bY������Y��<����Y������Y��'���Z�����6Z��)���?Z��(���iZ�� ����Z������Z������Z������Z��$����Z������Z��)��� +-[��(���4[�����][�����m[�����y[��#����[��/����[������[������[�� ���\�����\�����%\�����9\�����N\�����Z\�����j\������\������\������\������\������\�� ����\������\������\�� ���]��&���]��-���<]��!���j]������]������]������]������]��&����]��%���&^��0���L^��!���}^������^��-����^������^��%���_��)���(_��'���R_��%���z_��&����_������_������_������_����� +-`�����%`�����<`�����X`�����u`��@����`��D����`�����a�����'a�����@a�� ���Ua��=���_a������a�������a�����b��7����b��2����b��-��� c�����7c��$���Jc�� +-���oc�����zc������c��!����c������c������c������c������c�����d�����d�����/d�����Jd�����^d�����rd��3����d��-����d��2����d�����e�����,e�����5e�����<e�����Le�����fe��<���}e������e��$����e��)����e�� ���)f�����7f��1���If��8���{f������f������f������f������f�����g�����'g�����@g�����Og�����gg��"����g������g������g������g�������g�����oh�� ����h������h������h������h������h�� ����h�����i��$���'i�����Li��"���Si��%���vi��"����i��"����i��%����i�����j�����j�����.j��>���;j�����zj������j������j������j��!����j������j��!����j������j��.���k�����Mk�����ak�����nk��"���{k������k������k������k�� ����k������k��+����k�����(l�����El�����Vl�����ml������l������l������l������l������l����� +-m��1���m��$���Mm�����rm������m������m������m������m������m������m�����n�� +-���n�����#n�����*n��2���0n�����cn�����rn������n�� ����n������n������n������n������n����� o�����o��!���3o�����Uo�����so��s����o�����p��*���p�����Cp�����]p�����np�����p������p������p������p������p������p�����q�����q�����q��9���q�����Vq�����nq������q��,����q�� +-����q������q������q������q�����r�����#r�����>r�����Xr�����pr������r��#����r������r������r������r�����s��#���&s�����Js�����js�����ss������s������s������s������s������s������s������s�����t�����1t�����Pt�����pt������t������t������t������t������t������t�����u��*���#u�����Nu�����Uu�����mu������u�� ����u��!����u�� ����u������u������u�� ���v�����"v�����@v�����Mv�����av�����rv������v������v��(����v������v�����w�����w�����5w�����Ow�����ew�����~w������w������w������w������w������w������w��.����w�����"x�� ���4x��#���Bx��0���fx��%����x������x������x������x������x�����y�����#y�����@y�����Oy�����my������y������y������y������y������y������y�����z�����+z�����Ez�����_z�����qz������z������z������z������z������z��!���{�����.{�����G{�����b{�����~{������{������{��"����{������{������{����� |�����$|�����8|�����J|�����`|��-���o|��-����|��!����|������|�����}�����}�����2}�����C}��2���Z}��#����}������}������}��;����}�����~�����$~�����@~�����X~�� ���r~�� ����~������~������~������~������~������~���������������/�����J��&���c�������������������������������� ������������$���0��� ���U������c������o����������������������������������ˀ�����߀����������������� ���*���(���(���S������|����������"������������������D������K���$���e��� +-������������������������P��� ���`������n���!������������������������DŽ��������"����������������*������@������S���'���c���#�������6������� ������ +-�������������"������"���*������M���"���g��������������������Ć�����ۆ�� ����������������������������*������C������Z������o����������������������������������χ����������������� ���������#���%���:���I�����������������%����������ֈ��"������������!������ ���@���"���a��� ������������������������ω�����������������������������!���F���>��� �������.�������-�������6������8���#���;���\���I��������������������������+���$���+���P���'���|�������������Č�� ���ь�����ی���������������&���(���.���O���&���~����������,�������������������C������#���a�����������������!�������"������.������ ���4���%���U���;���{���&����������ޏ��1����������0������K������W���"���h����������'����������ϐ��������.���������3���"���J���(���m���-����������đ�����ܑ��!����������������8������X������t���!�����������������ʒ��������9�������4���7���8���l���+�������8���ѓ��$��� +-���"���/���!���R���.���t���������������������<������;���>���$���z�����������������*���ו��7���������:���"���Y������|���)�������N�������U���������^���&���|���)������� ���͗�����ۗ��+���������� ������>������X������j���"�������%�������*���Ә��*����������)������=���0���W�����������������+���Ǚ��7������#���+������O���!���m���$�������!����������֚��&������%������,���>������k���'���z���%�������0���ț��2����������,���.���9������h���K�������L���͜��L���������g���+���{���2�������2���ڝ��/��� ���$���=������b���%���x���-�������$���̞����������� ������'������:���(���Q���&���z���!����������ß��F���ڟ�����!���B���4���B���w���?�������<�������7���7������o����������#�������.���ɡ��0�������0���)������Z������x���������������������������Т������������������������%������;������O���#���d���5�������G������� ������#������5���8������n������{���-�������!�������(������-���������9������J���'���\���?�������=���ĥ�� ������.������ ���?���9���`���;�������,���֦��*������#���.������R���%���l���A����������ԧ��������I������7���X���3�������+���Ĩ��������'������!���/������Q���.���b����������C�������*������������������(���8������a���1���t�����������������:���ݪ��������)���6���*���`���#��������������$���ϫ���������������"���,������O������m�����������������>���Ĭ��������!���"��� ���D���(���e���$��������������*���ɭ��=�������H���2������{����������E�������&������(������'���0���E���X����������(�������'������$������,���-���)���Z���%��������������"���Ȱ��������&��� ������0���P���O���V�������U�������O���M���V�������!�������'������*���>���/���i���*�������$���ij��/������1������/���K���)���{���*�������)���д��#�������������-���9���&���g���4�������(���õ����������� ��� ������#���(���$���L���"���q��������������������Ķ�����۶��.���������������;���3���X����������#����������·�� ���۷��������0����������-���$���I������n����������#�����������������ȸ�����ݸ�����������������)���4���B������w�����������������'���ǹ��B������D���2���j���w���K������?���.������n����������!����������̻��������������������"���3������V������r�����������������#�������#�����#������0���'���#���X������|����������*�������%������,�� ������6������M���R���`���B�������#�������$���������?������U������j������|�����������������������������������������o���������� ������� ��������������7������� ���)������3������;������O������i������������������������"�������������"���������B���"���`����������������� �����������������������������������6������6���<���4���s���3�������(�������������%������ ���@������a���'���v���3�������*�������-����������+���"���F���'���i����������������� ��������������������'���&���4���N����������$�������$�������$�������$������$���,������Q���"���i���+����������������������������&��� ������0���&���N���&���u���'������� �������'�������!��� ������/������O������f������z������������������5���A������w���!�������'��������������$�������������>������ ���Y���&���g����������)��������������-�������'������!���7������Y������[������n���"��������������$�������(����������������������#���,���;���.���h�������������������������������������� ����������������3������I������f��� +-�������������������� +-���������������������"��������������0������6���?���#���v�������������������������������1������(���D���,���m���#��������������6������� ������9���1������k���;�������(�������(�������%���������?������U���!���j�������������������������������=�������J���1������|���!���������������������C���������� �������?���������5���*���3���`���%��������������&����������������������������!����������"������8������W������i���������������������������������������������9������-���L���0���z���������� ���������������������"�������������<���������U���,���m������������������������4�������?������ ���S���&���t������������������������%�����������������������!���.���1������`������|����������t������������� ���&������G������c������z������������������������)���������������������"���������?������^���"���|����������$��������������#������� ���������������������,���#���B������f������x����������'���������������������������������� ���������'������7������J������\���$���q��� ��������������������������������������������,������K��� ���d��� �������8�������%����������������� ������$������7������O��� ���i��� ���w���������� +-���������������������0������������������������ ��������� ���-������N��� ���a������������������������������� �������#������n���(����������0�������������������������������������.������A������V������u�������������������������������5�����������������������"���3���<��� ���p������~�����������������"��������������������������� ���������9���+���Q������}���������� �������!�������$�������"������ +-���1������<������[������n��������������������������������������"�������"������ ���=������^������r���������� ��������������#����������������� ���"���*������M������U������t�����������������!������� +-���������������������%������,���1������^������k������������������������������5����������������.������H������_������t���������������������������������������������������� ������/������ ���F������T���$���a���-�������*������������������������ +-������������4���'���G������o������|�����������������#�������"����������������������(������G������a���������������������������������������������������%���)���"���O������r���������� ��������������%�������������&���&������M������Y������m�������������������������������4�������(������ ���1������R������m�����������������������2�������)������� ���$������2���q���K��� ��������������#����������������3���!���C���)���e������������������������������������������������������"���#���@������d������w����������&��������������"�����������������������/������;������D������\������p����������������������������������������������������0������(���8��� ���a������k������~��������������"������*���&���D������k������t���o�������������������������%���#������I������Z��� ���p����������%����������������������������������'������&���D���>���k��� ������� ��������������&�������&�������������!���/������Q������o����������������� ������� +-������� +-���������������������#����������������*������:������J������[������s��������������������������������������%�������<���������H������Y���'���j����������"��������������.�������!���������0������O������m���������������������������������������������#�������I��������V��*���_��.������6������=������C���.�M���r����������� �����2�����2���'�$���Z������������������������������1����2���E�,���x������-�����'���������F���,�!���s�#���������� �����#�����9����#���U�*���y�D�����*�����"����4���7����l�����������"����������'������������#�+���=�!���i�)�����,�����1������������.����L����l�"����������"�����!�������� ����) ����G �7���c �3���� �6���� �0��� +-�9���7 +-�!���q +-�'���� +-�%���� +-�)���� +-��������(����E�<���c�;�����'���������&����,���C�E���p������&����������.��� �P���A �S���� ����� �(����%���*����P����b�(�����"��������������������!����&���9�+���`�+���������������0����� �������;�$���X�6���}�!����������#�����$����(���5�!���^�-�����.�����*���������)����%���A�-���g�6����������)���������H���.�E���w�D���������)����5���@�0���v�/�����/���������)����1���G�!���y���������������������&�����(���$�"���M����p�H����������=�����<���'�B���d�H�����<��������-����F�"���Y�0���|�2�����2������������,����A����]����s������������������������������������#����1���;�=���m������#�����+������������'�4���>�&���s�%�����0����� +-����������/��� �9���9�7���s� �����(�����$�����7����9���?�+���y�*�����!����������-����=���<�"���z������I�����2����(���:�.���c������5�����%�������� +- �3��� ����Q �@���a �%���� ����� ����� �,���� ����!�4���*!����_!����|!�5����!�!����!�-����!�(���"�)���="�*���g"�+����"�����"�����"� ����"����#����5#����Q#����o#�?����#�%����#�%����#����$�-���5$�&���c$�����$�6����$�D����$�I���&%����p%����|%�@����%�����%�-����%�-���&�?���A&�����&�4����&�0����&�"���'�5���)'�5���_'�#����'�����'�+����'����(�/���(����M(�K���j(�Q����(�P���)�J���Y)�]����)� ���*�$���#*�!���H*�)���j*�*����*� ����*�,����*�(��� +�.���6+�)���e+�&����+�(����+�#����+����,�*���,�#���E,�)���i,�%����,� ����,� ����,�����,�����,� ���-�#���9-����]-����u-�����-�����-�.����-�����-����.�5���&.����\.�$���w.�����.�����.�����.�(����.�����/�"���/����</����V/�"���g/� ����/�����/�����/�����/�����/�����/�4���0����90����P0����m0�'����0�;����0�B����0�]���31�H����1�=����1� ���2����92����T2����t2�����2�����2�����2�"����2�����2����3����.3����K3����^3����{3�����3�)����3�����3�����3����4�/���44�'���d4��������k��������������������������@������,�������(�������������:��C����������������p��}���������2�������������k��D����������!��a���S����q�������J������������w��7������������@��������������E��V��H���������s������l���s���������u���[���������v������������������:������������������6��=������u������������������o���.������ ����|��d�����p���������������9�������������������$���������[�������������������l��?���������������C��`��������������*�����X���9��I������S��V��p������!������������y��d������������������������������Q������1�����������������n��^�� +-��� ���m���4���������?��������m������r�������������������������������]�������������������������������#������������������/���_��J����������������������������������������������s��f��Q��8�����r����������z���������<������������������x������B��{��K�������������>����������D��M����������������������������>����������������o���������i�������@����������x����������������b������� �������g���a�����������������E��o��e�������-��x��W������������������������������������������������Z�������s���R��"�������������4���������������/��������������������*����������(�������������������1�������k������L��V������N����)��������A������y���������*�����f���$������X������Q��)��#���K����������������[�������q�������D�����������T������a����������.���������T�������,��'�������u��\������������!�������3������������g�� +-������=��H���]�����-��5��O��z��������������������j�������������������������������������������������������������������.����������������������G�������j���J��Z�����R������������C���������3����������������%��e��`�����������������������������������U������m�����{�����Q������c��P��������������������������������������������6���r����������������`���������t�����e��5�������������F��h��|�������������������b�������������������e�����\���~��2��E������� ���j�������#����������� ���������m��������������y������������1��M����������\����������4��f�������R����������7��Y�������������f��L�������F������������������������������������<����������� �� ���������������{��i���������Y�������������������������������� ���%���������(������c����������������������������~��������,����������{��������������������������������C���5��"���������?������v���)�������?������ +-����������+��������������/��~��_���"��}��W���|���������d���������������������O�����������"���=�����R�����L����������������@��u�����7��^����������������8��P������������������������y���`�� ��<��w���}�����_�����'��H������d��������������n����������������H���������G������5��>����+�������S�����������-���������Y������������!����������������I����������g����l���������^��z������������v����������������������������������������N��A������|�����t���������W��������������������������+��������$��3��h�����������������c����������������������b��&��A������i���������������������b��[�� �������8�������������O��������o�����Y��#���������������r�����N���0����������������;��n��������������%����������������������������������������������������������E�� ������K������������ +-��M��������������������������h�������X��������������T��t������������������^�����9�����M�� ��J���������������>���+�����������������(���������2��c���������6��&��������V���)��������������������������������U��=�������B�������������;���v����������������0���������������Z�����������%��������������������~���������]������������������������1���������������N��������p��2��i���'��:��0������-���D�����������S������������������������W������L��8�����������������������������������}�������������������,�����������������������t�������������&�����B��w�������������l�����������������I�����������������������������6��'��������������������U�������������������������:������*������F�������������������������������������������n���������.�����q������7�����������x���������������/��������������������w��;������������������������������������������&������������������������G��;��T��Z��F����������������g��4�����q�����_��O��K��P��\����������������X�������������I�����������z��������������������������������������������������������G����������0�����a��A�����B�����j��U�����������������������������������<��$������k���������������]��P�����������h���������������3��������������9���������� Access Rights : � Attributes : � %s [-abkCLNTM][-Dname[=value]] [-i size] [-I [-K seconds]] [-Y path] infile +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o outfile] [infile] +-� %s [-n netid]* [-o outfile] [infile] +-� %s [-s nettype]* [-o outfile] [infile] +-� Access rights: � Entry data of type %s +-� Name : %s +-� Public Key : � Type : %s +-� Universal addresses (%u) +-� [%d] Name : %s +-� [%u] - [%u bytes] � +-%s cache: +- +-%15s cache is enabled +-%15Zd suggested size +-%15ld seconds time to live for positive entries +-%15ld seconds time to live for negative entries +-%15ld cache hits on positive entries +-%15ld cache hits on negative entries +-%15ld cache misses on positive entries +-%15ld cache misses on negative entries +-%15ld%% cache hit rate +-%15s check /etc/%s for changes +-� +-Group Members : +-� +-Time to Live : � rpcinfo -b prognum versnum +-� rpcinfo -d prognum versnum +-� rpcinfo -p [ host ] +-� rpcinfo [ -n portnum ] -t host prognum [ versnum ] +-� no� yes� Data Length = %u +-� Explicit members: +-� Explicit nonmembers: +-� Implicit members: +-� Implicit nonmembers: +-� No explicit members +-� No explicit nonmembers +-� No implicit members +-� No implicit nonmembers +-� No recursive members +-� No recursive nonmembers +-� Recursive members: +-� program vers proto port +-� or: � (rule from "%s", line %d)� [OPTION...]� done +-�"%s", line %d: %s�"Zone %s" line and -l option are mutually exclusive�"Zone %s" line and -p option are mutually exclusive�"infile" is required for template generation flags. +-�%.*s: ARGP_HELP_FMT parameter requires a value�%.*s: Unknown ARGP_HELP_FMT parameter�%s in ruleless zone�%s%s%s:%u: %s%sAssertion `%s' failed. +-�%s%s%s:%u: %s%sUnexpected error: %s. +-�%s%sUnknown signal %d +-�%s: %d did not sign extend correctly +-�%s: <mb_cur_max> must be greater than <mb_cur_min> +-�%s: C preprocessor failed with exit code %d +-�%s: C preprocessor failed with signal %d +-�%s: Can't create %s: %s +-�%s: Can't create directory %s: %s +-�%s: Can't link from %s to %s: %s +-�%s: Can't open %s: %s +-�%s: Can't remove %s: %s +-�%s: Error closing %s: %s +-�%s: Error reading %s +-�%s: Error writing %s +-�%s: Error writing standard output �%s: Leap line in non leap seconds file %s +-�%s: Memory exhausted: %s +-�%s: More than one -L option specified +-�%s: More than one -d option specified +-�%s: More than one -l option specified +-�%s: More than one -p option specified +-�%s: More than one -y option specified +-�%s: Too many arguments +-�%s: cannot get modification time�%s: command was '%s', result was %d +-�%s: error in state machine�%s: illegal option -- %c +-�%s: invalid option -- %c +-�%s: option `%c%s' doesn't allow an argument +-�%s: option `%s' is ambiguous +-�%s: option `%s' requires an argument +-�%s: option `--%s' doesn't allow an argument +-�%s: option `-W %s' doesn't allow an argument +-�%s: option `-W %s' is ambiguous +-�%s: option requires an argument -- %c +-�%s: output would overwrite %s +-�%s: panic: Invalid l_value %d +-�%s: premature end of file�%s: unable to open �%s: unrecognized option `%c%s' +-�%s: unrecognized option `--%s' +-�%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ] +- [ -L leapseconds ] [ -y yearistype ] [ filename ... ] +-�%s: usage is %s [ -v ] [ -c cutoff ] zonename ... +-�%s: while writing output: �(PROGRAM ERROR) No version known!?�(PROGRAM ERROR) Option should have been recognized!?�(Unknown object) +-�(unknown authentication error - %d)�(unknown)�*** The file `%s' is stripped: no detailed analysis possible +-�*standard input*�-o OUTPUT-FILE [INPUT-FILE]... +-[OUTPUT-FILE [INPUT-FILE]...]�.lib section in a.out corrupted�; low version = %lu, high version = %lu�; why = �<%s> and <%s> are illegal names for range�<SP> character must not be in class `%s'�<SP> character not in class `%s'�?�Aborted�Access Rights : �Accessing a corrupted shared library�Address already in use�Address family for hostname not supported�Address family not supported by protocol�Advertise error�Alarm clock�Argument list too long�Attempt to remove a non-empty table�Attempting to link in too many shared libraries�Authentication OK�Authentication error�BOGUS OBJECT +-�Bad address�Bad file descriptor�Bad font file format�Bad message�Bad system call�Bad value for ai_flags�Be strictly POSIX conform�Binary data +-�Block device required�Broadcast poll problem�Broken pipe�Bus error�CDS�CPU time limit exceeded�Cache expired�Can not access a needed shared library�Can't bind to server which serves this domain�Can't communicate with portmapper�Can't communicate with ypbind�Can't communicate with ypserv�Cannot allocate memory�Cannot assign requested address�Cannot create socket for broadcast rpc�Cannot exec a shared library directly�Cannot have more than one file generation flag! +-�Cannot receive reply to broadcast�Cannot register service�Cannot send after transport endpoint shutdown�Cannot send broadcast packet�Cannot set socket option SO_BROADCAST�Cannot specify more than one input file! +-�Cannot use netid flag with inetd flag! +-�Cannot use netid flag without TIRPC! +-�Cannot use table flags with newstyle! +-�Channel number out of range�Character Separator : %c +-�Child exited�Client credential too weak�Columns : +-�Communication error on send�Compile locale specification�Computer bought the farm�Computing table size for character classes might take a while...�Computing table size for collation information might take a while...�Connection refused�Connection reset by peer�Connection timed out�Continued�Convert encoding of given files from one encoding to another.�Convert key to lower case�Copyright (C) %s Free Software Foundation, Inc. +-This is free software; see the source for copying conditions. There is NO +-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +-�Could not create log file "%s"�Create C header file NAME containing symbol definitions�Create output even if warning messages were issued�Create simple DB database from textual input.�Creation Time : %s�DES entry for netname %s not unique +-�DIRECTORY +-�DNANS�DNS�Database for table does not exist�Database is busy�Default Access rights : +-�Destination address required�Device not a stream�Device not configured�Device or resource busy�Diffie-Hellmann (%d bits) +-�Directory : %s +-�Directory not empty�Disc quota exceeded�Do not fork and display messages on the current tty�Do not print messages while building database�Do not use existing catalog, force new output file�Domain not bound�EMT trap�ENTRY +-�Encrypted data +-�Entry/Table type mismatch�Error in RPC subsystem�Error in accessing NIS+ cold start file. Is NIS+ installed?�Error in unknown error system: �Error while talking to callback proc�Error: .netrc file is readable by others.�Exchange full�Exec format error�FATAL: system does not define `_POSIX2_LOCALEDEF'�FILE contains mapping from symbolic names to UCS4 values�Failed (unspecified error)�File descriptor in bad state�File exists�File locking deadlock error�File name too long�File size limit exceeded�File too large�First/Next chain broken�Floating point exception�Full resync required for directory�Function not implemented�GROUP +-�Garbage in ARGP_HELP_FMT: %s�Generate message catalog.\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE +-is -, output is written to standard output. +-�Generic system error�Get locale-specific information.�Give a short usage message�Give this help list�Gratuitous error�Group : %s +-�Group Flags :�Group entry for "%s.%s" group: +-�Hang for SECS seconds (default 3600)�Hangup�Haven't found "%d" in group cache!�Haven't found "%d" in password cache!�Haven't found "%s" in group cache!�Haven't found "%s" in hosts cache!�Haven't found "%s" in password cache!�Host is down�Host name lookup failure�I/O possible�INPUT-FILE OUTPUT-FILE +--o OUTPUT-FILE INPUT-FILE +--u INPUT-FILE�IOT trap�IVY�Identifier removed�Illegal instruction�Illegal object type for operation�Illegal seek�Inappropriate file type or format�Inappropriate ioctl for device�Inappropriate operation for background process�Information request�Information:�Input Files:�Input/Output format specification:�Input/output error�Internal NIS error�Internal ypbind error�Interrupt�Interrupted system call�Interrupted system call should be restarted�Invalid Object for operation�Invalid argument�Invalid back reference�Invalid character class name�Invalid client credential�Invalid client verifier�Invalid collation character�Invalid content of \{\}�Invalid cross-device link�Invalid exchange�Invalid or incomplete multibyte or wide character�Invalid preceding regular expression�Invalid range end�Invalid regular expression�Invalid request code�Invalid request descriptor�Invalid server verifier�Invalid slot�Is a directory�Is a named type file�Kerberos. +-�Killed�LINK +-�LOCAL entry for UID %d in directory %s not unique +-�Level 2 halted�Level 2 not synchronized�Level 3 halted�Level 3 reset�Link Points to illegal name�Link has been severed�Link number out of range�Linked Object Type : �Linked to : %s +-�Local domain name not set�Local resource allocation failure�Machine is not on the network�Malformed Name, or illegal name�Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options.�Master Server : +-�Master server busy, full dump rescheduled.�Memory allocation failure�Memory exhausted�Message too long�Missing or malformed attribute�Mod. Time : %s�Modification failed�Modify operation failed�Modify output format:�Multihop attempted�NAME�NAME +-[-a|-m]�NIS�NIS client/server version mismatch - can't supply service�NIS map database is bad�NIS+ operation failed�NIS+ servers unreachable�NIS+ service is unavailable or not installed�NO OBJECT +-�NUMBER�Name : '%s' +-�Name Service Cache Daemon.�Name not served by this server�Name not unique on network�Name or service not known�Name/entry isn't unique�Named object is not searchable�Need authenticator�Network dropped connection on reset�Network is down�Network is unreachable�No CSI structure available�No XENIX semaphores available�No address associated with hostname�No address associated with name�No anode�No buffer space available�No child processes�No data available�No file space on server�No locks available�No match�No medium found�No message of desired type�No more records in map database�No previous regular expression�No remote programs registered. +-�No route to host�No space left on device�No such device�No such file or directory�No such key in map�No such map in server's domain�No such process�Non NIS+ namespace encountered�Non-recoverable failure in name resolution�None. +-�Not Found, no such name�Not a XENIX named type file�Not a directory�Not found�Not master server for this domain�Not owner�Number of Columns : %d +-�Number of objects : %u +-�Numerical argument out of domain�Numerical result out of range�Object #%d: +-�Object Name : %s +-�Object Type : �Object is remote�Object with same name exists�Odd number of quotation marks�Only root is allowed to use this option!�Operation already in progress�Operation not permitted�Operation not supported�Operation now in progress�Operation would block�Out of streams resources�Output control:�Output selection:�Owner : %s +-�PRIVATE +-�Package not installed�Parse error: %s�Partial Success�Passed object is not the same object on server�Permission denied�Power failure�Premature end of regular expression�Print content of database file, one entry a line�Print current configuration statistic�Print more messages�Print program version�Probable success�Probably not found�Profiling timer expired�Protocol driver not attached�Protocol error�Protocol family not supported�Protocol not available�Protocol not supported�Protocol wrong type for socket�Query illegal for named table�Quit�RFS specific error�RPC bad procedure for program�RPC failure on NIS operation�RPC program not available�RPC program version wrong�RPC struct is bad�RPC version wrong�RPC: (unknown error code)�RPC: Authentication error�RPC: Can't decode result�RPC: Can't encode arguments�RPC: Failed (unspecified error)�RPC: Incompatible versions of RPC�RPC: Port mapper failure�RPC: Procedure unavailable�RPC: Program not registered�RPC: Program unavailable�RPC: Program/version mismatch�RPC: Remote system error�RPC: Server can't decode arguments�RPC: Success�RPC: Timed out�RPC: Unable to receive�RPC: Unable to send�RPC: Unknown host�RPC: Unknown protocol�RSA (%d bits) +-�RTLD_NEXT used in code not dynamically loaded�Read and display shared object profiling data�Read configuration data from NAME�Read-only file system�Real-time signal %d�Regular expression too big�Remote I/O error�Remote address changed�Remove password or make file unreadable by others.�Reopening shared object `%s' failed�Replicate : +-�Report bugs to %s. +-�Report bugs using the `glibcbug' script to <bugs@gnu.org>. +-�Request arguments bad�Resolver Error 0 (no error)�Resolver internal error�Resource deadlock avoided�Resource lost�Resource temporarily unavailable�Results Sent to callback proc�SHOBJ [PROFDATA]�SUNYP�Search Path : %s +-�Segmentation fault�Server busy, try again�Server out of memory�Server rejected credential�Server rejected verifier�Servname not supported for ai_socktype�Set the program name�Shut the server down�Signal 0�Socket operation on non-socket�Socket type not supported�Software caused connection abort�Sorry. You are not root +-�Source definitions are found in FILE�Srmount error�Stack fault�Stale NFS file handle�Start NUMBER threads�Status : %s +-�Stopped�Stopped (signal)�Stopped (tty input)�Stopped (tty output)�Streams pipe error�Structure needs cleaning�Success�Suppress warnings and information messages�Symbolic character names defined in FILE�System error�System information:�System resource allocation failure�System's directory for character maps : %s +- repertoire maps: %s +- locale path : %s +-%s�TABLE +-�Table Type : %s +-�Temporary failure in name resolution�Terminated�Text file busy�The following list contain all the coded character sets known. This does +-not necessarily mean that all combinations of these names can be used for +-the FROM and TO command line parameters. One coded character set can be +-listed with several different names (aliases). +- Some of the names are no plain strings but instead regular expressions and +-they match a variety of names which can be given as parameters to the +-program. +- +- �Time to live : �Timer expired�Too Many Attributes�Too many levels of symbolic links�Too many links�Too many open files�Too many open files in system�Too many processes�Too many references: cannot splice�Too many users�Trace/breakpoint trap�Trailing backslash�Translator died�Transport endpoint is already connected�Transport endpoint is not connected�Try `%s --help' or `%s --usage' for more information. +-�Trying %s... +-�Type : %s +-�UNKNOWN�Unable to authenticate NIS+ client�Unable to authenticate NIS+ server�Unable to create callback�Unable to create process on server�Unknown (type = %d, bits = %d) +-�Unknown .netrc keyword %s�Unknown NIS error code�Unknown database: %s +-�Unknown error�Unknown error �Unknown host�Unknown object�Unknown option: %s %s %s�Unknown resolver error�Unknown server error�Unknown signal %d�Unknown system error�Unknown ypbind error�Unmatched ( or \(�Unmatched ) or \)�Unmatched [ or [^�Unmatched \{�Unrecognized variable `%s'�Urgent I/O condition�Usage:�Usage: %s variable_name [pathname] +-�Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ] +-�User defined signal 1�User defined signal 2�Value too large for defined data type�Virtual timer expired�Wild result from command execution�Window changed�Write names of available charmaps�Write names of available locales�Write names of selected categories�Write names of selected keywords�Write output to file NAME�Written by %s. +-�Wrong medium type�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Yes, 42 is the meaning of life�You really blew it this time�Zone continuation line end time is not after end time of previous line�[FILE...]�`%1$s' definition does not end with `END %1$s'�`%s' is no correct profile data file for `%s'�`-1' must be last entry in `%s' field in `%s' category�`...' must only be used in `...' and `UNDEFINED' entries�`from' expected after first argument to `collating-element'�`from' string in collation element declaration contains unknown character�ai_family not supported�ai_socktype not supported�already running�argument to <%s> must be a single character�argument to `%s' must be a single character�auth_none.c - Fatal marshalling problem�authunix_create: out of memory +-�bad argument�bad owner�blank FROM field on Link line�blank TO field on Link line�block freed twice +-�bogus mcheck_status, library is buggy +-�broadcast: ioctl (get interface configuration)�broadcast: ioctl (get interface flags)�buffer overflow�cache_set: could not allocate new rpc_buffer�cache_set: victim alloc failed�cache_set: victim not found�can't determine time zone abbreviation to use just after until time�can't reassign procedure number %d +-�cannot `stat' locale file `%s'�cannot allocate symbol data�cannot create internal descriptor�cannot create internal descriptors�cannot enable socket to accept connections: %s�cannot find C preprocessor: %s +-�cannot find any C preprocessor (cpp) +-�cannot handle old request version %d; current version is %d�cannot insert collation element `%.*s'�cannot insert into result table�cannot insert new collating symbol definition: %s�cannot load profiling data�cannot open�cannot open `%s'�cannot open database file `%s': %s�cannot open input file `%s'�cannot open locale definition file `%s'�cannot open output file�cannot open output file `%s'�cannot open output file `%s' for category `%s'�cannot open socket: %s�cannot process order specification�cannot read character map directory `%s'�cannot read configuration file; this is fatal�cannot read from client�cannot read header from `%s'�cannot read locale directory `%s'�cannot read locale file `%s'�cannot read repertoire map `%s'�cannot read statistics data�cannot stat() file `%s': %s�cannot write output files to `%s'�cannot write result: %s�cannot write statistics: %s�cannot write to client�category data requested more than once: should not happen�character %s'%s' in class `%s' must be in class `%s'�character %s'%s' in class `%s' must not be in class `%s'�character <SP> not defined in character map�character `%s' not defined while needed as default value�character class `%s' already defined�character map `%s' already defined�character map file `%s' not found�clnt_raw.c - Fatal header serialization error.�clnttcp_create: out of memory +-�clntudp_create: out of memory +-�clntunix_create: out of memory +-�collation element `%.*s' appears more than once: ignore line�collation symbol `%.*s' appears more than once: ignore line�collation symbol expected after `%s'�connect to address %s: �constant or identifier expected�conversion from `%s' to `%s' not supported�conversion stopped due to problem in writing the output�couldn't create an rpc server +-�couldn't register prog %d vers %d +-�database [key ...]�default character map file `%s' not found�direction flag in string %d in `era' field in category `%s' is not '+' nor '-'�direction flag in string %d in `era' field in category `%s' is not a single character�duplicate character name `%s'�duplicate collating element definition�duplicate definition for character `%.*s'�duplicate key�duplicate set definition�duplicate zone name %s (file "%s", line %d)�duplicated message identifier�duplicated message number�empty char string�empty weight name: line ignored�enablecache: cache already enabled�enablecache: could not allocate cache�enablecache: could not allocate cache data�enablecache: could not allocate cache fifo�encoding for output�encoding of original text�end point of ellipsis range is bigger then start�error while closing input `%s'�error while closing output file�error while closing the profiling data file�error while inserting collation element into hash table�error while inserting to hash table�error while reading the input�expect string argument for `copy'�expected continuation line not found�failed to load shared object `%s'�failed to load symbol data�failed to mmap the profiling data file�failed to start conversion processing�failure while writing data for category `%s'�fcntl: F_SETFD�field `%s' in category `%s' not defined�field `%s' in category `%s' undefined�file '%s' already exists and may be overwritten +-�from-value of `collating-element' must be a string�fstat failed�garbage at end of character code specification�garbage at end of number�garbage at end of offset value in string %d in `era' field in category `%s'�garbage at end of starting date in string %d in `era' field in category `%s'�garbage at end of stopping date in string %d in `era' field in category `%s'�generate call graph�generate flat profile with counts and ticks�get_myaddress: ioctl (get interface configuration)�getent - get entries from administrative database.�handle_request: request received (Version = %d)�hard link failed, symbolic link used�hard linked somewhere�illegal CORRECTION field on Leap line�illegal Rolling/Stationary field on Leap line�illegal character constant in string�illegal character in file: �illegal collation element�illegal definition�illegal encoding given�illegal escape sequence at end of string�illegal input sequence at position %ld�illegal names for character range�illegal nettype :'%s' +-�illegal number for offset in string %d in `era' field in category `%s'�illegal set number�illegal starting date in string %d in `era' field in category `%s'�illegal stopping date in string %d in `era' field in category `%s'�implementation limit: no more than %d character classes allowed�implementation limit: no more than %d character maps allowed�incomplete character or shift sequence at end of buffer�incorrectly formatted file�input line of unknown type�internal error (illegal descriptor)�internal error - addtype called with bad isdst�internal error - addtype called with bad ttisgmt�internal error - addtype called with bad ttisstd�internal error in %s, line %u�invalid UTC offset�invalid abbreviation format�invalid day of month�invalid ending year�invalid leaping year�invalid mode for dlopen()�invalid month name�invalid saved time�invalid starting year�invalid time of day�invalid weekday name�key length in request too long: %Zd�line after ellipsis must contain character definition�line before ellipsis does not contain definition for character constant�line too long�list all known coded character sets�locale file `%s', used in `copy' statement, not found�lstat failed�malformed line ignored�mapping of section header string table failed�mapping of section headers failed�memory clobbered before allocated block +-�memory clobbered past end of allocated block +-�memory exhausted�memory exhausted +-�memory is consistent, library is buggy +-�missing era format in string %d in `era' field in category `%s'�missing era name in string %d in `era' field in category `%s'�nameless rule�neither original nor target encoding specified�netname2user: (nis+ lookup): %s +-�netname2user: DES entry for %s in directory %s not unique�netname2user: LOCAL entry for %s in directory %s not unique�netname2user: missing group id list in '%s'.�netname2user: principal name '%s' too long�netname2user: should not have uid 0�never registered prog %d +-�no <Uxxxx> or <Uxxxxxxxx> value given�no correct regular expression for field `%s' in category `%s': %s�no day in month matches rule�no definition of `UNDEFINED'�no filename for profiling data given and shared object `%s' has no soname�no other keyword shall be specified when `copy' is used�no output file produced because warning were issued�no repertoire map specified: cannot proceed�no symbolic name given�no symbolic name given for end of range�no weight defined for symbol `%s'�not regular file�nscd configuration: +- +-%15d server debug level +-�nscd not running! +-�only WIDTH definitions are allowed to follow the CHARMAP definition�original encoding not specified using `-f'�output file�pmap_getmaps rpc problem�poll: protocol failure in circuit setup +-�preprocessor error�print list of count paths and their number of use�print progress information�problems while reading `%s'�profiling data file `%s' does not match shared object `%s'�program %lu is not available +-�program %lu version %lu is not available +-�program %lu version %lu ready and waiting +-�rcmd: poll (setting up stderr): %m +-�rcmd: socket: All ports in use +-�rcmd: write (setting up stderr): %m +-�registerrpc: out of memory +-�repeated leap second moment�repertoire map file `%s' not found�rpcgen: arglist coding error +-�rpcgen: too many defines +-�rpcinfo: %s is unknown host +-�rpcinfo: %s is unknown service +-�rpcinfo: Could not delete registration for prog %s version %s +-�rpcinfo: broadcast failed: %s +-�rpcinfo: can't contact portmapper�same rule name in multiple files�short read while reading request key: %s�short read while reading request: %s�short write in %s: %s�socket: protocol failure in circuit setup +-�sorting order `forward' and `backward' are mutually exclusive�specification of sorting weight for collation symbol does not make sense�standard input�standard output�starting date is illegal in string %d in `era' field in category `%s'�starting year greater than ending year�starting year too high to be represented�starting year too low to be represented�stopping date is illegal in string %d in `era' field in category `%s'�svc_run: - select failed�svc_tcp.c - cannot getsockname or listen�svc_tcp.c - tcp socket creation problem�svc_tcp: makefd_xprt: out of memory +-�svc_unix.c - AF_UNIX socket creation problem�svc_unix.c - cannot getsockname or listen�svc_unix: makefd_xprt: out of memory +-�svctcp_create: out of memory +-�svcudp_create - cannot getsockname�svcudp_create: out of memory +-�svcudp_create: socket creation problem�svcunix_create: out of memory +-�symbol for multicharacter collating element `%.*s' duplicates element definition�symbol for multicharacter collating element `%.*s' duplicates other element definition�symbol for multicharacter collating element `%.*s' duplicates other symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbol definition�symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset�syntax error in %s definition: %s�syntax error in `order_start' directive�syntax error in character class definition�syntax error in character conversion definition�syntax error in collating order definition�syntax error in collation definition�syntax error in definition of LC_CTYPE category�syntax error in definition of new character class�syntax error in definition of new character map�syntax error in message locale definition�syntax error in monetary locale definition�syntax error in numeric locale definition�syntax error in order specification�syntax error in prolog: %s�syntax error in repertoire map definition: %s�syntax error in time locale definition�syntax error: not inside a locale definition section�target encoding not specified using `-t'�this is the first definition�time before zero�time overflow�too few bytes in character encoding�too many bytes in character encoding�too many character classes defined�too many leap seconds�too many local time types�too many transitions?!�too many weights�too many, or too long, time zone abbreviations�trailing garbage at end of line�trouble replying to prog %d +-�two lines in a row containing `...' are not allowed�typed single year�unable to allocate buffer for input�unable to free arguments�undefined�unknown character `%s'�unknown character in field `%s' of category `%s'�unknown collation directive�unknown directive `%s': line ignored�unknown iconv() error %d�unknown set `%s'�unknown symbol `%.*s': line ignored�unruly zone�unterminated message�unterminated string�unterminated string constant�unterminated symbolic name�unterminated weight name�upper limit in range is not smaller then lower limit�usage: %s infile +-�use of 2/29 in non leap-year�value for %s must be an integer�value for <%s> must lie between 1 and 4�value for field `%s' in category `%s' must not be the empty string�value of <mb_cur_max> must be greater than the value of <mb_cur_min>�value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217�value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length�values for field `%s' in category `%s' must be smaller than 127�while accepting connection: %s�while allocating cache entry�while allocating hash table entry�while allocating key copy�while opening old catalog file�while preparing output�while reading database�while stat'ing profiling data file�while writing database file�write incomplete�writeable by other than owner�wrong number of arguments�wrong number of fields on Leap line�wrong number of fields on Link line�wrong number of fields on Rule line�wrong number of fields on Zone continuation line�wrong number of fields on Zone line�xdr_reference: out of memory +-�xdrrec_create: out of memory +-�yp_update: cannot convert host to netname +-�yp_update: cannot get server address +-�Project-Id-Version: libc 2.1 +-POT-Creation-Date: 1998-11-28 09:29-0800 +-PO-Revision-Date: 1999-01-24 18:00 +01:00 +-Last-Translator: Jan Dj�rv <Jan.Djarv@mbox200.swipnet.se> +-Language-Team: Swedish <sv@li.org> +-MIME-Version: 1.0 +-Content-Type: text/plain; charset=ISO-8859-1 +-Content-Transfer-Encoding: 8bit +-� Accessr�ttigheter : � Attribut : � %s [-abkCLNTM][-Dnamn[=v�rde]] [-i storlek] [-I [-K sekunder]] [-Y s�kv�g] infil +-� %s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] [-o utfil] [infil] +-� %s [-n n�tid]* [-o utfil] [infil] +-� %s [-s n�ttyp]* [-o utfil] [infil] +-� �tkomstr�ttigheter: � Postdata av typ %s +-� Namn : %s +-� Publik nyckel : � Typ : %s +-� Universella adresser (%u) +-� [%d] Namn : %s +-� [%u] - [%u byte] � +-%s cache: +- +-%15s cache �r p�slagen +-%15Zd f�reslagen storlek +-%15ld livsl�ngd i sekunder f�r positiva poster +-%15ld livsl�ngd i sekunder f�r negativa poster +-%15ld cache-tr�ffar f�r positiva poster +-%15ld cache-tr�ffar f�r negativa poster +-%15ld cache-missar f�r positiva poster +-%15ld cache-missar f�r negativa poster +-%15ld%% cache tr�ffprocent +-%15s kontrollera /etc/%s f�r �ndringar +-� +-Guppmedlemmar : +-� +-Livsl�ngd : � rpcinfo -b prognr versnr +-� rpcinfo -d prognr versnr +-� rpcinfo -p [ v�rd ] +-� rpcinfo [ -n portnr ] -t v�rd prognr [ versnr ] +-� nej� ja� Datal�ngd = %u +-� Explicita medlemmar: +-� Explicit icke-medlemmar: +-� Implicita medlemmar: +-� Implicita icke-medlemmar: +-� Inga explicita medlemmar +-� Inga explicita icke-medlemmar +-� Inga implicita medlemmar +-� Inga implicita icke-medlemmar +-� Inga rekursiva medlemmar +-� Inga rekursiva icke-medlemmar +-� Rekursiva medlemmar: +-� program vers proto port +-� eller: � (regel fr�n "%s", rad %d)� [FLAGGA...]� klar +-�"%s", rad %d: %s�"Zone %s"-rad och flaggan -l �r �msesidigt uteslutande�"Zone %s"-rad och flaggan -p �r �msesidigt uteslutande�"infil" �r obligatorisk f�r mallgenereringsflaggor. +-�%.*s: parameter till ARGP_HELP_FMT kr�ver ett v�rde�%.*s: Parameter till ARGP_HELP_FMT ok�nd�%s i zon utan regler�%s%s%s:%u: %s%sF�rs�kran "%s" falsk. +-�%s%s%s:%u: %s%sOv�ntat fel: %s. +-�%s%sOk�nd signal %d +-�%s: %d teckenexpanderades inte korrekt +-�%s: <mb_cur_max> m�ste vara st�rre �n <mb_cur_min> +-�%s: C preprocessorn avslutades med kod %d +-�%s: C preprocessorn avslutades med signal %d +-�%s: Kan inte skapa %s: %s +-�%s: Kan inte skapa katalog %s: %s +-�%s: Kan inte l�nka fr�n %s till %s: %s +-�%s: Kan inte �ppna %s: %s +-�%s: Kan inte ta bort %s: %s +-�%s: Fel vid st�ngning av %s: %s +-�%s: Fel vid l�sning fr�n %s +-�%s: Fel vid skrivning till %s +-�%s: Fel vid skrivning till standard ut �%s: "Leap"-rad i fil %s som inte �r skottsekundsfil +-�%s: Minnet slut: %s +-�%s: Flaggan -L given mer �n en g�ng +-�%s: Flaggan -d given mer �n en g�ng +-�%s: Flaggan -l given mer �n en g�ng +-�%s: Flaggan -p given mer �n en g�ng +-�%s: Flaggan -y given mer �n en g�ng +-�%s: F�r m�nga argument +-�%s: kan inte h�mta modifieringstid�%s: kommandot var "%s", resultatet blev %d +-�%s: fel i tillst�ndsmaskin�%s: otill�ten flagga -- %c +-�%s: ogiltig flagga -- %c +-�%s: flaggan "%c%s" tar inget argument +-�%s: flaggan "%s" �r tvetydig +-�%s: flaggan "%s" beh�ver ett argument +-�%s: flaggan "--%s" tar inget argument +-�%s: flaggan "-W %s" tar inget argument +-�%s: flaggan "-W %s" �r tvetydig +-�%s: flaggan beh�ver ett argument -- %c +-�%s: utdata skulle skriva �ver %s +-�%s: panik: ogiltigt l_value %d +-�%s: f�r tidigt filslut�%s: kan inte �ppna �%s: ok�nd flagga "%c%s" +-�%s: ok�nd flagga "--%s" +-�%s: anv�ndning �r %s [ -s ] [ -v ] [ -l lokaltid ] [ -p posixregler ] [ -d katalog ] +- [ -L skottsekunder ] [ -y �rkontrollprogram ] [ filnamn ... ] +-�%s: anv�ndning �r %s [ -v ] [ -c gr�ns ] zonnamn ... +-�%s: n�r resultatet skrevs: �(PROGRAMFEL) Ingen version k�nd!?�(PROGRAMFEL) Flagga skulle k�nts igen!?�(Ok�nt objekt) +-�(ok�nt fel vid �kthetskontroll - %d)�(ok�nt)�*** Filen "%s" �r strippad: ingen detaljerad analys �r m�jlig +-�*standard in*�-o UTFIL [INFIL]... +-[UTFIL [INFIL]...]�.lib-sektion i a.out korrupt�; undre version = %lu, �vre version = %lu�; varf�r = �<%s> och <%s> �r otill�tna namn f�r intervall�<SP>-tecknet f�r inte vara i klass "%s"�<SP>-tecknet �r inte i klass "%s"�?�Avbruten (SIGABRT)��tkomstr�ttigheter : ��ppnar ett korrupt delat bibliotek�Adressen upptagen�Adressfamilj f�r v�rdnamn st�ds inte�Adressfamiljen st�ds inte av protokollet�Annonseringsfel�Alarmklocka�Argumentlistan f�r l�ng�F�rs�k att ta bort en tabell som inte �r tom�F�rs�k att l�nka in f�r m�nga delade bibliotek��kthetskontroll OK��kthetskontroll misslyckades�SKENOBJEKT +-�Felaktig adress�Felaktig filidentifierare�Felaktigt format p� typsnittsfil�Felaktigt meddelande�Felaktigt systemanrop�Otill�tet v�rde f�r ai_flags�Var strikt POSIX-konform�Bin�rdata +-�Blockspecialfil kr�vs�Problem med poll vid uts�ndning�Brutet r�r�Bussfel�CDS�Begr�nsning av CPU-tid �verskriden�Cache gick ur tiden�Kan inte komma �t ett n�dv�ndigt delat bibliotek�Kan inte ansluta till servern som betj�nar denna dom�n�Kan inte kommunicera med portmapper�Kan inte kommunicera med ypbind�Kan inte kommunicera med ypserv�Kan inte allokera minne�Kan inte tilldela beg�rd adress�Kan inte skapa uttag (socket) f�r uts�ndnings-rpc�Kan inte k�ra ett delat bibliotek direkt�Kan inte ha mer �n en filgenereringsflagga! +-�Kan inte ta emot svar p� uts�ndning�Kan inte registrera tj�nst�Kan inte skicka efter att transportslutpunkten st�ngts�Kan inte skicka uts�ndningspaket�Kan inte s�tta uttagsflaggan (socket option) SO_BROADCAST�Kan inte ange mer �n en infil! +-�Kan inte ange netid-flaggan tillsammans med inetd-flaggan! +-�Kan inte ange netid-flaggan utan TIRPC! +-�Kan inte ange tabellflaggor med ny stil +-�Kanalnummer utanf�r giltigt intervall�Teckenseparator : %c +-�Barnprocess avslutad�Klientens referenser �r f�r svaga�Kolumner : +-�Kommunikationsfel vid s�ndning�Kompilera lokalspecifikation�Datorn packade ihop�Att ber�kna tabellstorlek f�r teckenklasser kan ta ett tag...�Att ber�kna tabellstorlek f�r kollationeringsinformation kan ta ett tag...�F�rbindelse v�gras�F�rbindelse borttagen av partnern�F�rbindelsen dog ut (timeout)��terupptagen�Konvertera kodning i angivna infiler fr�n en kodning till en annan.�Konvertera nyckel till gemener�Copyright � %s Free Software Foundation, Inc. +-Detta �r fri programvara; se k�llkoden f�r kopieringsvillkor. Det finns +-INGEN garanti; inte ens f�r S�LJBARHET eller L�MPLIGHET F�R N�GOT SPECIELLT +-�NDAM�L. +-�Kunde inte skapa loggfil "%s"�Skapa C-huvudfil NAMN inneh�llande symboldefinitioner�Skapa utfil �ven om varningsmeddelanden genererades�Skapa enkel DB-databas fr�n textdata.�Skapad : %s�DES-post f�r n�tnamn %s �r inte unikt +-�KATALOG +-�DNANS�DNS�Databas f�r tabell existerar inte�Databasen �r upptagen�Standard �tkomstr�ttigheter : +-�Destination kr�vs�Enheten �r inte en stream�Enheten �r inte konfigurerad�Enhet eller resurs upptagen�Diffie-Hellmann (%d bitar) +-�Katalog : %s +-�Katalog inte tom�Diskkvot �verskriden�Skapa inte barnprocess, visa meddelanden p� nuvarande tty�Skriv inte meddelanden medans databasen byggs�Anv�nd inte existerande katalog, g�r en ny utfil�Dom�n inte bunden�Emulatorf�lla�POST +-�Krypterat data +-�Post/Tabell-typer �r inkompatibila�Fel i RPC delsystem�Fel vid l�sande av NIS+ kallstartsfil. �r NIS+ installerad?�Fel i ok�nt felsystem: �Fel vid kommunikation till �teranropsprocess�Fel: .netrc kan l�sas av andra.�V�xeln full�Formatfel p� k�rbar fil�FATALT: systemet definierar inte "_POSIX2_LOCALEDEF"�FIL inneh�ller avbildning fr�n symboliska namn till UCS4-v�rden�Misslyckades (ospecificerat fel)�Filidentifierare i felaktigt tillst�nd�Filen existerar�Fill�sning gav d�dl�ge�Filnamn f�r l�ngt�Begr�nsning av filstorlek �verskriden�Fil f�r stor�F�rsta/N�sta-kedja bruten�Aritmetiskt fel�Fullst�ndig resynkronisering kr�vs f�r katalog�Funktion inte implementerad�GRUPP +-�Skr�p i ARGP_HELP_FMT: %s�Skapa meddelandekatalog.\vOm INFIL �r - s� l�ses standard in. Om UTFIL +-�r - s� skrivs resultatet till standard ut. +-�Generiskt systemfel�H�mta lokal-specifik information�Ge ett kort hj�lpmeddelande�Skriv denna hj�lplista�Omotiverat fel�Grupp : %s +-�Gruppflaggor : �Grupppost f�r "%s.%s" grupp: +-�V�nta i SEK sekunder (standardv�rde 3600)�Avringd�Hittar inte "%d" i gruppcache!�Hittar inte "%d" i l�senordscache!�Hittar inte "%s" i gruppcache!�Hittar inte "%s" i v�rdcache!�Hittar inte "%s" i l�senordscache!�V�rddator �r nere�Uppslagning av v�rdnamn misslyckades�I/O m�jligt�INFIL UTFIL +--o UTFIL INFIL +--u INFIL�IOT-f�lla�IVY�Identifierare borttagen�Otill�ten instruktion�Otill�ten objekttyp f�r operationen�Otill�ten s�kning�Filtyp eller format ol�mplig�Ol�mplig "ioctl" f�r enhet�Operation f�r bakgrundsprocess ol�mplig�Informationsbeg�ran�Information:�Infiler:�In/ut formatspecifikation:�In/ut-fel�Internt NIS-fel�Internt ypbind-fel�Avbruten (SIGINT)�Avbrutet systemanrop�Avbrutet systemanrop borde omstartas�Otill�tet objekt f�r operationen�Ogiltigt argument�Ogiltig bak�treferens�Ogiltigt teckenklassnamn�Ogiltiga klientreferenser�Ogiltig klientverifierare�Ogiltigt kollationeringstecken�Ogiltigt inneh�ll i \{\}�Ogiltig l�nk �ver skilda enheter�Ogiltig v�xel�Ogiltig eller inte komplett flerbyte- eller brett tecken�Ogiltigt f�reg�ende regulj�rt uttryck�Ogiltigt intervallslut�Ogiltigt regulj�rt uttryck�Ogiltig �tkomstkod�Ogiltig fr�gedeskriptor�Ogiltig serververifierare�Ogiltig plats��r en katalog��r en namngiven filtyp�Kerberos. +-�D�dad�L�NK +-�LOCAL-post f�r UID %d i katalog %s �r inte unik +-�Niv� 2 stannad�Niv� 2 inte synkroniserad�Niv� 3 stannad�Niv� 3 omstartad�L�nk pekar p� ett otill�tet namn�L�nken har brutits�L�nkantal utanf�r giltigt omr�de�L�nkad objekttyp : �L�nkad till : %s +-�Lokalt dom�nnamn inte satt�Allokeringsfel f�r lokal resurs�Maskinen finns inte p� n�tverket�Felaktigt namn eller otill�tet namn�Obligatoriska respektive valfria argument f�r l�nga flaggor �r obligatoriska repektive valfria �ven f�r korta.�Huvudserver : +-�Huvudserver �r upptagen, full dump omskedulerad.�Minnesallokeringsfel�Minnet slut�Meddelandet f�r l�ngt�Saknat eller felaktigt attribut��ndr. tid : %s��ndring misslyckades��ndringsoperation misslyckades��ndra utdataformat:�Flerhopp f�rs�ktes�NAMN�NAMN +-[-a|-m]�NIS�NIS versionsskillnad klient/server - kan inte betj�na�NIS tabelldatabas �r felaktig�NIS+ operation misslyckades�NIS+ servers kan inte n�s�NIS+ service �r otillg�nglig eller inte installerad�INGET OBJEKT +-�ANTAL�Namn : "%s" +-�Namntj�nst cache-demon�Namn hanteras inte av denna server�Namnet inte unikt i n�tverket�Namn eller tj�nst ok�nd�Namn/post �r inte unik�Namngivet objekt �r inte s�kbart�Beh�ver �kthetsintygare�N�tverket tog bort f�rbindelsen vid omstart�N�tverket �r nere�N�tverket kan inte n�s�Inga CSI-strukturer tillg�ngliga�Inga XENIX-semaforer tillg�ngliga�Ingen adress associerad med v�rdnamn�Ingen adress associerad med namnet�Ingen anod�Ingen buffertplats tillg�nglig�Inga barnprocesser�Inga data tillg�ngliga�Inget filutrymme hos servern�Inga l�s tillg�ngliga�Ingen tr�ff�Inget medium funnet�Inget meddelande av �nskad typ�Inga fler poster i tabelldatabasen�Inget f�reg�ende regulj�rt uttryck�Inga fj�rrprogram registrerade. +-�Ingen v�g till v�rd�Enheten �r full�Enheten finns inte�Filen eller katalogen finns inte�Ingen s�dan nyckel i tabellen�Ingen s�dan tabell i serverns dom�n�Processen finns inte�Icke-NIS+ namnrymd p�tr�ffad�Oreparerbart fel i namnuppslagning�Ingen. +-�Inte hittad, inget s�dant namn�Inte en XENIX-namngiven fil�Inte en katalog�Inte funnet�Ingen huvudserver f�r denna dom�n�Inte �gare�Antal kolumner : %d +-�Antal objekt : %u +-�Numeriskt argument �r utanf�r omr�det�Numeriskt resultat �r utanf�r giltigt omr�de�Objekt #%d: +-�Objektnamn : %s +-�Objekttyp : ��r ett fj�rrobjekt�Objekt med samma namn existerar�Oj�mnt antal citationstecken�Bara root har till�telse att anv�nda denna operation!�Operationen p�g�r redan�Operationen inte till�ten�Operationen st�ds inte�Operationen p�g�r nu�Operationen skulle blockera�Stream-resurserna �r slut�Styr utdata:�V�lj utdata:��gare : %s +-�PRIVAT +-�Paketet �r inte installerat�Parsfel: %s�Delvis lyckat�Skickat objekt �r inte samma objekt hos servern��tkomst nekas�Str�mavbrott�F�r tidigt slut p� regulj�rt uttryck�Skriv inneh�llet i databasen, en post per rad�Skriv ut nuvarande konfigurationsstatistik�Skriv mer meddelanden�Skriv programversion�Troligtvis lyckat�F�rmodligen inte funnen�Profileringsklocka�Styrprogram f�r protokoll inte anslutet�Protokollfel�Protokollfamiljen st�ds ej�Protokollet ej tillg�ngligt�Protokollet st�ds ej�Fel protokolltyp f�r uttag (socket)�Fr�ga ogiltig f�r namngiven tabell�L�mnad�RFS-specifikt fel�RPC d�lig procedur f�r program�RPC-fel vid NIS-operation�RPC programmet ej tillg�ngligt�RPC fel programversion�RPC struktur d�lig�RPC fel version�RPC: (ok�nd felkod)�RPC: Fel vid �kthetskontroll�RPC: Kan inte avkoda resultatet�RPC: Kan inte koda argumentet�RPC: Misslyckades (ospecificerat fel)�RPC: Inkompatibla versioner av RPC�RPC: Fel i port�vers�ttare�RPC: Procedur inte tillg�nglig�RPC: Programmet inte registrerat�RPC: Programmet otillg�ngligt�RPC: Program/version-inkompatibilitet�RPC: Fj�rrsystemsfel�RPC: Server kan inte avkoda argumenten�RPC: Lyckat�RPC: Tiden l�pte ut�RPC: Kan inte ta emot�RPC: Kan inte skicka�RPC: Ok�nd v�rdmaskin�RPC: Ok�nt protokoll�RSA (%d bitar) +-�RTLD_NEXT anv�nds i kod som inte �r dynamiskt laddad�L�s och visa profildata f�r delat objekt�L�s konfigurationsdata fr�n NAMN�Filsystemet endast l�sbart�Realtidssignal %d�Regulj�rt uttryck f�r stort�I/O-fel p� fj�rrmaskin�Fj�rradress �ndrades�Ta bort l�senord eller g�r filen ol�sbar f�r andra��ppna delat object "%s" igen misslyckades�Replikerad : +-�Rapportera fel till %s. +-�Rapportera fel med programmet "glibcbug" till <bugs@gnu.org>. +-Rapportera fel p� �vers�ttningen till <sv@li.org>. +-�Argument f�r f�rfr�gan felaktiga�Resolver-fel 0 (inget fel)�Internt fel i namnl�sare (resolver)�Resursd�dl�ge undveks�F�rlorad resurs�Resursen tillf�lligt otillg�nglig�Resultat skickat till �teranropsprocessen�SHOBJ [PROFDATA]�SUNYP�S�kv�g : %s +-�Segmenteringsfel�Server upptagen, f�rs�k igen�Server har slut p� minne�Server f�rkastade kreditiv�Server f�rkastade verifierare�Servname st�ds inte f�r ai_socktype�S�tt programnamnet�Avsluta servern�Signal 0�Uttagsoperation p� icke-uttag (socket)�Uttagstyp (socket) st�ds inte�Mjukvara orsakade f�rbindelsebrott�Tyv�rr, du �r inte root +-�K�lldefinitioner finns i FILE�Srmount-fel�Stackfel�F�rlegat NFS-filhandtag�Starta ANTAL tr�dar�Status : %s +-�Stoppad�Stoppad (signal)�Stoppad (terminall�sning)�Stoppad (terminalskrivning)�Streams-r�rfel�Strukturen beh�ver st�das�Lyckat�Undertryck varningar och informationsmeddelanden�Symboliska teckennamn definierade i FILE�Systemfel�Systeminformation:�Allokeringsfel f�r systemresurs�Systemets kataloger f�r teckentabeller: %s +- repertoartabeller: %s +- lokal-s�kv�g : %s +-%s�TABELL +-�Tabelltyp : %s +-�Namnuppslagning misslyckades tempor�rt�Avslutad�Kodfil upptagen�F�ljande lista inneh�ller alla teckenupps�ttningar som �r k�nda. Detta +-betyder inte n�dv�ndigtvis att alla kombinationer av dessa namn kan ges +-som FR�N och TILL argument. En teckenupps�ttning kan ha flera olika namn +-(alias). +- En del av namnen �r inte str�ngar utan regulj�ra uttryck och dessa +-matchar varianter av namn som kan ges som argument till programmet. +- +- �Livsl�ngd : �Klockan ringde�F�r m�nga attribut�F�r m�nga niv�er av symboliska l�nkar�F�r m�nga l�nkar�F�r m�nga �ppna filer�F�r m�nga �ppna filer i systemet�F�r m�nga processer�F�r m�nga referenser: kan inte skarva�F�r m�nga anv�ndare�Sp�rningsf�lla�Avslutande omv�nt snedstreck��vers�ttaren dog�Transportslutpunkten �r redan f�rbunden�Transportslutpunkten �r inte f�rbunden�F�rs�k med "%s --help" eller "%s --usage" f�r mer information +-�Provar %s... +-�Typ : %s +-�OK�ND�Kan inte bevisa �kthet hos NIS+ klient�Kan inte bevisa �kthet hos NIS+ server�Kan inte skapa �teranrop�Kan inte skapa process hos server�Ok�nd (typ = %d, bitar = %d) +-�Ok�nt .netrc-nyckelord %s�Ok�nd NIS-felkod�Ok�nd databas: %s +-�Ok�nt fel�Ok�nt fel �Ok�nd v�rd�Ok�nt objekt�Ok�nd flagga: %s %s %s�Ok�nt fel hos namnl�sare (resolver)�Ok�nt fel hos server�Ok�nd signal %d�Ok�nt systemfel�Ok�nt ypbind-fel�Obalanserade ( eller \(�Obalanserade ) eller \)�Obalanserade [ eller [^�Obalanserad \{�Ok�nd variabel "%s"�Akut I/O-tillst�nd�Anv�ndning:�Anv�ndning: %s variabelnamn [s�kv�g] +-�Anv�ndning: rpcinfo [ -n portnr ] -u v�rd prognr [ versnr ] +-�Anv�ndarsignal 1�Anv�ndarsignal 2�V�rdet f�r stort f�r definierad datatyp�Alarmklocka - virtuell tid�Vilt resultat fr�n kommandok�rning��ndrat f�nster�Skriv namn p� tillg�ngliga teckenupps�ttningar�Skriv namn p� tilg�ngliga lokaler�Skriv namn p� valda kategorier�Skriv namn p� valda nyckelord�Skriv resultatet till NAMN�Skriven av %s. +-�Fel typ p� mediet�X500�XCHS�YPBINDPROC_DOMAIN: %s +-�Ja, meningen med livet �r 42�Du strulade till det den h�r g�ngen�Zon-forts�ttningsradens sluttid �r inte efter sluttiden p� f�reg�ende rad�[FIL...]�"%1$s" definition slutar ej med "END %1$s"�"%s" �r inte en korrekt profildatafil f�r "%s"�"-1" m�ste vara sista post i f�lt "%s" i kategori "%s"�"..." f�r endast anv�ndas f�r post "..." och post "UNDEFINED"�"from" f�rv�ntades efter f�rsta argumentet till "collating-element"�"fr�n"-str�ng i deklaration av kollationeringselement inneh�ller ok�nt tecken�ai_family st�ds ej�ai_socktype st�ds inte�k�r redan�argumentet till <%s> m�ste vara ett enskilt tecken�argumentet till "%s" m�ste vara ett enskilt tecken�auth_none.c - Fatalt kodningsproblem�authunix_create: minnet slut +-�d�ligt argument�ol�mplig �gare�tomt "FROM"-f�lt p� "Link"-rad�tomt "TO"-f�lt p� "Link"-rad�block frigjort tv� g�nger +-�felaktig mcheck_status, biblioteket �r felaktigt +-�uts�ndning: ioctl (h�mta gr�nssnittskonfiguration)�uts�ndning: ioctl (h�mta gr�nssnittsflaggor)�buffert fl�dar �ver�cache_set: kunde inte allokera ny rpc-buffert�cache_set: offerallokering misslyckades�cache_set: offer hittades ej�kan inte avg�ra tidszonsf�rkortning att anv�nda just efter "until"-tid�kan inte �ndra procedurnummer %d +-�kan inte ta status p� lokalfil "%s"�kan inte allokera symboldata�kan inte skapa intern deskriptor�kan inte skapa interna deskriptorer�kan inte f� uttag (socket) att acceptera f�rbindelser: %s�kan inte hitta C preprocessor: %s +-�kan inte hitta n�gon C preprocessor (cpp) +-�Kan inte hantera �ldre f�rfr�gansversion %d, nuvarande version �r %d�kan inte s�tta in kollationselement "%.*s"�kan inte s�tta in i resultattabell�kan inte s�tta in ny kollationssymbolsdefinition: %s�kan inte ladda profildata�kan inte �ppna�kan inte �ppna "%s"�kan inte �ppna databasfil "%s": %s�kan inte �ppna infil "%s"�kan inte �ppna lokaldefinitionsfil "%s"�kan inte �ppna utfil�kan inte �ppna utfil "%s"�kan inte �ppna utfil "%s" f�r kategori "%s"�kan inte �ppna uttag (socket): %s�kan inte bearbeta sorteringsspecifikation�kan inte l�sa teckenupps�ttningskatalog "%s"�kan inte l�sa konfigurationsdata, detta �r fatalt�kan inte l�sa fr�n klient�kan inte l�sa huvud fr�n "%s"�kan inte l�sa lokalkatalog "%s"�kan inte l�sa lokalfil "%s"�kan inte l�sa repertoartabell "%s"�kan inte l�sa statistikdata�kan inte ta status p� fil "%s": %s�kan inte skriva utfiler till "%s"�kan inte skriva resultat: %s�kan inte skriva statistik: %s�kan inte skriva till klient�kategoridata beg�rd mer �n en g�ng: borde inte intr�ffa�tecknet %s"%s" i klass "%s" m�ste vara i klass "%s"�tecknet %s"%s" i klass "%s" f�r inte vara i klass "%s"�tecknet <SP> inte definierat i teckenupps�ttning�tecknet "%s" inte definierat men beh�vs som standardv�rde�teckenklass "%s" redan definierad�teckenupps�ttning "%s" redan definierad�teckenupps�ttningsfil "%s" finns inte�clnt_raw.c - Fatalt fel vid serialisering�clnttcp_create: minnet slut +-�clntudp_create: minnet slut +-�clntunix_create: minnet slut +-�kollationselement "%.*s" finns mer �n en g�ng: rad ignorerad�kollationssymbol "%.*s" finns mer �n en g�ng: rad ignorerad�kollationssymbol f�rv�ntades efter "%s"�koppla till adress %s: �konstant eller identifierare f�rv�ntad�konvertering fr�n "%s" till "%s" st�djs inte�konvertering avslutades p� grund av problem med att skriva resultatet�kunde inte skapa en rpc-server +-�kunde inte registrera prog %d vers %d +-�databas [nyckel ...]�standardteckenupps�ttningsfil "%s" inte hittad�riktningsflagga i str�ng %d i "era"-f�lt i kategori "%s" �r varken "+" eller "-"�riktningsflagga i str�ng %d i "era"-f�lt i kategori "%s" �r inte ett enskilt tecken�duplicerat teckennamn "%s"�dubbla definitioner av kollationselement�dubbla definitioner f�r tecken "%.*s"�duplicerad nyckel�duplicerad definition av m�ngd�duplicerat zonnamn %s (fil "%s", rad %d)�duplicerad meddelandeidentifierare�duplicerat meddelandenummer�tom teckenstr�ng�tomt viktnamn: rad ignorerad�enablecache: cache redan p�slagen�enablecache: kunde inte allokera cache�enablecache: kunde inte allokera cache-data�enablecache: kunde inte allokera cache-fifo�kodning f�r resultatet�kodning av originaltexten�slutpunkt f�r intervall �r st�rre �n startv�rdet�fel vid st�ngning av indata "%s"�fel vid st�ngning av utfilen�fel vid st�ngning av profildatafilen�fel vid ins�ttning av kollationselement i hashtabellen�fel vid ins�ttning i hashtabellen�fel n�r indata l�stes�f�rv�ntar str�ngargument f�r "copy"�f�rv�ntad forts�ttningsrad ej funnen�misslyckades att ladda delat objekt "%s"�misslyckades att ladda symboldata�misslyckades att mappa (mmap) profildatafilen�misslyckades att starta konverteringsprocessen�misslyckades skriva data f�r kategori "%s"�fcntl_ F_SETFD�f�lt "%s" i kategori "%s" inte definierat�f�lt "%s" i kategori "%s" odefinierat�fil "%s" finns redan och kan bli �verskriven +-�fr�nv�rde f�r "collating-element" m�ste vara en str�ng�misslyckades ta status (fstat)�skr�p i slutet av teckenkodsspecifikation�skr�p i slutet av nummer�skr�p i slutet av till�ggsv�rde i str�ng %d i "era"-f�lt i kategori "%s"�skr�p i slutet av startdatum i str�ng %d i "era"-f�lt i kategori "%s"�skr�p i slutet av slutdatum i str�ng %d i "era"-f�lt i kategori "%s"�generera anropsgraf�generera platt profil med antal och tider�get_myaddress: ioctl (h�mta gr�nssnittskonfiguration)�getent - h�mta poster fr�n administrativ databas�handle_request: beg�ran mottagen (version = %d)�h�rd l�nk misslyckades, anv�nder symbolisk l�nk�h�rdl�nkad n�gonstans�otill�tet "CORRECTION"-f�lt p� "Leap"-rad�otill�tet "Rolling/Stationary"-f�lt p� "Leap"-rad�otill�ten teckenkonstant i str�ng�otill�tet tecken i fil: �otill�tet kollationselement�otill�ten definition�otill�ten kodning given�otill�ten teckensekvens vid str�ngslut�otill�ten indatasekvens vid position %ld�otill�tna namn f�r teckenintervall�otill�ten n�ttyp: "%s" +-�otill�tet tal f�r till�ggsv�rde i str�ng %d i "era"-f�lt i kategori "%s"�otill�tet tal f�r m�ngd�otill�tet startdatum i str�ng %d i "era"-f�lt i kategori "%s"�otill�tet slutdatum i str�ng %d i "era"-f�lt i kategori "%s"�implementationsbegr�nsning: inte fler �n %d teckenklasser till�tna�implementationsbegr�nsning: inte fler �n %d teckenupps�ttningar till�tet�ofullst�ndigt tecken eller skift-sekvens i slutet p� buffert�felaktigt formaterad rad�inrad av ok�nd typ�internt fel (otill�ten deskriptor)�internt fel - addtype anropad med felaktig isdst�internt fel - addtype anropad med felaktig ttisgmt�internt fel - addtype anropad med felaktig ttisstd�internt fel i %s, rad %u�ogiltigt UTC-till�gg�ogiltigt f�rkortningsformat�ogiltig dag i m�naden�ogiltigt slut�r�ogiltigt skott�r�ogiltiga flaggor f�r dlopen()�ogiltigt m�nadsnamn�ogiltigt sparad tid�ogiltigt start�r�ogiltig tid p� dagen�ogiltigt veckodagsnamn�nyckell�ngd i beg�ran f�r l�ng: %Zd�rad efter ellips m�ste inneh�lla teckendefinition�rad f�re ellips inneh�ller inte definition f�r teckenkonstant�f�r l�ng rad�visa alla k�nda teckenupps�ttningar�lokalfil "%s", anv�nd i "copy", inte funnen�misslyckades ta status (lstat)�felaktig rad ignorerad�mappning av sektionshuvuds str�ngtabell misslyckades�mappning av sektionshuvud misslyckades�minnet f�rst�rt f�re allokerat block +-�minnet f�rst�rt efter slutet p� allokerat block +-�minne slut�minnet slut +-�minnet �r konsistent, biblioteket �r felaktigt +-�eraformat i str�ng %d i "era"-f�lt i kategori "%s" saknas�eranamn i str�ng %d i "era"-f�lt i kategori "%s" saknas�namnl�s regel�varken original- eller m�lkodning angvet�netname2user: (nis+ uppslagning) %s +-�netname2user: DES-post f�r %s i katalog %s �r inte unik�netname2user: LOCAL-post f�r %s i katalog %s �r inte unik�netname2user: fattas grupp-id lista i "%s".�netname2user: principalnamn "%s" f�r l�ngt�netname2user: borde inte ha uid 0�aldrig registrerat prog %d +-�inget <Uxxxx> eller <Uxxxxxxxx> v�rde angivet�felaktigt regulj�rt uttryck f�r f�lt "%s" i kategori "%s": %s�ingen dag i m�naden matchar regeln�ingen definition av "UNDEFINED"�inget filnam f�r profildata angivet och delat objekt "%s" saknar "soname"�inget annat nyckelord ska anges n�r "copy" anv�nds�ingen utfil skapad p� grund av varningar�ingen repertoarmap angiven: kan inte forts�tta�inget symboliskt namn givet�inget symboliskt namn givet f�r slutet av intervallet�ingen vikt definierad f�r symbol "%s"�inte en normal fil�nscd konfiguration: +- +-%15d servers fels�kningsl�ge +-�nscd k�r inte! +-�endast definition av "WIDTH" f�r f�lja definitionen av "CHARMAP"�originalkodning inte angiven med "-f"�resultatfil�pmap_getmaps rpc problem�poll: protokollfel i f�rbindelseupps�ttning +-�preprocessorfel�skriv lista med r�knade v�gar och antal anv�ndningar�skriv information om k�rning�problem l�sa "%s"�profildatafil "%s" st�mmer inte f�r delat objekt "%s"�program %lu �r inte tillg�ngligt +-�program %lu version %lu �r inte tillg�ngligt +-�program %lu version %lu redo och v�ntar +-�rcmd: poll (s�tter upp standard fel): %m +-�rcmd: uttag (socket): Alla portar anv�nds +-�rcmd: write: (s�tter upp standard fel): %m +-�registerrpc: minnet slut +-�upprepat skottsekundstillf�lle�hittar inte repertoartabell "%s"�rpcgen: arglist kodningsfel +-�rpcgen: f�r m�nga "define" +-�rpcinfo: %s �r en ok�nd v�rd +-�rpcinfo: %s �r en ok�nd tj�nst +-�rpcinfo: Kunde inte ta bort registrering av prog %s version %s +-�rpcinfo: uts�ndning misslyckades: %s +-�rpcinfo: kan inte kontakta portmapper�samma regel i flera filer�fattas data vid l�sning av beg�ransnyckel: %s�fattas data vid l�sning av beg�ran: %s�ofullst�ndig skrivning i %s: %s�uttag (socket): protokollfel i f�rbindelseupps�ttning +-�sorteringsordning "forward" och "backward" �r �msesidigt uteslutande�specifikation av sorteringsvikter f�r kollationssymbol verkar inte vettig�standard in�standard ut�startdatum �r otill�tet i str�ng %d i "era"-f�lt i kategori "%s"�start�r �r st�rre �n slut�r�start�r f�r stort f�r att kunna representeras�start�r f�r litet f�r att kunna representeras�slutdatum �r otill�tet i str�ng %d i "era"-f�lt i kategori "%s"�svc_run: - select misslyckades�svc_tcp.c - kan inte anropa getsockname eller listen�svc_tcp.c - problem att skapa tcp-uttag (socket)�svc_tcp: makefd_xprt: minnet slut +-�svc_unix.c - problem att skapa AF_UNIX uttag (socket)�svc_unix.c - kan inte anropa getsockname eller listen�svc_unix: makefd_xprt: minnet slut +-�svctcp_create: minnet slut +-�svcudp_create - kan inte anropa getsockname�svcudb_create: minnet slut +-�svcudp_create: problem att skapa uttag (socket)�svcunix_create: minnet slut +-�symbol f�r flerteckenskollationselement "%.*s" duplicerar elementdefinition�symbol f�r flerteckenskollationselement "%.*s" duplicerar annan +-elementdefinition�symbol f�r flerteckenskollationselement "%.*s" duplicerar annan +-symboldefinition�symbol f�r flerteckenskollationselement "%.*s" duplicerar symboldefinition�symbol f�r flerteckenskollationselement "%.*s" duplicerar symboliskt +-namn i teckenupps�ttning�syntaxfel i definition av %s: %s�syntaxfel i direktivet "order_start"�syntaxfel i teckenklassdefinition�syntaxfel i teckenkonverteringsdefinition�syntaxfel i kollationssorteringsdefinition�syntaxfel i kollationsdefinition�syntaxfel i definition av kategorin LC_CTYPE�syntaxfel i definition av ny teckenklass�syntaxfel i definition av ny teckenupps�ttning�syntaxfel i definition av meddelandelokal�syntaxfel i definition av monet�rlokal�syntaxfel i definition av numerisk lokal�syntaxfel i sorteringsspecifikation�syntaxfel i prolog: %s�syntaxfel i repertoartabellsdefinition: %s�syntaxfel i definition av tidslokal�syntaxfel: inte inne i en lokaldefinition�m�lkodning ej angivet med flagga "-t"�detta �r den f�rsta definitionen�tid f�re noll�f�r stort tidsv�rde�f�r f� byte i teckenkodning�f�r m�nga tecken i teckenkodning�f�r m�nga teckenklasser definierade�f�r m�nga skottsekunder�f�r m�nga lokala tidstyper�f�r m�nga �verg�ngar?!�f�r m�nga vikter�f�r m�nga eller f�r l�nga tidszonf�rkortningar�avslutande skr�p vid radslutet�problem att svara till prog %d +-�tv� rader efter varann som har "..." �r inte till�tet�satte typ p� endast ett �r�kan inte allokera buffert f�r indata�kan inte avallokera argument�odefinierad�ok�nt tecken "%s"�ok�nt tecken i f�lt "%s" i kategori "%s"�ok�nt kollationsdirektiv�ok�nt direktiv "%s": rad ignorerad�ok�nt fel fr�n iconv() %d�ok�nd m�ngd "%s"�ok�nd symbol "%.*s": rad ignorerad�besv�rlig zon�oavslutat meddelande�oavslutad str�ng�oavslutad str�ngkonstant�oavslutat symboliskt namn�oavslutat viktnamn��vre gr�ns i intervall �r inte mindre �n undre gr�ns�anv�ndning: %s infil +-�anv�nder 29/2 i icke-skott�r�v�rdet p� %s m�ste vara heltal�v�rde p� <%s> m�ste vara mellan 1 och 4�v�rde p� f�lt "%s" i kategori "%s" f�r inte vara tom str�ng�v�rdet p� <mb_cur_max> m�ste vara st�rre �n v�rdet p� <mb_cur_min>�v�rdet p� f�ltet "int_curr_symbol" i kategorin LC_MONETARY st�mmer inte med v�rden i ISO 4217�v�rdet p� f�ltet "int_curr_symbol" i kategorin LC_MONETARY har fel l�ngd�v�rden p� f�lt "%s" i kategorin "%s" m�ste vara mindre �n 127�n�r f�rbindelse accepterades: %s�n�r cache-post allokerades�n�r hashtabellspost allokerades�n�r nyckelkopia allokerades�n�r gammal katalogfil �ppnades�n�r utdata f�rbereddes�n�r databasen l�stes�n�r status togs p� profildatafilen�n�r databasfilen skrevs�ofullst�nding skrivning�skrivbar f�r andra �n �garen�fel antal argument�fel antal f�lt p� "Leap"-rad�fel antal f�lt p� "Link"-rad�fel antal f�lt p� "Rule"-rad�fel antal f�lt p� "Zone"-forts�ttningsrad�fel antal f�lt p� "Zone"-rad�xdr_reference: minnet slut +-�xdrrec_create: minnet slut +-�yp_update: kan inte omvandla v�rd till n�tnamn +-�yp_update: kan inte h�mta serveradress +-� +\ No newline at end of file +diff -Naur ../glibc-2.1.3/po/sv.po glibc-2.1.3/po/sv.po +--- ../glibc-2.1.3/po/sv.po 1999-01-24 07:37:32.000000000 -0800 ++++ glibc-2.1.3/po/sv.po 1999-01-25 09:45:47.000000000 -0800 +@@ -1,7 +1,7 @@ + # GNU libc message catalog for swedish + # Copyright � 1996, 1998 Free Software Foundation, Inc. + # Jan Dj�rv <Jan.Djarv@mbox200.swipnet.se>, 1996, 1998. +-# $Revision: 1.5 $ ++# $Revision: 1.1.1.1 $ + # + msgid "" + msgstr "" +diff -Naur ../glibc-2.1.3/posix/glob/ChangeLog glibc-2.1.3/posix/glob/ChangeLog +--- ../glibc-2.1.3/posix/glob/ChangeLog 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/posix/glob/ChangeLog 1998-02-07 12:24:16.000000000 -0800 +@@ -0,0 +1,23 @@ ++Sat Jul 20 21:55:31 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> ++ ++ Win32 hacks from <Rob_Tulloh@tivoli.com>. ++ * posix/glob.c [WIN32]: Don't include <pwd.h>; don't use d_ino; ++ use void * for my_realloc; include <malloc.h> 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 <roland@delasyd.gnu.ai.mit.edu> ++ ++ * 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 <roland@delasyd.gnu.ai.mit.edu> ++ ++ * posix/glob.c: Include <alloca.h> only [HAVE_ALLOCA_H], not [sparc]. ++ ++Fri Jun 21 00:27:51 1996 Roland McGrath <roland@delasyd.gnu.ai.mit.edu> ++ ++ * posix/fnmatch.c (fnmatch): Fix \*[*?]+ case to increment name ptr ++ only for ?s, not for *s. Fix from Chet Ramey. ++ +diff -Naur ../glibc-2.1.3/posix/glob/Makefile.ami glibc-2.1.3/posix/glob/Makefile.ami +--- ../glibc-2.1.3/posix/glob/Makefile.ami 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/posix/glob/Makefile.ami 1998-02-07 12:24:16.000000000 -0800 +@@ -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 Library General Public License ++# as published by the Free Software Foundation; either version 2 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 ++# 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. ++ ++# 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 -Naur ../glibc-2.1.3/posix/glob/Makefile.in glibc-2.1.3/posix/glob/Makefile.in +--- ../glibc-2.1.3/posix/glob/Makefile.in 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/posix/glob/Makefile.in 1998-02-07 12:24:16.000000000 -0800 +@@ -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 Library General Public License ++# as published by the Free Software Foundation; either version 2 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 ++# Library General Public License for more details. ++ ++# You should have received a copy of the GNU Library General Public ++# License along with this library; see the file COPYING.LIB. If ++# not, write to the Free Software Foundation, Inc., 675 Mass Ave, ++# Cambridge, MA 02139, 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 -Naur ../glibc-2.1.3/posix/glob/SCOPTIONS glibc-2.1.3/posix/glob/SCOPTIONS +--- ../glibc-2.1.3/posix/glob/SCOPTIONS 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/posix/glob/SCOPTIONS 1998-02-07 12:24:16.000000000 -0800 +@@ -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 -Naur ../glibc-2.1.3/posix/glob/SMakefile glibc-2.1.3/posix/glob/SMakefile +--- ../glibc-2.1.3/posix/glob/SMakefile 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/posix/glob/SMakefile 1998-02-07 12:24:16.000000000 -0800 +@@ -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 Library General Public License ++# as published by the Free Software Foundation; either version 2 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 ++# 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. ++ ++# 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 -Naur ../glibc-2.1.3/posix/glob/configure glibc-2.1.3/posix/glob/configure +--- ../glibc-2.1.3/posix/glob/configure 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/posix/glob/configure 1998-02-07 12:24:21.000000000 -0800 +@@ -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 <<EOF ++#ifdef __GNUC__ ++ yes; ++#endif ++EOF ++if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:601: \"$ac_try\") 1>&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 <<EOF ++#line 709 "configure" ++#include "confdefs.h" ++#include <assert.h> ++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 <<EOF ++#line 724 "configure" ++#include "confdefs.h" ++#include <assert.h> ++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 <<EOF ++#line 751 "configure" ++#include "confdefs.h" ++#ifdef _AIX ++ yes ++#endif ++ ++EOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&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 ++#line 778 "configure" ++#include "confdefs.h" ++#include <minix/config.h> ++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 <<EOF ++#line 843 "configure" ++#include "confdefs.h" ++ ++int main() { return 0; } ++int t() { ++ ++/* Ultrix mips cc rejects this. */ ++typedef int charset[2]; const charset x; ++/* SunOS 4.1.1 cc rejects this. */ ++char const *const *ccp; ++char **p; ++/* NEC SVR4.0.2 mips cc rejects this. */ ++struct point {int x, y;}; ++static struct point const zero = {0,0}; ++/* AIX XL C 1.02.0.0 rejects this. ++ It does not let you subtract one const X* pointer from another in an arm ++ of an if-expression whose if-part is not a constant expression */ ++const char *g = "string"; ++ccp = &g + (g ? g-g : 0); ++/* HPUX 7.0 cc rejects these. */ ++++ccp; ++p = (char**) ccp; ++ccp = (char const *const *) p; ++{ /* SCO 3.2v4 cc rejects this. */ ++ char *t; ++ char const *s = 0 ? (char *) 0 : (char const *) 0; ++ ++ *t++ = 0; ++} ++{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ ++ int x[] = {25, 17}; ++ const int *foo = &x[0]; ++ ++foo; ++} ++{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ ++ typedef const int *iptr; ++ iptr p = 0; ++ ++p; ++} ++{ /* AIX XL C 1.02.0.0 rejects this saying ++ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ ++ struct s { int j; const int *ap[3]; }; ++ struct s *b; b->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 <<EOF ++#line 921 "configure" ++#include "confdefs.h" ++main(){return(0);} ++EOF ++{ (eval echo configure:925: \"$ac_link\") 1>&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 <<EOF ++#line 943 "configure" ++#include "confdefs.h" ++#include <stdlib.h> ++#include <stdarg.h> ++#include <string.h> ++#include <float.h> ++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 ++#line 966 "configure" ++#include "confdefs.h" ++#include <string.h> ++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 ++#line 984 "configure" ++#include "confdefs.h" ++#include <stdlib.h> ++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 <<EOF ++#line 1005 "configure" ++#include "confdefs.h" ++#include <ctype.h> ++#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 ++#line 1043 "configure" ++#include "confdefs.h" ++#include <$ac_hdr> ++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 <<EOF ++#define $ac_tr_hdr 1 ++EOF ++ ++else ++ echo "$ac_t""no" 1>&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 <<EOF ++#line 1081 "configure" ++#include "confdefs.h" ++#include <sys/types.h> ++#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 <<EOF ++#define $ac_tr_hdr 1 ++EOF ++ ac_header_dirent=$ac_hdr; break ++else ++ echo "$ac_t""no" 1>&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 <<EOF ++#line 1121 "configure" ++#include "confdefs.h" ++ ++int main() { return 0; } ++int t() { ++opendir() ++; return 0; } ++EOF ++if { (eval echo configure:1129: \"$ac_link\") 1>&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 <<EOF ++#line 1156 "configure" ++#include "confdefs.h" ++ ++int main() { return 0; } ++int t() { ++opendir() ++; return 0; } ++EOF ++if { (eval echo configure:1164: \"$ac_link\") 1>&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 <<EOF ++#line 1192 "configure" ++#include "confdefs.h" ++#include <sys/types.h> ++#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 <<EOF ++#line 1223 "configure" ++#include "confdefs.h" ++#include <alloca.h> ++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 <<EOF ++#line 1255 "configure" ++#include "confdefs.h" ++ ++#ifdef __GNUC__ ++# define alloca __builtin_alloca ++#else ++# if HAVE_ALLOCA_H ++# include <alloca.h> ++# 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 <<EOF ++#line 1314 "configure" ++#include "confdefs.h" ++#if defined(CRAY) && ! defined(CRAY2) ++webecray ++#else ++wenotbecray ++#endif ++ ++EOF ++if (eval "$ac_cpp conftest.$ac_ext") 2>&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 <<EOF ++#line 1343 "configure" ++#include "confdefs.h" ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func(); below. */ ++#include <assert.h> ++/* 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 <<EOF ++#define CRAY_STACKSEG_END $ac_func ++EOF ++ ++ break ++else ++ echo "$ac_t""no" 1>&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 <<EOF ++#line 1397 "configure" ++#include "confdefs.h" ++find_stack_direction () ++{ ++ static char *addr = 0; ++ auto char dummy; ++ if (addr == 0) ++ { ++ addr = &dummy; ++ return find_stack_direction (); ++ } ++ else ++ return (&dummy > 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 <<EOF ++#define STACK_DIRECTION $ac_cv_c_stack_direction ++EOF ++ ++fi ++ ++echo $ac_n "checking for strcoll""... $ac_c" 1>&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 <<EOF ++#line 1441 "configure" ++#include "confdefs.h" ++#include <string.h> ++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 <<EOF ++#! /bin/sh ++# Generated automatically by configure. ++# Run this file to recreate the current configuration. ++# This directory was configured as follows, ++# on host `(hostname || uname -n) 2>/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 <<EOF ++ ++# Protect against being on the right side of a sed subst in config.status. ++sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; ++ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > 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 <<EOF ++ ++CONFIG_FILES=\${CONFIG_FILES-"Makefile"} ++EOF ++cat >> $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 -Naur ../glibc-2.1.3/posix/glob/configure.bat glibc-2.1.3/posix/glob/configure.bat +--- ../glibc-2.1.3/posix/glob/configure.bat 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/posix/glob/configure.bat 1998-02-07 12:24:21.000000000 -0800 +@@ -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 -Naur ../glibc-2.1.3/posix/glob/configure.in glibc-2.1.3/posix/glob/configure.in +--- ../glibc-2.1.3/posix/glob/configure.in 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/posix/glob/configure.in 1998-02-07 12:24:21.000000000 -0800 +@@ -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 -Naur ../glibc-2.1.3/posix/id.c glibc-2.1.3/posix/id.c +--- ../glibc-2.1.3/posix/id.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/posix/id.c 1999-06-30 09:00:24.000000000 -0700 +@@ -0,0 +1,176 @@ ++/* Copyright (C) 1991, 1995, 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 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. */ ++ ++#include <stdio.h> ++#include <unistd.h> ++#include <stdlib.h> ++#include <grp.h> ++#include <pwd.h> ++#include <limits.h> ++#include <sys/types.h> ++ ++ ++static void ++print_grpname (id, parens) ++ gid_t id; ++ int parens; ++{ ++ const struct group *const g = getgrgid (id); ++ if (g == NULL) ++ { ++ if (parens) ++ return; ++ else ++ { ++ fprintf (stderr, _("Couldn't find name for group %d\n"), id); ++ exit (EXIT_FAILURE); ++ } ++ } ++ ++ if (parens) ++ printf ("(%s)", g->gr_name); ++ else ++ puts (g->gr_name); ++} ++ ++static void ++print_pwdname (id, parens) ++ uid_t id; ++ int parens; ++{ ++ const struct passwd *const p = getpwuid (id); ++ if (p == NULL) ++ { ++ if (parens) ++ return; ++ else ++ { ++ fprintf (stderr, _("Couldn't find name for user %d\n"), (int) id); ++ exit (EXIT_FAILURE); ++ } ++ } ++ ++ if (parens) ++ printf ("(%s)", p->pw_name); ++ else ++ puts (p->pw_name); ++} ++ ++int ++main (argc, argv) ++ int argc; ++ char **argv; ++{ ++ int print_gid = 1, print_uid = 1; ++ int real = 0, name = 0; ++ int error = 0; ++ int c; ++ ++ uid_t ruid = getuid (), euid = geteuid (); ++ gid_t rgid = getgid (), egid = getegid (); ++ ++ while ((c = getopt (argc, argv, "gurn")) != -1) ++ switch (c) ++ { ++ default: ++ error = 1; ++ break; ++ ++ case 'g': ++ print_gid = 1; ++ print_uid = 0; ++ break; ++ ++ case 'u': ++ print_uid = 1; ++ print_gid = 0; ++ break; ++ ++ case 'r': ++ real = 1; ++ break; ++ ++ case 'n': ++ name = 1; ++ break; ++ } ++ ++ if (error || argc != optind) ++ { ++ fputs (_("Usage: id [-gurn]\n"), stderr); ++ exit (EXIT_FAILURE); ++ } ++ ++ if (print_uid && !print_gid) ++ { ++ const uid_t uid = real ? ruid : euid; ++ if (name) ++ print_pwdname (uid, 0); ++ else ++ printf ("%d\n", (int) uid); ++ } ++ else if (print_gid && !print_uid) ++ { ++ const gid_t gid = real ? rgid : egid; ++ if (name) ++ print_grpname (gid, 0); ++ else ++ printf ("%d\n", (int) gid); ++ } ++ else ++ { ++#if NGROUPS_MAX > 0 ++ gid_t groups[NGROUPS_MAX]; ++ int ngroups; ++ ngroups = getgroups (NGROUPS_MAX, groups); ++#endif ++ ++ printf ("uid=%d", (int) ruid); ++ print_pwdname (ruid, 1); ++ printf (" gid=%d", (int) rgid); ++ print_grpname (rgid, 1); ++ if (euid != ruid) ++ { ++ printf (" euid=%d", (int) euid); ++ print_pwdname (euid, 1); ++ } ++ if (egid != rgid) ++ { ++ printf (" egid=%d", (int) egid); ++ print_grpname (egid, 1); ++ } ++ ++#if NGROUPS > 0 ++ if (ngroups > 0) ++ { ++ size_t i; ++ printf (" groups=%d", (int) groups[0]); ++ print_grpname (groups[0], 1); ++ for (i = 1; i < ngroups; ++i) ++ { ++ printf (", %d", (int) groups[i]); ++ print_grpname (groups[i], 1); ++ } ++ } ++#endif ++ ++ putchar ('\n'); ++ } ++ ++ exit (EXIT_SUCCESS); ++} +diff -Naur ../glibc-2.1.3/redhat/.cvsignore glibc-2.1.3/redhat/.cvsignore +--- ../glibc-2.1.3/redhat/.cvsignore 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/redhat/.cvsignore 2000-02-18 16:03:43.000000000 -0800 +@@ -0,0 +1,6 @@ ++glibc-*.tar.gz ++glibc-2.1.spec ++diff-CYGNUS-to-REDHAT.patch ++build ++root ++ +diff -Naur ../glibc-2.1.3/redhat/ChangeLog glibc-2.1.3/redhat/ChangeLog +--- ../glibc-2.1.3/redhat/ChangeLog 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/redhat/ChangeLog 2000-02-23 17:17:37.000000000 -0800 +@@ -0,0 +1,12 @@ ++2000-02-23 Cristian Gafton <gafton@redhat.com> ++ ++ * Makefile (install-real): New target. ++ (install-locales-real): New. ++ (install-locales): New. ++ (install): Use install-locales. ++ ++2000-01-03 Cristian Gafton <gafton@redhat.com> ++ ++ * Makefile (archive): be more verbose about what's happening ++ ++ +diff -Naur ../glibc-2.1.3/redhat/Makefile glibc-2.1.3/redhat/Makefile +--- ../glibc-2.1.3/redhat/Makefile 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/redhat/Makefile 2000-02-23 17:16:13.000000000 -0800 +@@ -0,0 +1,81 @@ ++# ++# Makefile for creating a source RPM out of the ++# internal CVS tree ++# ++# Cristian Gafton <gafton@redhat.com> ++# Red Hat, Inc. ++# ++ ++SPEC = glibc-2.1.spec ++PROJECT = glibc ++ ++EXTRA = diff-CYGNUS-to-REDHAT.patch glibc-2.1.spec ++ ++VERSION=$(shell sed -n -e 's/^\#define VERSION \"\([^"]*\)\"/\1/p' < ../version.h) ++RELEASE=$(shell awk '/Release:/ { print $$2 }' $(SPEC).in) ++ ++CVSTAG = glibc-$(subst .,-,$(VERSION))-release-$(subst .,-,$(RELEASE)) ++CVS_ROOT = $(shell cat CVS/Root) ++ ++# How to build stuff for testing ++ARCH = $(shell uname -m)-redhat-linux ++CONFIGURE = ../../configure --prefix=/usr --enable-add-ons=yes --without-cvs $(ARCH) ++BUILD_FLAGS = -r ++ ++all: ++ ++$(SPEC) : $(SPEC).in ++ sed -e "s|@@VERSION@@|$(VERSION)|g" < $< | \ ++ grep -v "^%%" > $@ ++ ++spec: $(SPEC) ++ ++patch: ++ -cd .. ; cvs -q diff -N -rcygnus -rHEAD > redhat/diff-CYGNUS-to-REDHAT.patch ++ ++commit: ++ cd .. ; cvs -q commit -m "Prepare to comit for releasing $(CVSTAG)" ++ ++archive: clean spec commit patch ++ @rm -f $(PROJECT)-$(VERSION).tar.gz ++ cd .. ; cvs -q tag -F $(CVSTAG) . ++ @rm -rf /tmp/$(PROJECT)-$(VERSION) ++ cd /tmp; CVSROOT=$(CVS_ROOT) cvs -Q export -r$(CVSTAG) -d $(PROJECT)-$(VERSION) glibc21 ++ install -m 644 $(EXTRA) /tmp/$(PROJECT)-$(VERSION) ++ dir=$$PWD; cd /tmp; tar czf $$dir/$(PROJECT)-$(VERSION).tar.gz $(PROJECT)-$(VERSION) ++ @rm -rf /tmp/$(PROJECT)-$(VERSION) ++ @echo "The archive is in $(PROJECT)-$(VERSION).tar.gz" ++ ++clean: ++ @rm -fv *~ ++ @rm -fv $(EXTRA) ++ @rm -fv glibc-*.tar.gz ++ ++build-dir: ++ -mkdir build ++ ++root-dir: ++ -mkdir root ++ ++build/config.status build/Makefile: build-dir ++ cd build ; $(CONFIGURE) ++ ++configure: build/config.status build/Makefile ++ ++build: configure ++ make $(BUILD_FLAGS) -C build ++ ++ ++install: root-dir build-dir ++ make install -C build install_root=$$PWD/root ++ $(MAKE) install-locales ++ ++install-locales: ++ make install-locales -C ../localedata install_root=$$PWD/root objdir=$$PWD/build ++ ++install-real: build-dir ++ make install -C build ++ $(MAKE) install-locales-real ++ ++install-locales-real: ++ make install-locales -C ../localedata objdir=$$PWD/build +diff -Naur ../glibc-2.1.3/redhat/glibc-2.1.spec.in glibc-2.1.3/redhat/glibc-2.1.spec.in +--- ../glibc-2.1.3/redhat/glibc-2.1.spec.in 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/redhat/glibc-2.1.spec.in 2000-02-29 13:15:05.000000000 -0800 +@@ -0,0 +1,305 @@ ++Summary: The GNU libc libraries. ++Name: glibc ++Version: @@VERSION@@ ++Release: 15 ++Copyright: LGPL ++Group: System Environment/Libraries ++Source: %{name}-%{version}.tar.gz ++# Other sources are available at: ++# http://www.ozemail.com.au/~geoffk/glibc-crypt/glibc-crypt-2.1.tar.gz ++# In the source tarball the file diff-CYGNUS-to-REDHAT.patch contains all ++# diffs applied by Red Hat to the current CVS version of glibc ++Buildroot: /var/tmp/glibc-%{PACKAGE_VERSION}-root ++Obsoletes: zoneinfo, libc-static, libc-devel, libc-profile, libc-headers, ++Obsoletes: linuxthreads, gencat, locale ++Autoreq: false ++%ifarch alpha ++Provides: ld.so.2 ++%else ++%endif ++%ifarch sparc ++Obsoletes: libc ++%endif ++ ++%description ++The glibc package contains standard libraries which are used by ++multiple programs on the system. In order to save disk space and ++memory, as well as to make upgrading easier, common system code is ++kept in one place and shared between programs. This particular package ++contains the most important sets of shared libraries: the standard C ++library and the standard math library. Without these two libraries, a ++Linux system will not function. The glibc package also contains ++national language (locale) support and timezone databases. ++ ++%package devel ++Summary: Header and object files for development using standard C libraries. ++Group: Development/Libraries ++Conflicts: texinfo < 3.11 ++Prereq: /sbin/install-info ++Obsoletes: libc-debug, libc-headers, libc-devel, linuxthreads-devel ++Obsoletes: glibc-debug ++Prereq: kernel-headers ++Requires: kernel-headers >= 2.2.1 ++Autoreq: true ++ ++%description devel ++The glibc-devel package contains the header and object files necessary ++for developing programs which use the standard C libraries (which are ++used by nearly all programs). If you are developing programs which ++will use the standard C libraries, your system needs to have these ++standard header and object files available in order to create the ++executables. ++ ++Install glibc-devel if you are going to develop programs which will ++use the standard C libraries. ++ ++%package profile ++Summary: The GNU libc libraries, including support for gprof profiling. ++Group: Development/Libraries ++Obsoletes: libc-profile ++Autoreq: true ++ ++%description profile ++The glibc-profile package includes the GNU libc libraries and support ++for profiling using the gprof program. Profiling is analyzing a ++program's functions to see how much CPU time they use and determining ++which functions are calling other functions during execution. To use ++gprof to profile a program, your program needs to use the GNU libc ++libraries included in glibc-profile (instead of the standard GNU libc ++libraries included in the glibc package). ++ ++If you are going to use the gprof program to profile a program, you'll ++need to install the glibc-profile program. ++ ++%package -n nscd ++Summary: A Name Service Caching Daemon (nscd). ++Group: System Environment/Daemons ++Conflicts: kernel < 2.2.0 ++Prereq: /sbin/chkconfig ++Autoreq: true ++ ++%description -n nscd ++Nscd caches name service lookups and can dramatically improve ++performance with NIS+, and may help with DNS as well. Note that you ++can't use nscd with 2.0 kernels because of bugs in the kernel-side ++thread support. Unfortunately, nscd happens to hit these bugs ++particularly hard. ++ ++Install nscd if you need a name service lookup caching daemon, and ++you're not using a version 2.0 kernel. ++ ++%prep ++%setup -q ++ ++%ifarch armv4l ++rm -rf glibc-compat ++%endif ++ ++find . -type f -size 0 -o -name "*.orig" -exec rm -f {} \; ++ ++%build ++rm -rf build-$RPM_ARCH-linux ++mkdir build-$RPM_ARCH-linux ; cd build-$RPM_ARCH-linux ++%ifarch i586 i686 ++BuildFlags="-mpentium -D__USE_STRING_INLINES -fstrict-aliasing -mcpu=%{_target_cpu}" ++%endif ++%ifarch sparcv9 ++BuildFlags="-mv8 -mtune=ultrasparc" ++%endif ++CC=egcs CFLAGS="$BuildFlags -g -O3" ../configure --prefix=/usr \ ++ --enable-add-ons=yes --without-cvs \ ++ %{_target_cpu}-redhat-linux ++make -r CFLAGS="$BuildFlags -g -O3" PARALLELMFLAGS=-s ++ ++%install ++rm -rf $RPM_BUILD_ROOT ++mkdir -p $RPM_BUILD_ROOT ++make install_root=$RPM_BUILD_ROOT install -C build-$RPM_ARCH-linux ++cd build-$RPM_ARCH-linux && \ ++ make install_root=$RPM_BUILD_ROOT install-locales -C ../localedata objdir=`pwd` && \ ++ cd .. ++ ++# compatibility hack: this locale has vanished from glibc, but some other ++# programs are still using it. Normally we would handle it in the %pre ++# section but with glibc that is simply not an option ++mkdir -p $RPM_BUILD_ROOT/usr/share/locale/ru_RU/LC_MESSAGES ++ ++# Remove the files we don't want to distribute ++rm -f $RPM_BUILD_ROOT/usr/lib/libNoVersion* ++ ++# the man pages for the linuxthreads require special attention ++make -C linuxthreads/man ++mkdir -p $RPM_BUILD_ROOT/usr/man/man3 ++install -m 0644 linuxthreads/man/*.3thr $RPM_BUILD_ROOT/usr/man/man3 ++gzip -9nvf $RPM_BUILD_ROOT/usr/man/man3/* ++ ++gzip -9nvf $RPM_BUILD_ROOT/usr/info/libc* ++ ++ln -sf libbsd-compat.a $RPM_BUILD_ROOT/usr/lib/libbsd.a ++ ++install -m 644 redhat/nsswitch.conf $RPM_BUILD_ROOT/etc/nsswitch.conf ++ ++# Take care of setuids ++# -- new security review sez that this shouldn't be needed anymore ++#chmod 755 $RPM_BUILD_ROOT/usr/libexec/pt_chown ++ ++# This is for ncsd - in glibc 2.1 ++install -m 644 nscd/nscd.conf $RPM_BUILD_ROOT/etc ++mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d ++install -m 755 nscd/nscd.init $RPM_BUILD_ROOT/etc/rc.d/init.d/nscd ++ ++# The database support ++mkdir -p $RPM_BUILD_ROOT/var/db ++install -m 644 nss/db-Makefile $RPM_BUILD_ROOT/var/db/Makefile ++ ++# Strip binaries ++strip $RPM_BUILD_ROOT/sbin/* || : ++strip $RPM_BUILD_ROOT/usr/bin/* || : ++strip $RPM_BUILD_ROOT/usr/sbin/* || : ++ ++# BUILD THE FILE LIST ++find $RPM_BUILD_ROOT -type f -or -type l | ++ sed -e 's|.*/etc|%config &|' > rpm.filelist.in ++for n in /usr/share /usr/include; do ++ find ${RPM_BUILD_ROOT}${n} -type d | \ ++ grep -v '^/usr/share$' | \ ++ sed "s/^/%dir /" >> rpm.filelist.in ++done ++ ++# primary filelist ++sed "s|$RPM_BUILD_ROOT||" < rpm.filelist.in | ++ grep -v '/etc/localtime' | \ ++ grep -v '/etc/nsswitch.conf' | \ ++ sort > rpm.filelist ++ ++grep '/usr/lib/lib.*_p\.a' < rpm.filelist > profile.filelist ++egrep "(/usr/include)|(/usr/info)" < rpm.filelist | ++ grep -v /usr/info/dir > devel.filelist ++ ++mv rpm.filelist rpm.filelist.full ++grep -v '/usr/lib/lib.*_p.a' rpm.filelist.full | ++ egrep -v "(/usr/include)|(/usr/info)" > rpm.filelist ++ ++grep '/usr/lib/lib.*\.a' < rpm.filelist >> devel.filelist ++grep '/usr/lib/.*\.o' < rpm.filelist >> devel.filelist ++grep '/usr/lib/lib.*\.so' < rpm.filelist >> devel.filelist ++grep '/usr/man/man' < rpm.filelist >> devel.filelist ++ ++mv rpm.filelist rpm.filelist.full ++grep -v '/usr/lib/lib.*\.a' < rpm.filelist.full | ++ grep -v '/usr/lib/.*\.o' | ++ grep -v '/usr/lib/lib.*\.so'| ++ grep -v '/usr/man/man' | ++ grep -v 'nscd' > rpm.filelist ++ ++# /etc/localtime - we're proud of our timezone ++rm -f $RPM_BUILD_ROOT/etc/localtime ++cp -f $RPM_BUILD_ROOT/usr/share/zoneinfo/US/Eastern $RPM_BUILD_ROOT/etc/localtime ++#ln -sf ../usr/share/zoneinfo/US/Eastern $RPM_BUILD_ROOT/etc/localtime ++ ++# the last bit: more documentation ++rm -rf documentation ++mkdir documentation ++cp linuxthreads/ChangeLog documentation/ChangeLog.threads ++cp linuxthreads/Changes documentation/Changes.threads ++cp linuxthreads/README documentation/README.threads ++cp linuxthreads/FAQ.html documentation/FAQ-threads.html ++cp -r linuxthreads/Examples documentation/examples.threads ++cp crypt/README documentation/README.crypt ++cp db2/README documentation/README.db2 ++cp db2/mutex/README documentation/README.db2.mutex ++cp timezone/README documentation/README.timezone ++cp ChangeLog* documentation ++gzip -9 documentation/ChangeLog* ++ ++%post -p /sbin/ldconfig ++ ++%postun -p /sbin/ldconfig ++ ++%post devel ++/sbin/install-info /usr/info/libc.info.gz /usr/info/dir ++ ++%pre devel ++# this used to be a link and it is causing nightmares now ++if [ -L /usr/include/scsi ] ; then ++ rm -f /usr/include/scsi ++fi ++ ++%preun devel ++if [ "$1" = 0 ]; then ++ /sbin/install-info --delete /usr/info/libc.info.gz /usr/info/dir ++fi ++ ++%post -n nscd ++/sbin/chkconfig --add nscd ++ ++%preun -n nscd ++if [ $1 = 0 ] ; then ++ /sbin/chkconfig --del nscd ++fi ++ ++%clean ++rm -rf "$RPM_BUILD_ROOT" ++rm -f *.filelist* ++ ++%files -f rpm.filelist ++%defattr(-,root,root) ++%config(noreplace) /etc/localtime ++%config(noreplace) /etc/nsswitch.conf ++%doc README NEWS INSTALL FAQ BUGS NOTES PROJECTS ++%doc documentation/* README.template README.libm ++%doc login/README.utmpd hesiod/README.hesiod ++%dir /var/db ++ ++%ifnarch sparcv9 i586 i686 ++%files -f devel.filelist devel ++%defattr(-,root,root) ++ ++%files -f profile.filelist profile ++%defattr(-,root,root) ++ ++%files -n nscd ++%defattr(-,root,root) ++%config /etc/nscd.conf ++/etc/rc.d/init.d/nscd ++/usr/sbin/nscd ++%endif ++ ++%define date %(echo `LC_ALL="C" date +"%a %b %d %Y"`) ++ ++%changelog ++* %{date} Cristian Gafton <gafton@redhat.com> ++- fix c_stubs add-on to work around various assert()s in glibc ++- add Davem's patch for _NPROCESSORS_ONLN on Sparc ++ ++* Fri Feb 25 2000 Cristian Gafton <gafton@redhat.com> ++- add the c_stubs add-on ++- sparc patch from davem ++ ++* Thu Feb 24 2000 Cristian Gafton <gafton@redhat.com> ++- fix locale problems on 64 bit arches ++ ++* Tue Feb 22 2000 Cristian Gafton <gafton@redhat.com> ++- cygnus sync up for fixes to nscd ++ ++* Thu Feb 17 2000 Cristian Gafton <gafton@redhat.com> ++- updated to include new China timezones ++- sync up with the locale changes from Cygnus ++ ++* Tue Feb 01 2000 Cristian Gafton <gafton@redhat.com> ++- updated from cygnus branch ++- fix syslog so that it will continuously try to fallback from SOK_DGRAM to ++ SOCK_STREAM and backwards ++ ++* Mon Jan 31 2000 Cristian Gafton <gafton@redhat.com> ++- update from cygnus branch ++- compress man pages for the linuxthreads stuff ++ ++* Fri Jan 21 2000 Cristian Gafton <gafton@redhat.com> ++- add Jakub's patch so we back out even more ++ ++* Thu Jan 20 2000 Cristian Gafton <gafton@redhat.com> ++- back out the setrlimit changes (well, sort of) ++ ++* Mon Jan 03 2000 Cristian Gafton <gafton@redhat.com> ++- make release from CVS server directly now +diff -Naur ../glibc-2.1.3/redhat/nsswitch.conf glibc-2.1.3/redhat/nsswitch.conf +--- ../glibc-2.1.3/redhat/nsswitch.conf 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/redhat/nsswitch.conf 2000-01-03 17:07:08.000000000 -0800 +@@ -0,0 +1,63 @@ ++# ++# /etc/nsswitch.conf ++# ++# An example Name Service Switch config file. This file should be ++# sorted with the most-used services at the beginning. ++# ++# The entry '[NOTFOUND=return]' means that the search for an ++# entry should stop if the search in the previous entry turned ++# up nothing. Note that if the search failed due to some other reason ++# (like no NIS server responding) then the search continues with the ++# next entry. ++# ++# Legal entries are: ++# ++# nisplus or nis+ Use NIS+ (NIS version 3) ++# nis or yp Use NIS (NIS version 2), also called YP ++# dns Use DNS (Domain Name Service) ++# files Use the local files ++# db Use the local database (.db) files ++# compat Use NIS on compat mode ++# hesiod Use Hesiod for user lookups ++# [NOTFOUND=return] Stop searching if not found so far ++# ++ ++# To use db, put the "db" in front of "files" for entries you want to be ++# looked up first in the databases ++# ++# Example: ++#passwd: db files nisplus nis ++#shadow: db files nisplus nis ++#group: db files nisplus nis ++ ++passwd: files nisplus nis ++shadow: files nisplus nis ++group: files nisplus nis ++ ++#hosts: db files nisplus nis dns ++hosts: files nisplus nis dns ++ ++# Example - obey only what nisplus tells us... ++#services: nisplus [NOTFOUND=return] files ++#networks: nisplus [NOTFOUND=return] files ++#protocols: nisplus [NOTFOUND=return] files ++#rpc: nisplus [NOTFOUND=return] files ++#ethers: nisplus [NOTFOUND=return] files ++#netmasks: nisplus [NOTFOUND=return] files ++ ++bootparams: nisplus [NOTFOUND=return] files ++ ++ethers: files ++netmasks: files ++networks: files ++protocols: files ++rpc: files ++services: files ++ ++netgroup: nisplus ++ ++publickey: nisplus ++ ++automount: files nisplus ++aliases: files nisplus ++ +diff -Naur ../glibc-2.1.3/resolv/arpa/nameser.h glibc-2.1.3/resolv/arpa/nameser.h +--- ../glibc-2.1.3/resolv/arpa/nameser.h 1999-05-12 03:23:10.000000000 -0700 ++++ glibc-2.1.3/resolv/arpa/nameser.h 1999-12-27 08:22:16.000000000 -0800 +@@ -77,7 +77,7 @@ + + /* + * @(#)nameser.h 8.1 (Berkeley) 6/2/93 +- * $Id: nameser.h,v 1.15 1999/05/12 10:23:10 drepper Exp $ ++ * $Id: nameser.h,v 1.2 1999/12/27 16:22:16 gafton Exp $ + */ + + #ifndef _ARPA_NAMESER_H +@@ -295,6 +295,11 @@ + unsigned arcount :16; /* number of resource entries */ + } HEADER; + ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++ + /* + * Defines for handling compressed domain names + */ +@@ -345,6 +350,11 @@ + (cp) += INT32SZ; \ + } + ++#ifdef __cplusplus ++} ++#endif ++ ++ + __END_DECLS + + #endif /* arpa/nameser.h */ +diff -Naur ../glibc-2.1.3/resolv/gethnamaddr.c glibc-2.1.3/resolv/gethnamaddr.c +--- ../glibc-2.1.3/resolv/gethnamaddr.c 1999-10-25 15:23:46.000000000 -0700 ++++ glibc-2.1.3/resolv/gethnamaddr.c 1999-12-07 08:50:36.000000000 -0800 +@@ -55,7 +55,7 @@ + + #if defined(LIBC_SCCS) && !defined(lint) + static char sccsid[] = "@(#)gethostnamadr.c 8.1 (Berkeley) 6/4/93"; +-static char rcsid[] = "$Id: gethnamaddr.c,v 1.29.2.2 1999/10/25 22:23:46 drepper Exp $"; ++static char rcsid[] = "$Id: gethnamaddr.c,v 1.1.1.1 1999/12/07 16:50:36 gafton Exp $"; + #endif /* LIBC_SCCS and not lint */ + + #include <sys/types.h> +diff -Naur ../glibc-2.1.3/resolv/getnetnamadr.c glibc-2.1.3/resolv/getnetnamadr.c +--- ../glibc-2.1.3/resolv/getnetnamadr.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/resolv/getnetnamadr.c 1999-06-30 09:00:50.000000000 -0700 +@@ -0,0 +1,290 @@ ++/* Copyright (c) 1993 Carlos Leandro and Rui Salgueiro ++ * Dep. Matematica Universidade de Coimbra, Portugal, Europe ++ * ++ * Permission to use, copy, modify, and distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ */ ++/* ++ * Copyright (c) 1983, 1993 ++ * The Regents of the University of California. All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * 3. All advertising materials mentioning features or use of this software ++ * must display the following acknowledgement: ++ * This product includes software developed by the University of ++ * California, Berkeley and its contributors. ++ * 4. Neither the name of the University nor the names of its contributors ++ * may be used to endorse or promote products derived from this software ++ * without specific prior written permission. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ ++#if defined(LIBC_SCCS) && !defined(lint) ++static char sccsid[] = "@(#)getnetbyaddr.c 8.1 (Berkeley) 6/4/93"; ++static char sccsid_[] = "from getnetnamadr.c 1.4 (Coimbra) 93/06/03"; ++static char rcsid[] = "$Id: getnetnamadr.c,v 1.1.1.1 1999/06/30 16:00:50 gafton Exp $"; ++#endif /* LIBC_SCCS and not lint */ ++ ++#include <sys/types.h> ++#include <sys/param.h> ++#include <sys/socket.h> ++#include <netinet/in.h> ++#include <arpa/inet.h> ++#include <arpa/nameser.h> ++ ++#include <stdio.h> ++#include <netdb.h> ++#include <resolv.h> ++#include <ctype.h> ++#include <errno.h> ++#include <string.h> ++ ++#ifndef h_errno ++extern int h_errno; ++#endif ++ ++#if defined(mips) && defined(SYSTYPE_BSD43) && !defined(errno) ++extern int errno; ++#endif ++ ++struct netent *_getnetbyaddr __P((long net, int type)); ++struct netent *_getnetbyname __P((const char *name)); ++ ++#define BYADDR 0 ++#define BYNAME 1 ++#define MAXALIASES 35 ++ ++#if PACKETSZ > 1024 ++#define MAXPACKET PACKETSZ ++#else ++#define MAXPACKET 1024 ++#endif ++ ++typedef union { ++ HEADER hdr; ++ u_char buf[MAXPACKET]; ++} querybuf; ++ ++typedef union { ++ long al; ++ char ac; ++} align; ++ ++static struct netent * ++getnetanswer(answer, anslen, net_i) ++ querybuf *answer; ++ int anslen; ++ int net_i; ++{ ++ ++ register HEADER *hp; ++ register u_char *cp; ++ register int n; ++ u_char *eom; ++ int type, class, buflen, ancount, qdcount, haveanswer, i, nchar; ++ char aux1[30], aux2[30], ans[30], *in, *st, *pauxt, *bp, **ap, ++ *paux1 = &aux1[0], *paux2 = &aux2[0], flag = 0; ++static struct netent net_entry; ++static char *net_aliases[MAXALIASES], netbuf[BUFSIZ+1]; ++ ++ /* ++ * find first satisfactory answer ++ * ++ * answer --> +------------+ ( MESSAGE ) ++ * | Header | ++ * +------------+ ++ * | Question | the question for the name server ++ * +------------+ ++ * | Answer | RRs answering the question ++ * +------------+ ++ * | Authority | RRs pointing toward an authority ++ * | Additional | RRs holding additional information ++ * +------------+ ++ */ ++ eom = answer->buf + anslen; ++ hp = &answer->hdr; ++ ancount = ntohs(hp->ancount); /* #/records in the answer section */ ++ qdcount = ntohs(hp->qdcount); /* #/entries in the question section */ ++ bp = netbuf; ++ buflen = sizeof(netbuf); ++ cp = answer->buf + HFIXEDSZ; ++ if (!qdcount) { ++ if (hp->aa) ++ __set_h_errno (HOST_NOT_FOUND); ++ else ++ __set_h_errno (TRY_AGAIN); ++ return (NULL); ++ } ++ while (qdcount-- > 0) ++ cp += __dn_skipname(cp, eom) + QFIXEDSZ; ++ ap = net_aliases; ++ *ap = NULL; ++ net_entry.n_aliases = net_aliases; ++ haveanswer = 0; ++ while (--ancount >= 0 && cp < eom) { ++ n = dn_expand(answer->buf, eom, cp, bp, buflen); ++ if ((n < 0) || !res_dnok(bp)) ++ break; ++ cp += n; ++ ans[0] = '\0'; ++ (void)strcpy(&ans[0], bp); ++ GETSHORT(type, cp); ++ GETSHORT(class, cp); ++ cp += INT32SZ; /* TTL */ ++ GETSHORT(n, cp); ++ if (class == C_IN && type == T_PTR) { ++ n = dn_expand(answer->buf, eom, cp, bp, buflen); ++ if ((n < 0) || !res_hnok(bp)) { ++ cp += n; ++ return (NULL); ++ } ++ cp += n; ++ *ap++ = bp; ++ bp += strlen(bp) + 1; ++ net_entry.n_addrtype = ++ (class == C_IN) ? AF_INET : AF_UNSPEC; ++ haveanswer++; ++ } ++ } ++ if (haveanswer) { ++ *ap = NULL; ++ switch (net_i) { ++ case BYADDR: ++ net_entry.n_name = *net_entry.n_aliases; ++ net_entry.n_net = 0L; ++ break; ++ case BYNAME: ++ in = *net_entry.n_aliases; ++ net_entry.n_name = &ans[0]; ++ aux2[0] = '\0'; ++ for (i = 0; i < 4; i++) { ++ for (st = in, nchar = 0; ++ *st != '.'; ++ st++, nchar++) ++ ; ++ if (nchar != 1 || *in != '0' || flag) { ++ flag = 1; ++ (void)strncpy(paux1, ++ (i==0) ? in : in-1, ++ (i==0) ?nchar : nchar+1); ++ paux1[(i==0) ? nchar : nchar+1] = '\0'; ++ pauxt = paux2; ++ paux2 = strcat(paux1, paux2); ++ paux1 = pauxt; ++ } ++ in = ++st; ++ } ++ net_entry.n_net = inet_network(paux2); ++ break; ++ } ++ net_entry.n_aliases++; ++ return (&net_entry); ++ } ++ __set_h_errno (TRY_AGAIN); ++ return (NULL); ++} ++ ++struct netent * ++getnetbyaddr(net, net_type) ++ register u_long net; ++ register int net_type; ++{ ++ unsigned int netbr[4]; ++ int nn, anslen; ++ querybuf buf; ++ char qbuf[MAXDNAME]; ++ u_int32_t net2; /* Changed from unsigned long --roland */ ++ struct netent *net_entry; ++ ++ if (net_type != AF_INET) ++ return (_getnetbyaddr(net, net_type)); ++ ++ for (nn = 4, net2 = net; net2; net2 >>= 8) ++ netbr[--nn] = net2 & 0xff; ++ switch (nn) { ++ case 3: /* Class A */ ++ sprintf(qbuf, "0.0.0.%u.in-addr.arpa", netbr[3]); ++ break; ++ case 2: /* Class B */ ++ sprintf(qbuf, "0.0.%u.%u.in-addr.arpa", netbr[3], netbr[2]); ++ break; ++ case 1: /* Class C */ ++ sprintf(qbuf, "0.%u.%u.%u.in-addr.arpa", netbr[3], netbr[2], ++ netbr[1]); ++ break; ++ case 0: /* Class D - E */ ++ sprintf(qbuf, "%u.%u.%u.%u.in-addr.arpa", netbr[3], netbr[2], ++ netbr[1], netbr[0]); ++ break; ++ } ++ anslen = res_query(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf)); ++ if (anslen < 0) { ++#ifdef DEBUG ++ if (_res.options & RES_DEBUG) ++ printf("res_query failed\n"); ++#endif ++ if (errno == ECONNREFUSED) ++ return (_getnetbyaddr(net, net_type)); ++ return (NULL); ++ } ++ net_entry = getnetanswer(&buf, anslen, BYADDR); ++ if (net_entry) { ++ unsigned u_net = net; /* maybe net should be unsigned ? */ ++ ++ /* Strip trailing zeros */ ++ while ((u_net & 0xff) == 0 && u_net != 0) ++ u_net >>= 8; ++ net_entry->n_net = u_net; ++ return (net_entry); ++ } ++ return (_getnetbyaddr(net, net_type)); ++} ++ ++struct netent * ++getnetbyname(net) ++ register const char *net; ++{ ++ int anslen; ++ querybuf buf; ++ char qbuf[MAXDNAME]; ++ struct netent *net_entry; ++ ++ if ((_res.options & RES_INIT) == 0 && res_init() == -1) { ++ __set_h_errno (NETDB_INTERNAL); ++ return (NULL); ++ } ++ strcpy(&qbuf[0], net); ++ anslen = res_search(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf)); ++ if (anslen < 0) { ++#ifdef DEBUG ++ if (_res.options & RES_DEBUG) ++ printf("res_query failed\n"); ++#endif ++ if (errno == ECONNREFUSED) ++ return (_getnetbyname(net)); ++ return (_getnetbyname(net)); ++ } ++ net_entry = getnetanswer(&buf, anslen, BYNAME); ++ if (net_entry) ++ return (net_entry); ++ return (_getnetbyname(net)); ++} +diff -Naur ../glibc-2.1.3/resolv/herror.c glibc-2.1.3/resolv/herror.c +--- ../glibc-2.1.3/resolv/herror.c 1998-07-16 04:00:26.000000000 -0700 ++++ glibc-2.1.3/resolv/herror.c 1999-06-30 09:00:51.000000000 -0700 +@@ -55,7 +55,7 @@ + + #if defined(LIBC_SCCS) && !defined(lint) + static char sccsid[] = "@(#)herror.c 8.1 (Berkeley) 6/4/93"; +-static char rcsid[] = "$Id: herror.c,v 1.9 1998/07/16 11:00:26 drepper Exp $"; ++static char rcsid[] = "$Id: herror.c,v 1.1.1.1 1999/06/30 16:00:51 gafton Exp $"; + #endif /* LIBC_SCCS and not lint */ + + #include <sys/types.h> +diff -Naur ../glibc-2.1.3/resolv/inet_addr.c glibc-2.1.3/resolv/inet_addr.c +--- ../glibc-2.1.3/resolv/inet_addr.c 1999-04-29 11:19:53.000000000 -0700 ++++ glibc-2.1.3/resolv/inet_addr.c 1999-06-30 09:00:52.000000000 -0700 +@@ -55,7 +55,7 @@ + + #if defined(LIBC_SCCS) && !defined(lint) + static char sccsid[] = "@(#)inet_addr.c 8.1 (Berkeley) 6/17/93"; +-static char rcsid[] = "$Id: inet_addr.c,v 1.11 1999/04/29 18:19:53 drepper Exp $"; ++static char rcsid[] = "$Id: inet_addr.c,v 1.1.1.1 1999/06/30 16:00:52 gafton Exp $"; + #endif /* LIBC_SCCS and not lint */ + + #include <sys/types.h> +diff -Naur ../glibc-2.1.3/resolv/inet_net_ntop.c glibc-2.1.3/resolv/inet_net_ntop.c +--- ../glibc-2.1.3/resolv/inet_net_ntop.c 1996-09-26 20:24:07.000000000 -0700 ++++ glibc-2.1.3/resolv/inet_net_ntop.c 1998-02-07 12:24:30.000000000 -0800 +@@ -16,7 +16,7 @@ + */ + + #if defined(LIBC_SCCS) && !defined(lint) +-static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.2 1996/09/27 03:24:07 drepper Exp $"; ++static const char rcsid[] = "$Id: inet_net_ntop.c,v 1.1.1.1 1998/02/07 20:24:30 gafton Exp $"; + #endif + + #include <sys/types.h> +diff -Naur ../glibc-2.1.3/resolv/inet_net_pton.c glibc-2.1.3/resolv/inet_net_pton.c +--- ../glibc-2.1.3/resolv/inet_net_pton.c 1999-04-28 15:32:02.000000000 -0700 ++++ glibc-2.1.3/resolv/inet_net_pton.c 1999-05-07 07:36:46.000000000 -0700 +@@ -16,7 +16,7 @@ + */ + + #if defined(LIBC_SCCS) && !defined(lint) +-static const char rcsid[] = "$Id: inet_net_pton.c,v 1.7 1999/04/28 22:32:02 drepper Exp $"; ++static const char rcsid[] = "$Id: inet_net_pton.c,v 1.1.1.1 1999/05/07 14:36:46 gafton Exp $"; + #endif + + #include <sys/types.h> +diff -Naur ../glibc-2.1.3/resolv/inet_neta.c glibc-2.1.3/resolv/inet_neta.c +--- ../glibc-2.1.3/resolv/inet_neta.c 1997-12-03 15:11:54.000000000 -0800 ++++ glibc-2.1.3/resolv/inet_neta.c 1998-02-07 12:24:31.000000000 -0800 +@@ -16,7 +16,7 @@ + */ + + #if defined(LIBC_SCCS) && !defined(lint) +-static const char rcsid[] = "$Id: inet_neta.c,v 1.4 1997/12/03 23:11:54 drepper Exp $"; ++static const char rcsid[] = "$Id: inet_neta.c,v 1.1.1.1 1998/02/07 20:24:31 gafton Exp $"; + #endif + + #include <sys/types.h> +diff -Naur ../glibc-2.1.3/resolv/inet_ntop.c glibc-2.1.3/resolv/inet_ntop.c +--- ../glibc-2.1.3/resolv/inet_ntop.c 1997-10-05 18:23:28.000000000 -0700 ++++ glibc-2.1.3/resolv/inet_ntop.c 1998-02-07 12:24:32.000000000 -0800 +@@ -15,7 +15,7 @@ + */ + + #if defined(LIBC_SCCS) && !defined(lint) +-static char rcsid[] = "$Id: inet_ntop.c,v 1.5 1997/10/06 01:23:28 drepper Exp $"; ++static char rcsid[] = "$Id: inet_ntop.c,v 1.1.1.1 1998/02/07 20:24:32 gafton Exp $"; + #endif /* LIBC_SCCS and not lint */ + + #include <sys/param.h> +diff -Naur ../glibc-2.1.3/resolv/inet_pton.c glibc-2.1.3/resolv/inet_pton.c +--- ../glibc-2.1.3/resolv/inet_pton.c 1999-04-29 09:29:36.000000000 -0700 ++++ glibc-2.1.3/resolv/inet_pton.c 1999-05-07 07:36:48.000000000 -0700 +@@ -15,7 +15,7 @@ + */ + + #if defined(LIBC_SCCS) && !defined(lint) +-static char rcsid[] = "$Id: inet_pton.c,v 1.9 1999/04/29 16:29:36 drepper Exp $"; ++static char rcsid[] = "$Id: inet_pton.c,v 1.1.1.1 1999/05/07 14:36:48 gafton Exp $"; + #endif /* LIBC_SCCS and not lint */ + + #include <sys/param.h> +diff -Naur ../glibc-2.1.3/resolv/nsap_addr.c glibc-2.1.3/resolv/nsap_addr.c +--- ../glibc-2.1.3/resolv/nsap_addr.c 1998-12-01 11:34:42.000000000 -0800 ++++ glibc-2.1.3/resolv/nsap_addr.c 1998-12-02 11:04:04.000000000 -0800 +@@ -16,7 +16,7 @@ + */ + + #if defined(LIBC_SCCS) && !defined(lint) +-static char rcsid[] = "$Id: nsap_addr.c,v 1.6 1998/12/01 19:34:42 drepper Exp $"; ++static char rcsid[] = "$Id: nsap_addr.c,v 1.1.1.1 1998/12/02 19:04:04 gafton Exp $"; + #endif /* LIBC_SCCS and not lint */ + + #include <sys/types.h> +diff -Naur ../glibc-2.1.3/resolv/res_comp.c glibc-2.1.3/resolv/res_comp.c +--- ../glibc-2.1.3/resolv/res_comp.c 1999-02-06 15:55:49.000000000 -0800 ++++ glibc-2.1.3/resolv/res_comp.c 1999-06-30 09:00:59.000000000 -0700 +@@ -55,7 +55,7 @@ + + #if defined(LIBC_SCCS) && !defined(lint) + static char sccsid[] = "@(#)res_comp.c 8.1 (Berkeley) 6/4/93"; +-static char rcsid[] = "$Id: res_comp.c,v 1.16 1999/02/06 23:55:49 drepper Exp $"; ++static char rcsid[] = "$Id: res_comp.c,v 1.1.1.1 1999/06/30 16:00:59 gafton Exp $"; + #endif /* LIBC_SCCS and not lint */ + + #include <sys/types.h> +diff -Naur ../glibc-2.1.3/resolv/res_data.c glibc-2.1.3/resolv/res_data.c +--- ../glibc-2.1.3/resolv/res_data.c 1996-08-13 20:48:55.000000000 -0700 ++++ glibc-2.1.3/resolv/res_data.c 1999-06-30 09:01:00.000000000 -0700 +@@ -54,7 +54,7 @@ + */ + + #if defined(LIBC_SCCS) && !defined(lint) +-static char rcsid[] = "$Id: res_data.c,v 1.2 1996/08/14 03:48:55 drepper Exp $"; ++static char rcsid[] = "$Id: res_data.c,v 1.1.1.1 1999/06/30 16:01:00 gafton Exp $"; + #endif /* LIBC_SCCS and not lint */ + + #include <sys/types.h> +diff -Naur ../glibc-2.1.3/resolv/res_debug.c glibc-2.1.3/resolv/res_debug.c +--- ../glibc-2.1.3/resolv/res_debug.c 1998-09-07 08:06:02.000000000 -0700 ++++ glibc-2.1.3/resolv/res_debug.c 1999-06-30 09:01:02.000000000 -0700 +@@ -77,7 +77,7 @@ + + #if defined(LIBC_SCCS) && !defined(lint) + static char sccsid[] = "@(#)res_debug.c 8.1 (Berkeley) 6/4/93"; +-static char rcsid[] = "$Id: res_debug.c,v 1.24 1998/09/07 15:06:02 drepper Exp $"; ++static char rcsid[] = "$Id: res_debug.c,v 1.1.1.1 1999/06/30 16:01:02 gafton Exp $"; + #endif /* LIBC_SCCS and not lint */ + + #include <sys/param.h> +diff -Naur ../glibc-2.1.3/resolv/res_init.c glibc-2.1.3/resolv/res_init.c +--- ../glibc-2.1.3/resolv/res_init.c 1999-04-28 15:34:01.000000000 -0700 ++++ glibc-2.1.3/resolv/res_init.c 1999-06-30 09:01:03.000000000 -0700 +@@ -55,7 +55,7 @@ + + #if defined(LIBC_SCCS) && !defined(lint) + static char sccsid[] = "@(#)res_init.c 8.1 (Berkeley) 6/7/93"; +-static char rcsid[] = "$Id: res_init.c,v 1.19 1999/04/28 22:34:01 drepper Exp $"; ++static char rcsid[] = "$Id: res_init.c,v 1.1.1.1 1999/06/30 16:01:03 gafton Exp $"; + #endif /* LIBC_SCCS and not lint */ + + #include <sys/types.h> +diff -Naur ../glibc-2.1.3/resolv/res_mkquery.c glibc-2.1.3/resolv/res_mkquery.c +--- ../glibc-2.1.3/resolv/res_mkquery.c 1996-10-01 18:37:29.000000000 -0700 ++++ glibc-2.1.3/resolv/res_mkquery.c 1999-06-30 09:01:05.000000000 -0700 +@@ -55,7 +55,7 @@ + + #if defined(LIBC_SCCS) && !defined(lint) + static char sccsid[] = "@(#)res_mkquery.c 8.1 (Berkeley) 6/4/93"; +-static char rcsid[] = "$Id: res_mkquery.c,v 1.7 1996/10/02 01:37:29 drepper Exp $"; ++static char rcsid[] = "$Id: res_mkquery.c,v 1.1.1.1 1999/06/30 16:01:05 gafton Exp $"; + #endif /* LIBC_SCCS and not lint */ + + #include <sys/types.h> +diff -Naur ../glibc-2.1.3/resolv/res_query.c glibc-2.1.3/resolv/res_query.c +--- ../glibc-2.1.3/resolv/res_query.c 1997-05-23 08:31:34.000000000 -0700 ++++ glibc-2.1.3/resolv/res_query.c 1999-06-30 09:01:06.000000000 -0700 +@@ -55,7 +55,7 @@ + + #if defined(LIBC_SCCS) && !defined(lint) + static char sccsid[] = "@(#)res_query.c 8.1 (Berkeley) 6/4/93"; +-static char rcsid[] = "$Id: res_query.c,v 1.12 1997/05/23 15:31:34 drepper Exp $"; ++static char rcsid[] = "$Id: res_query.c,v 1.1.1.1 1999/06/30 16:01:06 gafton Exp $"; + #endif /* LIBC_SCCS and not lint */ + + #include <sys/types.h> +diff -Naur ../glibc-2.1.3/resolv/res_send.c glibc-2.1.3/resolv/res_send.c +--- ../glibc-2.1.3/resolv/res_send.c 1999-08-06 20:16:16.000000000 -0700 ++++ glibc-2.1.3/resolv/res_send.c 1999-08-10 13:37:00.000000000 -0700 +@@ -51,7 +51,7 @@ + + #if defined(LIBC_SCCS) && !defined(lint) + static char sccsid[] = "@(#)res_send.c 8.1 (Berkeley) 6/4/93"; +-static char rcsid[] = "$Id: res_send.c,v 1.20.2.3 1999/08/07 03:16:16 drepper Exp $"; ++static char rcsid[] = "$Id: res_send.c,v 1.1.1.1 1999/08/10 20:37:00 gafton Exp $"; + #endif /* LIBC_SCCS and not lint */ + + /* change this to "0" +diff -Naur ../glibc-2.1.3/resolv/resolv.h glibc-2.1.3/resolv/resolv.h +--- ../glibc-2.1.3/resolv/resolv.h 1998-06-29 05:41:27.000000000 -0700 ++++ glibc-2.1.3/resolv/resolv.h 1999-06-30 09:01:08.000000000 -0700 +@@ -55,7 +55,7 @@ + + /* + * @(#)resolv.h 8.1 (Berkeley) 6/2/93 +- * $Id: resolv.h,v 1.19 1998/06/29 12:41:27 drepper Exp $ ++ * $Id: resolv.h,v 1.1.1.1 1999/06/30 16:01:08 gafton Exp $ + */ + + #ifndef _RESOLV_H +diff -Naur ../glibc-2.1.3/scripts/=__ify glibc-2.1.3/scripts/=__ify +--- ../glibc-2.1.3/scripts/=__ify 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/scripts/=__ify 1998-08-28 03:07:38.000000000 -0700 +@@ -0,0 +1,12 @@ ++for func in $*; do ++ for file in `find sysdeps -name "${func}.c"`; ++ do ++ script=/tmp/foo$$; ++ ( echo "%s/${func}/__&/g"; ++ echo x )>$script ; ++ ex $file <$script ; ++ newfile=`echo $file | sed "s/${func}/__&/"`; ++ mv $file $newfile; ++ echo $newfile; ++ done ++done +diff -Naur ../glibc-2.1.3/scripts/mkinstalldirs glibc-2.1.3/scripts/mkinstalldirs +--- ../glibc-2.1.3/scripts/mkinstalldirs 1998-05-08 13:55:06.000000000 -0700 ++++ glibc-2.1.3/scripts/mkinstalldirs 1998-08-28 03:07:38.000000000 -0700 +@@ -4,7 +4,7 @@ + # Created: 1993-05-16 + # Public domain + +-# $Id: mkinstalldirs,v 1.1 1998/05/08 20:55:06 drepper Exp $ ++# $Id: mkinstalldirs,v 1.1.1.1 1998/08/28 10:07:38 gafton Exp $ + + errstatus=0 + +diff -Naur ../glibc-2.1.3/scripts/printsources glibc-2.1.3/scripts/printsources +--- ../glibc-2.1.3/scripts/printsources 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/scripts/printsources 1998-08-28 03:07:38.000000000 -0700 +@@ -0,0 +1,29 @@ ++#! /bin/csh -f ++ ++# ++# Prints all the files given as arguments. ++# Files that will fit on less than a printed page ++# are concatenated together. Bigger ones are pr'd. ++# ++ ++ ++set tocat='' topr='' ++ ++foreach file ($*) ++ set lines=`wc -l $file | sed "s/$file//"` ++ if ($lines > 40) then ++ set topr=($topr $file) ++ else ++ set tocat=($tocat $file) ++ endif ++end ++ ++ ++if ("$topr" != '') pr $topr ++ ++if ("$tocat" != '') foreach file ($tocat) ++ echo -n "==================== $file ======================" ++ cat $file ++end ++ ++exit 0 +diff -Naur ../glibc-2.1.3/stdio-common/scanf11.c glibc-2.1.3/stdio-common/scanf11.c +--- ../glibc-2.1.3/stdio-common/scanf11.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/stdio-common/scanf11.c 1998-02-07 12:25:38.000000000 -0800 +@@ -0,0 +1,14 @@ ++/* This test comes from ISO C Corrigendum 1. */ ++#include <stdio.h> ++ ++int ++main (int argc, char *argv[]) ++{ ++ int d1, n1, n2, i; ++#define NOISE 1234567 ++ int d2 = NOISE; ++ ++ i = sscanf ("123", "%d%n%n%d", &d1, &n1, &n2, &d2); ++ ++ return i != 3 || d1 != 123 || n1 != 3 || n2 != 3 || d2 != NOISE; ++} +diff -Naur ../glibc-2.1.3/stdio-common/scanf6.c glibc-2.1.3/stdio-common/scanf6.c +--- ../glibc-2.1.3/stdio-common/scanf6.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/stdio-common/scanf6.c 1998-02-07 12:25:38.000000000 -0800 +@@ -0,0 +1,16 @@ ++#include <stdio.h> ++#include <stdlib.h> ++ ++int ++main (int argc, char *argv[]) ++{ ++ int n = -1; ++ char c = '!'; ++ int ret; ++ ++ ret = sscanf ("0x", "%i%c", &n, &c); ++ printf ("ret: %d, n: %d, c: %c\n", ret, n, c); ++ if (ret != 2 || n != 0 || c != 'x') ++ abort (); ++ return 0; ++} +diff -Naur ../glibc-2.1.3/string/bits/string2.h glibc-2.1.3/string/bits/string2.h +--- ../glibc-2.1.3/string/bits/string2.h 2000-02-22 23:03:05.000000000 -0800 ++++ glibc-2.1.3/string/bits/string2.h 2000-02-23 14:48:17.000000000 -0800 +@@ -609,7 +609,7 @@ + __u = __extension__ ((void *) __u + 3); + break; + } +- return &__u->__c; ++ return (char *) &__u->__c; + } + # else + # define __stpcpy_args(src) \ +diff -Naur ../glibc-2.1.3/sunrpc/rpc_clntout.c glibc-2.1.3/sunrpc/rpc_clntout.c +--- ../glibc-2.1.3/sunrpc/rpc_clntout.c 1999-11-23 09:11:05.000000000 -0800 ++++ glibc-2.1.3/sunrpc/rpc_clntout.c 1999-12-07 08:50:37.000000000 -0800 +@@ -32,7 +32,7 @@ + * From: @(#)rpc_clntout.c 1.11 89/02/22 (C) 1987 SMI + */ + char clntout_rcsid[] = +- "$Id: rpc_clntout.c,v 1.5.2.1 1999/11/23 17:11:05 drepper Exp $"; ++ "$Id: rpc_clntout.c,v 1.1.1.1 1999/12/07 16:50:37 gafton Exp $"; + + /* + * rpc_clntout.c, Client-stub outputter for the RPC protocol compiler +diff -Naur ../glibc-2.1.3/sunrpc/rpc_cout.c glibc-2.1.3/sunrpc/rpc_cout.c +--- ../glibc-2.1.3/sunrpc/rpc_cout.c 1999-04-17 02:41:43.000000000 -0700 ++++ glibc-2.1.3/sunrpc/rpc_cout.c 1999-04-21 11:13:33.000000000 -0700 +@@ -32,7 +32,7 @@ + * From: @(#)rpc_cout.c 1.13 89/02/22 (C) 1987 SMI + */ + char cout_rcsid[] = +-"$Id: rpc_cout.c,v 1.10 1999/04/17 09:41:43 drepper Exp $"; ++"$Id: rpc_cout.c,v 1.1.1.1 1999/04/21 18:13:33 gafton Exp $"; + + /* + * rpc_cout.c, XDR routine outputter for the RPC protocol compiler +diff -Naur ../glibc-2.1.3/sunrpc/rpc_hout.c glibc-2.1.3/sunrpc/rpc_hout.c +--- ../glibc-2.1.3/sunrpc/rpc_hout.c 1998-12-01 03:23:36.000000000 -0800 ++++ glibc-2.1.3/sunrpc/rpc_hout.c 1998-12-01 11:41:59.000000000 -0800 +@@ -32,7 +32,7 @@ + * From: @(#)rpc_hout.c 1.12 89/02/22 (C) 1987 SMI + */ + char hout_rcsid[] = +- "$Id: rpc_hout.c,v 1.4 1998/12/01 11:23:36 drepper Exp $"; ++ "$Id: rpc_hout.c,v 1.1.1.1 1998/12/01 19:41:59 gafton Exp $"; + + /* + * rpc_hout.c, Header file outputter for the RPC protocol compiler +diff -Naur ../glibc-2.1.3/sunrpc/rpc_main.c glibc-2.1.3/sunrpc/rpc_main.c +--- ../glibc-2.1.3/sunrpc/rpc_main.c 1999-01-23 14:46:54.000000000 -0800 ++++ glibc-2.1.3/sunrpc/rpc_main.c 1999-06-30 09:03:23.000000000 -0700 +@@ -32,7 +32,7 @@ + * From @(#)rpc_main.c 1.30 89/03/30 (C) 1987 SMI; + */ + const char main_rcsid[] = +- "$Id: rpc_main.c,v 1.14 1999/01/23 22:46:54 drepper Exp $"; ++ "$Id: rpc_main.c,v 1.1.1.1 1999/06/30 16:03:23 gafton Exp $"; + + /* + * rpc_main.c, Top level of the RPC protocol compiler. +diff -Naur ../glibc-2.1.3/sunrpc/rpc_parse.c glibc-2.1.3/sunrpc/rpc_parse.c +--- ../glibc-2.1.3/sunrpc/rpc_parse.c 1998-02-16 09:41:53.000000000 -0800 ++++ glibc-2.1.3/sunrpc/rpc_parse.c 1998-02-20 07:54:02.000000000 -0800 +@@ -32,7 +32,7 @@ + * From: @(#)rpc_parse.c 1.8 89/02/22 (C) 1987 SMI + */ + const char parse_rcsid[] = +- "$Id: rpc_parse.c,v 1.4 1998/02/16 17:41:53 drepper Exp $"; ++ "$Id: rpc_parse.c,v 1.1.1.1 1998/02/20 15:54:02 gafton Exp $"; + + /* + * rpc_parse.c, Parser for the RPC protocol compiler +diff -Naur ../glibc-2.1.3/sunrpc/rpc_sample.c glibc-2.1.3/sunrpc/rpc_sample.c +--- ../glibc-2.1.3/sunrpc/rpc_sample.c 1998-11-16 03:56:33.000000000 -0800 ++++ glibc-2.1.3/sunrpc/rpc_sample.c 1998-11-17 07:30:23.000000000 -0800 +@@ -32,7 +32,7 @@ + * From: @(#)rpc_sample.c 1.1 90/08/30 (C) 1987 SMI + */ + char sample_rcsid[] = +- "$Id: rpc_sample.c,v 1.5 1998/11/16 11:56:33 drepper Exp $"; ++ "$Id: rpc_sample.c,v 1.1.1.1 1998/11/17 15:30:23 gafton Exp $"; + + /* + * rpc_sample.c, Sample client-server code outputter for the RPC protocol compiler +diff -Naur ../glibc-2.1.3/sunrpc/rpc_scan.c glibc-2.1.3/sunrpc/rpc_scan.c +--- ../glibc-2.1.3/sunrpc/rpc_scan.c 1998-02-16 09:41:55.000000000 -0800 ++++ glibc-2.1.3/sunrpc/rpc_scan.c 1999-06-30 09:03:25.000000000 -0700 +@@ -32,7 +32,7 @@ + * From: @(#)rpc_scan.c 1.11 89/02/22 (C) 1987 SMI + */ + char scan_rcsid[] = +- "$Id: rpc_scan.c,v 1.6 1998/02/16 17:41:55 drepper Exp $"; ++ "$Id: rpc_scan.c,v 1.1.1.1 1999/06/30 16:03:25 gafton Exp $"; + + /* + * rpc_scan.c, Scanner for the RPC protocol compiler +diff -Naur ../glibc-2.1.3/sunrpc/rpc_svcout.c glibc-2.1.3/sunrpc/rpc_svcout.c +--- ../glibc-2.1.3/sunrpc/rpc_svcout.c 1998-12-01 03:24:21.000000000 -0800 ++++ glibc-2.1.3/sunrpc/rpc_svcout.c 1998-12-01 11:42:01.000000000 -0800 +@@ -32,7 +32,7 @@ + * From: @(#)rpc_svcout.c 1.29 89/03/30 (C) 1987 SMI + */ + char svcout_rcsid[] = +- "$Id: rpc_svcout.c,v 1.7 1998/12/01 11:24:21 drepper Exp $"; ++ "$Id: rpc_svcout.c,v 1.1.1.1 1998/12/01 19:42:01 gafton Exp $"; + + /* + * rpc_svcout.c, Server-skeleton outputter for the RPC protocol compiler +diff -Naur ../glibc-2.1.3/sunrpc/rpc_tblout.c glibc-2.1.3/sunrpc/rpc_tblout.c +--- ../glibc-2.1.3/sunrpc/rpc_tblout.c 1997-03-26 17:51:46.000000000 -0800 ++++ glibc-2.1.3/sunrpc/rpc_tblout.c 1998-02-07 12:28:22.000000000 -0800 +@@ -32,7 +32,7 @@ + * From: @(#)rpc_tblout.c 1.4 89/02/22 (C) 1988 SMI + */ + char tblout_rcsid[] = +- "$Id: rpc_tblout.c,v 1.2 1997/03/27 01:51:46 drepper Exp $"; ++ "$Id: rpc_tblout.c,v 1.1.1.1 1998/02/07 20:28:22 gafton Exp $"; + + /* + * rpc_tblout.c, Dispatch table outputter for the RPC protocol compiler +diff -Naur ../glibc-2.1.3/sunrpc/rpc_util.c glibc-2.1.3/sunrpc/rpc_util.c +--- ../glibc-2.1.3/sunrpc/rpc_util.c 1998-02-16 09:41:57.000000000 -0800 ++++ glibc-2.1.3/sunrpc/rpc_util.c 1998-02-20 07:54:05.000000000 -0800 +@@ -32,7 +32,7 @@ + * From: @(#)rpc_util.c 1.11 89/02/22 (C) 1987 SMI + */ + char util_rcsid[] = +- "$Id: rpc_util.c,v 1.6 1998/02/16 17:41:57 drepper Exp $"; ++ "$Id: rpc_util.c,v 1.1.1.1 1998/02/20 15:54:05 gafton Exp $"; + + /* + * rpc_util.c, Utility routines for the RPC protocol compiler +diff -Naur ../glibc-2.1.3/sysdeps/generic/nlist.c glibc-2.1.3/sysdeps/generic/nlist.c +--- ../glibc-2.1.3/sysdeps/generic/nlist.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/sysdeps/generic/nlist.c 1998-02-07 12:29:37.000000000 -0800 +@@ -0,0 +1,43 @@ ++/* Copyright (C) 1991, 1995, 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 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. */ ++ ++#include <errno.h> ++#include <nlist.h> ++#include <stddef.h> ++ ++/* Search the executable FILE for symbols matching those in NL, ++ which is terminated by an element with a NULL `n_un.n_name' member, ++ and fill in the elements of NL. */ ++int ++nlist (file, nl) ++ const char *file; ++ struct nlist *nl; ++{ ++ if (nl == NULL) ++ { ++ __set_errno (EINVAL); ++ return -1; ++ } ++ ++ __set_errno (ENOSYS); ++ return -1; ++} ++ ++ ++stub_warning (nlist) ++#include <stub-tag.h> +diff -Naur ../glibc-2.1.3/sysdeps/generic/paths.h glibc-2.1.3/sysdeps/generic/paths.h +--- ../glibc-2.1.3/sysdeps/generic/paths.h 1998-07-20 10:19:37.000000000 -0700 ++++ glibc-2.1.3/sysdeps/generic/paths.h 1999-12-27 08:34:12.000000000 -0800 +@@ -49,7 +49,7 @@ + #define _PATH_DEVNULL "/dev/null" + #define _PATH_DRUM "/dev/drum" + #define _PATH_KMEM "/dev/kmem" +-#define _PATH_MAILDIR "/var/mail" ++#define _PATH_MAILDIR "/var/spool/mail" + #define _PATH_LASTLOG "/var/log/lastlog" + #define _PATH_MAN "/usr/man" + #define _PATH_MEM "/dev/mem" +@@ -62,10 +62,10 @@ + #define _PATH_SHADOW "/etc/shadow" + #define _PATH_SHELLS "/etc/shells" + #define _PATH_TTY "/dev/tty" +-#define _PATH_UNIX "/vmunix" ++#define _PATH_UNIX "/boot/vmunix" + #define _PATH_UTMP "/var/run/utmp" + #define _PATH_UTMP_DB "/var/run/utmp.db" +-#define _PATH_VI "/usr/bin/vi" ++#define _PATH_VI "/bin/vi" + #define _PATH_WTMP "/var/log/wtmp" + + /* Provide trailing slash, since mostly used for building pathnames. */ +diff -Naur ../glibc-2.1.3/sysdeps/generic/varargs.h glibc-2.1.3/sysdeps/generic/varargs.h +--- ../glibc-2.1.3/sysdeps/generic/varargs.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/sysdeps/generic/varargs.h 1998-02-07 12:29:56.000000000 -0800 +@@ -0,0 +1,61 @@ ++/* Copyright (C) 1991, 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 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 _VARARGS_H ++ ++#define _VARARGS_H 1 ++#include <features.h> ++ ++#ifdef __GNUC__ ++ ++#define va_alist __builtin_va_alist ++#define va_dcl int __builtin_va_alist; ++#define va_list char * ++ ++#ifdef __sparc__ ++#define va_start(AP) \ ++ (__builtin_saveregs (), \ ++ AP = ((void *) &__builtin_va_alist)) ++#else ++#define va_start(AP) AP=(char *) &__builtin_va_alist ++#endif ++#define va_end(AP) ++ ++#define __va_rounded_size(TYPE) \ ++ (((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int)) ++ ++#define va_arg(AP, TYPE) \ ++ (*((TYPE *) (AP += __va_rounded_size (TYPE), \ ++ AP - __va_rounded_size (TYPE)))) ++ ++#else /* Not GCC. */ ++ ++/* Implement varargs on top of our stdarg implementation. */ ++ ++#include <stdarg.h> ++ ++#define va_alist __va_fakearg ++#define va_dcl int __va_fakearg; ++ ++#undef va_start ++#define va_start(ap) (__va_start((ap), __va_fakearg), \ ++ (ap) -= sizeof(__va_fakearg)) ++ ++#endif /* GCC. */ ++ ++#endif /* varargs.h */ +diff -Naur ../glibc-2.1.3/sysdeps/mach/sys/reboot.h glibc-2.1.3/sysdeps/mach/sys/reboot.h +--- ../glibc-2.1.3/sysdeps/mach/sys/reboot.h 1998-05-29 03:19:59.000000000 -0700 ++++ glibc-2.1.3/sysdeps/mach/sys/reboot.h 1998-07-09 11:55:57.000000000 -0700 +@@ -26,6 +26,9 @@ + /* + * HISTORY + * $Log: reboot.h,v $ ++ * Revision 1.1.1.1 1998/07/09 18:55:57 gafton ++ * import from sourceware ++ * + * Revision 1.2 1998/05/29 10:19:59 drepper + * Use __ASSEMBLER__ test macro not ASSEMBLER. + * +diff -Naur ../glibc-2.1.3/sysdeps/powerpc/test-arith.c glibc-2.1.3/sysdeps/powerpc/test-arith.c +--- ../glibc-2.1.3/sysdeps/powerpc/test-arith.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/sysdeps/powerpc/test-arith.c 1998-02-26 11:10:25.000000000 -0800 +@@ -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 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 _GNU_SOURCE ++#define _GNU_SOURCE ++#endif ++#include <math.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <fenv.h> ++#include <assert.h> ++ ++#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<<j) ++ { ++ fesetenv(rmodes+j); ++ switch (optests[i].op) ++ { ++ case B_ADD: r = a + b; break; ++ case B_SUB: r = a - b; break; ++ case B_MUL: r = a * b; break; ++ case B_DIV: r = a / b; break; ++ case B_NEG: r = -a; break; ++ case B_ABS: r = FUNC(fabs)(a); break; ++ case B_SQRT: r = FUNC(sqrt)(a); break; ++ } ++ raised = fetestexcept(all_exceptions); ++ check_result(optests[i].line,rmnames[j],x,r); ++ check_excepts(optests[i].line,rmnames[j], ++ optests[i].excepts,raised); ++ } ++ } ++} ++ ++static void ++fail_xr(int line, const char *rm, tocheck_t x, tocheck_t r, tocheck_t xx, ++ int xflag) ++{ ++ size_t i; ++ unsigned char *cx, *cr, *cxx; ++ ++ printf("%s:%d:round %s:fail\n with x=0x", __FILE__, line,rm); ++ cx = (unsigned char *)&x; ++ cr = (unsigned char *)&r; ++ cxx = (unsigned char *)&xx; ++ for (i = 0; i < sizeof(tocheck_t); i++) ++ printf("%02x", cx[i]); ++ printf(" r=0x"); ++ for (i = 0; i < sizeof(tocheck_t); i++) ++ printf("%02x", cr[i]); ++ printf(" xx=0x"); ++ for (i = 0; i < sizeof(tocheck_t); i++) ++ printf("%02x", cxx[i]); ++ printf(" inexact=%d\n", xflag != 0); ++ nerrors++; ++} ++ ++static void ++check_sqrt(tocheck_t a) ++{ ++ int j; ++ tocheck_t r0, r1, r2, x0, x1, x2; ++ int raised = 0; ++ int ok; ++ ++ for (j = 0; j < 4; j++) ++ { ++ int excepts; ++ ++ fesetenv(rmodes+j); ++ r1 = FUNC(sqrt)(a); ++ excepts = fetestexcept(all_exceptions); ++ fesetenv(FE_DFL_ENV); ++ raised |= excepts & ~FE_INEXACT; ++ x1 = r1 * r1 - a; ++ if (excepts & FE_INEXACT) ++ { ++ r0 = delta(r1,-1); r2 = delta(r1,1); ++ switch (1 << j) ++ { ++ case R_NEAREST: ++ x0 = r0 * r0 - a; x2 = r2 * r2 - a; ++ ok = fabs(x0) >= 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 -Naur ../glibc-2.1.3/sysdeps/powerpc/test-arithf.c glibc-2.1.3/sysdeps/powerpc/test-arithf.c +--- ../glibc-2.1.3/sysdeps/powerpc/test-arithf.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/sysdeps/powerpc/test-arithf.c 1998-02-07 12:36:26.000000000 -0800 +@@ -0,0 +1,6 @@ ++typedef float tocheck_t; ++#define ESIZE 8 ++#define MSIZE 23 ++#define FUNC(x) x##f ++ ++#include "test-arith.c" +diff -Naur ../glibc-2.1.3/sysdeps/unix/bsd/osf/=dirstream.h glibc-2.1.3/sysdeps/unix/bsd/osf/=dirstream.h +--- ../glibc-2.1.3/sysdeps/unix/bsd/osf/=dirstream.h 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/sysdeps/unix/bsd/osf/=dirstream.h 1998-02-07 12:37:25.000000000 -0800 +@@ -0,0 +1,44 @@ ++/* Copyright (C) 1993 Free Software Foundation, Inc. ++ 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 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., 675 Mass Ave, ++Cambridge, MA 02139, USA. */ ++ ++#ifndef _DIRSTREAM_H ++ ++#define _DIRSTREAM_H 1 ++ ++#define __need_size_t ++#include <stddef.h> ++ ++/* Directory stream type. */ ++ ++typedef struct ++ { ++ int __fd; /* File descriptor. */ ++ ++ size_t __offset; /* Current offset into the block. */ ++ size_t __size; /* Total valid data in the block. */ ++ char *__data; /* Directory block. */ ++ ++ int __allocation; /* Space allocated for the block. */ ++ ++ int __data_len; /* Size of __data. */ ++ long __dd_seek; /* OSF/1 magic cookie returned by getdents. */ ++ void *dd_lock; /* Used by OSF/1 for inter-thread locking. */ ++ ++ } DIR; ++ ++#endif /* dirstream.h */ +diff -Naur ../glibc-2.1.3/sysdeps/unix/nlist.c glibc-2.1.3/sysdeps/unix/nlist.c +--- ../glibc-2.1.3/sysdeps/unix/nlist.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/sysdeps/unix/nlist.c 1998-02-07 12:37:11.000000000 -0800 +@@ -0,0 +1,91 @@ ++/* Copyright (C) 1991, 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 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. */ ++ ++#include <errno.h> ++#include <a.out.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++ ++ ++/* Search the executable FILE for symbols matching those in NL, ++ which is terminated by an element with a NULL `n_un.n_name' member, ++ and fill in the elements of NL. */ ++int ++nlist (const char *file, struct nlist *nl) ++{ ++ FILE *f; ++ struct exec header; ++ size_t nsymbols; ++ struct nlist *symbols; ++ unsigned long int string_table_size; ++ char *string_table; ++ register size_t i; ++ ++ if (nl == NULL) ++ { ++ __set_errno (EINVAL); ++ return -1; ++ } ++ ++ f = fopen (file, "r"); ++ if (f == NULL) ++ return -1; ++ ++ if (fread ((void *) &header, sizeof (header), 1, f) != 1) ++ goto lose; ++ ++ if (fseek (f, N_SYMOFF (header), SEEK_SET) != 0) ++ goto lose; ++ ++ symbols = (struct nlist *) __alloca (header.a_syms); ++ nsymbols = header.a_syms / sizeof (symbols[0]); ++ ++ if (fread ((void *) symbols, sizeof (symbols[0]), nsymbols, f) != nsymbols) ++ goto lose; ++ ++ if (fread ((void *) &string_table_size, sizeof (string_table_size), 1, f) ++ != 1) ++ goto lose; ++ string_table_size -= sizeof (string_table_size); ++ ++ string_table = (char *) __alloca (string_table_size); ++ if (fread ((void *) string_table, string_table_size, 1, f) != 1) ++ goto lose; ++ ++ for (i = 0; i < nsymbols; ++i) ++ { ++ register struct nlist *nlp; ++ for (nlp = nl; nlp->n_un.n_name != NULL; ++nlp) ++ if (!strcmp (nlp->n_un.n_name, ++ &string_table[symbols[i].n_un.n_strx - ++ sizeof (string_table_size)])) ++ { ++ char *const name = nlp->n_un.n_name; ++ *nlp = symbols[i]; ++ nlp->n_un.n_name = name; ++ } ++ } ++ ++ (void) fclose (f); ++ return 0; ++ ++ lose:; ++ (void) fclose (f); ++ return -1; ++} +diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/alpha/bits/types.h glibc-2.1.3/sysdeps/unix/sysv/linux/alpha/bits/types.h +--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/alpha/bits/types.h 1999-12-21 15:52:15.000000000 -0800 ++++ glibc-2.1.3/sysdeps/unix/sysv/linux/alpha/bits/types.h 2000-01-21 10:20:54.000000000 -0800 +@@ -57,8 +57,8 @@ + typedef __int64_t __loff_t; /* Type of file sizes and offsets. */ + typedef __int32_t __pid_t; /* Type of process identifications. */ + typedef __int64_t __ssize_t; /* Type of a byte count, or error. */ +-typedef __uint64_t __rlim_t; /* Type of resource counts. */ +-typedef __uint64_t __rlim64_t; /* "" (LFS) */ ++typedef __int64_t __rlim_t; /* Type of resource counts. */ ++typedef __int64_t __rlim64_t; /* "" (LFS) */ + typedef __uint32_t __blkcnt_t; /* Type to count nr disk blocks. */ + typedef __uint64_t __blkcnt64_t; /* "" (LFS) */ + typedef __int32_t __fsblkcnt_t; /* Type to count file system blocks. */ +diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/bits/types.h glibc-2.1.3/sysdeps/unix/sysv/linux/bits/types.h +--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/bits/types.h 1999-12-21 15:52:16.000000000 -0800 ++++ glibc-2.1.3/sysdeps/unix/sysv/linux/bits/types.h 2000-01-21 10:20:54.000000000 -0800 +@@ -68,8 +68,8 @@ + typedef __quad_t __loff_t; /* Type of file sizes and offsets. */ + typedef int __pid_t; /* Type of process identifications. */ + typedef int __ssize_t; /* Type of a byte count, or error. */ +-typedef __u_long __rlim_t; /* Type of resource counts. */ +-typedef __u_quad_t __rlim64_t; /* Type of resource counts (LFS). */ ++typedef long int __rlim_t; /* Type of resource counts. */ ++typedef __quad_t __rlim64_t; /* Type of resource counts (LFS). */ + typedef __u_int __id_t; /* General type for ID. */ + + typedef struct +diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/i386/bits/resource.h glibc-2.1.3/sysdeps/unix/sysv/linux/i386/bits/resource.h +--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/i386/bits/resource.h 2000-01-25 20:09:30.000000000 -0800 ++++ glibc-2.1.3/sysdeps/unix/sysv/linux/i386/bits/resource.h 1969-12-31 16:00:00.000000000 -0800 +@@ -1,205 +0,0 @@ +-/* Bit values & structures for resource limits. Linux version. +- Copyright (C) 1994, 1996, 1997, 1998, 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 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 _SYS_RESOURCE_H +-# error "Never use <bits/resource.h> directly; include <sys/resource.h> instead." +-#endif +- +-#include <bits/types.h> +- +-/* Transmute defines to enumerations. The macro re-definitions are +- necessary because some programs want to test for operating system +- features with #ifdef RUSAGE_SELF. In ISO C the reflexive +- definition is a no-op. */ +- +-/* Kinds of resource limit. */ +-enum __rlimit_resource +-{ +- /* Per-process CPU limit, in seconds. */ +- RLIMIT_CPU = 0, +-#define RLIMIT_CPU RLIMIT_CPU +- +- /* Largest file that can be created, in bytes. */ +- RLIMIT_FSIZE = 1, +-#define RLIMIT_FSIZE RLIMIT_FSIZE +- +- /* Maximum size of data segment, in bytes. */ +- RLIMIT_DATA = 2, +-#define RLIMIT_DATA RLIMIT_DATA +- +- /* Maximum size of stack segment, in bytes. */ +- RLIMIT_STACK = 3, +-#define RLIMIT_STACK RLIMIT_STACK +- +- /* Largest core file that can be created, in bytes. */ +- RLIMIT_CORE = 4, +-#define RLIMIT_CORE RLIMIT_CORE +- +- /* Largest resident set size, in bytes. +- This affects swapping; processes that are exceeding their +- resident set size will be more likely to have physical memory +- taken from them. */ +- RLIMIT_RSS = 5, +-#define RLIMIT_RSS RLIMIT_RSS +- +- /* Number of open files. */ +- RLIMIT_NOFILE = 7, +- RLIMIT_OFILE = RLIMIT_NOFILE, /* BSD name for same. */ +-#define RLIMIT_NOFILE RLIMIT_NOFILE +-#define RLIMIT_OFILE RLIMIT_OFILE +- +- /* Address space limit. */ +- RLIMIT_AS = 9, +-#define RLIMIT_AS RLIMIT_AS +- +- /* Number of processes. */ +- RLIMIT_NPROC = 6, +-#define RLIMIT_NPROC RLIMIT_NPROC +- +- /* Locked-in-memory address space. */ +- RLIMIT_MEMLOCK = 8, +-#define RLIMIT_MEMLOCK RLIMIT_MEMLOCK +- +- RLIMIT_NLIMITS = 10, +- RLIM_NLIMITS = RLIMIT_NLIMITS +-#define RLIMIT_NLIMITS RLIMIT_NLIMITS +-#define RLIM_NLIMITS RLIM_NLIMITS +-}; +- +-/* Value to indicate that there is no limit. */ +-#ifndef __USE_FILE_OFFSET64 +-# define RLIM_INFINITY ((long int) (~0UL >> 1)) +-#else +-# define RLIM_INFINITY 0x7fffffffffffffffLL +-#endif +- +-#ifdef __USE_LARGEFILE64 +-# define RLIM64_INFINITY 0x7fffffffffffffffLL +-#endif +- +-/* We can represent all limits. */ +-#define RLIM_SAVED_MAX RLIM_INFINITY +-#define RLIM_SAVED_CUR RLIM_INFINITY +- +- +-/* Type for resource quantity measurement. */ +-#ifndef __USE_FILE_OFFSET64 +-typedef __rlim_t rlim_t; +-#else +-typedef __rlim64_t rlim_t; +-#endif +-#ifdef __USE_LARGEFILE64 +-typedef __rlim64_t rlim64_t; +-#endif +- +-struct rlimit +- { +- /* The current (soft) limit. */ +- rlim_t rlim_cur; +- /* The hard limit. */ +- rlim_t rlim_max; +- }; +- +-#ifdef __USE_LARGEFILE64 +-struct rlimit64 +- { +- /* The current (soft) limit. */ +- rlim64_t rlim_cur; +- /* The hard limit. */ +- rlim64_t rlim_max; +- }; +-#endif +- +-/* Whose usage statistics do you want? */ +-enum __rusage_who +-{ +- /* The calling process. */ +- RUSAGE_SELF = 0, +-#define RUSAGE_SELF RUSAGE_SELF +- +- /* All of its terminated child processes. */ +- RUSAGE_CHILDREN = -1, +-#define RUSAGE_CHILDREN RUSAGE_CHILDREN +- +- /* Both. */ +- RUSAGE_BOTH = -2 +-#define RUSAGE_BOTH RUSAGE_BOTH +-}; +- +-#define __need_timeval +-#include <bits/time.h> /* For `struct timeval'. */ +- +-/* Structure which says how much of each resource has been used. */ +-struct rusage +- { +- /* Total amount of user time used. */ +- struct timeval ru_utime; +- /* Total amount of system time used. */ +- struct timeval ru_stime; +- /* Maximum resident set size (in kilobytes). */ +- long int ru_maxrss; +- /* Amount of sharing of text segment memory +- with other processes (kilobyte-seconds). */ +- long int ru_ixrss; +- /* Amount of data segment memory used (kilobyte-seconds). */ +- long int ru_idrss; +- /* Amount of stack memory used (kilobyte-seconds). */ +- long int ru_isrss; +- /* Number of soft page faults (i.e. those serviced by reclaiming +- a page from the list of pages awaiting reallocation. */ +- long int ru_minflt; +- /* Number of hard page faults (i.e. those that required I/O). */ +- long int ru_majflt; +- /* Number of times a process was swapped out of physical memory. */ +- long int ru_nswap; +- /* Number of input operations via the file system. Note: This +- and `ru_oublock' do not include operations with the cache. */ +- long int ru_inblock; +- /* Number of output operations via the file system. */ +- long int ru_oublock; +- /* Number of IPC messages sent. */ +- long int ru_msgsnd; +- /* Number of IPC messages received. */ +- long int ru_msgrcv; +- /* Number of signals delivered. */ +- long int ru_nsignals; +- /* Number of voluntary context switches, i.e. because the process +- gave up the process before it had to (usually to wait for some +- resource to be available). */ +- long int ru_nvcsw; +- /* Number of involuntary context switches, i.e. a higher priority process +- became runnable or the current process used up its time slice. */ +- long int ru_nivcsw; +- }; +- +-/* Priority limits. */ +-#define PRIO_MIN -20 /* Minimum priority a process can have. */ +-#define PRIO_MAX 20 /* Maximum priority a process can have. */ +- +-/* The type of the WHICH argument to `getpriority' and `setpriority', +- indicating what flavor of entity the WHO argument specifies. */ +-enum __priority_which +-{ +- PRIO_PROCESS = 0, /* WHO is a process ID. */ +-#define PRIO_PROCESS PRIO_PROCESS +- PRIO_PGRP = 1, /* WHO is a process group ID. */ +-#define PRIO_PGRP PRIO_PGRP +- PRIO_USER = 2 /* WHO is a user ID. */ +-#define PRIO_USER PRIO_USER +-}; +diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/mips/bits/types.h glibc-2.1.3/sysdeps/unix/sysv/linux/mips/bits/types.h +--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/mips/bits/types.h 1999-12-21 15:52:18.000000000 -0800 ++++ glibc-2.1.3/sysdeps/unix/sysv/linux/mips/bits/types.h 2000-01-21 10:20:54.000000000 -0800 +@@ -68,8 +68,8 @@ + typedef __quad_t __loff_t; /* Type of file sizes and offsets. */ + typedef int __pid_t; /* Type of process identifications. */ + typedef int __ssize_t; /* Type of a byte count, or error. */ +-typedef __u_long __rlim_t; /* Type of resource counts. */ +-typedef __u_quad_t __rlim64_t; /* Type of resource counts (LFS). */ ++typedef long int __rlim_t; /* Type of resource counts. */ ++typedef __quad_t __rlim64_t; /* Type of resource counts (LFS). */ + typedef __u_int __id_t; /* General type for ID. */ + + typedef struct +diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/paths.h glibc-2.1.3/sysdeps/unix/sysv/linux/paths.h +--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/paths.h 1998-08-12 10:05:51.000000000 -0700 ++++ glibc-2.1.3/sysdeps/unix/sysv/linux/paths.h 1999-12-27 08:34:12.000000000 -0800 +@@ -51,7 +51,7 @@ + #define _PATH_KLOG "/proc/kmsg" + #define _PATH_KMEM "/dev/kmem" + #define _PATH_LASTLOG "/var/log/lastlog" +-#define _PATH_MAILDIR "/var/mail" ++#define _PATH_MAILDIR "/var/spool/mail" + #define _PATH_MAN "/usr/man" + #define _PATH_MEM "/dev/mem" + #define _PATH_MNTTAB "/etc/fstab" +@@ -63,9 +63,9 @@ + #define _PATH_SHADOW "/etc/shadow" + #define _PATH_SHELLS "/etc/shells" + #define _PATH_TTY "/dev/tty" +-#define _PATH_UNIX "/vmlinux" ++#define _PATH_UNIX "/boot/vmlinux" + #define _PATH_UTMP "/var/run/utmp" +-#define _PATH_VI "/usr/bin/vi" ++#define _PATH_VI "/bin/vi" + #define _PATH_WTMP "/var/log/wtmp" + + /* Provide trailing slash, since mostly used for building pathnames. */ +diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/bits/types.h glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/bits/types.h +--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/bits/types.h 1999-12-21 15:52:19.000000000 -0800 ++++ glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/bits/types.h 2000-01-21 10:20:54.000000000 -0800 +@@ -85,8 +85,8 @@ + #else + typedef int __ssize_t; /* Type of a byte count, or error. */ + #endif +-typedef __u_long __rlim_t; /* Type of resource counts. */ +-typedef __u_quad_t __rlim64_t; /* Type of resource counts (LFS). */ ++typedef long int __rlim_t; /* Type of resource counts. */ ++typedef __quad_t __rlim64_t; /* Type of resource counts (LFS). */ + typedef __u_int __id_t; /* General type for IDs. */ + + typedef struct +diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/getsysstats.c glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/getsysstats.c +--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/getsysstats.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/sysdeps/unix/sysv/linux/sparc/getsysstats.c 2000-02-29 13:25:59.000000000 -0800 +@@ -0,0 +1,55 @@ ++/* Determine various system internal values, Linux/Sparc version. ++ Copyright (C) 1999 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ Contributed by Andreas Schwab <schwab@suse.de> and ++ Jakub Jelinek <jj@ultra.linux.cz> ++ ++ 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. */ ++ ++ ++/* We need to define a special parser for /proc/cpuinfo. */ ++#define GET_NPROCS_PARSER(FP, BUFFER, RESULT) \ ++ do \ ++ { \ ++ (RESULT) = 0; \ ++ /* Find the line that contains the information about the number of \ ++ active cpus. We don't have to fear extremely long lines since \ ++ the kernel will not generate them. 8192 bytes are really \ ++ enough. */ \ ++ while (fgets_unlocked (BUFFER, sizeof (BUFFER), FP) != NULL) \ ++ if (sscanf (BUFFER, "ncpus active : %d", &(RESULT)) == 1) \ ++ break; \ ++ } \ ++ while (0) ++ ++ ++/* On the Sparc we can distinguish between the number of configured and ++ active cpus. */ ++#define GET_NPROCS_CONF_PARSER(FP, BUFFER, RESULT) \ ++ do \ ++ { \ ++ (RESULT) = 0; \ ++ /* Find the line that contains the information about the number of \ ++ probed cpus. We don't have to fear extremely long lines since \ ++ the kernel will not generate them. 8192 bytes are really \ ++ enough. */ \ ++ while (fgets_unlocked ((BUFFER), sizeof (BUFFER), (FP)) != NULL) \ ++ if (sscanf (buffer, "ncpus probed : %d", &(RESULT)) == 1) \ ++ break; \ ++ } \ ++ while (0) ++ ++#include <sysdeps/unix/sysv/linux/getsysstats.c> +diff -Naur ../glibc-2.1.3/sysdeps/unix/sysv/linux/sys/quota.h glibc-2.1.3/sysdeps/unix/sysv/linux/sys/quota.h +--- ../glibc-2.1.3/sysdeps/unix/sysv/linux/sys/quota.h 1998-10-05 06:40:12.000000000 -0700 ++++ glibc-2.1.3/sysdeps/unix/sysv/linux/sys/quota.h 1999-06-30 09:20:26.000000000 -0700 +@@ -35,7 +35,7 @@ + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * +- * Version: $Id: quota.h,v 1.5 1998/10/05 13:40:12 drepper Exp $ ++ * Version: $Id: quota.h,v 1.1.1.1 1999/06/30 16:20:26 gafton Exp $ + */ + + #ifndef _SYS_QUOTA_H +diff -Naur ../glibc-2.1.3/time/ap.c glibc-2.1.3/time/ap.c +--- ../glibc-2.1.3/time/ap.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/time/ap.c 1998-02-07 12:39:22.000000000 -0800 +@@ -0,0 +1,45 @@ ++/* Copyright (C) 1991, 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 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. */ ++ ++#include <stdio.h> ++#include <stdlib.h> ++#include <time.h> ++#include <malloc.h> ++#include <mcheck.h> ++ ++/* Prints the time in the form "hh:mm ?M", where ? is A or P. ++ A simple test for strftime(). */ ++int ++main (int argc, char *argv[]) ++{ ++ char buf[20]; ++ time_t t; ++ ++ mcheck (NULL); ++ ++ if (argc != 1) ++ fprintf (stderr, "Usage: %s\n", argv[0]); ++ ++ t = time ((time_t *) NULL); ++ if (strftime (buf, sizeof (buf), "%I:%M %p", localtime (&t)) == 0) ++ exit (EXIT_FAILURE); ++ ++ puts (buf); ++ ++ return EXIT_SUCCESS; ++} +diff -Naur ../glibc-2.1.3/time/date.c glibc-2.1.3/time/date.c +--- ../glibc-2.1.3/time/date.c 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/time/date.c 1998-02-07 12:39:31.000000000 -0800 +@@ -0,0 +1,49 @@ ++/* Copyright (C) 1991, 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 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. */ ++ ++#include <stddef.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <time.h> ++ ++ ++/* Prints the date in the form "Day Mon dd hh:mm:ss ZZZ yyyy\n". ++ A simple test for localtime and strftime. */ ++int ++main (argc, argv) ++ int argc; ++ char **argv; ++{ ++ time_t t = time (NULL); ++ struct tm *tp = localtime (&t); ++ char good = tp != NULL; ++ ++ if (good) ++ { ++ char buf[BUFSIZ]; ++ good = strftime (buf, sizeof (buf), "%a %b %d %X %Z %Y", tp); ++ if (good) ++ puts (buf); ++ else ++ perror ("strftime"); ++ } ++ else ++ perror ("localtime"); ++ ++ return good ? EXIT_SUCCESS : EXIT_FAILURE; ++} +diff -Naur ../glibc-2.1.3/timezone/Makefile glibc-2.1.3/timezone/Makefile +--- ../glibc-2.1.3/timezone/Makefile 1999-05-05 04:32:09.000000000 -0700 ++++ glibc-2.1.3/timezone/Makefile 2000-02-14 15:34:01.000000000 -0800 +@@ -33,7 +33,7 @@ + tzbases := africa antarctica asia australasia europe northamerica \ + southamerica etcetera factory systemv \ + solar87 solar88 solar89 +-tzlinks := backward ++tzlinks := backward aliases + tzfiles := $(tzbases) $(tzlinks) + # pacificnew doesn't compile; if it is to be used, it should be included in + # northamerica. +diff -Naur ../glibc-2.1.3/timezone/aliases glibc-2.1.3/timezone/aliases +--- ../glibc-2.1.3/timezone/aliases 1969-12-31 16:00:00.000000000 -0800 ++++ glibc-2.1.3/timezone/aliases 2000-02-14 15:34:01.000000000 -0800 +@@ -0,0 +1,10 @@ ++# $Id: aliases,v 1.2 2000/02/14 23:34:01 gafton Exp $ ++ ++# this file contains timezone aliases people might care about. We do not ++# add them to the backward file because we want to be able to clearly ++# identify the ones that are not official timezones. It is better to ++# maintain this list separately, because it is for the benefit of the user ++# config tools only. ++ ++Link Asia/Shanghai China/Shanghai ++Link Asia/Shanghai China/Beijing diff --git a/patches/glibc/2.1.3/rh62-01-glibc-2.1.3-security.patch b/patches/glibc/2.1.3/rh62-01-glibc-2.1.3-security.patch new file mode 100644 index 00000000..5bef1fd4 --- /dev/null +++ b/patches/glibc/2.1.3/rh62-01-glibc-2.1.3-security.patch @@ -0,0 +1,32 @@ +2000-05-03 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/generic/dl-environ.c (unsetenv): Follow change to the + real unsetenv implementation from 1999-07-29 [PR libc/1714]. + +--- glibc-2.1.3/sysdeps/generic/dl-environ.c.jj Thu Jul 23 16:56:52 1998 ++++ glibc-2.1.3/sysdeps/generic/dl-environ.c Tue May 9 13:48:11 2000 +@@ -1,5 +1,5 @@ +-/*Environment handling for dynamic loader. +- Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. ++/* Environment handling for dynamic loader. ++ Copyright (C) 1995, 1996, 1997, 1998, 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 +@@ -55,7 +55,8 @@ unsetenv (const char *name) + const size_t len = strlen (name); + char **ep; + +- for (ep = _environ; *ep != NULL; ++ep) ++ ep = _environ; ++ while (*ep != NULL) + if (!strncmp (*ep, name, len) && (*ep)[len] == '=') + { + /* Found it. Remove this pointer by moving later ones back. */ +@@ -66,4 +67,6 @@ unsetenv (const char *name) + while (*dp++); + /* Continue the loop in case NAME appears again. */ + } ++ else ++ ++ep; + } diff --git a/patches/glibc/2.1.3/rh62-02-glibc-2.1.3-locale.patch b/patches/glibc/2.1.3/rh62-02-glibc-2.1.3-locale.patch new file mode 100644 index 00000000..7466ac2c --- /dev/null +++ b/patches/glibc/2.1.3/rh62-02-glibc-2.1.3-locale.patch @@ -0,0 +1,76 @@ +2000-08-27 Ulrich Drepper <drepper@redhat.com> + + * intl/dcgettext.c (DCGETTEXT): Remove _nl_find_language in code + to determine invalid locale name. + * locale/findlocale.c (_nl_find_locale): Likewise. + +2000-08-21 Ulrich Drepper <drepper@redhat.com> + + * catgets/catgets.c (catopen): Filter out env_var values with / if + necessary. + + * locale/findlocale.c (_nl_find_locale): Move test for unusable + locale name after all getenvs. + +--- glibc-2.1.3/catgets/catgets.c 2000/01/29 11:56:33 1.15 ++++ glibc-2.1.3/catgets/catgets.c 2000/08/21 20:55:30 1.16 +@@ -50,7 +50,8 @@ + /* Use the LANG environment variable. */ + env_var = getenv ("LANG"); + +- if (env_var == NULL) ++ if (env_var == NULL || *env_var == '\0' ++ || (__libc_enable_secure && strchr (env_var, '/') != NULL)) + env_var = "C"; + + env_var_len = strlen (env_var) + 1; +--- glibc-2.1.3/locale/findlocale.c 1999/11/08 23:45:13 1.10.2.1 ++++ glibc-2.1.3/locale/findlocale.c 2000/08/21 21:02:42 1.10.2.2 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc. ++/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.org>, 1996. + +@@ -54,11 +54,7 @@ + const char *revision; + struct loaded_l10nfile *locale_file; + +- if ((*name)[0] == '\0' +- /* In SUID binaries we must not allow people to access files +- outside the dedicated locale directories. */ +- || (__libc_enable_secure +- && memchr (*name, '/', _nl_find_language (*name) - *name) != NULL)) ++ if ((*name)[0] == '\0') + { + /* The user decides which locale to use by setting environment + variables. */ +@@ -67,9 +63,12 @@ + *name = getenv (_nl_category_names[category]); + if (*name == NULL || (*name)[0] == '\0') + *name = getenv ("LANG"); +- if (*name == NULL || (*name)[0] == '\0') +- *name = (char *) _nl_C_name; + } ++ ++ if (*name == NULL || (*name)[0] == '\0' ++ || (__builtin_expect (__libc_enable_secure, 0) ++ && strchr (*name, '/') != NULL)) ++ *name = (char *) _nl_C_name; + + if (strcmp (*name, _nl_C_name) == 0 || strcmp (*name, _nl_POSIX_name) == 0) + { +--- glibc-2.1.3/intl/dcgettext.c Sun Aug 27 23:15:33 2000 ++++ glibc-2.1.3/intl/dcgettext.c Sun Aug 27 23:16:34 2000 +@@ -371,10 +371,7 @@ + + /* When this is a SUID binary we must not allow accessing files + outside the dedicated directories. */ +- if (ENABLE_SECURE +- && (memchr (single_locale, '/', +- _nl_find_language (single_locale) - single_locale) +- != NULL)) ++ if (ENABLE_SECURE && strchr (single_locale, '/') != NULL) + /* Ingore this entry. */ + continue; + } diff --git a/patches/glibc/2.1.3/rh62-03-glibc-2.1.3-crypt.patch b/patches/glibc/2.1.3/rh62-03-glibc-2.1.3-crypt.patch new file mode 100644 index 00000000..bc3289c5 --- /dev/null +++ b/patches/glibc/2.1.3/rh62-03-glibc-2.1.3-crypt.patch @@ -0,0 +1,207 @@ +--- glibc-2.1.3/md5-crypt/md5-crypt.c 2000/03/04 00:47:30 1.1 ++++ glibc-2.1.3/md5-crypt/md5-crypt.c 2000/08/24 06:10:02 1.8 +@@ -1,5 +1,5 @@ + /* One way encryption based on MD5 sum. +- Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. ++ Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + +@@ -18,6 +18,7 @@ + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + ++#include <assert.h> + #include <errno.h> + #include <stdlib.h> + #include <string.h> +@@ -37,9 +38,9 @@ + + + /* Prototypes for local functions. */ +-extern char *__md5_crypt_r __P ((const char *key, const char *salt, +- char *buffer, int buflen)); +-extern char *__md5_crypt __P ((const char *key, const char *salt)); ++extern char *__md5_crypt_r (const char *key, const char *salt, ++ char *buffer, int buflen); ++extern char *__md5_crypt (const char *key, const char *salt); + + + /* This entry point is equivalent to the `crypt' function in Unix +@@ -51,13 +52,16 @@ + char *buffer; + int buflen; + { +- unsigned char alt_result[16]; ++ unsigned char alt_result[16] ++ __attribute__ ((__aligned__ (__alignof__ (md5_uint32)))); + struct md5_ctx ctx; + struct md5_ctx alt_ctx; + size_t salt_len; + size_t key_len; + size_t cnt; + char *cp; ++ char *copied_key = NULL; ++ char *copied_salt = NULL; + + /* Find beginning of salt string. The prefix should normally always + be present. Just in case it is not. */ +@@ -68,6 +72,26 @@ + salt_len = MIN (strcspn (salt, "$"), 8); + key_len = strlen (key); + ++ if ((key - (char *) 0) % __alignof__ (md5_uint32) != 0) ++ { ++ char *tmp = (char *) alloca (key_len + __alignof__ (md5_uint32)); ++ key = copied_key = ++ memcpy (tmp + __alignof__ (md5_uint32) ++ - (tmp - (char *) 0) % __alignof__ (md5_uint32), ++ key, key_len); ++ assert ((key - (char *) 0) % __alignof__ (md5_uint32) == 0); ++ } ++ ++ if ((salt - (char *) 0) % __alignof__ (md5_uint32) != 0) ++ { ++ char *tmp = (char *) alloca (salt_len + __alignof__ (md5_uint32)); ++ salt = copied_salt = ++ memcpy (tmp + __alignof__ (md5_uint32) ++ - (tmp - (char *) 0) % __alignof__ (md5_uint32), ++ salt, salt_len); ++ assert ((salt - (char *) 0) % __alignof__ (md5_uint32) == 0); ++ } ++ + /* Prepare for the real work. */ + __md5_init_ctx (&ctx); + +@@ -195,21 +219,30 @@ + + /* Clear the buffer for the intermediate result so that people + attaching to processes or reading core dumps cannot get any +- information. */ +- memset (alt_result, '\0', sizeof (alt_result)); ++ information. We do it in this way to clear correct_words[] ++ inside the MD5 implementation as well. */ ++ __md5_init_ctx (&ctx); ++ __md5_finish_ctx (&ctx, alt_result); ++ memset (&ctx, '\0', sizeof (ctx)); ++ memset (&alt_ctx, '\0', sizeof (alt_ctx)); ++ if (copied_key != NULL) ++ memset (copied_key, '\0', key_len); ++ if (copied_salt != NULL) ++ memset (copied_salt, '\0', salt_len); + + return buffer; + } + + ++static char *buffer; ++ + char * + __md5_crypt (const char *key, const char *salt) + { + /* We don't want to have an arbitrary limit in the size of the + password. We can compute the size of the result in advance and + so we can prepare the buffer we pass to `md5_crypt_r'. */ +- static char *buffer = NULL; +- static int buflen = 0; ++ static int buflen; + int needed = 3 + strlen (salt) + 1 + 26 + 1; + + if (buflen < needed) +@@ -220,4 +253,12 @@ + } + + return __md5_crypt_r (key, salt, buffer, buflen); ++} ++ ++ ++static void ++__attribute__ ((__destructor__)) ++free_mem (void) ++{ ++ free (buffer); + } +--- glibc-2.1.3/md5-crypt/md5.c 2000/03/04 00:47:30 1.1 ++++ glibc-2.1.3/md5-crypt/md5.c 2000/07/04 18:22:44 1.2 +@@ -1,6 +1,6 @@ +-/* md5.c - Functions to compute MD5 message digest of files or memory blocks ++/* Functions to compute MD5 message digest of files or memory blocks. + according to the definition of MD5 in RFC 1321 from April 1992. +- Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc. ++ Copyright (C) 1995, 1996, 1997, 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 +@@ -217,6 +217,8 @@ + size_t len; + struct md5_ctx *ctx; + { ++ //const void aligned_buffer = buffer; ++ + /* When we already have some bits in our internal buffer concatenate + both inputs first. */ + if (ctx->buflen != 0) +@@ -224,16 +226,20 @@ + size_t left_over = ctx->buflen; + size_t add = 128 - left_over > len ? len : 128 - left_over; + ++ /* Only put full words in the buffer. */ ++ add -= add % __alignof__ (md5_uint32); ++ + memcpy (&ctx->buffer[left_over], buffer, add); + ctx->buflen += add; + +- if (left_over + add > 64) ++ if (ctx->buflen > 64) + { +- md5_process_block (ctx->buffer, (left_over + add) & ~63, ctx); ++ md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx); ++ ++ ctx->buflen &= 63; + /* The regions in the following copy operation cannot overlap. */ + memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63], +- (left_over + add) & 63); +- ctx->buflen = (left_over + add) & 63; ++ ctx->buflen); + } + + buffer = (const char *) buffer + add; +@@ -251,8 +257,17 @@ + /* Move remaining bytes in internal buffer. */ + if (len > 0) + { +- memcpy (ctx->buffer, buffer, len); +- ctx->buflen = len; ++ size_t left_over = ctx->buflen; ++ ++ memcpy (&ctx->buffer[left_over], buffer, len); ++ left_over += len; ++ if (left_over >= 64) ++ { ++ md5_process_block (ctx->buffer, 64, ctx); ++ left_over -= 64; ++ memcpy (ctx->buffer, &ctx->buffer[64], left_over); ++ } ++ ctx->buflen = left_over; + } + } + +--- glibc-2.1.3/md5-crypt/md5.h 2000/03/04 00:47:30 1.1 ++++ glibc-2.1.3/md5-crypt/md5.h 2000/07/04 18:22:44 1.2 +@@ -1,6 +1,6 @@ + /* Declaration of functions and data types used for MD5 sum computing + library functions. +- Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc. ++ Copyright (C) 1995, 1996, 1997, 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 +@@ -87,7 +87,7 @@ + + md5_uint32 total[2]; + md5_uint32 buflen; +- char buffer[128]; ++ char buffer[128] __attribute__ ((__aligned__ (__alignof__ (md5_uint32)))); + }; + + /* diff --git a/patches/glibc/2.1.3/rh62-04-glibc-2.1.3-tzfile.patch b/patches/glibc/2.1.3/rh62-04-glibc-2.1.3-tzfile.patch new file mode 100644 index 00000000..06df6334 --- /dev/null +++ b/patches/glibc/2.1.3/rh62-04-glibc-2.1.3-tzfile.patch @@ -0,0 +1,22 @@ +2000-08-09 Jakub Jelinek <jakub@redhat.com> + + * time/tzfile.c (__tzfile_compute): __tzstring zones + from zone_names. + +--- glibc-2.1.3/time/tzfile.c.jj Fri May 7 16:41:44 1999 ++++ glibc-2.1.3/time/tzfile.c Fri Aug 25 09:55:20 2000 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1991,92,93,95,96,97,98,99 Free Software Foundation, Inc. ++/* Copyright (C) 1991,92,93,95,96,97,98,99,2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -498,7 +498,7 @@ __tzfile_compute (time_t timer, int use_ + /* There is no daylight saving time. */ + __tzname[1] = __tzname[0]; + tp->tm_isdst = info->isdst; +- tp->tm_zone = &zone_names[info->idx]; ++ tp->tm_zone = __tzstring (&zone_names[info->idx]); + tp->tm_gmtoff = info->offset; + } + diff --git a/patches/glibc/2.1.3/rh62-06-glibc-2.1.3-preload.patch b/patches/glibc/2.1.3/rh62-06-glibc-2.1.3-preload.patch new file mode 100644 index 00000000..4b72e085 --- /dev/null +++ b/patches/glibc/2.1.3/rh62-06-glibc-2.1.3-preload.patch @@ -0,0 +1,86 @@ +2001-01-08 Ulrich Drepper <drepper@redhat.com> + + * elf/rtld.c (process_envvars): Place output files for profiling + in SUID binaries in /var/profile. + + * elf/dl-load.c (_dl_map_object): Don't look in cache for + preloading in SUID binaries. + + * elf/dl-profile.c (_dl_start_profile): Open the output file with + O_NOFOLLOW if possible. + + * sysdeps/generic/segfault.c (install_handler): Check output file + name with access(). + +--- libc/elf/rtld.c 2000/03/15 05:42:01 1.148.2.7 ++++ libc/elf/rtld.c 2001/01/10 07:45:19 +@@ -1273,7 +1273,7 @@ + char *debug_output = NULL; + + /* This is the default place for profiling data file. */ +- _dl_profile_output = "/var/tmp"; ++ _dl_profile_output = __libc_enable_secure ? "/var/profile" : "/var/tmp"; + + while ((envline = _dl_next_ld_env_entry (&runp)) != NULL) + { +--- libc/elf/dl-load.c 1999/11/20 02:26:38 1.103.2.5 ++++ libc/elf/dl-load.c 2001/01/10 07:45:20 +@@ -1338,7 +1338,7 @@ + if (fd == -1 && env_path_list != NULL) + fd = open_path (name, namelen, preloaded, env_path_list, &realname); + +- if (fd == -1) ++ if (fd == -1 && (! preloaded || ! __libc_enable_secure)) + { + /* Check the list of libraries in the file /etc/ld.so.cache, + for compatibility with Linux's ldconfig program. */ +--- libc/elf/dl-profile.c 1998/06/07 13:35:48 1.14 ++++ libc/elf/dl-profile.c 2001/01/10 07:45:21 +@@ -263,7 +263,12 @@ + *cp++ = '/'; + __stpcpy (__stpcpy (cp, _dl_profile), ".profile"); + +- fd = __open (filename, O_RDWR | O_CREAT, 0666); ++#ifdef O_NOFOLLOW ++# define EXTRA_FLAGS | O_NOFOLLOW ++#else ++# define EXTRA_FLAGS ++#endif ++ fd = __open (filename, O_RDWR | O_CREAT EXTRA_FLAGS, 0666); + if (fd == -1) + { + /* We cannot write the profiling data so don't do anything. */ +--- libc/sysdeps/generic/segfault.c 2000/03/21 04:53:40 1.10.2.2 ++++ libc/sysdeps/generic/segfault.c 2001/01/10 07:45:22 +@@ -236,6 +236,7 @@ + + /* Preserve the output file name if there is any given. */ + name = getenv ("SEGFAULT_OUTPUT_NAME"); +- if (name != NULL && name[0] != '\0') ++ if (name != NULL && name[0] != '\0' ++ && (!__libc_enable_secure || access (name, R_OK | W_OK) == 0)) + fname = __strdup (name); + } + +--- libc/sysdeps/unix/sysv/linux/i386/dl-librecon.h.jj Wed Feb 24 23:01:58 1999 ++++ libc/sysdeps/unix/sysv/linux/i386/dl-librecon.h Mon Jan 15 04:30:57 2001 +@@ -49,13 +49,17 @@ + /* Recognizing extra environment variables. */ + #define EXTRA_LD_ENVVARS \ + case 15: \ +- if (memcmp (&envline[3], "LIBRARY_VERSION", 15) == 0) \ ++ if (!__libc_enable_secure \ ++ && memcmp (&envline[3], "LIBRARY_VERSION", 15) == 0) \ + { \ + _dl_correct_cache_id = envline[19] == '5' ? 2 : 3; \ + break; \ + } + + /* Extra unsecure variables. */ +-#define EXTRA_UNSECURE_ENVVARS "LD_AOUT_LIBRARY_PATH", "LD_AOUT_PRELOAD" ++#define EXTRA_UNSECURE_ENVVARS \ ++ "LD_AOUT_LIBRARY_PATH", \ ++ "LD_AOUT_PRELOAD", \ ++ "LD_LIBRARY_VERSION" + + #endif /* dl-librecon.h */ diff --git a/patches/glibc/2.1.3/rh62-07-glibc-2.1.3-alpha.patch b/patches/glibc/2.1.3/rh62-07-glibc-2.1.3-alpha.patch new file mode 100644 index 00000000..037758cd --- /dev/null +++ b/patches/glibc/2.1.3/rh62-07-glibc-2.1.3-alpha.patch @@ -0,0 +1,124 @@ +2000-03-15 Cristian Gafton <gafton@redhat.com> + + * db2/mutex/alpha.gcc (TSL_SET): Backport from db3. + * sysdeps/alpha/Makefile (CPPFLAGS): Define for db2 directory. + * db2/mutex/mutex.c: Include alpha.gcc ifdef HAVE_ASSEM_ALPHA_GCC. + +2000-03-14 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/unix/sysv/linux/alpha/ioperm.c (platform): Add entry for + Nautilus. Patch by Soohoon Lee <soohoon.lee@alpha-processor.com>. + +--- glibc-2.1.3-15/db2/mutex/alpha.gcc Wed Aug 27 15:32:54 1997 ++++ glibc-2.1.3-16/db2/mutex/alpha.gcc Wed Mar 15 16:50:45 2000 +@@ -1,52 +1,24 @@ + /* +- * @(#)alpha.gcc 10.1 (Sleepycat) 4/12/97 +- * +- * The code appearing below is taken from Richard L. Sites, ed. "Alpha +- * Architecture Reference Manual", Digital Press, 1992, page 5-7 and 5-8. +- * There are 2 modifications: +- * +- * 1. The jump from blbs __r1,30f to !__r1, which is dictated by the way the +- * TSL_SET macro is used. The code suggested in Sites includes the main loop +- * of the spin lock, whereas in this code the rest the loop is specified in C. +- * The generated code might be suboptimal if the compiler generates a forward +- * branch for the usual case in which the mutex is uncontested. +- * +- * 2. At label 20, Sites suggests including code for testing for an excessive +- * number of _processor_ lock conflicts. (The seq_c instruction stores its +- * first argument provided that no other processor has written to a byte range +- * including its memory-location argument.) Absent such checking the code +- * below could conceivably stall silently on a multiprocessor alpha, depending +- * on how often processor/processor conflicts occur in a particular byte range. +- * +- * Note that the mb ("memory-barrier") instruction in TSL_UNSET is critical to +- * correct operation in a multiprocessor alpha (as is, of course, the mb in +- * the TSL_SET macro). Without the mb, changes to shared memory that occurred +- * inside the critical section (before the TSL_UNSET) might reach shared memory +- * _after_ the change of tsl to 0, thereby permitting another processor to see +- * an inconsistent view of the data protected by the mutex. ++ * @(#)alpha.gcc 11.1 (Sleepycat) 8/30/99 + * + * For gcc/alpha, 0 is clear, 1 is set. + */ +-#define TSL_SET(tsl) ({ \ ++#ifdef __GNUC__ ++#define TSL_SET(tsl) ({ \ + register tsl_t *__l = (tsl); \ +- register tsl_t __r1, __r2; \ +- __asm__ volatile(" \n\ +- 10: ldq_l %0,(%2) \n\ +- blbs %0,30f \n\ +- or %0,1,%1 \n\ +- stq_c %1,(%2) \n\ +- beq %1,20f \n\ +- mb \n\ +- br 30f \n\ +- 20: br 10b \n\ +- 30: " \ +- : "=&r" (__r1), "=&r" (__r2) \ +- : "r" (__l)); \ +- !__r1; \ ++ int __r; \ ++ asm volatile( \ ++ "1: ldl_l %0,%1\n" \ ++ " blbs %0,2f\n" \ ++ " mov 1,%0\n" \ ++ " stl_c %0,%1\n" \ ++ " bne %0,1b\n" \ ++ " mb\n" \ ++ "2:" \ ++ : "=&r"(__r), "=m"(*__l) : "m"(*__l) : "memory"); \ ++ __r; \ + }) ++#endif + +-#define TSL_UNSET(tsl) ({ \ +- register tsl_t *__l = (tsl); \ +- __asm__ volatile("mb; stq $31,(%0);" : : "r" (__l)); \ +-}) ++#define TSL_UNSET(tsl) (*(tsl) = 0) + #define TSL_INIT(tsl) TSL_UNSET(tsl) +--- glibc-2.1.3-15/db2/mutex/mutex.c Wed Jun 30 11:51:07 1999 ++++ glibc-2.1.3-16/db2/mutex/mutex.c Wed Mar 15 16:50:45 2000 +@@ -86,6 +86,10 @@ static const char sccsid[] = "@(#)mutex. + #include "sparc.gcc" + #endif + ++#ifdef HAVE_ASSEM_ALPHA_GCC ++#include "alpha.gcc" ++#endif ++ + #ifdef HAVE_ASSEM_UTS4_CC + #define TSL_INIT(x) + #define TSL_SET(x) (!uts_lock(x, 1)) +--- glibc-2.1.3-15/sysdeps/alpha/Makefile Thu Jul 9 14:52:03 1998 ++++ glibc-2.1.3-16/sysdeps/alpha/Makefile Wed Mar 15 16:50:45 2000 +@@ -17,6 +17,10 @@ + # write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + # Boston, MA 02111-1307, USA. + ++ifeq ($(subdir),db2) ++CPPFLAGS += -DHAVE_SPINLOCKS=1 -DHAVE_ASSEM_ALPHA_GCC=1 ++endif ++ + ifeq ($(subdir),gmon) + sysdep_routines += _mcount + endif +--- glibc-2.1.3-15/sysdeps/unix/sysv/linux/alpha/ioperm.c Mon Oct 11 10:25:24 1999 ++++ glibc-2.1.3-16/sysdeps/unix/sysv/linux/alpha/ioperm.c Wed Mar 15 11:57:14 2000 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1992, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. ++/* Copyright (C) 1992, 1996-1999, 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by David Mosberger. + +@@ -139,6 +139,7 @@ static struct platform { + {"Sable", IOSYS_CPUDEP}, + {"Miata", IOSYS_CIA}, + {"Tsunami", IOSYS_TSUNAMI}, ++ {"Nautilus", IOSYS_TSUNAMI}, + {"Rawhide", IOSYS_MCPCIA}, + {"Ruffian", IOSYS_CIA}, + {"Takara", IOSYS_CIA}, diff --git a/patches/glibc/2.1.3/rh62-08-glibc-2.1.3-glob.patch b/patches/glibc/2.1.3/rh62-08-glibc-2.1.3-glob.patch new file mode 100644 index 00000000..cdd4c0be --- /dev/null +++ b/patches/glibc/2.1.3/rh62-08-glibc-2.1.3-glob.patch @@ -0,0 +1,57 @@ +2001-11-29 Jakub Jelinek <jakub@redhat.com> + + * sysdeps/generic/glob.c (next_brace_sub): Return NULL if braces + don't match, fix {{a,b},c} globbing, clean up. + Patch by Flavio Veloso <flaviovs@magnux.com>. + +--- libc/sysdeps/generic/glob.c.jj Thu Aug 23 18:49:29 2001 ++++ libc/sysdeps/generic/glob.c Thu Nov 29 13:17:21 2001 +@@ -355,42 +355,14 @@ static + inline + #endif + const char * +-next_brace_sub (begin) +- const char *begin; ++next_brace_sub (cp) ++ const char *cp; + { + unsigned int depth = 0; +- const char *cp = begin; +- +- while (1) +- { +- if (depth == 0) +- { +- if (*cp != ',' && *cp != '}' && *cp != '\0') +- { +- if (*cp == '{') +- ++depth; +- ++cp; +- continue; +- } +- } +- else +- { +- while (*cp != '\0' && (*cp != '}' || depth > 0)) +- { +- if (*cp == '}') +- --depth; +- ++cp; +- } +- if (*cp == '\0') +- /* An incorrectly terminated brace expression. */ +- return NULL; +- +- continue; +- } +- break; +- } +- +- return cp; ++ while (*cp != '\0' && (*cp != '}' || depth--) && (*cp != ',' || depth)) ++ if (*cp++ == '{') ++ depth++; ++ return *cp != '\0' ? cp : NULL; + } + + #endif /* !GLOB_ONLY_P */ diff --git a/patches/glibc/2.1.3/rh62-09-glibc-2.1.3-security2.patch b/patches/glibc/2.1.3/rh62-09-glibc-2.1.3-security2.patch new file mode 100644 index 00000000..dd12af8e --- /dev/null +++ b/patches/glibc/2.1.3/rh62-09-glibc-2.1.3-security2.patch @@ -0,0 +1,66 @@ +2002-07-05 Tomohiro Kato <tomop@teamgedoh.net> + + * glibc-compat/nss_dns/dns-network.c (getanswer_r): Reduce + linebuflen in parallel to bumping up the buffer pointer. + * glibc-compat/nss_dns/dns-host.c (getanswer_r): Likewise. + Compare n with linebuflen instead of buflen. + +2002-07-02 Andreas Schwab <schwab@suse.de> + + * resolv/nss_dns/dns-network.c (getanswer_r): Reduce linebuflen + in parallel to bumping up the buffer pointer. + +--- libc/glibc-compat/nss_dns/dns-network.c.jj Wed Jan 10 11:58:20 2001 ++++ libc/glibc-compat/nss_dns/dns-network.c Tue Jul 9 10:31:15 2002 +@@ -283,7 +283,9 @@ getanswer_r (const querybuf *answer, int + } + cp += n; + *alias_pointer++ = bp; +- bp += strlen (bp) + 1; ++ n = strlen (bp) + 1; ++ bp += n; ++ linebuflen -= n; + result->n_addrtype = class == C_IN ? AF_INET : AF_UNSPEC; + ++have_answer; + } +--- libc/glibc-compat/nss_dns/dns-host.c.jj Wed Jan 10 11:58:20 2001 ++++ libc/glibc-compat/nss_dns/dns-host.c Tue Jul 9 10:36:41 2002 +@@ -424,7 +424,7 @@ getanswer_r (const querybuf *answer, int + linebuflen -= n; + /* Get canonical name. */ + n = strlen (tbuf) + 1; /* For the \0. */ +- if ((size_t) n > buflen || n >= MAXHOSTNAMELEN) ++ if ((size_t) n > linebuflen || n >= MAXHOSTNAMELEN) + { + ++had_error; + continue; +@@ -447,7 +447,7 @@ getanswer_r (const querybuf *answer, int + cp += n; + /* Get canonical name. */ + n = strlen (tbuf) + 1; /* For the \0. */ +- if ((size_t) n > buflen || n >= MAXHOSTNAMELEN) ++ if ((size_t) n > linebuflen || n >= MAXHOSTNAMELEN) + { + ++had_error; + continue; +@@ -542,6 +542,7 @@ getanswer_r (const querybuf *answer, int + linebuflen -= nn; + } + ++ linebuflen -= sizeof (align) - ((u_long) bp % sizeof (align)); + bp += sizeof (align) - ((u_long) bp % sizeof (align)); + + if (n >= linebuflen) +--- libc/resolv/nss_dns/dns-network.c.jj Mon Jul 9 14:59:24 2001 ++++ libc/resolv/nss_dns/dns-network.c Tue Jul 9 10:30:31 2002 +@@ -328,7 +328,9 @@ getanswer_r (const querybuf *answer, int + } + cp += n; + *alias_pointer++ = bp; +- bp += strlen (bp) + 1; ++ n = strlen (bp) + 1; ++ bp += n; ++ linebuflen -= n; + result->n_addrtype = class == C_IN ? AF_INET : AF_UNSPEC; + ++have_answer; + } diff --git a/patches/glibc/2.1.3/rh62-10-glibc-2.1.3-xdr_array.patch b/patches/glibc/2.1.3/rh62-10-glibc-2.1.3-xdr_array.patch new file mode 100644 index 00000000..7f0784f3 --- /dev/null +++ b/patches/glibc/2.1.3/rh62-10-glibc-2.1.3-xdr_array.patch @@ -0,0 +1,36 @@ +--- glibc-2.1.3/sunrpc/rpc/types.h Fri Oct 16 13:43:49 1998 ++++ glibc-2.1.3/sunrpc/rpc/types.h Thu Aug 1 09:06:38 2002 +@@ -55,6 +55,10 @@ + + #include <stdlib.h> /* For malloc decl. */ + #define mem_alloc(bsize) malloc(bsize) ++/* ++ * XXX: This must not use the second argument, or code in xdr_array.c needs ++ * to be modified. ++ */ + #define mem_free(ptr, bsize) free(ptr) + + #ifndef makedev /* ie, we haven't already included it */ +--- glibc-2.1.3/sunrpc/xdr_array.c Thu Jul 16 15:23:51 1998 ++++ glibc-2.1.3/sunrpc/xdr_array.c Thu Aug 1 09:07:45 2002 +@@ -44,6 +44,7 @@ + #include <string.h> + #include <rpc/types.h> + #include <rpc/xdr.h> ++#include <limits.h> + + #define LASTUNSIGNED ((u_int)0-1) + +@@ -76,7 +77,11 @@ + return FALSE; + } + c = *sizep; +- if ((c > maxsize) && (xdrs->x_op != XDR_FREE)) ++ /* ++ * XXX: Let the overflow possibly happen with XDR_FREE because mem_free() ++ * doesn't actually use its second argument anyway. ++ */ ++ if ((c > maxsize || c > UINT_MAX / elsize) && (xdrs->x_op != XDR_FREE)) + { + return FALSE; + } diff --git a/patches/glibc/2.1.3/rh62-11-glibc-2.1.3-calloc.patch b/patches/glibc/2.1.3/rh62-11-glibc-2.1.3-calloc.patch new file mode 100644 index 00000000..54593651 --- /dev/null +++ b/patches/glibc/2.1.3/rh62-11-glibc-2.1.3-calloc.patch @@ -0,0 +1,35 @@ +diff -ur glibc-2.1.3.orig/malloc/malloc.c glibc-2.1.3/malloc/malloc.c +--- glibc-2.1.3.orig/malloc/malloc.c Wed Feb 23 10:02:55 2000 ++++ glibc-2.1.3/malloc/malloc.c Thu Aug 1 09:24:10 2002 +@@ -3656,12 +3656,20 @@ + { + arena *ar_ptr; + mchunkptr p, oldtop; +- INTERNAL_SIZE_T sz, csz, oldtopsize; ++ INTERNAL_SIZE_T bytes, sz, csz, oldtopsize; + Void_t* mem; + ++ /* size_t is unsigned so the behavior on overflow is defined; ++ * request2size() uses similar post-checks anyway. */ ++ bytes = n * elem_size; ++ if ((n | elem_size) >= 65536 && elem_size && bytes / elem_size != n) { ++ __set_errno (ENOMEM); ++ return 0; ++ } ++ + #if defined _LIBC || defined MALLOC_HOOKS + if (__malloc_hook != NULL) { +- sz = n * elem_size; ++ sz = bytes; + #if defined __GNUC__ && __GNUC__ >= 2 + mem = (*__malloc_hook)(sz, __builtin_return_address (0)); + #else +@@ -3678,7 +3686,7 @@ + } + #endif + +- if(request2size(n * elem_size, sz)) ++ if(request2size(bytes, sz)) + return 0; + arena_get(ar_ptr, sz); + if(!ar_ptr) diff --git a/patches/glibc/2.1.3/rh62-12-glibc-2.1.3-maxpacket.patch b/patches/glibc/2.1.3/rh62-12-glibc-2.1.3-maxpacket.patch new file mode 100644 index 00000000..3efac038 --- /dev/null +++ b/patches/glibc/2.1.3/rh62-12-glibc-2.1.3-maxpacket.patch @@ -0,0 +1,512 @@ +--- libc/resolv/nss_dns/dns-host.c.jj Tue Sep 14 03:05:08 1999 ++++ libc/resolv/nss_dns/dns-host.c Thu Oct 10 13:07:33 2002 +@@ -129,9 +129,10 @@ _nss_dns_gethostbyname2_r (const char *n + char *buffer, size_t buflen, int *errnop, + int *h_errnop) + { +- querybuf host_buffer; ++ querybuf *host_buffer; + int size, type, n; + const char *cp; ++ enum nss_status status; + + switch (af) { + case AF_INET: +@@ -159,16 +160,25 @@ _nss_dns_gethostbyname2_r (const char *n + if (strchr (name, '.') == NULL && (cp = __hostalias (name)) != NULL) + name = cp; + +- n = res_search (name, C_IN, type, host_buffer.buf, sizeof (host_buffer.buf)); ++ host_buffer = (querybuf *) malloc (sizeof (*host_buffer)); ++ if (host_buffer == NULL) { ++ *errnop = ENOMEM; ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ n = res_search (name, C_IN, type, host_buffer->buf, sizeof (host_buffer->buf)); + if (n < 0) + { + *h_errnop = h_errno; + *errnop = *h_errnop == TRY_AGAIN ? EAGAIN : ENOENT; ++ free (host_buffer); + return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; + } + +- return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen, +- errnop, h_errnop); ++ status = getanswer_r (host_buffer, n, name, type, result, buffer, buflen, ++ errnop, h_errnop); ++ free (host_buffer); ++ return status; + } + + +@@ -205,7 +215,7 @@ _nss_dns_gethostbyaddr_r (const char *ad + char *h_addr_ptrs[MAX_NR_ADDRS + 1]; + char linebuffer[0]; + } *host_data = (struct host_data *) buffer; +- querybuf host_buffer; ++ querybuf *host_buffer; + char qbuf[MAXDNAME+1], *qp; + size_t size; + int n, status; +@@ -257,17 +267,25 @@ _nss_dns_gethostbyaddr_r (const char *ad + /* Cannot happen. */ + } + +- n = res_query (qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf, +- sizeof host_buffer); ++ host_buffer = (querybuf *) malloc (sizeof (*host_buffer)); ++ if (host_buffer == NULL) { ++ *errnop = ENOMEM; ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ n = res_query (qbuf, C_IN, T_PTR, host_buffer->buf, ++ sizeof (host_buffer->buf)); + if (n < 0) + { + *h_errnop = h_errno; + *errnop = errno; ++ free (host_buffer); + return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; + } + +- status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen, ++ status = getanswer_r (host_buffer, n, qbuf, T_PTR, result, buffer, buflen, + errnop, h_errnop); ++ free (host_buffer); + if (status != NSS_STATUS_SUCCESS) + { + *h_errnop = h_errno; +--- libc/resolv/nss_dns/dns-network.c.jj Wed Jun 30 12:01:14 1999 ++++ libc/resolv/nss_dns/dns-network.c Thu Oct 10 13:09:49 2002 +@@ -113,24 +113,36 @@ _nss_dns_getnetbyname_r (const char *nam + char *buffer, size_t buflen, int *errnop) + { + /* Return entry for network with NAME. */ +- querybuf net_buffer; ++ querybuf *net_buffer; + int anslen; + char *qbuf; ++ enum nss_status status; + + qbuf = strdupa (name); +- anslen = res_search (qbuf, C_IN, T_PTR, (u_char *) &net_buffer, +- sizeof (querybuf)); ++ ++ net_buffer = (querybuf *) malloc (sizeof (*net_buffer)); ++ if (net_buffer == NULL) ++ { ++ *errnop = ENOMEM; ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ anslen = res_search (qbuf, C_IN, T_PTR, net_buffer->buf, ++ sizeof (net_buffer->buf)); + if (anslen < 0) + { + /* Nothing found. */ + *errnop = errno; ++ free (net_buffer); + return (errno == ECONNREFUSED + || errno == EPFNOSUPPORT + || errno == EAFNOSUPPORT) + ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; + } + +- return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME); ++ status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYNAME); ++ free (net_buffer); ++ return status; + } + + +@@ -140,7 +152,7 @@ _nss_dns_getnetbyaddr_r (long net, int t + { + /* Return entry for network with NAME. */ + enum nss_status status; +- querybuf net_buffer; ++ querybuf *net_buffer; + unsigned int net_bytes[4]; + char qbuf[MAXDNAME]; + int cnt, anslen; +@@ -176,19 +188,28 @@ _nss_dns_getnetbyaddr_r (long net, int t + break; + } + +- anslen = res_query (qbuf, C_IN, T_PTR, (u_char *) &net_buffer, +- sizeof (querybuf)); ++ net_buffer = (querybuf *) malloc (sizeof (*net_buffer)); ++ if (net_buffer == NULL) ++ { ++ *errnop = ENOMEM; ++ return NSS_STATUS_UNAVAIL; ++ } ++ ++ anslen = res_query (qbuf, C_IN, T_PTR, net_buffer->buf, ++ sizeof (net_buffer->buf)); + if (anslen < 0) + { + /* Nothing found. */ + *errnop = errno; ++ free (net_buffer); + return (errno == ECONNREFUSED + || errno == EPFNOSUPPORT + || errno == EAFNOSUPPORT) + ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; + } + +- status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR); ++ status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYADDR); ++ free (net_buffer); + if (status == NSS_STATUS_SUCCESS) + { + /* Strip trailing zeros. */ +--- libc/resolv/res_query.c.jj Wed Jun 30 12:01:06 1999 ++++ libc/resolv/res_query.c Thu Oct 10 13:01:12 2002 +@@ -106,7 +106,7 @@ res_query(name, class, type, answer, ans + u_char *answer; /* buffer to put answer */ + int anslen; /* size of answer buffer */ + { +- u_char buf[MAXPACKET]; ++ u_char *buf; + register HEADER *hp = (HEADER *) answer; + int n; + +@@ -121,17 +121,25 @@ res_query(name, class, type, answer, ans + printf(";; res_query(%s, %d, %d)\n", name, class, type); + #endif + ++ buf = malloc (MAXPACKET); ++ if (buf == NULL) { ++ __set_h_errno (NETDB_INTERNAL); ++ return -1; ++ } ++ + n = res_mkquery(QUERY, name, class, type, NULL, 0, NULL, +- buf, sizeof(buf)); ++ buf, MAXPACKET); + if (n <= 0) { + #ifdef DEBUG + if (_res.options & RES_DEBUG) + printf(";; res_query: mkquery failed\n"); + #endif + __set_h_errno (NO_RECOVERY); ++ free (buf); + return (n); + } + n = res_send(buf, n, answer, anslen); ++ free (buf); + if (n < 0) { + #ifdef DEBUG + if (_res.options & RES_DEBUG) +--- libc/resolv/gethnamaddr.c.jj Tue Dec 7 11:50:36 1999 ++++ libc/resolv/gethnamaddr.c Thu Oct 10 15:05:50 2002 +@@ -512,10 +512,11 @@ gethostbyname2(name, af) + const char *name; + int af; + { +- querybuf buf; ++ querybuf *buf; + register const char *cp; + char *bp; + int n, size, type, len; ++ struct hostent *ret; + extern struct hostent *_gethtbyname2(); + + if ((_res.options & RES_INIT) == 0 && res_init() == -1) { +@@ -617,13 +618,22 @@ gethostbyname2(name, af) + break; + } + +- if ((n = res_search(name, C_IN, type, buf.buf, sizeof(buf.buf))) < 0) { ++ buf = (querybuf *) malloc (sizeof (*buf)); ++ if (buf == NULL) { ++ __set_h_errno (NETDB_INTERNAL); ++ return NULL; ++ } ++ ++ if ((n = res_search(name, C_IN, type, buf->buf, sizeof(buf->buf))) < 0) { ++ free (buf); + dprintf("res_search failed (%d)\n", n); + if (errno == ECONNREFUSED) + return (_gethtbyname2(name, af)); + return (NULL); + } +- return (getanswer(&buf, n, name, type)); ++ ret = getanswer(buf, n, name, type); ++ free (buf); ++ return ret; + } + + struct hostent * +@@ -636,7 +646,7 @@ gethostbyaddr(addr, len, af) + static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff }; + static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; + int n, size; +- querybuf buf; ++ querybuf *buf; + register struct hostent *hp; + char qbuf[MAXDNAME+1], *qp; + #ifdef SUNSECURITY +@@ -697,14 +707,24 @@ gethostbyaddr(addr, len, af) + default: + abort(); + } +- n = res_query(qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf); ++ ++ buf = (querybuf *) malloc (sizeof (*buf)); ++ if (buf == NULL) { ++ __set_h_errno (NETDB_INTERNAL); ++ return NULL; ++ } ++ ++ n = res_query(qbuf, C_IN, T_PTR, buf->buf, sizeof buf->buf); + if (n < 0) { ++ free (buf); + dprintf("res_query failed (%d)\n", n); + if (errno == ECONNREFUSED) + return (_gethtbyaddr(addr, len, af)); + return (NULL); + } +- if (!(hp = getanswer(&buf, n, qbuf, T_PTR))) ++ hp = getanswer(buf, n, qbuf, T_PTR); ++ free (buf); ++ if (!hp) + return (NULL); /* h_errno was set by getanswer() */ + #ifdef SUNSECURITY + if (af == AF_INET) { +--- libc/resolv/getnetnamadr.c.jj Wed Jun 30 12:00:50 1999 ++++ libc/resolv/getnetnamadr.c Thu Oct 10 13:14:01 2002 +@@ -210,7 +210,7 @@ getnetbyaddr(net, net_type) + { + unsigned int netbr[4]; + int nn, anslen; +- querybuf buf; ++ querybuf *buf; + char qbuf[MAXDNAME]; + u_int32_t net2; /* Changed from unsigned long --roland */ + struct netent *net_entry; +@@ -236,8 +236,15 @@ getnetbyaddr(net, net_type) + netbr[1], netbr[0]); + break; + } +- anslen = res_query(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf)); ++ ++ buf = (querybuf *) malloc (sizeof (*buf)); ++ if (buf == NULL) { ++ return NULL; ++ } ++ ++ anslen = res_query(qbuf, C_IN, T_PTR, buf->buf, sizeof(buf->buf)); + if (anslen < 0) { ++ free (buf); + #ifdef DEBUG + if (_res.options & RES_DEBUG) + printf("res_query failed\n"); +@@ -246,7 +253,8 @@ getnetbyaddr(net, net_type) + return (_getnetbyaddr(net, net_type)); + return (NULL); + } +- net_entry = getnetanswer(&buf, anslen, BYADDR); ++ net_entry = getnetanswer(buf, anslen, BYADDR); ++ free (buf); + if (net_entry) { + unsigned u_net = net; /* maybe net should be unsigned ? */ + +@@ -264,7 +272,7 @@ getnetbyname(net) + register const char *net; + { + int anslen; +- querybuf buf; ++ querybuf *buf; + char qbuf[MAXDNAME]; + struct netent *net_entry; + +@@ -273,8 +281,13 @@ getnetbyname(net) + return (NULL); + } + strcpy(&qbuf[0], net); +- anslen = res_search(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf)); ++ buf = (querybuf *) malloc (sizeof (*buf)); ++ if (buf == NULL) { ++ return NULL; ++ } ++ anslen = res_search(qbuf, C_IN, T_PTR, buf->buf, sizeof(buf->buf)); + if (anslen < 0) { ++ free (buf); + #ifdef DEBUG + if (_res.options & RES_DEBUG) + printf("res_query failed\n"); +@@ -283,7 +296,8 @@ getnetbyname(net) + return (_getnetbyname(net)); + return (_getnetbyname(net)); + } +- net_entry = getnetanswer(&buf, anslen, BYNAME); ++ net_entry = getnetanswer(buf, anslen, BYNAME); ++ free (buf); + if (net_entry) + return (net_entry); + return (_getnetbyname(net)); +--- libc/glibc-compat/nss_dns/dns-host.c.jj Mon Jan 3 20:07:08 2000 ++++ libc/glibc-compat/nss_dns/dns-host.c Thu Oct 10 12:46:24 2002 +@@ -126,9 +126,10 @@ enum nss_status + _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result, + char *buffer, size_t buflen, int *h_errnop) + { +- querybuf host_buffer; ++ querybuf *host_buffer; + int size, type, n; + const char *cp; ++ enum nss_status status; + + switch (af) { + case AF_INET: +@@ -156,15 +157,22 @@ _nss_dns_gethostbyname2_r (const char *n + if (strchr (name, '.') == NULL && (cp = __hostalias (name)) != NULL) + name = cp; + +- n = res_search (name, C_IN, type, host_buffer.buf, sizeof (host_buffer.buf)); ++ host_buffer = (querybuf *) malloc (sizeof (querybuf)); ++ if (host_buffer == NULL) ++ return NSS_STATUS_UNAVAIL; ++ ++ n = res_search (name, C_IN, type, host_buffer->buf, sizeof (host_buffer->buf)); + if (n < 0) + { + *h_errnop = h_errno; ++ free (host_buffer); + return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; + } + +- return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen, +- h_errnop); ++ status = getanswer_r (host_buffer, n, name, type, result, buffer, buflen, ++ h_errnop); ++ free (host_buffer); ++ return status; + } + + +@@ -200,7 +208,7 @@ _nss_dns_gethostbyaddr_r (const char *ad + char *h_addr_ptrs[MAX_NR_ADDRS + 1]; + char linebuffer[0]; + } *host_data = (struct host_data *) buffer; +- querybuf host_buffer; ++ querybuf *host_buffer; + char qbuf[MAXDNAME+1], *qp; + int size, n, status; + +@@ -251,16 +259,22 @@ _nss_dns_gethostbyaddr_r (const char *ad + /* Cannot happen. */ + } + +- n = res_query (qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf, +- sizeof host_buffer); ++ host_buffer = (querybuf *) malloc (sizeof (querybuf)); ++ if (host_buffer == NULL) ++ return NSS_STATUS_UNAVAIL; ++ ++ n = res_query (qbuf, C_IN, T_PTR, host_buffer->buf, ++ sizeof (host_buffer->buf)); + if (n < 0) + { + *h_errnop = h_errno; ++ free (host_buffer); + return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; + } + +- status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen, ++ status = getanswer_r (host_buffer, n, qbuf, T_PTR, result, buffer, buflen, + h_errnop); ++ free (host_buffer); + if (status != NSS_STATUS_SUCCESS) + { + *h_errnop = h_errno; +--- libc/glibc-compat/nss_dns/dns-network.c.jj Mon Jan 3 20:07:08 2000 ++++ libc/glibc-compat/nss_dns/dns-network.c Thu Oct 10 12:46:24 2002 +@@ -107,21 +107,32 @@ _nss_dns_getnetbyname_r (const char *nam + char *buffer, size_t buflen) + { + /* Return entry for network with NAME. */ +- querybuf net_buffer; ++ querybuf *net_buffer; + int anslen; + char *qbuf; ++ enum nss_status status; + + qbuf = strdupa (name); +- anslen = res_search (qbuf, C_IN, T_PTR, (u_char *) &net_buffer, +- sizeof (querybuf)); ++ ++ net_buffer = (querybuf *) malloc (sizeof (querybuf)); ++ if (net_buffer == NULL) ++ return NSS_STATUS_UNAVAIL; ++ ++ anslen = res_search (qbuf, C_IN, T_PTR, net_buffer->buf, ++ sizeof (net_buffer->buf)); + if (anslen < 0) +- /* Nothing found. */ +- return (errno == ECONNREFUSED +- || errno == EPFNOSUPPORT +- || errno == EAFNOSUPPORT) +- ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; ++ { ++ free (net_buffer); ++ /* Nothing found. */ ++ return (errno == ECONNREFUSED ++ || errno == EPFNOSUPPORT ++ || errno == EAFNOSUPPORT) ++ ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; ++ } + +- return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME); ++ status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYNAME); ++ free (net_buffer); ++ return status; + } + + +@@ -131,7 +142,7 @@ _nss_dns_getnetbyaddr_r (long net, int t + { + /* Return entry for network with NAME. */ + enum nss_status status; +- querybuf net_buffer; ++ querybuf *net_buffer; + unsigned int net_bytes[4]; + char qbuf[MAXDNAME]; + int cnt, anslen; +@@ -167,16 +178,24 @@ _nss_dns_getnetbyaddr_r (long net, int t + break; + } + +- anslen = res_query (qbuf, C_IN, T_PTR, (u_char *) &net_buffer, +- sizeof (querybuf)); ++ net_buffer = (querybuf *) malloc (sizeof (querybuf)); ++ if (net_buffer == NULL) ++ return NSS_STATUS_UNAVAIL; ++ ++ anslen = res_query (qbuf, C_IN, T_PTR, net_buffer->buf, ++ sizeof (net_buffer->buf)); + if (anslen < 0) +- /* Nothing found. */ +- return (errno == ECONNREFUSED +- || errno == EPFNOSUPPORT +- || errno == EAFNOSUPPORT) +- ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; ++ { ++ free (net_buffer); ++ /* Nothing found. */ ++ return (errno == ECONNREFUSED ++ || errno == EPFNOSUPPORT ++ || errno == EAFNOSUPPORT) ++ ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; ++ } + +- status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR); ++ status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYADDR); ++ free (net_buffer); + if (status == NSS_STATUS_SUCCESS) + { + /* Strip trailing zeros. */ diff --git a/patches/glibc/2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-dns.patch b/patches/glibc/2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-dns.patch new file mode 100644 index 00000000..bada1fca --- /dev/null +++ b/patches/glibc/2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-dns.patch @@ -0,0 +1,11 @@ +--- glibc-2.1.3/glibc-compat/nss_dns/dns-host.c.old Sun Apr 11 21:46:14 2004 ++++ glibc-2.1.3/glibc-compat/nss_dns/dns-host.c Sun Apr 11 21:46:26 2004 +@@ -256,7 +256,7 @@ + strcpy(qp, "ip6.int"); + break; + default: +- /* Cannot happen. */ ++ ; /* Cannot happen. */ + } + + host_buffer = (querybuf *) malloc (sizeof (querybuf)); diff --git a/patches/glibc/2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-gconv_stubs.patch b/patches/glibc/2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-gconv_stubs.patch new file mode 100644 index 00000000..af0b4b1f --- /dev/null +++ b/patches/glibc/2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-gconv_stubs.patch @@ -0,0 +1,44 @@ +"Fixes" gcc-3.4.0 errors: +gconv_stubs.c:49: error: conflicting types for '__gconv_close_transform' +../iconv/gconv_int.h:131: error: previous declaration of '__gconv_close_transform' was here +gconv_stubs.c:49: error: conflicting types for '__gconv_close_transform' +../iconv/gconv_int.h:131: error: previous declaration of '__gconv_close_transform' was here +gconv_stubs.c:52: error: conflicting types for '__gconv' +../iconv/gconv_int.h:112: error: previous declaration of '__gconv' was here +gconv_stubs.c:52: error: conflicting types for '__gconv' +../iconv/gconv_int.h:112: error: previous declaration of '__gconv' was here +gconv_stubs.c:54: error: conflicting types for '__gconv_find_transform' +../iconv/gconv_int.h:119: error: previous declaration of '__gconv_find_transform' was here +gconv_stubs.c:54: error: conflicting types for '__gconv_find_transform' +../iconv/gconv_int.h:119: error: previous declaration of '__gconv_find_transform' was here +gconv_stubs.c:56: error: conflicting types for '__gconv_open' +../iconv/gconv_int.h:99: error: previous declaration of '__gconv_open' was here +gconv_stubs.c:56: error: conflicting types for '__gconv_open' +../iconv/gconv_int.h:99: error: previous declaration of '__gconv_open' was here +make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/build-glibc/c_stubs/gconv_stubs.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.1.3/glibc-2.1.3/c_stubs' + +although the right thing would probably be to declare the +stubs to have the right attributes. + +--- glibc-2.1.3/c_stubs/gconv_stubs.c.old Sun Apr 11 20:25:09 2004 ++++ glibc-2.1.3/c_stubs/gconv_stubs.c Sun Apr 11 20:29:35 2004 +@@ -18,7 +18,18 @@ + Boston, MA 02111-1307, USA. */ + + #include <features.h> ++ ++/* strange hack workaround for gcc-3.4.0. Might be a better way. */ ++#define __gconv_close_transform foo__gconv_close_transform ++#define __gconv foo__gconv ++#define __gconv_find_transform foo__gconv_find_transform ++#define __gconv_open foo__gconv_open ++ + #include <gconv_int.h> ++#undef __gconv_close_transform ++#undef __gconv ++#undef __gconv_find_transform ++#undef __gconv_open + + /* hack for self identification */ + int __c_stubs_is_compiled_in; diff --git a/patches/glibc/2.1.3/sk.po.patch b/patches/glibc/2.1.3/sk.po.patch new file mode 100644 index 00000000..50564da3 --- /dev/null +++ b/patches/glibc/2.1.3/sk.po.patch @@ -0,0 +1,6678 @@ +From +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/po/sk.po.diff?r1=1.2&r2=1.3&cvsroot=glibc + +Fixes build error + msgfmt -o sk.mo sk.po + sk.po:2913: duplicate message definition + sk.po:2909: ...this is the location of the first definition + sk.po:3894: duplicate message definition + sk.po:3070: ...this is the location of the first definition + msgfmt: found 2 fatal errors + make[2]: *** [sk.mo] Error 1 + +=================================================================== +RCS file: /cvs/glibc/libc/po/sk.po,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/po/sk.po 1998/12/04 21:08:17 1.2 ++++ libc/po/sk.po 2001/06/05 22:43:33 1.3 +@@ -4,82 +4,82 @@ + # + msgid "" + msgstr "" +-"Project-Id-Version: libc 2.1\n" +-"POT-Creation-Date: 1998-11-28 09:29-0800\n" +-"PO-Revision-Date: 1998-12-02 22:02+01:00\n" ++"Project-Id-Version: libc 2.2.3\n" ++"POT-Creation-Date: 2001-01-21 08:03-0800\n" ++"PO-Revision-Date: 2001-06-05 17:57+02:00\n" + "Last-Translator: Stanislav Meduna <stano@eunet.sk>\n" + "Language-Team: Slovak <sk-i18n@rak.isternet.sk>\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=ISO-8859-2\n" + "Content-Transfer-Encoding: 8bit\n" + +-#: nis/nis_print.c:273 ++#: nis/nis_print.c:274 + msgid "\t\tAccess Rights : " + msgstr "\t\tPr�stupov� pr�va : " + +-#: nis/nis_print.c:271 ++#: nis/nis_print.c:272 + msgid "\t\tAttributes : " + msgstr "\t\tAtrib�ty : " + +-#: sunrpc/rpc_main.c:1416 ++#: sunrpc/rpc_main.c:1425 + #, 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:1418 ++#: sunrpc/rpc_main.c:1427 + #, 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:1421 ++#: sunrpc/rpc_main.c:1430 + #, 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" + +-#: sunrpc/rpc_main.c:1420 ++#: sunrpc/rpc_main.c:1429 + #, 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" + +-#: nis/nis_print.c:235 ++#: nis/nis_print.c:236 + msgid "\tAccess rights: " + msgstr "\tPr�stupov� pr�va: " + +-#: nis/nis_print.c:293 ++#: nis/nis_print.c:294 + #, c-format + msgid "\tEntry data of type %s\n" + msgstr "\tVstupn� �daje typu %s\n" + +-#: nis/nis_print.c:171 ++#: nis/nis_print.c:172 + #, c-format + msgid "\tName : %s\n" + msgstr "\tN�zov : %s\n" + +-#: nis/nis_print.c:172 ++#: nis/nis_print.c:173 + msgid "\tPublic Key : " + msgstr "\tVerejn� k��� : " + +-#: nis/nis_print.c:234 ++#: nis/nis_print.c:235 + #, c-format + msgid "\tType : %s\n" + msgstr "\tTyp : %s\n" + +-#: nis/nis_print.c:201 ++#: nis/nis_print.c:202 + #, c-format + msgid "\tUniversal addresses (%u)\n" + msgstr "\tUniverz�lne adresy (%u)\n" + +-#: nis/nis_print.c:269 ++#: nis/nis_print.c:270 + #, c-format + msgid "\t[%d]\tName : %s\n" + msgstr "\t[%d]\tN�zov : %s\n" + +-#: nis/nis_print.c:296 ++#: nis/nis_print.c:297 + #, c-format + msgid "\t[%u] - [%u bytes] " + msgstr "\t[%u] - [%u bajtov] " + +-#: nscd/nscd_stat.c:153 ++#: nscd/nscd_stat.c:154 + msgid "" + "\n" + "%s cache:\n" +@@ -109,11 +109,11 @@ + "%15ld%% �spe�nos� cache\n" + "%15s skontrolujte /etc/%s na zmeny\n" + +-#: nis/nis_print.c:251 ++#: nis/nis_print.c:252 + msgid "\nGroup Members :\n" + msgstr "\n�lenovia skup�n :\n" + +-#: nis/nis_print.c:320 ++#: nis/nis_print.c:323 + msgid "\nTime to Live : " + msgstr "\n�ivotnos� : " + +@@ -133,60 +133,60 @@ + msgid " rpcinfo [ -n portnum ] -t host prognum [ versnum ]\n" + msgstr " rpcinfo [ -n ��slo_portu ] -t po��ta� ��slo_programu [ ��slo_verzie ]\n" + +-#: nscd/nscd_stat.c:145 nscd/nscd_stat.c:147 ++#: nscd/nscd_stat.c:146 nscd/nscd_stat.c:148 + msgid " no" + msgstr " nie" + +-#: nscd/nscd_stat.c:145 nscd/nscd_stat.c:147 ++#: nscd/nscd_stat.c:146 nscd/nscd_stat.c:148 + msgid " yes" + msgstr " �no" + +-#: nis/nis_print.c:344 ++#: nis/nis_print.c:349 + #, c-format + msgid " Data Length = %u\n" + msgstr " D�ka �dajov = %u\n" + +-#: nis/nis_print_group_entry.c:121 ++#: nis/nis_print_group_entry.c:123 + msgid " Explicit members:\n" + msgstr " Explicitn� �lenovia:\n" + +-#: nis/nis_print_group_entry.c:145 nis/nis_print_group_entry.c:161 ++#: nis/nis_print_group_entry.c:147 nis/nis_print_group_entry.c:163 + msgid " Explicit nonmembers:\n" + msgstr " Explicitn� ne�lenovia:\n" + +-#: nis/nis_print_group_entry.c:129 ++#: nis/nis_print_group_entry.c:131 + msgid " Implicit members:\n" + msgstr " Implicitn� �lenovia:\n" + +-#: nis/nis_print_group_entry.c:153 ++#: nis/nis_print_group_entry.c:155 + msgid " Implicit nonmembers:\n" + msgstr " Implicitn� ne�lenovia:\n" + +-#: nis/nis_print_group_entry.c:126 ++#: nis/nis_print_group_entry.c:128 + msgid " No explicit members\n" + msgstr " �iadni explicitn� �lenovia\n" + +-#: nis/nis_print_group_entry.c:150 ++#: nis/nis_print_group_entry.c:152 + msgid " No explicit nonmembers\n" + msgstr " �iadni explicitn� ne�lenovia\n" + +-#: nis/nis_print_group_entry.c:134 ++#: nis/nis_print_group_entry.c:136 + msgid " No implicit members\n" + msgstr " �iadni implicitn� �lenovia\n" + +-#: nis/nis_print_group_entry.c:158 ++#: nis/nis_print_group_entry.c:160 + msgid " No implicit nonmembers\n" + msgstr " �iadni implicitn� ne�lenovia\n" + +-#: nis/nis_print_group_entry.c:142 ++#: nis/nis_print_group_entry.c:144 + msgid " No recursive members\n" + msgstr " �iadni rekurz�vni �lenovia\n" + +-#: nis/nis_print_group_entry.c:166 ++#: nis/nis_print_group_entry.c:168 + msgid " No recursive nonmembers\n" + msgstr " �iadni rekurz�vni ne�lenovia\n" + +-#: nis/nis_print_group_entry.c:137 ++#: nis/nis_print_group_entry.c:139 + msgid " Recursive members:\n" + msgstr " Rekurz�vni �lenovia:\n" + +@@ -194,138 +194,198 @@ + msgid " program vers proto port\n" + msgstr " program verz proto port\n" + +-#: argp/argp-help.c:1571 ++#: argp/argp-help.c:1572 + msgid " or: " + msgstr " alebo: " + ++#: elf/ldconfig.c:448 ++msgid " (SKIPPED)\n" ++msgstr " (VYNECHAN�)\n" ++ ++#: elf/ldconfig.c:446 ++msgid " (changed)\n" ++msgstr " (zmenen�)\n" ++ + #: timezone/zic.c:421 + #, c-format + msgid " (rule from \"%s\", line %d)" + msgstr " (pravidlo z \"%s\", riadok %d)" + +-#: argp/argp-help.c:1583 ++#: argp/argp-help.c:1584 + msgid " [OPTION...]" + msgstr " [VO�BA...]" + +-#: locale/programs/ld-collate.c:370 locale/programs/ld-ctype.c:1291 +-msgid " done\n" +-msgstr " hotovo\n" +- + #: timezone/zic.c:418 + #, c-format + msgid "\"%s\", line %d: %s" + msgstr "\"%s\", riadok %d: %s" + +-#: timezone/zic.c:958 ++#: timezone/zic.c:983 + #, c-format + msgid "\"Zone %s\" line and -l option are mutually exclusive" + msgstr "Riadok \"Zone %s\" a vo�ba -l sa navz�jom vylu�uj�" + +-#: timezone/zic.c:966 ++#: timezone/zic.c:991 + #, c-format + msgid "\"Zone %s\" line and -p option are mutually exclusive" + msgstr "Riadok \"Zone %s\" a vo�ba -p sa navz�jom vylu�uj�" + +-#: sunrpc/rpc_main.c:1401 ++#: sunrpc/rpc_main.c:1410 + msgid "\"infile\" is required for template generation flags.\n" + msgstr "\"vst_s�bor\" je vy�adovan� pri pou�it� pr�znakov tvorby vzoru.\n" + +-#: argp/argp-help.c:210 ++#: argp/argp-help.c:209 + #, c-format + msgid "%.*s: ARGP_HELP_FMT parameter requires a value" + msgstr "%.*s: Parameter ARGP_HELP_FMT vy�aduje hodnotu" + +-#: argp/argp-help.c:219 ++#: argp/argp-help.c:218 + #, c-format + msgid "%.*s: Unknown ARGP_HELP_FMT parameter" + msgstr "%.*s: Nezn�my parameter ARGP_HELP_FMT" + +-#: timezone/zic.c:768 ++#: locale/programs/ld-address.c:576 locale/programs/ld-collate.c:2593 ++#: locale/programs/ld-collate.c:3719 locale/programs/ld-ctype.c:2110 ++#: locale/programs/ld-ctype.c:2847 locale/programs/ld-identification.c:440 ++#: locale/programs/ld-measurement.c:232 locale/programs/ld-messages.c:326 ++#: locale/programs/ld-monetary.c:934 locale/programs/ld-name.c:300 ++#: locale/programs/ld-numeric.c:370 locale/programs/ld-paper.c:233 ++#: locale/programs/ld-telephone.c:308 locale/programs/ld-time.c:1172 ++#, c-format ++msgid "%1$s: definition does not end with `END %1$s'" ++msgstr "%1$s: Defin�cia nekon�� `END %1$s'" ++ ++#: elf/cache.c:165 elf/cache.c:175 ++#, c-format ++msgid "%d libs found in cache `%s'\n" ++msgstr "%d kni�n�c n�jden�ch v cache `%s'\n" ++ ++#: timezone/zic.c:793 + #, c-format + msgid "%s in ruleless zone" + msgstr "%s v z�ne bez pravidiel" + +-#: assert/assert.c:51 ++#: elf/../sysdeps/generic/readelflib.c:65 ++#, c-format ++msgid "%s is a 32 bit ELF file.\n" ++msgstr "%s je 32-bitov� ELF s�bor.\n" ++ ++#: elf/../sysdeps/generic/readelflib.c:67 ++#, c-format ++msgid "%s is a 64 bit ELF file.\n" ++msgstr "%s je 64-bitov� ELF s�bor.\n" ++ ++#: elf/../sysdeps/unix/sysv/linux/i386/readelflib.c:48 ++#, c-format ++msgid "%s is for unknown machine %d.\n" ++msgstr "%s je pre nezn�my stroj %d.\n" ++ ++#: elf/ldconfig.c:329 ++#, c-format ++msgid "%s is not a known library type" ++msgstr "%s nie je zn�my typ kni�nice" ++ ++#: elf/../sysdeps/generic/readelflib.c:76 ++#, c-format ++msgid "%s is not a shared object file (Type: %d).\n" ++msgstr "%s nie je zdie�an� objektov� s�bor (Typ: %d).\n" ++ ++#: elf/ldconfig.c:415 ++#, c-format ++msgid "%s is not a symbolic link\n" ++msgstr "%s nie je symbolick� odkaz\n" ++ ++#: elf/readlib.c:157 ++#, c-format ++msgid "%s is not an ELF file - it has the wrong magic bytes at the start.\n" ++msgstr "%s nie je ELF s�bor - na za�iatku obsahuj� chybn� magick� bajty.\n" ++ ++#: assert/assert.c:52 + #, c-format + msgid "%s%s%s:%u: %s%sAssertion `%s' failed.\n" + msgstr "%s%s%s:%u: %s%sPredpoklad `%s' nesplnen�.\n" + +-#: assert/assert-perr.c:52 ++#: assert/assert-perr.c:54 + #, c-format + msgid "%s%s%s:%u: %s%sUnexpected error: %s.\n" + msgstr "%s%s%s:%u: %s%sNeo�ak�van� chyba: %s.\n" + +-#: stdio-common/psignal.c:47 ++#: stdio-common/psignal.c:48 + #, c-format + msgid "%s%sUnknown signal %d\n" + msgstr "%s%sNezn�my sign�l %d\n" + +-#: timezone/zic.c:2201 ++#: timezone/zic.c:2228 + #, c-format + msgid "%s: %d did not sign extend correctly\n" + msgstr "%s: nespr�vne roz��renie znamienka pre %d\n" + +-#: locale/programs/charmap.c:261 ++#: locale/programs/charmap.c:326 + #, c-format + msgid "%s: <mb_cur_max> must be greater than <mb_cur_min>\n" + msgstr "%s: <mb_cur_max> mus� by� v��ie ako <mb_cur_min>\n" + +-#: sunrpc/rpc_main.c:422 ++#: sunrpc/rpc_main.c:423 + #, 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:419 ++#: sunrpc/rpc_main.c:420 + #, c-format + msgid "%s: C preprocessor failed with signal %d\n" + msgstr "%s: C preprocesor zlyhal so sign�lom %d\n" + +-#: timezone/zic.c:1469 ++#: timezone/zic.c:1494 + #, c-format + msgid "%s: Can't create %s: %s\n" + msgstr "%s: Nie je mo�n� vytvori� %s: %s\n" + +-#: timezone/zic.c:2179 ++#: timezone/zic.c:2206 + #, c-format + msgid "%s: Can't create directory %s: %s\n" + msgstr "%s: Nie je mo�n� vytvori� adres�r %s: %s\n" + +-#: timezone/zic.c:620 ++#: timezone/zic.c:645 + #, c-format + msgid "%s: Can't link from %s to %s: %s\n" + msgstr "%s: Nie je mo�n� vytvori� prepojenie z %s na %s: %s\n" + +-#: timezone/zic.c:794 ++#: timezone/zic.c:819 + #, c-format + msgid "%s: Can't open %s: %s\n" + msgstr "%s: Nie je mo�n� otvori� %s: %s\n" + +-#: timezone/zic.c:1459 ++#: timezone/zic.c:1484 + #, c-format + msgid "%s: Can't remove %s: %s\n" + msgstr "%s: Nie je mo�n� odstr�ni� %s: %s\n" + +-#: timezone/zic.c:863 ++#: timezone/zic.c:630 ++#, c-format ++msgid "%s: Can't unlink %s: %s\n" ++msgstr "%s: Nie je mo�n� zmaza� %s: %s\n" ++ ++#: timezone/zic.c:888 + #, c-format + msgid "%s: Error closing %s: %s\n" + msgstr "%s: Chyba pri uzatv�ran� %s: %s\n" + +-#: timezone/zic.c:856 ++#: timezone/zic.c:881 + #, c-format + msgid "%s: Error reading %s\n" + msgstr "%s: Chyba pri ��tan� %s\n" + +-#: timezone/zic.c:1535 ++#: timezone/zdump.c:267 + #, c-format +-msgid "%s: Error writing %s\n" +-msgstr "%s: Chyba pri z�pise %s\n" ++msgid "%s: Error writing " ++msgstr "%s: Chyba pri z�pise " + +-#: timezone/zdump.c:266 ++#: timezone/zic.c:1560 + #, c-format +-msgid "%s: Error writing standard output " +-msgstr "%s: Chyba pri z�pise na �tandardn� v�stup " ++msgid "%s: Error writing %s\n" ++msgstr "%s: Chyba pri z�pise %s\n" + +-#: timezone/zic.c:841 ++#: timezone/zic.c:866 + #, c-format + msgid "%s: Leap line in non leap seconds file %s\n" + msgstr "%s: Priestupn� riadok v s�bore nepriestupn�ch sek�nd %s\n" +@@ -335,122 +395,551 @@ + msgid "%s: Memory exhausted: %s\n" + msgstr "%s: Nedostatok pam�ti: %s\n" + +-#: timezone/zic.c:524 ++#: timezone/zic.c:525 + #, c-format + msgid "%s: More than one -L option specified\n" + msgstr "%s: Vo�ba -L zadan� viac ako raz\n" + +-#: timezone/zic.c:484 ++#: timezone/zic.c:485 + #, c-format + msgid "%s: More than one -d option specified\n" + msgstr "%s: Vo�ba -d zadan� viac ako raz\n" + +-#: timezone/zic.c:494 ++#: timezone/zic.c:495 + #, c-format + msgid "%s: More than one -l option specified\n" + msgstr "%s: Vo�ba -l zadan� viac ako raz\n" + +-#: timezone/zic.c:504 ++#: timezone/zic.c:505 + #, c-format + msgid "%s: More than one -p option specified\n" + msgstr "%s: Vo�ba -p zadan� viac ako raz\n" + +-#: timezone/zic.c:514 ++#: timezone/zic.c:515 + #, c-format + msgid "%s: More than one -y option specified\n" + msgstr "%s: Vo�ba -y zadan� viac ako raz\n" + +-#: argp/argp-parse.c:640 ++#: argp/argp-parse.c:646 + #, c-format + msgid "%s: Too many arguments\n" + msgstr "%s: Prive�a argumentov\n" + +-#: login/programs/database.c:129 ++#: locale/programs/ld-collate.c:457 locale/programs/ld-collate.c:483 ++#: locale/programs/ld-collate.c:499 ++#, c-format ++msgid "%s: `%s' mentioned more than once in definition of weight %d" ++msgstr "%s: `%s' spomenut� viac ako raz v defin�cii v�hy %d" ++ ++#: locale/programs/ld-collate.c:1323 ++#, c-format ++msgid "%s: `%s' must be a character" ++msgstr "%s: `%s' mus� by� znak" ++ ++#: locale/programs/ld-address.c:248 locale/programs/ld-address.c:276 ++#: locale/programs/ld-address.c:309 locale/programs/ld-address.c:321 ++#, c-format ++msgid "%s: `%s' value does not match `%s' value" ++msgstr "%s: hodnota `%s' nezodpoved� hodnote `%s'" ++ ++#: locale/programs/ld-monetary.c:835 locale/programs/ld-numeric.c:313 ++#, c-format ++msgid "%s: `-1' must be last entry in `%s' field" ++msgstr "%s: `-1' mus� by� posledn�m z�znamom v poli `%s'" ++ ++#: locale/programs/ld-collate.c:447 locale/programs/ld-collate.c:473 ++#, c-format ++msgid "%s: `forward' and `backward' are mutually excluding each other" ++msgstr "%s: `forward' a `backward' sa navz�jom vylu�uj�" ++ ++#: locale/programs/ld-collate.c:1515 ++#, c-format ++msgid "%s: `position' must be used for a specific level in all sections or none" ++msgstr "%s: `position' mus� by� pre dan� �rove� pou�it� vo v�etk�ch sekci�ch, alebo v �iadnej" ++ ++#: locale/programs/ld-ctype.c:2635 locale/programs/ld-ctype.c:2775 ++#, c-format ++msgid "%s: `translit_start' section does not end with `translit_end'" ++msgstr "%s: sekcia `translit_start' nekon�� `translit_end'" ++ ++#: locale/programs/ld-collate.c:1123 ++#, c-format ++msgid "%s: byte sequence of first character of sequence is not lower than that of the last character" ++msgstr "%s: poradie bajtu prv�ho znaku sekvencie nie je men�ie ako posledn�ho" ++ ++#: locale/programs/ld-collate.c:1081 ++#, c-format ++msgid "%s: byte sequences of first and last character must have the same length" ++msgstr "%s: bajtov� sekvencie prv�ho a posledn�ho znaku musia ma� rovnak� d�ku" ++ ++#: locale/programs/ld-collate.c:3642 ++#, c-format ++msgid "%s: cannot have `%s' as end of ellipsis range" ++msgstr "%s: `%s' nem��e by� koncov�m znakom rozsahu pokra�ovania" ++ ++#: locale/programs/ld-collate.c:3308 ++#, c-format ++msgid "%s: cannot reorder after %.*s: symbol not known" ++msgstr "%s: nie je mo�n� preradi� za %.*s: nezn�my symbol" ++ ++#: locale/programs/ld-ctype.c:2910 locale/programs/ld-ctype.c:2994 ++#: locale/programs/ld-ctype.c:3014 locale/programs/ld-ctype.c:3035 ++#: locale/programs/ld-ctype.c:3056 locale/programs/ld-ctype.c:3077 ++#: locale/programs/ld-ctype.c:3098 locale/programs/ld-ctype.c:3138 ++#: locale/programs/ld-ctype.c:3159 locale/programs/ld-ctype.c:3226 ++#, c-format ++msgid "%s: character `%s' in charmap not representable with one byte" ++msgstr "%s: znak `%s' v znakovej mape nie je vyjadrite�n� jedn�m bajtom" ++ ++#: locale/programs/ld-ctype.c:3270 locale/programs/ld-ctype.c:3295 + #, c-format +-msgid "%s: cannot get modification time" +-msgstr "%s: nie je mo�n� zisti� �as zmeny" ++msgid "%s: character `%s' needed as default value not representable with one byte" ++msgstr "%s: znak `%s' je potrebn� ako prednastaven� hodnota nevyjadrite�n� jedn�m bajtom" + +-#: timezone/zic.c:1900 ++#: locale/programs/ld-ctype.c:2905 ++#, c-format ++msgid "%s: character `%s' not defined in charmap while needed as default value" ++msgstr "%s: znak `%s' nie je definovan� v mape znakov a je potrebn� ako implicitn� hodnota" ++ ++#: locale/programs/ld-ctype.c:2989 locale/programs/ld-ctype.c:3009 ++#: locale/programs/ld-ctype.c:3051 locale/programs/ld-ctype.c:3072 ++#: locale/programs/ld-ctype.c:3093 locale/programs/ld-ctype.c:3133 ++#: locale/programs/ld-ctype.c:3154 locale/programs/ld-ctype.c:3221 ++#: locale/programs/ld-ctype.c:3263 locale/programs/ld-ctype.c:3288 ++#, c-format ++msgid "%s: character `%s' not defined while needed as default value" ++msgstr "%s: znak `%s' nie je definovan� a je potrebn� ako implicitn� hodnota" ++ ++#: timezone/zic.c:1927 + #, c-format + msgid "%s: command was '%s', result was %d\n" + msgstr "%s: pr�kaz bol '%s', v�sledok bol %d\n" + +-#: locale/programs/charmap.c:677 locale/programs/locfile.c:1008 ++#: locale/programs/ld-time.c:225 ++#, c-format ++msgid "%s: direction flag in string %Zd in `era' field is not '+' nor '-'" ++msgstr "%s: pr�znak smeru v re�azci %Zd po�a `era' nie je '+' ani '-'" ++ ++#: locale/programs/ld-time.c:237 ++#, c-format ++msgid "%s: direction flag in string %Zd in `era' field is not a single character" ++msgstr "%s: pr�znak smeru v re�azci %Zd po�a `era' nie je jeden znak" ++ ++#: locale/programs/ld-ctype.c:2727 ++#, c-format ++msgid "%s: duplicate `default_missing' definition" ++msgstr "%s: duplicitn� defin�cia `default_missing'" ++ ++#: locale/programs/ld-identification.c:423 ++#, c-format ++msgid "%s: duplicate category version definition" ++msgstr "%s: duplicitn� defin�cia verzie kateg�rie" ++ ++#: locale/programs/ld-collate.c:2711 ++#, c-format ++msgid "%s: duplicate declaration of section `%s'" ++msgstr "%s: duplicitn� deklar�cia sekcie `%s'" ++ ++#: locale/programs/ld-collate.c:2675 ++#, c-format ++msgid "%s: duplicate definition of `%s'" ++msgstr "%s: duplicitn� defin�cia `%s'" ++ ++#: locale/programs/ld-collate.c:3691 ++#, c-format ++msgid "%s: empty category description not allowed" ++msgstr "%s: pr�zdny popis kateg�rie nie je povolen�" ++ ++#: locale/programs/ld-collate.c:755 ++#, c-format ++msgid "%s: empty weight string not allowed" ++msgstr "%s: pr�zdny re�azec v�hy nie je povolen�" ++ ++#: locale/programs/charmap.c:831 + #, c-format + msgid "%s: error in state machine" + msgstr "%s: chyba v stavovom automate" + +-#: posix/getopt.c:784 ++#: locale/programs/ld-ctype.c:2483 ++#, c-format ++msgid "%s: field `%s' declared more than once" ++msgstr "%s: pole `%s' deklarovan� viac ako raz" ++ ++#: locale/programs/ld-ctype.c:1525 locale/programs/ld-ctype.c:1650 ++#: locale/programs/ld-ctype.c:1756 locale/programs/ld-ctype.c:2346 ++#: locale/programs/ld-ctype.c:3329 ++#, c-format ++msgid "%s: field `%s' does not contain exactly ten entries" ++msgstr "%s: pole `%s' neobsahuje presne desa� polo�iek" ++ ++#: locale/programs/ld-address.c:154 locale/programs/ld-address.c:205 ++#: locale/programs/ld-address.c:230 locale/programs/ld-address.c:259 ++#: locale/programs/ld-name.c:115 locale/programs/ld-telephone.c:117 ++#, c-format ++msgid "%s: field `%s' must not be empty" ++msgstr "%s: pole `%s' nesmie by� pr�zdne" ++ ++#: locale/programs/ld-address.c:142 locale/programs/ld-address.c:197 ++#: locale/programs/ld-address.c:224 locale/programs/ld-address.c:284 ++#: locale/programs/ld-address.c:303 locale/programs/ld-address.c:315 ++#: locale/programs/ld-measurement.c:104 locale/programs/ld-monetary.c:244 ++#: locale/programs/ld-monetary.c:260 locale/programs/ld-name.c:104 ++#: locale/programs/ld-numeric.c:113 locale/programs/ld-numeric.c:127 ++#: locale/programs/ld-paper.c:101 locale/programs/ld-paper.c:109 ++#: locale/programs/ld-telephone.c:105 ++#, c-format ++msgid "%s: field `%s' not defined" ++msgstr "%s: pole `%s' nie je definovan�" ++ ++#: locale/programs/ld-messages.c:115 locale/programs/ld-messages.c:148 ++#, c-format ++msgid "%s: field `%s' undefined" ++msgstr "%s: pole `%s' nedefinovan�" ++ ++#: locale/programs/ld-time.c:258 ++#, c-format ++msgid "%s: garbage at end of offset value in string %Zd in `era' field" ++msgstr "%s: smetie za koncom hodnoty posunutia v re�azci %Zd po�a `era'" ++ ++#: locale/programs/ld-time.c:318 ++#, c-format ++msgid "%s: garbage at end of starting date in string %Zd in `era' field " ++msgstr "%s: smetie za koncom po�iato�n�ho d�tumu v re�azci %Zd po�a `era' " ++ ++#: locale/programs/ld-time.c:395 ++#, c-format ++msgid "%s: garbage at end of stopping date in string %Zd in `era' field" ++msgstr "%s: smetie za koncom koncov�ho d�tumu v re�azci %Zd po�a `era'" ++ ++#: posix/getopt.c:795 + #, c-format + msgid "%s: illegal option -- %c\n" + msgstr "%s: nepr�pustn� vo�ba -- %c\n" + +-#: posix/getopt.c:787 ++#: locale/programs/ld-address.c:573 locale/programs/ld-collate.c:3717 ++#: locale/programs/ld-ctype.c:2844 locale/programs/ld-identification.c:437 ++#: locale/programs/ld-measurement.c:229 locale/programs/ld-messages.c:324 ++#: locale/programs/ld-monetary.c:932 locale/programs/ld-name.c:298 ++#: locale/programs/ld-numeric.c:368 locale/programs/ld-paper.c:231 ++#: locale/programs/ld-telephone.c:306 locale/programs/ld-time.c:1170 ++#, c-format ++msgid "%s: incomplete `END' line" ++msgstr "%s: nekompletn� riadok `END'" ++ ++#: locale/programs/ld-address.c:166 ++msgid "%s: invalid escape `%%%c' sequence in field `%s'" ++msgstr "%s: nepr�pustn� escape `%%%x' sekvencia v poli `%s'" ++ ++#: locale/programs/ld-name.c:127 locale/programs/ld-telephone.c:126 ++#: locale/programs/ld-telephone.c:150 ++#, c-format ++msgid "%s: invalid escape sequence in field `%s'" ++msgstr "%s: chybn� escape-sekvencia v poli `%s'" ++ ++#: locale/programs/ld-time.c:250 ++#, c-format ++msgid "%s: invalid number for offset in string %Zd in `era' field" ++msgstr "%s: nepr�pustn� ��slo pre posunutie v re�azci %Zd po�a `era'" ++ ++#: locale/programs/ld-collate.c:3143 ++#, c-format ++msgid "%s: invalid number of sorting rules" ++msgstr "%s: chybn� po�et pravidiel triedenia" ++ ++#: posix/getopt.c:798 + #, c-format + msgid "%s: invalid option -- %c\n" + msgstr "%s: chybn� vo�ba -- %c\n" + +-#: posix/getopt.c:707 ++#: locale/programs/ld-time.c:309 ++#, c-format ++msgid "%s: invalid starting date in string %Zd in `era' field" ++msgstr "%s: nepr�pustn� po�iato�n� d�tum v re�azci %Zd po�a `era'" ++ ++#: locale/programs/ld-time.c:386 ++#, c-format ++msgid "%s: invalid stopping date in string %Zd in `era' field" ++msgstr "%s: nepr�pustn� koncov� d�tum v re�azci %d po�a `era'" ++ ++#: locale/programs/ld-measurement.c:112 ++#, c-format ++msgid "%s: invalid value for field `%s'" ++msgstr "%s: nepr�pustn� hodnota po�a `%s'" ++ ++#: locale/programs/ld-address.c:242 locale/programs/ld-address.c:270 ++#, c-format ++msgid "%s: language abbreviation `%s' not defined" ++msgstr "%s: skratka jazyka `%s' nie je definovan�" ++ ++#: locale/programs/ld-collate.c:3223 locale/programs/ld-collate.c:3346 ++#: locale/programs/ld-collate.c:3695 ++#, c-format ++msgid "%s: missing `order_end' keyword" ++msgstr "%s: ch�baj�ce k���ov� slovo `order_end'" ++ ++#: locale/programs/ld-collate.c:3360 locale/programs/ld-collate.c:3707 ++#, c-format ++msgid "%s: missing `reorder-end' keyword" ++msgstr "%s: ch�baj�ce k���ov� slovo `reorder-end'" ++ ++#: locale/programs/ld-collate.c:3710 ++#, c-format ++msgid "%s: missing `reorder-sections-end' keyword" ++msgstr "%s: ch�baj�ce k���ov� slovo `reorder-sections-end'" ++ ++#: locale/programs/ld-time.c:435 ++#, c-format ++msgid "%s: missing era format in string %Zd in `era' field" ++msgstr "%s: ch�ba form�t �ry v re�azci %Zd v poli `era'" ++ ++#: locale/programs/ld-time.c:423 ++#, c-format ++msgid "%s: missing era name in string %Zd in `era' field" ++msgstr "%s: ch�ba meno �ry v re�azci %Zd v poli `era'" ++ ++#: locale/programs/ld-collate.c:3119 ++#, c-format ++msgid "%s: multiple order definitions for section `%s'" ++msgstr "%s: viacn�sobn� defin�cia poradia pre sekciu `%s'" ++ ++#: locale/programs/ld-collate.c:3169 ++#, c-format ++msgid "%s: multiple order definitions for unnamed section" ++msgstr "%s: viacn�sobn� defin�cia poradia pre sekciu bez mena" ++ ++#: locale/programs/ld-messages.c:137 locale/programs/ld-messages.c:170 ++#, c-format ++msgid "%s: no correct regular expression for field `%s': %s" ++msgstr "%s: pre pole `%s' neexistuje korektn� regul�rny v�raz: %s" ++ ++#: locale/programs/ld-identification.c:169 ++#, c-format ++msgid "%s: no identification for category `%s'" ++msgstr "%s: kateg�ria `%s' nem� identifik�ciu" ++ ++#: locale/programs/ld-ctype.c:2753 ++#, c-format ++msgid "%s: no representable `default_missing' definition found" ++msgstr "%s: nen�jden� zobrazite�n� defin�cia `default_missing'" ++ ++#: locale/programs/ld-collate.c:591 ++#, c-format ++msgid "%s: not enough sorting rules" ++msgstr "%s: nedostato�n� po�et pravidiel triedenia" ++ ++#: locale/programs/ld-address.c:295 ++#, c-format ++msgid "%s: numeric country code `%d' not valid" ++msgstr "%s: ��seln� k�d krajiny `%d' nie je platn�" ++ ++#: posix/getopt.c:718 + #, c-format + msgid "%s: option `%c%s' doesn't allow an argument\n" + msgstr "%s: vo�ba `%c%s' nedovo�uje pou�i� argument\n" + +-#: posix/getopt.c:677 ++#: posix/getopt.c:688 + #, c-format + msgid "%s: option `%s' is ambiguous\n" + msgstr "%s: vo�ba `%s' nie je jednozna�n�\n" + +-#: posix/getopt.c:725 posix/getopt.c:898 ++#: posix/getopt.c:736 posix/getopt.c:909 + #, c-format + msgid "%s: option `%s' requires an argument\n" + msgstr "%s: vo�ba `%s' vy�aduje argument\n" + +-#: posix/getopt.c:702 ++#: posix/getopt.c:713 + #, c-format + msgid "%s: option `--%s' doesn't allow an argument\n" + msgstr "%s: vo�ba `--%s' nedovo�uje pou�i� argument\n" + +-#: posix/getopt.c:882 ++#: posix/getopt.c:893 + #, c-format + msgid "%s: option `-W %s' doesn't allow an argument\n" + msgstr "%s: vo�ba `-W %s' nedovo�uje pou�i� argument\n" + +-#: posix/getopt.c:864 ++#: posix/getopt.c:875 + #, c-format + msgid "%s: option `-W %s' is ambiguous\n" + msgstr "%s: vo�ba `-W %s' nie je jednozna�n�\n" + +-#: posix/getopt.c:817 posix/getopt.c:947 ++#: posix/getopt.c:828 posix/getopt.c:958 + #, c-format + msgid "%s: option requires an argument -- %c\n" + msgstr "%s: vo�ba vy�aduje argument -- %c\n" + +-#: sunrpc/rpc_main.c:287 ++#: locale/programs/ld-collate.c:1314 locale/programs/ld-collate.c:3654 ++#, c-format ++msgid "%s: order for `%.*s' already defined at %s:%Zu" ++msgstr "%s: poradie pre `%.*s' je u� definovan� na %s:%Zu" ++ ++#: locale/programs/ld-collate.c:3297 ++#, c-format ++msgid "%s: order for collating element %.*s not yet defined" ++msgstr "%s: poradie pre element triedenia `%.*s' e�te nebolo definovan�" ++ ++#: locale/programs/ld-collate.c:3281 ++#, c-format ++msgid "%s: order for collating symbol %.*s not yet defined" ++msgstr "%s: poradie pre symbol triedenia `%.*s' e�te nebolo definovan�" ++ ++#: sunrpc/rpc_main.c:289 + #, c-format + msgid "%s: output would overwrite %s\n" + msgstr "%s: v�stup by prep�sal %s\n" + +-#: timezone/zic.c:848 timezone/zic.c:1262 timezone/zic.c:1287 ++#: timezone/zic.c:873 timezone/zic.c:1287 timezone/zic.c:1312 + #, c-format + msgid "%s: panic: Invalid l_value %d\n" + msgstr "%s: fat�lna chyba: Nepr�pustn� l_hodnota %d\n" + +-#: locale/programs/charmap.c:684 locale/programs/repertoire.c:289 ++#: locale/programs/charmap.c:838 locale/programs/ld-address.c:592 ++#: locale/programs/ld-collate.c:2590 locale/programs/ld-collate.c:3735 ++#: locale/programs/ld-ctype.c:2107 locale/programs/ld-ctype.c:2864 ++#: locale/programs/ld-identification.c:456 ++#: locale/programs/ld-measurement.c:248 locale/programs/ld-messages.c:342 ++#: locale/programs/ld-monetary.c:950 locale/programs/ld-name.c:316 ++#: locale/programs/ld-numeric.c:386 locale/programs/ld-paper.c:249 ++#: locale/programs/ld-telephone.c:324 locale/programs/ld-time.c:1188 ++#: locale/programs/locfile.h:103 locale/programs/repertoire.c:325 + #, c-format + msgid "%s: premature end of file" + msgstr "%s: pred�asn� koniec s�boru" + +-#: sunrpc/rpc_main.c:294 ++#: locale/programs/ld-collate.c:3394 locale/programs/ld-collate.c:3580 ++#, c-format ++msgid "%s: section `%.*s' not known" ++msgstr "%s: nezn�ma sekcia `%.*s'" ++ ++#: locale/programs/ld-time.c:337 ++#, c-format ++msgid "%s: starting date is invalid in string %Zd in `era' field" ++msgstr "%s: nepr�pustn� po�iato�n� d�tum v re�azci %Zd v poli `era'" ++ ++#: locale/programs/ld-time.c:414 ++#, c-format ++msgid "%s: stopping date is invalid in string %Zd in `era' field" ++msgstr "%s: nepr�pustn� koncov� d�tum v re�azci %d v poli `era'" ++ ++#: locale/programs/ld-collate.c:1248 ++#, c-format ++msgid "%s: symbolic range ellipsis must not be direct followed by `order_end'" ++msgstr "%s: pokra�ovanie symbolick�ho rozsahu nesmie by� priamo nasledovan� `order_end'" ++ ++#: locale/programs/ld-collate.c:1244 ++#, c-format ++msgid "%s: symbolic range ellipsis must not directly follow `order_start'" ++msgstr "%s: pokra�ovanie symbolick�ho rozsahu nesmie priamo nasledo� `order_start'" ++ ++#: locale/programs/ld-address.c:583 locale/programs/ld-collate.c:518 ++#: locale/programs/ld-collate.c:570 locale/programs/ld-collate.c:865 ++#: locale/programs/ld-collate.c:878 locale/programs/ld-collate.c:2581 ++#: locale/programs/ld-collate.c:3726 locale/programs/ld-ctype.c:1840 ++#: locale/programs/ld-ctype.c:2098 locale/programs/ld-ctype.c:2673 ++#: locale/programs/ld-ctype.c:2855 locale/programs/ld-identification.c:447 ++#: locale/programs/ld-measurement.c:239 locale/programs/ld-messages.c:333 ++#: locale/programs/ld-monetary.c:941 locale/programs/ld-name.c:307 ++#: locale/programs/ld-numeric.c:377 locale/programs/ld-paper.c:240 ++#: locale/programs/ld-telephone.c:315 locale/programs/ld-time.c:1179 ++#, c-format ++msgid "%s: syntax error" ++msgstr "%s: chyba syntaxe" ++ ++#: locale/programs/ld-ctype.c:2178 ++#, c-format ++msgid "%s: syntax error in definition of new character class" ++msgstr "%s: chyba syntaxe v defin�cii novej triedy znakov" ++ ++#: locale/programs/ld-ctype.c:2193 ++#, c-format ++msgid "%s: syntax error in definition of new character map" ++msgstr "%s: chyba syntaxe v defin�cii novej znakovej mapy" ++ ++#: locale/programs/ld-ctype.c:3735 ++#, c-format ++msgid "%s: table for class \"%s\": %lu bytes\n" ++msgstr "%s: tabu�ka triedy \"%s\": %lu bajtov\n" ++ ++#: locale/programs/ld-ctype.c:3803 ++#, c-format ++msgid "%s: table for map \"%s\": %lu bytes\n" ++msgstr "%s: tabu�ka mapy \"%s\": %lu bajtov\n" ++ ++#: locale/programs/ld-ctype.c:3935 ++#, c-format ++msgid "%s: table for width: %lu bytes\n" ++msgstr "%s: tabu�ka ��rky: %lu bajtov\n" ++ ++#: locale/programs/ld-address.c:216 ++#, c-format ++msgid "%s: terminology language code `%s' not defined" ++msgstr "%s: k�d jazyka terminol�gie `%s' nie je definovan�" ++ ++#: locale/programs/ld-collate.c:1054 ++#, c-format ++msgid "%s: the start and the end symbol of a range must stand for characters" ++msgstr "%s: po�iato�n� a koncov� symbol rozsahu musia zastupova� znaky" ++ ++#: locale/programs/ld-time.c:464 ++#, c-format ++msgid "%s: third operand for value of field `%s' must not be larger than %d" ++msgstr "%s: tret� operand hodnoty po�a `%s' nesmie by� v��� ako %d" ++ ++#: locale/programs/ld-collate.c:555 ++#, c-format ++msgid "%s: too many rules; first entry only had %d" ++msgstr "%s: prive�a pravidiel; prv� z�znam mal iba %d" ++ ++#: locale/programs/ld-collate.c:906 ++#, c-format ++msgid "%s: too many values" ++msgstr "%s: prive�a hodn�t" ++ ++#: locale/programs/ld-ctype.c:3639 ++#, c-format ++msgid "%s: transliteration data from locale `%s' not available" ++msgstr "%s: translitera�n� �daje prostredia `%s' nie s� dostupn�" ++ ++#: sunrpc/rpc_main.c:296 ++#, c-format ++msgid "%s: unable to open %s: %m\n" ++msgstr "%s: nie je mo�n� otvori� %s: %m\n" ++ ++#: locale/programs/ld-collate.c:2849 ++#, c-format ++msgid "%s: unknown character in collating symbol name" ++msgstr "%s: nezn�my znak v n�zve symbolu triedenia" ++ ++#: locale/programs/ld-collate.c:2981 ++#, c-format ++msgid "%s: unknown character in equivalent definition name" ++msgstr "%s: nezn�my znak v n�zve ekvivalentnej defin�cie" ++ ++#: locale/programs/ld-collate.c:2994 ++#, c-format ++msgid "%s: unknown character in equivalent definition value" ++msgstr "%s: nezn�my znak v hodnote ekvivalentnej defin�cie" ++ ++#: locale/programs/ld-time.c:1040 ++#, c-format ++msgid "%s: unknown character in field `%s'" ++msgstr "%s: nezn�my znak v poli `%s'" ++ ++#: locale/programs/ld-collate.c:3091 ++#, c-format ++msgid "%s: unknown section name `%s'" ++msgstr "%s: nezn�my n�zov sekcie `%s'" ++ ++#: locale/programs/ld-collate.c:3004 + #, c-format +-msgid "%s: unable to open " +-msgstr "%s: Nie je mo�n� otvori� " ++msgid "%s: unknown symbol `%s' in equivalent definition" ++msgstr "%s: nezn�my symbol `%s' v ekvivalentnej defin�cii" + +-#: posix/getopt.c:758 ++#: posix/getopt.c:769 + #, c-format + msgid "%s: unrecognized option `%c%s'\n" + msgstr "%s: nerozpoznan� vo�ba `%c%s'\n" + +-#: posix/getopt.c:754 ++#: posix/getopt.c:765 + #, c-format + msgid "%s: unrecognized option `--%s'\n" + msgstr "%s: nerozpoznan� vo�ba `--%s'\n" +@@ -458,35 +947,75 @@ + #: timezone/zic.c:443 + #, c-format + msgid "" +-"%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] [ -d directory ]\n" +-"\t[ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n" ++"%s: usage is %s [ -s ] [ -v ] [ -l localtime ] [ -p posixrules ] \\\n" ++"\t[ -d directory ] [ -L leapseconds ] [ -y yearistype ] [ filename ... ]\n" + msgstr "" +-"%s: Pou�itie: %s [ -s ] [ -v ] [ -l lok�lny_�as ] [ -p posix_pravidl� ]\n" ++"%s: Pou�itie: %s [ -s ] [ -v ] [ -l lok�lny_�as ] [ -p posix_pravidl� ] \\\n" + "\t[ -d adres�r ] [ -L priestupn�_sekundy ] [ -y typ_roku ] [ s�bor ... ]\n" + +-#: timezone/zdump.c:174 ++#: timezone/zdump.c:175 + #, c-format + msgid "%s: usage is %s [ -v ] [ -c cutoff ] zonename ...\n" + msgstr "%s: Pou�itie: %s [ -v ] [ -c limit ] meno_z�ny ...\n" + +-#: sunrpc/rpc_main.c:307 ++#: locale/programs/ld-messages.c:121 locale/programs/ld-messages.c:154 ++#, c-format ++msgid "%s: value for field `%s' must not be an empty string" ++msgstr "%s: hodnota po�a `%s' nesmie by� pr�zdny re�azec" ++ ++#: locale/programs/ld-monetary.c:250 locale/programs/ld-numeric.c:119 ++#, c-format ++msgid "%s: value for field `%s' must not be the empty string" ++msgstr "%s: hodnota po�a `%s' nesmie by� pr�zdny re�azec" ++ ++#: locale/programs/ld-monetary.c:232 ++#, c-format ++msgid "%s: value of field `int_curr_symbol' does not correspond to a valid name in ISO 4217" ++msgstr "%s: hodnota po�a `int_curr_symbol' nezodpoved� platn�mu n�zvu v ISO 4217" ++ ++#: locale/programs/ld-monetary.c:224 ++#, c-format ++msgid "%s: value of field `int_curr_symbol' has wrong length" ++msgstr "%s: hodnota po�a `int_curr_symbol' m� chybn� d�ku" ++ ++#: locale/programs/ld-monetary.c:857 locale/programs/ld-numeric.c:334 ++#, c-format ++msgid "%s: values for field `%s' must be smaller than 127" ++msgstr "%s: hodnoty po�a `%s' musia by� men�ie ako 127" ++ ++#: locale/programs/ld-time.c:488 ++#, c-format ++msgid "%s: values for field `%s' must not be larger than %d" ++msgstr "%s: hodnoty po�a `%s' nesm� by� v��ie ako %d" ++ ++#: locale/programs/ld-time.c:472 locale/programs/ld-time.c:480 ++#, c-format ++msgid "%s: values of field `%s' must not be larger than %d" ++msgstr "%s: hodnoty po�a `%s' nesm� by� v��ie ako %d" ++ ++#: locale/programs/ld-collate.c:850 + #, c-format +-msgid "%s: while writing output: " +-msgstr "%s: po�as z�pisu v�stupu: " ++msgid "%s: weights must use the same ellipsis symbol as the name" ++msgstr "%s: v�hy musia ako n�zov pou�i� rovnak� symbol pokra�ovania" + +-#: argp/argp-parse.c:164 ++#: sunrpc/rpc_main.c:308 ++#, c-format ++msgid "%s: while writing output %s: %m" ++msgstr "%s: po�as z�pisu v�stupu %s: %m" ++ ++#: argp/argp-parse.c:170 + msgid "(PROGRAM ERROR) No version known!?" + msgstr "(CHYBA PROGRAMU) Verzia nezn�ma!?" + +-#: argp/argp-parse.c:781 ++#: argp/argp-parse.c:787 + msgid "(PROGRAM ERROR) Option should have been recognized!?" + msgstr "(CHYBA PROGRAMU) Vo�ba by mala by� rozpoznan�!?" + +-#: nis/nis_print.c:129 ++#: nis/nis_print.c:130 + msgid "(Unknown object)\n" + msgstr "(Nezn�my objekt)\n" + +-#: sunrpc/clnt_perr.c:124 ++#: sunrpc/clnt_perr.c:125 + #, c-format + msgid "(unknown authentication error - %d)" + msgstr "(nezn�ma chyba pri overovan� toto�nosti - %d)" +@@ -495,16 +1024,16 @@ + msgid "(unknown)" + msgstr "(nezn�my)" + +-#: elf/sprof.c:574 ++#: elf/sprof.c:570 + #, c-format + msgid "*** The file `%s' is stripped: no detailed analysis possible\n" + msgstr "*** Zo s�boru `%s' boli odstr�nen� ladiace inform�cie: podrobn� anal�za nie je mo�n�\n" + +-#: catgets/gencat.c:266 ++#: catgets/gencat.c:282 + msgid "*standard input*" + msgstr "*�tandardn� vstup*" + +-#: catgets/gencat.c:120 ++#: catgets/gencat.c:125 + msgid "" + "-o OUTPUT-FILE [INPUT-FILE]...\n" + "[OUTPUT-FILE [INPUT-FILE]...]" +@@ -512,30 +1041,36 @@ + "-o V�STUPN�_S�BOR [VSTUPN�_S�BOR]...\n" + "[ V�STUPN�_S�BOR [VSTUPN�_S�BOR]...]" + +-#: stdio-common/../sysdeps/gnu/errlist.c:778 ++#: stdio-common/../sysdeps/gnu/errlist.c:797 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:115 + msgid ".lib section in a.out corrupted" + msgstr "Po�koden� sekcia .lib v a.out" + +-#: sunrpc/clnt_perr.c:110 sunrpc/clnt_perr.c:131 ++#: sunrpc/clnt_perr.c:111 sunrpc/clnt_perr.c:132 + #, c-format + msgid "; low version = %lu, high version = %lu" + msgstr "; ni��ia verzia = %lu, vy��ia verzia = %lu" + +-#: sunrpc/clnt_perr.c:117 ++#: sunrpc/clnt_perr.c:118 + msgid "; why = " + msgstr "; d�vod = " + +-#: locale/programs/charset.c:98 ++#: locale/programs/charmap.c:999 + #, c-format + msgid "<%s> and <%s> are illegal names for range" + msgstr "<%s> and <%s> s� nepr�pustn� n�zvy pre rozsah" + +-#: locale/programs/ld-ctype.c:342 ++#: locale/programs/repertoire.c:448 ++#, c-format ++msgid "<%s> and <%s> are invalid names for range" ++msgstr "<%s> a <%s> s� nepr�pustn� n�zvy pre rozsah" ++ ++#: locale/programs/ld-ctype.c:565 locale/programs/ld-ctype.c:600 + #, c-format + msgid "<SP> character must not be in class `%s'" + msgstr "<SP> znak nesmie by� v triede `%s'" + +-#: locale/programs/ld-ctype.c:330 ++#: locale/programs/ld-ctype.c:553 locale/programs/ld-ctype.c:589 + #, c-format + msgid "<SP> character not in class `%s'" + msgstr "<SP> znak nie je v triede `%s'" +@@ -543,102 +1078,149 @@ + #. TRANS The experienced user will know what is wrong. + #. TRANS @c This error code is a joke. Its perror text is part of the joke. + #. TRANS @c Don't change it. +-#: stdio-common/../sysdeps/gnu/errlist.c:603 ++#: stdio-common/../sysdeps/gnu/errlist.c:622 + msgid "?" + msgstr "?" + +-#: sysdeps/unix/sysv/linux/siglist.h:27 ++#: sysdeps/generic/siglist.h:34 + msgid "Aborted" + msgstr "Zru�en�" + +-#: nis/nis_print.c:318 ++#: nis/nis_print.c:321 + msgid "Access Rights : " + msgstr "Pr�stupov� pr�va : " + +-#: stdio-common/../sysdeps/gnu/errlist.c:774 ++#: stdio-common/../sysdeps/gnu/errlist.c:793 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:114 + msgid "Accessing a corrupted shared library" + msgstr "Pr�stup k po�kodenej zdie�anej kni�nici" + + #. TRANS The requested socket address is already in use. @xref{Socket Addresses}. +-#: stdio-common/../sysdeps/gnu/errlist.c:366 ++#: stdio-common/../sysdeps/gnu/errlist.c:367 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:155 + msgid "Address already in use" + msgstr "Adresa je pou��van�" + +-#: posix/../sysdeps/posix/gai_strerror.c:30 ++#: posix/../sysdeps/posix/gai_strerror.c:31 + msgid "Address family for hostname not supported" + msgstr "Trieda adries nie je podporovan� po��ta�om" + + #. TRANS The address family specified for a socket is not supported; it is + #. TRANS inconsistent with the protocol being used on the socket. @xref{Sockets}. +-#: stdio-common/../sysdeps/gnu/errlist.c:361 ++#: stdio-common/../sysdeps/gnu/errlist.c:362 + msgid "Address family not supported by protocol" + msgstr "Trieda adries nie je podporovan� protokolom" + +-#: stdio-common/../sysdeps/gnu/errlist.c:742 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:154 ++msgid "Address family not supported by protocol family" ++msgstr "Trieda adries nie je podporovan� rodinou protokolov" ++ ++#: stdio-common/../sysdeps/gnu/errlist.c:761 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:98 + msgid "Advertise error" + msgstr "Chyba pri zverejnen�" + +-#: stdio-common/../sysdeps/unix/siglist.c:39 +-#: sysdeps/unix/sysv/linux/siglist.h:33 ++#: stdio-common/../sysdeps/unix/siglist.c:40 sysdeps/generic/siglist.h:40 + msgid "Alarm clock" + msgstr "Bud�k" + ++#: malloc/memusagestat.c:57 ++msgid "Also draw graph for total memory consumption" ++msgstr "Vykresl� aj graf celkovej spotreby pam�ti" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:83 ++msgid "Anode table overflow" ++msgstr "Prete�enie tabu�ky anode" ++ ++#: intl/tst-gettext2.c:37 ++msgid "Another string for testing." ++msgstr "In� re�azec pre testovanie." ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:37 ++msgid "Arg list too long" ++msgstr "Pr�li� dlh� zoznam argumentov" ++ + #. TRANS Argument list too long; used when the arguments passed to a new program + #. TRANS being executed with one of the @code{exec} functions (@pxref{Executing a + #. TRANS File}) occupy too much memory space. This condition never arises in the + #. TRANS GNU system. +-#: stdio-common/../sysdeps/gnu/errlist.c:69 ++#: stdio-common/../sysdeps/gnu/errlist.c:70 + msgid "Argument list too long" + msgstr "Pr�li� dlh� zoznam argumentov" + +-#: nis/nis_error.c:65 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:63 ++msgid "Argument out of domain" ++msgstr "Argument mimo dom�ny" ++ ++#: nis/nis_error.c:66 + msgid "Attempt to remove a non-empty table" + msgstr "Pokus o odstr�nenie nepr�zdnej tabu�ky" + +-#: stdio-common/../sysdeps/gnu/errlist.c:782 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:116 ++msgid "Attempting to link in more shared libraries than system limit" ++msgstr "Pokus o pou�itie viac zdie�an�ch kni�n�c, ako je syst�mov� limit" ++ ++#: stdio-common/../sysdeps/gnu/errlist.c:801 + msgid "Attempting to link in too many shared libraries" + msgstr "Pokus o pou�itie prive�a zdie�an�ch kni�n�c" + +-#: sunrpc/clnt_perr.c:273 ++#: sunrpc/clnt_perr.c:329 + msgid "Authentication OK" + msgstr "Overenie pr�v �spe�n�" + + #. TRANS ??? +-#: stdio-common/../sysdeps/gnu/errlist.c:561 ++#: stdio-common/../sysdeps/gnu/errlist.c:562 + msgid "Authentication error" + msgstr "Overenie pr�v ne�spe�n�" + +-#: nis/nis_print.c:105 ++#: nis/nis_print.c:106 + msgid "BOGUS OBJECT\n" + msgstr "POCHYBN� OBJEKT\n" + + #. TRANS Bad address; an invalid pointer was detected. + #. TRANS In the GNU system, this error never happens; you get a signal instead. +-#: stdio-common/../sysdeps/gnu/errlist.c:114 ++#: stdio-common/../sysdeps/gnu/errlist.c:115 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:44 + msgid "Bad address" + msgstr "Chybn� adresa" + ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:80 ++msgid "Bad exchange descriptor" ++msgstr "Chybn� exchange deskriptor" ++ + #. TRANS Bad file descriptor; for example, I/O on a descriptor that has been + #. TRANS closed or reading from a descriptor open only for writing (or vice + #. TRANS versa). +-#: stdio-common/../sysdeps/gnu/errlist.c:82 ++#: stdio-common/../sysdeps/gnu/errlist.c:83 + msgid "Bad file descriptor" + msgstr "Chybn� deskriptor s�boru" + +-#: stdio-common/../sysdeps/gnu/errlist.c:730 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:39 ++msgid "Bad file number" ++msgstr "Chybn� ��slo s�boru" ++ ++#: stdio-common/../sysdeps/gnu/errlist.c:749 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:87 + msgid "Bad font file format" + msgstr "Chybn� form�t s�boru rezov p�sma" + +-#: stdio-common/../sysdeps/gnu/errlist.c:622 ++#: stdio-common/../sysdeps/gnu/errlist.c:641 + msgid "Bad message" + msgstr "Chybn� spr�va" + +-#: stdio-common/../sysdeps/unix/siglist.c:37 +-#: sysdeps/unix/sysv/linux/siglist.h:56 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:84 ++msgid "Bad request code" ++msgstr "Nepr�pustn� k�d �iadosti" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:81 ++msgid "Bad request descriptor" ++msgstr "Nepr�pustn� deskriptor �iadosti" ++ ++#: stdio-common/../sysdeps/unix/siglist.c:38 sysdeps/generic/siglist.h:63 + msgid "Bad system call" + msgstr "Chybn� volanie syst�mu" + +-#: posix/../sysdeps/posix/gai_strerror.c:32 ++#: posix/../sysdeps/posix/gai_strerror.c:33 + msgid "Bad value for ai_flags" + msgstr "Chybn� hodnota ai_flags" + +@@ -646,18 +1228,19 @@ + msgid "Be strictly POSIX conform" + msgstr "Presn� s�lad s POSIX" + +-#: nis/nis_print.c:301 ++#: nis/nis_print.c:302 + msgid "Binary data\n" + msgstr "Bin�rne �daje\n" + + #. TRANS A file that isn't a block special file was given in a situation that + #. TRANS requires one. For example, trying to mount an ordinary file as a file + #. TRANS system in Unix gives this error. +-#: stdio-common/../sysdeps/gnu/errlist.c:121 ++#: stdio-common/../sysdeps/gnu/errlist.c:122 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:45 + msgid "Block device required" + msgstr "Vy�adovan� blokov� zariadenie" + +-#: sunrpc/pmap_rmt.c:347 ++#: sunrpc/pmap_rmt.c:348 + msgid "Broadcast poll problem" + msgstr "Probl�m pri volan� poll pre v�eobecn� vysielanie" + +@@ -666,135 +1249,223 @@ + #. TRANS @code{SIGPIPE} signal; this signal terminates the program if not handled + #. TRANS or blocked. Thus, your program will never actually see @code{EPIPE} + #. TRANS unless it has handled or blocked @code{SIGPIPE}. +-#: stdio-common/../sysdeps/gnu/errlist.c:234 +-#: stdio-common/../sysdeps/unix/siglist.c:38 +-#: sysdeps/unix/sysv/linux/siglist.h:32 ++#: stdio-common/../sysdeps/gnu/errlist.c:235 ++#: stdio-common/../sysdeps/unix/siglist.c:39 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:62 ++#: sysdeps/generic/siglist.h:39 + msgid "Broken pipe" + msgstr "Preru�en� r�ra" + +-#: stdio-common/../sysdeps/unix/siglist.c:35 +-#: sysdeps/unix/sysv/linux/siglist.h:30 ++#: stdio-common/../sysdeps/unix/siglist.c:36 sysdeps/generic/siglist.h:37 + msgid "Bus error" + msgstr "Chyba na zbernici" + +-#: nis/nis_print.c:45 ++#: nis/nis_print.c:46 + msgid "CDS" + msgstr "CDS" + +-#: stdio-common/../sysdeps/unix/siglist.c:49 +-#: sysdeps/unix/sysv/linux/siglist.h:43 ++#: stdio-common/../sysdeps/unix/siglist.c:50 sysdeps/generic/siglist.h:50 + msgid "CPU time limit exceeded" + msgstr "Prekro�en� �asov� limit pre procesor" + +-#: nis/nis_error.c:32 ++#: nis/nis_error.c:33 + msgid "Cache expired" + msgstr "�ivotnos� cache vypr�ala" + +-#: stdio-common/../sysdeps/gnu/errlist.c:770 ++#: stdio-common/../sysdeps/gnu/errlist.c:789 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:113 + msgid "Can not access a needed shared library" + msgstr "Pr�stup k potrebnej zdie�anej kni�nici nie je mo�n�" + +-#: nis/ypclnt.c:769 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:117 ++msgid "Can not exec a shared library directly" ++msgstr "Nie je mo�n� priamo spusti� zdie�an� kni�nicu" ++ ++#: nis/ypclnt.c:792 + msgid "Can't bind to server which serves this domain" + msgstr "Pripojenie k serveru obsluhuj�cemu t�to dom�nu nie je mo�n�" + +-#: nis/ypclnt.c:781 ++#: elf/ldconfig.c:934 ++msgid "Can't chdir to /" ++msgstr "Nie je mo�n� zmeni� adres�r na /" ++ ++#: nis/ypclnt.c:804 + msgid "Can't communicate with portmapper" + msgstr "Komunik�cia s portmapperom nie je mo�n�" + +-#: nis/ypclnt.c:783 ++#: nis/ypclnt.c:806 + msgid "Can't communicate with ypbind" + msgstr "Komunik�cia s ypbind nie je mo�n�" + +-#: nis/ypclnt.c:785 ++#: nis/ypclnt.c:808 + msgid "Can't communicate with ypserv" + msgstr "Komunik�cia s ypserv nie je mo�n�" + ++#: elf/cache.c:359 ++#, c-format ++msgid "Can't create temporary cache file %s" ++msgstr "Nie je mo�n� vytvori� do�asn� cache s�bor %s" ++ ++#: elf/ldconfig.c:502 ++#, c-format ++msgid "Can't find %s" ++msgstr "Nie je mo�n� n�js� %s" ++ ++#: elf/ldconfig.c:440 ++#, c-format ++msgid "Can't link %s to %s" ++msgstr "Nie je mo�n� vytvori� odkaz %s na %s" ++ ++#: elf/ldconfig.c:518 elf/ldconfig.c:672 ++#, c-format ++msgid "Can't lstat %s" ++msgstr "Zlyhal lstat %s" ++ ++#: elf/cache.c:108 elf/ldconfig.c:955 ++#, c-format ++msgid "Can't open cache file %s\n" ++msgstr "Nie je mo�n� otvori� cache s�bor %s\n" ++ ++#: elf/ldconfig.c:976 ++#, c-format ++msgid "Can't open cache file directory %s\n" ++msgstr "Nie je mo�n� otvori� adres�r cache s�boru %s\n" ++ ++#: elf/ldconfig.c:865 ++#, c-format ++msgid "Can't open configuration file %s" ++msgstr "Nie je mo�n� otvori� konfigura�n� s�bor %s" ++ ++#: elf/ldconfig.c:621 ++#, c-format ++msgid "Can't open directory %s" ++msgstr "Nie je mo�n� otvori� adres�r %s" ++ ++#: elf/cache.c:353 ++#, c-format ++msgid "Can't remove old temporary cache file %s" ++msgstr "Nie je mo�n� zmaza� do�asn� cache s�bor %s" ++ ++#: elf/ldconfig.c:405 ++#, c-format ++msgid "Can't stat %s\n" ++msgstr "Zlyhal stat %s\n" ++ ++#: elf/ldconfig.c:434 ++#, c-format ++msgid "Can't unlink %s" ++msgstr "Nie je mo�n� odstr�ni� %s" ++ + #. TRANS No memory available. The system cannot allocate more virtual memory + #. TRANS because its capacity is full. +-#: stdio-common/../sysdeps/gnu/errlist.c:103 ++#: stdio-common/../sysdeps/gnu/errlist.c:104 + msgid "Cannot allocate memory" + msgstr "Nie je mo�n� prideli� pam�" + + #. TRANS The requested socket address is not available; for example, you tried + #. TRANS to give a socket a name that doesn't match the local host name. + #. TRANS @xref{Socket Addresses}. +-#: stdio-common/../sysdeps/gnu/errlist.c:373 ++#: stdio-common/../sysdeps/gnu/errlist.c:374 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:156 + msgid "Cannot assign requested address" + msgstr "Priradenie po�adovanej adresy nie je mo�n�" + +-#: sunrpc/pmap_rmt.c:264 ++#: sunrpc/pmap_rmt.c:265 + msgid "Cannot create socket for broadcast rpc" + msgstr "Nie je mo�n� vytvori� z�suvku pre broadcast rpc" + +-#: stdio-common/../sysdeps/gnu/errlist.c:786 ++#: stdio-common/../sysdeps/gnu/errlist.c:805 + msgid "Cannot exec a shared library directly" + msgstr "Nie je mo�n� priamo spusti� zdie�an� kni�nicu" + +-#: sunrpc/rpc_main.c:1406 ++#: elf/readlib.c:98 ++#, c-format ++msgid "Cannot fstat file %s.\n" ++msgstr "Nie je mo�n� vykona� fstat() s�boru %s.\n" ++ ++#: sunrpc/rpc_main.c:1415 + 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/pmap_rmt.c:360 ++#: elf/readlib.c:117 ++#, c-format ++msgid "Cannot mmap file %s.\n" ++msgstr "Nie je mo�n� mmap-ova� s�bor %s.\n" ++ ++#: sunrpc/pmap_rmt.c:361 + msgid "Cannot receive reply to broadcast" + msgstr "Nie je mo�n� prija� odpove� na broadcast" + +-#: sunrpc/pmap_clnt.c:74 ++#: sunrpc/pmap_clnt.c:136 + msgid "Cannot register service" + msgstr "Nie je mo�n� zaregistrova� slu�bu" + ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:173 ++msgid "Cannot send after socket shutdown" ++msgstr "Nie je mo�n� vysiela� po ukon�en� �innosti komunika�n�ho bodu" ++ + #. TRANS The socket has already been shut down. +-#: stdio-common/../sysdeps/gnu/errlist.c:434 ++#: stdio-common/../sysdeps/gnu/errlist.c:435 + msgid "Cannot send after transport endpoint shutdown" + msgstr "Nie je mo�n� vysiela� po ukon�en� �innosti komunika�n�ho bodu" + +-#: sunrpc/pmap_rmt.c:322 ++#: sunrpc/pmap_rmt.c:323 + msgid "Cannot send broadcast packet" + msgstr "Nie je mo�n� vysla� broadcast bal�k" + +-#: sunrpc/pmap_rmt.c:271 ++#: sunrpc/pmap_rmt.c:272 + msgid "Cannot set socket option SO_BROADCAST" + msgstr "Nie je mo�n� nastavi� pre socket vo�bu SO_BROADCAST" + +-#: sunrpc/rpc_main.c:1193 ++#: sunrpc/rpc_main.c:1195 + 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:1363 ++#: sunrpc/rpc_main.c:1372 + 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:1375 ++#: sunrpc/rpc_main.c:1384 + 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:1382 ++#: sunrpc/rpc_main.c:1391 + 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" + +-#: stdio-common/../sysdeps/gnu/errlist.c:670 ++#: elf/ldconfig.c:131 ++msgid "Change to and use ROOT as root directory" ++msgstr "Zmeni� adres�r na ROOT a pou�i� ho ako kore�ov� adres�r" ++ ++#: elf/cache.c:390 ++#, c-format ++msgid "Changing access rights of %s to 0644 failed" ++msgstr "Zmena pr�stupov�ch pr�v %s na 0644 zlyhala" ++ ++#: stdio-common/../sysdeps/gnu/errlist.c:689 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:67 + msgid "Channel number out of range" + msgstr "��slo kan�lu mimo povolen�ho rozsahu" + +-#: nis/nis_print.c:264 ++#: nis/nis_print.c:265 + #, c-format + msgid "Character Separator : %c\n" + msgstr "Odde�ova� znakov : %c\n" + +-#: stdio-common/../sysdeps/unix/siglist.c:45 +-#: sysdeps/unix/sysv/linux/siglist.h:39 ++#: stdio-common/../sysdeps/unix/siglist.c:46 sysdeps/generic/siglist.h:46 + msgid "Child exited" + msgstr "Detsk� proces skon�il" + +-#: sunrpc/clnt_perr.c:283 ++#: sunrpc/clnt_perr.c:348 + msgid "Client credential too weak" + msgstr "Opr�vnenia klienta s� neposta�uj�ce" + +-#: nis/nis_print.c:266 ++#: nis/nis_print.c:267 + msgid "Columns :\n" + msgstr "St�pce :\n" + +-#: stdio-common/../sysdeps/gnu/errlist.c:750 ++#: stdio-common/../sysdeps/gnu/errlist.c:769 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:100 + msgid "Communication error on send" + msgstr "Chyba komunik�cie pri vysielan�" + +@@ -803,54 +1474,48 @@ + msgstr "Kompil�cia �pecifik�cie n�rodn�ho prostredia" + + #. TRANS Go home and have a glass of warm, dairy-fresh milk. +-#: stdio-common/../sysdeps/gnu/errlist.c:613 ++#: stdio-common/../sysdeps/gnu/errlist.c:632 + msgid "Computer bought the farm" + msgstr "Po��ta� k�pil farmu" + +-#: locale/programs/ld-ctype.c:1253 +-msgid "Computing table size for character classes might take a while..." +-msgstr "V�po�et ve�kosti tabu�ky pre triedy znakov (m��e chv��u trva�)..." +- +-#: locale/programs/ld-collate.c:336 +-msgid "Computing table size for collation information might take a while..." +-msgstr "V�po�et ve�kosti tabu�ky pre inform�cie o trieden� (m��e chv��u trva�)..." ++#: elf/ldconfig.c:141 ++msgid "Configure Dynamic Linker Run Time Bindings." ++msgstr "Konfigur�cia runtime v�zieb dynamick�ho linkera." + + #. TRANS A remote host refused to allow the network connection (typically because + #. TRANS it is not running the requested service). +-#: stdio-common/../sysdeps/gnu/errlist.c:451 ++#: stdio-common/../sysdeps/gnu/errlist.c:452 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:176 + msgid "Connection refused" + msgstr "Spojenie odmietnut�" + + #. TRANS A network connection was closed for reasons outside the control of the + #. TRANS local host, such as by the remote machine rebooting or an unrecoverable + #. TRANS protocol violation. +-#: stdio-common/../sysdeps/gnu/errlist.c:401 ++#: stdio-common/../sysdeps/gnu/errlist.c:402 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:161 + msgid "Connection reset by peer" + msgstr "Spojenie zru�en� druhou stranou" + + #. TRANS A socket operation with a specified timeout received no response during + #. TRANS the timeout period. +-#: stdio-common/../sysdeps/gnu/errlist.c:445 ++#: stdio-common/../sysdeps/gnu/errlist.c:446 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:175 + msgid "Connection timed out" + msgstr "�asov� limit pre spojenie vypr�al" + +-#: stdio-common/../sysdeps/unix/siglist.c:44 +-#: sysdeps/unix/sysv/linux/siglist.h:38 ++#: stdio-common/../sysdeps/unix/siglist.c:45 sysdeps/generic/siglist.h:45 + msgid "Continued" + msgstr "Pokra�ovanie" + +-#: iconv/iconv_prog.c:66 ++#: iconv/iconv_prog.c:69 + msgid "Convert encoding of given files from one encoding to another." + msgstr "Konverzia k�dovania zadan�ch s�borov na in�." + +-#: db2/makedb.c:58 +-msgid "Convert key to lower case" +-msgstr "Zmeni� k��� na mal� p�smen�" +- +-#: catgets/gencat.c:236 db2/makedb.c:242 elf/sprof.c:359 +-#: iconv/iconv_prog.c:294 locale/programs/locale.c:267 +-#: locale/programs/localedef.c:403 nscd/nscd.c:223 nss/getent.c:65 +-#: posix/getconf.c:624 ++#: catgets/gencat.c:246 elf/ldconfig.c:264 elf/sprof.c:355 ++#: iconv/iconv_prog.c:351 locale/programs/locale.c:269 ++#: locale/programs/localedef.c:311 nscd/nscd.c:287 nscd/nscd_nischeck.c:90 ++#: nss/getent.c:63 posix/getconf.c:751 + #, c-format + msgid "" + "Copyright (C) %s Free Software Foundation, Inc.\n" +@@ -861,167 +1526,353 @@ + "Toto je vo�ne ��rite�n� software; pre podmienky kop�rovania pozri\n" + "zdrojov� k�d.Na software nie je poskytovan� �IADNA z�ruka.\n" + +-#: nscd/nscd_conf.c:167 ++#: nscd/nscd_conf.c:166 + #, c-format + msgid "Could not create log file \"%s\"" + msgstr "Nie je mo�n� vytvori� �urn�lov� s�bor \"%s\"" + +-#: catgets/gencat.c:107 ++#: catgets/gencat.c:112 + msgid "Create C header file NAME containing symbol definitions" + msgstr "Vytvori� C hlavi�kov� s�bor N�ZOV obsahuj�ci defin�cie symbolov" + +-#: locale/programs/localedef.c:103 ++#: locale/programs/localedef.c:102 ++msgid "Create old-style tables" ++msgstr "Vytvori� tabu�ky na star� sp�sob" ++ ++#: locale/programs/localedef.c:101 + msgid "Create output even if warning messages were issued" + msgstr "Vytvori� v�stupn� s�bor aj pri v�skyte varovan�" + +-#: db2/makedb.c:68 +-msgid "Create simple DB database from textual input." +-msgstr "Vytvorenie jednoduchej DB datab�zy z textov�ho vstupu." +- +-#: nis/nis_print.c:322 ++#: nis/nis_print.c:326 + #, c-format + msgid "Creation Time : %s" + msgstr "�as vytvorenia : %s" + +-#: nis/nss_nisplus/nisplus-publickey.c:89 +-#: nis/nss_nisplus/nisplus-publickey.c:159 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:48 ++msgid "Cross-device link" ++msgstr "Odkaz medzi zariadeniami" ++ ++#: malloc/memusagestat.c:67 ++msgid "DATAFILE [OUTFILE]" ++msgstr "D�TOV�_S�BOR [V�STUPN�_S�BOR]" ++ ++#: nis/nss_nisplus/nisplus-publickey.c:96 ++#: nis/nss_nisplus/nisplus-publickey.c:172 + #, c-format + msgid "DES entry for netname %s not unique\n" + msgstr "DES z�znam pre sie�ov� n�zov %s nie je jednozna�n�\n" + +-#: nis/nis_print.c:111 ++#: nis/nis_print.c:112 + msgid "DIRECTORY\n" + msgstr "ADRES�R\n" + +-#: nis/nis_print.c:41 ++#: nis/nis_print.c:42 + msgid "DNANS" + msgstr "DNANS" + +-#: nis/nis_print.c:37 ++#: nis/nis_print.c:38 + msgid "DNS" + msgstr "DNS" + +-#: nis/nis_error.c:51 ++#: elf/dl-open.c:189 ++msgid "DST not allowed in SUID/SGID programs" ++msgstr "DST nie je pre SUID/SGID programy povolen�" ++ ++#: elf/dl-error.c:71 ++msgid "DYNAMIC LINKER BUG!!!" ++msgstr "CHYBA V DYNAMICKOM LINKERI!!!" ++ ++#: nis/nis_error.c:52 + msgid "Database for table does not exist" + msgstr "Datab�za pre tabu�ku neexistuje" + +-#: nis/ypclnt.c:795 ++#: nis/ypclnt.c:818 + msgid "Database is busy" + msgstr "Datab�za je pou��van�" + +-#: nis/nis_print.c:225 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:75 ++msgid "Deadlock situation detected/avoided" ++msgstr "Bol detekovan� a znemo�nen� deadlock" ++ ++#: nis/nis_print.c:226 + msgid "Default Access rights :\n" + msgstr "Implicitn� pr�st. pr�va :\n" + + #. TRANS No default destination address was set for the socket. You get this + #. TRANS error when you try to transmit data over a connectionless socket, + #. TRANS without first specifying a destination for the data with @code{connect}. +-#: stdio-common/../sysdeps/gnu/errlist.c:429 ++#: stdio-common/../sysdeps/gnu/errlist.c:430 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:126 + msgid "Destination address required" + msgstr "Je potrebn� zada� cie�ov� hodnotu" + +-#: stdio-common/../sysdeps/gnu/errlist.c:650 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:46 ++msgid "Device busy" ++msgstr "Zariadenie je pou��van�" ++ ++#: stdio-common/../sysdeps/gnu/errlist.c:669 + msgid "Device not a stream" + msgstr "Zariadenie nie je pr�d" + +-#. TRANS No such device or address. The system tried to use the device +-#. TRANS represented by a file you specified, and it couldn't find the device. +-#. TRANS This can mean that the device file was installed incorrectly, or that +-#. TRANS the physical device is missing or not correctly attached to the +-#. TRANS computer. +-#: stdio-common/../sysdeps/gnu/errlist.c:61 +-msgid "Device not configured" +-msgstr "Zariadenie nie je nakonfigurovan�" +- + #. TRANS Resource busy; a system resource that can't be shared is already in use. + #. TRANS For example, if you try to delete a file that is the root of a currently + #. TRANS mounted filesystem, you get this error. +-#: stdio-common/../sysdeps/gnu/errlist.c:128 ++#: stdio-common/../sysdeps/gnu/errlist.c:129 + msgid "Device or resource busy" + msgstr "Zariadenie alebo in� zdroj je pou��van�" + +-#: nis/nis_print.c:179 ++#: nis/nis_print.c:180 + #, c-format + msgid "Diffie-Hellmann (%d bits)\n" + msgstr "Diffie-Hellmann (%d bitov)\n" + +-#: nis/nis_print.c:315 ++#: nis/nis_print.c:318 + #, c-format + msgid "Directory : %s\n" + msgstr "Adres�r : %s\n" + + #. TRANS Directory not empty, where an empty directory was expected. Typically, + #. TRANS this error occurs when you are trying to delete a directory. +-#: stdio-common/../sysdeps/gnu/errlist.c:480 ++#: stdio-common/../sysdeps/gnu/errlist.c:481 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:123 + msgid "Directory not empty" + msgstr "Adres�r nie je pr�zdny" + +-#. TRANS The user's disk quota was exceeded. +-#: stdio-common/../sysdeps/gnu/errlist.c:498 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:79 + msgid "Disc quota exceeded" + msgstr "Diskov� kv�ta prekro�en�" + +-#: nscd/nscd.c:80 ++#. TRANS The user's disk quota was exceeded. ++#: stdio-common/../sysdeps/gnu/errlist.c:499 ++msgid "Disk quota exceeded" ++msgstr "Diskov� kv�ta prekro�en�" ++ ++#: nscd/nscd.c:86 + 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" + +-#: db2/makedb.c:61 +-msgid "Do not print messages while building database" +-msgstr "Po�as tvorby datab�zy nevypisova� spr�vy" +- +-#: catgets/gencat.c:109 ++#: catgets/gencat.c:114 + msgid "Do not use existing catalog, force new output file" + msgstr "Nepou��va� existuj�ci katal�g, vn�ti� nov� v�stupn� s�bor" + +-#: nis/ypclnt.c:841 ++#: nis/ypclnt.c:864 + msgid "Domain not bound" + msgstr "Dom�na nie je pripojen�" + +-#: stdio-common/../sysdeps/unix/siglist.c:32 +-#: sysdeps/unix/sysv/linux/siglist.h:53 ++#: elf/ldconfig.c:129 ++msgid "Don't build cache" ++msgstr "Nevytvori� cache" ++ ++#: elf/ldconfig.c:130 ++msgid "Don't generate links" ++msgstr "Negenerova� odkazy" ++ ++#: debug/pcprofiledump.c:56 ++msgid "Dump information generated by PC profiling." ++msgstr "Vyp�sa� inform�ciu z�skan� profilovan�m PC." ++ ++#: elf/dl-load.c:1290 ++msgid "ELF file ABI version invalid" ++msgstr "Neplatn� verzia ABI ELF s�boru" ++ ++#: elf/dl-load.c:1287 ++msgid "ELF file OS ABI invalid" ++msgstr "Neplatn� OS ABI ELF s�boru" ++ ++#: elf/dl-load.c:1296 ++msgid "ELF file version does not match current one" ++msgstr "Verzia s�boru ELF sa nezhoduje s aktu�lnou" ++ ++#: elf/dl-load.c:1283 ++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:1307 ++msgid "ELF file's phentsize not the expected size" ++msgstr "phentsize ELF s�boru nie je o�ak�van�" ++ ++#: elf/dl-load.c:876 ++msgid "ELF load command address/offset not properly aligned" ++msgstr "ELF zav�dzacia adresa/posunutie nie je spr�vne zarovnan�" ++ ++#: elf/dl-load.c:873 ++msgid "ELF load command alignment not page-aligned" ++msgstr "ELF zarovnanie pr�kazu nie je zarovnan� na str�nku" ++ ++#: stdio-common/../sysdeps/unix/siglist.c:33 sysdeps/generic/siglist.h:60 + msgid "EMT trap" + msgstr "EMT preru�enie" + +-#: nis/nis_print.c:120 ++#: nis/nis_print.c:121 + msgid "ENTRY\n" + msgstr "Z�ZNAM\n" + +-#: nis/nis_print.c:299 ++#: nis/nis_print.c:300 + msgid "Encrypted data\n" + msgstr "�ifrovan� �daje\n" + +-#: nis/nis_error.c:52 +-msgid "Entry/Table type mismatch" ++#: nis/nis_error.c:53 ++msgid "Entry/table type mismatch" + msgstr "Nes�lad z�znamu s tabu�kou" + +-#: nis/nis_error.c:56 ++#: nss/getent.c:127 nss/getent.c:292 ++#, c-format ++msgid "Enumeration not supported on %s\n" ++msgstr "Enumer�cia %s nie je podporovan�\n" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:30 ++msgid "Error 0" ++msgstr "Chyba 0" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:130 ++msgid "Error 100" ++msgstr "Chyba 100" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:131 ++msgid "Error 101" ++msgstr "Chyba 101" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:132 ++msgid "Error 102" ++msgstr "Chyba 102" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:133 ++msgid "Error 103" ++msgstr "Chyba 103" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:134 ++msgid "Error 104" ++msgstr "Chyba 104" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:135 ++msgid "Error 105" ++msgstr "Chyba 105" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:136 ++msgid "Error 106" ++msgstr "Chyba 106" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:137 ++msgid "Error 107" ++msgstr "Chyba 107" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:138 ++msgid "Error 108" ++msgstr "Chyba 108" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:139 ++msgid "Error 109" ++msgstr "Chyba 109" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:140 ++msgid "Error 110" ++msgstr "Chyba 110" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:141 ++msgid "Error 111" ++msgstr "Chyba 111" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:142 ++msgid "Error 112" ++msgstr "Chyba 112" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:143 ++msgid "Error 113" ++msgstr "Chyba 113" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:144 ++msgid "Error 114" ++msgstr "Chyba 114" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:145 ++msgid "Error 115" ++msgstr "Chyba 115" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:146 ++msgid "Error 116" ++msgstr "Chyba 116" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:147 ++msgid "Error 117" ++msgstr "Chyba 117" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:148 ++msgid "Error 118" ++msgstr "Chyba 118" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:149 ++msgid "Error 119" ++msgstr "Chyba 119" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:166 ++msgid "Error 136" ++msgstr "Chybe 136" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:172 ++msgid "Error 142" ++msgstr "Chyba 142" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:88 ++msgid "Error 58" ++msgstr "Chyba 58" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:89 ++msgid "Error 59" ++msgstr "Chyba 59" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:102 ++msgid "Error 72" ++msgstr "Chyba 72" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:103 ++msgid "Error 73" ++msgstr "Chyba 73" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:105 ++msgid "Error 75" ++msgstr "Chyba 75" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:106 ++msgid "Error 76" ++msgstr "Chyba 76" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:121 ++msgid "Error 91" ++msgstr "Chyba 91" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:122 ++msgid "Error 92" ++msgstr "Chyba 92" ++ ++#: nis/nis_error.c:57 + msgid "Error in RPC subsystem" + msgstr "Chyba v RPC subsyst�me" + +-#: nis/nis_error.c:66 ++#: nis/nis_error.c:67 + msgid "Error in accessing NIS+ cold start file. Is NIS+ installed?" + msgstr "Chyba pri pr�stupe NIS+ s�boru studen�ho �tartu. Je NIS+ nain�talovan�?" + +-#: string/../sysdeps/mach/_strerror.c:56 +-#: sysdeps/mach/hurd/mips/dl-machine.c:67 ++#: string/../sysdeps/mach/_strerror.c:58 ++#: sysdeps/mach/hurd/mips/dl-machine.c:68 + msgid "Error in unknown error system: " + msgstr "Chyba v nezn�mom chybovom syst�me: " + +-#: nis/nis_error.c:59 ++#: nis/nis_error.c:60 + msgid "Error while talking to callback proc" + msgstr "Chyba po�as komunik�cie s proced�rou sp�tn�ho volania" + +-#: inet/ruserpass.c:161 ++#: inet/ruserpass.c:181 + msgid "Error: .netrc file is readable by others." + msgstr "Chyba: s�bor .netrc je �itate�n� pre ostatn�ch." + +-#: stdio-common/../sysdeps/gnu/errlist.c:710 ++#: stdio-common/../sysdeps/gnu/errlist.c:729 + msgid "Exchange full" + msgstr "Stredisko pln�" + + #. TRANS Invalid executable file format. This condition is detected by the + #. TRANS @code{exec} functions; see @ref{Executing a File}. +-#: stdio-common/../sysdeps/gnu/errlist.c:75 ++#: stdio-common/../sysdeps/gnu/errlist.c:76 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:38 + msgid "Exec format error" + msgstr "Chybn� form�t spustite�n�ho s�boru" + +@@ -1029,75 +1880,113 @@ + msgid "FATAL: system does not define `_POSIX2_LOCALEDEF'" + msgstr "FAT�LNA CHYBA: syst�m nedefinuje `_POSIX2_LOCALEDEF'" + +-#: locale/programs/localedef.c:99 ++#: locale/programs/localedef.c:97 + msgid "FILE contains mapping from symbolic names to UCS4 values" + msgstr "S�BOR obsahuje mapovanie symbolick�ch n�zvov na UCS4 hodnoty" + +-#: sunrpc/clnt_perr.c:287 ++#: sunrpc/clnt_perr.c:356 + msgid "Failed (unspecified error)" + msgstr "Zlyhalo (ne�pecifikovan� chyba)" + +-#: stdio-common/../sysdeps/gnu/errlist.c:762 ++#: nscd/nscd.c:400 ++#, c-format ++msgid "Failed to look up user '%s' to run server as" ++msgstr "Nepodarilo sa vyh�ada� pou��vate�a '%s', pod ktor�m m� server be�a�" ++ ++#: elf/readlib.c:108 ++#, c-format ++msgid "File %s is too small, not checked." ++msgstr "S�bor %s je pr�li� kr�tky, neskontrolovan�." ++ ++#: stdio-common/../sysdeps/gnu/errlist.c:781 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:111 + msgid "File descriptor in bad state" + msgstr "Deskriptor s�boru v chybnom stave" + + #. TRANS File exists; an existing file was specified in a context where it only + #. TRANS makes sense to specify a new file. +-#: stdio-common/../sysdeps/gnu/errlist.c:134 ++#: stdio-common/../sysdeps/gnu/errlist.c:135 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:47 + msgid "File exists" + msgstr "S�bor existuje" + +-#: stdio-common/../sysdeps/gnu/errlist.c:726 ++#: elf/cache.c:124 elf/cache.c:134 ++msgid "File is not a cache file.\n" ++msgstr "S�bor nie je cache s�borom.\n" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:86 ++msgid "File locking deadlock" ++msgstr "Vz�jomn� zablokovanie pri zamykan� s�boru" ++ ++#: stdio-common/../sysdeps/gnu/errlist.c:745 + msgid "File locking deadlock error" + msgstr "Vz�jomn� zablokovanie pri zamykan� s�boru" + + #. TRANS Filename too long (longer than @code{PATH_MAX}; @pxref{Limits for + #. TRANS Files}) or host name too long (in @code{gethostname} or + #. TRANS @code{sethostname}; @pxref{Host Identification}). +-#: stdio-common/../sysdeps/gnu/errlist.c:464 ++#: stdio-common/../sysdeps/gnu/errlist.c:465 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:108 + msgid "File name too long" + msgstr "Meno s�boru pr�li� dlh�" + +-#: stdio-common/../sysdeps/unix/siglist.c:50 +-#: sysdeps/unix/sysv/linux/siglist.h:44 ++#: stdio-common/../sysdeps/unix/siglist.c:51 sysdeps/generic/siglist.h:51 + msgid "File size limit exceeded" + msgstr "Prekro�en� limit d�ky s�boru" + ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:53 ++msgid "File table overflow" ++msgstr "Prete�enie tabu�ky s�borov" ++ + #. TRANS File too big; the size of a file would be larger than allowed by the system. +-#: stdio-common/../sysdeps/gnu/errlist.c:202 ++#: stdio-common/../sysdeps/gnu/errlist.c:203 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:57 + msgid "File too large" + msgstr "S�bor je pr�li� ve�k�" + +-#: nis/nis_error.c:37 +-msgid "First/Next chain broken" +-msgstr "Chyba zre�azenia prv�/�al��" ++#: intl/tst-gettext2.c:36 ++msgid "First string for testing." ++msgstr "Prv� testovac� re�azec." ++ ++#: nis/nis_error.c:38 ++msgid "First/next chain broken" ++msgstr "Preru�en� zre�azenie prv�/�al��" + +-#: stdio-common/../sysdeps/unix/siglist.c:33 +-#: sysdeps/unix/sysv/linux/siglist.h:28 ++#: stdio-common/../sysdeps/unix/siglist.c:34 sysdeps/generic/siglist.h:35 + msgid "Floating point exception" + msgstr "V�nimka pohyblivej r�dovej �iarky" + +-#: nis/nis_error.c:67 ++#: elf/ldconfig.c:136 ++msgid "Format to use: new, old or compat (default)" ++msgstr "Pou�i� form�t: nov� (new), star� (old) alebo kompatibiln� (compat - prednastaven�)" ++ ++#: nis/nis_error.c:68 + msgid "Full resync required for directory" + msgstr "Adres�r vy�aduje �pln� resynchroniz�ciu" + +-#. TRANS Function not implemented. Some functions have commands or options defined +-#. TRANS that might not be supported in all implementations, and this is the kind +-#. TRANS of error you get if you request them and they are not supported. +-#: stdio-common/../sysdeps/gnu/errlist.c:573 ++#. TRANS Function not implemented. This indicates that the function called is ++#. TRANS not implemented at all, either in the C library itself or in the ++#. TRANS operating system. When you get this error, you can be sure that this ++#. TRANS particular function will always fail with @code{ENOSYS} unless you ++#. TRANS install a new version of the C library or the operating system. ++#: stdio-common/../sysdeps/gnu/errlist.c:576 + msgid "Function not implemented" + msgstr "Funkcia nie je implementovan�" + +-#: nis/nis_print.c:114 ++#: nis/nis_print.c:115 + msgid "GROUP\n" + msgstr "SKUPINA\n" + +-#: argp/argp-help.c:231 ++#: argp/argp-help.c:230 + #, c-format + msgid "Garbage in ARGP_HELP_FMT: %s" + msgstr "Nezmysly v ARGP_HELP_FMT: %s" + +-#: catgets/gencat.c:115 ++#: malloc/memusagestat.c:64 ++msgid "Generate graphic from memory profiling data" ++msgstr "Generova� graf z �dajov profilu pam�ti" ++ ++#: catgets/gencat.c:120 + msgid "" + "Generate message catalog.\\vIf INPUT-FILE is -, input is read from standard input. If OUTPUT-FILE\n" + "is -, output is written to standard output.\n" +@@ -1105,123 +1994,134 @@ + "Tvorba katal�gu spr�v.\\vAk je VSTUPN�_S�BOR -, vstup je na��tan� zo �tandardn�ho vstupu. Ak je\n" + "V�STUPN�_S�BOR -, v�stup je zap�san� na �tandardn� v�stup.\n" + +-#: nis/nis_error.c:36 ++#: malloc/memusagestat.c:55 ++msgid "Generate output linear to time (default is linear to number of function calls)" ++msgstr "Generova� v�stup line�rny s �asom (prednastaven� je line�rne k po�tu volan� funkci�)" ++ ++#: elf/ldconfig.c:128 ++msgid "Generate verbose messages" ++msgstr "Vyp�sova� podrobnej�ie spr�vy" ++ ++#: nis/nis_error.c:37 + msgid "Generic system error" + msgstr "V�eobecn� chyba syst�mu" + +-#: locale/programs/locale.c:75 ++#: locale/programs/locale.c:77 + msgid "Get locale-specific information." + msgstr "Z�ska� inform�ciu �pecifick� pre n�rodn� prostredie." + +-#: argp/argp-parse.c:88 ++#: argp/argp-parse.c:94 + msgid "Give a short usage message" + msgstr "Vyp�sa� kr�tky n�vod na pou�itie" + +-#: argp/argp-parse.c:87 ++#: argp/argp-parse.c:93 + msgid "Give this help list" + msgstr "Vyp�sa� t�to pomoc" + + #. TRANS This error code has no purpose. +-#: stdio-common/../sysdeps/gnu/errlist.c:618 ++#: stdio-common/../sysdeps/gnu/errlist.c:637 + msgid "Gratuitous error" + msgstr "V�a�n� chyba" + +-#: nis/nis_print.c:317 ++#: nis/nis_print.c:320 + #, c-format + msgid "Group : %s\n" + msgstr "Skupina : %s\n" + +-#: nis/nis_print.c:248 ++#: nis/nis_print.c:249 + msgid "Group Flags :" + msgstr "Pr�znaky skupiny :" + +-#: nis/nis_print_group_entry.c:113 ++#: nis/nis_print_group_entry.c:115 + #, c-format + msgid "Group entry for \"%s.%s\" group:\n" + msgstr "Z�znam skupiny pre skupinu \"%s.%s\":\n" + +-#: argp/argp-parse.c:91 ++#: argp/argp-parse.c:97 + msgid "Hang for SECS seconds (default 3600)" + msgstr "Po�ka� SECS sek�nd (implicitne 3600)" + +-#: stdio-common/../sysdeps/unix/siglist.c:26 +-#: sysdeps/unix/sysv/linux/siglist.h:22 ++#: stdio-common/../sysdeps/unix/siglist.c:27 sysdeps/generic/siglist.h:29 + msgid "Hangup" + msgstr "Zavesenie" + +-#: nscd/grpcache.c:238 ++#: nscd/grpcache.c:253 + #, c-format + msgid "Haven't found \"%d\" in group cache!" + msgstr "Nen�jden� \"%d\" v cache skup�n!" + +-#: nscd/pwdcache.c:235 ++#: nscd/pwdcache.c:249 + #, c-format + msgid "Haven't found \"%d\" in password cache!" + msgstr "Nen�jden� \"%d\" v cache hesiel!" + +-#: nscd/grpcache.c:210 ++#: nscd/grpcache.c:214 + #, c-format + msgid "Haven't found \"%s\" in group cache!" + msgstr "Nen�jden� \"%s\" v cache skup�n!" + +-#: nscd/hstcache.c:297 nscd/hstcache.c:328 nscd/hstcache.c:359 +-#: nscd/hstcache.c:390 ++#: nscd/hstcache.c:299 nscd/hstcache.c:341 nscd/hstcache.c:386 ++#: nscd/hstcache.c:430 + #, c-format + msgid "Haven't found \"%s\" in hosts cache!" + msgstr "Nen�jden� \"%s\" v cache po��ta�ov!" + +-#: nscd/pwdcache.c:207 ++#: nscd/pwdcache.c:210 + #, c-format + msgid "Haven't found \"%s\" in password cache!" + msgstr "Nen�jden� \"%s\" v cache hesiel!" + + #. TRANS The remote host for a requested network connection is down. +-#: stdio-common/../sysdeps/gnu/errlist.c:469 ++#: stdio-common/../sysdeps/gnu/errlist.c:470 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:177 + msgid "Host is down" + msgstr "Po��ta� je vypnut�" + +-#: resolv/herror.c:75 ++#: resolv/herror.c:69 + msgid "Host name lookup failure" + msgstr "Nepodarilo sa n�js� meno po��ta�a" + +-#: stdio-common/../sysdeps/unix/siglist.c:48 +-#: sysdeps/unix/sysv/linux/siglist.h:42 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:35 ++msgid "I/O error" ++msgstr "V/V chyba" ++ ++#: stdio-common/../sysdeps/unix/siglist.c:49 sysdeps/generic/siglist.h:49 + msgid "I/O possible" + msgstr "V/V mo�n�" + +-#: db2/makedb.c:71 +-msgid "" +-"INPUT-FILE OUTPUT-FILE\n" +-"-o OUTPUT-FILE INPUT-FILE\n" +-"-u INPUT-FILE" +-msgstr "" +-"VSTUPN�_S�BOR V�STUPN�_S�BOR\n" +-"-o V�STUPN�_S�BOR VSTUPN�_S�BOR\n" +-"-u VSTUPN�_S�BOR" +- +-#: stdio-common/../sysdeps/unix/siglist.c:31 ++#: stdio-common/../sysdeps/unix/siglist.c:32 + msgid "IOT trap" + msgstr "IOT preru�enie" + +-#: nis/nis_print.c:35 ++#: nis/nis_print.c:36 + msgid "IVY" + msgstr "IVY" + +-#: stdio-common/../sysdeps/gnu/errlist.c:626 ++#: stdio-common/../sysdeps/gnu/errlist.c:645 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:66 + msgid "Identifier removed" + msgstr "Identifik�tor odstr�nen�" + +-#: stdio-common/../sysdeps/unix/siglist.c:29 +-#: sysdeps/unix/sysv/linux/siglist.h:25 ++#: elf/ldconfig.c:525 ++#, 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." ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:118 ++msgid "Illegal byte sequence" ++msgstr "Nepr�pustn� sekvencia bajtov" ++ ++#: stdio-common/../sysdeps/unix/siglist.c:30 sysdeps/generic/siglist.h:32 + msgid "Illegal instruction" + msgstr "Nepr�pustn� in�trukcia" + +-#: nis/nis_error.c:61 ++#: nis/nis_error.c:62 + msgid "Illegal object type for operation" + msgstr "Nepr�pustn� typ objektu pre oper�ciu" + + #. TRANS Invalid seek operation (such as on a pipe). +-#: stdio-common/../sysdeps/gnu/errlist.c:213 ++#: stdio-common/../sysdeps/gnu/errlist.c:214 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:59 + msgid "Illegal seek" + msgstr "Nepr�pustn� nastavenie poz�cie" + +@@ -1230,13 +2130,14 @@ + #. TRANS + #. TRANS On some systems @code{chmod} returns this error if you try to set the + #. TRANS sticky bit on a non-directory file; @pxref{Setting Permissions}. +-#: stdio-common/../sysdeps/gnu/errlist.c:556 ++#: stdio-common/../sysdeps/gnu/errlist.c:557 + msgid "Inappropriate file type or format" + msgstr "Nevhodn� typ alebo form�t s�boru" + + #. TRANS Inappropriate I/O control operation, such as trying to set terminal + #. TRANS modes on an ordinary file. +-#: stdio-common/../sysdeps/gnu/errlist.c:188 ++#: stdio-common/../sysdeps/gnu/errlist.c:189 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:55 + msgid "Inappropriate ioctl for device" + msgstr "Nevhodn� ioctl pre toto zariadenie" + +@@ -1246,41 +2147,45 @@ + #. TRANS error because functions such as @code{read} and @code{write} translate + #. TRANS it into a @code{SIGTTIN} or @code{SIGTTOU} signal. @xref{Job Control}, + #. TRANS for information on process groups and these signals. +-#: stdio-common/../sysdeps/gnu/errlist.c:589 ++#: stdio-common/../sysdeps/gnu/errlist.c:608 + msgid "Inappropriate operation for background process" + msgstr "Nevhodn� oper�cia pre proces v pozad�" + +-#: sysdeps/unix/sysv/linux/siglist.h:62 ++#: sysdeps/generic/siglist.h:69 + msgid "Information request" + msgstr "�iados� o inform�ciu" + +-#: iconv/iconv_prog.c:57 ++#: iconv/iconv_prog.c:58 + msgid "Information:" + msgstr "Inform�cia:" + +-#: locale/programs/localedef.c:94 ++#: locale/programs/localedef.c:92 + msgid "Input Files:" + msgstr "Vstupn� s�bory:" + +-#: iconv/iconv_prog.c:54 ++#: elf/ldconfig.c:698 elf/readlib.c:92 ++#, c-format ++msgid "Input file %s not found.\n" ++msgstr "Vstupn� s�bor %s nebol n�jden�.\n" ++ ++#: iconv/iconv_prog.c:55 + msgid "Input/Output format specification:" + msgstr "�pecifik�cia vstupno/v�stupn�ho form�tu:" + + #. TRANS Input/output error; usually used for physical read or write errors. +-#: stdio-common/../sysdeps/gnu/errlist.c:52 ++#: stdio-common/../sysdeps/gnu/errlist.c:53 + msgid "Input/output error" + msgstr "Chyba vstupu/v�stupu" + +-#: nis/ypclnt.c:775 ++#: nis/ypclnt.c:798 + msgid "Internal NIS error" + msgstr "Intern� chyba NIS" + +-#: nis/ypclnt.c:839 ++#: nis/ypclnt.c:862 + msgid "Internal ypbind error" + msgstr "Intern� chyba ypbind" + +-#: stdio-common/../sysdeps/unix/siglist.c:27 +-#: sysdeps/unix/sysv/linux/siglist.h:23 ++#: stdio-common/../sysdeps/unix/siglist.c:28 sysdeps/generic/siglist.h:30 + msgid "Interrupt" + msgstr "Preru�enie" + +@@ -1291,231 +2196,263 @@ + #. TRANS You can choose to have functions resume after a signal that is handled, + #. TRANS rather than failing with @code{EINTR}; see @ref{Interrupted + #. TRANS Primitives}. +-#: stdio-common/../sysdeps/gnu/errlist.c:47 ++#: stdio-common/../sysdeps/gnu/errlist.c:48 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:34 + msgid "Interrupted system call" + msgstr "Preru�en� volanie syst�mu" + +-#: stdio-common/../sysdeps/gnu/errlist.c:666 ++#: stdio-common/../sysdeps/gnu/errlist.c:685 + msgid "Interrupted system call should be restarted" + msgstr "Preru�en� volanie syst�mu by malo by� znovu spusten�" + +-#: nis/nis_error.c:44 +-msgid "Invalid Object for operation" +-msgstr "Neplatn� objekt pre oper�ciu" +- + #. TRANS Invalid argument. This is used to indicate various kinds of problems + #. TRANS with passing the wrong argument to a library function. +-#: stdio-common/../sysdeps/gnu/errlist.c:164 ++#: stdio-common/../sysdeps/gnu/errlist.c:165 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:52 + msgid "Invalid argument" + msgstr "Nepr�pustn� argument" + +-#: posix/regex.c:1018 ++#: posix/regex.c:1102 + msgid "Invalid back reference" + msgstr "Nepr�pustn� sp�tn� odkaz" + +-#: posix/regex.c:1016 ++#: posix/regex.c:1096 + msgid "Invalid character class name" + msgstr "Nepr�pustn� n�zov triedy znakov" + +-#: sunrpc/clnt_perr.c:275 ++#: sunrpc/clnt_perr.c:332 + msgid "Invalid client credential" + msgstr "Neplatn� opr�vnenie klienta" + +-#: sunrpc/clnt_perr.c:279 ++#: sunrpc/clnt_perr.c:340 + msgid "Invalid client verifier" + msgstr "Neplatn� overenie klienta" + +-#: posix/regex.c:1015 ++#: posix/regex.c:1093 + msgid "Invalid collation character" + msgstr "Nepr�pustn� znak triedenia" + +-#: posix/regex.c:1022 ++#: posix/regex.c:1114 + msgid "Invalid content of \\{\\}" + msgstr "Nepr�pustn� obsah \\{\\}" + + #. TRANS An attempt to make an improper link across file systems was detected. + #. TRANS This happens not only when you use @code{link} (@pxref{Hard Links}) but + #. TRANS also when you rename a file with @code{rename} (@pxref{Renaming Files}). +-#: stdio-common/../sysdeps/gnu/errlist.c:141 ++#: stdio-common/../sysdeps/gnu/errlist.c:142 + msgid "Invalid cross-device link" + msgstr "Nepr�pustn� odkaz medzi zariadeniami" + +-#: stdio-common/../sysdeps/gnu/errlist.c:702 ++#: stdio-common/../sysdeps/gnu/errlist.c:721 + msgid "Invalid exchange" + msgstr "Nepr�pustn� v�mena" + ++#: nis/nis_error.c:45 ++msgid "Invalid object for operation" ++msgstr "Neplatn� objekt pre oper�ciu" ++ + #. TRANS While decoding a multibyte character the function came along an invalid + #. TRANS or an incomplete sequence of bytes or the given wide character is invalid. +-#: stdio-common/../sysdeps/gnu/errlist.c:579 ++#: stdio-common/../sysdeps/gnu/errlist.c:598 + msgid "Invalid or incomplete multibyte or wide character" + msgstr "Nepr�pustn� alebo nekompletn� viacbajtov� alebo �irok� znak" + +-#: posix/regex.c:1025 ++#: posix/regex.c:1123 + msgid "Invalid preceding regular expression" + msgstr "Nepr�pustn� predch�dzaj�ci regul�rny v�raz" + +-#: posix/regex.c:1023 ++#: posix/regex.c:1117 + msgid "Invalid range end" + msgstr "Nepr�pustn� koniec rozsahu" + +-#: posix/regex.c:1014 ++#: posix/regex.c:1090 + msgid "Invalid regular expression" + msgstr "Nepr�pustn� regul�rny v�raz" + +-#: stdio-common/../sysdeps/gnu/errlist.c:718 ++#: stdio-common/../sysdeps/gnu/errlist.c:737 + msgid "Invalid request code" + msgstr "Nepr�pustn� k�d �iadosti" + +-#: stdio-common/../sysdeps/gnu/errlist.c:706 ++#: stdio-common/../sysdeps/gnu/errlist.c:725 + msgid "Invalid request descriptor" + msgstr "Nepr�pustn� deskriptor �iadosti" + +-#: sunrpc/clnt_perr.c:285 ++#: sunrpc/clnt_perr.c:352 + msgid "Invalid server verifier" + msgstr "Neplatn� overenie servera" + +-#: stdio-common/../sysdeps/gnu/errlist.c:722 ++#: stdio-common/../sysdeps/gnu/errlist.c:741 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:85 + msgid "Invalid slot" + msgstr "Neplatn� priehradka" + ++#: nscd/nscd.c:91 ++msgid "Invalidate the specified cache" ++msgstr "Zneplatni� zadan� cache" ++ + #. TRANS File is a directory; you cannot open a directory for writing, + #. TRANS or create or remove hard links to it. +-#: stdio-common/../sysdeps/gnu/errlist.c:158 ++#: stdio-common/../sysdeps/gnu/errlist.c:159 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:51 + msgid "Is a directory" + msgstr "Je adres�r" + +-#: stdio-common/../sysdeps/gnu/errlist.c:806 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:169 ++msgid "Is a name file" ++msgstr "Je s�bor n�zvu" ++ ++#: stdio-common/../sysdeps/gnu/errlist.c:825 + msgid "Is a named type file" +-msgstr "Je pomenovan� s�bor" ++msgstr "Je pomenovan� s�bor typu" + +-#: nis/nis_print.c:187 ++#: nis/nis_print.c:188 + msgid "Kerberos.\n" + msgstr "Kerberos.\n" + +-#: stdio-common/../sysdeps/unix/siglist.c:34 +-#: sysdeps/unix/sysv/linux/siglist.h:29 ++#: stdio-common/../sysdeps/unix/siglist.c:35 sysdeps/generic/siglist.h:36 + msgid "Killed" + msgstr "Zabit�" + +-#: nis/nis_print.c:123 ++#: nis/nis_print.c:124 + msgid "LINK\n" + msgstr "ODKAZ\n" + +-#: nis/nis_local_names.c:125 ++#: nis/nis_local_names.c:126 + #, c-format + msgid "LOCAL entry for UID %d in directory %s not unique\n" + msgstr "LOCAL z�znam pre UID %d v adres�ri %s nie je jednozna�n�\n" + +-#: stdio-common/../sysdeps/gnu/errlist.c:698 ++#: stdio-common/../sysdeps/gnu/errlist.c:717 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:74 + msgid "Level 2 halted" + msgstr "�rove� 2 zastaven�" + +-#: stdio-common/../sysdeps/gnu/errlist.c:674 ++#: stdio-common/../sysdeps/gnu/errlist.c:693 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:68 + msgid "Level 2 not synchronized" + msgstr "�rove� 2 nie je synchronizovan�" + +-#: stdio-common/../sysdeps/gnu/errlist.c:678 ++#: stdio-common/../sysdeps/gnu/errlist.c:697 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:69 + msgid "Level 3 halted" + msgstr "�rove� 3 zastaven�" + +-#: stdio-common/../sysdeps/gnu/errlist.c:682 ++#: stdio-common/../sysdeps/gnu/errlist.c:701 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:70 + msgid "Level 3 reset" + msgstr "�rove� 3 nastaven� na v�chodzie hodnoty" + +-#: nis/nis_error.c:53 +-msgid "Link Points to illegal name" +-msgstr "Odkaz odkazuje na nepr�pustn� n�zov" +- +-#: stdio-common/../sysdeps/gnu/errlist.c:638 ++#: stdio-common/../sysdeps/gnu/errlist.c:657 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:97 + msgid "Link has been severed" + msgstr "Odkaz bol zni�en�" + +-#: stdio-common/../sysdeps/gnu/errlist.c:686 ++#: stdio-common/../sysdeps/gnu/errlist.c:705 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:71 + msgid "Link number out of range" + msgstr "��slo odkazu mimo rozsahu" + +-#: nis/nis_print.c:282 ++#: nis/nis_error.c:54 ++msgid "Link points to illegal name" ++msgstr "Odkaz odkazuje na nepr�pustn� n�zov" ++ ++#: nis/nis_print.c:283 + msgid "Linked Object Type : " + msgstr "Typ odkazovan�ho objektu : " + +-#: nis/nis_print.c:284 ++#: nis/nis_print.c:285 + #, c-format + msgid "Linked to : %s\n" + msgstr "Odkazuje na : %s\n" + +-#: nis/ypclnt.c:787 ++#: nis/ypclnt.c:810 + msgid "Local domain name not set" + msgstr "Meno miestnej dom�ny nie je nastaven�" + +-#: nis/ypclnt.c:777 ++#: nis/ypclnt.c:800 + msgid "Local resource allocation failure" + msgstr "Chyba pri pridelen� miestnych zdrojov" + +-#: stdio-common/../sysdeps/gnu/errlist.c:734 ++#: stdio-common/../sysdeps/gnu/errlist.c:753 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:94 + msgid "Machine is not on the network" + msgstr "Po��ta� nie je zapojen� v sieti" + +-#: nis/nis_error.c:45 +-msgid "Malformed Name, or illegal name" +-msgstr "Chybne formovan� alebo nepr�pustn� n�zov" ++#: nis/nis_error.c:46 ++msgid "Malformed name, or illegal name" ++msgstr "Chybne formovan� alebo nepr�pustn� n�zov" + +-#: argp/argp-help.c:1182 ++#: argp/argp-help.c:1185 + msgid "Mandatory or optional arguments to long options are also mandatory or optional for any corresponding short options." + msgstr "Povinn� alebo volite�n� argumenty dlh�ch tvarov volieb s� povinn� alebo volite�n� pre �ubovo�n� zodpovedaj�ce kr�tke vo�by." + +-#: nis/nis_print.c:168 ++#: elf/ldconfig.c:135 ++msgid "Manually link individual libraries." ++msgstr "Ru�ne linkova� jednotliv� kni�nice." ++ ++#: nis/nis_print.c:169 + msgid "Master Server :\n" + msgstr "Hlavn� server :\n" + +-#: nis/nis_error.c:75 ++#: nis/nis_error.c:76 + msgid "Master server busy, full dump rescheduled." + msgstr "Hlavn� server zanepr�zdnen�, �pln� prenos prepl�novan�." + +-#: posix/../sysdeps/posix/gai_strerror.c:35 ++#: posix/../sysdeps/posix/gai_strerror.c:36 + msgid "Memory allocation failure" + msgstr "Pridelenie pam�ti zlyhalo" + +-#: posix/regex.c:1024 ++#: posix/regex.c:1120 + msgid "Memory exhausted" + msgstr "Pam� vy�erpan�" + ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:82 ++msgid "Message tables full" ++msgstr "Pln� tabu�ka spr�v" ++ + #. TRANS The size of a message sent on a socket was larger than the supported + #. TRANS maximum size. +-#: stdio-common/../sysdeps/gnu/errlist.c:317 ++#: stdio-common/../sysdeps/gnu/errlist.c:318 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:127 + msgid "Message too long" + msgstr "Pr�li� dlh� spr�va" + +-#: nis/nis_error.c:57 ++#: nis/nis_error.c:58 + msgid "Missing or malformed attribute" + msgstr "Ch�baj�ci alebo chybne formovan� atrib�t" + +-#: nis/nis_print.c:323 ++#: nis/nis_print.c:328 + #, c-format + msgid "Mod. Time : %s" + msgstr "�as zmeny :%s" + +-#: nis/nis_error.c:50 ++#: nis/nis_error.c:51 + msgid "Modification failed" + msgstr "Modifik�cia zlyhala" + +-#: nis/nis_error.c:63 ++#: nis/nis_error.c:64 + msgid "Modify operation failed" + msgstr "Oper�cia zmeny zlyhala" + +-#: locale/programs/locale.c:68 ++#: locale/programs/locale.c:70 + msgid "Modify output format:" + msgstr "Modifikova� v�stupn� form�t:" + +-#: stdio-common/../sysdeps/gnu/errlist.c:630 ++#: stdio-common/../sysdeps/gnu/errlist.c:649 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:104 + msgid "Multihop attempted" + msgstr "Pokus o spojenie cez viac uzlov" + +-#: catgets/gencat.c:106 catgets/gencat.c:110 db2/makedb.c:59 +-#: locale/programs/localedef.c:115 nscd/nscd.c:77 ++#: nscd/nscd_conf.c:182 ++msgid "Must specify user name for server-user option" ++msgstr "Pre server-user vo�bu je potrebn� zada� meno pou��vate�a" ++ ++#: catgets/gencat.c:111 catgets/gencat.c:115 locale/programs/localedef.c:115 ++#: nscd/nscd.c:83 + msgid "NAME" + msgstr "N�ZOV" + +-#: locale/programs/locale.c:78 ++#: locale/programs/locale.c:80 + msgid "" + "NAME\n" + "[-a|-m]" +@@ -1523,269 +2460,365 @@ + "N�ZOV\n" + "[-a|-m]" + +-#: nis/nis_print.c:31 ++#: nis/nis_print.c:32 + msgid "NIS" + msgstr "NIS" + +-#: nis/ypclnt.c:791 ++#: nis/ypclnt.c:814 + msgid "NIS client/server version mismatch - can't supply service" + msgstr "Rozdielne verzie NIS klienta a serveru - nie je mo�n� poskytn�� slu�bu" + +-#: nis/ypclnt.c:789 ++#: nis/ypclnt.c:812 + msgid "NIS map database is bad" + msgstr "Datab�za m�p NIS je chybn�" + +-#: nis/nis_error.c:68 ++#: nis/nis_error.c:69 + msgid "NIS+ operation failed" + msgstr "NIS+ oper�cia zlyhala" + +-#: nis/nis_error.c:33 ++#: nis/nis_error.c:34 + msgid "NIS+ servers unreachable" + msgstr "NIS+ server nie je dostupn�" + +-#: nis/nis_error.c:69 ++#: nis/nis_error.c:70 + msgid "NIS+ service is unavailable or not installed" + msgstr "Slu�ba NIS+ nie je dostupn� alebo nain�talovan�" + +-#: nis/nis_print.c:108 ++#: nis/nis_print.c:109 + msgid "NO OBJECT\n" + msgstr "�IADNY OBJEKT\n" + +-#: nscd/nscd.c:81 ++#: nscd/nscd.c:87 + msgid "NUMBER" + msgstr "PO�ET" + +-#: nis/nis_print.c:162 ++#: nis/nis_print.c:163 + #, c-format +-msgid "Name : '%s'\n" +-msgstr "N�zov : '%s'\n" ++msgid "Name : `%s'\n" ++msgstr "N�zov : `%s'\n" + +-#: nscd/nscd.c:88 ++#: nscd/nscd.c:97 + msgid "Name Service Cache Daemon." + msgstr "D�mon cache slu�by n�zvov." + +-#: nis/nis_error.c:40 ++#: nis/nis_error.c:41 + msgid "Name not served by this server" + msgstr "N�zov nie je obsluhovan� t�mto serverom" + +-#: stdio-common/../sysdeps/gnu/errlist.c:758 ++#: stdio-common/../sysdeps/gnu/errlist.c:777 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:110 + msgid "Name not unique on network" + msgstr "Meno nie je v sieti jednozna�n�" + +-#: posix/../sysdeps/posix/gai_strerror.c:37 ++#: posix/../sysdeps/posix/gai_strerror.c:38 + msgid "Name or service not known" + msgstr "N�zov alebo slu�ba nezn�me" + +-#: nis/nis_error.c:49 ++#: malloc/memusagestat.c:53 ++msgid "Name output file" ++msgstr "V�stupn� s�bor n�zvu" ++ ++#: nis/nis_error.c:50 + msgid "Name/entry isn't unique" + msgstr "N�zov/z�znam nie s� jednozna�n�" + +-#: nis/nis_error.c:58 ++#: nis/nis_error.c:59 + msgid "Named object is not searchable" + msgstr "Zadan� objekt nie je preh�ad�vate�n�" + + #. TRANS ??? +-#: stdio-common/../sysdeps/gnu/errlist.c:566 ++#: stdio-common/../sysdeps/gnu/errlist.c:567 + msgid "Need authenticator" + msgstr "Potrebuje overovac� objekt" + ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:159 ++msgid "Network dropped connection because of reset" ++msgstr "Sie� zru�ila spojenie kv�li resetu" ++ + #. TRANS A network connection was reset because the remote host crashed. +-#: stdio-common/../sysdeps/gnu/errlist.c:389 ++#: stdio-common/../sysdeps/gnu/errlist.c:390 + msgid "Network dropped connection on reset" + msgstr "Sie� zru�ila spojenie (probl�m so vzdialen�m po��ta�om)" + + #. TRANS A socket operation failed because the network was down. +-#: stdio-common/../sysdeps/gnu/errlist.c:378 ++#: stdio-common/../sysdeps/gnu/errlist.c:379 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:157 + msgid "Network is down" + msgstr "Sie� je nefunk�n�" + + #. TRANS A socket operation failed because the subnet containing the remote host + #. TRANS was unreachable. +-#: stdio-common/../sysdeps/gnu/errlist.c:384 ++#: stdio-common/../sysdeps/gnu/errlist.c:385 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:158 + msgid "Network is unreachable" + msgstr "Sie� nie je dostupn�" + +-#: stdio-common/../sysdeps/gnu/errlist.c:694 ++#: stdio-common/../sysdeps/gnu/errlist.c:713 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:73 + msgid "No CSI structure available" + msgstr "CSI �trukt�ra nedostupn�" + +-#: stdio-common/../sysdeps/gnu/errlist.c:802 ++#: stdio-common/../sysdeps/gnu/errlist.c:821 + msgid "No XENIX semaphores available" + msgstr "XENIX semaf�ry nedostupn�" + +-#: posix/../sysdeps/posix/gai_strerror.c:36 ++#: posix/../sysdeps/posix/gai_strerror.c:37 + msgid "No address associated with hostname" + msgstr "N�zov po��ta�a nem� priraden� adresu" + +-#: resolv/herror.c:77 ++#: resolv/herror.c:71 + msgid "No address associated with name" + msgstr "N�zov nem� priraden� adresu" + +-#: stdio-common/../sysdeps/gnu/errlist.c:714 ++#: stdio-common/../sysdeps/gnu/errlist.c:733 + msgid "No anode" + msgstr "�iadny anode" + + #. TRANS The kernel's buffers for I/O operations are all in use. In GNU, this + #. TRANS error is always synonymous with @code{ENOMEM}; you may get one or the + #. TRANS other from network operations. +-#: stdio-common/../sysdeps/gnu/errlist.c:408 ++#: stdio-common/../sysdeps/gnu/errlist.c:409 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:162 + msgid "No buffer space available" + msgstr "Nie je mo�n� prideli� pam� pre V/V oper�cie" + ++#: locale/programs/ld-ctype.c:425 ++msgid "No character set name specified in charmap" ++msgstr "V znakovej mape nie je zadan� n�zov znakovej sady" ++ + #. TRANS There are no child processes. This error happens on operations that are + #. TRANS supposed to manipulate child processes, when there aren't any processes + #. TRANS to manipulate. +-#: stdio-common/../sysdeps/gnu/errlist.c:89 ++#: stdio-common/../sysdeps/gnu/errlist.c:90 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:40 + msgid "No child processes" + msgstr "Detsk� procesy neexistuj�" + +-#: stdio-common/../sysdeps/gnu/errlist.c:634 ++#: stdio-common/../sysdeps/gnu/errlist.c:653 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:91 + msgid "No data available" + msgstr "D�ta nie s� k dispoz�cii" + +-#: nis/nis_error.c:73 ++#: locale/programs/ld-address.c:131 locale/programs/ld-collate.c:1500 ++#: locale/programs/ld-ctype.c:407 locale/programs/ld-identification.c:132 ++#: locale/programs/ld-measurement.c:93 locale/programs/ld-messages.c:98 ++#: locale/programs/ld-monetary.c:194 locale/programs/ld-name.c:94 ++#: locale/programs/ld-numeric.c:99 locale/programs/ld-paper.c:91 ++#: locale/programs/ld-telephone.c:94 locale/programs/ld-time.c:160 ++#, c-format ++msgid "No definition for %s category found" ++msgstr "Nebola n�jden� defin�cia kateg�rie %s" ++ ++#: nis/nis_error.c:74 + msgid "No file space on server" + msgstr "Na serveri u� nie je �iadne miesto pre s�bory" + ++#: elf/ldconfig.c:532 ++#, 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" ++ + #. TRANS No locks available. This is used by the file locking facilities; see + #. TRANS @ref{File Locks}. This error is never generated by the GNU system, but + #. TRANS it can result from an operation to an NFS server running another + #. TRANS operating system. +-#: stdio-common/../sysdeps/gnu/errlist.c:547 ++#: stdio-common/../sysdeps/gnu/errlist.c:548 + msgid "No locks available" + msgstr "Z�mky nie s� k dispoz�cii" + +-#: posix/regex.c:1013 ++#: posix/regex.c:1087 + msgid "No match" + msgstr "�iadna zhoda" + +-#: stdio-common/../sysdeps/gnu/errlist.c:814 ++#: stdio-common/../sysdeps/gnu/errlist.c:833 + msgid "No medium found" + msgstr "Nen�jden� �iadne m�dium" + +-#: stdio-common/../sysdeps/gnu/errlist.c:642 ++#: stdio-common/../sysdeps/gnu/errlist.c:661 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:65 + msgid "No message of desired type" + msgstr "�iadna spr�va �elan�ho typu" + +-#: nis/ypclnt.c:779 ++#: nis/ypclnt.c:802 + msgid "No more records in map database" + msgstr "�iadne �al�ie z�znamy v datab�ze" + +-#: posix/regex.c:5515 ++#: posix/regex.c:5955 + msgid "No previous regular expression" + msgstr "�iadny predch�dzaj�ci regul�rny v�raz" + ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:76 ++msgid "No record locks available" ++msgstr "Nie s� k dispoz�cii �iadne z�mky" ++ + #: sunrpc/rpcinfo.c:570 + msgid "No remote programs registered.\n" + msgstr "Nie s� registrovan� �iadne vzdialen� programy\n" + + #. TRANS The remote host for a requested network connection is not reachable. +-#: stdio-common/../sysdeps/gnu/errlist.c:474 ++#: stdio-common/../sysdeps/gnu/errlist.c:475 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:178 + msgid "No route to host" + msgstr "Cesta k po��ta�u neexistuje" + + #. TRANS No space left on device; write operation on a file failed because the + #. TRANS disk is full. +-#: stdio-common/../sysdeps/gnu/errlist.c:208 ++#: stdio-common/../sysdeps/gnu/errlist.c:209 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:58 + msgid "No space left on device" + msgstr "Na zariaden� u� nie je �iadne miesto" + + #. TRANS The wrong type of device was given to a function that expects a + #. TRANS particular sort of device. +-#: stdio-common/../sysdeps/gnu/errlist.c:147 ++#: stdio-common/../sysdeps/gnu/errlist.c:148 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:49 + msgid "No such device" + msgstr "Tak� zariadenie neexistuje" + ++#. TRANS No such device or address. The system tried to use the device ++#. TRANS represented by a file you specified, and it couldn't find the device. ++#. TRANS This can mean that the device file was installed incorrectly, or that ++#. TRANS the physical device is missing or not correctly attached to the ++#. TRANS computer. ++#: stdio-common/../sysdeps/gnu/errlist.c:62 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:36 ++msgid "No such device or address" ++msgstr "Tak� zariadenie alebo adresa neexistuje" ++ + #. TRANS No such file or directory. This is a ``file doesn't exist'' error + #. TRANS for ordinary files that are referenced in contexts where they are + #. TRANS expected to already exist. +-#: stdio-common/../sysdeps/gnu/errlist.c:31 ++#: stdio-common/../sysdeps/gnu/errlist.c:32 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:32 + msgid "No such file or directory" + msgstr "Adres�r alebo s�bor neexistuje" + +-#: nis/ypclnt.c:773 ++#: nis/ypclnt.c:796 + msgid "No such key in map" + msgstr "Tento k��� v datab�ze neexistuje" + +-#: nis/ypclnt.c:771 ++#: nis/ypclnt.c:794 + msgid "No such map in server's domain" + msgstr "T�to mapa sa v dom�ne servera nenach�dza" + + #. TRANS No process matches the specified process ID. +-#: stdio-common/../sysdeps/gnu/errlist.c:36 ++#: stdio-common/../sysdeps/gnu/errlist.c:37 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:33 + msgid "No such process" + msgstr "Tento proces neexistuje" + +-#: nis/nis_error.c:60 ++#: nis/nis_error.c:61 + msgid "Non NIS+ namespace encountered" + msgstr "Zaznamenan� priestor n�zvov mimo NIS+" + +-#: posix/../sysdeps/posix/gai_strerror.c:33 ++#: posix/../sysdeps/posix/gai_strerror.c:34 + msgid "Non-recoverable failure in name resolution" + msgstr "Neopravite�n� chyba pri rie�en� n�zvu" + +-#: nis/nis_print.c:176 ++#: nis/nis_print.c:177 + msgid "None.\n" + msgstr "�iadne.\n" + +-#: nis/nis_error.c:48 +-msgid "Not Found, no such name" +-msgstr "Nen�jden�, tak�to n�zov neexistuje" +- +-#: stdio-common/../sysdeps/gnu/errlist.c:798 ++#: stdio-common/../sysdeps/gnu/errlist.c:817 + msgid "Not a XENIX named type file" + msgstr "Nejde o pomenovan� XENIX s�bor" + ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:107 ++msgid "Not a data message" ++msgstr "Nejde o d�tov� spr�vu" ++ + #. TRANS A file that isn't a directory was specified when a directory is required. +-#: stdio-common/../sysdeps/gnu/errlist.c:152 ++#: stdio-common/../sysdeps/gnu/errlist.c:153 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:50 + msgid "Not a directory" + msgstr "Nie je adres�r" + +-#: nis/nis_error.c:30 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:167 ++msgid "Not a name file" ++msgstr "Nejde o s�bor n�zvu" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:90 ++msgid "Not a stream device" ++msgstr "Nejde o pr�dov� zariadenie" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:168 ++msgid "Not available" ++msgstr "Nie je k dispoz�cii" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:42 ++msgid "Not enough space" ++msgstr "Nedostatok miesta" ++ ++#: nis/nis_error.c:31 + msgid "Not found" + msgstr "Nen�jden�" + +-#: nis/nis_error.c:43 ++#: nis/nis_error.c:49 ++msgid "Not found, no such name" ++msgstr "Nen�jden�, tak�to n�zov neexistuje" ++ ++#: nis/nis_error.c:44 + msgid "Not master server for this domain" + msgstr "Nie je hlavn� server pre t�to dom�nu" + +-#: nis/nis_error.c:39 ++#: nis/nis_error.c:40 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:31 + msgid "Not owner" + msgstr "Nie je vlastn�kom" + +-#: nis/nis_print.c:263 ++#. TRANS Not supported. A function returns this error when certain parameter ++#. TRANS values are valid, but the functionality they request is not available. ++#. TRANS This can mean that the function does not implement a particular command ++#. TRANS or option value or flag bit at all. For functions that operate on some ++#. TRANS object given in a parameter, such as a file descriptor or a port, it ++#. TRANS might instead mean that only @emph{that specific object} (file ++#. TRANS descriptor, port, etc.) is unable to support the other parameters given; ++#. TRANS different file descriptors might support different ranges of parameter ++#. TRANS values. ++#. TRANS ++#. TRANS If the entire function is not available at all in the implementation, ++#. TRANS it returns @code{ENOSYS} instead. ++#: stdio-common/../sysdeps/gnu/errlist.c:592 ++msgid "Not supported" ++msgstr "Nie je podporovan�" ++ ++#: nis/nis_print.c:264 + #, c-format + msgid "Number of Columns : %d\n" + msgstr "Po�et st�pcov : %d\n" + +-#: nis/nis_print.c:358 ++#: nis/nis_print.c:363 + #, c-format + msgid "Number of objects : %u\n" + msgstr "Po�et objektov : %u\n" + ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:120 ++msgid "Number of symbolic links encountered during path name traversal exceeds MAXSYMLINKS" ++msgstr "Po�et symbolick�ch odkazov n�jden�ch po�as prech�dzania cesty presahuje MAXSYMLINKS" ++ + #. TRANS Domain error; used by mathematical functions when an argument value does + #. TRANS not fall into the domain over which the function is defined. +-#: stdio-common/../sysdeps/gnu/errlist.c:240 ++#: stdio-common/../sysdeps/gnu/errlist.c:241 + msgid "Numerical argument out of domain" + msgstr "��seln� rozsah mimo dom�ny defin�cie funkcie" + + #. TRANS Range error; used by mathematical functions when the result value is + #. TRANS not representable because of overflow or underflow. +-#: stdio-common/../sysdeps/gnu/errlist.c:246 ++#: stdio-common/../sysdeps/gnu/errlist.c:247 + msgid "Numerical result out of range" + msgstr "��seln� v�sledok mimo povolen�ho rozsahu" + +-#: nis/nis_print.c:362 ++#: nis/nis_print.c:367 + #, c-format + msgid "Object #%d:\n" + msgstr "Objekt #%d:\n" + +-#: nis/nis_print.c:314 ++#: nis/nis_print.c:317 + #, c-format + msgid "Object Name : %s\n" + msgstr "N�zov objektu : %s\n" + +-#: nis/nis_print.c:324 ++#: nis/nis_print.c:329 + msgid "Object Type : " + msgstr "Typ objektu : " + +@@ -1793,31 +2826,45 @@ + #. TRANS already specifies an NFS-mounted file. + #. TRANS (This is an error on some operating systems, but we expect it to work + #. TRANS properly on the GNU system, making this error code impossible.) +-#: stdio-common/../sysdeps/gnu/errlist.c:514 ++#: stdio-common/../sysdeps/gnu/errlist.c:515 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:96 + msgid "Object is remote" + msgstr "Objekt je vzdialen�" + +-#: nis/nis_error.c:42 ++#: nis/nis_error.c:43 + msgid "Object with same name exists" + msgstr "Existuje objekt s rovnak�m n�zvom" + +-#: timezone/zic.c:1995 ++#: timezone/zic.c:2022 + msgid "Odd number of quotation marks" + msgstr "Nep�rny po�et �vodzoviek" + +-#: nscd/nscd.c:185 ++#: elf/ldconfig.c:134 ++msgid "Only process directories specified on the command line. Don't build cache." ++msgstr "Na pr�kazovom riadku s� zadan� iba adres�re procesov. Nevytv�ra� cache." ++ ++#: nscd/nscd.c:200 nscd/nscd.c:220 nscd/nscd.c:226 + msgid "Only root is allowed to use this option!" + msgstr "T�to vo�ba je dostupn� iba superu��vate�ovi!" + + #. TRANS An operation is already in progress on an object that has non-blocking + #. TRANS mode selected. +-#: stdio-common/../sysdeps/gnu/errlist.c:306 ++#: stdio-common/../sysdeps/gnu/errlist.c:307 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:179 + msgid "Operation already in progress" + msgstr "Oper�cia je u� rozpracovan�" + ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:77 ++msgid "Operation canceled" ++msgstr "Oper�cia zru�en�" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:119 ++msgid "Operation not applicable" ++msgstr "Oper�cia nie je aplikovate�n�" ++ + #. TRANS Operation not permitted; only the owner of the file (or other resource) + #. TRANS or processes with special privileges can perform the operation. +-#: stdio-common/../sysdeps/gnu/errlist.c:24 ++#: stdio-common/../sysdeps/gnu/errlist.c:25 + msgid "Operation not permitted" + msgstr "Oper�cia nie je povolen�" + +@@ -1827,10 +2874,15 @@ + #. TRANS error can happen for many calls when the object does not support the + #. TRANS particular operation; it is a generic indication that the server knows + #. TRANS nothing to do for that call. +-#: stdio-common/../sysdeps/gnu/errlist.c:350 ++#: stdio-common/../sysdeps/gnu/errlist.c:351 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:78 + msgid "Operation not supported" + msgstr "Oper�cia nie je podporovan�" + ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:152 ++msgid "Operation not supported on transport endpoint" ++msgstr "Oper�cia nie je podporovan� na koncovom bode komunik�cie" ++ + #. TRANS An operation that cannot complete immediately was initiated on an object + #. TRANS that has non-blocking mode selected. Some functions that must always + #. TRANS block (such as @code{connect}; @pxref{Connecting}) never return +@@ -1839,7 +2891,8 @@ + #. TRANS the object before the call completes return @code{EALREADY}. You can + #. TRANS use the @code{select} function to find out when the pending operation + #. TRANS has completed; @pxref{Waiting for I/O}. +-#: stdio-common/../sysdeps/gnu/errlist.c:300 ++#: stdio-common/../sysdeps/gnu/errlist.c:301 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:180 + msgid "Operation now in progress" + msgstr "Oper�cia prebieha" + +@@ -1848,67 +2901,86 @@ + #. TRANS + #. TRANS C libraries in many older Unix systems have @code{EWOULDBLOCK} as a + #. TRANS separate error code. +-#: stdio-common/../sysdeps/gnu/errlist.c:288 ++#: stdio-common/../sysdeps/gnu/errlist.c:289 + msgid "Operation would block" + msgstr "Oper�cia by blokovala" + +-#: stdio-common/../sysdeps/gnu/errlist.c:646 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:129 ++msgid "Option not supported by protocol" ++msgstr "Vo�ba nie je protokolom podporovan�" ++ ++#: locale/programs/localedef.c:103 ++msgid "Optional output file prefix" ++msgstr "Volite�n� prefix v�stupn�ho s�boru" ++ ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:93 ++msgid "Out of stream resources" ++msgstr "Pr�dov� zdroje vy�erpan�" ++ ++#: stdio-common/../sysdeps/gnu/errlist.c:665 + msgid "Out of streams resources" + msgstr "Pr�dov� zdroje vy�erpan�" + +-#: iconv/iconv_prog.c:59 locale/programs/localedef.c:101 ++#: iconv/iconv_prog.c:60 locale/programs/localedef.c:99 + msgid "Output control:" + msgstr "Riadenie v�stupu:" + +-#: elf/sprof.c:76 ++#: elf/sprof.c:72 + msgid "Output selection:" + msgstr "V�ber v�stupu:" + +-#: nis/nis_print.c:316 ++#: nis/nis_print.c:319 + #, c-format + msgid "Owner : %s\n" + msgstr "Vlastn�k : %s\n" + +-#: nis/nis_print.c:126 ++#: nis/nis_print.c:127 + msgid "PRIVATE\n" + msgstr "S�KROMN�\n" + +-#: stdio-common/../sysdeps/gnu/errlist.c:738 ++#: stdio-common/../sysdeps/gnu/errlist.c:757 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:95 + msgid "Package not installed" + msgstr "Bal�k nie je nain�talovan�" + +-#: nscd/nscd_conf.c:84 ++#: nscd/nscd_conf.c:83 + #, c-format + msgid "Parse error: %s" + msgstr "Chyba anal�zy: %s" + +-#: nis/nis_error.c:54 +-msgid "Partial Success" ++#: nis/nis_error.c:55 ++msgid "Partial success" + msgstr "�iasto�n� �spech" + +-#: nis/nis_error.c:62 ++#: nis/nis_error.c:63 + msgid "Passed object is not the same object on server" + msgstr "Odovzdan� objekt nie je na serveri t�m ist�m objektom" + ++#: elf/ldconfig.c:287 ++#, c-format ++msgid "Path `%s' given more than once" ++msgstr "Cesta `%s' bola zadan� viac ako raz" ++ + #. TRANS Permission denied; the file permissions do not allow the attempted operation. +-#: nis/nis_error.c:38 nis/ypclnt.c:793 +-#: stdio-common/../sysdeps/gnu/errlist.c:108 ++#: nis/nis_error.c:39 nis/ypclnt.c:816 ++#: stdio-common/../sysdeps/gnu/errlist.c:109 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:43 + msgid "Permission denied" + msgstr "Pr�stup odmietnut�" + +-#: sysdeps/unix/sysv/linux/siglist.h:64 ++#: sysdeps/generic/siglist.h:71 + msgid "Power failure" + msgstr "V�padok nap�jania" + +-#: posix/regex.c:1026 ++#: posix/regex.c:1126 + msgid "Premature end of regular expression" + msgstr "Pred�asn� koniec regul�rneho v�razu" + +-#: db2/makedb.c:63 +-msgid "Print content of database file, one entry a line" +-msgstr "Vyp�sa� obsah datab�zov�ho s�boru, jeden z�znam na riadok" ++#: elf/ldconfig.c:127 ++msgid "Print cache" ++msgstr "Vyp�sa� cache" + +-#: nscd/nscd.c:83 ++#: nscd/nscd.c:89 + msgid "Print current configuration statistic" + msgstr "Vyp�sa� �tatistiku aktu�lnej konfigur�cie" + +@@ -1916,243 +2988,259 @@ + msgid "Print more messages" + msgstr "Vyp�sa� viac spr�v" + +-#: argp/argp-parse.c:148 ++#: argp/argp-parse.c:154 + msgid "Print program version" + msgstr "Vyp�sa� verziu programu" + +-#: nis/nis_error.c:29 ++#: nis/nis_error.c:30 + msgid "Probable success" + msgstr "Pravdepodobn� �spech" + +-#: nis/nis_error.c:31 ++#: nis/nis_error.c:32 + msgid "Probably not found" + msgstr "Pravdepodobne nen�jden�" + +-#: stdio-common/../sysdeps/unix/siglist.c:52 +-#: sysdeps/unix/sysv/linux/siglist.h:46 ++#: stdio-common/../sysdeps/unix/siglist.c:53 sysdeps/generic/siglist.h:53 + msgid "Profiling timer expired" + msgstr "Profilovac� �asova� vypr�al" + +-#: stdio-common/../sysdeps/gnu/errlist.c:690 ++#: stdio-common/../sysdeps/gnu/errlist.c:709 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:72 + msgid "Protocol driver not attached" + msgstr "Ovl�da� protokolu nepripojen�" + +-#: stdio-common/../sysdeps/gnu/errlist.c:658 ++#: stdio-common/../sysdeps/gnu/errlist.c:677 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:101 + msgid "Protocol error" + msgstr "Chyba protokolu" + + #. TRANS The socket communications protocol family you requested is not supported. +-#: stdio-common/../sysdeps/gnu/errlist.c:355 ++#: stdio-common/../sysdeps/gnu/errlist.c:356 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:153 + msgid "Protocol family not supported" + msgstr "Rodina protokolov nie je podporovan�" + + #. TRANS You specified a socket option that doesn't make sense for the + #. TRANS particular protocol being used by the socket. @xref{Socket Options}. +-#: stdio-common/../sysdeps/gnu/errlist.c:328 ++#: stdio-common/../sysdeps/gnu/errlist.c:329 + msgid "Protocol not available" + msgstr "Protokol nie je k dispoz�cii" + + #. TRANS The socket domain does not support the requested communications protocol + #. TRANS (perhaps because the requested protocol is completely invalid). + #. TRANS @xref{Creating a Socket}. +-#: stdio-common/../sysdeps/gnu/errlist.c:335 ++#: stdio-common/../sysdeps/gnu/errlist.c:336 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:150 + msgid "Protocol not supported" + msgstr "Protokol nie je podporovan�" + + #. TRANS The socket type does not support the requested communications protocol. +-#: stdio-common/../sysdeps/gnu/errlist.c:322 ++#: stdio-common/../sysdeps/gnu/errlist.c:323 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:128 + msgid "Protocol wrong type for socket" + msgstr "Protokol nie je socketom podporovan�" + +-#: nis/nis_error.c:64 ++#: nis/nis_error.c:65 + msgid "Query illegal for named table" + msgstr "Nepr�pustn� ot�zka pre dan� tabu�ku" + +-#: stdio-common/../sysdeps/unix/siglist.c:28 +-#: sysdeps/unix/sysv/linux/siglist.h:24 ++#: stdio-common/../sysdeps/unix/siglist.c:29 sysdeps/generic/siglist.h:31 + msgid "Quit" + msgstr "Koniec" + +-#: stdio-common/../sysdeps/gnu/errlist.c:754 ++#: stdio-common/../sysdeps/gnu/errlist.c:773 + msgid "RFS specific error" + msgstr "RFS-�pecifick� chyba" + + #. TRANS ??? +-#: stdio-common/../sysdeps/gnu/errlist.c:539 ++#: stdio-common/../sysdeps/gnu/errlist.c:540 + msgid "RPC bad procedure for program" + msgstr "Chybn� RPC proced�ra pre program" + +-#: nis/ypclnt.c:767 ++#: nis/ypclnt.c:790 + msgid "RPC failure on NIS operation" + msgstr "Zlyhal RPC pri NIS oper�cii" + + #. TRANS ??? +-#: stdio-common/../sysdeps/gnu/errlist.c:529 ++#: stdio-common/../sysdeps/gnu/errlist.c:530 + msgid "RPC program not available" + msgstr "RPC program nie je k dispoz�cii" + + #. TRANS ??? +-#: stdio-common/../sysdeps/gnu/errlist.c:534 ++#: stdio-common/../sysdeps/gnu/errlist.c:535 + msgid "RPC program version wrong" + msgstr "Chybn� verzia RPC programu" + + #. TRANS ??? +-#: stdio-common/../sysdeps/gnu/errlist.c:519 ++#: stdio-common/../sysdeps/gnu/errlist.c:520 + msgid "RPC struct is bad" + msgstr "RPC �trukt�ra je chybn�" + + #. TRANS ??? +-#: stdio-common/../sysdeps/gnu/errlist.c:524 ++#: stdio-common/../sysdeps/gnu/errlist.c:525 + msgid "RPC version wrong" + msgstr "Chybn� verzia RPC" + +-#: sunrpc/clnt_perr.c:215 ++#: sunrpc/clnt_perr.c:271 + msgid "RPC: (unknown error code)" + msgstr "RPC: (nezn�mny chybov� k�d)" + +-#: sunrpc/clnt_perr.c:176 ++#: sunrpc/clnt_perr.c:190 + msgid "RPC: Authentication error" + msgstr "RPC: Chyba pri overen� pr�v" + +-#: sunrpc/clnt_perr.c:166 ++#: sunrpc/clnt_perr.c:170 + msgid "RPC: Can't decode result" + msgstr "RPC: Nie je mo�n� dek�dova� v�sledok" + +-#: sunrpc/clnt_perr.c:164 ++#: sunrpc/clnt_perr.c:166 + msgid "RPC: Can't encode arguments" + msgstr "RPC: Nie je mo�n� zak�dova� argumenty" + +-#: sunrpc/clnt_perr.c:196 ++#: sunrpc/clnt_perr.c:230 + msgid "RPC: Failed (unspecified error)" + msgstr "RPC: Zlyhalo (ne�pecifikovan� chyba)" + +-#: sunrpc/clnt_perr.c:174 ++#: sunrpc/clnt_perr.c:186 + msgid "RPC: Incompatible versions of RPC" + msgstr "RPC: Nekompatibiln� verzie RPC" + +-#: sunrpc/clnt_perr.c:192 ++#: sunrpc/clnt_perr.c:222 + msgid "RPC: Port mapper failure" + msgstr "RPC: Chyba portmappera" + +-#: sunrpc/clnt_perr.c:182 ++#: sunrpc/clnt_perr.c:202 + msgid "RPC: Procedure unavailable" + msgstr "RPC: Proced�ra nie je k dispoz�cii" + +-#: sunrpc/clnt_perr.c:194 ++#: sunrpc/clnt_perr.c:226 + msgid "RPC: Program not registered" + msgstr "RPC: Program nie je registrovan�" + +-#: sunrpc/clnt_perr.c:178 ++#: sunrpc/clnt_perr.c:194 + msgid "RPC: Program unavailable" + msgstr "RPC: Program nie je k dispoz�cii" + +-#: sunrpc/clnt_perr.c:180 ++#: sunrpc/clnt_perr.c:198 + msgid "RPC: Program/version mismatch" + msgstr "RPC: Nes�hlas� program alebo verzia" + +-#: sunrpc/clnt_perr.c:186 ++#: sunrpc/clnt_perr.c:210 + msgid "RPC: Remote system error" + msgstr "RPC: Chyba vzdialen�ho syst�mu" + +-#: sunrpc/clnt_perr.c:184 ++#: sunrpc/clnt_perr.c:206 + msgid "RPC: Server can't decode arguments" + msgstr "RPC: Server nem��e dek�dova� argumenty" + +-#: sunrpc/clnt_perr.c:162 ++#: sunrpc/clnt_perr.c:163 + msgid "RPC: Success" + msgstr "RPC: �spech" + +-#: sunrpc/clnt_perr.c:172 ++#: sunrpc/clnt_perr.c:182 + msgid "RPC: Timed out" + msgstr "RPC: �asova� vypr�al" + +-#: sunrpc/clnt_perr.c:170 ++#: sunrpc/clnt_perr.c:178 + msgid "RPC: Unable to receive" + msgstr "RPC: Nie je mo�n� prij�ma�" + +-#: sunrpc/clnt_perr.c:168 ++#: sunrpc/clnt_perr.c:174 + msgid "RPC: Unable to send" + msgstr "RPC: Nie je mo�n� vysiela�" + +-#: sunrpc/clnt_perr.c:188 ++#: sunrpc/clnt_perr.c:214 + msgid "RPC: Unknown host" + msgstr "RPC: Nezn�my po��ta�" + +-#: sunrpc/clnt_perr.c:190 ++#: sunrpc/clnt_perr.c:218 + msgid "RPC: Unknown protocol" + msgstr "RPC: Nezn�my protokol" + +-#: nis/nis_print.c:184 ++#: nis/nis_print.c:185 + #, c-format + msgid "RSA (%d bits)\n" + msgstr "RSA (%d bitov)\n" + +-#: elf/dlsym.c:59 elf/dlvsym.c:62 ++#: elf/dl-sym.c:68 elf/dl-sym.c:125 + msgid "RTLD_NEXT used in code not dynamically loaded" + msgstr "RTLD_NEXT je pou�it� pre k�d, ktor� nie je dynamicky zaveden�" + +-#: elf/sprof.c:88 ++#: elf/sprof.c:84 + msgid "Read and display shared object profiling data" + msgstr "Pre��ta� a vyp�sa� profilovacie �daje zdie�an�ho objektu" + +-#: nscd/nscd.c:78 ++#: nscd/nscd.c:84 + msgid "Read configuration data from NAME" + msgstr "Na��ta� �daje o konfigur�cii z N�ZOV" + + #. TRANS An attempt was made to modify something on a read-only file system. +-#: stdio-common/../sysdeps/gnu/errlist.c:218 ++#: stdio-common/../sysdeps/gnu/errlist.c:219 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:60 + msgid "Read-only file system" + msgstr "S�borov� syst�m dovo�uje len ��tanie" + +-#: string/strsignal.c:66 ++#: string/strsignal.c:67 + #, c-format + msgid "Real-time signal %d" + msgstr "Sign�l re�lneho �asu %d" + +-#: posix/regex.c:1027 ++#: posix/regex.c:1129 + msgid "Regular expression too big" + msgstr "Regul�rny v�raz pr�li� ve�k�" + +-#: stdio-common/../sysdeps/gnu/errlist.c:810 ++#: stdio-common/../sysdeps/gnu/errlist.c:829 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:170 + msgid "Remote I/O error" + msgstr "Vzdialen� V/V chyba" + +-#: stdio-common/../sysdeps/gnu/errlist.c:766 ++#: stdio-common/../sysdeps/gnu/errlist.c:785 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:112 + msgid "Remote address changed" + msgstr "Vzdialen� adresa sa zmenila" + +-#: inet/ruserpass.c:162 ++#: inet/ruserpass.c:182 + msgid "Remove password or make file unreadable by others." + msgstr "Odstr��te heslo alebo zak�te ��tanie s�boru ostatn�mi." + +-#: elf/sprof.c:537 ++#: elf/cache.c:394 ++#, c-format ++msgid "Renaming of %s to %s failed" ++msgstr "Premenovanie %s na %s zlyhalo" ++ ++#: elf/sprof.c:532 + #, c-format + msgid "Reopening shared object `%s' failed" + msgstr "Znovuotvorenie zdie�an�ho objektu `%s' zlyhalo" + +-#: nis/nis_print.c:170 ++#: nis/nis_print.c:171 + msgid "Replicate :\n" + msgstr "Replika :\n" + +-#: argp/argp-help.c:1638 ++#: argp/argp-help.c:1639 + #, c-format + msgid "Report bugs to %s.\n" + msgstr "Chyby hl�ste na adrese %s.\n" + +-#: catgets/gencat.c:223 db2/makedb.c:229 iconv/iconv_prog.c:280 +-#: locale/programs/locale.c:254 locale/programs/localedef.c:389 ++#: catgets/gencat.c:233 debug/pcprofiledump.c:181 iconv/iconv_prog.c:337 ++#: locale/programs/locale.c:256 locale/programs/localedef.c:297 ++#: malloc/memusagestat.c:602 + msgid "Report bugs using the `glibcbug' script to <bugs@gnu.org>.\n" + msgstr "Chyby hl�ste na adrese <bugs@gnu.org> - pou�ite skript `glibcbug'.\n" + +-#: nis/ypclnt.c:765 ++#: nis/ypclnt.c:788 + msgid "Request arguments bad" + msgstr "Chybn� argumenty �iadosti" + +-#: resolv/herror.c:73 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:171 ++msgid "Reserved for future use" ++msgstr "Rezervovan� pre bud�ce pou�itie" ++ ++#: resolv/herror.c:67 + msgid "Resolver Error 0 (no error)" + msgstr "Chyba resolvera 0 (�iadna chyba)" + +-#: resolv/herror.c:117 ++#: resolv/herror.c:107 + msgid "Resolver internal error" + msgstr "Vn�torn� chyba resolvera" + +@@ -2160,11 +3248,11 @@ + #. TRANS deadlock situation. The system does not guarantee that it will notice + #. TRANS all such situations. This error means you got lucky and the system + #. TRANS noticed; it might just hang. @xref{File Locks}, for an example. +-#: stdio-common/../sysdeps/gnu/errlist.c:97 ++#: stdio-common/../sysdeps/gnu/errlist.c:98 + msgid "Resource deadlock avoided" + msgstr "Bolo zabr�nen� vz�jomn�mu zablokovaniu" + +-#: stdio-common/../sysdeps/unix/siglist.c:54 ++#: stdio-common/../sysdeps/unix/siglist.c:55 sysdeps/generic/siglist.h:74 + msgid "Resource lost" + msgstr "Zdroj bol straten�" + +@@ -2197,76 +3285,83 @@ + #. TRANS so usually an interactive program should report the error to the user + #. TRANS and return to its command loop. + #. TRANS @end itemize +-#: stdio-common/../sysdeps/gnu/errlist.c:279 ++#: stdio-common/../sysdeps/gnu/errlist.c:280 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:41 + msgid "Resource temporarily unavailable" + msgstr "Zdroj je do�asne nepr�stupn�" + +-#: nis/nis_error.c:47 +-msgid "Results Sent to callback proc" ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:64 ++msgid "Result too large" ++msgstr "V�sledok je pr�li� ve�k�" ++ ++#: nis/nis_error.c:48 ++msgid "Results sent to callback proc" + msgstr "V�sledky poslan� proced�re sp�tn�ho volania" + +-#: elf/sprof.c:91 ++#: elf/sprof.c:87 + msgid "SHOBJ [PROFDATA]" + msgstr "ZDIE�_OBJEKT [PROF_�DAJE]" + +-#: nis/nis_print.c:33 ++#: nis/nis_print.c:34 + msgid "SUNYP" + msgstr "SUNYP" + +-#: nis/nis_print.c:265 ++#: nis/nis_print.c:266 + #, c-format + msgid "Search Path : %s\n" + msgstr "Preh�ad�van� cesta : %s\n" + +-#: stdio-common/../sysdeps/unix/siglist.c:36 +-#: sysdeps/unix/sysv/linux/siglist.h:31 ++#: stdio-common/../sysdeps/unix/siglist.c:37 sysdeps/generic/siglist.h:38 + msgid "Segmentation fault" + msgstr "Chyba segment�cie" + +-#: nis/nis_error.c:35 ++#: nis/nis_error.c:36 + msgid "Server busy, try again" + msgstr "Server zanepr�zdnen�, sk�ste znovu" + +-#: nis/nis_error.c:41 ++#: nis/nis_error.c:42 + msgid "Server out of memory" + msgstr "Vy�erpan� pam� servera" + +-#: sunrpc/clnt_perr.c:277 ++#: sunrpc/clnt_perr.c:336 + msgid "Server rejected credential" + msgstr "Server odmietol opr�vnenie" + +-#: sunrpc/clnt_perr.c:281 ++#: sunrpc/clnt_perr.c:344 + msgid "Server rejected verifier" + msgstr "Server odmietol overenie" + +-#: posix/../sysdeps/posix/gai_strerror.c:38 ++#: posix/../sysdeps/posix/gai_strerror.c:39 + msgid "Servname not supported for ai_socktype" + msgstr "Servname nie je pre ai_socktype podporovan�" + +-#: argp/argp-parse.c:89 ++#: argp/argp-parse.c:95 + msgid "Set the program name" + msgstr "Nastavi� n�zov programu" + +-#: nscd/nscd.c:82 ++#: nscd/nscd.c:88 + msgid "Shut the server down" + msgstr "Zastavi� server" + +-#: stdio-common/../sysdeps/unix/siglist.c:25 ++#: stdio-common/../sysdeps/unix/siglist.c:26 + msgid "Signal 0" + msgstr "Sign�l 0" + + #. TRANS A file that isn't a socket was specified when a socket is required. +-#: stdio-common/../sysdeps/gnu/errlist.c:311 ++#: stdio-common/../sysdeps/gnu/errlist.c:312 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:125 + msgid "Socket operation on non-socket" + msgstr "Socketov� oper�cia na objekte, ktor� nie je socket" + + #. TRANS The socket type is not supported. +-#: stdio-common/../sysdeps/gnu/errlist.c:340 ++#: stdio-common/../sysdeps/gnu/errlist.c:341 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:151 + msgid "Socket type not supported" + msgstr "Typ socketu nie je podporovan�" + + #. TRANS A network connection was aborted locally. +-#: stdio-common/../sysdeps/gnu/errlist.c:394 ++#: stdio-common/../sysdeps/gnu/errlist.c:395 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:160 + msgid "Software caused connection abort" + msgstr "Software sp�sobil zru�enie spojenia" + +@@ -2274,15 +3369,16 @@ + msgid "Sorry. You are not root\n" + msgstr "Bohu�ia� - nie ste superu��vate�\n" + +-#: locale/programs/localedef.c:97 ++#: locale/programs/localedef.c:95 + msgid "Source definitions are found in FILE" + msgstr "Zdrojov� defin�cie sa nach�dzaj� v S�BORe" + +-#: stdio-common/../sysdeps/gnu/errlist.c:746 ++#: stdio-common/../sysdeps/gnu/errlist.c:765 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:99 + msgid "Srmount error" + msgstr "Chyba srmount" + +-#: sysdeps/unix/sysv/linux/siglist.h:59 ++#: sysdeps/generic/siglist.h:66 + msgid "Stack fault" + msgstr "Chyba z�sobn�ka" + +@@ -2290,73 +3386,75 @@ + #. TRANS system which is due to file system rearrangements on the server host. + #. TRANS Repairing this condition usually requires unmounting and remounting + #. TRANS the NFS file system on the local host. +-#: stdio-common/../sysdeps/gnu/errlist.c:506 ++#: stdio-common/../sysdeps/gnu/errlist.c:507 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:181 + msgid "Stale NFS file handle" + msgstr "Zastaral� odkaz na NFS s�bor" + +-#: nscd/nscd.c:81 ++#: nscd/nscd.c:87 + msgid "Start NUMBER threads" + msgstr "Spusti� PO�ET vl�kien" + +-#: nis/nis_print.c:357 ++#: nis/nis_print.c:362 + #, c-format + msgid "Status : %s\n" + msgstr "Stav : %s\n" + +-#: stdio-common/../sysdeps/unix/siglist.c:43 +-#: sysdeps/unix/sysv/linux/siglist.h:37 ++#: stdio-common/../sysdeps/unix/siglist.c:44 sysdeps/generic/siglist.h:44 + msgid "Stopped" + msgstr "Zastaven�" + +-#: stdio-common/../sysdeps/unix/siglist.c:42 +-#: sysdeps/unix/sysv/linux/siglist.h:36 ++#: stdio-common/../sysdeps/unix/siglist.c:43 sysdeps/generic/siglist.h:43 + msgid "Stopped (signal)" + msgstr "Zastaven� (sign�l)" + +-#: stdio-common/../sysdeps/unix/siglist.c:46 +-#: sysdeps/unix/sysv/linux/siglist.h:40 ++#: stdio-common/../sysdeps/unix/siglist.c:47 sysdeps/generic/siglist.h:47 + msgid "Stopped (tty input)" + msgstr "Zastaven� (vstup z termin�lu)" + +-#: stdio-common/../sysdeps/unix/siglist.c:47 +-#: sysdeps/unix/sysv/linux/siglist.h:41 ++#: stdio-common/../sysdeps/unix/siglist.c:48 sysdeps/generic/siglist.h:48 + msgid "Stopped (tty output)" + msgstr "Zastaven� (v�stup na termin�l)" + +-#: stdio-common/../sysdeps/gnu/errlist.c:790 ++#: stdio-common/../sysdeps/gnu/errlist.c:809 + msgid "Streams pipe error" + msgstr "Chyba r�ry pr�dov" + +-#: stdio-common/../sysdeps/gnu/errlist.c:794 ++#: stdio-common/../sysdeps/gnu/errlist.c:813 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:165 + msgid "Structure needs cleaning" + msgstr "�trukt�ra potrebuje opravu" + +-#: nis/nis_error.c:28 nis/ypclnt.c:763 nis/ypclnt.c:837 posix/regex.c:1012 +-#: stdio-common/../sysdeps/gnu/errlist.c:19 ++#: nis/nis_error.c:29 nis/ypclnt.c:786 nis/ypclnt.c:860 posix/regex.c:1084 ++#: stdio-common/../sysdeps/gnu/errlist.c:20 + msgid "Success" + msgstr "�spech" + ++#: nss/getent.c:703 ++msgid "Supported databases:" ++msgstr "Podporovan� datab�zy:" ++ + #: locale/programs/localedef.c:106 + msgid "Suppress warnings and information messages" + msgstr "Potla�i� varovn� a informa�n� spr�vy" + +-#: locale/programs/localedef.c:96 ++#: locale/programs/localedef.c:94 + msgid "Symbolic character names defined in FILE" + msgstr "Symbolick� n�zvy znakov s� definovan� v S�BORe" + +-#: posix/../sysdeps/posix/gai_strerror.c:40 ++#: posix/../sysdeps/posix/gai_strerror.c:41 + msgid "System error" + msgstr "Chyba syst�mu" + +-#: locale/programs/locale.c:63 ++#: locale/programs/locale.c:65 + msgid "System information:" + msgstr "Syst�mov� inform�cie:" + +-#: nis/ypclnt.c:843 ++#: nis/ypclnt.c:866 + msgid "System resource allocation failure" + msgstr "Pridelenie syst�mov�ch zdrojov zlyhalo" + +-#: locale/programs/localedef.c:384 ++#: locale/programs/localedef.c:292 + #, c-format + msgid "" + "System's directory for character maps : %s\n" +@@ -2369,21 +3467,28 @@ + " cestu locale : %s\n" + "%s" + +-#: nis/nis_print.c:117 ++#: nscd/nscd.c:90 ++msgid "TABLE" ++msgstr "TABU�KA" ++ ++#: nis/nis_print.c:118 + msgid "TABLE\n" + msgstr "TABU�KA\n" + +-#: nis/nis_print.c:262 ++#: nscd/nscd.c:92 ++msgid "TABLE,yes" ++msgstr "TABU�KA,�no" ++ ++#: nis/nis_print.c:263 + #, c-format + msgid "Table Type : %s\n" + msgstr "Typ tabu�ky : %s\n" + +-#: posix/../sysdeps/posix/gai_strerror.c:31 ++#: posix/../sysdeps/posix/gai_strerror.c:32 + msgid "Temporary failure in name resolution" + msgstr "Do�asn� chyba pri rie�en� n�zvu" + +-#: stdio-common/../sysdeps/unix/siglist.c:40 +-#: sysdeps/unix/sysv/linux/siglist.h:34 ++#: stdio-common/../sysdeps/unix/siglist.c:41 sysdeps/generic/siglist.h:41 + msgid "Terminated" + msgstr "Ukon�en�" + +@@ -2392,52 +3497,58 @@ + #. TRANS debugger to run a program is considered having it open for writing and + #. TRANS will cause this error. (The name stands for ``text file busy''.) This + #. TRANS is not an error in the GNU system; the text is copied as necessary. +-#: stdio-common/../sysdeps/gnu/errlist.c:197 ++#: stdio-common/../sysdeps/gnu/errlist.c:198 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:56 + msgid "Text file busy" + msgstr "Spustite�n� s�bor je pou��van�" + +-#: iconv/iconv_prog.c:536 ++#: iconv/iconv_prog.c:627 + msgid "" + "The following list contain all the coded character sets known. This does\n" + "not necessarily mean that all combinations of these names can be used for\n" + "the FROM and TO command line parameters. One coded character set can be\n" + "listed with several different names (aliases).\n" +-" Some of the names are no plain strings but instead regular expressions and\n" +-"they match a variety of names which can be given as parameters to the\n" +-"program.\n" + "\n" + " " + msgstr "" + "Nasleduj�ci zoznam obsahuje v�etky zn�me znakov� sady. To nutne neznamen�,\n" + "�e v�etky kombin�cie t�chto n�zvov m��u by� pou�it� pre argumenty Z a DO.\n" + "Jedna sada znakov m��e by� uveden� pod viacer�mi n�zvami (aliasmi).\n" +-" Niektor� z n�zvov nie s� oby�ajn� re�azce, ale regul�rne v�razy, ktor�\n" +-"�pecifikuj� mo�n� parametre programu.\n" + "\n" + " " + +-#: nis/nis_print.c:223 ++#: 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" ++ ++#: nis/nis_print.c:224 + msgid "Time to live : " + msgstr "�ivotnos� : " + +-#: stdio-common/../sysdeps/gnu/errlist.c:662 ++#: stdio-common/../sysdeps/gnu/errlist.c:681 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:92 + msgid "Timer expired" + msgstr "�asova� vypr�al" + +-#: nis/nis_error.c:55 +-msgid "Too Many Attributes" ++#: malloc/memusagestat.c:54 ++msgid "Title string used in output graphic" ++msgstr "Titulok pou�it� pre v�stupn� graf" ++ ++#: nis/nis_error.c:56 ++msgid "Too many attributes" + msgstr "Prive�a atrib�tov" + + #. TRANS Too many levels of symbolic links were encountered in looking up a file name. + #. TRANS This often indicates a cycle of symbolic links. +-#: stdio-common/../sysdeps/gnu/errlist.c:457 ++#: stdio-common/../sysdeps/gnu/errlist.c:458 + msgid "Too many levels of symbolic links" + msgstr "Prive�a �rovn� symbolick�ch odkazov" + + #. TRANS Too many links; the link count of a single file would become too large. + #. TRANS @code{rename} can cause this error if the file being renamed already has + #. TRANS as many links as it can take (@pxref{Renaming Files}). +-#: stdio-common/../sysdeps/gnu/errlist.c:225 ++#: stdio-common/../sysdeps/gnu/errlist.c:226 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:61 + msgid "Too many links" + msgstr "Prive�a odkazov" + +@@ -2448,54 +3559,57 @@ + #. TRANS limit that can usually be increased. If you get this error, you might + #. TRANS want to increase the @code{RLIMIT_NOFILE} limit or make it unlimited; + #. TRANS @pxref{Limits on Resources}. +-#: stdio-common/../sysdeps/gnu/errlist.c:175 ++#: stdio-common/../sysdeps/gnu/errlist.c:176 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:54 + msgid "Too many open files" + msgstr "Prive�a otvoren�ch s�borov" + + #. TRANS There are too many distinct file openings in the entire system. Note + #. TRANS that any number of linked channels count as just one file opening; see + #. TRANS @ref{Linked Channels}. This error never occurs in the GNU system. +-#: stdio-common/../sysdeps/gnu/errlist.c:182 ++#: stdio-common/../sysdeps/gnu/errlist.c:183 + msgid "Too many open files in system" + msgstr "Prive�a otvoren�ch s�borov v syst�me" + + #. TRANS This means that the per-user limit on new process would be exceeded by + #. TRANS an attempted @code{fork}. @xref{Limits on Resources}, for details on + #. TRANS the @code{RLIMIT_NPROC} limit. +-#: stdio-common/../sysdeps/gnu/errlist.c:487 ++#: stdio-common/../sysdeps/gnu/errlist.c:488 + msgid "Too many processes" + msgstr "Prive�a procesov" + + #. TRANS ??? +-#: stdio-common/../sysdeps/gnu/errlist.c:439 ++#: stdio-common/../sysdeps/gnu/errlist.c:440 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:174 + msgid "Too many references: cannot splice" + msgstr "Prive�a odkazov - nie je mo�n� rozdeli�" + + #. TRANS The file quota system is confused because there are too many users. + #. TRANS @c This can probably happen in a GNU system when using NFS. +-#: stdio-common/../sysdeps/gnu/errlist.c:493 ++#: stdio-common/../sysdeps/gnu/errlist.c:494 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:124 + msgid "Too many users" + msgstr "Prive�a pou��vate�ov" + +-#: stdio-common/../sysdeps/unix/siglist.c:30 +-#: sysdeps/unix/sysv/linux/siglist.h:26 ++#: stdio-common/../sysdeps/unix/siglist.c:31 sysdeps/generic/siglist.h:33 + msgid "Trace/breakpoint trap" + msgstr "Trasovacie/ladiace preru�enie" + +-#: posix/regex.c:1017 ++#: posix/regex.c:1099 + msgid "Trailing backslash" + msgstr "Koncov� sp�tn� lom�tko" + + #. TRANS In the GNU system, opening a file returns this error when the file is + #. TRANS translated by a program and the translator program dies while starting + #. TRANS up, before it has connected to the file. +-#: stdio-common/../sysdeps/gnu/errlist.c:596 ++#: stdio-common/../sysdeps/gnu/errlist.c:615 + msgid "Translator died" + msgstr "Prekladac� program skon�il" + + #. TRANS You tried to connect a socket that is already connected. + #. TRANS @xref{Connecting}. +-#: stdio-common/../sysdeps/gnu/errlist.c:414 ++#: stdio-common/../sysdeps/gnu/errlist.c:415 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:163 + msgid "Transport endpoint is already connected" + msgstr "Koncov� komunika�n� bod je u� spojen�" + +@@ -2503,139 +3617,139 @@ + #. TRANS try to transmit data over a socket, without first specifying a + #. TRANS destination for the data. For a connectionless socket (for datagram + #. TRANS protocols, such as UDP), you get @code{EDESTADDRREQ} instead. +-#: stdio-common/../sysdeps/gnu/errlist.c:422 ++#: stdio-common/../sysdeps/gnu/errlist.c:423 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:164 + msgid "Transport endpoint is not connected" + msgstr "Koncov� komunika�n� bod nie je spojen�" + +-#: argp/argp-help.c:1610 ++#: argp/argp-help.c:1611 + #, c-format + msgid "Try `%s --help' or `%s --usage' for more information.\n" + msgstr "Pou�ite `%s --help' alebo `%s --usage' pre viac inform�ci�.\n" + +-#: inet/rcmd.c:143 +-#, c-format +-msgid "Trying %s...\n" +-msgstr "Sk��am %s...\n" +- +-#: nis/nis_print.c:163 ++#: nis/nis_print.c:164 + #, c-format + msgid "Type : %s\n" + msgstr "Typ : %s\n" + +-#: nis/nis_print.c:47 ++#: nis/nis_print.c:48 + msgid "UNKNOWN" + msgstr "NEZNAMY" + +-#: nis/nis_error.c:72 ++#: nis/nis_error.c:73 + msgid "Unable to authenticate NIS+ client" + msgstr "Nie je mo�n� overi� toto�nos� NIS+ klienta" + +-#: nis/nis_error.c:71 ++#: nis/nis_error.c:72 + msgid "Unable to authenticate NIS+ server" + msgstr "Nie je mo�n� overi� toto�nos� NIS+ servera" + +-#: nis/nis_error.c:46 ++#: nis/nis_error.c:47 + msgid "Unable to create callback" + msgstr "Nie je mo�n� vytvori� sp�tn� volanie" + +-#: nis/nis_error.c:74 ++#: nis/nis_error.c:75 + msgid "Unable to create process on server" + msgstr "Nie je mo�n� vytvori� proces na serveri" + +-#: nis/nis_print.c:190 ++#: nis/nis_print.c:191 + #, c-format + msgid "Unknown (type = %d, bits = %d)\n" + msgstr "Nezn�me (typ = %d, bitov = %d)\n" + +-#: inet/ruserpass.c:248 ++#: inet/ruserpass.c:274 + #, c-format + msgid "Unknown .netrc keyword %s" + msgstr "Nezn�me k���ov� slovo v .netrc: %s" + +-#: nis/ypclnt.c:797 ++#: elf/../sysdeps/generic/readelflib.c:69 ++#, c-format ++msgid "Unknown ELFCLASS in file %s.\n" ++msgstr "Nezn�ma ELFCLASS v s�bore %s.\n" ++ ++#: nis/ypclnt.c:820 + msgid "Unknown NIS error code" + msgstr "Nezn�my chybov� k�d NIS" + +-#: nss/getent.c:505 ++#: nss/getent.c:771 + #, c-format + msgid "Unknown database: %s\n" + msgstr "Nezn�ma datab�za %s\n" + +-#: posix/../sysdeps/posix/gai_strerror.c:51 ++#: posix/../sysdeps/posix/gai_strerror.c:52 + msgid "Unknown error" + msgstr "Nezn�ma chyba" + + #: string/../sysdeps/generic/_strerror.c:48 +-#: string/../sysdeps/mach/_strerror.c:86 +-#: sysdeps/mach/hurd/mips/dl-machine.c:82 ++#: string/../sysdeps/mach/_strerror.c:88 ++#: sysdeps/mach/hurd/mips/dl-machine.c:83 + msgid "Unknown error " + msgstr "Nezn�ma chyba " + +-#: resolv/herror.c:74 ++#: resolv/herror.c:68 + msgid "Unknown host" + msgstr "Nezn�my po��ta�" + +-#: nis/nis_error.c:34 ++#: nis/nis_error.c:35 + msgid "Unknown object" + msgstr "Nezn�my objekt" + +-#: nscd/nscd_conf.c:181 ++#: nscd/nscd_conf.c:187 + #, c-format + msgid "Unknown option: %s %s %s" + msgstr "Nezn�ma vo�ba: %s %s %s" + +-#: resolv/herror.c:120 ++#: resolv/herror.c:110 + msgid "Unknown resolver error" + msgstr "Nezn�ma chyba resolvera" + +-#: resolv/herror.c:76 ++#: resolv/herror.c:70 + msgid "Unknown server error" + msgstr "Nezn�ma chyba servera" + +-#: string/strsignal.c:70 ++#: string/strsignal.c:71 + #, c-format + msgid "Unknown signal %d" + msgstr "Nezn�my sign�l %d" + +-#: misc/error.c:107 ++#: misc/error.c:114 timezone/zic.c:384 + msgid "Unknown system error" + msgstr "Nezn�ma chyba syst�mu" + +-#: nis/ypclnt.c:845 ++#: nis/ypclnt.c:868 + msgid "Unknown ypbind error" + msgstr "Nezn�ma chyba ypbind" + +-#: posix/regex.c:1020 ++#: posix/regex.c:1108 + msgid "Unmatched ( or \\(" + msgstr "Nep�rov� ( or \\(" + +-#: posix/regex.c:1028 ++#: posix/regex.c:1132 + msgid "Unmatched ) or \\)" + msgstr "Nep�rov� ) or \\)" + +-#: posix/regex.c:1019 ++#: posix/regex.c:1105 + msgid "Unmatched [ or [^" + msgstr "Nep�rov� [ or [^" + +-#: posix/regex.c:1021 ++#: posix/regex.c:1111 + msgid "Unmatched \\{" + msgstr "Nep�rov� \\{" + +-#: posix/getconf.c:692 ++#: posix/getconf.c:819 + #, c-format + msgid "Unrecognized variable `%s'" + msgstr "Nerozpoznan� premenn� `%s'" + +-#: stdio-common/../sysdeps/unix/siglist.c:41 +-#: sysdeps/unix/sysv/linux/siglist.h:35 ++#: stdio-common/../sysdeps/unix/siglist.c:42 sysdeps/generic/siglist.h:42 + msgid "Urgent I/O condition" + msgstr "Urgentn� V/V stav" + +-#: argp/argp-help.c:1567 ++#: argp/argp-help.c:1568 + msgid "Usage:" + msgstr "Pou�itie:" + +-#: posix/getconf.c:604 ++#: posix/getconf.c:731 + #, c-format + msgid "Usage: %s variable_name [pathname]\n" + msgstr "Pou�itie: %s meno_premennej [cesta]\n" +@@ -2644,1031 +3758,1117 @@ + msgid "Usage: rpcinfo [ -n portnum ] -u host prognum [ versnum ]\n" + msgstr "Pou�itie: rpcinfo [ -n ��slo_portu ] -u po��ta� ��slo_programu [ ��slo_verzie ]\n" + +-#: stdio-common/../sysdeps/unix/siglist.c:55 +-#: sysdeps/unix/sysv/linux/siglist.h:48 ++#: elf/ldconfig.c:132 ++msgid "Use CACHE as cache file" ++msgstr "Pou�i� CACHE ako cache s�bor" ++ ++#: elf/ldconfig.c:133 ++msgid "Use CONF as configuration file" ++msgstr "Pou�i� CONF ako konfigura�n� s�bor" ++ ++#: nscd/nscd.c:92 ++msgid "Use separate cache for each user" ++msgstr "Pou�i� samostatn� cache pre ka�d�ho pou��vate�a" ++ ++#: stdio-common/../sysdeps/unix/siglist.c:56 sysdeps/generic/siglist.h:55 + msgid "User defined signal 1" + msgstr "Pou��vate�om definovan� sign�l 1" + +-#: stdio-common/../sysdeps/unix/siglist.c:56 +-#: sysdeps/unix/sysv/linux/siglist.h:49 ++#: stdio-common/../sysdeps/unix/siglist.c:57 sysdeps/generic/siglist.h:56 + msgid "User defined signal 2" + msgstr "Pou��vate�om definovan� sign�l 2" + +-#: stdio-common/../sysdeps/gnu/errlist.c:654 ++#: stdio-common/../sysdeps/gnu/errlist.c:673 ++#: stdio-common/../sysdeps/unix/sysv/sysv4/solaris2/sparc/errlist.c:109 + msgid "Value too large for defined data type" + msgstr "Hodnota je pre dan� d�tov� typ prive�k�" + +-#: stdio-common/../sysdeps/unix/siglist.c:51 +-#: sysdeps/unix/sysv/linux/siglist.h:45 ++#: stdio-common/../sysdeps/unix/siglist.c:52 sysdeps/generic/siglist.h:52 + msgid "Virtual timer expired" + msgstr "Vypr�al virtu�lny �asova�" + +-#: timezone/zic.c:1899 ++#: timezone/zic.c:1926 + msgid "Wild result from command execution" + msgstr "�udn� v�sledok vykonania programu" + +-#: stdio-common/../sysdeps/unix/siglist.c:53 +-#: sysdeps/unix/sysv/linux/siglist.h:47 ++#: stdio-common/../sysdeps/unix/siglist.c:54 sysdeps/generic/siglist.h:54 + msgid "Window changed" + msgstr "Okno sa zmenilo" + +-#: locale/programs/locale.c:67 ++#: locale/programs/locale.c:69 + msgid "Write names of available charmaps" + msgstr "Vyp�sa� n�zvy dostupn�ch znakov�ch s�d" + +-#: locale/programs/locale.c:65 ++#: locale/programs/locale.c:67 + msgid "Write names of available locales" + msgstr "Vyp�sa� n�zvy dostupn�ch n�rodn�ch prostred�" + +-#: locale/programs/locale.c:69 ++#: locale/programs/locale.c:71 + msgid "Write names of selected categories" + msgstr "Vyp�sa� n�zvy vybran�ch kateg�ri�" + +-#: locale/programs/locale.c:70 ++#: locale/programs/locale.c:72 + msgid "Write names of selected keywords" + msgstr "Vyp�sa� n�zvy vybran�ch k���ov�ch slov" + +-#: catgets/gencat.c:110 db2/makedb.c:59 ++#: catgets/gencat.c:115 + msgid "Write output to file NAME" + msgstr "Zap�sa� v�stup do s�boru S�BOR" + +-#: catgets/gencat.c:241 db2/makedb.c:247 elf/sprof.c:365 +-#: iconv/iconv_prog.c:299 locale/programs/locale.c:272 +-#: locale/programs/localedef.c:408 nscd/nscd.c:228 nss/getent.c:70 +-#: posix/getconf.c:629 ++#: elf/cache.c:366 elf/cache.c:375 elf/cache.c:379 ++msgid "Writing of cache data failed" ++msgstr "Z�pi �dajov do cache zlyhal" ++ ++#: elf/cache.c:383 ++msgid "Writing of cache data failed." ++msgstr "Z�pi �dajov do cache zlyhal." ++ ++#: catgets/gencat.c:251 elf/ldconfig.c:269 elf/sprof.c:361 ++#: iconv/iconv_prog.c:356 locale/programs/locale.c:274 ++#: locale/programs/localedef.c:316 nscd/nscd.c:292 nscd/nscd_nischeck.c:95 ++#: nss/getent.c:68 posix/getconf.c:756 + #, c-format + msgid "Written by %s.\n" + msgstr "Autor: %s.\n" + +-#: stdio-common/../sysdeps/gnu/errlist.c:818 ++#: stdio-common/../sysdeps/gnu/errlist.c:837 + msgid "Wrong medium type" + msgstr "Chybn� typ m�dia" + +-#: nis/nis_print.c:39 ++#: nis/nis_print.c:40 + msgid "X500" + msgstr "X500" + +-#: nis/nis_print.c:43 ++#: nis/nis_print.c:44 + msgid "XCHS" + msgstr "XCHS" + +-#: nis/ypclnt.c:185 ++#: nis/ypclnt.c:174 + #, c-format + msgid "YPBINDPROC_DOMAIN: %s\n" + msgstr "YPBINDPROC_DOMAIN: %s\n" + +-#: nis/nis_error.c:70 ++#: nis/nis_error.c:71 + msgid "Yes, 42 is the meaning of life" + msgstr "�no, 42 je v�znam �ivota" + + #. TRANS You did @strong{what}? +-#: stdio-common/../sysdeps/gnu/errlist.c:608 ++#: stdio-common/../sysdeps/gnu/errlist.c:627 + msgid "You really blew it this time" + msgstr "Tentokr�t si to skuto�ne poondial" + +-#: timezone/zic.c:1063 ++#: timezone/zic.c:1088 + msgid "Zone continuation line end time is not after end time of previous line" + msgstr "Koncov� �as pokra�ovacieho riadku z�ny nie je v��� ako koncov� �as predch�dzaj�ceho riadku" + +-#: iconv/iconv_prog.c:70 ++#: iconv/iconv_prog.c:73 + msgid "[FILE...]" + msgstr "[S�BOR...]" + +-#: locale/programs/charmap.c:481 locale/programs/locfile.c:471 +-#: locale/programs/repertoire.c:278 ++#: debug/pcprofiledump.c:59 ++msgid "[FILE]" ++msgstr "[S�BOR]" ++ ++#: sunrpc/pmap_clnt.c:72 ++msgid "__get_myaddress: ioctl (get interface configuration)" ++msgstr "__get_myaddress: ioctl (z�skanie konfigur�cie rozhrania)" ++ ++#: locale/programs/ld-collate.c:417 ++#, c-format ++msgid "`%.*s' already defined as collating element" ++msgstr "`%.*s' bol u� definovan� ako element triedenia" ++ ++#: locale/programs/ld-collate.c:410 ++#, c-format ++msgid "`%.*s' already defined as collating symbol" ++msgstr "`%.*s' bol u� definovan� ako symbol triedenia" ++ ++#: locale/programs/ld-collate.c:394 ++#, c-format ++msgid "`%.*s' already defined in charmap" ++msgstr "`%.*s' bol u� definovan� v znakovej mape" ++ ++#: locale/programs/ld-collate.c:403 ++#, c-format ++msgid "`%.*s' already defined in repertoire" ++msgstr "`%.*s' bol u� definovan� v reperto�ri" ++ ++#: locale/programs/charmap.c:599 locale/programs/locfile.h:96 ++#: locale/programs/repertoire.c:314 + #, c-format + msgid "`%1$s' definition does not end with `END %1$s'" + msgstr "Defin�cia `%1$s' nekon�� `END %1$s'" + +-#: elf/sprof.c:766 ++#: locale/programs/ld-collate.c:1268 locale/programs/ld-ctype.c:1454 + #, c-format +-msgid "`%s' is no correct profile data file for `%s'" +-msgstr "`%s' nie s� spr�vne profilovacie �daje pre `%s'" ++msgid "`%s' and `%.*s' are no valid names for symbolic range" ++msgstr "`%s' a `%.*s' s� nepr�pustn� n�zvy pre symbolick� rozsah" + +-#: locale/programs/ld-monetary.c:369 locale/programs/ld-numeric.c:193 ++#: elf/sprof.c:762 + #, c-format +-msgid "`-1' must be last entry in `%s' field in `%s' category" +-msgstr "`-1' mus� by� posledn�m z�znamom v poli `%s' kateg�rie `%s'" ++msgid "`%s' is no correct profile data file for `%s'" ++msgstr "`%s' nie s� spr�vne profilovacie �daje pre `%s'" + +-#: locale/programs/ld-collate.c:1666 +-msgid "`...' must only be used in `...' and `UNDEFINED' entries" +-msgstr "`...' m��e by� pou�it� iba v z�znamoch `...' a `UNDEFINED'" +- +-#: locale/programs/locfile.c:668 +-msgid "`from' expected after first argument to `collating-element'" +-msgstr "`from' je o�ak�van� po prvom argumente `collating-element'" +- +-#: locale/programs/ld-collate.c:1118 +-msgid "`from' string in collation element declaration contains unknown character" +-msgstr "`from' re�azec v deklar�cii elementu triedenia obsahuje nezn�my znak" ++#: locale/programs/ld-ctype.c:691 ++msgid "`digit' category has not entries in groups of ten" ++msgstr "kateg�ria `digit' neobsahuje z�znamy v skupin�ch po desiatich" + +-#: posix/../sysdeps/posix/gai_strerror.c:34 ++#: posix/../sysdeps/posix/gai_strerror.c:35 + msgid "ai_family not supported" + msgstr "ai_family nie je podporovan�" + +-#: posix/../sysdeps/posix/gai_strerror.c:39 ++#: posix/../sysdeps/posix/gai_strerror.c:40 + msgid "ai_socktype not supported" + msgstr "ai_socktype nie je podporovan�" + +-#: nscd/nscd.c:121 ++#: nscd/nscd.c:130 + msgid "already running" + msgstr "u� be��" + +-#: locale/programs/charmap.c:352 locale/programs/repertoire.c:152 ++#: locale/programs/charmap.c:434 locale/programs/repertoire.c:184 + #, c-format + msgid "argument to <%s> must be a single character" + msgstr "argument pre <%s> mus� by� jeden znak" + +-#: locale/programs/locfile.c:240 ++#: locale/programs/locfile.c:124 + #, c-format + msgid "argument to `%s' must be a single character" + msgstr "argument pre `%s' mus� by� jeden znak" + +-#: sunrpc/auth_unix.c:321 ++#: sunrpc/auth_unix.c:311 + msgid "auth_none.c - Fatal marshalling problem" + msgstr "auth_none.c - Fat�lna chyba marshallingu" + +-#: sunrpc/auth_unix.c:116 sunrpc/auth_unix.c:122 sunrpc/auth_unix.c:151 ++#: sunrpc/auth_unix.c:106 sunrpc/auth_unix.c:112 sunrpc/auth_unix.c:142 + msgid "authunix_create: out of memory\n" + msgstr "authunix_create: nedostatok pam�ti\n" + +-#: locale/programs/charmap.c:297 locale/programs/locfile.c:234 +-#: locale/programs/locfile.c:261 locale/programs/repertoire.c:144 ++#: locale/programs/charmap.c:364 locale/programs/locfile.c:118 ++#: locale/programs/locfile.c:145 locale/programs/repertoire.c:176 + msgid "bad argument" + msgstr "chybn� argument" + +-#: inet/rcmd.c:318 ++#: inet/rcmd.c:424 + msgid "bad owner" + msgstr "chybn� vlastn�k" + +-#: timezone/zic.c:1185 ++#: timezone/zic.c:1210 + msgid "blank FROM field on Link line" + msgstr "pr�zdne pole OD v riadku Link" + +-#: timezone/zic.c:1189 ++#: timezone/zic.c:1214 + msgid "blank TO field on Link line" + msgstr "pr�zdne pole DO v riadku Link" + +-#: malloc/mcheck.c:208 ++#: malloc/mcheck.c:291 + msgid "block freed twice\n" + msgstr "blok uvo�nen� dvakr�t\n" + +-#: malloc/mcheck.c:211 ++#: malloc/mcheck.c:294 + msgid "bogus mcheck_status, library is buggy\n" + msgstr "pochybn� mcheck_status, kni�nica m� chyby\n" + +-#: sunrpc/pmap_rmt.c:185 ++#: sunrpc/pmap_rmt.c:186 + msgid "broadcast: ioctl (get interface configuration)" + msgstr "broadcast: ioctl (z�skanie konfigur�cie rozhrania)" + +-#: sunrpc/pmap_rmt.c:194 ++#: sunrpc/pmap_rmt.c:195 + msgid "broadcast: ioctl (get interface flags)" + msgstr "broadcast: ioctl (z�skanie nastaven� rozhrania)" + +-#: login/programs/request.c:167 +-msgid "buffer overflow" +-msgstr "prete�enie vyrovn�vacej pam�ti" +- +-#: sunrpc/svc_udp.c:446 ++#: sunrpc/svc_udp.c:528 + msgid "cache_set: could not allocate new rpc_buffer" + msgstr "cache_set: nebolo mo�n� prideli� rpc vyrovn�vaciu pam�" + +-#: sunrpc/svc_udp.c:440 ++#: sunrpc/svc_udp.c:522 + msgid "cache_set: victim alloc failed" + msgstr "cache_set: obe� nen�jden�" + +-#: sunrpc/svc_udp.c:429 ++#: sunrpc/svc_udp.c:511 + msgid "cache_set: victim not found" + msgstr "cache_set: obe� nen�jden�" + +-#: timezone/zic.c:1726 ++#: timezone/zic.c:1751 + msgid "can't determine time zone abbreviation to use just after until time" + msgstr "nie je mo�n� n�js� skratku �asovej z�ny pre pou�itie hne� po koncovom �ase" + +-#: sunrpc/svc_simple.c:75 ++#: sunrpc/svc_simple.c:76 + #, c-format +-msgid "can't reassign procedure number %d\n" +-msgstr "nie je mo�n� znovu prideli� ��slo proced�ry %d\n" ++msgid "can't reassign procedure number %ld\n" ++msgstr "nie je mo�n� znovu prideli� ��slo proced�ry %ld\n" ++ ++#: elf/dl-reloc.c:152 ++msgid "can't restore segment prot after reloc" ++msgstr "nie je mo�n� obnovi� segment prot po relok�cii" + +-#: locale/programs/localedef.c:279 ++#: locale/programs/localedef.c:487 + #, c-format +-msgid "cannot `stat' locale file `%s'" +-msgstr "nie je mo�n� vykona� `stat' pre s�bor n�rodn�ho prostredia `%s'" ++msgid "cannot add already read locale `%s' a second time" ++msgstr "nie je mo�n� znovu prida� u� na��tan� prostredie `%s'" + +-#: elf/sprof.c:935 elf/sprof.c:987 ++#: elf/dl-deps.c:470 ++msgid "cannot allocate dependency list" ++msgstr "nie je mo�n� prideli� pam� pre zoznam z�vislost�" ++ ++#: elf/dl-load.c:1031 ++msgid "cannot allocate memory for program header" ++msgstr "nie je mo�n� prideli� pam� pre hlavi�ku programu" ++ ++#: elf/dl-load.c:339 ++msgid "cannot allocate name record" ++msgstr "nie je mo�n� prideli� pam� pre z�znam n�zvu" ++ ++#: elf/sprof.c:930 elf/sprof.c:982 + msgid "cannot allocate symbol data" + msgstr "nie je mo�n� prideli� pam� pre symbolick� �daje" + +-#: elf/sprof.c:719 elf/sprof.c:777 ++#: elf/dl-deps.c:501 ++msgid "cannot allocate symbol search list" ++msgstr "nie je mo�n� prideli� pam� pre vyh�ad�vac� zoznam symbolov" ++ ++#: elf/dl-version.c:291 ++msgid "cannot allocate version reference table" ++msgstr "nie je mo�n� prideli� pam� pre referen�n� tabu�ku verzi�" ++ ++#: elf/dl-load.c:1000 ++msgid "cannot change memory protections" ++msgstr "nie je mo�n� zmeni� ochranu pam�ti" ++ ++#: elf/dl-load.c:533 ++msgid "cannot create RUNPATH/RPATH copy" ++msgstr "nie je mo�n� vytvori� k�piu RUNPATH/RPATH" ++ ++#: elf/dl-load.c:418 elf/dl-load.c:518 elf/dl-load.c:546 elf/dl-load.c:593 ++#: elf/dl-load.c:685 ++msgid "cannot create cache for search path" ++msgstr "Nie je mo�n� vytvori� cache pre h�adanie v ceste" ++ ++#: elf/dl-support.c:191 ++msgid "cannot create capability list" ++msgstr "nie je mo�n� vytvori� zoznam schopnost�" ++ ++#: elf/sprof.c:715 elf/sprof.c:773 + msgid "cannot create internal descriptor" + msgstr "nie je mo�n� vytvori� intern� deskriptor" + +-#: elf/sprof.c:417 ++#: elf/sprof.c:413 + msgid "cannot create internal descriptors" + msgstr "nie je mo�n� vytvori� intern� deskriptory" + +-#: nscd/connections.c:180 ++#: elf/dl-load.c:583 ++msgid "cannot create search path array" ++msgstr "nie je mo�n� vytvori� pole ciest" ++ ++#: elf/dl-load.c:1137 ++msgid "cannot create searchlist" ++msgstr "nie je mo�n� vytvori� vyh�ad�vac� zoznam" ++ ++#: elf/dl-load.c:822 elf/dl-load.c:1682 ++msgid "cannot create shared object descriptor" ++msgstr "nie je mo�n� vytvori� deskriptor zdie�an�ho objektu" ++ ++#: catgets/gencat.c:1316 ++msgid "cannot determine escape character" ++msgstr "nie je mo�n� ur�i� znak escape" ++ ++#: elf/dl-load.c:950 ++msgid "cannot dynamically load executable" ++msgstr "nie je mo�n� dynamicky na��ta� spustite�n� s�bor" ++ ++#: nscd/connections.c:183 + #, c-format + msgid "cannot enable socket to accept connections: %s" + msgstr "nie je mo�n� povoli� socketu prij�ma� spojenia: %s" + +-#: sunrpc/rpc_main.c:342 ++#: elf/dl-open.c:121 ++msgid "cannot extend global scope" ++msgstr "nie je mo�n� roz��ri� glob�lny rozsah" ++ ++#: sunrpc/rpc_main.c:343 + #, c-format + msgid "cannot find C preprocessor: %s \n" + msgstr "nie je mo�n� n�js� preprocesor: %s \n" + +-#: sunrpc/rpc_main.c:350 ++#: sunrpc/rpc_main.c:351 + msgid "cannot find any C preprocessor (cpp)\n" + msgstr "nie je mo�n� n�js� �iadny C preprocesor (cpp)\n" + +-#: nscd/connections.c:205 ++#: nscd/connections.c:225 + #, 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" + +-#: locale/programs/ld-collate.c:1324 +-#, c-format +-msgid "cannot insert collation element `%.*s'" +-msgstr "nie je mo�n� vlo�i� element triedenia `%.*s'" +- +-#: locale/programs/ld-collate.c:1503 locale/programs/ld-collate.c:1510 +-msgid "cannot insert into result table" +-msgstr "nie je mo�n� vklada� do v�slednej tabu�ky" +- +-#: locale/programs/ld-collate.c:1175 locale/programs/ld-collate.c:1218 +-#, c-format +-msgid "cannot insert new collating symbol definition: %s" +-msgstr "nie je mo�n� vlo�i� nov� symbol triedenia: %s" +- +-#: elf/sprof.c:674 ++#: elf/sprof.c:670 + msgid "cannot load profiling data" + msgstr "nie je mo�n� na��ta� profilovacie �daje" + +-#: inet/rcmd.c:314 ++#: elf/dl-deps.c:586 ++msgid "cannot load shared object file" ++msgstr "nepodarilo sa na��ta� s�bor zdie�an�ho objektu" ++ ++#: elf/dl-reloc.c:63 ++msgid "cannot make segment writable for relocation" ++msgstr "nie je mo�n� zmeni� segment na zapisovate�n� pre relok�ciu" ++ ++#: elf/dl-load.c:1016 ++msgid "cannot map zero-fill pages" ++msgstr "nie je mo�n� namapova� str�nky vyplnen� nulami" ++ ++#: inet/rcmd.c:420 + msgid "cannot open" + msgstr "nie je mo�n� otvori�" + + #: sysdeps/unix/sysv/linux/lddlibc4.c:64 + #, c-format +-msgid "cannot open" +-msgstr "nie je mo�n� otvori�" ++msgid "cannot open `%s'" ++msgstr "nie je mo�n� otvori� `%s'" + +-#: db2/makedb.c:146 +-#, c-format +-msgid "cannot open database file `%s': %s" +-msgstr "nie je mo�n� otvori� datab�zov� s�bor `%s': %s" ++#: debug/pcprofiledump.c:96 ++msgid "cannot open input file" ++msgstr "nie je mo�n� otvori� vstupn� s�bor" + +-#: catgets/gencat.c:272 db2/makedb.c:167 iconv/iconv_prog.c:177 ++#: catgets/gencat.c:288 iconv/iconv_prog.c:225 + #, c-format + msgid "cannot open input file `%s'" + msgstr "nie je mo�n� otvori� vstupn� s�bor `%s'" + +-#: locale/programs/localedef.c:198 ++#: locale/programs/localedef.c:203 locale/programs/localedef.c:218 ++#: locale/programs/localedef.c:513 locale/programs/localedef.c:533 + #, c-format + msgid "cannot open locale definition file `%s'" + msgstr "nie je mo�n� otvori� s�bor defin�cie n�rodn�ho prostredia `%s'" + +-#: iconv/iconv_prog.c:155 ++#: iconv/iconv_prog.c:194 + msgid "cannot open output file" + msgstr "nie je mo�n� otvori� v�stupn� s�bor" + +-#: catgets/gencat.c:774 catgets/gencat.c:815 db2/makedb.c:181 ++#: catgets/gencat.c:944 catgets/gencat.c:985 + #, c-format + msgid "cannot open output file `%s'" + msgstr "nie je mo�n� otvori� v�stupn� s�bor `%s'" + +-#: locale/programs/locfile.c:1129 ++#: locale/programs/locfile.c:381 + #, c-format + msgid "cannot open output file `%s' for category `%s'" + msgstr "nie je mo�n� otvori� v�stupn� s�bor `%s' pre kateg�riu `%s'" + +-#: nscd/connections.c:162 ++#: elf/dl-load.c:1695 ++msgid "cannot open shared object file" ++msgstr "nie je mo�n� otvori� s�bor zdie�an�ho objektu" ++ ++#: nscd/connections.c:165 + #, c-format + msgid "cannot open socket: %s" + msgstr "nie je mo�n� otvori� socket `%s'" + +-#: locale/programs/ld-collate.c:1370 +-msgid "cannot process order specification" +-msgstr "nie je mo�n� spracova� �pecifik�ciu poradia" ++#: elf/dl-load.c:814 ++msgid "cannot open zero fill device" ++msgstr "nie je mo�n� otvori� zariadenie pre naplnenie nulami" + +-#: locale/programs/locale.c:449 ++#: locale/programs/charmap-dir.c:61 + #, c-format + msgid "cannot read character map directory `%s'" + msgstr "nie je mo�n� na��ta� adres�r znakov�ch s�d `%s'" + +-#: nscd/connections.c:122 ++#: nscd/connections.c:125 + msgid "cannot read configuration file; this is fatal" + msgstr "nie je mo�n� na��ta� konfigura�n� s�bor; to je fat�lne" + +-#: login/programs/request.c:91 +-msgid "cannot read from client" +-msgstr "nie je mo�n� ��ta� od klienta" ++#: elf/dl-load.c:838 elf/dl-load.c:1244 ++msgid "cannot read file data" ++msgstr "nie je mo�n� na��ta� �daje s�boru" ++ ++#: debug/pcprofiledump.c:102 ++msgid "cannot read header" ++msgstr "nie je mo�n� pre��ta� hlavi�ku" + + #: sysdeps/unix/sysv/linux/lddlibc4.c:68 + #, c-format + msgid "cannot read header from `%s'" + msgstr "nie je mo�n� pre��ta� hlavi�ku z `%s'" + +-#: locale/programs/locale.c:306 ++#: locale/programs/locale.c:308 + #, c-format + msgid "cannot read locale directory `%s'" + msgstr "nie je mo�n� na��ta� adres�r n�rodn�ch prostred� `%s'" + +-#: locale/programs/localedef.c:303 +-#, c-format +-msgid "cannot read locale file `%s'" +-msgstr "nie je mo�n� pre��ta� s�bor n�rodn�ho prostredia `%s'" +- +-#: locale/programs/locfile.c:288 locale/programs/locfile.c:306 +-#: locale/programs/locfile.c:324 locale/programs/locfile.c:342 +-#: locale/programs/locfile.c:360 locale/programs/locfile.c:378 +-#, c-format +-msgid "cannot read repertoire map `%s'" +-msgstr "nie je mo�n� na��ta� mapu reperto�ru `%s'" +- +-#: nscd/nscd_stat.c:127 ++#: nscd/nscd_stat.c:128 + msgid "cannot read statistics data" + msgstr "nie je mo�n� na��ta� �tatistick� �daje" + +-#: nscd/cache.c:141 nscd/connections.c:148 ++#: locale/programs/repertoire.c:331 ++msgid "cannot safe new repertoire map" ++msgstr "nie je mo�n� uchova� mapu reperto�ru" ++ ++#: elf/dl-load.c:776 ++msgid "cannot stat shared object" ++msgstr "nepodarilo sa zisti� stav zdie�an�ho objektu" ++ ++#: nscd/cache.c:150 nscd/connections.c:151 + #, c-format + msgid "cannot stat() file `%s': %s" + msgstr "nie je mo�n� vykona� stat() s�boru `%s': %s" + +-#: locale/programs/localedef.c:328 ++#: locale/programs/localedef.c:230 + #, c-format + msgid "cannot write output files to `%s'" + msgstr "nie je mo�n� zap�sa� v�stupn� s�bory do `%s'" + +-#: nscd/connections.c:229 nscd/connections.c:250 ++#: nscd/connections.c:261 nscd/connections.c:282 + #, c-format + msgid "cannot write result: %s" + msgstr "nie je mo�n� zap�sa� v�sledok: %s" + +-#: nscd/nscd_stat.c:86 ++#: nscd/nscd_stat.c:87 + #, c-format + msgid "cannot write statistics: %s" + msgstr "nie je mo�n� zap�sa� �tatistiku: `%s'" + +-#: login/programs/request.c:120 +-msgid "cannot write to client" +-msgstr "nie je mo�n� p�sa� klientovi" +- +-#: locale/programs/localedef.c:442 +-msgid "category data requested more than once: should not happen" +-msgstr "�daje kateg�rie po�adovan� viac ako raz - to by sa nemalo sta�" +- +-#: locale/programs/ld-ctype.c:269 ++#: locale/programs/ld-ctype.c:509 + #, c-format +-msgid "character %s'%s' in class `%s' must be in class `%s'" +-msgstr "znak %s'%s' v triede `%s' mus� by� v triede `%s'" ++msgid "character '%s' in class `%s' must be in class `%s'" ++msgstr "znak '%s' v triede `%s' mus� by� v triede `%s'" + +-#: locale/programs/ld-ctype.c:294 ++#: locale/programs/ld-ctype.c:524 + #, c-format +-msgid "character %s'%s' in class `%s' must not be in class `%s'" +-msgstr "znak %s'%s' v triede `%s' nesmie by� v triede `%s'" ++msgid "character '%s' in class `%s' must not be in class `%s'" ++msgstr "znak '%s' v triede `%s' nesmie by� v triede `%s'" + +-#: locale/programs/ld-ctype.c:320 ++#: locale/programs/ld-ctype.c:579 + msgid "character <SP> not defined in character map" + msgstr "znak <SP> nie je definovan� v znakovej sade" + +-#: locale/programs/ld-ctype.c:964 locale/programs/ld-ctype.c:1029 +-#: locale/programs/ld-ctype.c:1040 locale/programs/ld-ctype.c:1051 +-#: locale/programs/ld-ctype.c:1062 locale/programs/ld-ctype.c:1073 +-#: locale/programs/ld-ctype.c:1084 locale/programs/ld-ctype.c:1113 +-#: locale/programs/ld-ctype.c:1124 locale/programs/ld-ctype.c:1165 +-#: locale/programs/ld-ctype.c:1194 locale/programs/ld-ctype.c:1206 ++#: locale/programs/ld-ctype.c:453 ++#, c-format ++msgid "character L'\\u%0*x' in class `%s' must be in class `%s'" ++msgstr "znak L'\\u%0*x' v triede `%s' mus� by� v triede `%s'" ++ ++#: locale/programs/ld-ctype.c:467 ++#, c-format ++msgid "character L'\\u%0*x' in class `%s' must not be in class `%s'" ++msgstr "znak L'\\u%0*x' v triede `%s' nesmie by� v triede `%s'" ++ ++#: locale/programs/ld-ctype.c:3030 + #, c-format + msgid "character `%s' not defined while needed as default value" + msgstr "znak `%s' nie je definovan� a je potrebn� ako implicitn� hodnota" + +-#: locale/programs/ld-ctype.c:825 ++#: locale/programs/ld-ctype.c:1215 + #, c-format + msgid "character class `%s' already defined" + msgstr "trieda znakov `%s' je u� definovan�" + +-#: locale/programs/ld-ctype.c:857 ++#: locale/programs/ld-ctype.c:1247 + #, c-format + msgid "character map `%s' already defined" + msgstr "znakov� sada `%s' je u� definovan�" + +-#: locale/programs/charmap.c:83 ++#: locale/programs/charmap.c:249 ++#, c-format ++msgid "character map `%s' is not ASCII compatible, locale not ISO C compliant\n" ++msgstr "znakov� mapa `%s' nie je kompatibiln� s ASCII, prostredie nevyhovuje ISO C\n" ++ ++#: locale/programs/charmap.c:135 + #, c-format + msgid "character map file `%s' not found" + msgstr "s�bor znakovej sady `%s' nebol n�jden�" + +-#: sunrpc/clnt_raw.c:110 ++#: locale/programs/charmap.c:460 ++msgid "character sets with locking states are not supported" ++msgstr "znakov� sady so zamykac�mi stavmi nie s� podporovan�" ++ ++#: locale/programs/localedef.c:482 ++msgid "circular dependencies between locale definitions" ++msgstr "kruhov� z�vislos� medzi defin�ciami prostred�" ++ ++#: sunrpc/clnt_raw.c:111 + msgid "clnt_raw.c - Fatal header serialization error." + msgstr "clnt_raw.c - Fat�lna chyba pri serializ�cii hlavi�ky." + +-#: sunrpc/clnt_tcp.c:125 sunrpc/clnt_tcp.c:133 ++#: sunrpc/clnt_tcp.c:126 sunrpc/clnt_tcp.c:134 + msgid "clnttcp_create: out of memory\n" + msgstr "clnttcp_create: nedostatok pam�ti\n" + +-#: sunrpc/clnt_udp.c:124 sunrpc/clnt_udp.c:134 +-msgid "svctcp_create: out of memory\n" +-msgstr "svctcp_create: nedostatok pam�ti\n" ++#: sunrpc/clnt_udp.c:131 sunrpc/clnt_udp.c:141 ++msgid "clntudp_create: out of memory\n" ++msgstr "clntudp_create: nedostatok pam�ti\n" + +-#: sunrpc/clnt_unix.c:123 sunrpc/clnt_unix.c:131 ++#: sunrpc/clnt_unix.c:124 sunrpc/clnt_unix.c:132 + msgid "clntunix_create: out of memory\n" + msgstr "clntunix_create: nedostatok pam�ti\n" + +-#: locale/programs/ld-collate.c:1339 +-#, c-format +-msgid "collation element `%.*s' appears more than once: ignore line" +-msgstr "element triedenia `%.*s' uveden� viac ako raz - riadok ignorovan�" +- +-#: locale/programs/ld-collate.c:1357 +-#, c-format +-msgid "collation symbol `%.*s' appears more than once: ignore line" +-msgstr "symbol triedenia `%.*s' uveden� viac ako raz - riadok ignorovan�" +- +-#: locale/programs/locfile.c:652 +-#, c-format +-msgid "collation symbol expected after `%s'" +-msgstr "po `%s' je o�ak�van� symbol triedenia" +- +-#: inet/rcmd.c:136 +-#, c-format +-msgid "connect to address %s: " +-msgstr "spojenie s adresou %s: " +- +-#: sunrpc/rpc_scan.c:115 ++#: sunrpc/rpc_scan.c:116 + msgid "constant or identifier expected" + msgstr "o�ak�van� kon�tanta alebo identifik�tor" + +-#: iconv/iconv_prog.c:144 ++#: iconv/iconv_prog.c:182 + #, c-format + msgid "conversion from `%s' to `%s' not supported" + msgstr "konverzia z `%s' do `%s' nie je podporovan�" + +-#: iconv/iconv_prog.c:326 ++#: catgets/gencat.c:1290 ++msgid "conversion modules not available" ++msgstr "moduly konverzie nie s� dostupn�" ++ ++#: locale/programs/ld-monetary.c:900 ++msgid "conversion rate value cannot be zero" ++msgstr "konverzn� pomer nem��e by� nula" ++ ++#: iconv/iconv_prog.c:385 iconv/iconv_prog.c:410 + msgid "conversion stopped due to problem in writing the output" + msgstr "konverzia zastaven� kv�li probl�mu pri z�pise v�stupu" + +-#: sunrpc/svc_simple.c:83 ++#: sunrpc/svc_simple.c:84 + msgid "couldn't create an rpc server\n" + msgstr "nebolo mo�n� vytvori� rpc server\n" + +-#: sunrpc/svc_simple.c:91 ++#: sunrpc/svc_simple.c:92 + #, c-format +-msgid "couldn't register prog %d vers %d\n" +-msgstr "nebolo mo�n� zaregistrova� program %d verzie %d\n" ++msgid "couldn't register prog %ld vers %ld\n" ++msgstr "nebolo mo�n� zaregistrova� program %ld verzie %ld\n" + +-#: nss/getent.c:49 ++#: nss/getent.c:51 + msgid "database [key ...]" + msgstr "datab�za [k��� ...]" + +-#: locale/programs/charmap.c:170 ++#: locale/programs/charmap.c:192 + #, c-format + msgid "default character map file `%s' not found" + msgstr "implicitn� s�bor znakovej sady `%s' nebol n�jden�" + +-#: locale/programs/ld-time.c:163 +-#, c-format +-msgid "direction flag in string %d in `era' field in category `%s' is not '+' nor '-'" +-msgstr "pr�znak smeru v re�azci %d po�a `era' v kateg�rii `%s' nie je '+' ani '-'" +- +-#: locale/programs/ld-time.c:174 +-#, c-format +-msgid "direction flag in string %d in `era' field in category `%s' is not a single character" +-msgstr "pr�znak smeru v re�azci %d po�a `era' v kateg�rii `%s' nie je jeden znak" +- +-#: locale/programs/charset.c:64 locale/programs/charset.c:118 ++#: locale/programs/charmap.c:392 + #, c-format +-msgid "duplicate character name `%s'" +-msgstr "duplicitn� meno znaku `%s'" +- +-#: locale/programs/ld-collate.c:1150 +-msgid "duplicate collating element definition" +-msgstr "duplicitn� defin�cia elementu triedenia" ++msgid "duplicate definition of <%s>" ++msgstr "duplicitn� defin�cia <%s>" + +-#: locale/programs/ld-collate.c:1297 ++#: locale/programs/ld-collate.c:3043 + #, c-format +-msgid "duplicate definition for character `%.*s'" +-msgstr "duplicitn� defin�cia znaku `%.*s'" ++msgid "duplicate definition of script `%s'" ++msgstr "duplicitn� defin�cia skriptu `%s'" + +-#: db2/makedb.c:328 +-msgid "duplicate key" +-msgstr "duplicitn� k���" +- +-#: catgets/gencat.c:388 ++#: catgets/gencat.c:430 + msgid "duplicate set definition" + msgstr "duplicitn� defin�cia sady" + +-#: timezone/zic.c:978 ++#: timezone/zic.c:1003 + #, c-format + msgid "duplicate zone name %s (file \"%s\", line %d)" + msgstr "duplicitn� meno z�ny %s (s�bor \"%s\", riadok %d)" + +-#: catgets/gencat.c:551 ++#: locale/programs/ld-ctype.c:2557 ++#, c-format ++msgid "duplicated definition for mapping `%s'" ++msgstr "duplicitn� defin�cia mapovania `%s'" ++ ++#: catgets/gencat.c:631 + msgid "duplicated message identifier" + msgstr "duplicitn� identifik�tor spr�vy" + +-#: catgets/gencat.c:524 ++#: catgets/gencat.c:603 + msgid "duplicated message number" + msgstr "duplicitn� ��slo spr�vy" + +-#: sunrpc/rpc_scan.c:382 ++#: locale/programs/ld-ctype.c:2368 ++msgid "ellipsis range must be marked by two operands of same type" ++msgstr "rozsah pokra�ovania mus� by� ozna�en� dvomi operandami rovnak�ho typu" ++ ++#: sunrpc/rpc_scan.c:383 + msgid "empty char string" + msgstr "pr�zdny znakov� re�azec" + +-#: locale/programs/ld-collate.c:1710 +-msgid "empty weight name: line ignored" +-msgstr "pr�zdne meno v�hy - riadok ignorovan�" ++#: elf/dl-open.c:223 ++msgid "empty dynamic string token substitution" ++msgstr "pr�zdna substit�cia tokenu dynamick�ho re�azca" + +-#: sunrpc/svc_udp.c:372 ++#: sunrpc/svc_udp.c:454 + msgid "enablecache: cache already enabled" + msgstr "enablecache: vyrovn�vacia pam� je u� povolen�" + +-#: sunrpc/svc_udp.c:378 ++#: sunrpc/svc_udp.c:460 + msgid "enablecache: could not allocate cache" + msgstr "enablecache: nebolo mo�n� prideli� vyrovn�ciu pam�" + +-#: sunrpc/svc_udp.c:386 ++#: sunrpc/svc_udp.c:468 + msgid "enablecache: could not allocate cache data" + msgstr "enablecache: nebolo mo�n� prideli� d�ta pre vyrovn�vaciu pam�" + +-#: sunrpc/svc_udp.c:393 ++#: sunrpc/svc_udp.c:475 + msgid "enablecache: could not allocate cache fifo" + msgstr "enablecache: nebolo mo�n� prideli� frontu pre vyrovn�vaciu pam�" + +-#: iconv/iconv_prog.c:56 ++#: iconv/iconv_prog.c:57 + msgid "encoding for output" + msgstr "k�dovanie v�stupu" + +-#: iconv/iconv_prog.c:55 ++#: iconv/iconv_prog.c:56 + msgid "encoding of original text" + msgstr "k�dovanie p�vodn�ho textu" + +-#: locale/programs/ld-collate.c:1429 +-msgid "end point of ellipsis range is bigger then start" +-msgstr "koncov� bod pokra�ovania je v��� ako po�iato�n�" ++#: nscd/connections.c:361 nscd/connections.c:453 ++#, c-format ++msgid "error getting callers id: %s" ++msgstr "chyba pri z�skan� id volaj�ceho: %s" ++ ++#: locale/programs/ld-collate.c:3013 ++msgid "error while adding equivalent collating symbol" ++msgstr "chyba pri prid�van� ekvivalentn�ho symbolu triedenia" + +-#: iconv/iconv_prog.c:193 ++#: iconv/iconv_prog.c:242 + #, c-format + msgid "error while closing input `%s'" + msgstr "chyba po�as zatv�rania vstupu `%s'" + +-#: iconv/iconv_prog.c:239 ++#: iconv/iconv_prog.c:288 + msgid "error while closing output file" + msgstr "chyba po�as zatv�rania v�stupn�ho s�boru" + +-#: elf/sprof.c:710 ++#: elf/sprof.c:706 + msgid "error while closing the profiling data file" + msgstr "chyba po�as zatv�rania s�boru profilovac�ch �dajov" + +-#: locale/programs/ld-collate.c:1158 +-msgid "error while inserting collation element into hash table" +-msgstr "chyba po�as vkladania elementu triedenia do hash-tabu�ky" +- +-#: locale/programs/ld-collate.c:1170 +-msgid "error while inserting to hash table" +-msgstr "chyba po�as vkladania do hash-tabu�ky" +- +-#: iconv/iconv_prog.c:389 iconv/iconv_prog.c:420 ++#: iconv/iconv_prog.c:474 iconv/iconv_prog.c:505 + msgid "error while reading the input" + msgstr "po�as ��tania vstupu" + +-#: locale/programs/locfile.c:595 ++#: locale/programs/locfile.h:59 + msgid "expect string argument for `copy'" + msgstr "pre `copy' je o�ak�van� re�azcov� argyment" + +-#: timezone/zic.c:868 ++#: timezone/zic.c:893 + msgid "expected continuation line not found" + msgstr "o�ak�van� pokra�ovac� riadok nebol n�jden�" + +-#: elf/sprof.c:408 ++#: elf/sprof.c:404 + #, c-format + msgid "failed to load shared object `%s'" + msgstr "nepodarilo sa na��ta� zdie�an� objekt `%s'" + +-#: elf/sprof.c:604 ++#: elf/sprof.c:600 + msgid "failed to load symbol data" + msgstr "nepodarilo sa na��ta� symbolick� �daje" + +-#: elf/sprof.c:702 ++#: elf/dl-load.c:763 ++msgid "failed to map segment from shared object" ++msgstr "nepodarilo sa namapova� segment zo zdie�an�ho objektu" ++ ++#: elf/sprof.c:698 + msgid "failed to mmap the profiling data file" + msgstr "nepodarilo sa mmap-ova� s�bor profilovac�ch �dajov" + +-#: iconv/iconv_prog.c:147 ++#: iconv/iconv_prog.c:186 + msgid "failed to start conversion processing" + msgstr "nepodarilo sa od�tartova� konverziu" + +-#: locale/programs/locfile.c:1154 ++#: locale/programs/locfile.c:406 + #, c-format + msgid "failure while writing data for category `%s'" + msgstr "chyba po�as z�pisu �dajov kateg�rie `%s'" + +-#: nis/nis_call.c:155 ++#: nis/nis_call.c:156 + msgid "fcntl: F_SETFD" + msgstr "fcntl: F_SETFD" + +-#: locale/programs/ld-monetary.c:163 locale/programs/ld-numeric.c:98 +-#, c-format +-msgid "field `%s' in category `%s' not defined" +-msgstr "pole `%s' keteg�rie `%s' nie je definovan�" +- +-#: locale/programs/ld-messages.c:86 locale/programs/ld-messages.c:110 +-#, c-format +-msgid "field `%s' in category `%s' undefined" +-msgstr "pole `%s' kateg�rie `%s' nedefinovan�" +- +-#: sunrpc/rpc_main.c:1148 +-#, 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" +- +-#: locale/programs/locfile.c:677 +-msgid "from-value of `collating-element' must be a string" +-msgstr "hodnota od pre `collating-element' mus� by� re�azec" ++#. TRANS: the file will not be removed; this is an ++#. TRANS: informative message. ++#: sunrpc/rpc_main.c:1150 ++#, 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" ++ ++#: elf/dl-load.c:1244 ++msgid "file too short" ++msgstr "s�bor je pr�li� kr�tky" + +-#: inet/rcmd.c:316 ++#: inet/rcmd.c:422 + msgid "fstat failed" + msgstr "fstat sa nepodaril" + +-#: locale/programs/linereader.c:333 ++#: locale/programs/linereader.c:383 + msgid "garbage at end of character code specification" + msgstr "smetie za koncom �pecifik�cie k�du znaku" + +-#: locale/programs/linereader.c:219 ++#: locale/programs/linereader.c:271 + msgid "garbage at end of number" + msgstr "smetie za koncom ��sla" + +-#: locale/programs/ld-time.c:195 +-#, c-format +-msgid "garbage at end of offset value in string %d in `era' field in category `%s'" +-msgstr "smetie za koncom hodnoty posunutia v re�azci %d po�a `era' kateg�rie `%s'" +- +-#: locale/programs/ld-time.c:252 +-#, c-format +-msgid "garbage at end of starting date in string %d in `era' field in category `%s'" +-msgstr "smetie za koncom po�iato�n�ho d�tumu v re�azci %d po�a `era' kateg�rie `%s'" +- +-#: locale/programs/ld-time.c:328 +-#, c-format +-msgid "garbage at end of stopping date in string %d in `era' field in category `%s'" +-msgstr "smetie za koncom koncov�ho d�tumu v re�azci %d po�a `era' kateg�rie `%s'" +- +-#: elf/sprof.c:81 ++#: elf/sprof.c:77 + msgid "generate call graph" + msgstr "tvorba grafu volan�" + +-#: elf/sprof.c:80 ++#: elf/sprof.c:76 + msgid "generate flat profile with counts and ticks" + msgstr "tvorba jednoduch�ho profilu s po�tami a tikmi" + +-#: sunrpc/get_myaddr.c:77 ++#: sunrpc/get_myaddr.c:78 + msgid "get_myaddress: ioctl (get interface configuration)" + msgstr "get_myaddress: ioctl (z�skanie konfigur�cie rozhrania)" + +-#: nss/getent.c:53 ++#: nss/getent.c:702 + msgid "getent - get entries from administrative database." + msgstr "getent - z�ska� z�znamy z administrat�vnej datab�zy." + +-#: nscd/connections.c:200 ++#: nscd/connections.c:220 + #, c-format + msgid "handle_request: request received (Version = %d)" + msgstr "handle_request: �iados� prijat� (verzia = %d)" + +-#: timezone/zic.c:613 ++#: timezone/zic.c:637 + msgid "hard link failed, symbolic link used" + msgstr "pevn� odkaz zlyhal, pou�it� symbolick�" + +-#: inet/rcmd.c:322 ++#: inet/rcmd.c:428 + msgid "hard linked somewhere" + msgstr "niekde existuje pevn� odkaz" + +-#: timezone/zic.c:1162 ++#: locale/programs/charmap.c:981 locale/programs/repertoire.c:430 ++msgid "hexadecimal range format should use only capital characters" ++msgstr "hexadecim�lny form�t rozsahu by mal pou��va� iba ve�k� p�smen�" ++ ++#: timezone/zic.c:1187 + msgid "illegal CORRECTION field on Leap line" + msgstr "nepr�pustn� pole CORRECTION v riadku Leap" + +-#: timezone/zic.c:1166 ++#: timezone/zic.c:1191 + msgid "illegal Rolling/Stationary field on Leap line" + msgstr "nepr�pustn� pole Rolling/Stationary v riadku Leap" + +-#: locale/programs/ld-collate.c:1782 +-msgid "illegal character constant in string" +-msgstr "nepr�pustn� znak v re�azci" +- +-#: sunrpc/rpc_scan.c:311 ++#: sunrpc/rpc_scan.c:312 + msgid "illegal character in file: " + msgstr "nepr�pustn� znak v s�bore: " + +-#: locale/programs/ld-collate.c:1125 +-msgid "illegal collation element" +-msgstr "nepr�pustn� element triedenia" +- +-#: locale/programs/charmap.c:281 +-msgid "illegal definition" +-msgstr "nepr�pustn� defin�cia" +- +-#: locale/programs/charmap.c:434 +-msgid "illegal encoding given" +-msgstr "zadan� nepr�pustn� k�dovanie" +- +-#: locale/programs/linereader.c:551 ++#: locale/programs/linereader.c:595 + msgid "illegal escape sequence at end of string" + msgstr "chybn� escape-sekvencia na konci re�azca" + +-#: iconv/iconv_prog.c:342 ++#: iconv/iconv_prog.c:427 + #, c-format + msgid "illegal input sequence at position %ld" + msgstr "nepr�pustn� vstupn� sekvencia na poz�cii %ld" + +-#: locale/programs/charset.c:78 +-msgid "illegal names for character range" +-msgstr "nepr�pustn� men� pre rozsah znakov" +- +-#: sunrpc/rpc_main.c:462 ++#: sunrpc/rpc_main.c:463 + #, c-format +-msgid "illegal nettype :'%s'\n" +-msgstr "chybn� nettype :'%s'\n" ++msgid "illegal nettype :`%s'\n" ++msgstr "chybn� nettype :`%s'\n" + +-#: locale/programs/ld-time.c:187 +-#, c-format +-msgid "illegal number for offset in string %d in `era' field in category `%s'" +-msgstr "nepr�pustn� ��slo pre posunutie v re�azci %d po�a `era' kateg�rie `%s'" +- +-#: catgets/gencat.c:361 catgets/gencat.c:438 ++#: catgets/gencat.c:403 catgets/gencat.c:480 + msgid "illegal set number" + msgstr "nepr�pustn� ��slo sady" + +-#: locale/programs/ld-time.c:243 +-#, c-format +-msgid "illegal starting date in string %d in `era' field in category `%s'" +-msgstr "nepr�pustn� po�iato�n� d�tum v re�azci %d po�a `era' kateg�rie `%s'" +- +-#: locale/programs/ld-time.c:319 ++#: locale/programs/ld-ctype.c:1221 + #, c-format +-msgid "illegal stopping date in string %d in `era' field in category `%s'" +-msgstr "nepr�pustn� koncov� d�tum v re�azci %d po�a `era' kateg�rie `%s'" ++msgid "implementation limit: no more than %Zd character classes allowed" ++msgstr "limit implement�cie: maxim�lne mno�stvo tried znakov je %Zd" + +-#: locale/programs/ld-ctype.c:831 +-#, c-format +-msgid "implementation limit: no more than %d character classes allowed" +-msgstr "limit implement�cie: maxim�lne mno�stvo tried znakov je %d" +- +-#: locale/programs/ld-ctype.c:863 ++#: locale/programs/ld-ctype.c:1253 + #, c-format + msgid "implementation limit: no more than %d character maps allowed" + msgstr "limit implement�cie: maxim�lne mno�stvo s�d znakov je %d" + +-#: iconv/iconv_prog.c:346 ++#: iconv/iconv_prog.c:431 + msgid "incomplete character or shift sequence at end of buffer" + msgstr "nekompletn� znak alebo prera�ovacia sekvencia na konci vyrovn�vacej pam�ti" + +-#: db2/makedb.c:148 +-msgid "incorrectly formatted file" +-msgstr "nespr�vne form�tovan� s�bor" +- +-#: timezone/zic.c:825 ++#: timezone/zic.c:850 + msgid "input line of unknown type" + msgstr "vstupn� riadok nezn�meho typu" + +-#: iconv/iconv_prog.c:350 ++#: elf/dl-load.c:1291 ++msgid "internal error" ++msgstr "intern� chyba" ++ ++#: iconv/iconv_prog.c:435 + msgid "internal error (illegal descriptor)" + msgstr "vn�torn� chyba (nespr�vny deskriptor)" + +-#: timezone/zic.c:1788 ++#: timezone/zic.c:1813 + msgid "internal error - addtype called with bad isdst" + msgstr "vn�torn� chyba - addtype zavolan� s chybn�m isdst" + +-#: timezone/zic.c:1796 ++#: timezone/zic.c:1821 + msgid "internal error - addtype called with bad ttisgmt" + msgstr "vn�torn� chyba - addtype zavolan� s chybn�m ttisgmt" + +-#: timezone/zic.c:1792 ++#: timezone/zic.c:1817 + msgid "internal error - addtype called with bad ttisstd" + msgstr "vn�torn� chyba - addtype zavolan� s chybn�m ttisstd" + +-#: locale/programs/ld-ctype.c:307 ++#: locale/programs/ld-ctype.c:480 locale/programs/ld-ctype.c:536 + #, c-format + msgid "internal error in %s, line %u" + msgstr "vn�torn� chyba %s na riadku %u" + +-#: timezone/zic.c:1034 ++#: elf/dl-load.c:1264 ++msgid "invalid ELF header" ++msgstr "nepr�pustn� ELF hlavi�ka" ++ ++#: timezone/zic.c:1059 + msgid "invalid UTC offset" + msgstr "nepr�pustn� posunutie vo�i UTC" + +-#: timezone/zic.c:1037 ++#: timezone/zic.c:1062 + msgid "invalid abbreviation format" + msgstr "nepr�pustn� form�t skratky" + +-#: timezone/zic.c:1127 timezone/zic.c:1339 timezone/zic.c:1353 ++#: catgets/gencat.c:687 ++msgid "invalid character: message ignored" ++msgstr "nepr�pustn� znak: spr�va ignorovan�" ++ ++#: timezone/zic.c:1152 timezone/zic.c:1364 timezone/zic.c:1378 + msgid "invalid day of month" + msgstr "nepr�pustn� de� mesiaca" + +-#: timezone/zic.c:1291 ++#: locale/programs/charmap.c:347 ++msgid "invalid definition" ++msgstr "nepr�pustn� defin�cia" ++ ++#: locale/programs/charmap.c:542 ++msgid "invalid encoding given" ++msgstr "zadan� nepr�pustn� k�dovanie" ++ ++#: timezone/zic.c:1316 + msgid "invalid ending year" + msgstr "nepr�pustn� koncov� rok" + +-#: timezone/zic.c:1099 ++#: catgets/gencat.c:1147 locale/programs/linereader.c:533 ++msgid "invalid escape sequence" ++msgstr "nepr�pustn� escape-sekvencia" ++ ++#: timezone/zic.c:1124 + msgid "invalid leaping year" + msgstr "nepr�pustn� priestupn� rok" + +-#: elf/dl-open.c:159 ++#: catgets/gencat.c:726 ++msgid "invalid line" ++msgstr "nepr�pustn� riadok" ++ ++#: elf/dl-open.c:371 + msgid "invalid mode for dlopen()" + msgstr "nepr�pustn� m�d pre dlopen()" + +-#: timezone/zic.c:1114 timezone/zic.c:1217 ++#: timezone/zic.c:1139 timezone/zic.c:1242 + msgid "invalid month name" + msgstr "nepr�pustn� n�zov mesiaca" + +-#: timezone/zic.c:933 ++#: locale/programs/charmap.c:969 locale/programs/ld-collate.c:2869 ++#: locale/programs/repertoire.c:418 ++msgid "invalid names for character range" ++msgstr "nepr�pustn� men� pre rozsah znakov" ++ ++#: debug/pcprofiledump.c:166 ++msgid "invalid pointer size" ++msgstr "nepr�pustn� ve�kost� ukazovate�a" ++ ++#: catgets/gencat.c:549 ++msgid "invalid quote character" ++msgstr "nepr�pustn� znak cit�cie" ++ ++#: timezone/zic.c:958 + msgid "invalid saved time" + msgstr "nepr�pustn� ulo�en� �as" + +-#: timezone/zic.c:1266 ++#: timezone/zic.c:1291 + msgid "invalid starting year" + msgstr "nepr�pustn� po�iato�n� rok" + +-#: timezone/zic.c:1143 timezone/zic.c:1246 ++#: timezone/zic.c:1168 timezone/zic.c:1271 + msgid "invalid time of day" + msgstr "nepr�pustn� �as v dni" + +-#: timezone/zic.c:1344 ++#: timezone/zic.c:1369 + msgid "invalid weekday name" + msgstr "nepr�pustn� n�zov d�a" + +-#: nscd/connections.c:375 ++#: nscd/connections.c:470 ++#, c-format ++msgid "key length in request too long: %d" ++msgstr "d�ka k���a v �iadosti pr�li� dlh�: %d" ++ ++#: elf/ldconfig.c:738 ++#, c-format ++msgid "libc4 library %s in wrong directory" ++msgstr "libc4 kni�nica %s je v nespr�vnom adres�ri" ++ ++#: elf/ldconfig.c:732 + #, c-format +-msgid "key length in request too long: %Zd" +-msgstr "d�ka k���a v �iadosti pr�li� dlh�: %Zd" ++msgid "libc5 library %s in wrong directory" ++msgstr "libc5 kni�nica %s je v nespr�vnom adres�ri" + +-#: locale/programs/ld-collate.c:1422 +-msgid "line after ellipsis must contain character definition" +-msgstr "riadok za pokra�ovan�m mus� obsahova� defin�ciu znaku" ++#: elf/ldconfig.c:735 ++#, c-format ++msgid "libc6 library %s in wrong directory" ++msgstr "libc6 kni�nica %s je v nespr�vnom adres�ri" + +-#: locale/programs/ld-collate.c:1401 +-msgid "line before ellipsis does not contain definition for character constant" +-msgstr "riadok pred pokra�ovan�m neobsahuje defin�ciu pre znakov� kon�tantu" ++#: elf/ldconfig.c:765 ++#, 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." + +-#: timezone/zic.c:805 ++#: timezone/zic.c:830 + msgid "line too long" + msgstr "pridlh� riadok" + +-#: iconv/iconv_prog.c:58 ++#: iconv/iconv_prog.c:59 + msgid "list all known coded character sets" + msgstr "vyp�� v�etky zn�me znakov� sady" + +-#: locale/programs/localedef.c:273 +-#, c-format +-msgid "locale file `%s', used in `copy' statement, not found" +-msgstr "s�bor n�rodn�ho prostredia `%s' pou�it� v pr�kaze `copy' nebol n�jden�" ++#: locale/programs/locfile.h:63 ++msgid "locale name should consist only of portable characters" ++msgstr "n�zov prostredia by malo obsahova� iba prenosite�n� znaky" + +-#: inet/rcmd.c:307 ++#: inet/rcmd.c:413 + msgid "lstat failed" + msgstr "lstat zlyhal" + +-#: catgets/gencat.c:619 ++#: malloc/memusagestat.c:59 ++msgid "make output graphic VALUE pixel high" ++msgstr "v�stupn� graf bude VALUE pixlov vysok�" ++ ++#: malloc/memusagestat.c:58 ++msgid "make output graphic VALUE pixel wide" ++msgstr "v�stupn� graf bude VALUE pixlov �irok�" ++ ++#: catgets/gencat.c:780 + msgid "malformed line ignored" + msgstr "nespr�vny riadok ignorovan�" + +-#: elf/sprof.c:554 ++#: elf/sprof.c:550 + msgid "mapping of section header string table failed" + msgstr "zlyhalo mapovanie tabu�ky re�azcov hlavi�ky sekcie" + +-#: elf/sprof.c:544 ++#: elf/sprof.c:540 + msgid "mapping of section headers failed" + msgstr "zlyhalo mapovanie hlavi�iek sekcie" + +-#: malloc/mcheck.c:202 ++#: malloc/mcheck.c:285 + msgid "memory clobbered before allocated block\n" + msgstr "pam� pred pridelen�m blokom prep�san�\n" + +-#: malloc/mcheck.c:205 ++#: malloc/mcheck.c:288 + msgid "memory clobbered past end of allocated block\n" + msgstr "pam� za koncom pridelen�ho bloku prep�san�\n" + +-#: locale/programs/ld-collate.c:170 locale/programs/ld-collate.c:176 +-#: locale/programs/ld-collate.c:180 locale/programs/ld-collate.c:1449 +-#: locale/programs/ld-collate.c:1478 locale/programs/locfile.c:1082 +-#: locale/programs/xmalloc.c:70 login/programs/database.c:62 +-#: login/programs/database.c:79 login/programs/database.c:95 +-#: posix/getconf.c:682 ++#: locale/programs/locfile.c:334 locale/programs/xmalloc.c:70 ++#: malloc/obstack.c:477 posix/getconf.c:809 + msgid "memory exhausted" + msgstr "nedostatok pam�ti" + +-#: malloc/obstack.c:471 +-msgid "memory exhausted\n" +-msgstr "nedostatok pam�ti\n" +- +-#: malloc/mcheck.c:199 ++#: malloc/mcheck.c:282 + msgid "memory is consistent, library is buggy\n" + msgstr "pam� je konzistentn�, kni�nica je chybn�\n" + +-#: locale/programs/ld-time.c:370 +-#, c-format +-msgid "missing era format in string %d in `era' field in category `%s'" +-msgstr "ch�ba form�t �ry v re�azci %d v poli `era' kateg�rie `%s'" +- +-#: locale/programs/ld-time.c:358 +-#, c-format +-msgid "missing era name in string %d in `era' field in category `%s'" +-msgstr "ch�ba meno �ry v re�azci %d v poli `era' kateg�rie `%s'" ++#: elf/cache.c:120 ++msgid "mmap of cache file failed.\n" ++msgstr "zlyhalo mapovanie cache s�boru\n" ++ ++#: elf/../sysdeps/generic/readelflib.c:108 ++msgid "more than one dynamic segment\n" ++msgstr "viac ako jeden dynamick� segment\n" + +-#: timezone/zic.c:928 ++#: timezone/zic.c:953 + msgid "nameless rule" + msgstr "bezmenn� pravidlo" + +-#: iconv/iconv_prog.c:133 ++#: iconv/iconv_prog.c:139 + msgid "neither original nor target encoding specified" + msgstr "nie je �pecifikovan� p�vodn� ani cie�ov� k�dovanie" + +-#: nis/nss_nisplus/nisplus-publickey.c:262 +-#: nis/nss_nisplus/nisplus-publickey.c:268 +-#: nis/nss_nisplus/nisplus-publickey.c:327 +-#: nis/nss_nisplus/nisplus-publickey.c:336 ++#: nis/nss_nisplus/nisplus-publickey.c:281 ++#: nis/nss_nisplus/nisplus-publickey.c:287 ++#: nis/nss_nisplus/nisplus-publickey.c:346 ++#: nis/nss_nisplus/nisplus-publickey.c:355 + #, c-format + msgid "netname2user: (nis+ lookup): %s\n" + msgstr "netname2user: (nis+ lookup): %s\n" + +-#: nis/nss_nisplus/nisplus-publickey.c:281 ++#: nis/nss_nisplus/nisplus-publickey.c:300 + #, c-format + msgid "netname2user: DES entry for %s in directory %s not unique" + msgstr "netname2user: DES z�znam pre %s v adres�ri %s nejednozna�n�" + +-#: nis/nss_nisplus/nisplus-publickey.c:349 ++#: nis/nss_nisplus/nisplus-publickey.c:368 + #, c-format + msgid "netname2user: LOCAL entry for %s in directory %s not unique" + msgstr "netname2user: LOCAL z�znam pre %s v adres�ri %s nejednozna�n�" + +-#: nis/nss_nisplus/nisplus-publickey.c:194 ++#: nis/nss_nisplus/nisplus-publickey.c:207 + #, c-format +-msgid "netname2user: missing group id list in '%s'." +-msgstr "netname2user: ch�baj�ci zoznam id skup�n v '%s'." ++msgid "netname2user: missing group id list in `%s'." ++msgstr "netname2user: ch�baj�ci zoznam id skup�n v `%s'." + +-#: nis/nss_nisplus/nisplus-publickey.c:299 ++#: nis/nss_nisplus/nisplus-publickey.c:318 + #, c-format +-msgid "netname2user: principal name '%s' too long" +-msgstr "netname2user: n�zov princip�la '%s' pr�li� dlh�" ++msgid "netname2user: principal name `%s' too long" ++msgstr "netname2user: n�zov princip�la `%s' pr�li� dlh�" + +-#: nis/nss_nisplus/nisplus-publickey.c:356 ++#: nis/nss_nisplus/nisplus-publickey.c:375 + msgid "netname2user: should not have uid 0" + msgstr "netname2user: nemal by ma� uid 0" + +-#: sunrpc/svc_simple.c:158 ++#: sunrpc/svc_simple.c:159 + #, c-format + msgid "never registered prog %d\n" + msgstr "program %d nebol nikdy registrovan�\n" + +-#: locale/programs/repertoire.c:238 ++#: locale/programs/repertoire.c:272 + msgid "no <Uxxxx> or <Uxxxxxxxx> value given" + msgstr "nezadan� <Uxxxx> alebo <Uxxxxxxxx> hodnota" + +-#: locale/programs/ld-messages.c:101 locale/programs/ld-messages.c:125 +-#, c-format +-msgid "no correct regular expression for field `%s' in category `%s': %s" +-msgstr "pre pole `%s' v kateg�rii `%s' neexistuje spr�vny regul�rny v�raz: %s" +- +-#: timezone/zic.c:2115 ++#: timezone/zic.c:2142 + msgid "no day in month matches rule" + msgstr "s pravidlom sa nezhoduje �iadny de� v mesiaci" + +-#: locale/programs/ld-collate.c:267 ++#: locale/programs/ld-collate.c:1757 + msgid "no definition of `UNDEFINED'" + msgstr "neexistuje defin�cia pre `UNDEFINED'" + +-#: elf/sprof.c:276 ++#: elf/sprof.c:272 + #, c-format + msgid "no filename for profiling data given and shared object `%s' has no soname" + msgstr "nebol zadan� n�zov s�boru pre profilovacie �daje a zdie�an� objekt `%s' nem� soname" + +-#: locale/programs/locfile.c:609 ++#: locale/programs/ld-ctype.c:739 ++msgid "no input digits defined and none of the standard names in the charmap" ++msgstr "neboli definovan� �iadne vstupn� ��slice a v znakovej mape nie je �iadne zo �tandardn�ch mien" ++ ++#: locale/programs/locfile.h:82 + msgid "no other keyword shall be specified when `copy' is used" + msgstr "pri pou�it� `copy' nem� by� zadan� �iadne in� k���ov� slovo" + +-#: locale/programs/localedef.c:334 ++#: locale/programs/ld-ctype.c:3349 ++msgid "no output digits defined and none of the standard names in the charmap" ++msgstr "neboli definovan� �iadne v�stupn� ��slice a v znakovej mape nie je �iadne zo �tandardn�ch mien" ++ ++#: locale/programs/localedef.c:236 + msgid "no output file produced because warning were issued" + msgstr "v�stupn� s�bor nebol vytvoren� kv�li v�skytu varovan�" + +-#: locale/programs/locfile.c:283 locale/programs/locfile.c:301 +-#: locale/programs/locfile.c:319 locale/programs/locfile.c:337 +-#: locale/programs/locfile.c:355 locale/programs/locfile.c:373 +-msgid "no repertoire map specified: cannot proceed" +-msgstr "nebola zadan� mapa reperto�ru: nie je mo�n� pokra�ova�" +- +-#: locale/programs/charmap.c:400 locale/programs/charmap.c:550 +-#: locale/programs/charmap.c:629 locale/programs/repertoire.c:199 ++#: locale/programs/charmap.c:488 locale/programs/charmap.c:668 ++#: locale/programs/charmap.c:764 locale/programs/repertoire.c:231 + msgid "no symbolic name given" + msgstr "nebolo zadan� �iadne symbolick� meno" + +-#: locale/programs/charmap.c:465 locale/programs/charmap.c:596 +-#: locale/programs/charmap.c:662 locale/programs/repertoire.c:261 ++#: locale/programs/charmap.c:575 locale/programs/charmap.c:723 ++#: locale/programs/charmap.c:806 locale/programs/repertoire.c:297 + msgid "no symbolic name given for end of range" + msgstr "nebolo zadan� �iadne symbolick� meno pre koniec rozsahu" + +-#: locale/programs/ld-collate.c:249 +-#, c-format +-msgid "no weight defined for symbol `%s'" +-msgstr "symbol `%s' nem� definovan� v�hu" ++#: locale/programs/linereader.c:641 ++msgid "non-symbolic character value should not be used" ++msgstr "nesymbolick� hodnoty znakov by nemali by� pou��van�" ++ ++#: locale/programs/ld-ctype.c:804 ++msgid "not all characters used in `outdigit' are available in the charmap" ++msgstr "nie v�etky znaky pou�it� v `outdigit' s� dostupn� v znakovej mape" ++ ++#: locale/programs/ld-ctype.c:821 ++msgid "not all characters used in `outdigit' are available in the repertoire" ++msgstr "nie v�etky znaky pou�it� v `outdigit' s� dostupn� v reperto�ri" + +-#: inet/rcmd.c:309 ++#: inet/rcmd.c:415 + msgid "not regular file" + msgstr "nie je regul�rny s�bor" + +-#: nscd/nscd_stat.c:130 ++#: nscd/nscd_stat.c:131 + #, c-format + msgid "" + "nscd configuration:\n" +@@ -3679,48 +4879,72 @@ + "\n" + "%15d ladiaca �rove� servera\n" + +-#: nscd/nscd_stat.c:104 ++#: nscd/nscd_stat.c:105 + msgid "nscd not running!\n" + msgstr "nscd nebe��!\n" + +-#: locale/programs/charmap.c:514 ++#: elf/dl-load.c:1051 ++msgid "object file has no dynamic section" ++msgstr "objektov� s�bor neobsahuje �iadnu dynamick� sekciu" ++ ++#: iconv/iconv_prog.c:61 ++msgid "omit invalid characters from output" ++msgstr "vynecha� z v�stupu neplatn� znaky" ++ ++#: elf/dl-load.c:1311 ++msgid "only ET_DYN and ET_EXEC can be loaded" ++msgstr "iba ET_DYN a ET_EXEC m��u by� na��tan�" ++ ++#: locale/programs/charmap.c:632 + msgid "only WIDTH definitions are allowed to follow the CHARMAP definition" + msgstr "po defin�cii CHARMAP m��u nasledova� iba defin�cie WIDTH" + +-#: iconv/iconv_prog.c:135 ++#: locale/programs/ld-collate.c:1005 locale/programs/ld-collate.c:1175 ++#, c-format ++msgid "order for `%.*s' already defined at %s:%Zu" ++msgstr "poradie pre `%.*s' je u� definovan� na %s:%Zu" ++ ++#: iconv/iconv_prog.c:141 + msgid "original encoding not specified using `-f'" + msgstr "p�vodn� k�dovanie nebolo zadan� pomocou `-f'" + +-#: iconv/iconv_prog.c:60 ++#: inet/ruserpass.c:167 inet/ruserpass.c:190 ++msgid "out of memory" ++msgstr "nedostatok pam�ti" ++ ++#: iconv/iconv_prog.c:62 + msgid "output file" + msgstr "v�stupn� s�bor" + +-#: sunrpc/pm_getmaps.c:73 ++#: sunrpc/pm_getmaps.c:74 + msgid "pmap_getmaps rpc problem" + msgstr "pmap_getmaps rpc probl�m" + +-#: inet/rcmd.c:179 ++#: inet/rcmd.c:233 + msgid "poll: protocol failure in circuit setup\n" + msgstr "poll: chyba protokolu po�as pr�pravy okruhu\n" + +-#: sunrpc/rpc_scan.c:523 sunrpc/rpc_scan.c:533 ++#: locale/programs/ld-ctype.c:1949 locale/programs/ld-ctype.c:2000 ++msgid "premature end of `translit_ignore' definition" ++msgstr "pred�asn� koniec defin�cie `translit_ignore'" ++ ++#: sunrpc/rpc_scan.c:524 sunrpc/rpc_scan.c:534 + msgid "preprocessor error" + msgstr "chyba preprocesora" + +-#: elf/sprof.c:78 ++#: locale/programs/ld-ctype.c:2731 ++msgid "previous definition was here" ++msgstr "predch�dzaj�ca defin�cia bola tu" ++ ++#: elf/sprof.c:74 + msgid "print list of count paths and their number of use" + msgstr "vyp�sa� zoznam ciest po�tov a po�et ich pou�it�" + +-#: iconv/iconv_prog.c:61 ++#: iconv/iconv_prog.c:64 + msgid "print progress information" + msgstr "vypisova� inform�ciu o postupe" + +-#: db2/makedb.c:345 +-#, c-format +-msgid "problems while reading `%s'" +-msgstr "probl�my po�as ��tania `%s'" +- +-#: elf/sprof.c:691 ++#: elf/sprof.c:687 + #, c-format + msgid "profiling data file `%s' does not match shared object `%s'" + msgstr "profilovacie �daje `%s' nes�hlasia so zdie�an�mobjektom `%s'" +@@ -3742,33 +4966,42 @@ + msgid "program %lu version %lu ready and waiting\n" + msgstr "program %lu verzie %lu pripraven� a �akaj�ci\n" + +-#: inet/rcmd.c:176 ++#: inet/rcmd.c:270 ++#, c-format ++msgid "rcmd: %s: short read" ++msgstr "rcmd: %s: kr�tke ��tanie" ++ ++#: inet/rcmd.c:230 + #, c-format + msgid "rcmd: poll (setting up stderr): %m\n" + msgstr "rcmd: poll (nastavenie stderr): %m\n" + +-#: inet/rcmd.c:110 ++#: inet/rcmd.c:158 + msgid "rcmd: socket: All ports in use\n" + msgstr "rcmd: socket: V�etky porty s� pou�it�\n" + +-#: inet/rcmd.c:166 ++#: inet/rcmd.c:220 + #, c-format + msgid "rcmd: write (setting up stderr): %m\n" + msgstr "rcmd: write (nastavenie stderr): %m\n" + +-#: sunrpc/svc_simple.c:98 ++#: sunrpc/svc_simple.c:99 + msgid "registerrpc: out of memory\n" + msgstr "registerrpc: nedostatok pam�ti\n" + +-#: timezone/zic.c:1849 ++#: timezone/zic.c:1874 + msgid "repeated leap second moment" + msgstr "opakovan� moment priestupnej sekundy" + +-#: locale/programs/repertoire.c:95 ++#: locale/programs/repertoire.c:342 + #, c-format + msgid "repertoire map file `%s' not found" + msgstr "s�bor mapy reperto�ru `%s' nebol n�jden�" + ++#: locale/programs/charmap.c:1063 ++msgid "resulting bytes for range not representable." ++msgstr "v�sledn� bajty rozsahu nie s� zobrazite�n�" ++ + #: sunrpc/rpc_main.c:1117 + msgid "rpcgen: arglist coding error\n" + msgstr "rpcgen: chyba k�dovania zoznamu argumentov\n" +@@ -3801,469 +5034,401 @@ + msgid "rpcinfo: can't contact portmapper" + msgstr "rpcinfo: nie je mo�n� spoji� sa s portmapperom" + +-#: timezone/zic.c:718 timezone/zic.c:720 ++#: timezone/zic.c:743 timezone/zic.c:745 + msgid "same rule name in multiple files" + msgstr "rovnak� meno pravidla vo viacer�ch s�boroch" + +-#: nscd/connections.c:387 ++#: elf/dl-load.c:1116 ++msgid "shared object cannot be dlopen()ed" ++msgstr "zdie�an� objekt nem��e by� otvoren� pomocou dlopen()" ++ ++#: elf/dl-close.c:63 ++msgid "shared object not open" ++msgstr "zdie�an� objekt nie je otvoren�" ++ ++#: nscd/connections.c:482 + #, c-format + msgid "short read while reading request key: %s" + msgstr "ne�pln� ��tanie k���a �iadosti: %s" + +-#: nscd/connections.c:364 ++#: nscd/connections.c:436 + #, c-format + msgid "short read while reading request: %s" + msgstr "ne�pln� ��tanie �iadosti: `%s'" + +-#: nscd/grpcache.c:191 nscd/hstcache.c:278 nscd/pwdcache.c:188 ++#: nscd/grpcache.c:193 nscd/hstcache.c:278 nscd/pwdcache.c:189 + #, c-format + msgid "short write in %s: %s" + msgstr "ne�pln� z�pis v %s: %s" + +-#: inet/rcmd.c:197 ++#: inet/rcmd.c:260 + msgid "socket: protocol failure in circuit setup\n" + msgstr "socket: chyba protokolu pri pr�prave okruhu\n" + +-#: locale/programs/locfile.c:730 +-msgid "sorting order `forward' and `backward' are mutually exclusive" +-msgstr "poradie triedenia `forward' a `backward' sa navz�jom vylu�uj�" +- +-#: locale/programs/ld-collate.c:1582 locale/programs/ld-collate.c:1628 +-msgid "specification of sorting weight for collation symbol does not make sense" +-msgstr "�pecifik�cia v�h triedenia pre symbol triedenia ned�va zmysel" +- +-#: timezone/zic.c:789 ++#: timezone/zic.c:814 + msgid "standard input" + msgstr "�tandardn� vstup" + +-#: timezone/zdump.c:268 ++#: timezone/zdump.c:269 + msgid "standard output" + msgstr "�tandardn� v�stup" + +-#: locale/programs/ld-time.c:272 +-#, c-format +-msgid "starting date is illegal in string %d in `era' field in category `%s'" +-msgstr "nepr�pustn� po�iato�n� d�tum v re�azci %d v poli `era' kateg�rie `%s'" ++#: locale/programs/ld-ctype.c:1680 ++msgid "start and end character sequence of range must have the same length" ++msgstr "�vodn� a koncov� znakov� sekvencia rozsahu musia ma� rovnak� d�ku" + +-#: timezone/zic.c:1300 ++#: timezone/zic.c:1325 + msgid "starting year greater than ending year" + msgstr "po�iato�n� rok v��� ako koncov�" + +-#: timezone/zic.c:1272 timezone/zic.c:1297 ++#: timezone/zic.c:1297 timezone/zic.c:1322 + msgid "starting year too high to be represented" + msgstr "po�iato�n� rok prive�k� pre zobrazenie" + +-#: timezone/zic.c:1270 timezone/zic.c:1295 ++#: timezone/zic.c:1295 timezone/zic.c:1320 + msgid "starting year too low to be represented" + msgstr "po�iato�n� rok primal� pre zobrazenie" + +-#: locale/programs/ld-time.c:348 +-#, c-format +-msgid "stopping date is illegal in string %d in `era' field in category `%s'" +-msgstr "nepr�pustn� koncov� d�tum v re�azci %d v poli `era' kateg�rie `%s'" +- +-#: sunrpc/svc_run.c:81 +-msgid "svc_run: - select failed" +-msgstr "svc_run: - select zlyhal" ++#: iconv/iconv_prog.c:63 ++msgid "suppress warnings" ++msgstr "potla�i� varovania" ++ ++#: sunrpc/svc_run.c:76 ++msgid "svc_run: - poll failed" ++msgstr "svc_run: - poll zlyhal" + +-#: sunrpc/svc_tcp.c:160 ++#: sunrpc/svc_tcp.c:161 + msgid "svc_tcp.c - cannot getsockname or listen" + msgstr "svc_tcp.c - nie je mo�n� vykona� getsockname alebo listen" + +-#: sunrpc/svc_tcp.c:145 ++#: sunrpc/svc_tcp.c:146 + msgid "svc_tcp.c - tcp socket creation problem" + msgstr "svc_tcp.c - probl�m pri vytv�ran� tcp socketu" + +-#: sunrpc/svc_tcp.c:209 sunrpc/svc_tcp.c:215 ++#: sunrpc/svc_tcp.c:210 sunrpc/svc_tcp.c:216 + msgid "svc_tcp: makefd_xprt: out of memory\n" + msgstr "svc_tcp: makefd_xprt: nedostatok pam�ti\n" + +-#: sunrpc/svc_unix.c:135 ++#: sunrpc/svc_unix.c:137 + msgid "svc_unix.c - AF_UNIX socket creation problem" + msgstr "svc_unix.c - probl�m pri vytv�ran� AF_UNIX socketu" + +-#: sunrpc/svc_unix.c:151 ++#: sunrpc/svc_unix.c:153 + msgid "svc_unix.c - cannot getsockname or listen" + msgstr "svc_unix.c - nem��em vykona� getsockname alebo listen" + +-#: sunrpc/svc_unix.c:201 sunrpc/svc_unix.c:207 ++#: sunrpc/svc_unix.c:203 sunrpc/svc_unix.c:209 + msgid "svc_unix: makefd_xprt: out of memory\n" + msgstr "svc_unix: makefd_xprt: nedostatok pam�ti\n" + +-#: sunrpc/svc_tcp.c:168 sunrpc/svc_tcp.c:176 ++#: sunrpc/svc_tcp.c:169 sunrpc/svc_tcp.c:177 + msgid "svctcp_create: out of memory\n" + msgstr "svctcp_create: nedostatok pam�ti\n" + +-#: sunrpc/svc_udp.c:135 ++# msgmerge complains: duplicate message definition ++# 3073: ...this is the location of the first definition ++# entry disabled, Martin v. L�wis ++# #: sunrpc/svc_tcp.c:168 sunrpc/svc_tcp.c:176 ++# msgid "svctcp_create: out of memory\n" ++# msgstr "svctcp_create: nedostatok pam�ti\n" ++#: sunrpc/svc_udp.c:141 + msgid "svcudp_create - cannot getsockname" + msgstr "svcudp_create - nem��em vykona� getsockname" + +-#: sunrpc/svc_udp.c:143 sunrpc/svc_udp.c:149 sunrpc/svc_udp.c:155 ++#: sunrpc/svc_udp.c:149 sunrpc/svc_udp.c:155 sunrpc/svc_udp.c:161 + msgid "svcudp_create: out of memory\n" + msgstr "svcudp_create: nedostatok pam�ti\n" + +-#: sunrpc/svc_udp.c:121 ++#: sunrpc/svc_udp.c:127 + msgid "svcudp_create: socket creation problem" + msgstr "svcudp_create: probl�m pri vytv�ran� socketu" + +-#: sunrpc/svc_unix.c:160 sunrpc/svc_unix.c:168 ++#: sunrpc/svc_udp.c:177 ++msgid "svcudp_create: xp_pad is too small for IP_PKTINFO\n" ++msgstr "svcudp_create: xp_pad je pr�li� mal� pre IP_PKTINFO\n" ++ ++#: sunrpc/svc_unix.c:162 sunrpc/svc_unix.c:170 + msgid "svcunix_create: out of memory\n" + msgstr "svcunix_create: nedostatok pam�ti\n" + +-#: locale/programs/ld-collate.c:1201 ++#: locale/programs/linereader.c:745 + #, c-format +-msgid "symbol for multicharacter collating element `%.*s' duplicates element definition" +-msgstr "symbol pre viacznakov� element triedenia `%.*s' duplikuje defin�ciu elementu" ++msgid "symbol `%.*s' not in charmap" ++msgstr "symbol `%.*s' nie je v mape znakov" + +-#: locale/programs/ld-collate.c:1073 ++#: locale/programs/linereader.c:766 + #, c-format +-msgid "symbol for multicharacter collating element `%.*s' duplicates other element definition" +-msgstr "symbol pre viacznakov� element triedenia `%.*s' duplikuje in� element" ++msgid "symbol `%.*s' not in repertoire map" ++msgstr "symbol `%.*s' nie je v mape reperto�ru" + +-#: locale/programs/ld-collate.c:1210 ++#: locale/programs/ld-collate.c:1617 locale/programs/ld-collate.c:1716 + #, c-format +-msgid "symbol for multicharacter collating element `%.*s' duplicates other symbol definition" +-msgstr "symbol pre viacznakov� element triedenia `%.*s' duplikuje defin�ciu in�ho symbolu" ++msgid "symbol `%s'" ++msgstr "symbol `%s'" + +-#: locale/programs/ld-collate.c:1082 ++#: locale/programs/ld-collate.c:1614 locale/programs/ld-collate.c:1713 + #, c-format +-msgid "symbol for multicharacter collating element `%.*s' duplicates symbol definition" +-msgstr "symbol pre viacznakov� element triedenia `%.*s' duplikuje defin�ciu symbolu" ++msgid "symbol `%s' has the same encoding as" ++msgstr "symbol `%s' m� rovnak� k�dovanie ako" + +-#: locale/programs/ld-collate.c:1064 locale/programs/ld-collate.c:1192 ++#: locale/programs/ld-collate.c:1539 + #, c-format +-msgid "symbol for multicharacter collating element `%.*s' duplicates symbolic name in charset" +-msgstr "symbol pre viacznakov� element triedenia `%.*s' duplikuje symbolick� meno v znakovej sade" ++msgid "symbol `%s' not defined" ++msgstr "symbol `%s' nie je definovan�" + +-#: locale/programs/charmap.c:399 locale/programs/charmap.c:433 +-#: locale/programs/charmap.c:463 locale/programs/charmap.c:549 +-#: locale/programs/charmap.c:595 locale/programs/charmap.c:628 +-#: locale/programs/charmap.c:660 ++#: locale/programs/ld-ctype.c:1955 locale/programs/ld-ctype.c:2006 ++#: locale/programs/ld-ctype.c:2048 ++msgid "syntax error" ++msgstr "chyba syntaxe" ++ ++#: locale/programs/charmap.c:487 locale/programs/charmap.c:541 ++#: locale/programs/charmap.c:573 locale/programs/charmap.c:667 ++#: locale/programs/charmap.c:722 locale/programs/charmap.c:763 ++#: locale/programs/charmap.c:804 + #, c-format + msgid "syntax error in %s definition: %s" + msgstr "chyba syntaxe v defin�cii %s: %s" + +-#: locale/programs/locfile.c:750 +-msgid "syntax error in `order_start' directive" +-msgstr "chyba syntaxe v direkt�ve `order_start'" +- +-#: locale/programs/locfile.c:492 +-msgid "syntax error in character class definition" +-msgstr "chyba syntaxe v defin�cii triedy znakov" +- +-#: locale/programs/locfile.c:550 +-msgid "syntax error in character conversion definition" +-msgstr "chyba syntaxe v defin�cie konverzie znakov" +- +-#: locale/programs/locfile.c:792 +-msgid "syntax error in collating order definition" +-msgstr "chyba syntaxe v defin�cii poradia triedenia" +- +-#: locale/programs/locfile.c:642 +-msgid "syntax error in collation definition" +-msgstr "chyba syntaxe v defin�cii triedenia" +- +-#: locale/programs/locfile.c:465 +-msgid "syntax error in definition of LC_CTYPE category" +-msgstr "chyba syntaxe v defin�cii kateg�rie LC_CTYPE" +- +-#: locale/programs/locfile.c:408 +-msgid "syntax error in definition of new character class" +-msgstr "chyba syntaxe v defin�cii novej triedy znakov" +- +-#: locale/programs/locfile.c:418 +-msgid "syntax error in definition of new character map" +-msgstr "chyba syntaxe v defin�cii novej znakovej sady" +- +-#: locale/programs/locfile.c:1003 +-msgid "syntax error in message locale definition" +-msgstr "chyba syntaxe v defin�cii n�rodn�ho prostredia spr�v" +- +-#: locale/programs/locfile.c:914 +-msgid "syntax error in monetary locale definition" +-msgstr "chyba syntaxe v defin�cii n�rodn�ho prostredia pe�a�n�ch hodn�t" +- +-#: locale/programs/locfile.c:941 +-msgid "syntax error in numeric locale definition" +-msgstr "chyba syntaxe v defin�cii n�rodn�ho prostredia pre ��sla" +- +-#: locale/programs/locfile.c:852 +-msgid "syntax error in order specification" +-msgstr "chyba syntaxe v �pecifik�cii poradia" +- +-#: locale/programs/charmap.c:280 locale/programs/charmap.c:296 +-#: locale/programs/repertoire.c:143 ++#: locale/programs/charmap.c:346 locale/programs/charmap.c:363 ++#: locale/programs/repertoire.c:175 + #, c-format + msgid "syntax error in prolog: %s" + msgstr "chyba syntaxe v prol�gu: %s" + +-#: locale/programs/repertoire.c:198 locale/programs/repertoire.c:237 +-#: locale/programs/repertoire.c:260 ++#: locale/programs/repertoire.c:230 locale/programs/repertoire.c:271 ++#: locale/programs/repertoire.c:296 + #, c-format + msgid "syntax error in repertoire map definition: %s" + msgstr "chyba syntaxe v defin�cii mapy reperto�ru: %s" + +-#: locale/programs/locfile.c:979 +-msgid "syntax error in time locale definition" +-msgstr "chyba syntaxe v defin�cii n�rodn�ho prostredia pre �as" +- +-#: locale/programs/locfile.c:385 ++#: locale/programs/locfile.c:243 + msgid "syntax error: not inside a locale definition section" + msgstr "chyba syntaxe: nie je vn�tri sekcie defin�cie n�rodn�ho prostredia" + +-#: iconv/iconv_prog.c:137 ++#: iconv/iconv_prog.c:143 + msgid "target encoding not specified using `-t'" + msgstr "k�dovanie cie�a nebolo zadan� pomocou `-t'" + +-#: catgets/gencat.c:390 catgets/gencat.c:526 catgets/gencat.c:553 ++#: catgets/gencat.c:432 catgets/gencat.c:605 catgets/gencat.c:634 + msgid "this is the first definition" + msgstr "toto je prv� defin�cia" + +-#: timezone/zic.c:1132 ++#: timezone/zic.c:1157 + msgid "time before zero" + msgstr "�as men�� ako nula" + +-#: timezone/zic.c:1140 timezone/zic.c:2015 timezone/zic.c:2034 ++#: timezone/zic.c:1165 timezone/zic.c:2042 timezone/zic.c:2061 + msgid "time overflow" + msgstr "prete�enie �asu" + +-#: locale/programs/charmap.c:443 ++#: locale/programs/ld-ctype.c:1553 locale/programs/ld-ctype.c:2029 ++#, c-format ++msgid "to-value <U%0*X> of range is smaller than from-value <U%0*X>" ++msgstr "to-value <U%0*X> rozsahu je men�ia ako from-value <U%0*X>" ++ ++#: locale/programs/ld-ctype.c:1687 ++msgid "to-value character sequence is smaller than from-value sequence" ++msgstr "to-value sekvencia znakov je men�ia ako sekvencia from-value" ++ ++#: locale/programs/charmap.c:551 + msgid "too few bytes in character encoding" + msgstr "prim�lo bajtov v k�dovan� znaku" + +-#: locale/programs/charmap.c:445 ++#: locale/programs/charmap.c:553 + msgid "too many bytes in character encoding" + msgstr "prive�a bajtov v k�dovan� znaku" + +-#: locale/programs/locales.h:92 +-msgid "too many character classes defined" +-msgstr "prive�a definovan�ch tried znakov" +- +-#: timezone/zic.c:1843 ++#: timezone/zic.c:1868 + msgid "too many leap seconds" + msgstr "prive�a priestupn�ch sek�nd" + +-#: timezone/zic.c:1815 ++#: timezone/zic.c:1840 + msgid "too many local time types" + msgstr "prive�a lok�lnych typov �asu" + +-#: timezone/zic.c:1769 ++#: timezone/zic.c:1794 + msgid "too many transitions?!" + msgstr "prive�a prechodov?!" + +-#: locale/programs/ld-collate.c:1637 +-msgid "too many weights" +-msgstr "prive�a v�h" +- +-#: timezone/zic.c:2138 ++#: timezone/zic.c:2165 + msgid "too many, or too long, time zone abbreviations" + msgstr "pr�li� ve�a alebo pr�li� dlh� skratku �asovej z�ny" + +-#: locale/programs/linereader.h:146 ++#: locale/programs/linereader.h:157 + msgid "trailing garbage at end of line" + msgstr "smetie na konci riadku" + +-#: sunrpc/svc_simple.c:150 ++#: sunrpc/svc_simple.c:151 + #, c-format + msgid "trouble replying to prog %d\n" + msgstr "probl�my pri odpovedi programu %d\n" + +-#: locale/programs/ld-collate.c:1393 +-msgid "two lines in a row containing `...' are not allowed" +-msgstr "dva riadky za sebou obsahuj�ce `...' nie s� povolen�" +- +-#: timezone/zic.c:1307 ++#: timezone/zic.c:1332 + msgid "typed single year" + msgstr "zadan� jeden rok" + +-#: iconv/iconv_prog.c:406 ++#: iconv/iconv_prog.c:491 + msgid "unable to allocate buffer for input" + msgstr "nie je mo�n� prideli� vyrovn�vaciu pam� pre vstup" + +-#: nis/nis_callback.c:187 ++#: nis/nis_callback.c:189 + msgid "unable to free arguments" + msgstr "nie je mo�n� uvo�ni� argumenty" + +-#: posix/getconf.c:654 posix/getconf.c:670 ++#: posix/getconf.c:781 posix/getconf.c:797 + msgid "undefined" + msgstr "nedefinovan�" + +-#: locale/programs/charmap.c:701 locale/programs/charmap.c:712 ++#: locale/programs/charmap.c:856 locale/programs/charmap.c:867 + #, c-format + msgid "unknown character `%s'" + msgstr "nezn�my znak `%s'" + +-#: locale/programs/ld-messages.c:202 locale/programs/ld-messages.c:213 +-#: locale/programs/ld-messages.c:224 locale/programs/ld-messages.c:235 +-#: locale/programs/ld-time.c:718 +-#, c-format +-msgid "unknown character in field `%s' of category `%s'" +-msgstr "nezn�my znak v poli `%s' kateg�rie `%s'" +- +-#: locale/programs/locfile.c:715 +-msgid "unknown collation directive" +-msgstr "nezn�ma direkt�va triedenia" +- +-#: catgets/gencat.c:487 ++#: catgets/gencat.c:562 + #, c-format + msgid "unknown directive `%s': line ignored" + msgstr "nezn�ma direkt�va `%s' - riadok ignorovan�" + +-#: iconv/iconv_prog.c:353 ++#: iconv/iconv_prog.c:438 + #, c-format + msgid "unknown iconv() error %d" + msgstr "nezn�ma iconv() chyba %d" + +-#: catgets/gencat.c:466 ++#: catgets/gencat.c:508 + #, c-format + msgid "unknown set `%s'" + msgstr "nezn�ma sada `%s'" + +-#: locale/programs/ld-collate.c:1377 locale/programs/ld-collate.c:1572 +-#: locale/programs/ld-collate.c:1747 +-#, c-format +-msgid "unknown symbol `%.*s': line ignored" +-msgstr "nezn�my symbol `%.*s' - riadok ignorovan�" +- +-#: timezone/zic.c:761 ++#: timezone/zic.c:786 + msgid "unruly zone" + msgstr "z�na bez pravidiel" + +-#: catgets/gencat.c:971 ++#: catgets/gencat.c:1169 + msgid "unterminated message" + msgstr "neukon�en� spr�va" + +-#: locale/programs/linereader.c:520 locale/programs/linereader.c:555 ++#: locale/programs/linereader.c:599 locale/programs/linereader.c:784 + msgid "unterminated string" + msgstr "neukon�en� re�azec" + +-#: sunrpc/rpc_scan.c:350 sunrpc/rpc_scan.c:376 ++#: sunrpc/rpc_scan.c:351 sunrpc/rpc_scan.c:377 + msgid "unterminated string constant" + msgstr "neukon�en� re�azcov� kon�tanta" + +-#: locale/programs/linereader.c:390 ++#: locale/programs/linereader.c:469 + msgid "unterminated symbolic name" + msgstr "neukon�en� symbolick� meno" + +-#: locale/programs/ld-collate.c:1699 +-msgid "unterminated weight name" +-msgstr "neukon�en� meno v�hy" ++#: locale/programs/charmap.c:1005 ++msgid "upper limit in range is not higher then lower limit" ++msgstr "horn� limit rozsahu nie je v��� ako doln�" + +-#: locale/programs/charset.c:104 ++#: locale/programs/repertoire.c:455 + msgid "upper limit in range is not smaller then lower limit" + msgstr "horn� limit rozsahu je men�� ako doln�" + +-#: sunrpc/rpc_main.c:1415 ++#: sunrpc/rpc_main.c:1424 + #, c-format +-msgid "usage: %s infile\n" ++msgid "usage: %s infile\n" + msgstr "pou�itie: %s vstupn�_s�bor\n" + +-#: timezone/zic.c:2081 ++#: timezone/zic.c:2108 + msgid "use of 2/29 in non leap-year" + msgstr "29. febru�r pou�it� v nepriestupnom roku" + +-#: locale/programs/charmap.c:522 locale/programs/charmap.c:576 ++#: locale/programs/charmap.c:640 locale/programs/charmap.c:703 + #, c-format + msgid "value for %s must be an integer" + msgstr "hodnota pre %s mus� by� cel� ��slo" + +-#: locale/programs/charmap.c:318 ++#: locale/programs/charmap.c:399 + #, c-format +-msgid "value for <%s> must lie between 1 and 4" +-msgstr "honota pre <%s> mus� by� medzi 1 a 4" ++msgid "value for <%s> must be 1 or greater" ++msgstr "hodnota pre <%s> mus� by� 1 alebo viac" + +-#: locale/programs/ld-monetary.c:157 locale/programs/ld-numeric.c:92 ++#: locale/programs/charmap.c:411 + #, c-format +-msgid "value for field `%s' in category `%s' must not be the empty string" +-msgstr "hodnota po�a `%s' kateg�rie `%s' nesmie by� pr�zdny re�azec" +- +-#: locale/programs/charmap.c:330 +-msgid "value of <mb_cur_max> must be greater than the value of <mb_cur_min>" +-msgstr "hodnota <mb_cur_max> mus� by� v��ia ako hodnota <mb_cur_min>" ++msgid "value of <%s> must be greater or equal than the value of <%s>" ++msgstr "hodnota <%s> mus� by� v��ia alebo rovn� hodnote <%s>" + +-#: locale/programs/ld-monetary.c:147 +-msgid "value of field `int_curr_symbol' in category `LC_MONETARY' does not correspond to a valid name in ISO 4217" +-msgstr "hodnota po�a `int_curr_symbol' kateg�rie `LC_MONETARY' nezodpoved� platn�mu menu v ISO 4217" ++#: timezone/zic.c:433 ++msgid "warning: " ++msgstr "varovanie: " + +-#: locale/programs/ld-monetary.c:139 +-msgid "value of field `int_curr_symbol' in category `LC_MONETARY' has wrong length" +-msgstr "hodnota po�a `int_curr_symbol' kateg�rie `LC_MONETARY' m� chybn� d�ku" +- +-#: locale/programs/ld-monetary.c:383 locale/programs/ld-numeric.c:207 +-#, c-format +-msgid "values for field `%s' in category `%s' must be smaller than 127" +-msgstr "hodnoty po�a `%s' kateg�rie `%s' musia by� men�ie ako 127" +- +-#: nscd/connections.c:355 ++#: nscd/connections.c:427 + #, c-format + msgid "while accepting connection: %s" + msgstr "po�as prijatia spojenia: %s" + +-#: nscd/grpcache.c:149 nscd/hstcache.c:168 nscd/pwdcache.c:142 ++#: nscd/grpcache.c:150 nscd/hstcache.c:165 nscd/pwdcache.c:143 + msgid "while allocating cache entry" + msgstr "po�as pridelenia z�znamu cache" + +-#: nscd/cache.c:85 ++#: nscd/cache.c:88 + msgid "while allocating hash table entry" + msgstr "po�as pridelenia z�znamu hash-tabu�ky" + +-#: nscd/grpcache.c:99 nscd/hstcache.c:109 nscd/pwdcache.c:105 ++#: nscd/grpcache.c:100 nscd/hstcache.c:108 nscd/pwdcache.c:106 + msgid "while allocating key copy" + msgstr "po�as pridelenia k�pie k���a" + +-#: catgets/gencat.c:1001 ++#: catgets/gencat.c:1199 + msgid "while opening old catalog file" + msgstr "po�as otv�rania star�ho katal�gu" + +-#: locale/programs/locale.c:346 ++#: locale/programs/locale.c:361 + msgid "while preparing output" + msgstr "po�as pr�pravy v�stupu" + +-#: db2/makedb.c:365 db2/makedb.c:382 +-msgid "while reading database" +-msgstr "po�as ��tania datab�zy" +- +-#: elf/sprof.c:683 ++#: elf/sprof.c:679 + msgid "while stat'ing profiling data file" + msgstr "po�as stat-u s�boru profilovac�ch inform�ci�" + +-#: db2/makedb.c:334 +-msgid "while writing database file" +-msgstr "po�as z�pisu datab�zy" ++#: locale/programs/ld-ctype.c:2392 ++msgid "with UCS range values one must use the hexadecimal symbolic ellipsis `..'" ++msgstr "v rozsahu hodn�t UCS treba pou�i� hexadecim�lne symbolick� pokra�ovanie `..'" ++ ++#: locale/programs/ld-ctype.c:2406 ++msgid "with character code range values one must use the absolute ellipsis `...'" ++msgstr "v rozsahu hodn�t k�dov znakov treba pou�i� absol�tne pokra�ovanie `...'" ++ ++#: locale/programs/ld-ctype.c:2377 ++msgid "with symbolic name range values the absolute ellipsis `...' must not be used" ++msgstr "v symbolickom rozsahu hodn�t nesmie by� pou�it� absol�tne pokra�ovanie `...'" + +-#: nscd/nscd_stat.c:115 ++#: nscd/nscd_stat.c:116 + msgid "write incomplete" + msgstr "ne�pln� z�pis" + +-#: inet/rcmd.c:320 ++#: inet/rcmd.c:426 + msgid "writeable by other than owner" + msgstr "zapisovate�n� nielen pre vlastn�ka" + +-#: db2/makedb.c:124 nscd/nscd.c:114 nss/getent.c:392 ++#: nscd/nscd.c:123 nscd/nscd_nischeck.c:64 nss/getent.c:761 + msgid "wrong number of arguments" + msgstr "chybn� po�et argumentov" + +-#: timezone/zic.c:1090 ++#: timezone/zic.c:1115 + msgid "wrong number of fields on Leap line" + msgstr "chybn� po�et pol� v riadku Leap" + +-#: timezone/zic.c:1181 ++#: timezone/zic.c:1206 + msgid "wrong number of fields on Link line" + msgstr "chybn� po�et pol� v riadku Link" + +-#: timezone/zic.c:924 ++#: timezone/zic.c:949 + msgid "wrong number of fields on Rule line" + msgstr "chybn� po�t pol� v riadku Rule" + +-#: timezone/zic.c:994 ++#: timezone/zic.c:1019 + msgid "wrong number of fields on Zone continuation line" + msgstr "chybn� po�et pol� v pokra�ovacom riadku Zone" + +-#: timezone/zic.c:952 ++#: timezone/zic.c:977 + msgid "wrong number of fields on Zone line" + msgstr "chybn� po�et pol� v riadku Zone" + +-#: sunrpc/xdr_ref.c:84 ++#: sunrpc/xdr_ref.c:85 + msgid "xdr_reference: out of memory\n" + msgstr "xdr_reference: nedostatok pam�ti\n" + +@@ -4271,10 +5436,10 @@ + msgid "xdrrec_create: out of memory\n" + msgstr "xdrrec_create: nedostatok pam�ti\n" + +-#: nis/ypclnt.c:884 ++#: nis/ypclnt.c:907 + msgid "yp_update: cannot convert host to netname\n" + msgstr "yp_update: nie je mo�n� konvertova� meno po��ta�a na meno siete\n" + +-#: nis/ypclnt.c:896 ++#: nis/ypclnt.c:919 + msgid "yp_update: cannot get server address\n" + msgstr "yp_update: nie je mo�n� z�sti� adresu servera\n" diff --git a/patches/glibc/2.2.2/arm-ctl_bus_isa.patch b/patches/glibc/2.2.2/arm-ctl_bus_isa.patch new file mode 100644 index 00000000..3422070b --- /dev/null +++ b/patches/glibc/2.2.2/arm-ctl_bus_isa.patch @@ -0,0 +1,51 @@ +Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004. +Needed to build glibc with linux kernels 2.4.23 or higher on ARM, +Fixes following error: + +../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys': +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]') +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]') +make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1 + +cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA", http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html + +--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old 2003-02-20 14:22:24.000000000 -0800 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c 2004-01-31 16:01:50.000000000 -0800 +@@ -47,6 +47,12 @@ + #include <asm/page.h> + #include <sys/sysctl.h> + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include <linux/version.h> ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23)) ++#define CTL_BUS_ISA BUS_ISA /* and hope it's not the one from linux/input.h */ ++#endif ++ + #define PATH_ARM_SYSTYPE "/etc/arm_systype" + #define PATH_CPUINFO "/proc/cpuinfo" + +@@ -80,7 +86,7 @@ + * Initialize I/O system. There are several ways to get the information + * we need. Each is tried in turn until one succeeds. + * +- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*). This is the preferred method ++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*). This is the preferred method + * but not all kernels support it. + * + * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE. +@@ -100,8 +106,8 @@ + { + char systype[256]; + int i, n; +- static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE }; +- static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT }; ++ static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE }; ++ static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT }; + size_t len = sizeof(io.base); + + if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0) diff --git a/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc-3.4-grp.patch b/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc-3.4-grp.patch new file mode 100644 index 00000000..db70efb2 --- /dev/null +++ b/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc-3.4-grp.patch @@ -0,0 +1,56 @@ +Fixes +initgroups.c: In function `internal_getgrouplist': +initgroups.c:179: error: parse error before "__FUNCTION__" + +CVSROOT: /cvs/glibc +Module name: libc +Changes by: roland@sources.redhat.com 2001-12-16 21:52:12 + +Modified files: + nss : nsswitch.c + grp : initgroups.c + +Log message: + 2001-12-16 Roland McGrath <roland@frob.com> + + * nss/nsswitch.c (__nss_next): Don't use __FUNCTION__ as literal. + * grp/initgroups.c (internal_getgrouplist): Likewise. + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/grp/initgroups.c.diff?r1=1.26&r2=1.27&cvsroot=glibc +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/nss/nsswitch.c.diff?r1=1.52&r2=1.53&cvsroot=glibc + +Removed 2nd hunk for glibc-2.1.3 (it was just whitespace) + +=================================================================== +RCS file: /cvs/glibc/libc/grp/initgroups.c,v +retrieving revision 1.26 +retrieving revision 1.27 +diff -u -r1.26 -r1.27 +--- libc/grp/initgroups.c 2001/07/06 04:54:46 1.26 ++++ libc/grp/initgroups.c 2001/12/17 05:52:11 1.27 +@@ -176,7 +176,7 @@ + + /* This is really only for debugging. */ + if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN) +- __libc_fatal ("illegal status in " __FUNCTION__); ++ __libc_fatal ("illegal status in internal_getgrouplist"); + + if (status != NSS_STATUS_SUCCESS + && nss_next_action (nip, status) == NSS_ACTION_RETURN) + +=================================================================== +RCS file: /cvs/glibc/libc/nss/nsswitch.c,v +retrieving revision 1.52 +retrieving revision 1.53 +diff -u -r1.52 -r1.53 +--- libc/nss/nsswitch.c 2001/07/17 08:21:36 1.52 ++++ libc/nss/nsswitch.c 2001/12/17 05:52:11 1.53 +@@ -178,7 +178,7 @@ + { + /* This is really only for debugging. */ + if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN) +- __libc_fatal ("illegal status in " __FUNCTION__); ++ __libc_fatal ("illegal status in __nss_next"); + + if (nss_next_action (*ni, status) == NSS_ACTION_RETURN) + return 1; diff --git a/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc3-sscanf.patch b/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc3-sscanf.patch new file mode 100644 index 00000000..b1269e09 --- /dev/null +++ b/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc3-sscanf.patch @@ -0,0 +1,73 @@ +http://sources.redhat.com/ml/bug-glibc/2003-08/msg00087.html + +From: Gernot Hillier <gernot dot hillier at siemens dot com> +Organization: Siemens AG +To: Jeffrey Bedard <jefbed at e-list dot net>, bug-glibc at gnu dot org +Date: Mon, 18 Aug 2003 08:50:03 +0200 +References: <3F3D0899.6020004@e-list.net> +Message-Id: <200308180850.03431.gernot.hillier@siemens.com> +Subject: Re: Build Fails with gcc 3.3.1 +X-BeenThere: bug-glibc@gnu.org + +Hi! + +Am Freitag, 15. August 2003 18:21 schrieb Jeffrey Bedard: +> gcc sscanf.c -c -std=gnu99 -O2 -Wall -Winline -Wstrict-prototypes +[...] +> sscanf.c:31: warning: conflicting types for built-in function `sscanf' +> sscanf.c: In function `sscanf': +> sscanf.c:37: error: `va_start' used in function with fixed args +> .../stdio-common/_itoa.h: At top level: +> .../stdio-common/_itoa.h:40: warning: inlining failed in call to +> `_itoa_word' .../stdio-common/_itoa.h:76: warning: called from here +> make[2]: *** +> [/home/jefbed/src/packages/glibc-build/stdio-common/sscanf.o] Error 1 + +You can find the fitting patch in the glibc CVS. You have to replace some +function headers. + +I created a patch for glibc-2.2.5 for the same reason. I don't know if it +applies cleanly, but if not it should at least show you what to do... + +-- +Bye, + +Gernot Hillier +Siemens AG + + + + +Content-Disposition: attachment; filename="glibc-2.2.5-gcc-3.3.diff" + +diff -ur glibc-2.2.5.orig/stdio-common/sprintf.c glibc-2.2.5/stdio-common/sprintf.c +--- glibc-2.2.5.orig/stdio-common/sprintf.c 2001-07-06 06:55:41.000000000 +0200 ++++ glibc-2.2.5/stdio-common/sprintf.c 2003-08-11 13:25:48.000000000 +0200 +@@ -27,9 +27,7 @@ + /* Write formatted output into S, according to the format string FORMAT. */ + /* VARARGS2 */ + int +-sprintf (s, format) +- char *s; +- const char *format; ++sprintf (char *s, const char *format,...) + { + va_list arg; + int done; +Only in glibc-2.2.5/stdio-common: sprintf.c.orig +Only in glibc-2.2.5/stdio-common: sprintf.c.rej +diff -ur glibc-2.2.5.orig/stdio-common/sscanf.c glibc-2.2.5/stdio-common/sscanf.c +--- glibc-2.2.5.orig/stdio-common/sscanf.c 2001-07-06 06:55:41.000000000 +0200 ++++ glibc-2.2.5/stdio-common/sscanf.c 2003-08-11 13:27:58.000000000 +0200 +@@ -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 --git a/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc3-versioninfo.patch b/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc3-versioninfo.patch new file mode 100644 index 00000000..ce888792 --- /dev/null +++ b/patches/glibc/2.2.2/glibc-2.1.3-allow-gcc3-versioninfo.patch @@ -0,0 +1,17 @@ +# gcc-3.x doesn't like run-on strings +# See also http://sources.redhat.com/ml/libc-alpha/2004-01/msg00032.html + +--- glibc-2.1.3/csu/Makefile.old 2004-03-04 12:18:52.000000000 -0800 ++++ glibc-2.1.3/csu/Makefile 2004-03-04 12:19:35.000000000 -0800 +@@ -188,8 +188,8 @@ + esac; \ + files="$(all-Banner-files)"; \ + if test -n "$$files"; then \ +- echo "\"Available extensions:"; \ +- sed -e '/^#/d' -e 's/^[[:space:]]*/ /' $$files; \ +- echo "\""; \ ++ echo -e "\"Available extensions:\\\\n\""; \ ++ sed -e '/^#/d' -e 's/^[[:space:]]*/ /' \ ++ -e 's/^\(.*\)$$/\"\1\\n\"/' $$files; \ + fi) > $@T + mv -f $@T $@ diff --git a/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc-3-configure.patch b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc-3-configure.patch new file mode 100644 index 00000000..efd6b2a0 --- /dev/null +++ b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc-3-configure.patch @@ -0,0 +1,21 @@ +Works around version check: + +checking for i686-unknown-linux-gnu-gcc... gcc +checking version of gcc... 3.4.2, bad +... +configure: error: +*** Some critical program is missing or too old. +*** Check the INSTALL file for required versions. + + +--- glibc-2.2.2/configure.old 2005-04-10 16:57:42.692071968 -0700 ++++ glibc-2.2.2/configure 2005-04-10 16:58:52.993384544 -0700 +@@ -1437,7 +1437,7 @@ + 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;; +- *gcc-2.9[5-9].*|*2.8.[1-9]*|*2.9|*2.9.[0-9]*|2.9[5-9]*|cygnus-2.9[1-9]*|gcc-2.9[5-9]|gcc-2.1[0-9][0-9]|sgicc-*) ++ *gcc-2.9[5-9].*|*3.[234].*|*2.8.[1-9]*|*2.9|*2.9.[0-9]*|2.9[5-9]*|cygnus-2.9[1-9]*|gcc-2.9[5-9]|gcc-2.1[0-9][0-9]|sgicc-*) + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + diff --git a/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-dl-machine-i386.patch b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-dl-machine-i386.patch new file mode 100644 index 00000000..b9461658 --- /dev/null +++ b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-dl-machine-i386.patch @@ -0,0 +1,232 @@ +Fixes errors: +In file included from dynamic-link.h:21, + from dl-load.c:32: +../sysdeps/i386/dl-machine.h:121: error: parse error before '.' token +../sysdeps/i386/dl-machine.h:122: error: stray '@' in program +../sysdeps/i386/dl-machine.h:125: error: syntax error at '#' token +../sysdeps/i386/dl-machine.h:128: error: syntax error at '#' token +../sysdeps/i386/dl-machine.h:129: error: syntax error at '#' token +../sysdeps/i386/dl-machine.h:129: error: stray '`' in program +../sysdeps/i386/dl-machine.h:129: error: missing terminating ' character +... +../sysdeps/i386/dl-machine.h:227:22: warning: character constant too long for its type +../sysdeps/i386/dl-machine.h:209: error: stray '\' in program +../sysdeps/i386/dl-machine.h:209: error: stray '\' in program +../sysdeps/i386/dl-machine.h:209: error: stray '\' in program +../sysdeps/i386/dl-machine.h:209: error: missing terminating " character +../sysdeps/i386/dl-machine.h: In function `dl_platform_init': +../sysdeps/i386/dl-machine.h:273: error: `_dl_platform' undeclared (first use in this function) +../sysdeps/i386/dl-machine.h:273: error: (Each undeclared identifier is reported only once +../sysdeps/i386/dl-machine.h:273: error: for each function it appears in.) +dl-load.c: In function `_dl_map_object_from_fd': +dl-load.c:1043: warning: use of cast expressions as lvalues is deprecated +dl-load.c:1043: warning: use of cast expressions as lvalues is deprecated +dl-load.c:1058: warning: use of cast expressions as lvalues is deprecated +dl-load.c:1058: warning: use of cast expressions as lvalues is deprecated + +dl-runtime.c:53: error: conflicting types for 'fixup' +../sysdeps/i386/dl-machine.h:67: error: previous declaration of 'fixup' was here +dl-runtime.c:53: error: conflicting types for 'fixup' +../sysdeps/i386/dl-machine.h:67: error: previous declaration of 'fixup' was here +dl-runtime.c:135: error: conflicting types for 'profile_fixup' +../sysdeps/i386/dl-machine.h:70: error: previous declaration of 'profile_fixup' was here +dl-runtime.c:135: error: conflicting types for 'profile_fixup' +../sysdeps/i386/dl-machine.h:70: error: previous declaration of 'profile_fixup' was here +../sysdeps/i386/dl-machine.h:67: warning: 'fixup' declared `static' but never defined +../sysdeps/i386/dl-machine.h:70: warning: 'profile_fixup' declared `static' but never defined + +Updated to repair breakage caused by unconditionally requiring ARCH_FIXUP_ATTRIBUTE +to be defined. (No wonder glibc-2.2.2 didn't build for anything but x86...) + +=================================================================== +--- glibc-2.2.2/sysdeps/i386/dl-machine.h.old 2005-04-11 17:45:13.000000000 -0700 ++++ glibc-2.2.2/sysdeps/i386/dl-machine.h 2005-04-12 10:01:47.000000000 -0700 +@@ -63,11 +63,14 @@ + destroys the passed register information. */ + /* GKM FIXME: Fix trampoline to pass bounds so we can do + without the `__unbounded' qualifier. */ ++ ++#define ARCH_FIXUP_ATTRIBUTE __attribute__ ((regparm (3), unused)) ++ + static ElfW(Addr) fixup (struct link_map *__unbounded l, ElfW(Word) reloc_offset) +- __attribute__ ((regparm (2), unused)); ++ ARCH_FIXUP_ATTRIBUTE; + static ElfW(Addr) profile_fixup (struct link_map *l, ElfW(Word) reloc_offset, + ElfW(Addr) retaddr) +- __attribute__ ((regparm (3), unused)); ++ ARCH_FIXUP_ATTRIBUTE; + #endif + + /* Set up the loaded object described by L so its unrelocated PLT +@@ -117,68 +120,68 @@ + and then redirect to the address it returns. */ + #if !defined PROF && !__BOUNDED_POINTERS__ + # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ +- .text +- .globl _dl_runtime_resolve +- .type _dl_runtime_resolve, @function +- .align 16 +-_dl_runtime_resolve: +- pushl %eax # Preserve registers otherwise clobbered. +- pushl %ecx +- pushl %edx +- movl 16(%esp), %edx # Copy args pushed by PLT in register. Note +- movl 12(%esp), %eax # that `fixup' takes its parameters in regs. +- call fixup # Call resolver. +- popl %edx # Get register content back. +- popl %ecx +- xchgl %eax, (%esp) # Get %eax contents end store function address. +- ret $8 # Jump to function address. +- .size _dl_runtime_resolve, .-_dl_runtime_resolve +- +- .globl _dl_runtime_profile +- .type _dl_runtime_profile, @function +- .align 16 +-_dl_runtime_profile: +- pushl %eax # Preserve registers otherwise clobbered. +- pushl %ecx +- pushl %edx +- movl 20(%esp), %ecx # Load return address +- movl 16(%esp), %edx # Copy args pushed by PLT in register. Note +- movl 12(%esp), %eax # that `fixup' takes its parameters in regs. +- call profile_fixup # Call resolver. +- popl %edx # Get register content back. +- popl %ecx +- xchgl %eax, (%esp) # Get %eax contents end store function address. +- ret $8 # Jump to function address. +- .size _dl_runtime_profile, .-_dl_runtime_profile +- .previous ++ .text\n\ ++ .globl _dl_runtime_resolve\n\ ++ .type _dl_runtime_resolve, @function\n\ ++ .align 16\n\ ++_dl_runtime_resolve:\n\ ++ pushl %eax # Preserve registers otherwise clobbered.\n\ ++ pushl %ecx\n\ ++ pushl %edx\n\ ++ movl 16(%esp), %edx # Copy args pushed by PLT in register. Note\n\ ++ movl 12(%esp), %eax # that `fixup' takes its parameters in regs.\n\ ++ call fixup # Call resolver.\n\ ++ popl %edx # Get register content back.\n\ ++ popl %ecx\n\ ++ xchgl %eax, (%esp) # Get %eax contents end store function address.\n\ ++ ret $8 # Jump to function address.\n\ ++ .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\ ++\n\ ++ .globl _dl_runtime_profile\n\ ++ .type _dl_runtime_profile, @function\n\ ++ .align 16\n\ ++_dl_runtime_profile:\n\ ++ pushl %eax # Preserve registers otherwise clobbered.\n\ ++ pushl %ecx\n\ ++ pushl %edx\n\ ++ movl 20(%esp), %ecx # Load return address\n\ ++ movl 16(%esp), %edx # Copy args pushed by PLT in register. Note\n\ ++ movl 12(%esp), %eax # that `fixup' takes its parameters in regs.\n\ ++ call profile_fixup # Call resolver.\n\ ++ popl %edx # Get register content back.\n\ ++ popl %ecx\n\ ++ xchgl %eax, (%esp) # Get %eax contents end store function address.\n\ ++ ret $8 # Jump to function address.\n\ ++ .size _dl_runtime_profile, .-_dl_runtime_profile\n\ ++ .previous\n\ + "); + #else +-# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ +- .text +- .globl _dl_runtime_resolve +- .globl _dl_runtime_profile +- .type _dl_runtime_resolve, @function +- .type _dl_runtime_profile, @function +- .align 16 +-_dl_runtime_resolve: +-_dl_runtime_profile: +- pushl %eax # Preserve registers otherwise clobbered. +- pushl %ecx +- pushl %edx +- movl 16(%esp), %edx # Push the arguments for `fixup' +- movl 12(%esp), %eax +- pushl %edx +- pushl %eax +- call fixup # Call resolver. +- popl %edx # Pop the parameters +- popl %ecx +- popl %edx # Get register content back. +- popl %ecx +- xchgl %eax, (%esp) # Get %eax contents end store function address. +- ret $8 # Jump to function address. +- .size _dl_runtime_resolve, .-_dl_runtime_resolve +- .size _dl_runtime_profile, .-_dl_runtime_profile +- .previous ++# define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\n\ ++ .text\n\ ++ .globl _dl_runtime_resolve\n\ ++ .globl _dl_runtime_profile\n\ ++ .type _dl_runtime_resolve, @function\n\ ++ .type _dl_runtime_profile, @function\n\ ++ .align 16\n\ ++_dl_runtime_resolve:\n\ ++_dl_runtime_profile:\n\ ++ pushl %eax # Preserve registers otherwise clobbered.\n\ ++ pushl %ecx\n\ ++ pushl %edx\n\ ++ movl 16(%esp), %edx # Push the arguments for `fixup'\n\ ++ movl 12(%esp), %eax\n\ ++ pushl %edx\n\ ++ pushl %eax\n\ ++ call fixup # Call resolver.\n\ ++ popl %edx # Pop the parameters\n\ ++ popl %ecx\n\ ++ popl %edx # Get register content back.\n\ ++ popl %ecx\n\ ++ xchgl %eax, (%esp) # Get %eax contents end store function address.\n\ ++ ret $8 # Jump to function address.\n\ ++ .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\ ++ .size _dl_runtime_profile, .-_dl_runtime_profile\n\ ++ .previous\n\ + "); + #endif + +@@ -205,7 +208,7 @@ + _dl_start_user:\n\ + # Save the user entry point address in %edi.\n\ + movl %eax, %edi\n\ +- # Point %ebx at the GOT. ++ # Point %ebx at the GOT.\n\ + call 0b\n\ + addl $_GLOBAL_OFFSET_TABLE_, %ebx\n\ + # Store the highest stack address\n\ + +=================================================================== +--- glibc-2.2.2/elf/dl-runtime.c.old 2005-07-07 15:40:26.000000000 -0700 ++++ glibc-2.2.2/elf/dl-runtime.c 2005-07-07 15:41:57.000000000 -0700 +@@ -33,6 +33,11 @@ + # define VERSYMIDX(sym) (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (sym)) + #endif + ++/* The fixup functions might have need special attributes. If none ++ are provided define the macro as empty. */ ++#ifndef ARCH_FIXUP_ATTRIBUTE ++# define ARCH_FIXUP_ATTRIBUTE ++#endif + + /* This function is called through a special trampoline from the PLT the + first time each PLT entry is called. We must perform the relocation +@@ -42,7 +47,7 @@ + function. */ + + #ifndef ELF_MACHINE_NO_PLT +-static ElfW(Addr) __attribute__ ((unused)) ++static ElfW(Addr) __attribute__ ((unused)) ARCH_FIXUP_ATTRIBUTE + fixup ( + # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS + ELF_MACHINE_RUNTIME_FIXUP_ARGS, +@@ -126,7 +131,7 @@ + + #if !defined PROF && !defined ELF_MACHINE_NO_PLT && !__BOUNDED_POINTERS__ + +-static ElfW(Addr) __attribute__ ((unused)) ++static ElfW(Addr) __attribute__ ((unused)) ARCH_FIXUP_ATTRIBUTE + profile_fixup ( + #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS + ELF_MACHINE_RUNTIME_FIXUP_ARGS, diff --git a/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-errlist.patch b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-errlist.patch new file mode 100644 index 00000000..1a9d4072 --- /dev/null +++ b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-errlist.patch @@ -0,0 +1,18 @@ +Fixes error +../sysdeps/unix/sysv/linux/errlist.c:41: error: weak declaration of '_old_sys_nerr' must precede definition + +=================================================================== +--- glibc-2.2.2/sysdeps/unix/sysv/linux/errlist.c.old 2005-04-11 16:58:21.000000000 -0700 ++++ glibc-2.2.2/sysdeps/unix/sysv/linux/errlist.c 2005-04-11 16:58:10.000000000 -0700 +@@ -38,10 +38,9 @@ + const int __old_sys_nerr = OLD_ERRLIST_SIZE; + + strong_alias (__old_sys_nerr, _old_sys_nerr); +-weak_alias (__old_sys_nerr, _old_sys_nerr) + compat_symbol (libc, __old_sys_nerr, _sys_nerr, GLIBC_2_0); + compat_symbol (libc, _old_sys_nerr, sys_nerr, GLIBC_2_0); +-weak_alias (__old_sys_errlist, _old_sys_errlist); ++strong_alias (__old_sys_errlist, _old_sys_errlist); + compat_symbol (libc, __old_sys_errlist, _sys_errlist, GLIBC_2_0); + compat_symbol (libc, _old_sys_errlist, sys_errlist, GLIBC_2_0); + #endif diff --git a/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-longlong.patch b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-longlong.patch new file mode 100644 index 00000000..b119b929 --- /dev/null +++ b/patches/glibc/2.2.2/glibc-2.2.2-allow-gcc3-longlong.patch @@ -0,0 +1,811 @@ +Fixes error +./longlong.h:423: error: parse error before '%' token +./longlong.h:423: error: missing terminating " character +./longlong.h:432: error: missing terminating " character +See also patches/glibc-2.1.3/glibc-2.1.3-allow-gcc3-longlong.patch + +=================================================================== +--- glibc-2.2.2/stdlib/longlong.h.old 2000-02-11 15:48:58.000000000 -0800 ++++ glibc-2.2.2/stdlib/longlong.h 2005-04-11 15:36:10.000000000 -0700 +@@ -108,8 +108,8 @@ + + #if (defined (__a29k__) || defined (_AM29K)) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("add %1,%4,%5 +- addc %0,%2,%3" \ ++ __asm__ ("add %1,%4,%5\n" \ ++ "addc %0,%2,%3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%r" ((USItype) (ah)), \ +@@ -117,8 +117,8 @@ + "%r" ((USItype) (al)), \ + "rI" ((USItype) (bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("sub %1,%4,%5 +- subc %0,%2,%3" \ ++ __asm__ ("sub %1,%4,%5\n" \ ++ "subc %0,%2,%3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "r" ((USItype) (ah)), \ +@@ -175,8 +175,8 @@ + + #if defined (__arc__) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("add.f %1, %4, %5 +- adc %0, %2, %3" \ ++ __asm__ ("add.f %1, %4, %5\n" \ ++ "adc %0, %2, %3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%r" ((USItype) (ah)), \ +@@ -184,8 +184,8 @@ + "%r" ((USItype) (al)), \ + "rIJ" ((USItype) (bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("sub.f %1, %4, %5 +- sbc %0, %2, %3" \ ++ __asm__ ("sub.f %1, %4, %5\n" \ ++ "sbc %0, %2, %3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "r" ((USItype) (ah)), \ +@@ -206,8 +206,8 @@ + + #if defined (__arm__) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("adds %1, %4, %5 +- adc %0, %2, %3" \ ++ __asm__ ("adds %1, %4, %5\n" \ ++ "adc %0, %2, %3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%r" ((USItype) (ah)), \ +@@ -215,8 +215,8 @@ + "%r" ((USItype) (al)), \ + "rI" ((USItype) (bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("subs %1, %4, %5 +- sbc %0, %2, %3" \ ++ __asm__ ("subs %1, %4, %5\n" \ ++ "sbc %0, %2, %3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "r" ((USItype) (ah)), \ +@@ -225,19 +225,19 @@ + "rI" ((USItype) (bl))) + #define umul_ppmm(xh, xl, a, b) \ + {register USItype __t0, __t1, __t2; \ +- __asm__ ("%@ Inlined umul_ppmm +- mov %2, %5, lsr #16 +- mov %0, %6, lsr #16 +- bic %3, %5, %2, lsl #16 +- bic %4, %6, %0, lsl #16 +- mul %1, %3, %4 +- mul %4, %2, %4 +- mul %3, %0, %3 +- mul %0, %2, %0 +- adds %3, %4, %3 +- addcs %0, %0, #65536 +- adds %1, %1, %3, lsl #16 +- adc %0, %0, %3, lsr #16" \ ++ __asm__ ("%@ Inlined umul_ppmm\n" \ ++ "mov %2, %5, lsr #16\n" \ ++ "mov %0, %6, lsr #16\n" \ ++ "bic %3, %5, %2, lsl #16\n" \ ++ "bic %4, %6, %0, lsl #16\n" \ ++ "mul %1, %3, %4\n" \ ++ "mul %4, %2, %4\n" \ ++ "mul %3, %0, %3\n" \ ++ "mul %0, %2, %0\n" \ ++ "adds %3, %4, %3\n" \ ++ "addcs %0, %0, #65536\n" \ ++ "adds %1, %1, %3, lsl #16\n" \ ++ "adc %0, %0, %3, lsr #16" \ + : "=&r" ((USItype) (xh)), \ + "=r" ((USItype) (xl)), \ + "=&r" (__t0), "=&r" (__t1), "=r" (__t2) \ +@@ -277,8 +277,8 @@ + + #if defined (__gmicro__) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("add.w %5,%1 +- addx %3,%0" \ ++ __asm__ ("add.w %5,%1\n" \ ++ "addx %3,%0" \ + : "=g" ((USItype) (sh)), \ + "=&g" ((USItype) (sl)) \ + : "%0" ((USItype) (ah)), \ +@@ -286,8 +286,8 @@ + "%1" ((USItype) (al)), \ + "g" ((USItype) (bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("sub.w %5,%1 +- subx %3,%0" \ ++ __asm__ ("sub.w %5,%1\n" \ ++ "subx %3,%0" \ + : "=g" ((USItype) (sh)), \ + "=&g" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ +@@ -316,8 +316,8 @@ + + #if defined (__hppa) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("add %4,%5,%1 +- addc %2,%3,%0" \ ++ __asm__ ("add %4,%5,%1\n" \ ++ "addc %2,%3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%rM" ((USItype) (ah)), \ +@@ -325,8 +325,8 @@ + "%rM" ((USItype) (al)), \ + "rM" ((USItype) (bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("sub %4,%5,%1 +- subb %2,%3,%0" \ ++ __asm__ ("sub %4,%5,%1\n" \ ++ "subb %2,%3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "rM" ((USItype) (ah)), \ +@@ -357,22 +357,22 @@ + do { \ + USItype __tmp; \ + __asm__ ( \ +- "ldi 1,%0 +- extru,= %1,15,16,%%r0 ; Bits 31..16 zero? +- extru,tr %1,15,16,%1 ; No. Shift down, skip add. +- ldo 16(%0),%0 ; Yes. Perform add. +- extru,= %1,23,8,%%r0 ; Bits 15..8 zero? +- extru,tr %1,23,8,%1 ; No. Shift down, skip add. +- ldo 8(%0),%0 ; Yes. Perform add. +- extru,= %1,27,4,%%r0 ; Bits 7..4 zero? +- extru,tr %1,27,4,%1 ; No. Shift down, skip add. +- ldo 4(%0),%0 ; Yes. Perform add. +- extru,= %1,29,2,%%r0 ; Bits 3..2 zero? +- extru,tr %1,29,2,%1 ; No. Shift down, skip add. +- ldo 2(%0),%0 ; Yes. Perform add. +- extru %1,30,1,%1 ; Extract bit 1. +- sub %0,%1,%0 ; Subtract it. +- " : "=r" (count), "=r" (__tmp) : "1" (x)); \ ++ "ldi 1,%0\n" \ ++ "extru,= %1,15,16,%%r0 ; Bits 31..16 zero?\n" \ ++ "extru,tr %1,15,16,%1 ; No. Shift down, skip add.\n" \ ++ "ldo 16(%0),%0 ; Yes. Perform add.\n" \ ++ "extru,= %1,23,8,%%r0 ; Bits 15..8 zero?\n" \ ++ "extru,tr %1,23,8,%1 ; No. Shift down, skip add.\n" \ ++ "ldo 8(%0),%0 ; Yes. Perform add.\n" \ ++ "extru,= %1,27,4,%%r0 ; Bits 7..4 zero?\n" \ ++ "extru,tr %1,27,4,%1 ; No. Shift down, skip add.\n" \ ++ "ldo 4(%0),%0 ; Yes. Perform add.\n" \ ++ "extru,= %1,29,2,%%r0 ; Bits 3..2 zero?\n" \ ++ "extru,tr %1,29,2,%1 ; No. Shift down, skip add.\n" \ ++ "ldo 2(%0),%0 ; Yes. Perform add.\n" \ ++ "extru %1,30,1,%1 ; Extract bit 1.\n" \ ++ "sub %0,%1,%0 ; Subtract it.\n" \ ++ : "=r" (count), "=r" (__tmp) : "1" (x)); \ + } while (0) + #endif + +@@ -419,8 +419,8 @@ + + #if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("addl %5,%1 +- adcl %3,%0" \ ++ __asm__ ("addl %5,%1\n" \ ++ "adcl %3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%0" ((USItype) (ah)), \ +@@ -428,8 +428,8 @@ + "%1" ((USItype) (al)), \ + "g" ((USItype) (bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("subl %5,%1 +- sbbl %3,%0" \ ++ __asm__ ("subl %5,%1\n" \ ++ "sbbl %3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ +@@ -525,9 +525,9 @@ + #if defined (__M32R__) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + /* The cmp clears the condition bit. */ \ +- __asm__ ("cmp %0,%0 +- addx %%5,%1 +- addx %%3,%0" \ ++ __asm__ ("cmp %0,%0\n" \ ++ "addx %%5,%1\n" \ ++ "addx %%3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%0" ((USItype) (ah)), \ +@@ -537,9 +537,9 @@ + : "cbit") + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + /* The cmp clears the condition bit. */ \ +- __asm__ ("cmp %0,%0 +- subx %5,%1 +- subx %3,%0" \ ++ __asm__ ("cmp %0,%0\n" \ ++ "subx %5,%1\n" \ ++ "subx %3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ +@@ -551,8 +551,8 @@ + + #if defined (__mc68000__) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("add%.l %5,%1 +- addx%.l %3,%0" \ ++ __asm__ ("add%.l %5,%1\n" \ ++ "addx%.l %3,%0" \ + : "=d" ((USItype) (sh)), \ + "=&d" ((USItype) (sl)) \ + : "%0" ((USItype) (ah)), \ +@@ -560,8 +560,8 @@ + "%1" ((USItype) (al)), \ + "g" ((USItype) (bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("sub%.l %5,%1 +- subx%.l %3,%0" \ ++ __asm__ ("sub%.l %5,%1\n" \ ++ "subx%.l %3,%0" \ + : "=d" ((USItype) (sh)), \ + "=&d" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ +@@ -602,32 +602,32 @@ + #if !defined(__mcf5200__) + /* %/ inserts REGISTER_PREFIX, %# inserts IMMEDIATE_PREFIX. */ + #define umul_ppmm(xh, xl, a, b) \ +- __asm__ ("| Inlined umul_ppmm +- move%.l %2,%/d0 +- move%.l %3,%/d1 +- move%.l %/d0,%/d2 +- swap %/d0 +- move%.l %/d1,%/d3 +- swap %/d1 +- move%.w %/d2,%/d4 +- mulu %/d3,%/d4 +- mulu %/d1,%/d2 +- mulu %/d0,%/d3 +- mulu %/d0,%/d1 +- move%.l %/d4,%/d0 +- eor%.w %/d0,%/d0 +- swap %/d0 +- add%.l %/d0,%/d2 +- add%.l %/d3,%/d2 +- jcc 1f +- add%.l %#65536,%/d1 +-1: swap %/d2 +- moveq %#0,%/d0 +- move%.w %/d2,%/d0 +- move%.w %/d4,%/d2 +- move%.l %/d2,%1 +- add%.l %/d1,%/d0 +- move%.l %/d0,%0" \ ++ __asm__ ("| Inlined umul_ppmm\n" \ ++ "move%.l %2,%/d0\n" \ ++ "move%.l %3,%/d1\n" \ ++ "move%.l %/d0,%/d2\n" \ ++ "swap %/d0\n" \ ++ "move%.l %/d1,%/d3\n" \ ++ "swap %/d1\n" \ ++ "move%.w %/d2,%/d4\n" \ ++ "mulu %/d3,%/d4\n" \ ++ "mulu %/d1,%/d2\n" \ ++ "mulu %/d0,%/d3\n" \ ++ "mulu %/d0,%/d1\n" \ ++ "move%.l %/d4,%/d0\n" \ ++ "eor%.w %/d0,%/d0\n" \ ++ "swap %/d0\n" \ ++ "add%.l %/d0,%/d2\n" \ ++ "add%.l %/d3,%/d2\n" \ ++ "jcc 1f\n" \ ++ "add%.l %#65536,%/d1\n" \ ++"1: swap %/d2\n" \ ++ "moveq %#0,%/d0\n" \ ++ "move%.w %/d2,%/d0\n" \ ++ "move%.w %/d4,%/d2\n" \ ++ "move%.l %/d2,%1\n" \ ++ "add%.l %/d1,%/d0\n" \ ++ "move%.l %/d0,%0" \ + : "=g" ((USItype) (xh)), \ + "=g" ((USItype) (xl)) \ + : "g" ((USItype) (a)), \ +@@ -653,8 +653,8 @@ + + #if defined (__m88000__) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("addu.co %1,%r4,%r5 +- addu.ci %0,%r2,%r3" \ ++ __asm__ ("addu.co %1,%r4,%r5\n" \ ++ "addu.ci %0,%r2,%r3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%rJ" ((USItype) (ah)), \ +@@ -662,8 +662,8 @@ + "%rJ" ((USItype) (al)), \ + "rJ" ((USItype) (bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("subu.co %1,%r4,%r5 +- subu.ci %0,%r2,%r3" \ ++ __asm__ ("subu.co %1,%r4,%r5\n" \ ++ "subu.ci %0,%r2,%r3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "rJ" ((USItype) (ah)), \ +@@ -880,8 +880,8 @@ + + #if defined (__pyr__) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("addw %5,%1 +- addwc %3,%0" \ ++ __asm__ ("addw %5,%1\n" \ ++ "addwc %3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%0" ((USItype) (ah)), \ +@@ -889,8 +889,8 @@ + "%1" ((USItype) (al)), \ + "g" ((USItype) (bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("subw %5,%1 +- subwb %3,%0" \ ++ __asm__ ("subw %5,%1\n" \ ++ "subwb %3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ +@@ -902,8 +902,8 @@ + ({union {UDItype __ll; \ + struct {USItype __h, __l;} __i; \ + } __xx; \ +- __asm__ ("movw %1,%R0 +- uemul %2,%0" \ ++ __asm__ ("movw %1,%R0\n" \ ++ "uemul %2,%0" \ + : "=&r" (__xx.__ll) \ + : "g" ((USItype) (u)), \ + "g" ((USItype) (v))); \ +@@ -912,8 +912,8 @@ + + #if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("a %1,%5 +- ae %0,%3" \ ++ __asm__ ("a %1,%5\n" \ ++ "ae %0,%3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%0" ((USItype) (ah)), \ +@@ -921,8 +921,8 @@ + "%1" ((USItype) (al)), \ + "r" ((USItype) (bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("s %1,%5 +- se %0,%3" \ ++ __asm__ ("s %1,%5\n" \ ++ "se %0,%3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ +@@ -933,26 +933,26 @@ + do { \ + USItype __m0 = (m0), __m1 = (m1); \ + __asm__ ( \ +- "s r2,r2 +- mts r10,%2 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- m r2,%3 +- cas %0,r2,r0 +- mfs r10,%1" \ ++ "s r2,r2\n" ++ "mts r10,%2\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "m r2,%3\n" \ ++ "cas %0,r2,r0\n" \ ++ "mfs r10,%1" \ + : "=r" ((USItype) (ph)), \ + "=r" ((USItype) (pl)) \ + : "%r" (__m0), \ +@@ -982,9 +982,9 @@ + #if defined (__sh2__) && W_TYPE_SIZE == 32 + #define umul_ppmm(w1, w0, u, v) \ + __asm__ ( \ +- "dmulu.l %2,%3 +- sts macl,%1 +- sts mach,%0" \ ++ "dmulu.l %2,%3\n" \ ++ "sts macl,%1\n" \ ++ "sts mach,%0" \ + : "=r" ((USItype)(w1)), \ + "=r" ((USItype)(w0)) \ + : "r" ((USItype)(u)), \ +@@ -996,8 +996,8 @@ + #if defined (__sparc__) && !defined(__arch64__) \ + && !defined(__sparcv9) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("addcc %r4,%5,%1 +- addx %r2,%3,%0" \ ++ __asm__ ("addcc %r4,%5,%1\n" \ ++ "addx %r2,%3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%rJ" ((USItype) (ah)), \ +@@ -1006,8 +1006,8 @@ + "rI" ((USItype) (bl)) \ + __CLOBBER_CC) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("subcc %r4,%5,%1 +- subx %r2,%3,%0" \ ++ __asm__ ("subcc %r4,%5,%1\n" \ ++ "subx %r2,%3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "rJ" ((USItype) (ah)), \ +@@ -1040,45 +1040,45 @@ + : "r" ((USItype) (u)), \ + "r" ((USItype) (v))) + #define udiv_qrnnd(q, r, n1, n0, d) \ +- __asm__ ("! Inlined udiv_qrnnd +- wr %%g0,%2,%%y ! Not a delayed write for sparclite +- tst %%g0 +- divscc %3,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%%g1 +- divscc %%g1,%4,%0 +- rd %%y,%1 +- bl,a 1f +- add %1,%4,%1 +-1: ! End of inline udiv_qrnnd" \ ++ __asm__ ("! Inlined udiv_qrnnd\n" \ ++ "wr %%g0,%2,%%y ! Not a delayed write for sparclite\n" \ ++ "tst %%g0\n" \ ++ "divscc %3,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%%g1\n" \ ++ "divscc %%g1,%4,%0\n" \ ++ "rd %%y,%1\n" \ ++ "bl,a 1f\n" \ ++ "add %1,%4,%1\n" \ ++"1: ! End of inline udiv_qrnnd" \ + : "=r" ((USItype) (q)), \ + "=r" ((USItype) (r)) \ + : "r" ((USItype) (n1)), \ +@@ -1099,46 +1099,46 @@ + /* SPARC without integer multiplication and divide instructions. + (i.e. at least Sun4/20,40,60,65,75,110,260,280,330,360,380,470,490) */ + #define umul_ppmm(w1, w0, u, v) \ +- __asm__ ("! Inlined umul_ppmm +- wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr +- sra %3,31,%%o5 ! Don't move this insn +- and %2,%%o5,%%o5 ! Don't move this insn +- andcc %%g0,0,%%g1 ! Don't move this insn +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,%3,%%g1 +- mulscc %%g1,0,%%g1 +- add %%g1,%%o5,%0 +- rd %%y,%1" \ ++ __asm__ ("! Inlined umul_ppmm\n" \ ++ "wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr\n" \ ++ "sra %3,31,%%o5 ! Don't move this insn\n" \ ++ "and %2,%%o5,%%o5 ! Don't move this insn\n" \ ++ "andcc %%g0,0,%%g1 ! Don't move this insn\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,%3,%%g1\n" \ ++ "mulscc %%g1,0,%%g1\n" \ ++ "add %%g1,%%o5,%0\n" \ ++ "rd %%y,%1" \ + : "=r" ((USItype) (w1)), \ + "=r" ((USItype) (w0)) \ + : "%rI" ((USItype) (u)), \ +@@ -1148,30 +1148,30 @@ + /* It's quite necessary to add this much assembler for the sparc. + The default udiv_qrnnd (in C) is more than 10 times slower! */ + #define udiv_qrnnd(q, r, n1, n0, d) \ +- __asm__ ("! Inlined udiv_qrnnd +- mov 32,%%g1 +- subcc %1,%2,%%g0 +-1: bcs 5f +- addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb +- sub %1,%2,%1 ! this kills msb of n +- addx %1,%1,%1 ! so this can't give carry +- subcc %%g1,1,%%g1 +-2: bne 1b +- subcc %1,%2,%%g0 +- bcs 3f +- addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb +- b 3f +- sub %1,%2,%1 ! this kills msb of n +-4: sub %1,%2,%1 +-5: addxcc %1,%1,%1 +- bcc 2b +- subcc %%g1,1,%%g1 +-! Got carry from n. Subtract next step to cancel this carry. +- bne 4b +- addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb +- sub %1,%2,%1 +-3: xnor %0,0,%0 +- ! End of inline udiv_qrnnd" \ ++ __asm__ ("! Inlined udiv_qrnnd\n" \ ++ "mov 32,%%g1\n" \ ++ "subcc %1,%2,%%g0\n" \ ++"1: bcs 5f\n" \ ++ "addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n" \ ++ "sub %1,%2,%1 ! this kills msb of n\n" \ ++ "addx %1,%1,%1 ! so this can't give carry\n" \ ++ "subcc %%g1,1,%%g1\n" \ ++"2: bne 1b\n" \ ++ "subcc %1,%2,%%g0\n" \ ++ "bcs 3f\n" \ ++ "addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n" \ ++ "b 3f\n" \ ++ "sub %1,%2,%1 ! this kills msb of n\n" \ ++"4: sub %1,%2,%1\n" \ ++"5: addxcc %1,%1,%1\n" \ ++ "bcc 2b\n" \ ++ "subcc %%g1,1,%%g1\n" \ ++"! Got carry from n. Subtract next step to cancel this carry.\n" \ ++ "bne 4b\n" \ ++ "addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb\n" \ ++ "sub %1,%2,%1\n" \ ++"3: xnor %0,0,%0\n" \ ++ "! End of inline udiv_qrnnd" \ + : "=&r" ((USItype) (q)), \ + "=&r" ((USItype) (r)) \ + : "r" ((USItype) (d)), \ +@@ -1185,11 +1185,11 @@ + #if ((defined (__sparc__) && defined (__arch64__)) \ + || defined (__sparcv9)) && W_TYPE_SIZE == 64 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("addcc %r4,%5,%1 +- add %r2,%3,%0 +- bcs,a,pn %%xcc, 1f +- add %0, 1, %0 +- 1:" \ ++ __asm__ ("addcc %r4,%5,%1\n" \ ++ "add %r2,%3,%0\n" \ ++ "bcs,a,pn %%xcc, 1f\n" \ ++ "add %0, 1, %0\n" \ ++ "1:" \ + : "=r" ((UDItype)(sh)), \ + "=&r" ((UDItype)(sl)) \ + : "%rJ" ((UDItype)(ah)), \ +@@ -1199,11 +1199,11 @@ + __CLOBBER_CC) + + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("subcc %r4,%5,%1 +- sub %r2,%3,%0 +- bcs,a,pn %%xcc, 1f +- sub %0, 1, %0 +- 1:" \ ++ __asm__ ("subcc %r4,%5,%1\n" \ ++ "sub %r2,%3,%0\n" \ ++ "bcs,a,pn %%xcc, 1f\n" \ ++ "sub %0, 1, %0\n" \ ++ "1:" \ + : "=r" ((UDItype)(sh)), \ + "=&r" ((UDItype)(sl)) \ + : "rJ" ((UDItype)(ah)), \ +@@ -1216,27 +1216,27 @@ + do { \ + UDItype tmp1, tmp2, tmp3, tmp4; \ + __asm__ __volatile__ ( \ +- "srl %7,0,%3 +- mulx %3,%6,%1 +- srlx %6,32,%2 +- mulx %2,%3,%4 +- sllx %4,32,%5 +- srl %6,0,%3 +- sub %1,%5,%5 +- srlx %5,32,%5 +- addcc %4,%5,%4 +- srlx %7,32,%5 +- mulx %3,%5,%3 +- mulx %2,%5,%5 +- sethi %%hi(0x80000000),%2 +- addcc %4,%3,%4 +- srlx %4,32,%4 +- add %2,%2,%2 +- movcc %%xcc,%%g0,%2 +- addcc %5,%4,%5 +- sllx %3,32,%3 +- add %1,%3,%1 +- add %5,%2,%0" \ ++ "srl %7,0,%3\n" \ ++ "mulx %3,%6,%1\n" \ ++ "srlx %6,32,%2\n" \ ++ "mulx %2,%3,%4\n" \ ++ "sllx %4,32,%5\n" \ ++ "srl %6,0,%3\n" \ ++ "sub %1,%5,%5\n" \ ++ "srlx %5,32,%5\n" \ ++ "addcc %4,%5,%4\n" \ ++ "srlx %7,32,%5\n" \ ++ "mulx %3,%5,%3\n" \ ++ "mulx %2,%5,%5\n" \ ++ "sethi %%hi(0x80000000),%2\n" \ ++ "addcc %4,%3,%4\n" \ ++ "srlx %4,32,%4\n" \ ++ "add %2,%2,%2\n" \ ++ "movcc %%xcc,%%g0,%2\n" \ ++ "addcc %5,%4,%5\n" \ ++ "sllx %3,32,%3\n" \ ++ "add %1,%3,%1\n" \ ++ "add %5,%2,%0" \ + : "=r" ((UDItype)(wh)), \ + "=&r" ((UDItype)(wl)), \ + "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4) \ +@@ -1250,8 +1250,8 @@ + + #if defined (__vax__) && W_TYPE_SIZE == 32 + #define add_ssaaaa(sh, sl, ah, al, bh, bl) \ +- __asm__ ("addl2 %5,%1 +- adwc %3,%0" \ ++ __asm__ ("addl2 %5,%1\n" \ ++ "adwc %3,%0" \ + : "=g" ((USItype) (sh)), \ + "=&g" ((USItype) (sl)) \ + : "%0" ((USItype) (ah)), \ +@@ -1259,8 +1259,8 @@ + "%1" ((USItype) (al)), \ + "g" ((USItype) (bl))) + #define sub_ddmmss(sh, sl, ah, al, bh, bl) \ +- __asm__ ("subl2 %5,%1 +- sbwc %3,%0" \ ++ __asm__ ("subl2 %5,%1\n" \ ++ "sbwc %3,%0" \ + : "=g" ((USItype) (sh)), \ + "=&g" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ diff --git a/patches/glibc/2.2.2/glibc-2.2.2-export_fp_hw.patch b/patches/glibc/2.2.2/glibc-2.2.2-export_fp_hw.patch new file mode 100644 index 00000000..a14e1d45 --- /dev/null +++ b/patches/glibc/2.2.2/glibc-2.2.2-export_fp_hw.patch @@ -0,0 +1,30 @@ +Fixes undefined symbol _fp_hw required by the ABI: +readelf -s /opt/crosstool/i686-pc-linux-gnu/i686-unknown-linux-gnu/gcc-3.4.3-glibc-2.2.2/i686-unknown-linux-gnu/lib/crt1.o | grep fp_hw + 29: 00000000 4 NOTYPE GLOBAL DEFAULT UND _fp_hw +Rumored to fix problems with icc, which gets upset at any symbol +which is undefined, even if nobody cares about it. + +Revision 1.16, Thu Feb 22 19:57:34 2001 UTC (4 years, 2 months ago) by drepper +Branch: MAIN +CVS Tags: glibc-2_2_3 +Changes since 1.15: +1 -1 lines +Diff to previous 1.15 (colored) + +(_fp_hw): Actually define label. + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/i386/elf/start.S,v +retrieving revision 1.15 +retrieving revision 1.16 +diff -u -r1.15 -r1.16 +--- libc/sysdeps/i386/elf/start.S 2001/02/03 21:34:54 1.15 ++++ libc/sysdeps/i386/elf/start.S 2001/02/22 19:57:34 1.16 +@@ -85,7 +85,7 @@ + meaningless since we don't support machines < 80386. */ + .section .rodata + .globl _fp_hw +- .long 3 ++_fp_hw: .long 3 + .size _fp_hw, 4 + + /* Define a symbol for the first piece of initialized data. */ diff --git a/patches/glibc/2.2.2/glibc-2.2.2-printf-not-macro.patch b/patches/glibc/2.2.2/glibc-2.2.2-printf-not-macro.patch new file mode 100644 index 00000000..eae6fec3 --- /dev/null +++ b/patches/glibc/2.2.2/glibc-2.2.2-printf-not-macro.patch @@ -0,0 +1,36 @@ +I'm testing toolchains with glibc-2.2.2 now. It looks ok except +that glibc-2.2.2 headers contain the gosh-awful line + # define printf(fmt, args...) fprintf (stdout, fmt, ##args) +which causes builds of programs with methods named 'printf' to fail with + error: `stdout' is not a type +Feh. + +Revision 1.8, Thu Aug 2 16:09:51 2001 UTC (3 years, 9 months ago) by aj +Branch: MAIN +CVS Tags: glibc-2_3_2, glibc-2_2_4, glibc-2-3-1, glibc-2-3, glibc-2-2-branch, glibc-2-2-5 + +(printf): Remove printf optimization since GCC 3.0 can optimize printf. + +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/libio/bits/stdio.h.diff?r1=1.7&r2=1.8&cvsroot=glibc + +=================================================================== +RCS file: /cvs/glibc/libc/libio/bits/stdio.h,v +retrieving revision 1.7 +retrieving revision 1.8 +diff -u -r1.7 -r1.8 +--- libc/libio/bits/stdio.h 2001/07/06 04:55:32 1.7 ++++ libc/libio/bits/stdio.h 2001/08/02 16:09:51 1.8 +@@ -29,13 +29,6 @@ + + + #ifdef __USE_EXTERN_INLINES +-/* Since version 2.97 GCC knows about `fprintf' and can optimize certain +- cases. Help gcc to optimize more code by mapping `printf' to the known +- `fprintf' function. Unfortunately we have to use a macro. */ +-# if __GNUC_PREREQ (2,97) +-# define printf(fmt, args...) fprintf (stdout, fmt, ##args) +-# endif +- + /* Write formatted output to stdout from argument list ARG. */ + __STDIO_INLINE int + vprintf (__const char *__restrict __fmt, _G_va_list __arg) __THROW diff --git a/patches/glibc/2.2.2/glibc-2.2.2-syslog-bugfix.patch b/patches/glibc/2.2.2/glibc-2.2.2-syslog-bugfix.patch new file mode 100644 index 00000000..1a48c00a --- /dev/null +++ b/patches/glibc/2.2.2/glibc-2.2.2-syslog-bugfix.patch @@ -0,0 +1,60 @@ +Backport a bugfix from glibc-2.2.5 to glibc-2.2.2 for the following problem: + When syslog-ng is restarted (or HUPed), vixie-cron (and probably other + programs) stop logging to syslog. + + +2001-08-27 Ulrich Drepper <Drepper@redhat.com> * misc/syslog.c (vsyslog): + Try a bit harder to use syslogd. If the connection went down after we + first used it try to connect again and resend the message before printing + to the console. + +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/misc/Attic/syslog.c.diff?r1=1.32&r2=1.30&cvsroot=glibc +[ paths adjusted ] + +=================================================================== +RCS file: /cvs/glibc/libc/misc/Attic/syslog.c,v +retrieving revision 1.30 +retrieving revision 1.32 +diff -u -r1.30 -r1.32 +--- glibc-2.2.2/misc/syslog.c 2001/08/24 03:21:14 1.30 ++++ glibc-2.2.5/misc/syslog.c 2001/08/30 23:13:49 1.32 +@@ -239,17 +239,29 @@ + + if (!connected || __send(LogFile, buf, bufsize, 0) < 0) + { +- closelog_internal (); /* attempt re-open next time */ +- /* +- * Output the message to the console; don't worry about blocking, +- * if console blocks everything will. Make sure the error reported +- * is the one from the syslogd failure. +- */ +- if (LogStat & LOG_CONS && +- (fd = __open(_PATH_CONSOLE, O_WRONLY|O_NOCTTY, 0)) >= 0) ++ if (connected) + { +- dprintf (fd, "%s\r\n", buf + msgoff); +- (void)__close(fd); ++ /* Try to reopen the syslog connection. Maybe it went ++ down. */ ++ closelog_internal (); ++ openlog_internal(LogTag, LogStat | LOG_NDELAY, 0); ++ } ++ ++ if (!connected || __send(LogFile, buf, bufsize, 0) < 0) ++ { ++ closelog_internal (); /* attempt re-open next time */ ++ /* ++ * Output the message to the console; don't worry ++ * about blocking, if console blocks everything will. ++ * Make sure the error reported is the one from the ++ * syslogd failure. ++ */ ++ if (LogStat & LOG_CONS && ++ (fd = __open(_PATH_CONSOLE, O_WRONLY|O_NOCTTY, 0)) >= 0) ++ { ++ dprintf (fd, "%s\r\n", buf + msgoff); ++ (void)__close(fd); ++ } + } + } + diff --git a/patches/glibc/2.2.2/glibc-2.2.5-alpha-pwrite64.patch b/patches/glibc/2.2.2/glibc-2.2.5-alpha-pwrite64.patch new file mode 100644 index 00000000..89cc9ead --- /dev/null +++ b/patches/glibc/2.2.2/glibc-2.2.5-alpha-pwrite64.patch @@ -0,0 +1,58 @@ +Fix for this error: + +../sysdeps/unix/sysv/linux/pread.c: In function `__libc_pread': +../sysdeps/unix/sysv/linux/pread.c:52: error: `__NR_pread' undeclared (first use in this function) +../sysdeps/unix/sysv/linux/pread.c:52: error: (Each undeclared identifier is reported only once +../sysdeps/unix/sysv/linux/pread.c:52: error: for each function it appears in.) +make[2]: *** [/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/build-glibc/posix/pread.o] Error 1 +make[2]: Leaving directory `/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/glibc-2.2.5/posix' +make[1]: *** [posix/subdir_lib] Error 2 +make[1]: Leaving directory `/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/glibc-2.2.5' +make: *** [all] Error 2 + +[ Same as glibc-2.3.2-alpha-pwrite.patch except for copyright date ] + +extracted from GLIBC CVS by Dan Kegel +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.14&r2=1.15&cvsroot=glibc' +(to match context of...) +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.16&r2=1.17&cvsroot=glibc' +and rediffed. + +cf. +http://sources.redhat.com/ml/libc-alpha/2003-10/msg00038.html + +Originally thought we needed this hunk, too: +http://sources.redhat.com/ml/libc-alpha/2003-10/msg00037.html +but it seems the sysdep.h change is sufficient, and works better +when compiling against linux-2.4. + +=================================================================== +--- glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/sysdep.h.old 2004-05-24 22:21:44.000000000 -0700 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/sysdep.h 2004-05-24 22:22:48.000000000 -0700 +@@ -1,3 +1,3 @@ +-/* Copyright (C) 1992, 1993, 1995, 1996, 1997 Free Software Foundation, Inc. ++/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995. +@@ -60,6 +60,21 @@ + #define __NR_osf_getsysinfo 256 + #define __NR_osf_setsysinfo 257 + ++/* Help old kernel headers where particular syscalls are not available. */ ++#ifndef __NR_semtimedop ++# define __NR_semtimedop 423 ++#endif ++ ++/* This is a kludge to make syscalls.list find these under the names ++ pread and pwrite, since some kernel headers define those names ++ and some define the *64 names for the same system calls. */ ++#if !defined __NR_pread && defined __NR_pread64 ++# define __NR_pread __NR_pread64 ++#endif ++#if !defined __NR_pwrite && defined __NR_pwrite64 ++# define __NR_pwrite __NR_pwrite64 ++#endif ++ + /* + * In order to get the hidden arguments for rt_sigaction set up + * properly, we need to call the assembly version. Detect this in the diff --git a/patches/glibc/2.2.2/glibc-2.2.5-arm-pwrite64.patch b/patches/glibc/2.2.2/glibc-2.2.5-arm-pwrite64.patch new file mode 100644 index 00000000..c4bd19c7 --- /dev/null +++ b/patches/glibc/2.2.2/glibc-2.2.5-arm-pwrite64.patch @@ -0,0 +1,30 @@ +Should fix + +../sysdeps/unix/sysv/linux/pread.c: In function `__libc_pread': +../sysdeps/unix/sysv/linux/pread.c:52: error: `__NR_pread' undeclared (first use in this function) +../sysdeps/unix/sysv/linux/pread.c:52: error: (Each undeclared identifier is reported only once +../sysdeps/unix/sysv/linux/pread.c:52: error: for each function it appears in.) +make[2]: *** [/home/dank/crosstool-0.28/build/arm-9tdmi-linux-gnu/gcc-3.4.1-glibc-2.2.5/build-glibc/posix/pread.o] Error 1 +make[2]: Leaving directory `/home/dank/crosstool-0.28/build/arm-9tdmi-linux-gnu/gcc-3.4.1-glibc-2.2.5/glibc-2.2.5/posix' +make[1]: *** [posix/subdir_lib] Error 2 + +Copied from similar patch for alpha. + +--- glibc-2.2.5-orig/sysdeps/unix/sysv/linux/arm/sysdep.h 2001-07-05 21:56:13.000000000 -0700 ++++ glibc-2.2.5/sysdeps/unix/sysv/linux/arm/sysdep.h 2004-08-07 10:45:26.000000000 -0700 +@@ -32,6 +32,15 @@ + #define SWI_BASE (0x900000) + #define SYS_ify(syscall_name) (__NR_##syscall_name) + ++/* This is a kludge to make syscalls.list find these under the names ++ pread and pwrite, since some kernel headers define those names ++ and some define the *64 names for the same system calls. */ ++#if !defined __NR_pread && defined __NR_pread64 ++# define __NR_pread __NR_pread64 ++#endif ++#if !defined __NR_pwrite && defined __NR_pwrite64 ++# define __NR_pwrite __NR_pwrite64 ++#endif + + #ifdef __ASSEMBLER__ + diff --git a/patches/glibc/2.2.2/glibc-2.2.5-i386-pwrite64.patch b/patches/glibc/2.2.2/glibc-2.2.5-i386-pwrite64.patch new file mode 100644 index 00000000..761771f8 --- /dev/null +++ b/patches/glibc/2.2.2/glibc-2.2.5-i386-pwrite64.patch @@ -0,0 +1,20 @@ +diff -urN glibc-2.2.5-orig/sysdeps/unix/sysv/linux/i386/sysdep.h glibc-2.2.5/sysdeps/unix/sysv/linux/i386/sysdep.h +--- glibc-2.2.5-orig/sysdeps/unix/sysv/linux/i386/sysdep.h 2001-07-06 06:56:16.000000000 +0200 ++++ glibc-2.2.5/sysdeps/unix/sysv/linux/i386/sysdep.h 2004-09-03 12:35:44.000000000 +0200 +@@ -36,6 +36,16 @@ + #undef L + #define L(name) .L##name + ++/* This is a kludge to make syscalls.list find these under the names ++ * pread and pwrite, since some kernel headers define those names ++ * and some define the *64 names for the same system calls. */ ++#if !defined __NR_pread && defined __NR_pread64 ++# define __NR_pread __NR_pread64 ++#endif ++#if !defined __NR_pwrite && defined __NR_pwrite64 ++# define __NR_pwrite __NR_pwrite64 ++#endif ++ + #ifdef __ASSEMBLER__ + + /* Linux uses a negative return value to indicate syscall errors, diff --git a/patches/glibc/2.2.2/glibc-2.2.5-m68k-pwrite.patch b/patches/glibc/2.2.2/glibc-2.2.5-m68k-pwrite.patch new file mode 100644 index 00000000..eefc6fa7 --- /dev/null +++ b/patches/glibc/2.2.2/glibc-2.2.5-m68k-pwrite.patch @@ -0,0 +1,32 @@ +Copied from similar patch for other architectures. + +Should fix this error: +../sysdeps/unix/sysv/linux/pread.c: In function `__libc_pread': +../sysdeps/unix/sysv/linux/pread.c:53: `__NR_pread' undeclared (first use in this function) +../sysdeps/unix/sysv/linux/pread.c:53: (Each undeclared identifier is reported only once +../sysdeps/unix/sysv/linux/pread.c:53: for each function it appears in.) +make[2]: *** [/home/dank/wk/crosstool-0.28-rc37/build/m68k-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.5/build-glibc/posix/pread.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/m68k-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.5/glibc-2.2.5/posix' +make[1]: *** [posix/subdir_lib] Error 2 +make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/m68k-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.5/glibc-2.2.5' +make: *** [all] Error 2 + +--- glibc-2.2.5/sysdeps/unix/sysv/linux/m68k/sysdep.h.old 2004-10-05 08:37:37.000000000 -0700 ++++ glibc-2.2.5/sysdeps/unix/sysv/linux/m68k/sysdep.h 2004-10-05 08:38:22.000000000 -0700 +@@ -32,6 +32,16 @@ + # define SYS_ify(syscall_name) __NR_/**/syscall_name + #endif + ++/* This is a kludge to make syscalls.list find these under the names ++ pread and pwrite, since some kernel headers define those names ++ and some define the *64 names for the same system calls. */ ++#if !defined __NR_pread && defined __NR_pread64 ++# define __NR_pread __NR_pread64 ++#endif ++#if !defined __NR_pwrite && defined __NR_pwrite64 ++# define __NR_pwrite __NR_pwrite64 ++#endif ++ + #ifdef __ASSEMBLER__ + + /* Linux uses a negative return value to indicate syscall errors, unlike diff --git a/patches/glibc/2.2.2/glibc-manual-stdin.texi-1.127.patch b/patches/glibc/2.2.2/glibc-manual-stdin.texi-1.127.patch new file mode 100644 index 00000000..70245a6f --- /dev/null +++ b/patches/glibc/2.2.2/glibc-manual-stdin.texi-1.127.patch @@ -0,0 +1,18 @@ +=================================================================== +RCS file: /cvs/glibc/libc/manual/stdio.texi,v +retrieving revision 1.126 +retrieving revision 1.127 +diff -u -r1.126 -r1.127 +--- libc/manual/stdio.texi 2001/06/06 07:11:31 1.126 ++++ libc/manual/stdio.texi 2001/07/31 18:57:16 1.127 +@@ -3265,8 +3265,8 @@ + If you are trying to read input that doesn't match a single, fixed + pattern, you may be better off using a tool such as Flex to generate a + lexical scanner, or Bison to generate a parser, rather than using +-@code{scanf}. For more information about these tools, see @ref{, , , +-flex.info, Flex: The Lexical Scanner Generator}, and @ref{, , , ++@code{scanf}. For more information about these tools, see @ref{Top, , , ++flex.info, Flex: The Lexical Scanner Generator}, and @ref{Top, , , + bison.info, The Bison Reference Manual}. + + @node Input Conversion Syntax diff --git a/patches/glibc/2.2.2/glibc-nss-noopt.patch b/patches/glibc/2.2.2/glibc-nss-noopt.patch new file mode 100644 index 00000000..28aa2e14 --- /dev/null +++ b/patches/glibc/2.2.2/glibc-nss-noopt.patch @@ -0,0 +1,26 @@ +--- glibc-2.2.2/nss/Makefile.orig Tue May 20 16:02:47 2003 ++++ glibc-2.2.2/nss/Makefile Tue May 20 16:03:52 2003 +@@ -41,6 +41,10 @@ + + tests = test-netdb + ++# Disable optimization when building nss to avoid crash described in ++# http://gcc.gnu.org/ml/gcc-bugs/1998-06/msg00168.html ++default_cflags := -g -O0 ++ + include ../Makeconfig + + ifeq (yes,$(build-static-nss)) +--- glibc-2.2.2/locale/Makefile.orig Tue May 20 17:29:11 2003 ++++ glibc-2.2.2/locale/Makefile Tue May 20 17:29:39 2003 +@@ -66,6 +66,10 @@ + GPERF = gperf + GPERFFLAGS = -acCgopt -k1,2,5,9,$$ -L ANSI-C + ++# Disable optimization when building locale or nss to avoid crash described in ++# http://gcc.gnu.org/ml/gcc-bugs/1998-06/msg00168.html ++default_cflags := -g -O0 ++ + include ../Rules + + programs/%-kw.h: programs/%-kw.gperf diff --git a/patches/glibc/2.2.2/tst-pathopt-cross.patch b/patches/glibc/2.2.2/tst-pathopt-cross.patch new file mode 100644 index 00000000..f64d673c --- /dev/null +++ b/patches/glibc/2.2.2/tst-pathopt-cross.patch @@ -0,0 +1,23 @@ +Fixes error +tst-pathopt.sh: /crosstool-0.20/build/powerpc-750-linux-gnu/gcc-2.95.3-glibc-2.2.2/build-glibc/elf/ld.so: cannot execute binary file +make[2]: *** [/crosstool-0.20/build/powerpc-750-linux-gnu/gcc-2.95.3-glibc-2.2.2/build-glibc/elf/tst-pathopt.out] Error 126 +See also http://sources.redhat.com/ml/libc-alpha/2001-03/msg00113.html + +=================================================================== +RCS file: /cvs/glibc/libc/elf/Makefile,v +retrieving revision 1.196 +retrieving revision 1.197 +diff -u -r1.196 -r1.197 +--- libc/elf/Makefile 2001/03/16 07:29:45 1.196 ++++ libc/elf/Makefile 2001/03/25 04:57:51 1.197 +@@ -246,8 +246,10 @@ + generated += $(addsuffix .so,$(strip $(modules-names))) + + ifeq (yes,$(build-shared)) ++ifeq ($(cross-compiling),no) + tests: $(objpfx)tst-pathopt.out + endif ++endif + + $(objpfx)testobj1.so: $(libdl) + $(objpfx)testobj1_1.so: $(objpfx)testobj1.so $(libdl) diff --git a/patches/glibc/2.2.3/errlist-1.9.patch b/patches/glibc/2.2.3/errlist-1.9.patch new file mode 100644 index 00000000..594569be --- /dev/null +++ b/patches/glibc/2.2.3/errlist-1.9.patch @@ -0,0 +1,30 @@ +Fixes: + +../sysdeps/unix/sysv/linux/errlist.c:41: weak declaration of `_old_sys_nerr' must precede definition +make[2]: *** [/home/dank/downloads/crosstool-0.24/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.3/build-glibc/stdio-common/errlist.os] Error 1 + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/Attic/errlist.c,v +retrieving revision 1.8 +retrieving revision 1.9 +diff -u -r1.8 -r1.9 +--- libc/sysdeps/unix/sysv/linux/errlist.c 2001/07/06 04:56:12 1.8 ++++ libc/sysdeps/unix/sysv/linux/errlist.c 2002/05/20 06:56:53 1.9 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1998, 2000 Free Software Foundation, Inc. ++/* Copyright (C) 1998, 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 +@@ -38,10 +38,9 @@ + const int __old_sys_nerr = OLD_ERRLIST_SIZE; + + strong_alias (__old_sys_nerr, _old_sys_nerr); +-weak_alias (__old_sys_nerr, _old_sys_nerr) + compat_symbol (libc, __old_sys_nerr, _sys_nerr, GLIBC_2_0); + compat_symbol (libc, _old_sys_nerr, sys_nerr, GLIBC_2_0); +-weak_alias (__old_sys_errlist, _old_sys_errlist); ++strong_alias (__old_sys_errlist, _old_sys_errlist); + compat_symbol (libc, __old_sys_errlist, _sys_errlist, GLIBC_2_0); + compat_symbol (libc, _old_sys_errlist, sys_errlist, GLIBC_2_0); + #endif diff --git a/patches/glibc/2.2.3/errlist-arm.patch b/patches/glibc/2.2.3/errlist-arm.patch new file mode 100644 index 00000000..ac4eb5be --- /dev/null +++ b/patches/glibc/2.2.3/errlist-arm.patch @@ -0,0 +1,48 @@ +Subject: patch for arm +From: Philip Blundell <Philip dot Blundell at pobox dot com> +To: libc-hacker at sources dot redhat dot com +Content-Type: text/plain +Content-Transfer-Encoding: 7bit +Date: 22 Jul 2002 20:12:06 +0100 +Message-Id: <1027365126.725.10.camel@kc> +Mime-Version: 1.0 + +The mainline seems to need this patch in order to compile. + +p. + +2002-07-22 Philip Blundell <philb@gnu.org> + + * sysdeps/unix/sysv/linux/arm/errlist.c: Remove extra weak alias + definiton of _old_sys_nerr. Define _old_sys_errlist as strong + alias. + +Index: sysdeps/unix/sysv/linux/arm/errlist.c +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/arm/errlist.c,v +retrieving revision 1.4 +diff -u -p -r1.4 errlist.c +--- glibc/sysdeps/unix/sysv/linux/arm/errlist.c 6 Jul 2001 04:56:13 -0000 1.4 ++++ glibc/sysdeps/unix/sysv/linux/arm/errlist.c 22 Jul 2002 19:10:57 -0000 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1998, 2000 Free Software Foundation, Inc. ++/* Copyright (C) 1998, 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 +@@ -38,10 +38,9 @@ extern const char *const *__old_sys_errl + const int __old_sys_nerr = OLD_ERRLIST_SIZE; + + strong_alias (__old_sys_nerr, _old_sys_nerr); +-weak_alias (__old_sys_nerr, _old_sys_nerr) + compat_symbol (libc, __old_sys_nerr, _sys_nerr, GLIBC_2_0); + compat_symbol (libc, _old_sys_nerr, sys_nerr, GLIBC_2_0); +-weak_alias (__old_sys_errlist, _old_sys_errlist); ++strong_alias (__old_sys_errlist, _old_sys_errlist); + compat_symbol (libc, __old_sys_errlist, _sys_errlist, GLIBC_2_0); + compat_symbol (libc, _old_sys_errlist, sys_errlist, GLIBC_2_0); + #endif + + + + diff --git a/patches/glibc/2.2.3/glibc-2.2.3-mips-base-addr-got.patch b/patches/glibc/2.2.3/glibc-2.2.3-mips-base-addr-got.patch new file mode 100644 index 00000000..1773002c --- /dev/null +++ b/patches/glibc/2.2.3/glibc-2.2.3-mips-base-addr-got.patch @@ -0,0 +1,276 @@ +From http://www.ltc.com/~brad/mips/glibc-2.2.3-mips-base-addr-got.diff + +Hopefully fixes the error: + +/opt/crosstool/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.3/lib/gcc-lib/mipsel-unknown-linux-gnu/3.2.3/../../../../mipsel-unknown-linux-gnu/bin/ld: target elf32-littlemips not found +collect2: ld returned 1 exit status +make[2]: *** [/home/dank/downloads/crosstool-0.24/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.3/build-glibc/elf/ld.so] Error 1 + + +diff -urNbB glibc-2.2.3/sysdeps/mips/dl-machine.h glibc-2.2.3-mips/sysdeps/mips/dl-machine.h +--- glibc-2.2.3/sysdeps/mips/dl-machine.h Mon Mar 26 23:53:28 2001 ++++ glibc-2.2.3-mips/sysdeps/mips/dl-machine.h Sun Aug 12 11:08:17 2001 +@@ -61,23 +61,6 @@ + in l_info array. */ + #define DT_MIPS(x) (DT_MIPS_##x - DT_LOPROC + DT_NUM) + +-/* +- * MIPS libraries are usually linked to a non-zero base address. We +- * subtract the base address from the address where we map the object +- * to. This results in more efficient address space usage. +- * +- * FIXME: By the time when MAP_BASE_ADDR is called we don't have the +- * DYNAMIC section read. Until this is fixed make the assumption that +- * libraries have their base address at 0x5ffe0000. This needs to be +- * fixed before we can safely get rid of this MIPSism. +- */ +-#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) \ +@@ -557,51 +540,30 @@ + /* Do nothing. */ + } + ++#ifndef RTLD_BOOTSTRAP + /* Relocate GOT. */ + static inline void + elf_machine_got_rel (struct link_map *map, int lazy) + { + ElfW(Addr) *got; + ElfW(Sym) *sym; ++ const ElfW(Half) *vernum; + int i, n, symidx; +- /* This function is loaded in dl-reloc as a nested function and can +- therefore access the variables scope and strtab from +- _dl_relocate_object. */ +-#ifdef RTLD_BOOTSTRAP +-# define RESOLVE_GOTSYM(sym,sym_index) 0 +-#else +-# define RESOLVE_GOTSYM(sym,sym_index) \ ++ ++#define RESOLVE_GOTSYM(sym,vernum,sym_index) \ + ({ \ + const ElfW(Sym) *ref = sym; \ ++ const struct r_found_version *version \ ++ = vernum ? &map->l_versions [vernum [sym_index]] : NULL; \ + ElfW(Addr) value; \ +- \ +- switch (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL) \ +- { \ +- default: \ +- { \ +- const ElfW(Half) *vernum = \ +- (const void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]); \ +- ElfW(Half) ndx = vernum[sym_index]; \ +- const struct r_found_version *version = &l->l_versions[ndx]; \ +- \ +- if (version->hash != 0) \ +- { \ +- value = _dl_lookup_versioned_symbol(strtab + sym->st_name,\ +- map, \ +- &ref, scope, version, \ +- R_MIPS_REL32, 0); \ +- break; \ +- } \ +- /* Fall through. */ \ +- } \ +- case 0: \ +- value = _dl_lookup_symbol (strtab + sym->st_name, map, &ref, \ +- scope, R_MIPS_REL32, 0); \ +- } \ +- \ ++ value = RESOLVE (&ref, version, R_MIPS_REL32); \ + (ref)? value + ref->st_value: 0; \ + }) +-#endif /* RTLD_BOOTSTRAP */ ++ ++ if (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL) ++ vernum = (const void *) D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]); ++ else ++ vernum = NULL; + + got = (ElfW(Addr) *) D_PTR (map, l_info[DT_PLTGOT]); + +@@ -639,10 +601,10 @@ + && sym->st_value && lazy) + *got = sym->st_value + map->l_addr; + else +- *got = RESOLVE_GOTSYM (sym, symidx); ++ *got = RESOLVE_GOTSYM (sym, vernum, symidx); + } + else if (sym->st_shndx == SHN_COMMON) +- *got = RESOLVE_GOTSYM (sym, symidx); ++ *got = RESOLVE_GOTSYM (sym, vernum, symidx); + else if (ELFW(ST_TYPE) (sym->st_info) == STT_FUNC + && *got != sym->st_value + && lazy) +@@ -653,7 +615,7 @@ + *got += map->l_addr; + } + else +- *got = RESOLVE_GOTSYM (sym, symidx); ++ *got = RESOLVE_GOTSYM (sym, vernum, symidx); + + ++got; + ++sym; +@@ -661,9 +623,8 @@ + } + + #undef RESOLVE_GOTSYM +- +- return; + } ++#endif + + /* Set up the loaded object described by L so its stub function + will jump to the on-demand fixup code __dl_runtime_resolve. */ +diff -urNbB glibc-2.2.3/sysdeps/mips/mips64/rtld-parms glibc-2.2.3-mips/sysdeps/mips/mips64/rtld-parms +--- glibc-2.2.3/sysdeps/mips/mips64/rtld-parms Sat Jul 12 18:26:11 1997 ++++ glibc-2.2.3-mips/sysdeps/mips/mips64/rtld-parms Wed Dec 31 19:00:00 1969 +@@ -1,3 +0,0 @@ +-ifndef rtld-wordsize +-rtld-wordsize = 64 +-endif +diff -urNbB glibc-2.2.3/sysdeps/mips/mipsel/rtld-parms glibc-2.2.3-mips/sysdeps/mips/mipsel/rtld-parms +--- glibc-2.2.3/sysdeps/mips/mipsel/rtld-parms Sat Jul 12 18:26:15 1997 ++++ glibc-2.2.3-mips/sysdeps/mips/mipsel/rtld-parms Wed Dec 31 19:00:00 1969 +@@ -1,3 +0,0 @@ +-ifndef rtld-oformat +-rtld-oformat = elf32-littlemips +-endif +diff -urNbB glibc-2.2.3/sysdeps/mips/rtld-ldscript.in glibc-2.2.3-mips/sysdeps/mips/rtld-ldscript.in +--- glibc-2.2.3/sysdeps/mips/rtld-ldscript.in Sat Jul 12 18:23:14 1997 ++++ glibc-2.2.3-mips/sysdeps/mips/rtld-ldscript.in Wed Dec 31 19:00:00 1969 +@@ -1,106 +0,0 @@ +-OUTPUT_FORMAT("@@rtld-oformat@@") +-OUTPUT_ARCH(@@rtld-arch@@) +-ENTRY(@@rtld-entry@@) +-SECTIONS +-{ +- /* Read-only sections, merged into text segment: */ +- . = @@rtld-base@@; +- .reginfo : { *(.reginfo) } +- .dynamic : { *(.dynamic) } +- .dynstr : { *(.dynstr) } +- .dynsym : { *(.dynsym) } +- .hash : { *(.hash) } +- .rel.text : { *(.rel.text) } +- .rela.text : { *(.rela.text) } +- .rel.data : { *(.rel.data) } +- .rela.data : { *(.rela.data) } +- .rel.rodata : { *(.rel.rodata) } +- .rela.rodata : { *(.rela.rodata) } +- .rel.got : { *(.rel.got) } +- .rela.got : { *(.rela.got) } +- .rel.ctors : { *(.rel.ctors) } +- .rela.ctors : { *(.rela.ctors) } +- .rel.dtors : { *(.rel.dtors) } +- .rela.dtors : { *(.rela.dtors) } +- .rel.init : { *(.rel.init) } +- .rela.init : { *(.rela.init) } +- .rel.fini : { *(.rel.fini) } +- .rela.fini : { *(.rela.fini) } +- .rel.bss : { *(.rel.bss) } +- .rela.bss : { *(.rela.bss) } +- .rel.plt : { *(.rel.plt) } +- .rela.plt : { *(.rela.plt) } +- .rodata : { *(.rodata) } +- .rodata1 : { *(.rodata1) } +- .init : { *(.init) } =0 +- .text : +- { +- *(.text) +- *(.stub) +- /* .gnu.warning sections are handled specially by elf32.em. */ +- *(.gnu.warning) +- } =0 +- .fini : { *(.fini) } =0 +- /* Adjust the address for the data segment. We want to adjust up to +- the same address within the page on the next page up. It would +- be more correct to do this: +- . = 0x10000000; +- The current expression does not correctly handle the case of a +- text segment ending precisely at the end of a page; it causes the +- data segment to skip a page. The above expression does not have +- this problem, but it will currently (2/95) cause BFD to allocate +- a single segment, combining both text and data, for this case. +- This will prevent the text segment from being shared among +- multiple executions of the program; I think that is more +- important than losing a page of the virtual address space (note +- that no actual memory is lost; the page which is skipped can not +- be referenced). */ +- . += 0x10000; +- .data : +- { +- *(.data) +- CONSTRUCTORS +- } +- .data1 : { *(.data1) } +- .ctors : { *(.ctors) } +- .dtors : { *(.dtors) } +- _gp = ALIGN(16) + 0x7ff0; +- .got : +- { +- *(.got.plt) *(.got) +- } +- /* We want the small data sections together, so single-instruction offsets +- can access them all, and initialized data all before uninitialized, so +- we can shorten the on-disk segment size. */ +- .sdata : { *(.sdata) } +- .lit8 : { *(.lit8) } +- .lit4 : { *(.lit4) } +- .sbss : { *(.sbss) *(.scommon) } +- .bss : +- { +- *(.dynbss) +- *(.bss) +- *(COMMON) +- } +- /* The normal linker scripts created by the binutils doesn't have the +- symbols end and _end which breaks ld.so's dl-minimal.c. */ +- _end = . ; +- PROVIDE (end = .); +- /* These are needed for ELF backends which have not yet been +- converted to the new style linker. */ +- .stab 0 : { *(.stab) } +- .stabstr 0 : { *(.stabstr) } +- /* DWARF debug sections. +- Symbols in the .debug DWARF section are relative to the beginning of the +- section so we begin .debug at 0. It's not clear yet what needs to happen +- for the others. */ +- .debug 0 : { *(.debug) } +- .debug_srcinfo 0 : { *(.debug_srcinfo) } +- .debug_aranges 0 : { *(.debug_aranges) } +- .debug_pubnames 0 : { *(.debug_pubnames) } +- .debug_sfnames 0 : { *(.debug_sfnames) } +- .line 0 : { *(.line) } +- /* These must appear regardless of . */ +- .gptab.sdata : { *(.gptab.data) *(.gptab.sdata) } +- .gptab.sbss : { *(.gptab.bss) *(.gptab.sbss) } +-} +diff -urNbB glibc-2.2.3/sysdeps/mips/rtld-parms glibc-2.2.3-mips/sysdeps/mips/rtld-parms +--- glibc-2.2.3/sysdeps/mips/rtld-parms Mon Jul 21 19:04:07 1997 ++++ glibc-2.2.3-mips/sysdeps/mips/rtld-parms Wed Dec 31 19:00:00 1969 +@@ -1,15 +0,0 @@ +-ifndef rtld-wordsize +-rtld-wordsize = 32 +-endif +-ifndef rtld-oformat +-rtld-oformat = elf$(rtld-wordsize)-bigmips +-endif +-ifndef rtld-arch +-rtld-arch = mips +-endif +-ifndef rtld-entry +-rtld-entry = __start +-endif +-ifndef rtld-base +-rtld-base = 0x0fb60000 + SIZEOF_HEADERS +-endif diff --git a/patches/glibc/2.2.3/glibc-2.2.5-mips-clone-local-label.patch b/patches/glibc/2.2.3/glibc-2.2.5-mips-clone-local-label.patch new file mode 100644 index 00000000..66fee299 --- /dev/null +++ b/patches/glibc/2.2.3/glibc-2.2.5-mips-clone-local-label.patch @@ -0,0 +1,47 @@ +This is a workaround for + +mipsel-unknown-linux-gnu-gcc ../sysdeps/unix/sysv/linux/mips/clone.S -c -I../include -I. -I/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc -I.. -I../libio -I/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc -I../sysdeps/mips/elf -I../linuxthreads/sysdeps/unix/sysv/linux -I../linuxthreads/sysdeps/pthread -I../sysdeps/pthread -I../linuxthreads/sysdeps/unix/sysv -I../linuxthreads/sysdeps/unix -I../linuxthreads/sysdeps/mips -I../sysdeps/unix/sysv/linux/mips -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix/mips -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/mips/mipsel -I../sysdeps/mips/fpu -I../sysdeps/mips -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic -nostdinc -isystem /home3/dank/crosstool-0.7/result/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/lib/gcc-lib/mipsel-unknown-linux-gnu/3.2.3/include -isystem /home3/dank/crosstool-0.7/result/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/mipsel-unknown-linux-gnu/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h -DPIC -DASSEMBLER -o /home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc/clone.o +../sysdeps/unix/sysv/linux/mips/clone.S: Assembler messages: +../sysdeps/unix/sysv/linux/mips/clone.S:66: Error: Can not represent BFD_RELOC_16_PCREL_S2 relocation in this object file format +make[2]: *** [/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc/clone.o] Error 1 + +which was using h.j.lu's binutils-2.13.90.0.18. + + +But see http://lists.debian.org/debian-mips/2003/debian-mips-200305/msg00011.html +which says +"A newer version of binutils (CVS post 2003-03-12) fixes it without +the need of changing perfectly legal code." +So presumably this can be ditched sooner or later. + +From http://honk.physik.uni-konstanz.de/~agx/linux-mips/glibc/patches/applied/clone-local-label.diff + +2003-03-13 Guido Guenther <agx@sigxcpu.org> + + * 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. + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/mips/clone.S,v +retrieving revision 1.10 +diff -u -r1.10 clone.S +--- glibc-2.2.5/sysdeps/unix/sysv/linux/mips/clone.S 12 Mar 2003 01:04:51 -0000 1.10 ++++ glibc-2.2.5/sysdeps/unix/sysv/linux/mips/clone.S 12 Mar 2003 19:04:39 -0000 +@@ -63,7 +63,7 @@ + syscall + + bnez a3,error +- beqz v0,__thread_start ++ beqz v0,.Lthread_start + + /* Successful return from the parent */ + addiu sp,32 +@@ -85,6 +85,7 @@ + debug info. */ + + ENTRY(__thread_start) ++.Lthread_start: + /* cp is already loaded. */ + .cprestore 16 + /* The stackframe has been created on entry of clone(). */ diff --git a/patches/glibc/2.2.3/glibc-manual-stdin.texi-1.127.patch b/patches/glibc/2.2.3/glibc-manual-stdin.texi-1.127.patch new file mode 100644 index 00000000..c6945253 --- /dev/null +++ b/patches/glibc/2.2.3/glibc-manual-stdin.texi-1.127.patch @@ -0,0 +1,25 @@ +Fixes error +./stdio.texi:3269: First argument to cross-reference may not be empty. +./stdio.texi:3270: First argument to cross-reference may not be empty. +makeinfo: Removing output file `/home/dank/downloads/crosstool-0.24/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.3/glibc-2.2.3/manual/libc.info' due to errors; use --force to preserve. +make[2]: *** [libc.info] Error 2 +make[2]: Leaving directory `/home/dank/downloads/crosstool-0.24/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.3/glibc-2.2.3/manual' + +=================================================================== +RCS file: /cvs/glibc/libc/manual/stdio.texi,v +retrieving revision 1.126 +retrieving revision 1.127 +diff -u -r1.126 -r1.127 +--- libc/manual/stdio.texi 2001/06/06 07:11:31 1.126 ++++ libc/manual/stdio.texi 2001/07/31 18:57:16 1.127 +@@ -3265,8 +3265,8 @@ + If you are trying to read input that doesn't match a single, fixed + pattern, you may be better off using a tool such as Flex to generate a + lexical scanner, or Bison to generate a parser, rather than using +-@code{scanf}. For more information about these tools, see @ref{, , , +-flex.info, Flex: The Lexical Scanner Generator}, and @ref{, , , ++@code{scanf}. For more information about these tools, see @ref{Top, , , ++flex.info, Flex: The Lexical Scanner Generator}, and @ref{Top, , , + bison.info, The Bison Reference Manual}. + + @node Input Conversion Syntax diff --git a/patches/glibc/2.2.5/alpha-build-failure.patch b/patches/glibc/2.2.5/alpha-build-failure.patch new file mode 100644 index 00000000..d131f1bf --- /dev/null +++ b/patches/glibc/2.2.5/alpha-build-failure.patch @@ -0,0 +1,37 @@ +See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=156841 + +Here's the error I got before I applied the patch: + +/home3/dank/crosstool-0.5/result/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/lib/gcc-lib/alpha-unknown-linux-gnu/3.2.3/../../../../alpha-unknown-linux-gnu/bin/ld: /home3/dank/crosstool-0.5/build/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libc_pic.os: pc-relative relocation against dynamic symbol __divlu +/home3/dank/crosstool-0.5/result/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/lib/gcc-lib/alpha-unknown-linux-gnu/3.2.3/../../../../alpha-unknown-linux-gnu/bin/ld: /home3/dank/crosstool-0.5/build/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libc_pic.os: pc-relative relocation against dynamic symbol __divqu +/home3/dank/crosstool-0.5/result/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/lib/gcc-lib/alpha-unknown-linux-gnu/3.2.3/../../../../alpha-unknown-linux-gnu/bin/ld: /home3/dank/crosstool-0.5/build/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libc_pic.os: pc-relative relocation against dynamic symbol __remlu +/home3/dank/crosstool-0.5/result/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/lib/gcc-lib/alpha-unknown-linux-gnu/3.2.3/../../../../alpha-unknown-linux-gnu/bin/ld: /home3/dank/crosstool-0.5/build/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libc_pic.os: pc-relative relocation against dynamic symbol __remqu +collect2: ld returned 1 exit status +make[1]: *** [/home3/dank/crosstool-0.5/build/alpha-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libc.so] Error 1 + + +--- glibc-2.2.5/sysdeps/alpha/divrem.h 6 Jul 2001 04:55:45 -0000 1.8 ++++ glibc-2.2.5/sysdeps/alpha/divrem.h 15 Jun 2002 20:53:37 -0000 1.9 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. ++/* Copyright (C) 1996,97,2002 Free Software Foundation, Inc. + Contributed by David Mosberger (davidm@cs.arizona.edu). + This file is part of the GNU C Library. + +@@ -86,6 +86,7 @@ + + .align 3 + UFUNC_NAME: ++$udiv_entry: + lda sp, -STACK(sp) + .frame sp, STACK, retaddr, 0 + #ifdef PROF +@@ -206,7 +207,7 @@ + cmovge AT, AT, arg2 + + /* Do the unsigned division. */ +- bsr retaddr, UFUNC_NAME ++ bsr retaddr, $udiv_entry + + /* Restore originals and adjust the sign of the result. */ + ldq arg1, 0(sp) diff --git a/patches/glibc/2.2.5/arm-asm-clobber.patch b/patches/glibc/2.2.5/arm-asm-clobber.patch new file mode 100644 index 00000000..06376b5b --- /dev/null +++ b/patches/glibc/2.2.5/arm-asm-clobber.patch @@ -0,0 +1,23 @@ +http://gcc.gnu.org/PR11103 + +Error: +../sysdeps/unix/sysv/linux/arm/sigaction.c: In function `__libc_sigaction': +../sysdeps/unix/sysv/linux/arm/sigaction.c:100: error: asm-specifier for variable `_a1' conflicts with asm clobber list +../sysdeps/unix/sysv/linux/arm/sigaction.c:139: error: asm-specifier for variable `_a1' conflicts with asm clobber list +make[2]: *** [/crosstool-0.22/build/arm-unknown-linux-gnu/gcc-3.3-glibc-2.2.5/build-glibc/signal/sigaction.o] Error 1 + +Fix from http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-July/005826.html +rediffed against glibc-2.2.5 +Not tested. (I don't even understand it, just being a patch monkey...) + +--- glibc-2.2.5/sysdeps/unix/sysv/linux/arm/sysdep.h.old Wed Aug 27 09:58:15 2003 ++++ glibc-2.2.5/sysdeps/unix/sysv/linux/arm/sysdep.h Wed Aug 27 09:59:04 2003 +@@ -131,7 +131,7 @@ + asm volatile ("swi %1 @ syscall " #name \ + : "=r" (_a1) \ + : "i" (SYS_ify(name)) ASM_ARGS_##nr \ +- : "a1", "memory"); \ ++ : "memory"); \ + _sys_result = _a1; \ + } \ + if (_sys_result >= (unsigned int) -4095) \ diff --git a/patches/glibc/2.2.5/arm-ctl_bus_isa.patch b/patches/glibc/2.2.5/arm-ctl_bus_isa.patch new file mode 100644 index 00000000..3422070b --- /dev/null +++ b/patches/glibc/2.2.5/arm-ctl_bus_isa.patch @@ -0,0 +1,51 @@ +Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004. +Needed to build glibc with linux kernels 2.4.23 or higher on ARM, +Fixes following error: + +../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys': +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]') +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]') +make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1 + +cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA", http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html + +--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old 2003-02-20 14:22:24.000000000 -0800 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c 2004-01-31 16:01:50.000000000 -0800 +@@ -47,6 +47,12 @@ + #include <asm/page.h> + #include <sys/sysctl.h> + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include <linux/version.h> ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23)) ++#define CTL_BUS_ISA BUS_ISA /* and hope it's not the one from linux/input.h */ ++#endif ++ + #define PATH_ARM_SYSTYPE "/etc/arm_systype" + #define PATH_CPUINFO "/proc/cpuinfo" + +@@ -80,7 +86,7 @@ + * Initialize I/O system. There are several ways to get the information + * we need. Each is tried in turn until one succeeds. + * +- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*). This is the preferred method ++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*). This is the preferred method + * but not all kernels support it. + * + * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE. +@@ -100,8 +106,8 @@ + { + char systype[256]; + int i, n; +- static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE }; +- static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT }; ++ static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE }; ++ static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT }; + size_t len = sizeof(io.base); + + if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0) diff --git a/patches/glibc/2.2.5/cris-libc-symbols.patch b/patches/glibc/2.2.5/cris-libc-symbols.patch new file mode 100644 index 00000000..42c67d29 --- /dev/null +++ b/patches/glibc/2.2.5/cris-libc-symbols.patch @@ -0,0 +1,97 @@ +From http://sources.redhat.com/ml/libc-alpha/2002-06/msg00006.html + +Message-ID: <15612.44195.299251.921969@honolulu.ilog.fr> +Date: Tue, 4 Jun 2002 14:03:47 +0200 (CEST) +From: Bruno Haible <bruno at clisp dot org> +To: libc-alpha at sources dot redhat dot com +Subject: link_warning fix + + +Hi, + +While cross-compiling glibc-2.2.5 for target=cris-linux using gcc-3.1 and +binutils-2.12.90.0.7, I get an error + +cris-linux-gcc ../sysdeps/unix/sysv/linux/sigstack.c -c -O2 -Wall -Winline -Wstrict-prototypes -Wwrite-strings -g -I../include -I. -I/backup/cross-build/build-glibc-cris/signal -I.. -I../libio -I/backup/cross-build/build-glibc-cris -I../sysdeps/cris/elf -I../linuxthreads/sysdeps/unix/sysv/linux -I../linuxthreads/sysdeps/pthread -I../sysdeps/pthread -I../linuxthreads/sysdeps/unix/sysv -I../linuxthreads/sysdeps/unix -I../linuxthreads/sysdeps/cris -I../sysdeps/unix/sysv/linux/cris -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/cris -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic -nostdinc -isystem /cross/cris-linux-tools/lib/gcc-lib/cris-linux/3.1/include -isystem /cross/cris-linux/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h -o /backup/cross-build/build-glibc-cris/signal/sigstack.o +/tmp/cca7qZyI.s: Assembler messages: +/tmp/cca7qZyI.s:87: Warning: rest of line ignored; first ignored character is `,' +/tmp/cca7qZyI.s:87: Error: Unknown opcode: `progbits' +make[2]: *** [/backup/cross-build/build-glibc-cris/signal/sigstack.o] Fehler 1 + + +The reason is that the .s file contains the following. + +... + .size sigstack,.Lfe1-sigstack +#APP + .section .gnu.warning.sigstack + .previous +#NO_APP + .section .gnu.warning.sigstack + #,"a",@progbits + .align 2 + .type __evoke_link_warning_sigstack,@object +... + +and comments (introduced by '#') are recognized by the assembler only after +#APP, not after #NO_APP. The workaround is to add '#APP' to the fake section +name. The following patch works for me. + +2002-06-02 Bruno Haible <bruno@clisp.org> + + * include/libc-symbols.h (__as_app_line): New macro. + (link_warning): Emit #APP line to turn comment recognition on. + +*** glibc-2.2.5/include/libc-symbols.h.bak 2001-08-04 01:02:52.000000000 +0200 +--- glibc-2.2.5/include/libc-symbols.h 2002-06-02 16:22:15.000000000 +0200 +*************** +*** 207,224 **** + # define __make_section_unallocated(section_string) + # endif + +! /* Tacking on "\n\t#" to the section name makes gcc put it's bogus +! section attributes on what looks like a comment to the assembler. */ + # ifdef HAVE_SECTION_QUOTES + # define link_warning(symbol, msg) \ + __make_section_unallocated (".gnu.warning." #symbol) \ +! static const char __evoke_link_warning_##symbol[] \ +! __attribute__ ((section (".gnu.warning." #symbol "\"\n\t#\""))) = msg; + # else + # define link_warning(symbol, msg) \ + __make_section_unallocated (".gnu.warning." #symbol) \ +! static const char __evoke_link_warning_##symbol[] \ +! __attribute__ ((section (".gnu.warning." #symbol "\n\t#"))) = msg; + # endif + # else /* Not ELF: a.out */ + # ifdef HAVE_XCOFF +--- 207,235 ---- + # define __make_section_unallocated(section_string) + # endif + +! /* Tacking on "\n\t#" to the section name makes gcc put its bogus +! section attributes on what looks like a comment to the assembler. +! Furthermore, with gas, we need to add a "#APP" line so the comment +! is recognized as such. */ +! # ifdef HAVE_GNU_AS +! # define __as_app_line "#APP\n" +! # else +! # define __as_app_line "" +! # endif + # ifdef HAVE_SECTION_QUOTES + # define link_warning(symbol, msg) \ + __make_section_unallocated (".gnu.warning." #symbol) \ +! static const char __evoke_link_warning_##symbol[] \ +! __attribute__ \ +! ((section (".gnu.warning." #symbol "\"\n" __as_app_line "\t#\""))) \ +! = msg; + # else + # define link_warning(symbol, msg) \ + __make_section_unallocated (".gnu.warning." #symbol) \ +! static const char __evoke_link_warning_##symbol[] \ +! __attribute__ \ +! ((section (".gnu.warning." #symbol "\n" __as_app_line "\t#"))) \ +! = msg; + # endif + # else /* Not ELF: a.out */ + # ifdef HAVE_XCOFF + diff --git a/patches/glibc/2.2.5/cris-stack-direction.patch b/patches/glibc/2.2.5/cris-stack-direction.patch new file mode 100644 index 00000000..158eb391 --- /dev/null +++ b/patches/glibc/2.2.5/cris-stack-direction.patch @@ -0,0 +1,61 @@ +From http://sources.redhat.com/ml/libc-alpha/2002-06/msg00007.html + +Message-ID: <15612.44228.774370.154718@honolulu.ilog.fr> +Date: Tue, 4 Jun 2002 14:04:20 +0200 (CEST) +From: Bruno Haible <bruno at clisp dot org> +To: libc-alpha at sources dot redhat dot com +Subject: cris stack direction + + +Hi, + +While cross-compiling glibc-2.2.5 for target=cris-linux using gcc-3.1 and +binutils-2.12.90.0.7, I get an error + +cris-linux-gcc cancel.c -c -O2 -Wall -Winline -Wstrict-prototypes -Wwrite-strings -g -D__NO_WEAK_PTHREAD_ALIASES -D_RPC_THREAD_SAFE_ -I../include -I. -I/backup/cross-build/build-glibc-cris/linuxthreads -I.. -I../libio -I/backup/cross-build/build-glibc-cris -I../sysdeps/cris/elf -I../linuxthreads/sysdeps/unix/sysv/linux -I../linuxthreads/sysdeps/pthread -I../sysdeps/pthread -I../linuxthreads/sysdeps/unix/sysv -I../linuxthreads/sysdeps/unix -I../linuxthreads/sysdeps/cris -I../sysdeps/unix/sysv/linux/cris -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/cris -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic -nostdinc -isystem /cross/cris-linux-tools/lib/gcc-lib/cris-linux/3.1/include -isystem /cross/cris-linux/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h -o /backup/cross-build/build-glibc-cris/linuxthreads/cancel.o +cancel.c:29:3: #error "Define either _STACK_GROWS_DOWN or _STACK_GROWS_UP" +cancel.c: In function `_pthread_cleanup_push': +cancel.c:134: warning: implicit declaration of function `FRAME_LEFT' +make[2]: *** [/backup/cross-build/build-glibc-cris/linuxthreads/cancel.o] Fehler 1 + +The fix is to add a file sysdeps/cris/stackinfo.h. + + +2002-06-02 Bruno Haible <bruno@clisp.org> + + * sysdeps/cris/stackinfo.h: New file. + +*** glibc-2.2.5/sysdeps/cris/stackinfo.h.bak 2002-06-02 17:52:05.000000000 +0200 +--- glibc-2.2.5/sysdeps/cris/stackinfo.h 2002-06-02 17:52:24.000000000 +0200 +*************** +*** 0 **** +--- 1,28 ---- ++ /* Copyright (C) 2002 Free Software Foundation, Inc. ++ This file is part of the GNU C Library. ++ ++ The GNU C Library is free software; you can redistribute it and/or ++ 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. */ ++ ++ /* This file contains a bit of information about the stack allocation ++ of the processor. */ ++ ++ #ifndef _STACKINFO_H ++ #define _STACKINFO_H 1 ++ ++ /* On cris the stack grows down. */ ++ #define _STACK_GROWS_DOWN 1 ++ ++ #endif /* stackinfo.h */ + diff --git a/patches/glibc/2.2.5/dl-machine-alpha.patch b/patches/glibc/2.2.5/dl-machine-alpha.patch new file mode 100644 index 00000000..50e5bc54 --- /dev/null +++ b/patches/glibc/2.2.5/dl-machine-alpha.patch @@ -0,0 +1,424 @@ +From http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/alpha/dl-machine.h.diff?r1=1.56&r2=1.57&cvsroot=glibc +(minus first hunk) +Lets glibc-2.2.5 compile with gcc-3.3 + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/alpha/dl-machine.h,v +retrieving revision 1.56 +retrieving revision 1.57 +diff -u -r1.56 -r1.57 +--- libc/sysdeps/alpha/dl-machine.h 2001/12/12 00:10:27 1.56 ++++ libc/sysdeps/alpha/dl-machine.h 2001/12/31 17:33:59 1.57 +@@ -156,125 +157,126 @@ + #define TRAMPOLINE_TEMPLATE(tramp_name, fixup_name, IMB) \ + extern void tramp_name (void); \ + asm ( "\ +- .globl " #tramp_name " +- .ent " #tramp_name " +-" #tramp_name ": +- lda $sp, -44*8($sp) +- .frame $sp, 44*8, $26 +- /* Preserve all integer registers that C normally doesn't. */ +- stq $26, 0*8($sp) +- stq $0, 1*8($sp) +- stq $1, 2*8($sp) +- stq $2, 3*8($sp) +- stq $3, 4*8($sp) +- stq $4, 5*8($sp) +- stq $5, 6*8($sp) +- stq $6, 7*8($sp) +- stq $7, 8*8($sp) +- stq $8, 9*8($sp) +- stq $16, 10*8($sp) +- stq $17, 11*8($sp) +- stq $18, 12*8($sp) +- stq $19, 13*8($sp) +- stq $20, 14*8($sp) +- stq $21, 15*8($sp) +- stq $22, 16*8($sp) +- stq $23, 17*8($sp) +- stq $24, 18*8($sp) +- stq $25, 19*8($sp) +- stq $29, 20*8($sp) +- stt $f0, 21*8($sp) +- stt $f1, 22*8($sp) +- stt $f10, 23*8($sp) +- stt $f11, 24*8($sp) +- stt $f12, 25*8($sp) +- stt $f13, 26*8($sp) +- stt $f14, 27*8($sp) +- stt $f15, 28*8($sp) +- stt $f16, 29*8($sp) +- stt $f17, 30*8($sp) +- stt $f18, 31*8($sp) +- stt $f19, 32*8($sp) +- stt $f20, 33*8($sp) +- stt $f21, 34*8($sp) +- stt $f22, 35*8($sp) +- stt $f23, 36*8($sp) +- stt $f24, 37*8($sp) +- stt $f25, 38*8($sp) +- stt $f26, 39*8($sp) +- stt $f27, 40*8($sp) +- stt $f28, 41*8($sp) +- stt $f29, 42*8($sp) +- stt $f30, 43*8($sp) +- .mask 0x27ff01ff, -44*8 +- .fmask 0xfffffc03, -(44-21)*8 +- /* Set up our $gp */ +- br $gp, .+4 +- ldgp $gp, 0($gp) +- .prologue 0 +- /* Set up the arguments for fixup: */ +- /* $16 = link_map out of plt0 */ +- /* $17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24 */ +- /* $18 = return address */ +- subq $28, $27, $17 +- ldq $16, 8($27) +- subq $17, 20, $17 +- mov $26, $18 +- addq $17, $17, $17 +- /* Do the fixup */ +- bsr $26, " ASM_ALPHA_NG_SYMBOL_PREFIX #fixup_name "..ng +- /* Move the destination address into position. */ +- mov $0, $27 +- /* Restore program registers. */ +- ldq $26, 0*8($sp) +- ldq $0, 1*8($sp) +- ldq $1, 2*8($sp) +- ldq $2, 3*8($sp) +- ldq $3, 4*8($sp) +- ldq $4, 5*8($sp) +- ldq $5, 6*8($sp) +- ldq $6, 7*8($sp) +- ldq $7, 8*8($sp) +- ldq $8, 9*8($sp) +- ldq $16, 10*8($sp) +- ldq $17, 11*8($sp) +- ldq $18, 12*8($sp) +- ldq $19, 13*8($sp) +- ldq $20, 14*8($sp) +- ldq $21, 15*8($sp) +- ldq $22, 16*8($sp) +- ldq $23, 17*8($sp) +- ldq $24, 18*8($sp) +- ldq $25, 19*8($sp) +- ldq $29, 20*8($sp) +- ldt $f0, 21*8($sp) +- ldt $f1, 22*8($sp) +- ldt $f10, 23*8($sp) +- ldt $f11, 24*8($sp) +- ldt $f12, 25*8($sp) +- ldt $f13, 26*8($sp) +- ldt $f14, 27*8($sp) +- ldt $f15, 28*8($sp) +- ldt $f16, 29*8($sp) +- ldt $f17, 30*8($sp) +- ldt $f18, 31*8($sp) +- ldt $f19, 32*8($sp) +- ldt $f20, 33*8($sp) +- ldt $f21, 34*8($sp) +- ldt $f22, 35*8($sp) +- ldt $f23, 36*8($sp) +- ldt $f24, 37*8($sp) +- ldt $f25, 38*8($sp) +- ldt $f26, 39*8($sp) +- ldt $f27, 40*8($sp) +- ldt $f28, 41*8($sp) +- ldt $f29, 42*8($sp) +- ldt $f30, 43*8($sp) +- /* Flush the Icache after having modified the .plt code. */ +- " #IMB " +- /* Clean up and turn control to the destination */ +- lda $sp, 44*8($sp) +- jmp $31, ($27) ++ .globl " #tramp_name " \n\ ++ .ent " #tramp_name " \n\ ++" #tramp_name ": \n\ ++ lda $sp, -44*8($sp) \n\ ++ .frame $sp, 44*8, $26 \n\ ++ /* Preserve all integer registers that C normally \n\ ++ doesn't. */ \n\ ++ stq $26, 0*8($sp) \n\ ++ stq $0, 1*8($sp) \n\ ++ stq $1, 2*8($sp) \n\ ++ stq $2, 3*8($sp) \n\ ++ stq $3, 4*8($sp) \n\ ++ stq $4, 5*8($sp) \n\ ++ stq $5, 6*8($sp) \n\ ++ stq $6, 7*8($sp) \n\ ++ stq $7, 8*8($sp) \n\ ++ stq $8, 9*8($sp) \n\ ++ stq $16, 10*8($sp) \n\ ++ stq $17, 11*8($sp) \n\ ++ stq $18, 12*8($sp) \n\ ++ stq $19, 13*8($sp) \n\ ++ stq $20, 14*8($sp) \n\ ++ stq $21, 15*8($sp) \n\ ++ stq $22, 16*8($sp) \n\ ++ stq $23, 17*8($sp) \n\ ++ stq $24, 18*8($sp) \n\ ++ stq $25, 19*8($sp) \n\ ++ stq $29, 20*8($sp) \n\ ++ stt $f0, 21*8($sp) \n\ ++ stt $f1, 22*8($sp) \n\ ++ stt $f10, 23*8($sp) \n\ ++ stt $f11, 24*8($sp) \n\ ++ stt $f12, 25*8($sp) \n\ ++ stt $f13, 26*8($sp) \n\ ++ stt $f14, 27*8($sp) \n\ ++ stt $f15, 28*8($sp) \n\ ++ stt $f16, 29*8($sp) \n\ ++ stt $f17, 30*8($sp) \n\ ++ stt $f18, 31*8($sp) \n\ ++ stt $f19, 32*8($sp) \n\ ++ stt $f20, 33*8($sp) \n\ ++ stt $f21, 34*8($sp) \n\ ++ stt $f22, 35*8($sp) \n\ ++ stt $f23, 36*8($sp) \n\ ++ stt $f24, 37*8($sp) \n\ ++ stt $f25, 38*8($sp) \n\ ++ stt $f26, 39*8($sp) \n\ ++ stt $f27, 40*8($sp) \n\ ++ stt $f28, 41*8($sp) \n\ ++ stt $f29, 42*8($sp) \n\ ++ stt $f30, 43*8($sp) \n\ ++ .mask 0x27ff01ff, -44*8 \n\ ++ .fmask 0xfffffc03, -(44-21)*8 \n\ ++ /* Set up our $gp */ \n\ ++ br $gp, .+4 \n\ ++ ldgp $gp, 0($gp) \n\ ++ .prologue 0 \n\ ++ /* Set up the arguments for fixup: */ \n\ ++ /* $16 = link_map out of plt0 */ \n\ ++ /* $17 = offset of reloc entry = ($28 - $27 - 20) /12 * 24 */\n\ ++ /* $18 = return address */ \n\ ++ subq $28, $27, $17 \n\ ++ ldq $16, 8($27) \n\ ++ subq $17, 20, $17 \n\ ++ mov $26, $18 \n\ ++ addq $17, $17, $17 \n\ ++ /* Do the fixup */ \n\ ++ bsr $26, " ASM_ALPHA_NG_SYMBOL_PREFIX #fixup_name "..ng\n\ ++ /* Move the destination address into position. */ \n\ ++ mov $0, $27 \n\ ++ /* Restore program registers. */ \n\ ++ ldq $26, 0*8($sp) \n\ ++ ldq $0, 1*8($sp) \n\ ++ ldq $1, 2*8($sp) \n\ ++ ldq $2, 3*8($sp) \n\ ++ ldq $3, 4*8($sp) \n\ ++ ldq $4, 5*8($sp) \n\ ++ ldq $5, 6*8($sp) \n\ ++ ldq $6, 7*8($sp) \n\ ++ ldq $7, 8*8($sp) \n\ ++ ldq $8, 9*8($sp) \n\ ++ ldq $16, 10*8($sp) \n\ ++ ldq $17, 11*8($sp) \n\ ++ ldq $18, 12*8($sp) \n\ ++ ldq $19, 13*8($sp) \n\ ++ ldq $20, 14*8($sp) \n\ ++ ldq $21, 15*8($sp) \n\ ++ ldq $22, 16*8($sp) \n\ ++ ldq $23, 17*8($sp) \n\ ++ ldq $24, 18*8($sp) \n\ ++ ldq $25, 19*8($sp) \n\ ++ ldq $29, 20*8($sp) \n\ ++ ldt $f0, 21*8($sp) \n\ ++ ldt $f1, 22*8($sp) \n\ ++ ldt $f10, 23*8($sp) \n\ ++ ldt $f11, 24*8($sp) \n\ ++ ldt $f12, 25*8($sp) \n\ ++ ldt $f13, 26*8($sp) \n\ ++ ldt $f14, 27*8($sp) \n\ ++ ldt $f15, 28*8($sp) \n\ ++ ldt $f16, 29*8($sp) \n\ ++ ldt $f17, 30*8($sp) \n\ ++ ldt $f18, 31*8($sp) \n\ ++ ldt $f19, 32*8($sp) \n\ ++ ldt $f20, 33*8($sp) \n\ ++ ldt $f21, 34*8($sp) \n\ ++ ldt $f22, 35*8($sp) \n\ ++ ldt $f23, 36*8($sp) \n\ ++ ldt $f24, 37*8($sp) \n\ ++ ldt $f25, 38*8($sp) \n\ ++ ldt $f26, 39*8($sp) \n\ ++ ldt $f27, 40*8($sp) \n\ ++ ldt $f28, 41*8($sp) \n\ ++ ldt $f29, 42*8($sp) \n\ ++ ldt $f30, 43*8($sp) \n\ ++ /* Flush the Icache after having modified the .plt code. */\n\ ++ " #IMB " \n\ ++ /* Clean up and turn control to the destination */ \n\ ++ lda $sp, 44*8($sp) \n\ ++ jmp $31, ($27) \n\ + .end " #tramp_name) + + #ifndef PROF +@@ -292,85 +294,87 @@ + its return value is the user program's entry point. */ + + #define RTLD_START asm ("\ +-.text +- .set at +- .globl _start +- .ent _start +-_start: +- br $gp, 0f +-0: ldgp $gp, 0($gp) +- .prologue 0 +- /* Pass pointer to argument block to _dl_start. */ +- mov $sp, $16 +- bsr $26, "ASM_ALPHA_NG_SYMBOL_PREFIX"_dl_start..ng +- .end _start +- /* FALLTHRU */ +- .globl _dl_start_user +- .ent _dl_start_user +-_dl_start_user: +- .frame $30,0,$31,0 +- .prologue 0 +- /* Save the user entry point address in s0. */ +- mov $0, $9 +- /* Store the highest stack address. */ +- stq $30, __libc_stack_end +- /* See if we were run as a command with the executable file +- name as an extra leading argument. */ +- ldl $1, _dl_skip_args +- bne $1, $fixup_stack +-$fixup_stack_ret: +- /* The special initializer gets called with the stack just +- as the application's entry point will see it; it can +- switch stacks if it moves these contents over. */ +-" RTLD_START_SPECIAL_INIT " +- /* Call _dl_init(_dl_loaded, argc, argv, envp) to run initializers. */ +- ldq $16, _dl_loaded +- ldq $17, 0($sp) +- lda $18, 8($sp) +- s8addq $17, 8, $19 +- addq $19, $18, $19 +- jsr $26, _dl_init +- /* Pass our finalizer function to the user in $0. */ +- lda $0, _dl_fini +- /* Jump to the user's entry point. */ +- mov $9, $27 +- jmp ($9) +-$fixup_stack: +- /* Adjust the stack pointer to skip _dl_skip_args words. This +- involves copying everything down, since the stack pointer must +- always be 16-byte aligned. */ +- ldq $2, 0($sp) +- ldq $5, _dl_argv +- subq $31, $1, $6 +- subq $2, $1, $2 +- s8addq $6, $5, $5 +- mov $sp, $4 +- s8addq $1, $sp, $3 +- stq $2, 0($sp) +- stq $5, _dl_argv +- /* Copy down argv. */ +-0: ldq $5, 8($3) +- addq $4, 8, $4 +- addq $3, 8, $3 +- stq $5, 0($4) +- bne $5, 0b +- /* Copy down envp. */ +-1: ldq $5, 8($3) +- addq $4, 8, $4 +- addq $3, 8, $3 +- stq $5, 0($4) +- bne $5, 1b +- /* Copy down auxiliary table. */ +-2: ldq $5, 8($3) +- ldq $6, 16($3) +- addq $4, 16, $4 +- addq $3, 16, $3 +- stq $5, -8($4) +- stq $6, 0($4) +- bne $5, 2b +- br $fixup_stack_ret +- .end _dl_start_user +- .set noat ++.text \n\ ++ .set at \n\ ++ .globl _start \n\ ++ .ent _start \n\ ++_start: \n\ ++ br $gp, 0f \n\ ++0: ldgp $gp, 0($gp) \n\ ++ .prologue 0 \n\ ++ /* Pass pointer to argument block to _dl_start. */ \n\ ++ mov $sp, $16 \n\ ++ bsr $26, "ASM_ALPHA_NG_SYMBOL_PREFIX"_dl_start..ng \n\ ++ .end _start \n\ ++ /* FALLTHRU */ \n\ ++ .globl _dl_start_user \n\ ++ .ent _dl_start_user \n\ ++_dl_start_user: \n\ ++ .frame $30,0,$31,0 \n\ ++ .prologue 0 \n\ ++ /* Save the user entry point address in s0. */ \n\ ++ mov $0, $9 \n\ ++ /* Store the highest stack address. */ \n\ ++ stq $30, __libc_stack_end \n\ ++ /* See if we were run as a command with the executable \n\ ++ file name as an extra leading argument. */ \n\ ++ ldl $1, _dl_skip_args \n\ ++ bne $1, $fixup_stack \n\ ++$fixup_stack_ret: \n\ ++ /* The special initializer gets called with the stack \n\ ++ just as the application's entry point will see it; \n\ ++ it can switch stacks if it moves these contents \n\ ++ over. */ \n\ ++" RTLD_START_SPECIAL_INIT " \n\ ++ /* Call _dl_init(_dl_loaded, argc, argv, envp) to run \n\ ++ initializers. */ \n\ ++ ldq $16, _dl_loaded \n\ ++ ldq $17, 0($sp) \n\ ++ lda $18, 8($sp) \n\ ++ s8addq $17, 8, $19 \n\ ++ addq $19, $18, $19 \n\ ++ jsr $26, _dl_init \n\ ++ /* Pass our finalizer function to the user in $0. */ \n\ ++ lda $0, _dl_fini \n\ ++ /* Jump to the user's entry point. */ \n\ ++ mov $9, $27 \n\ ++ jmp ($9) \n\ ++$fixup_stack: \n\ ++ /* Adjust the stack pointer to skip _dl_skip_args words.\n\ ++ This involves copying everything down, since the \n\ ++ stack pointer must always be 16-byte aligned. */ \n\ ++ ldq $2, 0($sp) \n\ ++ ldq $5, _dl_argv \n\ ++ subq $31, $1, $6 \n\ ++ subq $2, $1, $2 \n\ ++ s8addq $6, $5, $5 \n\ ++ mov $sp, $4 \n\ ++ s8addq $1, $sp, $3 \n\ ++ stq $2, 0($sp) \n\ ++ stq $5, _dl_argv \n\ ++ /* Copy down argv. */ \n\ ++0: ldq $5, 8($3) \n\ ++ addq $4, 8, $4 \n\ ++ addq $3, 8, $3 \n\ ++ stq $5, 0($4) \n\ ++ bne $5, 0b \n\ ++ /* Copy down envp. */ \n\ ++1: ldq $5, 8($3) \n\ ++ addq $4, 8, $4 \n\ ++ addq $3, 8, $3 \n\ ++ stq $5, 0($4) \n\ ++ bne $5, 1b \n\ ++ /* Copy down auxiliary table. */ \n\ ++2: ldq $5, 8($3) \n\ ++ ldq $6, 16($3) \n\ ++ addq $4, 16, $4 \n\ ++ addq $3, 16, $3 \n\ ++ stq $5, -8($4) \n\ ++ stq $6, 0($4) \n\ ++ bne $5, 2b \n\ ++ br $fixup_stack_ret \n\ ++ .end _dl_start_user \n\ ++ .set noat \n\ + .previous"); + + #ifndef RTLD_START_SPECIAL_INIT diff --git a/patches/glibc/2.2.5/dl-machine-arm.patch b/patches/glibc/2.2.5/dl-machine-arm.patch new file mode 100644 index 00000000..176983b7 --- /dev/null +++ b/patches/glibc/2.2.5/dl-machine-arm.patch @@ -0,0 +1,389 @@ +Fixes error: +In file included from dynamic-link.h:21, + from dl-load.c:32: +../sysdeps/arm/dl-machine.h:124:25: missing terminating " character +... +make[2]: *** [/crosstool-0.22/build/arm-unknown-linux-gnu/gcc-3.3-glibc-2.2.5/build-glibc/elf/dl-load.o] Error 1 + +The first two hunks of +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/arm/dl-machine.h.diff?r1=1.39&r2=1.40&cvsroot=glibc +applied cleanly, but the third hunk didn't, so I just added the \n\'s by hand for that section. + +--- glibc-2.2.5/sysdeps/arm/dl-machine.h.orig Sat Sep 8 14:31:40 2001 ++++ glibc-2.2.5/sysdeps/arm/dl-machine.h Wed Aug 27 10:55:26 2003 +@@ -121,14 +121,15 @@ + and then redirect to the address it returns. */ + // macro for handling PIC situation.... + #ifdef PIC +-#define CALL_ROUTINE(x) " ldr sl,0f +- add sl, pc, sl +-1: ldr r2, 2f +- mov lr, pc +- add pc, sl, r2 +- b 3f +-0: .word _GLOBAL_OFFSET_TABLE_ - 1b - 4 +-2: .word " #x "(GOTOFF) ++#define CALL_ROUTINE(x) "\ ++ ldr sl,0f\n\ ++ add sl, pc, sl\n\ ++1: ldr r2, 2f\n\ ++ mov lr, pc\n\ ++ add pc, sl, r2\n\ ++ b 3f\n\ ++0: .word _GLOBAL_OFFSET_TABLE_ - 1b - 4\n\ ++2: .word " #x "(GOTOFF)\n\ + 3: " + #else + #define CALL_ROUTINE(x) " bl " #x +@@ -136,114 +137,114 @@ + + #ifndef PROF + # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ +- .text +- .globl _dl_runtime_resolve +- .type _dl_runtime_resolve, #function +- .align 2 +-_dl_runtime_resolve: +- @ we get called with +- @ stack[0] contains the return address from this call +- @ ip contains &GOT[n+3] (pointer to function) +- @ lr points to &GOT[2] +- +- @ save almost everything; lr is already on the stack +- stmdb sp!,{r0-r3,sl,fp} +- +- @ prepare to call fixup() +- @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each +- sub r1, ip, lr +- sub r1, r1, #4 +- add r1, r1, r1 +- +- @ get pointer to linker struct +- ldr r0, [lr, #-4] +- +- @ call fixup routine +- " CALL_ROUTINE(fixup) " +- +- @ save the return +- mov ip, r0 +- +- @ restore the stack +- ldmia sp!,{r0-r3,sl,fp,lr} +- +- @ jump to the newly found address +- mov pc, ip +- +- .size _dl_runtime_resolve, .-_dl_runtime_resolve +- +- .globl _dl_runtime_profile +- .type _dl_runtime_profile, #function +- .align 2 +-_dl_runtime_profile: +- @ save almost everything; lr is already on the stack +- stmdb sp!,{r0-r3,sl,fp} +- +- @ prepare to call fixup() +- @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each +- sub r1, ip, lr +- sub r1, r1, #4 +- add r1, r1, r1 +- +- @ get pointer to linker struct +- ldr r0, [lr, #-4] +- +- @ call profiling fixup routine +- " CALL_ROUTINE(profile_fixup) " +- +- @ save the return +- mov ip, r0 +- +- @ restore the stack +- ldmia sp!,{r0-r3,sl,fp,lr} +- +- @ jump to the newly found address +- mov pc, ip +- +- .size _dl_runtime_resolve, .-_dl_runtime_resolve +- .previous ++ .text\n\ ++ .globl _dl_runtime_resolve\n\ ++ .type _dl_runtime_resolve, #function\n\ ++ .align 2\n\ ++_dl_runtime_resolve:\n\ ++ @ we get called with\n\ ++ @ stack[0] contains the return address from this call\n\ ++ @ ip contains &GOT[n+3] (pointer to function)\n\ ++ @ lr points to &GOT[2]\n\ ++\n\ ++ @ save almost everything; lr is already on the stack\n\ ++ stmdb sp!,{r0-r3,sl,fp}\n\ ++\n\ ++ @ prepare to call fixup()\n\ ++ @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each\n\ ++ sub r1, ip, lr\n\ ++ sub r1, r1, #4\n\ ++ add r1, r1, r1\n\ ++\n\ ++ @ get pointer to linker struct\n\ ++ ldr r0, [lr, #-4]\n\ ++\n\ ++ @ call fixup routine\n\ ++ " CALL_ROUTINE(fixup) "\n\ ++\n\ ++ @ save the return\n\ ++ mov ip, r0\n\ ++\n\ ++ @ restore the stack\n\ ++ ldmia sp!,{r0-r3,sl,fp,lr}\n\ ++\n\ ++ @ jump to the newly found address\n\ ++ mov pc, ip\n\ ++\n\ ++ .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\ ++\n\ ++ .globl _dl_runtime_profile\n\ ++ .type _dl_runtime_profile, #function\n\ ++ .align 2\n\ ++_dl_runtime_profile:\n\ ++ @ save almost everything; lr is already on the stack\n\ ++ stmdb sp!,{r0-r3,sl,fp}\n\ ++\n\ ++ @ prepare to call fixup()\n\ ++ @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each\n\ ++ sub r1, ip, lr\n\ ++ sub r1, r1, #4\n\ ++ add r1, r1, r1\n\ ++\n\ ++ @ get pointer to linker struct\n\ ++ ldr r0, [lr, #-4]\n\ ++\n\ ++ @ call profiling fixup routine\n\ ++ " CALL_ROUTINE(profile_fixup) "\n\ ++\n\ ++ @ save the return\n\ ++ mov ip, r0\n\ ++\n\ ++ @ restore the stack\n\ ++ ldmia sp!,{r0-r3,sl,fp,lr}\n\ ++\n\ ++ @ jump to the newly found address\n\ ++ mov pc, ip\n\ ++\n\ ++ .size _dl_runtime_resolve, .-_dl_runtime_resolve\n\ ++ .previous\n\ + "); + #else // PROF + # define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\ +- .text +- .globl _dl_runtime_resolve +- .globl _dl_runtime_profile +- .type _dl_runtime_resolve, #function +- .type _dl_runtime_profile, #function +- .align 2 +-_dl_runtime_resolve: +-_dl_runtime_profile: +- @ we get called with +- @ stack[0] contains the return address from this call +- @ ip contains &GOT[n+3] (pointer to function) +- @ lr points to &GOT[2] +- +- @ save almost everything; return add is already on the stack +- stmdb sp!,{r0-r3,sl,fp} +- +- @ prepare to call fixup() +- @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each +- sub r1, ip, lr +- sub r1, r1, #4 +- add r1, r1, r1 +- +- @ get pointer to linker struct +- ldr r0, [lr, #-4] +- +- @ call profiling fixup routine +- " CALL_ROUTINE(fixup) " +- +- @ save the return +- mov ip, r0 +- +- @ restore the stack +- ldmia sp!,{r0-r3,sl,fp,lr} +- +- @ jump to the newly found address +- mov pc, ip +- +- .size _dl_runtime_profile, .-_dl_runtime_profile +- .previous ++ .text\n\ ++ .globl _dl_runtime_resolve\n\ ++ .globl _dl_runtime_profile\n\ ++ .type _dl_runtime_resolve, #function\n\ ++ .type _dl_runtime_profile, #function\n\ ++ .align 2\n\ ++_dl_runtime_resolve:\n\ ++_dl_runtime_profile:\n\ ++ @ we get called with\n\ ++ @ stack[0] contains the return address from this call\n\ ++ @ ip contains &GOT[n+3] (pointer to function)\n\ ++ @ lr points to &GOT[2]\n\ ++\n\ ++ @ save almost everything; return add is already on the stack\n\ ++ stmdb sp!,{r0-r3,sl,fp}\n\ ++\n\ ++ @ prepare to call fixup()\n\ ++ @ change &GOT[n+3] into 8*n NOTE: reloc are 8 bytes each\n\ ++ sub r1, ip, lr\n\ ++ sub r1, r1, #4\n\ ++ add r1, r1, r1\n\ ++\n\ ++ @ get pointer to linker struct\n\ ++ ldr r0, [lr, #-4]\n\ ++\n\ ++ @ call profiling fixup routine\n\ ++ " CALL_ROUTINE(fixup) "\n\ ++\n\ ++ @ save the return\n\ ++ mov ip, r0\n\ ++\n\ ++ @ restore the stack\n\ ++ ldmia sp!,{r0-r3,sl,fp,lr}\n\ ++\n\ ++ @ jump to the newly found address\n\ ++ mov pc, ip\n\ ++\n\ ++ .size _dl_runtime_profile, .-_dl_runtime_profile\n\ ++ .previous\n\ + "); + #endif //PROF + +@@ -256,70 +257,70 @@ + its return value is the user program's entry point. */ + + #define RTLD_START asm ("\ +-.text +-.globl _start +-.globl _dl_start_user +-_start: +- @ at start time, all the args are on the stack +- mov r0, sp +- bl _dl_start +- @ returns user entry point in r0 +-_dl_start_user: +- mov r6, r0 +- @ we are PIC code, so get global offset table +- ldr sl, .L_GET_GOT +- add sl, pc, sl +-.L_GOT_GOT: +- @ Store the highest stack address +- ldr r1, .L_STACK_END +- ldr r1, [sl, r1] +- str sp, [r1] +- @ See if we were run as a command with the executable file +- @ name as an extra leading argument. +- ldr r4, .L_SKIP_ARGS +- ldr r4, [sl, r4] +- @ get the original arg count +- ldr r1, [sp] +- @ subtract _dl_skip_args from it +- sub r1, r1, r4 +- @ adjust the stack pointer to skip them +- add sp, sp, r4, lsl #2 +- @ get the argv address +- add r2, sp, #4 +- @ store the new argc in the new stack location +- str r1, [sp] +- @ compute envp +- add r3, r2, r1, lsl #2 +- add r3, r3, #4 +- +- @ now we call _dl_init +- ldr r0, .L_LOADED +- ldr r0, [sl, r0] +- ldr r0, [r0] +- @ call _dl_init +- bl _dl_init(PLT) +- @ clear the startup flag +- ldr r2, .L_STARTUP_FLAG +- ldr r1, [sl, r2] +- mov r0, #0 +- str r0, [r1] +- @ load the finalizer function +- ldr r0, .L_FINI_PROC +- ldr r0, [sl, r0] +- @ jump to the user_s entry point +- mov pc, r6 +-.L_GET_GOT: ++.text\n\ ++.globl _start\n\ ++.globl _dl_start_user\n\ ++_start:\n\ ++ @ at start time, all the args are on the stack\n\ ++ mov r0, sp\n\ ++ bl _dl_start\n\ ++ @ returns user entry point in r0\n\ ++_dl_start_user:\n\ ++ mov r6, r0\n\ ++ @ we are PIC code, so get global offset table\n\ ++ ldr sl, .L_GET_GOT\n\ ++ add sl, pc, sl\n\ ++.L_GOT_GOT:\n\ ++ @ Store the highest stack address\n\ ++ ldr r1, .L_STACK_END\n\ ++ ldr r1, [sl, r1]\n\ ++ str sp, [r1]\n\ ++ @ See if we were run as a command with the executable file\n\ ++ @ name as an extra leading argument.\n\ ++ ldr r4, .L_SKIP_ARGS\n\ ++ ldr r4, [sl, r4]\n\ ++ @ get the original arg count\n\ ++ ldr r1, [sp]\n\ ++ @ subtract _dl_skip_args from it\n\ ++ sub r1, r1, r4\n\ ++ @ adjust the stack pointer to skip them\n\ ++ add sp, sp, r4, lsl #2\n\ ++ @ get the argv address\n\ ++ add r2, sp, #4\n\ ++ @ store the new argc in the new stack location\n\ ++ str r1, [sp]\n\ ++ @ compute envp\n\ ++ add r3, r2, r1, lsl #2\n\ ++ add r3, r3, #4\n\ ++\n\ ++ @ now we call _dl_init\n\ ++ ldr r0, .L_LOADED\n\ ++ ldr r0, [sl, r0]\n\ ++ ldr r0, [r0]\n\ ++ @ call _dl_init\n\ ++ bl _dl_init(PLT)\n\ ++ @ clear the startup flag\n\ ++ ldr r2, .L_STARTUP_FLAG\n\ ++ ldr r1, [sl, r2]\n\ ++ mov r0, #0\n\ ++ str r0, [r1]\n\ ++ @ load the finalizer function\n\ ++ ldr r0, .L_FINI_PROC\n\ ++ ldr r0, [sl, r0]\n\ ++ @ jump to the user_s entry point\n\ ++ mov pc, r6\n\ ++.L_GET_GOT:\n\ + .word _GLOBAL_OFFSET_TABLE_ - .L_GOT_GOT - 4 \n\ + .L_SKIP_ARGS: \n\ + .word _dl_skip_args(GOTOFF) \n\ +-.L_STARTUP_FLAG: +- .word _dl_starting_up(GOT) +-.L_FINI_PROC: +- .word _dl_fini(GOT) +-.L_STACK_END: +- .word __libc_stack_end(GOT) +-.L_LOADED: +- .word _dl_loaded(GOT) ++.L_STARTUP_FLAG:\n\ ++ .word _dl_starting_up(GOT)\n\ ++.L_FINI_PROC:\n\ ++ .word _dl_fini(GOT)\n\ ++.L_STACK_END:\n\ ++ .word __libc_stack_end(GOT)\n\ ++.L_LOADED:\n\ ++ .word _dl_loaded(GOT)\n\ + .previous\n\ + "); + diff --git a/patches/glibc/2.2.5/dl-machine-m68k.patch b/patches/glibc/2.2.5/dl-machine-m68k.patch new file mode 100644 index 00000000..2e9ee04e --- /dev/null +++ b/patches/glibc/2.2.5/dl-machine-m68k.patch @@ -0,0 +1,206 @@ +Retrieved with + wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/m68k/dl-machine.h.diff?r1=1.53&r2=1.55&cvsroot=glibc' + +Fixes error + +In file included from dynamic-link.h:21, + from dl-load.c:32: +../sysdeps/m68k/dl-machine.h:108: error: parse error before '.' token +../sysdeps/m68k/dl-machine.h:109: error: stray '@' in program +../sysdeps/m68k/dl-machine.h:120: error: syntax error at '#' token +../sysdeps/m68k/dl-machine.h:123: error: stray '\' in program +../sysdeps/m68k/dl-machine.h:123: error: missing terminating " character +../sysdeps/m68k/dl-machine.h:148: error: stray '@' in program +../sysdeps/m68k/dl-machine.h:152: error: syntax error at '#' token +../sysdeps/m68k/dl-machine.h:156: error: stray '@' in program +../sysdeps/m68k/dl-machine.h:161: error: stray '@' in program +../sysdeps/m68k/dl-machine.h:163: error: stray '@' in program +../sysdeps/m68k/dl-machine.h:166: error: stray '@' in program +In file included from dynamic-link.h:21, + from dl-load.c:32: +../sysdeps/m68k/dl-machine.h:175:4: invalid preprocessing directive #Call +../sysdeps/m68k/dl-machine.h:179: error: stray '@' in program +../sysdeps/m68k/dl-machine.h:180: error: stray '@' in program +../sysdeps/m68k/dl-machine.h:181: error: syntax error at '#' token +../sysdeps/m68k/dl-machine.h:182: error: syntax error at '#' token +../sysdeps/m68k/dl-machine.h:184: error: stray '@' in program +../sysdeps/m68k/dl-machine.h:187: error: missing terminating ' character +../sysdeps/m68k/dl-machine.h:190: error: missing terminating " character +dl-load.c: In function `_dl_map_object_from_fd': +dl-load.c:1089: warning: use of cast expressions as lvalues is deprecated +dl-load.c:1089: warning: use of cast expressions as lvalues is deprecated +dl-load.c:1109: warning: use of cast expressions as lvalues is deprecated +dl-load.c:1109: warning: use of cast expressions as lvalues is deprecated +make[2]: *** [/home/dank/wk/crosstool-0.28-rc24/build/m68k-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/build-glibc/elf/dl-load.o] Error 1 + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/m68k/dl-machine.h,v +retrieving revision 1.53 +retrieving revision 1.55 +diff -u -r1.53 -r1.55 +--- libc/sysdeps/m68k/dl-machine.h 2001/08/26 22:26:36 1.53 ++++ libc/sysdeps/m68k/dl-machine.h 2002/02/01 10:28:20 1.55 +@@ -1,5 +1,5 @@ + /* Machine-dependent ELF dynamic relocation inline functions. m68k version. +- Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc. ++ Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -85,11 +85,11 @@ + { + got[2] = (Elf32_Addr) &_dl_runtime_profile; + +- if (_dl_name_match_p (_dl_profile, l)) ++ if (_dl_name_match_p (GL(dl_profile), l)) + { + /* This is the object we are looking for. Say that we really + want profiling and the timers are started. */ +- _dl_profile_map = l; ++ GL(dl_profile_map) = l; + } + } + else +@@ -104,22 +104,22 @@ + /* This code is used in dl-runtime.c to call the `fixup' function + and then redirect to the address it returns. */ + #define TRAMPOLINE_TEMPLATE(tramp_name, fixup_name) \ +-"| Trampoline for " #fixup_name " +- .globl " #tramp_name " +- .type " #tramp_name ", @function +-" #tramp_name ": +- | Save %a0 (struct return address) and %a1. +- move.l %a0, -(%sp) +- move.l %a1, -(%sp) +- | Call the real address resolver. +- jbsr " #fixup_name " +- | Restore register %a0 and %a1. +- move.l (%sp)+, %a1 +- move.l (%sp)+, %a0 +- | Pop parameters +- addq.l #8, %sp +- | Call real function. +- jmp (%d0) ++"| Trampoline for " #fixup_name "\n\ ++ .globl " #tramp_name "\n\ ++ .type " #tramp_name ", @function\n\ ++" #tramp_name ":\n\ ++ | Save %a0 (struct return address) and %a1.\n\ ++ move.l %a0, -(%sp)\n\ ++ move.l %a1, -(%sp)\n\ ++ | Call the real address resolver.\n\ ++ jbsr " #fixup_name "\n\ ++ | Restore register %a0 and %a1.\n\ ++ move.l (%sp)+, %a1\n\ ++ move.l (%sp)+, %a0\n\ ++ | Pop parameters\n\ ++ addq.l #8, %sp\n\ ++ | Call real function.\n\ ++ jmp (%d0)\n\ + .size " #tramp_name ", . - " #tramp_name "\n" + #ifndef PROF + #define ELF_MACHINE_RUNTIME_TRAMPOLINE \ +@@ -143,50 +143,50 @@ + its return value is the user program's entry point. */ + + #define RTLD_START asm ("\ +- .text +- .globl _start +- .type _start,@function +-_start: +- move.l %sp, -(%sp) +- jbsr _dl_start +- addq.l #4, %sp +- /* FALLTHRU */ +- +- .globl _dl_start_user +- .type _dl_start_user,@function +-_dl_start_user: +- | Save the user entry point address in %a4. +- move.l %d0, %a4 +- | Point %a5 at the GOT. +- lea _GLOBAL_OFFSET_TABLE_@GOTPC(%pc), %a5 +- | Remember the highest stack address. +- move.l %sp, ([__libc_stack_end@GOT.w, %a5]) +- | See if we were run as a command with the executable file +- | name as an extra leading argument. +- move.l ([_dl_skip_args@GOT.w, %a5]), %d0 +- | Pop the original argument count +- move.l (%sp)+, %d1 +- | Subtract _dl_skip_args from it. +- sub.l %d0, %d1 +- | Adjust the stack pointer to skip _dl_skip_args words. +- lea (%sp, %d0*4), %sp +- | Push back the modified argument count. +- move.l %d1, -(%sp) +- # Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env) +- pea 8(%sp, %d1*4) +- pea 8(%sp) +- move.l %d1, -(%sp) +- move.l ([_dl_loaded@GOT.w, %a5]), -(%sp) +- jbsr _dl_init@PLTPC +- addq.l #8, %sp +- addq.l #8, %sp +- | Pass our finalizer function to the user in %a1. +- move.l _dl_fini@GOT.w(%a5), %a1 +- | Initialize %fp with the stack pointer. +- move.l %sp, %fp +- | Jump to the user's entry point. +- jmp (%a4) +- .size _dl_start_user, . - _dl_start_user ++ .text\n\ ++ .globl _start\n\ ++ .type _start,@function\n\ ++_start:\n\ ++ move.l %sp, -(%sp)\n\ ++ jbsr _dl_start\n\ ++ addq.l #4, %sp\n\ ++ /* FALLTHRU */\n\ ++\n\ ++ .globl _dl_start_user\n\ ++ .type _dl_start_user,@function\n\ ++_dl_start_user:\n\ ++ | Save the user entry point address in %a4.\n\ ++ move.l %d0, %a4\n\ ++ | Point %a5 at the GOT.\n\ ++ lea _GLOBAL_OFFSET_TABLE_@GOTPC(%pc), %a5\n\ ++ | Remember the highest stack address.\n\ ++ move.l %sp, ([__libc_stack_end@GOT.w, %a5])\n\ ++ | See if we were run as a command with the executable file\n\ ++ | name as an extra leading argument.\n\ ++ move.l ([_dl_skip_args@GOT.w, %a5]), %d0\n\ ++ | Pop the original argument count\n\ ++ move.l (%sp)+, %d1\n\ ++ | Subtract _dl_skip_args from it.\n\ ++ sub.l %d0, %d1\n\ ++ | Adjust the stack pointer to skip _dl_skip_args words.\n\ ++ lea (%sp, %d0*4), %sp\n\ ++ | Push back the modified argument count.\n\ ++ move.l %d1, -(%sp)\n\ ++ # Call _dl_init (struct link_map *main_map, int argc, char **argv, char **env)\n\ ++ pea 8(%sp, %d1*4)\n\ ++ pea 8(%sp)\n\ ++ move.l %d1, -(%sp)\n\ ++ move.l ([_rtld_global@GOT.w, %a5]), -(%sp)\n\ ++ jbsr _dl_init@PLTPC\n\ ++ addq.l #8, %sp\n\ ++ addq.l #8, %sp\n\ ++ | Pass our finalizer function to the user in %a1.\n\ ++ move.l _dl_fini@GOT.w(%a5), %a1\n\ ++ | Initialize %fp with the stack pointer.\n\ ++ move.l %sp, %fp\n\ ++ | Jump to the user's entry point.\n\ ++ jmp (%a4)\n\ ++ .size _dl_start_user, . - _dl_start_user\n\ + .previous"); + + /* ELF_RTYPE_CLASS_PLT iff TYPE describes relocation of a PLT entry, so +@@ -251,7 +251,7 @@ + found. */ + break; + if (sym->st_size > refsym->st_size +- || (sym->st_size < refsym->st_size && _dl_verbose)) ++ || (sym->st_size < refsym->st_size && GL(dl_verbose))) + { + extern char **_dl_argv; + const char *strtab; diff --git a/patches/glibc/2.2.5/dl-machine-sh.patch b/patches/glibc/2.2.5/dl-machine-sh.patch new file mode 100644 index 00000000..ac046e4d --- /dev/null +++ b/patches/glibc/2.2.5/dl-machine-sh.patch @@ -0,0 +1,41 @@ +Retrieved with +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/sh/dl-machine.h.diff?r1=1.21&r2=1.22&cvsroot=glibc' + +Fixes error +/tmp/ccFobT8r.s: Assembler messages: +/tmp/ccFobT8r.s:1819: Error: symbol `.L3' is already defined +make[2]: *** [/home/dank/wk/crosstool-0.28-rc24/build/sh4-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/build-glibc/elf/rtld.os] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc24/build/sh4-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/glibc-2.2.5/elf' + +See also http://sources.redhat.com/ml/libc-alpha/2002-07/msg00001.html + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/sh/dl-machine.h,v +retrieving revision 1.21 +retrieving revision 1.22 +diff -u -r1.21 -r1.22 +--- libc/sysdeps/sh/dl-machine.h 2002/04/08 20:59:36 1.21 ++++ libc/sysdeps/sh/dl-machine.h 2002/06/28 17:26:01 1.22 +@@ -53,16 +53,16 @@ + elf_machine_load_address (void) + { + Elf32_Addr addr; +- asm ("mov.l .L1,r0\n\ +- mov.l .L3,r2\n\ ++ asm ("mov.l 1f,r0\n\ ++ mov.l 3f,r2\n\ + add r12,r2\n\ + mov.l @(r0,r12),r0\n\ +- bra .L2\n\ ++ bra 2f\n\ + sub r0,r2\n\ + .align 2\n\ +- .L1: .long _dl_start@GOT\n\ +- .L3: .long _dl_start@GOTOFF\n\ +- .L2: mov r2,%0" ++ 1: .long _dl_start@GOT\n\ ++ 3: .long _dl_start@GOTOFF\n\ ++ 2: mov r2,%0" + : "=r" (addr) : : "r0", "r1", "r2"); + return addr; + } diff --git a/patches/glibc/2.2.5/dl-machine-sparc.patch b/patches/glibc/2.2.5/dl-machine-sparc.patch new file mode 100644 index 00000000..ccdb6d30 --- /dev/null +++ b/patches/glibc/2.2.5/dl-machine-sparc.patch @@ -0,0 +1,230 @@ +--- glibc-2.2.5/sysdeps/sparc/sparc32/dl-machine.h.old Sat Jun 7 18:19:03 2003 ++++ glibc-2.2.5/sysdeps/sparc/sparc32/dl-machine.h Sat Jun 7 18:20:04 2003 +@@ -148,23 +148,23 @@ + and then redirect to the address it returns. */ + #define TRAMPOLINE_TEMPLATE(tramp_name, fixup_name) \ + asm ( "\ +- .text +- .globl " #tramp_name " +- .type " #tramp_name ", @function +- .align 32 +-" #tramp_name ": +- /* Set up the arguments to fixup -- +- %o0 = link_map out of plt0 +- %o1 = offset of reloc entry +- %o2 = return address */ +- ld [%o7 + 8], %o0 +- srl %g1, 10, %o1 +- mov %i7, %o2 +- call " #fixup_name " +- sub %o1, 4*12, %o1 +- jmp %o0 +- restore +- .size " #tramp_name ", . - " #tramp_name " ++ .text\n\ ++ .globl " #tramp_name "\n\ ++ .type " #tramp_name ", @function\n\ ++ .align 32\n\ ++" #tramp_name ":\n\ ++ /* Set up the arguments to fixup --\n\ ++ %o0 = link_map out of plt0\n\ ++ %o1 = offset of reloc entry\n\ ++ %o2 = return address */\n\ ++ ld [%o7 + 8], %o0\n\ ++ srl %g1, 10, %o1\n\ ++ mov %i7, %o2\n\ ++ call " #fixup_name "\n\ ++ sub %o1, 4*12, %o1\n\ ++ jmp %o0\n\ ++ restore\n\ ++ .size " #tramp_name ", . - " #tramp_name "\n\ + .previous") + + #ifndef PROF +@@ -199,96 +199,96 @@ + its return value is the user program's entry point. */ + + #define RTLD_START __asm__ ("\ +- .text +- .globl _start +- .type _start, @function +- .align 32 +-_start: +- /* Allocate space for functions to drop their arguments. */ +- sub %sp, 6*4, %sp +- /* Pass pointer to argument block to _dl_start. */ +- call _dl_start +- add %sp, 22*4, %o0 +- /* FALTHRU */ +- .globl _dl_start_user +- .type _dl_start_user, @function +-_dl_start_user: +- /* Load the PIC register. */ +-1: call 2f +- sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 +-2: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7 +- add %l7, %o7, %l7 +- /* Save the user entry point address in %l0 */ +- mov %o0, %l0 +- /* Store the highest stack address. */ +- sethi %hi(__libc_stack_end), %g2 +- or %g2, %lo(__libc_stack_end), %g2 +- ld [%l7 + %g2], %l1 +- sethi %hi(_dl_skip_args), %g2 +- add %sp, 6*4, %l2 +- or %g2, %lo(_dl_skip_args), %g2 +- st %l2, [%l1] +- /* See if we were run as a command with the executable file name as an +- extra leading argument. If so, adjust the contents of the stack. */ +- ld [%l7+%g2], %i0 +- ld [%i0], %i0 +- tst %i0 +- beq 3f +- ld [%sp+22*4], %i5 /* load argc */ +- /* Find out how far to shift. */ +- sethi %hi(_dl_argv), %l3 +- or %l3, %lo(_dl_argv), %l3 +- ld [%l7+%l3], %l3 +- sub %i5, %i0, %i5 +- ld [%l3], %l4 +- sll %i0, 2, %i2 +- st %i5, [%sp+22*4] +- sub %l4, %i2, %l4 +- add %sp, 23*4, %i1 +- add %i1, %i2, %i2 +- st %l4, [%l3] +- /* Copy down argv */ +-21: ld [%i2], %i3 +- add %i2, 4, %i2 +- tst %i3 +- st %i3, [%i1] +- bne 21b +- add %i1, 4, %i1 +- /* Copy down env */ +-22: ld [%i2], %i3 +- add %i2, 4, %i2 +- tst %i3 +- st %i3, [%i1] +- bne 22b +- add %i1, 4, %i1 +- /* Copy down auxiliary table. */ +-23: ld [%i2], %i3 +- ld [%i2+4], %i4 +- add %i2, 8, %i2 +- tst %i3 +- st %i3, [%i1] +- st %i4, [%i1+4] +- bne 23b +- add %i1, 8, %i1 +- /* %o0 = _dl_loaded, %o1 = argc, %o2 = argv, %o3 = envp. */ +-3: sethi %hi(_dl_loaded), %o0 +- add %sp, 23*4, %o2 +- orcc %o0, %lo(_dl_loaded), %o0 +- sll %i5, 2, %o3 +- ld [%l7+%o0], %o0 +- add %o3, 4, %o3 +- mov %i5, %o1 +- add %o2, %o3, %o3 +- call _dl_init +- ld [%o0], %o0 +- /* Pass our finalizer function to the user in %g1. */ +- sethi %hi(_dl_fini), %g1 +- or %g1, %lo(_dl_fini), %g1 +- ld [%l7+%g1], %g1 +- /* Jump to the user's entry point and deallocate the extra stack we got. */ +- jmp %l0 +- add %sp, 6*4, %sp +- .size _dl_start_user, . - _dl_start_user ++ .text\n\ ++ .globl _start\n\ ++ .type _start, @function\n\ ++ .align 32\n\ ++_start:\n\ ++ /* Allocate space for functions to drop their arguments. */\n\ ++ sub %sp, 6*4, %sp\n\ ++ /* Pass pointer to argument block to _dl_start. */\n\ ++ call _dl_start\n\ ++ add %sp, 22*4, %o0\n\ ++ /* FALTHRU */\n\ ++ .globl _dl_start_user\n\ ++ .type _dl_start_user, @function\n\ ++_dl_start_user:\n\ ++ /* Load the PIC register. */\n\ ++1: call 2f\n\ ++ sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7\n\ ++2: or %l7, %lo(_GLOBAL_OFFSET_TABLE_-(1b-.)), %l7\n\ ++ add %l7, %o7, %l7\n\ ++ /* Save the user entry point address in %l0 */\n\ ++ mov %o0, %l0\n\ ++ /* Store the highest stack address. */\n\ ++ sethi %hi(__libc_stack_end), %g2\n\ ++ or %g2, %lo(__libc_stack_end), %g2\n\ ++ ld [%l7 + %g2], %l1\n\ ++ sethi %hi(_dl_skip_args), %g2\n\ ++ add %sp, 6*4, %l2\n\ ++ or %g2, %lo(_dl_skip_args), %g2\n\ ++ st %l2, [%l1]\n\ ++ /* See if we were run as a command with the executable file name as an\n\ ++ extra leading argument. If so, adjust the contents of the stack. */\n\ ++ ld [%l7+%g2], %i0\n\ ++ ld [%i0], %i0\n\ ++ tst %i0\n\ ++ beq 3f\n\ ++ ld [%sp+22*4], %i5 /* load argc */\n\ ++ /* Find out how far to shift. */\n\ ++ sethi %hi(_dl_argv), %l3\n\ ++ or %l3, %lo(_dl_argv), %l3\n\ ++ ld [%l7+%l3], %l3\n\ ++ sub %i5, %i0, %i5\n\ ++ ld [%l3], %l4\n\ ++ sll %i0, 2, %i2\n\ ++ st %i5, [%sp+22*4]\n\ ++ sub %l4, %i2, %l4\n\ ++ add %sp, 23*4, %i1\n\ ++ add %i1, %i2, %i2\n\ ++ st %l4, [%l3]\n\ ++ /* Copy down argv */\n\ ++21: ld [%i2], %i3\n\ ++ add %i2, 4, %i2\n\ ++ tst %i3\n\ ++ st %i3, [%i1]\n\ ++ bne 21b\n\ ++ add %i1, 4, %i1\n\ ++ /* Copy down env */\n\ ++22: ld [%i2], %i3\n\ ++ add %i2, 4, %i2\n\ ++ tst %i3\n\ ++ st %i3, [%i1]\n\ ++ bne 22b\n\ ++ add %i1, 4, %i1\n\ ++ /* Copy down auxiliary table. */\n\ ++23: ld [%i2], %i3\n\ ++ ld [%i2+4], %i4\n\ ++ add %i2, 8, %i2\n\ ++ tst %i3\n\ ++ st %i3, [%i1]\n\ ++ st %i4, [%i1+4]\n\ ++ bne 23b\n\ ++ add %i1, 8, %i1\n\ ++ /* %o0 = _dl_loaded, %o1 = argc, %o2 = argv, %o3 = envp. */\n\ ++3: sethi %hi(_dl_loaded), %o0\n\ ++ add %sp, 23*4, %o2\n\ ++ orcc %o0, %lo(_dl_loaded), %o0\n\ ++ sll %i5, 2, %o3\n\ ++ ld [%l7+%o0], %o0\n\ ++ add %o3, 4, %o3\n\ ++ mov %i5, %o1\n\ ++ add %o2, %o3, %o3\n\ ++ call _dl_init\n\ ++ ld [%o0], %o0\n\ ++ /* Pass our finalizer function to the user in %g1. */\n\ ++ sethi %hi(_dl_fini), %g1\n\ ++ or %g1, %lo(_dl_fini), %g1\n\ ++ ld [%l7+%g1], %g1\n\ ++ /* Jump to the user's entry point and deallocate the extra stack we got. */\n\ ++ jmp %l0\n\ ++ add %sp, 6*4, %sp\n\ ++ .size _dl_start_user, . - _dl_start_user\n\ + .previous"); + + static inline Elf32_Addr diff --git a/patches/glibc/2.2.5/errlist-1.9.patch b/patches/glibc/2.2.5/errlist-1.9.patch new file mode 100644 index 00000000..3bd7fc6c --- /dev/null +++ b/patches/glibc/2.2.5/errlist-1.9.patch @@ -0,0 +1,25 @@ +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/Attic/errlist.c,v +retrieving revision 1.8 +retrieving revision 1.9 +diff -u -r1.8 -r1.9 +--- libc/sysdeps/unix/sysv/linux/errlist.c 2001/07/06 04:56:12 1.8 ++++ libc/sysdeps/unix/sysv/linux/errlist.c 2002/05/20 06:56:53 1.9 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1998, 2000 Free Software Foundation, Inc. ++/* Copyright (C) 1998, 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 +@@ -38,10 +38,9 @@ + const int __old_sys_nerr = OLD_ERRLIST_SIZE; + + strong_alias (__old_sys_nerr, _old_sys_nerr); +-weak_alias (__old_sys_nerr, _old_sys_nerr) + compat_symbol (libc, __old_sys_nerr, _sys_nerr, GLIBC_2_0); + compat_symbol (libc, _old_sys_nerr, sys_nerr, GLIBC_2_0); +-weak_alias (__old_sys_errlist, _old_sys_errlist); ++strong_alias (__old_sys_errlist, _old_sys_errlist); + compat_symbol (libc, __old_sys_errlist, _sys_errlist, GLIBC_2_0); + compat_symbol (libc, _old_sys_errlist, sys_errlist, GLIBC_2_0); + #endif diff --git a/patches/glibc/2.2.5/errlist-arm.patch b/patches/glibc/2.2.5/errlist-arm.patch new file mode 100644 index 00000000..ac4eb5be --- /dev/null +++ b/patches/glibc/2.2.5/errlist-arm.patch @@ -0,0 +1,48 @@ +Subject: patch for arm +From: Philip Blundell <Philip dot Blundell at pobox dot com> +To: libc-hacker at sources dot redhat dot com +Content-Type: text/plain +Content-Transfer-Encoding: 7bit +Date: 22 Jul 2002 20:12:06 +0100 +Message-Id: <1027365126.725.10.camel@kc> +Mime-Version: 1.0 + +The mainline seems to need this patch in order to compile. + +p. + +2002-07-22 Philip Blundell <philb@gnu.org> + + * sysdeps/unix/sysv/linux/arm/errlist.c: Remove extra weak alias + definiton of _old_sys_nerr. Define _old_sys_errlist as strong + alias. + +Index: sysdeps/unix/sysv/linux/arm/errlist.c +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/arm/errlist.c,v +retrieving revision 1.4 +diff -u -p -r1.4 errlist.c +--- glibc/sysdeps/unix/sysv/linux/arm/errlist.c 6 Jul 2001 04:56:13 -0000 1.4 ++++ glibc/sysdeps/unix/sysv/linux/arm/errlist.c 22 Jul 2002 19:10:57 -0000 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1998, 2000 Free Software Foundation, Inc. ++/* Copyright (C) 1998, 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 +@@ -38,10 +38,9 @@ extern const char *const *__old_sys_errl + const int __old_sys_nerr = OLD_ERRLIST_SIZE; + + strong_alias (__old_sys_nerr, _old_sys_nerr); +-weak_alias (__old_sys_nerr, _old_sys_nerr) + compat_symbol (libc, __old_sys_nerr, _sys_nerr, GLIBC_2_0); + compat_symbol (libc, _old_sys_nerr, sys_nerr, GLIBC_2_0); +-weak_alias (__old_sys_errlist, _old_sys_errlist); ++strong_alias (__old_sys_errlist, _old_sys_errlist); + compat_symbol (libc, __old_sys_errlist, _sys_errlist, GLIBC_2_0); + compat_symbol (libc, _old_sys_errlist, sys_errlist, GLIBC_2_0); + #endif + + + + diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-fixup.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-fixup.patch new file mode 100644 index 00000000..2ee71745 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-fixup.patch @@ -0,0 +1,68 @@ +Fixes +dl-runtime.c:56: error: conflicting types for 'fixup' +../sysdeps/i386/dl-machine.h:158: error: previous declaration of 'fixup' was here +when building with gcc-3.4.0 + +First hunk: +Define ARCH_FIXUP_ATTRIBUTE and use it in the fixup function declarations. +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/dl-machine.h.diff?r1=1.124&r2=1.125&cvsroot=glibc +[rediffed against glibc-2.2.5] + +Second hunk: +If ARCH_FIXUP_ATTRIBUTE is not defined, provide dummy definition. +Use macro in fixup function definitions. +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/elf/dl-runtime.c.diff?r1=1.64&r2=1.65&cvsroot=glibc +[rediffed against glibc-2.3.2] + +=================================================================== +--- glibc-2.2.5/sysdeps/i386/dl-machine.h.old Sun Apr 11 11:53:23 2004 ++++ glibc-2.2.5/sysdeps/i386/dl-machine.h Sun Apr 11 11:55:38 2004 +@@ -63,11 +63,12 @@ + destroys the passed register information. */ + /* GKM FIXME: Fix trampoline to pass bounds so we can do + without the `__unbounded' qualifier. */ ++#define ARCH_FIXUP_ATTRIBUTE __attribute__ ((regparm (3), unused)) + static ElfW(Addr) fixup (struct link_map *__unbounded l, ElfW(Word) reloc_offset) +- __attribute__ ((regparm (2), unused)); ++ ARCH_FIXUP_ATTRIBUTE; + static ElfW(Addr) profile_fixup (struct link_map *l, ElfW(Word) reloc_offset, + ElfW(Addr) retaddr) +- __attribute__ ((regparm (3), unused)); ++ ARCH_FIXUP_ATTRIBUTE; + #endif + + /* Set up the loaded object described by L so its unrelocated PLT +=================================================================== +--- /home/dank/downloads/glibc-2.3.2/elf/dl-runtime.c Fri Feb 7 11:41:12 2003 ++++ glibc-2.3.2/elf/dl-runtime.c Thu Apr 8 22:24:26 2004 +@@ -36,6 +36,12 @@ + # define VERSYMIDX(sym) (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (sym)) + #endif + ++/* The fixup functions might have need special attributes. If none ++ are provided define the macro as empty. */ ++#ifndef ARCH_FIXUP_ATTRIBUTE ++# define ARCH_FIXUP_ATTRIBUTE ++#endif ++ + + /* This function is called through a special trampoline from the PLT the + first time each PLT entry is called. We must perform the relocation +@@ -45,7 +51,7 @@ + function. */ + + #ifndef ELF_MACHINE_NO_PLT +-static ElfW(Addr) __attribute_used__ ++static ElfW(Addr) __attribute_used__ ARCH_FIXUP_ATTRIBUTE + fixup ( + # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS + ELF_MACHINE_RUNTIME_FIXUP_ARGS, +@@ -132,7 +138,7 @@ + + #if !defined PROF && !defined ELF_MACHINE_NO_PLT && !__BOUNDED_POINTERS__ + +-static ElfW(Addr) __attribute_used__ ++static ElfW(Addr) __attribute_used__ ARCH_FIXUP_ATTRIBUTE + profile_fixup ( + #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS + ELF_MACHINE_RUNTIME_FIXUP_ARGS, diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-grp.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-grp.patch new file mode 100644 index 00000000..5d609f9a --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-grp.patch @@ -0,0 +1,63 @@ +Fixes +initgroups.c: In function `internal_getgrouplist': +initgroups.c:179: error: parse error before "__FUNCTION__" + +CVSROOT: /cvs/glibc +Module name: libc +Changes by: roland@sources.redhat.com 2001-12-16 21:52:12 + +Modified files: + nss : nsswitch.c + grp : initgroups.c + +Log message: + 2001-12-16 Roland McGrath <roland@frob.com> + + * nss/nsswitch.c (__nss_next): Don't use __FUNCTION__ as literal. + * grp/initgroups.c (internal_getgrouplist): Likewise. + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/grp/initgroups.c.diff?r1=1.26&r2=1.27&cvsroot=glibc +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/nss/nsswitch.c.diff?r1=1.52&r2=1.53&cvsroot=glibc + +=================================================================== +RCS file: /cvs/glibc/libc/grp/initgroups.c,v +retrieving revision 1.26 +retrieving revision 1.27 +diff -u -r1.26 -r1.27 +--- libc/grp/initgroups.c 2001/07/06 04:54:46 1.26 ++++ libc/grp/initgroups.c 2001/12/17 05:52:11 1.27 +@@ -176,7 +176,7 @@ + + /* This is really only for debugging. */ + if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN) +- __libc_fatal ("illegal status in " __FUNCTION__); ++ __libc_fatal ("illegal status in internal_getgrouplist"); + + if (status != NSS_STATUS_SUCCESS + && nss_next_action (nip, status) == NSS_ACTION_RETURN) +@@ -214,7 +214,7 @@ + } + else + *ngroups = result; +- ++ + memcpy (groups, newgroups, *ngroups * sizeof (gid_t)); + + free (newgroups); + +=================================================================== +RCS file: /cvs/glibc/libc/nss/nsswitch.c,v +retrieving revision 1.52 +retrieving revision 1.53 +diff -u -r1.52 -r1.53 +--- libc/nss/nsswitch.c 2001/07/17 08:21:36 1.52 ++++ libc/nss/nsswitch.c 2001/12/17 05:52:11 1.53 +@@ -178,7 +178,7 @@ + { + /* This is really only for debugging. */ + if (NSS_STATUS_TRYAGAIN > status || status > NSS_STATUS_RETURN) +- __libc_fatal ("illegal status in " __FUNCTION__); ++ __libc_fatal ("illegal status in __nss_next"); + + if (nss_next_action (*ni, status) == NSS_ACTION_RETURN) + return 1; diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-weakextern.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-weakextern.patch new file mode 100644 index 00000000..31b7b67c --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-3.4-weakextern.patch @@ -0,0 +1,48 @@ +Suggested by Jake Page <jake at cs dot stanford dot edu> +in http://sources.redhat.com/ml/crossgcc/2004-07/msg00169.html +but the libc-symbols.h fragment has been reworked to fix typos +and to still work on gcc-2.95.3, which lacks _Pragma. + +His comment was: + Fixes gcc-3.4 optimizing out comparisons to weak external symbols in code + like: + if (__pthread_mutex_init != NULL) + __pthread_mutex_init(...); + that causes segfaults during libc init when not linked to libpthread + +diff -uNr glibc-2.2.5-orig/resolv/res_libc.c glibc-2.2.5/resolv/res_libc.c +--- glibc-2.2.5-orig/resolv/res_libc.c 2001-02-12 12:23:34.000000000 -0800 ++++ glibc-2.2.5/resolv/res_libc.c 2004-07-27 22:56:32.000000000 -0700 +@@ -84,7 +84,8 @@ + + #if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_2) + # undef res_init +-strong_alias (__res_init, __res_init_weak); ++extern int __res_init_weak (void); + weak_extern (__res_init_weak); ++strong_alias (__res_init, __res_init_weak); + compat_symbol (libc, __res_init_weak, res_init, GLIBC_2_0); + #endif +--- glibc-2.2.5/include/libc-symbols.h.old Fri Aug 13 04:20:55 2004 ++++ glibc-2.2.5/include/libc-symbols.h Fri Aug 13 04:37:06 2004 +@@ -108,10 +108,16 @@ + + /* Declare SYMBOL as weak undefined symbol (resolved to 0 if not defined). */ + # define weak_extern(symbol) _weak_extern (symbol) +-# ifdef HAVE_ASM_WEAKEXT_DIRECTIVE +-# define _weak_extern(symbol) asm (".weakext " __SYMBOL_PREFIX #symbol); +-# else +-# define _weak_extern(symbol) asm (".weak " __SYMBOL_PREFIX #symbol); ++# if __GNUC__ >= 3 ++ /* see http://sources.redhat.com/ml/libc-alpha/2003-01/msg00043.html */ ++# define __weak_extern_1(expr) _Pragma(#expr) ++# define _weak_extern(symbol) __weak_extern_1(weak symbol) ++# else /* __GNUC__ == 2 */ ++# ifdef HAVE_ASM_WEAKEXT_DIRECTIVE ++# define _weak_extern(symbol) asm (".weakext " __SYMBOL_PREFIX #symbol); ++# else ++# define _weak_extern(symbol) asm (".weak " __SYMBOL_PREFIX #symbol); ++# endif + # endif + + # else diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-configure.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-configure.patch new file mode 100644 index 00000000..effd636a --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-configure.patch @@ -0,0 +1,21 @@ +Fixes +checking version of powerpc-405-linux-gnu-gcc ... 4.0.0, bad +checking for gnumake... no +checking for gmake... no +checking for make... make +checking version of make... 3.80, ok +configure: error: +*** These critical programs are missing or too old:gcc + + +--- glibc-2.2.5/configure.old 2005-03-10 00:23:46.374213600 -0800 ++++ glibc-2.2.5/configure 2005-03-10 00:25:13.313996744 -0800 +@@ -1476,7 +1476,7 @@ + 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;; +- *gcc-2.9[5-9].*|*2.8.[1-9]*|*2.9|*2.9.[0-9]*|2.9[5-9]*|3.[0-9]*|cygnus-2.9[1-9]*|gcc-2.9[5-9]|gcc-2.1[0-9][0-9]|sgicc-*) ++ *gcc-2.9[5-9].*|*2.8.[1-9]*|*2.9|*2.9.[0-9]*|2.9[5-9]*|3.[0-9]*|4.0*|cygnus-2.9[1-9]*|gcc-2.9[5-9]|gcc-2.1[0-9][0-9]|sgicc-*) + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-elf-2.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-elf-2.patch new file mode 100644 index 00000000..0428c876 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-elf-2.patch @@ -0,0 +1,43 @@ +Fixes +dynamic-link.h:38: error: invalid storage class for function 'elf_get_dynamic_info' +kinda like http://sourceware.org/cgi-bin/cvsweb.cgi/libc/elf/dynamic-link.h.diff?r1=1.50&r2=1.51&cvsroot=glibc does +and fixes +In file included from dynamic-link.h:218, + from dl-reloc.c:153: +do-rel.h:46: error: invalid storage class for function 'elf_dynamic_do_rel' + +--- /home/dank/downloads/glibc-2.2.5/elf/dynamic-link.h 2001-07-05 21:54:46.000000000 -0700 ++++ glibc-2.2.5/elf/dynamic-link.h 2005-03-11 14:18:34.542858064 -0800 +@@ -33,7 +33,16 @@ + + /* Read the dynamic section at DYN and fill in INFO with indices DT_*. */ + ++#if __GNUC__ >= 4 ++#ifndef RESOLVE_MAP ++static ++#else ++auto ++#endif ++inline void __attribute__ ((unused, always_inline)) ++#else + static inline void __attribute__ ((unused)) ++#endif + elf_get_dynamic_info (struct link_map *l) + { + ElfW(Dyn) *dyn = l->l_ld; + +--- /home/dank/downloads/glibc-2.2.5/elf/do-rel.h 2001-08-24 11:45:23.000000000 -0700 ++++ glibc-2.2.5/elf/do-rel.h 2005-03-11 14:26:43.538519424 -0800 +@@ -39,7 +39,12 @@ + relocations; they should be set up to call _dl_runtime_resolve, rather + than fully resolved now. */ + ++#if __GNUC__ >= 4 ++auto inline void ++__attribute ((always_inline)) ++#else + static inline void ++#endif + elf_dynamic_do_rel (struct link_map *map, + ElfW(Addr) reladdr, ElfW(Addr) relsize, + int lazy) diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-elf.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-elf.patch new file mode 100644 index 00000000..2a8c3a95 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-elf.patch @@ -0,0 +1,39 @@ +Fixes + +dl-load.c: In function '_dl_map_object_from_fd': +dl-load.c:1089: error: invalid lvalue in assignment +dl-load.c:1109: error: invalid lvalue in assignment +make[2]: *** [/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/build-glibc/elf/dl-load.o] Error 1 + +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/elf/dl-load.c.diff?r1=1.235&r2=1.236&cvsroot=glibc +rediffed against glibc-2.2.5 + +Revision 1.236, Sat Feb 21 18:25:41 2004 UTC by aj +Branch: MAIN +Changes since 1.235: +2 -2 lines +Diff to previous 1.235 (colored) + +(_dl_map_object_from_fd): Fix casts used as lvalue. + + +diff -ur glibc-2.2.5/elf/dl-load.c glibc-2.2.5-patched/elf/dl-load.c +--- glibc-2.2.5/elf/dl-load.c 2001-11-10 14:43:10.000000000 -0800 ++++ glibc-2.2.5-patched/elf/dl-load.c 2005-03-11 13:48:18.211982328 -0800 +@@ -1086,7 +1086,7 @@ + } + else + /* Adjust the PT_PHDR value by the runtime load address. */ +- (ElfW(Addr)) l->l_phdr += l->l_addr; ++ l->l_phdr = (ElfW(Phdr) *) ((ElfW(Addr)) l->l_phdr + l->l_addr); + } + + /* We are done mapping in the file. We no longer need the descriptor. */ +@@ -1106,7 +1106,7 @@ + } + } + else +- (ElfW(Addr)) l->l_ld += l->l_addr; ++ l->l_ld = (ElfW(Dyn) *) ((ElfW(Addr)) l->l_ld + l->l_addr); + + l->l_entry += l->l_addr; + diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-gconv.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-gconv.patch new file mode 100644 index 00000000..54c349ef --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-gconv.patch @@ -0,0 +1,226 @@ +Fixes +gconv_open.c: In function `__gconv_open': +gconv_open.c:186: error: invalid lvalue in assignment +when building glibc-2.2.5 with gcc-4.0. +Same as ../glibc-2.3.2/glibc-2.3.2-allow-gcc-3.5-gconv.patch +but rediffed against glibc-2.2.5. + +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/iconv/gconv_simple.c.diff?r1=1.59&r2=1.63&cvsroot=glibc' + * (internal_ucs4_loop): Fix typo in last change. + + * (internal_ucs4le_loop): Remove cast used as lvalue. + + * Fix last commit. + + * iconv/gconv_simple.c (ucs4le_internal_loop): Remove cast used as lvalue. + (internal_ucs4le_loop_single): Likewise. + (ucs4_internal_loop): Likewise. + (BODY): Likewise. + (internal_ucs4_loop_single): Likewise. + +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/iconv/gconv_open.c.diff?r1=1.32&r2=1.33&cvsroot=glibc' + * iconv/gconv_simple.c (ucs4le_internal_loop): Remove cast used as lvalue. + (internal_ucs4le_loop_single): Likewise. + (ucs4_internal_loop): Likewise. + (BODY): Likewise. + (internal_ucs4_loop_single): Likewise. + + +=================================================================== +RCS file: /cvs/glibc/libc/iconv/gconv_open.c,v +retrieving revision 1.32 +retrieving revision 1.33 +diff -u -r1.32 -r1.33 +--- libc/iconv/gconv_open.c 2001/11/29 04:51:58 1.32 ++++ libc/iconv/gconv_open.c 2004/02/07 15:56:32 1.33 +@@ -1,5 +1,5 @@ + /* Find matching transformation algorithms and initialize steps. +- Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + +@@ -182,8 +182,13 @@ + || __builtin_expect (__gconv_translit_find (runp), 0) == 0) + lastp = runp; + else +- /* This means we haven't found the module. Remove it. */ +- (lastp == NULL ? trans : lastp->next) = runp->next; ++ { ++ /* This means we haven't found the module. Remove it. */ ++ if (lastp == NULL) ++ trans = runp->next; ++ else ++ lastp->next = runp->next; ++ } + } + + /* Allocate room for handle. */ +=================================================================== +--- glibc-2.2.5/iconv/gconv_simple.c.old 2001-08-03 15:06:46.000000000 -0700 ++++ glibc-2.2.5/iconv/gconv_simple.c 2005-03-10 00:49:45.558181608 -0800 +@@ -1,5 +1,5 @@ + /* Simple transformations functions. +- Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + +@@ -73,12 +73,13 @@ + #if __BYTE_ORDER == __LITTLE_ENDIAN + /* Sigh, we have to do some real work. */ + size_t cnt; ++ uint32_t *outptr32 = (uint32_t *) outptr; + + for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4) +- *((uint32_t *) outptr)++ = bswap_32 (*(const uint32_t *) inptr); ++ *outptr32++ = bswap_32 (*(const uint32_t *) inptr); + + *inptrp = inptr; +- *outptrp = outptr; ++ *outptrp = (unsigned char *) outptr32; + #elif __BYTE_ORDER == __BIG_ENDIAN + /* Simply copy the data. */ + *inptrp = inptr + n_convert * 4; +@@ -176,13 +177,16 @@ + (*outptrp)[2] = state->__value.__wchb[1]; + (*outptrp)[3] = state->__value.__wchb[0]; + +- *outptrp += 4; + #elif __BYTE_ORDER == __BIG_ENDIAN + /* XXX unaligned */ +- *(*((uint32_t **) outptrp)++) = state->__value.__wch; ++ (*outptrp)[0] = state->__value.__wchb[0]; ++ (*outptrp)[1] = state->__value.__wchb[1]; ++ (*outptrp)[2] = state->__value.__wchb[2]; ++ (*outptrp)[3] = state->__value.__wchb[3]; + #else + # error "This endianess is not supported." + #endif ++ *outptrp += 4; + + /* Clear the state buffer. */ + state->__count &= ~7; +@@ -251,7 +255,8 @@ + return __GCONV_ILLEGAL_INPUT; + } + +- *((uint32_t *) outptr)++ = inval; ++ *((uint32_t *) outptr) = inval; ++ outptr += sizeof (uint32_t); + } + + *inptrp = inptr; +@@ -427,9 +432,11 @@ + #if __BYTE_ORDER == __BIG_ENDIAN + /* Sigh, we have to do some real work. */ + size_t cnt; ++ uint32_t *outptr32 = (uint32_t *) outptr; + + for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4) +- *((uint32_t *) outptr)++ = bswap_32 (*(const uint32_t *) inptr); ++ *outptr32++ = bswap_32 (*(const uint32_t *) inptr); ++ outptr = (unsigned char *) outptr32; + + *inptrp = inptr; + *outptrp = outptr; +@@ -530,12 +537,17 @@ + (*outptrp)[2] = state->__value.__wchb[1]; + (*outptrp)[3] = state->__value.__wchb[0]; + +- *outptrp += 4; + #else + /* XXX unaligned */ +- *(*((uint32_t **) outptrp)++) = state->__value.__wch; ++ (*outptrp)[0] = state->__value.__wchb[0]; ++ (*outptrp)[1] = state->__value.__wchb[1]; ++ (*outptrp)[2] = state->__value.__wchb[2]; ++ (*outptrp)[3] = state->__value.__wchb[3]; ++ + #endif + ++ *outptrp += 4; ++ + /* Clear the state buffer. */ + state->__count &= ~7; + +@@ -600,7 +612,8 @@ + return __GCONV_ILLEGAL_INPUT; + } + +- *((uint32_t *) outptr)++ = inval; ++ *((uint32_t *) outptr) = inval; ++ outptr += sizeof (uint32_t); + } + + *inptrp = inptr; +@@ -782,7 +795,8 @@ + } \ + else \ + /* It's an one byte sequence. */ \ +- *((uint32_t *) outptr)++ = *inptr++; \ ++ *((uint32_t *) outptr) = *inptr++; \ ++ outptr += sizeof (uint32_t); \ + } + #define LOOP_NEED_FLAGS + #include <iconv/loop.c> +@@ -812,7 +826,8 @@ + } \ + else \ + /* It's an one byte sequence. */ \ +- *outptr++ = *((const uint32_t *) inptr)++; \ ++ *outptr++ = *((const uint32_t *) inptr); \ ++ inptr += sizeof (uint32_t); \ + } + #define LOOP_NEED_FLAGS + #include <iconv/loop.c> +@@ -1031,7 +1046,8 @@ + } \ + \ + /* Now adjust the pointers and store the result. */ \ +- *((uint32_t *) outptr)++ = ch; \ ++ *((uint32_t *) outptr) = ch; \ ++ outptr += sizeof (uint32_t); \ + } + #define LOOP_NEED_FLAGS + +@@ -1174,7 +1190,8 @@ + continue; \ + } \ + \ +- *((uint32_t *) outptr)++ = u1; \ ++ *((uint32_t *) outptr) = u1; \ ++ outptr += sizeof (uint32_t); \ + inptr += 2; \ + } + #define LOOP_NEED_FLAGS +@@ -1224,7 +1241,8 @@ + } \ + else \ + { \ +- *((uint16_t *) outptr)++ = val; \ ++ *((uint16_t *) outptr) = val; \ ++ outptr += sizeof (uint16_t); \ + inptr += 4; \ + } \ + } +@@ -1265,7 +1283,8 @@ + continue; \ + } \ + \ +- *((uint32_t *) outptr)++ = u1; \ ++ *((uint32_t *) outptr) = u1; \ ++ outptr += sizeof (uint32_t); \ + inptr += 2; \ + } + #define LOOP_NEED_FLAGS +@@ -1314,7 +1333,8 @@ + } \ + else \ + { \ +- *((uint16_t *) outptr)++ = bswap_16 (val); \ ++ *((uint16_t *) outptr) = bswap_16 (val); \ ++ outptr += sizeof (uint16_t); \ + inptr += 4; \ + } \ + } diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-i386.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-i386.patch new file mode 100644 index 00000000..f13a8921 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-i386.patch @@ -0,0 +1,49 @@ +Fixes +../sysdeps/i386/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/i386/dl-machine.h:306: error: invalid storage class for function 'elf_machine_rel' +../sysdeps/i386/dl-machine.h:385: error: invalid storage class for function 'elf_machine_rel_relative' +../sysdeps/i386/dl-machine.h:393: error: invalid storage class for function 'elf_machine_lazy_rel' + +when building glibc-2.2.5 with gcc-4.0. + +--- /home/dank/downloads/glibc-2.2.5/sysdeps/i386/dl-machine.h 2001-08-30 16:09:10.000000000 -0700 ++++ glibc-2.2.5/sysdeps/i386/dl-machine.h 2005-03-11 14:00:22.601858328 -0800 +@@ -298,7 +299,12 @@ + /* Perform the relocation specified by RELOC and SYM (which is fully resolved). + MAP is the object containing the reloc. */ + ++#if __GNUC__ >= 4 ++auto inline void ++__attribute ((always_inline)) ++#else + static inline void ++#endif + elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, + const Elf32_Sym *sym, const struct r_found_version *version, + Elf32_Addr *const reloc_addr) +@@ -378,7 +384,12 @@ + } + } + ++#if __GNUC__ >= 4 ++auto inline void ++__attribute ((always_inline)) ++#else + static inline void ++#endif + elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc, + Elf32_Addr *const reloc_addr) + { +@@ -386,7 +397,12 @@ + *reloc_addr += l_addr; + } + ++#if __GNUC__ >= 4 ++auto inline void ++__attribute ((always_inline)) ++#else + static inline void ++#endif + elf_machine_lazy_rel (struct link_map *map, + Elf32_Addr l_addr, const Elf32_Rel *reloc) + { diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-iconv.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-iconv.patch new file mode 100644 index 00000000..f7cfa584 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-iconv.patch @@ -0,0 +1,20 @@ +Fixes +iconvconfig.c: In function 'write_output': +iconvconfig.c:973: error: invalid storage class for function 'name_insert' + +--- glibc-2.2.5/iconv/iconvconfig.c.old 2002-01-20 19:20:53.000000000 -0800 ++++ glibc-2.2.5/iconv/iconvconfig.c 2005-03-11 14:30:27.000000000 -0800 +@@ -969,7 +969,12 @@ + char tmpfname[sizeof (GCONV_MODULES_CACHE) + strlen (".XXXXXX")]; + + /* Function to insert the names. */ +- static void name_insert (const void *nodep, VISIT value, int level) ++#if __GNUC__ >= 4 ++ auto ++#else ++ static ++#endif ++ void name_insert (const void *nodep, VISIT value, int level) + { + struct name *name; + unsigned int idx; diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-iconvdata.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-iconvdata.patch new file mode 100644 index 00000000..50190318 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-iconvdata.patch @@ -0,0 +1,114 @@ +Fixes + +In file included from jis0208.c:23: +jis0208.h:32: error: array type has incomplete element type +when building with gcc-4.0 + +In file included from cp1258.c:869: +../iconv/skeleton.c: In function 'gconv': +../iconv/skeleton.c:323: error: invalid lvalue in increment + +In file included from cp1255.c:550: +../iconv/skeleton.c: In function 'gconv': +../iconv/skeleton.c:323: error: invalid lvalue in increment + +In file included from gb18030.c:22114: +../iconv/loop.c: In function 'from_gb18030': +../iconv/loop.c:282: error: invalid lvalue in increment +../iconv/loop.c: In function 'from_gb18030_single': +../iconv/loop.c:384: error: invalid lvalue in increment + +--- /home/dank/downloads/glibc-2.2.5/iconvdata/iso8859-1.c 2001-08-03 15:06:50.000000000 -0700 ++++ glibc-2.2.5/iconvdata/iso8859-1.c 2005-03-11 15:09:15.233602808 -0800 +@@ -35,7 +35,8 @@ + #define MIN_NEEDED_OUTPUT MIN_NEEDED_TO + #define LOOPFCT FROM_LOOP + #define BODY \ +- *((uint32_t *) outptr)++ = *inptr++; ++ *((uint32_t *) outptr) = *inptr++; \ ++ outptr += sizeof (uint32_t); + #include <iconv/loop.c> + + +--- /home/dank/downloads/glibc-2.2.5/iconvdata/jis0208.h 2001-07-05 21:54:52.000000000 -0700 ++++ glibc-2.2.5/iconvdata/jis0208.h 2005-03-11 15:27:23.295192304 -0800 +@@ -24,15 +24,6 @@ + #include <gconv.h> + #include <stdint.h> + +-/* Conversion table. */ +-extern const uint16_t __jis0208_to_ucs[]; +- +-extern const char __jisx0208_from_ucs4_lat1[256][2]; +-extern const char __jisx0208_from_ucs4_greek[0xc1][2]; +-extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[]; +-extern const char __jisx0208_from_ucs_tab[][2]; +- +- + /* Struct for table with indeces in UCS mapping table. */ + struct jisx0208_ucs_idx + { +@@ -42,6 +33,15 @@ + }; + + ++/* Conversion table. */ ++extern const uint16_t __jis0208_to_ucs[]; ++ ++extern const char __jisx0208_from_ucs4_lat1[256][2]; ++extern const char __jisx0208_from_ucs4_greek[0xc1][2]; ++extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[]; ++extern const char __jisx0208_from_ucs_tab[][2]; ++ ++ + static inline uint32_t + jisx0208_to_ucs4 (const unsigned char **s, size_t avail, unsigned char offset) + { +--- /home/dank/downloads/glibc-2.2.5/iconvdata/cp1258.c 2001-07-05 21:54:49.000000000 -0700 ++++ glibc-2.2.5/iconvdata/cp1258.c 2005-03-11 15:41:44.953200376 -0800 +@@ -66,7 +66,8 @@ + if (__builtin_expect (outbuf + 4 <= outend, 1)) \ + { \ + /* Write out the last character. */ \ +- *((uint32_t *) outbuf)++ = data->__statep->__count >> 3; \ ++ *((uint32_t *) outbuf) = data->__statep->__count >> 3; \ ++ outbuf += sizeof (uint32_t); \ + data->__statep->__count = 0; \ + } \ + else \ +--- /home/dank/downloads/glibc-2.2.5/iconvdata/cp1255.c 2001-07-05 21:54:49.000000000 -0700 ++++ glibc-2.2.5/iconvdata/cp1255.c 2005-03-11 15:47:40.689120296 -0800 +@@ -65,7 +65,8 @@ + if (__builtin_expect (outbuf + 4 <= outend, 1)) \ + { \ + /* Write out the last character. */ \ +- *((uint32_t *) outbuf)++ = data->__statep->__count >> 3; \ ++ *((uint32_t *) outbuf) = data->__statep->__count >> 3; \ ++ outbuf += sizeof (uint32_t); \ + data->__statep->__count = 0; \ + } \ + else \ +--- /home/dank/downloads/glibc-2.2.5/iconvdata/gb18030.c 2001-08-03 15:06:47.000000000 -0700 ++++ glibc-2.2.5/iconvdata/gb18030.c 2005-03-11 15:54:59.060477720 -0800 +@@ -22108,7 +22108,8 @@ + } \ + } \ + \ +- *((uint32_t *) outptr)++ = ch; \ ++ *((uint32_t *) outptr) = ch; \ ++ outptr += sizeof (uint32_t); \ + } + #define LOOP_NEED_FLAGS + #include <iconv/loop.c> +--- /home/dank/downloads/glibc-2.2.5/iconvdata/iso-2022-cn-ext.c 2001-07-05 21:54:51.000000000 -0700 ++++ glibc-2.2.5/iconvdata/iso-2022-cn-ext.c 2005-03-11 15:55:42.002949472 -0800 +@@ -411,7 +411,8 @@ + } \ + } \ + \ +- *((uint32_t *) outptr)++ = ch; \ ++ *((uint32_t *) outptr) = ch; \ ++ outptr += sizeof (uint32_t); \ + } + #define EXTRA_LOOP_DECLS , int *setp + #define INIT_PARAMS int set = (*setp >> 3) & CURRENT_MASK; \ diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-locale.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-locale.patch new file mode 100644 index 00000000..fa4b5b7f --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-locale.patch @@ -0,0 +1,49 @@ +Fixes + +In file included from strcoll.c:101: +../locale/weight.h: In function 'strcoll': +../locale/weight.h:23: error: invalid storage class for function 'findidx' +make[2]: *** [/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/build-glibc/string/strcoll.o] Error 1 +make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/glibc-2.2.5/string' +make[1]: *** [string/subdir_lib] Error 2 +make[1]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/glibc-2.2.5' +make: *** [all] Error 2 + +Discussed here +http://sources.redhat.com/ml/libc-hacker/2004-09/msg00015.html +the fix checked in to cvs seems to be +http://sources.redhat.com/ml/glibc-cvs/2004-q3/msg01071.html +but that fix doesn't support older gcc's, so I can't use it directly. + +Here's a fix the does work with older versions of gcc: + +--- glibc-2.2.5/locale/weight.h.old 2001-07-05 21:55:33.000000000 -0700 ++++ glibc-2.2.5/locale/weight.h 2005-03-10 16:07:46.669579888 -0800 +@@ -18,7 +18,12 @@ + 02111-1307 USA. */ + + /* Find index of weight. */ ++#if __GNUC__ >= 4 ++auto inline int32_t ++__attribute ((always_inline)) ++#else + static inline int32_t ++#endif + findidx (const unsigned char **cpp) + { + int_fast32_t i = table[*(*cpp)++]; +--- glibc-2.2.5/locale/weightwc.h.old 2001-08-06 21:26:15.000000000 -0700 ++++ glibc-2.2.5/locale/weightwc.h 2005-03-10 16:13:08.651631176 -0800 +@@ -18,7 +18,12 @@ + 02111-1307 USA. */ + + /* Find index of weight. */ ++#if __GNUC__ >= 4 ++auto inline int32_t ++__attribute ((always_inline)) ++#else + static inline int32_t ++#endif + findidx (const wint_t **cpp) + { + int32_t i; diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-malloc.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-malloc.patch new file mode 100644 index 00000000..2d9f0924 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-malloc.patch @@ -0,0 +1,48 @@ +Fixes +programs/ld-collate.c: In function 'obstack_int32_grow': +programs/ld-collate.c:48: error: invalid lvalue in increment +programs/ld-collate.c: In function 'obstack_int32_grow_fast': +programs/ld-collate.c:57: error: invalid lvalue in increment + +Change taken by eyeball from version 1.20 at +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/malloc/obstack.h?cvsroot=glibc + +--- /home/dank/downloads/glibc-2.2.5/malloc/obstack.h 2001-07-05 21:55:35.000000000 -0700 ++++ glibc-2.2.5/malloc/obstack.h 2005-03-11 16:12:16.175812224 -0800 +@@ -423,22 +423,29 @@ + ({ struct obstack *__o = (OBSTACK); \ + if (__o->next_free + sizeof (void *) > __o->chunk_limit) \ + _obstack_newchunk (__o, sizeof (void *)); \ +- *((void **)__o->next_free)++ = (datum); \ +- (void) 0; }) ++ obstack_ptr_grow_fast (__o, datum); }) + + # define obstack_int_grow(OBSTACK,datum) \ + __extension__ \ + ({ struct obstack *__o = (OBSTACK); \ + if (__o->next_free + sizeof (int) > __o->chunk_limit) \ + _obstack_newchunk (__o, sizeof (int)); \ +- *((int *)__o->next_free)++ = (datum); \ ++ obstack_int_grow_fast (__o, datum); }) ++ ++# define obstack_ptr_grow_fast(OBSTACK,aptr) \ ++__extension__ \ ++({ struct obstack *__o1 = (OBSTACK); \ ++ *(const void **) __o1->next_free = (aptr); \ ++ __o1->next_free += sizeof (const void *); \ + (void) 0; }) + +-# define obstack_ptr_grow_fast(h,aptr) \ +- (*((void **) (h)->next_free)++ = (aptr)) ++# define obstack_int_grow_fast(OBSTACK,aint) \ ++__extension__ \ ++({ struct obstack *__o1 = (OBSTACK); \ ++ *(int *) __o1->next_free = (aint); \ ++ __o1->next_free += sizeof (int); \ ++ (void) 0; }) + +-# define obstack_int_grow_fast(h,aint) \ +- (*((int *) (h)->next_free)++ = (aint)) + + # define obstack_blank(OBSTACK,length) \ + __extension__ \ diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-mipsel.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-mipsel.patch new file mode 100644 index 00000000..1b4f4457 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-mipsel.patch @@ -0,0 +1,81 @@ +Message-ID: <424A8F67.7060307@kaear.co.uk> +Date: Wed, 30 Mar 2005 12:37:11 +0100 +From: Piete Sartain <kaear@kaear.co.uk> +To: crossgcc@sources.redhat.com +Subject: [Patch] CT 0.3 - glibc-2.2.5-allow-gcc-4.0-mipsel + + +I copied the relevant sections out of +http://kegel.com/crosstool/crosstool-0.29/patches/glibc-2.3-20050307/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch +for a mipsel target. + +The build still fails, but now with an assembler error at crtbegin.o. + +[---dank: judging from my old buildlogs, this should fix: + +In file included from dynamic-link.h:21, + from dl-reloc.c:153: +../sysdeps/mips/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/mips/dl-machine.h:477: error: invalid storage class for function 'elf_machine_rel' +../sysdeps/mips/dl-machine.h:539: error: invalid storage class for function 'elf_machine_rel_relative' +../sysdeps/mips/dl-machine.h:546: error: invalid storage class for function 'elf_machine_lazy_rel' +../sysdeps/mips/dl-machine.h:554: error: invalid storage class for function 'elf_machine_got_rel' +../sysdeps/mips/dl-machine.h:641: error: invalid storage class for function 'elf_machine_runtime_setup' +make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-0.30/build/mipsel-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/glibc-2.2.5/elf' +make[2]: *** [/home/dank/queue/jobdir.fast2/crosstool-0.30/build/mipsel-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/build-glibc/elf/dl-reloc.o] Error 1 +make[1]: *** [elf/subdir_lib] Error 2 +make[1]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-0.30/build/mipsel-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/glibc-2.2.5' +make: *** [all] Error 2 +---] + + +--- glibc-2.2.5/sysdeps/mips/dl-machine.h.old 2005-03-28 18:19:56.000000000 +0100 ++++ glibc-2.2.5/sysdeps/mips/dl-machine.h 2005-03-28 18:25:15.000000000 +0100 +@@ -534,14 +534,28 @@ + } + } + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + 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 ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_lazy_rel (struct link_map *map, + ElfW(Addr) l_addr, const ElfW(Rel) *reloc) + { +@@ -550,7 +564,14 @@ + + #ifndef RTLD_BOOTSTRAP + /* Relocate GOT. */ +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_got_rel (struct link_map *map, int lazy) + { + ElfW(Addr) *got; + diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-msort.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-msort.patch new file mode 100644 index 00000000..171d2e48 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-msort.patch @@ -0,0 +1,47 @@ +Fixes + +msort.c: In function 'msort_with_tmp': +msort.c:59: error: invalid lvalue in increment +msort.c:59: error: invalid lvalue in increment +msort.c:64: error: invalid lvalue in increment +msort.c:64: error: invalid lvalue in increment +make[2]: *** [/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/build-glibc/stdlib/msort.o] Error 1 +make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/glibc-2.2.5/stdlib' +make[1]: *** [stdlib/subdir_lib] Error 2 +make[1]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/glibc-2.2.5' +make: *** [all] Error 2 + +when building glibc-2.2.5 with gcc-3.4. + +Taken from ../glibc-2.3.2/glibc-2.3.2-allow-gcc-3.5-msort.patch +and rediffed. + +--- glibc-2.2.5/stdlib/msort.c.old 2001-07-05 21:55:41.000000000 -0700 ++++ glibc-2.2.5/stdlib/msort.c 2005-03-10 08:24:24.152204976 -0800 +@@ -1,6 +1,6 @@ + /* An alternative to qsort, with an identical interface. + This file is part of the GNU C Library. +- Copyright (C) 1992, 1995-1997, 1999, 2000, 2001 Free Software Foundation, Inc. ++ Copyright (C) 1992, 1995-1997, 1999, 2000, 2001, 2004 Free Software Foundation, Inc. + Written by Mike Haertel, September 1988. + + The GNU C Library is free software; you can redistribute it and/or +@@ -56,12 +56,16 @@ + if ((*cmp) (b1, b2) <= 0) + { + --n1; +- *((op_t *) tmp)++ = *((op_t *) b1)++; ++ *((op_t *) tmp) = *((op_t *) b1); ++ tmp += sizeof (op_t); ++ b1 += sizeof (op_t); + } + else + { + --n2; +- *((op_t *) tmp)++ = *((op_t *) b2)++; ++ *((op_t *) tmp) = *((op_t *) b2); ++ tmp += sizeof (op_t); ++ b2 += sizeof (op_t); + } + } + else diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-powerpc-procfs.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-powerpc-procfs.patch new file mode 100644 index 00000000..fb1a0c99 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-powerpc-procfs.patch @@ -0,0 +1,54 @@ +(See similar patch for glibc-2.3.3) + +This fix discussed here: +http://gcc.gnu.org/ml/gcc/2005-01/msg00509.html + +Fixes + +In file included from ../linuxthreads_db/proc_service.h:20, + from ../linuxthreads_db/thread_dbP.h:6, + from internals.h:36, + from attr.c:23: +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:53: error: syntax error before 'elf_vrreg_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:53: warning: type defaults to 'int' in declaration of 'elf_vrreg_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:53: warning: data definition has no type or storage class +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:54: error: syntax error before 'elf_vrregset_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:54: warning: type defaults to 'int' in declaration of 'elf_vrregset_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:54: warning: data definition has no type or storage class +make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-0.30/build/powerpc-405-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/glibc-2.2.5/linuxthreads' +make[2]: *** [/home/dank/queue/jobdir.fast2/crosstool-0.30/build/powerpc-405-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/build-glibc/linuxthreads/attr.o] Error 1 + +From: Martin Egholm Nielsen martin at egholm-nielsen dot dk +To: crossgcc at sources dot redhat dot com +Date: Thu, 24 Mar 2005 18:40:27 +0100 +Subject: [Patch] CT 0.29 - glibc-2.2.5-allow-gcc-4.0-powerpc-procfs + +Hi Dan, + +I had to add the following patch in order to make CT 0.29 and glibc +2.2.5 compile with gcc 4.0 (20050305) and Kernel 2.4.20... + +// Martin + +--- glibc-2.2.5/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h.old 2005-03-24 13:11:39.746062400 +0100 ++++ glibc-2.2.5/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h 2005-03-24 13:15:11.810996800 +0100 +@@ -42,15 +42,10 @@ + typedef double elf_fpreg_t; + typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; + +-/* gcc 3.1 and newer support __uint128_t. */ +-#if !__GNUC_PREREQ(3,1) +-typedef struct { +- unsigned long u[4]; +-} __attribute((aligned(16))) __uint128_t; +-#endif +- + /* Altivec registers */ +-typedef __uint128_t elf_vrreg_t; ++typedef struct { ++ unsigned int u[4]; ++} __attribute__ ((aligned (16))) elf_vrreg_t; + typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG]; + + struct elf_siginfo + diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-powerpc.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-powerpc.patch new file mode 100644 index 00000000..6b889c24 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-powerpc.patch @@ -0,0 +1,23 @@ +In file included from dynamic-link.h:21, + from dl-reloc.c:153: +../sysdeps/powerpc/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/powerpc/dl-machine.h:399: error: invalid storage class for function 'elf_machine_rela_relative' +make[2]: *** [/home/dank/queue/jobdir.dual2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.2.5/build-glibc/elf/dl-reloc.o] Error 1 +--- glibc-2.2.5/sysdeps/powerpc/dl-machine.h.old Thu Mar 17 13:28:17 2005 ++++ glibc-2.2.5/sysdeps/powerpc/dl-machine.h Thu Mar 17 13:29:03 2005 +@@ -393,7 +393,14 @@ + reloc_addr, finaladdr, rinfo); + } + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc, + Elf32_Addr *const reloc_addr) + { diff --git a/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-sunrpc.patch b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-sunrpc.patch new file mode 100644 index 00000000..4a07130e --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-allow-gcc-4.0-sunrpc.patch @@ -0,0 +1,221 @@ +[Taken from ../glibc-2.3.2/glibc-2.3.2-allow-gcc-3.4-sunrpc.patch, +rediffed, and with a fix for sunrpc/auth_none.c that was +inexplicably not included in the original patch.] + +Fixes + +auth_none.c: In function 'authnone_create': +auth_none.c:83: error: invalid lvalue in assignment +clnt_perr.c: In function '_buf': +clnt_perr.c:68: error: invalid lvalue in assignment +clnt_raw.c: In function 'clntraw_create': +clnt_raw.c:103: error: invalid lvalue in assignment +clnt_simp.c: In function 'callrpc': +clnt_simp.c:78: error: invalid lvalue in assignment +etc. + +building glibc-2.2.5 with gcc-4.0. + +--- + +http://sources.redhat.com/ml/libc-hacker/2004-02/msg00005.html +[Also in CVS, but the original patch is easier to get.] + +Fixes errors like + +clnt_perr.c: In function `_buf': +clnt_perr.c:67: error: invalid lvalue in assignment + +when building with gcc-3.5. + +To: libc-hacker at sources dot redhat dot com +Subject: Fix cast as lvalue in sunrpc +From: Andreas Schwab <schwab at suse dot de> +X-Yow: SHHHH!! I hear SIX TATTOOED TRUCK-DRIVERS tossing ENGINE BLOCKS + into empty OIL DRUMS dot dot +Date: Sun, 08 Feb 2004 17:38:31 +0100 +Message-ID: <je4qu1frw8.fsf@sykes.suse.de> + +This fixes the uses of casts as lvalue in the sunrpc code. + +Andreas. + +2004-02-08 Andreas Schwab <schwab@suse.de> + + * include/rpc/rpc.h: Declare thread variables with their correct + type. + * sunrpc/clnt_perr.c: Don't cast thread variables. + * sunrpc/clnt_raw.c: Likewise. + * sunrpc/clnt_simp.c: Likewise. + * sunrpc/key_call.c: Likewise. + * sunrpc/svcauth_des.c: Likewise. + * sunrpc/svc.c: Likewise. + * sunrpc/svc_raw.c: Likewise. + * sunrpc/svc_simple.c: Likewise. + +diff -ur glibc-2.2.5/include/rpc/rpc.h glibc-2.2.5-patched/include/rpc/rpc.h +--- glibc-2.2.5/include/rpc/rpc.h 2001-03-25 21:11:32.000000000 -0800 ++++ glibc-2.2.5-patched/include/rpc/rpc.h 2005-03-11 13:18:29.810860624 -0800 +@@ -18,24 +18,24 @@ + + void *authnone_private_s; /* auth_none.c */ + +- void *clnt_perr_buf_s; /* clnt_perr.c */ ++ char *clnt_perr_buf_s; /* clnt_perr.c */ + +- void *clntraw_private_s; /* clnt_raw.c */ ++ struct clntraw_private_s *clntraw_private_s; /* clnt_raw.c */ + +- void *callrpc_private_s; /* clnt_simp.c */ ++ struct callrpc_private_s *callrpc_private_s; /* clnt_simp.c */ + +- void *key_call_private_s; /* key_call.c */ ++ struct key_call_private *key_call_private_s; /* key_call.c */ + +- void *authdes_cache_s; /* svcauth_des.c */ +- void *authdes_lru_s; /* svcauth_des.c */ ++ struct cache_entry *authdes_cache_s; /* svcauth_des.c */ ++ int *authdes_lru_s; /* svcauth_des.c */ + +- void *svc_xports_s; /* svc.c */ +- void *svc_head_s; /* svc.c */ ++ SVCXPRT **svc_xports_s; /* svc.c */ ++ struct svc_callout *svc_head_s; /* svc.c */ + +- void *svcraw_private_s; /* svc_raw.c */ ++ struct svcraw_private_s *svcraw_private_s; /* svc_raw.c */ + +- void *svcsimple_proglst_s; /* svc_simple.c */ +- void *svcsimple_transp_s; /* svc_simple.c */ ++ struct proglst_ *svcsimple_proglst_s; /* svc_simple.c */ ++ SVCXPRT *svcsimple_transp_s; /* svc_simple.c */ + }; + + extern struct rpc_thread_variables *__rpc_thread_variables(void) +--- glibc-2.2.5/sunrpc/auth_none.c.old 2005-03-10 16:26:53.874178280 -0800 ++++ glibc-2.2.5/sunrpc/auth_none.c 2005-03-10 16:34:24.551664888 -0800 +@@ -62,7 +62,7 @@ + u_int mcnt; + }; + #ifdef _RPC_THREAD_SAFE_ +-#define authnone_private ((struct authnone_private_s *)RPC_THREAD_VARIABLE(authnone_private_s)) ++#define authnone_private RPC_THREAD_VARIABLE(authnone_private_s) + #else + static struct authnone_private_s *authnone_private; + #endif +diff -ur glibc-2.2.5/sunrpc/clnt_perr.c glibc-2.2.5-patched/sunrpc/clnt_perr.c +--- glibc-2.2.5/sunrpc/clnt_perr.c 2001-08-16 21:48:31.000000000 -0700 ++++ glibc-2.2.5-patched/sunrpc/clnt_perr.c 2005-03-11 13:18:29.812860320 -0800 +@@ -56,7 +56,7 @@ + * buf variable in a few functions. Overriding a global variable + * with a local variable of the same name is a bad idea, anyway. + */ +-#define buf ((char *)RPC_THREAD_VARIABLE(clnt_perr_buf_s)) ++#define buf RPC_THREAD_VARIABLE(clnt_perr_buf_s) + #else + static char *buf; + #endif +diff -ur glibc-2.2.5/sunrpc/clnt_raw.c glibc-2.2.5-patched/sunrpc/clnt_raw.c +--- glibc-2.2.5/sunrpc/clnt_raw.c 2001-03-20 10:34:22.000000000 -0800 ++++ glibc-2.2.5-patched/sunrpc/clnt_raw.c 2005-03-11 13:18:29.813860168 -0800 +@@ -61,7 +61,7 @@ + u_int mcnt; + }; + #ifdef _RPC_THREAD_SAFE_ +-#define clntraw_private ((struct clntraw_private_s *)RPC_THREAD_VARIABLE(clntraw_private_s)) ++#define clntraw_private RPC_THREAD_VARIABLE(clntraw_private_s) + #else + static struct clntraw_private_s *clntraw_private; + #endif +diff -ur glibc-2.2.5/sunrpc/clnt_simp.c glibc-2.2.5-patched/sunrpc/clnt_simp.c +--- glibc-2.2.5/sunrpc/clnt_simp.c 2001-08-19 23:28:21.000000000 -0700 ++++ glibc-2.2.5-patched/sunrpc/clnt_simp.c 2005-03-11 13:18:29.814860016 -0800 +@@ -55,7 +55,7 @@ + char *oldhost; + }; + #ifdef _RPC_THREAD_SAFE_ +-#define callrpc_private ((struct callrpc_private_s *)RPC_THREAD_VARIABLE(callrpc_private_s)) ++#define callrpc_private RPC_THREAD_VARIABLE(callrpc_private_s) + #else + static struct callrpc_private_s *callrpc_private; + #endif +diff -ur glibc-2.2.5/sunrpc/key_call.c glibc-2.2.5-patched/sunrpc/key_call.c +--- glibc-2.2.5/sunrpc/key_call.c 2001-03-20 10:34:22.000000000 -0800 ++++ glibc-2.2.5-patched/sunrpc/key_call.c 2005-03-11 13:18:29.816859712 -0800 +@@ -360,7 +360,7 @@ + uid_t uid; /* user-id at last authorization */ + }; + #ifdef _RPC_THREAD_SAFE_ +-#define key_call_private_main ((struct key_call_private *)RPC_THREAD_VARIABLE(key_call_private_s)) ++#define key_call_private_main RPC_THREAD_VARIABLE(key_call_private_s) + #else + static struct key_call_private *key_call_private_main; + #endif +diff -ur glibc-2.2.5/sunrpc/svcauth_des.c glibc-2.2.5-patched/sunrpc/svcauth_des.c +--- glibc-2.2.5/sunrpc/svcauth_des.c 2001-08-19 23:37:09.000000000 -0700 ++++ glibc-2.2.5-patched/sunrpc/svcauth_des.c 2005-03-11 13:18:29.821858952 -0800 +@@ -72,8 +72,8 @@ + char *localcred; /* generic local credential */ + }; + #ifdef _RPC_THREAD_SAFE_ +-#define authdes_cache ((struct cache_entry *)RPC_THREAD_VARIABLE(authdes_cache_s)) +-#define authdes_lru ((int *)RPC_THREAD_VARIABLE(authdes_lru_s)) ++#define authdes_cache RPC_THREAD_VARIABLE(authdes_cache_s) ++#define authdes_lru RPC_THREAD_VARIABLE(authdes_lru_s) + #else + static struct cache_entry *authdes_cache; + static int *authdes_lru; +diff -ur glibc-2.2.5/sunrpc/svc.c glibc-2.2.5-patched/sunrpc/svc.c +--- glibc-2.2.5/sunrpc/svc.c 2001-03-20 10:34:22.000000000 -0800 ++++ glibc-2.2.5-patched/sunrpc/svc.c 2005-03-11 13:18:29.817859560 -0800 +@@ -44,7 +44,7 @@ + #include <sys/poll.h> + + #ifdef _RPC_THREAD_SAFE_ +-#define xports ((SVCXPRT **)RPC_THREAD_VARIABLE(svc_xports_s)) ++#define xports RPC_THREAD_VARIABLE(svc_xports_s) + #else + static SVCXPRT **xports; + #endif +@@ -63,7 +63,7 @@ + void (*sc_dispatch) (struct svc_req *, SVCXPRT *); + }; + #ifdef _RPC_THREAD_SAFE_ +-#define svc_head ((struct svc_callout *)RPC_THREAD_VARIABLE(svc_head_s)) ++#define svc_head RPC_THREAD_VARIABLE(svc_head_s) + #else + static struct svc_callout *svc_head; + #endif +diff -ur glibc-2.2.5/sunrpc/svc_raw.c glibc-2.2.5-patched/sunrpc/svc_raw.c +--- glibc-2.2.5/sunrpc/svc_raw.c 2001-03-20 10:34:22.000000000 -0800 ++++ glibc-2.2.5-patched/sunrpc/svc_raw.c 2005-03-11 13:18:29.818859408 -0800 +@@ -54,7 +54,7 @@ + char verf_body[MAX_AUTH_BYTES]; + }; + #ifdef _RPC_THREAD_SAFE_ +-#define svcraw_private ((struct svcraw_private_s *)RPC_THREAD_VARIABLE(svcraw_private_s)) ++#define svcraw_private RPC_THREAD_VARIABLE(svcraw_private_s) + #else + static struct svcraw_private_s *svcraw_private; + #endif +diff -ur glibc-2.2.5/sunrpc/svc_simple.c glibc-2.2.5-patched/sunrpc/svc_simple.c +--- glibc-2.2.5/sunrpc/svc_simple.c 2001-08-17 00:16:04.000000000 -0700 ++++ glibc-2.2.5-patched/sunrpc/svc_simple.c 2005-03-11 13:18:29.820859104 -0800 +@@ -62,7 +62,7 @@ + struct proglst_ *p_nxt; + }; + #ifdef _RPC_THREAD_SAFE_ +-#define proglst ((struct proglst_ *)RPC_THREAD_VARIABLE(svcsimple_proglst_s)) ++#define proglst RPC_THREAD_VARIABLE(svcsimple_proglst_s) + #else + static struct proglst_ *proglst; + #endif +@@ -70,7 +70,7 @@ + + static void universal (struct svc_req *rqstp, SVCXPRT *transp_s); + #ifdef _RPC_THREAD_SAFE_ +-#define transp ((SVCXPRT *)RPC_THREAD_VARIABLE(svcsimple_transp_s)) ++#define transp RPC_THREAD_VARIABLE(svcsimple_transp_s) + #else + static SVCXPRT *transp; + #endif diff --git a/patches/glibc/2.2.5/glibc-2.2.5-alpha-pwrite64.patch b/patches/glibc/2.2.5/glibc-2.2.5-alpha-pwrite64.patch new file mode 100644 index 00000000..89cc9ead --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-alpha-pwrite64.patch @@ -0,0 +1,58 @@ +Fix for this error: + +../sysdeps/unix/sysv/linux/pread.c: In function `__libc_pread': +../sysdeps/unix/sysv/linux/pread.c:52: error: `__NR_pread' undeclared (first use in this function) +../sysdeps/unix/sysv/linux/pread.c:52: error: (Each undeclared identifier is reported only once +../sysdeps/unix/sysv/linux/pread.c:52: error: for each function it appears in.) +make[2]: *** [/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/build-glibc/posix/pread.o] Error 1 +make[2]: Leaving directory `/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/glibc-2.2.5/posix' +make[1]: *** [posix/subdir_lib] Error 2 +make[1]: Leaving directory `/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/glibc-2.2.5' +make: *** [all] Error 2 + +[ Same as glibc-2.3.2-alpha-pwrite.patch except for copyright date ] + +extracted from GLIBC CVS by Dan Kegel +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.14&r2=1.15&cvsroot=glibc' +(to match context of...) +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.16&r2=1.17&cvsroot=glibc' +and rediffed. + +cf. +http://sources.redhat.com/ml/libc-alpha/2003-10/msg00038.html + +Originally thought we needed this hunk, too: +http://sources.redhat.com/ml/libc-alpha/2003-10/msg00037.html +but it seems the sysdep.h change is sufficient, and works better +when compiling against linux-2.4. + +=================================================================== +--- glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/sysdep.h.old 2004-05-24 22:21:44.000000000 -0700 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/sysdep.h 2004-05-24 22:22:48.000000000 -0700 +@@ -1,3 +1,3 @@ +-/* Copyright (C) 1992, 1993, 1995, 1996, 1997 Free Software Foundation, Inc. ++/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995. +@@ -60,6 +60,21 @@ + #define __NR_osf_getsysinfo 256 + #define __NR_osf_setsysinfo 257 + ++/* Help old kernel headers where particular syscalls are not available. */ ++#ifndef __NR_semtimedop ++# define __NR_semtimedop 423 ++#endif ++ ++/* This is a kludge to make syscalls.list find these under the names ++ pread and pwrite, since some kernel headers define those names ++ and some define the *64 names for the same system calls. */ ++#if !defined __NR_pread && defined __NR_pread64 ++# define __NR_pread __NR_pread64 ++#endif ++#if !defined __NR_pwrite && defined __NR_pwrite64 ++# define __NR_pwrite __NR_pwrite64 ++#endif ++ + /* + * In order to get the hidden arguments for rt_sigaction set up + * properly, we need to call the assembly version. Detect this in the diff --git a/patches/glibc/2.2.5/glibc-2.2.5-arm-pwrite64.patch b/patches/glibc/2.2.5/glibc-2.2.5-arm-pwrite64.patch new file mode 100644 index 00000000..c4bd19c7 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-arm-pwrite64.patch @@ -0,0 +1,30 @@ +Should fix + +../sysdeps/unix/sysv/linux/pread.c: In function `__libc_pread': +../sysdeps/unix/sysv/linux/pread.c:52: error: `__NR_pread' undeclared (first use in this function) +../sysdeps/unix/sysv/linux/pread.c:52: error: (Each undeclared identifier is reported only once +../sysdeps/unix/sysv/linux/pread.c:52: error: for each function it appears in.) +make[2]: *** [/home/dank/crosstool-0.28/build/arm-9tdmi-linux-gnu/gcc-3.4.1-glibc-2.2.5/build-glibc/posix/pread.o] Error 1 +make[2]: Leaving directory `/home/dank/crosstool-0.28/build/arm-9tdmi-linux-gnu/gcc-3.4.1-glibc-2.2.5/glibc-2.2.5/posix' +make[1]: *** [posix/subdir_lib] Error 2 + +Copied from similar patch for alpha. + +--- glibc-2.2.5-orig/sysdeps/unix/sysv/linux/arm/sysdep.h 2001-07-05 21:56:13.000000000 -0700 ++++ glibc-2.2.5/sysdeps/unix/sysv/linux/arm/sysdep.h 2004-08-07 10:45:26.000000000 -0700 +@@ -32,6 +32,15 @@ + #define SWI_BASE (0x900000) + #define SYS_ify(syscall_name) (__NR_##syscall_name) + ++/* This is a kludge to make syscalls.list find these under the names ++ pread and pwrite, since some kernel headers define those names ++ and some define the *64 names for the same system calls. */ ++#if !defined __NR_pread && defined __NR_pread64 ++# define __NR_pread __NR_pread64 ++#endif ++#if !defined __NR_pwrite && defined __NR_pwrite64 ++# define __NR_pwrite __NR_pwrite64 ++#endif + + #ifdef __ASSEMBLER__ + diff --git a/patches/glibc/2.2.5/glibc-2.2.5-crosstest.patch b/patches/glibc/2.2.5/glibc-2.2.5-crosstest.patch new file mode 100644 index 00000000..c9f37011 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-crosstest.patch @@ -0,0 +1,27 @@ +Fixes errors like + /build-glibc/dlfcn/glrefmain: cannot load `glreflib1.so' +in glibc regression test + +--- glibc-2.2.5/dlfcn/Makefile.old Thu Jul 24 16:30:20 2003 ++++ glibc-2.2.5/dlfcn/Makefile Thu Jul 24 17:25:01 2003 +@@ -60,6 +60,8 @@ + test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(modules-names))) + $(test-modules): $(objpfx)%.so: $(objpfx)%.os + $(build-module) ++# without following rule, test-modules don't get built when cross-compiling ++tests: $(test-modules) + + $(objpfx)glrefmain: $(libdl) + $(objpfx)glrefmain.out: $(objpfx)glrefmain \ +--- glibc-2.2.5/elf/Makefile.old Thu Jul 24 18:17:12 2003 ++++ glibc-2.2.5/elf/Makefile Thu Jul 24 18:18:58 2003 +@@ -263,6 +263,9 @@ + test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(strip $(modules-names)))) + generated += $(addsuffix .so,$(strip $(modules-names))) + ++# without following rule, test-modules don't get built when cross-compiling ++tests: $(test-modules) ++ + ifeq (yes,$(build-shared)) + ifeq ($(cross-compiling),no) + tests: $(objpfx)tst-pathopt.out diff --git a/patches/glibc/2.2.5/glibc-2.2.5-crossyes.patch b/patches/glibc/2.2.5/glibc-2.2.5-crossyes.patch new file mode 100644 index 00000000..842d8f54 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-crossyes.patch @@ -0,0 +1,11 @@ +--- glibc-2.2.5/configure.old 2003-05-30 21:51:13.000000000 -0700 ++++ glibc-2.2.5/configure 2003-05-30 21:51:23.000000000 -0700 +@@ -1738,7 +1738,7 @@ + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then +- ac_cv_prog_cc_cross=no ++ ac_cv_prog_cc_cross=yes + else + ac_cv_prog_cc_cross=yes + fi diff --git a/patches/glibc/2.2.5/glibc-2.2.5-cygwin.patch b/patches/glibc/2.2.5/glibc-2.2.5-cygwin.patch new file mode 100644 index 00000000..f14998d3 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-cygwin.patch @@ -0,0 +1,89 @@ +Fixes +elf/librtld.os: In function `process_envvars': : undefined reference to `__access' +... +when building glibc-2.3.2 on cygwin + +Idea from +http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch +forward ported to glibc-2.3.2. +Basically, make glibc use .oST as suffix for 'object static' +instead of .oS, since cygwin has trouble distinguishing .os from .oS +(Original patch had .on, but .oST is more mnemonic for 'object static') + + +diff -Naur from-cvs/Makeconfig patched/Makeconfig +--- from-cvs/Makeconfig Fri Jan 11 14:40:35 2002 ++++ patched/Makeconfig Fri Jan 11 15:07:30 2002 +@@ -439,13 +439,13 @@ + # run the linked programs. + link-libc = -Wl,-rpath-link=$(rpath-link) \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib) ++ $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib) + # This is how to find at build-time things that will be installed there. + rpath-dirs = math elf dlfcn nss nis rt resolv crypt + else + ifneq (,$(findstring aix,$(config-os))) + link-libc = $(common-objpfx)libc.a \ +- $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib) ++ $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib) + rpath-dirs = math dlfcn nss nis rt resolv crypt + endif + endif +@@ -649,7 +649,7 @@ + # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX}) + # to pass different flags for each flavor. + libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o)) +-all-object-suffixes := .o .os .op .og .ob .oS ++all-object-suffixes := .o .os .op .og .ob .oST + object-suffixes := + CPPFLAGS-.o = $(pic-default) + CFLAGS-.o = $(filter %frame-pointer,$(+cflags)) +@@ -703,14 +703,14 @@ + + ifeq (yes,$(build-shared)) + # Build special library that contains the static-only routines for libc. +-object-suffixes-for-libc += .oS ++object-suffixes-for-libc += .oST + + # Must build the routines as PIC, though, because they can end up in (users') + # shared objects. We don't want to use CFLAGS-os because users may, for + # example, make that processor-specific. +-CFLAGS-.oS = $(CFLAGS-.o) $(pic-ccflag) +-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC +-libtype.oS = lib%_nonshared.a ++CFLAGS-.oST = $(CFLAGS-.o) $(pic-ccflag) ++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC ++libtype.oST = lib%_nonshared.a + endif + + +diff -Naur from-cvs/Makerules patched/Makerules +--- from-cvs/Makerules Fri Jan 11 14:40:42 2002 ++++ patched/Makerules Fri Jan 11 15:06:00 2002 +@@ -361,7 +361,7 @@ + # Bounded pointer thunks are only built for *.ob + elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks)) + +-elide-routines.oS += $(filter-out $(static-only-routines),\ ++elide-routines.oST += $(filter-out $(static-only-routines),\ + $(routines) $(aux) $(sysdep_routines)) \ + $(elide-bp-thunks) + elide-routines.os += $(static-only-routines) $(elide-bp-thunks) +@@ -842,14 +842,14 @@ + # of the files are taken by the linker. + install: $(inst_libdir)/libc.so + $(inst_libdir)/libc.so: $(common-objpfx)libc.so$(libc.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)$(libc-name)) \ + $(+force) + (echo '/* GNU ld script';\ + echo ' Use the shared library, but some functions are only in';\ + echo ' the static library, so try that secondarily. */';\ + echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\ + ')' \ + ) > $@.new + mv -f $@.new $@ diff --git a/patches/glibc/2.2.5/glibc-2.2.5-hhl-powerpc-fpu.patch b/patches/glibc/2.2.5/glibc-2.2.5-hhl-powerpc-fpu.patch new file mode 100644 index 00000000..97740d54 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-hhl-powerpc-fpu.patch @@ -0,0 +1,1134 @@ +# See http://sources.redhat.com/ml/crossgcc/2002-05/msg00132.html +# This patch is taken directly from the Montavista Hard Hat Linux 2.0 source RPMs, +# but has been rediffed against glibc-2.2.5 + +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/Dist glibc-2.2.5/sysdeps/powerpc/Dist +--- glibc-2.2.5.old/sysdeps/powerpc/Dist Fri Jun 30 23:30:21 2000 ++++ glibc-2.2.5/sysdeps/powerpc/Dist Thu Jul 10 11:43:17 2003 +@@ -1,9 +1,6 @@ + dl-machine.c + dl-start.S + ppc-mcount.S +-fe_nomask.c +-fprrest.S +-fprsave.S + gprsave1.S + gprsave0.S + gprrest1.S +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/Makefile glibc-2.2.5/sysdeps/powerpc/Makefile +--- glibc-2.2.5.old/sysdeps/powerpc/Makefile Mon Nov 27 15:32:47 2000 ++++ glibc-2.2.5/sysdeps/powerpc/Makefile Thu Jul 10 11:43:17 2003 +@@ -3,16 +3,12 @@ + +cflags += -mnew-mnemonics -Wa,-mppc -mpowerpc + asm-CPPFLAGS += -Wa,-mppc + +-ifeq ($(subdir),math) +-libm-support += fenv_const fe_nomask +-endif +- + ifeq ($(subdir),gmon) + sysdep_routines += ppc-mcount + endif + + ifeq ($(subdir),misc) +-sysdep_routines += gprsave0 gprrest0 gprsave1 gprrest1 fprsave fprrest ++sysdep_routines += gprsave0 gprrest0 gprsave1 gprrest1 + endif + + # On PPC, -fpic works until the GOT contains 2^15 bytes, and possibly +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/Versions glibc-2.2.5/sysdeps/powerpc/Versions +--- glibc-2.2.5.old/sysdeps/powerpc/Versions Mon Feb 28 13:27:57 2000 ++++ glibc-2.2.5/sysdeps/powerpc/Versions Thu Jul 10 11:43:17 2003 +@@ -1,8 +1,4 @@ + libm { +- GLIBC_2.1 { +- # symbols used in macros from sysdeps/powerpc/bits/fenv.h +- __fe_dfl_env; __fe_enabled_env; __fe_nonieee_env; __fe_nomask_env; +- } + GLIBC_2.2 { + # Special functions to save and restore registers used by the + # runtime libraries. +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/__longjmp.S glibc-2.2.5/sysdeps/powerpc/__longjmp.S +--- glibc-2.2.5.old/sysdeps/powerpc/__longjmp.S Thu Jul 5 21:56:01 2001 ++++ glibc-2.2.5/sysdeps/powerpc/__longjmp.S Thu Jul 10 11:43:17 2003 +@@ -24,6 +24,8 @@ + #include <bp-sym.h> + #include <bp-asm.h> + ++/* The FPU loads have been removed from this file - see fpu/__longjmp.S */ ++ + ENTRY (BP_SYM (__longjmp)) + CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE) + +@@ -31,44 +33,26 @@ + lwz r2,(JB_GPR2*4)(r3) + lwz r0,(JB_LR*4)(r3) + lwz r14,((JB_GPRS+0)*4)(r3) +- lfd fp14,((JB_FPRS+0*2)*4)(r3) + lwz r15,((JB_GPRS+1)*4)(r3) +- lfd fp15,((JB_FPRS+1*2)*4)(r3) + lwz r16,((JB_GPRS+2)*4)(r3) +- lfd fp16,((JB_FPRS+2*2)*4)(r3) + lwz r17,((JB_GPRS+3)*4)(r3) +- lfd fp17,((JB_FPRS+3*2)*4)(r3) + lwz r18,((JB_GPRS+4)*4)(r3) +- lfd fp18,((JB_FPRS+4*2)*4)(r3) + lwz r19,((JB_GPRS+5)*4)(r3) +- lfd fp19,((JB_FPRS+5*2)*4)(r3) + lwz r20,((JB_GPRS+6)*4)(r3) +- lfd fp20,((JB_FPRS+6*2)*4)(r3) + mtlr r0 + lwz r21,((JB_GPRS+7)*4)(r3) +- lfd fp21,((JB_FPRS+7*2)*4)(r3) + lwz r22,((JB_GPRS+8)*4)(r3) +- lfd fp22,((JB_FPRS+8*2)*4)(r3) + lwz r0,(JB_CR*4)(r3) + lwz r23,((JB_GPRS+9)*4)(r3) +- lfd fp23,((JB_FPRS+9*2)*4)(r3) + lwz r24,((JB_GPRS+10)*4)(r3) +- lfd fp24,((JB_FPRS+10*2)*4)(r3) + lwz r25,((JB_GPRS+11)*4)(r3) +- lfd fp25,((JB_FPRS+11*2)*4)(r3) + mtcrf 0xFF,r0 + lwz r26,((JB_GPRS+12)*4)(r3) +- lfd fp26,((JB_FPRS+12*2)*4)(r3) + lwz r27,((JB_GPRS+13)*4)(r3) +- lfd fp27,((JB_FPRS+13*2)*4)(r3) + lwz r28,((JB_GPRS+14)*4)(r3) +- lfd fp28,((JB_FPRS+14*2)*4)(r3) + lwz r29,((JB_GPRS+15)*4)(r3) +- lfd fp29,((JB_FPRS+15*2)*4)(r3) + lwz r30,((JB_GPRS+16)*4)(r3) +- lfd fp30,((JB_FPRS+16*2)*4)(r3) + lwz r31,((JB_GPRS+17)*4)(r3) +- lfd fp31,((JB_FPRS+17*2)*4)(r3) + mr r3,r4 + blr + END (BP_SYM (__longjmp)) +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/bits/setjmp.h glibc-2.2.5/sysdeps/powerpc/bits/setjmp.h +--- glibc-2.2.5.old/sysdeps/powerpc/bits/setjmp.h Thu Jul 5 21:56:01 2001 ++++ glibc-2.2.5/sysdeps/powerpc/bits/setjmp.h Thu Jul 10 11:43:17 2003 +@@ -17,6 +17,7 @@ + 02111-1307 USA. */ + + /* Define the machine-dependent type `jmp_buf'. PowerPC version. */ ++/* For processors without floating point. */ + + #ifndef _SETJMP_H + # error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead." +@@ -33,12 +34,11 @@ + # define JB_LR 2 /* The address we will return to */ + # define JB_GPRS 3 /* GPRs 14 through 31 are saved, 18 in total */ + # define JB_CR 21 /* Condition code registers. */ +-# define JB_FPRS 22 /* FPRs 14 through 31 are saved, 18*2 words total */ +-# define JB_SIZE (58*4) ++# define JB_SIZE (22*4) + #endif + + #ifndef _ASM +-typedef long int __jmp_buf[58]; ++typedef long int __jmp_buf[22]; + #endif + + /* Test if longjmp to JMPBUF would unwind the frame +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fclrexcpt.c glibc-2.2.5/sysdeps/powerpc/fclrexcpt.c +--- glibc-2.2.5.old/sysdeps/powerpc/fclrexcpt.c Thu Jul 5 21:56:01 2001 ++++ glibc-2.2.5/sysdeps/powerpc/fclrexcpt.c Wed Dec 31 16:00:00 1969 +@@ -1,48 +0,0 @@ +-/* Clear given exceptions in current floating-point environment. +- Copyright (C) 1997,99,2000,01 Free Software 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 <fenv_libc.h> +- +-#undef feclearexcept +-int +-__feclearexcept (int excepts) +-{ +- fenv_union_t u; +- +- /* Get the current state. */ +- u.fenv = fegetenv_register (); +- +- /* Clear the relevant bits. */ +- u.l[1] = u.l[1] & ~((-(excepts >> (31 - FPSCR_VX) & 1) & FE_ALL_INVALID) +- | (excepts & FPSCR_STICKY_BITS)); +- +- /* Put the new state in effect. */ +- fesetenv_register (u.fenv); +- +- /* Success. */ +- return 0; +-} +- +-#include <shlib-compat.h> +-#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2) +-strong_alias (__feclearexcept, __old_feclearexcept) +-compat_symbol (libm, __old_feclearexcept, feclearexcept, GLIBC_2_1); +-#endif +- +-versioned_symbol (libm, __feclearexcept, feclearexcept, GLIBC_2_2); +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fe_nomask.c glibc-2.2.5/sysdeps/powerpc/fe_nomask.c +--- glibc-2.2.5.old/sysdeps/powerpc/fe_nomask.c Thu Jul 5 21:56:01 2001 ++++ glibc-2.2.5/sysdeps/powerpc/fe_nomask.c Wed Dec 31 16:00:00 1969 +@@ -1,32 +0,0 @@ +-/* Procedure definition for FE_NOMASK_ENV. +- Copyright (C) 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. */ +- +-#include <fenv.h> +-#include <errno.h> +- +-/* This is presently a stub, until it's decided how the kernels should +- support this. */ +- +-const fenv_t * +-__fe_nomask_env(void) +-{ +- __set_errno (ENOSYS); +- return FE_ENABLED_ENV; +-} +-stub_warning (__fe_nomask_env) +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fprrest.S glibc-2.2.5/sysdeps/powerpc/fprrest.S +--- glibc-2.2.5.old/sysdeps/powerpc/fprrest.S Thu Jul 5 21:56:01 2001 ++++ glibc-2.2.5/sysdeps/powerpc/fprrest.S Wed Dec 31 16:00:00 1969 +@@ -1,94 +0,0 @@ +-/* Copyright (C) 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. */ +- +-/* +- Floating Point Registers (FPRs) restore routine +-*/ +- +-#include <sysdep.h> +- +-ENTRY(_restfpr_all) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf14) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_14) +-C_TEXT(_restf14): +-C_TEXT(_restfpr_14): lfd fp14,-144(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf15) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_15) +-C_TEXT(_restf15): +-C_TEXT(_restfpr_15): lfd fp15,-136(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf16) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_16) +-C_TEXT(_restf16): +-C_TEXT(_restfpr_16): lfd fp16,-128(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf17) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_17) +-C_TEXT(_restf17): +-C_TEXT(_restfpr_17): lfd fp17,-120(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf18) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_18) +-C_TEXT(_restf18): +-C_TEXT(_restfpr_18): lfd fp18,-112(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf19) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_19) +-C_TEXT(_restf19): +-C_TEXT(_restfpr_19): lfd fp19,-104(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf20) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_20) +-C_TEXT(_restf20): +-C_TEXT(_restfpr_20): lfd fp20,-96(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf21) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_21) +-C_TEXT(_restf21): +-C_TEXT(_restfpr_21): lfd fp21,-88(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf22) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_22) +-C_TEXT(_restf22): +-C_TEXT(_restfpr_22): lfd fp22,-80(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf23) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_23) +-C_TEXT(_restf23): +-C_TEXT(_restfpr_23): lfd fp23,-72(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf24) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_24) +-C_TEXT(_restf24): +-C_TEXT(_restfpr_24): lfd fp24,-64(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf25) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_25) +-C_TEXT(_restf25): +-C_TEXT(_restfpr_25): lfd fp25,-56(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf26) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_26) +-C_TEXT(_restf26): +-C_TEXT(_restfpr_26): lfd fp26,-48(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf27) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_27) +-C_TEXT(_restf27): +-C_TEXT(_restfpr_27): lfd fp27,-40(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf28) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_28) +-C_TEXT(_restf28): +-C_TEXT(_restfpr_28): lfd fp28,-32(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restf29) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_29) +-C_TEXT(_restf29): +-C_TEXT(_restfpr_29): lwz r0,8(r1) #get return address from frame +- lfd fp29,-24(r1) #restore f29 +- mtlr r0 #move return address to LR +- lfd fp30,-16(r1) #restore f30 +- lfd fp31,-8(r1) #restore f31 +- blr #return +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fprsave.S glibc-2.2.5/sysdeps/powerpc/fprsave.S +--- glibc-2.2.5.old/sysdeps/powerpc/fprsave.S Thu Jul 5 21:56:01 2001 ++++ glibc-2.2.5/sysdeps/powerpc/fprsave.S Wed Dec 31 16:00:00 1969 +@@ -1,93 +0,0 @@ +-/* Copyright (C) 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. */ +- +-/* +- Floating Point Registers (FPRs) save routine +-*/ +- +-#include <sysdep.h> +- +-ENTRY(_savefpr_all) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef14) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_14) +-C_TEXT(_savef14): +-C_TEXT(_savefpr_14): stfd fp14,-144(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef15) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_15) +-C_TEXT(_savef15): +-C_TEXT(_savefpr_15): stfd fp15,-136(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef16) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_16) +-C_TEXT(_savef16): +-C_TEXT(_savefpr_16): stfd fp16,-128(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef17) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_17) +-C_TEXT(_savef17): +-C_TEXT(_savefpr_17): stfd fp17,-120(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef18) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_18) +-C_TEXT(_savef18): +-C_TEXT(_savefpr_18): stfd fp18,-112(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef19) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_19) +-C_TEXT(_savef19): +-C_TEXT(_savefpr_19): stfd fp19,-104(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef20) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_20) +-C_TEXT(_savef20): +-C_TEXT(_savefpr_20): stfd fp20,-96(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef21) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_21) +-C_TEXT(_savef21): +-C_TEXT(_savefpr_21): stfd fp21,-88(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef22) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_22) +-C_TEXT(_savef22): +-C_TEXT(_savefpr_22): stfd fp22,-80(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef23) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_23) +-C_TEXT(_savef23): +-C_TEXT(_savefpr_23): stfd fp23,-72(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef24) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_24) +-C_TEXT(_savef24): +-C_TEXT(_savefpr_24): stfd fp24,-64(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef25) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_25) +-C_TEXT(_savef25): +-C_TEXT(_savefpr_25): stfd fp25,-56(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef26) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_26) +-C_TEXT(_savef26): +-C_TEXT(_savefpr_26): stfd fp26,-48(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef27) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_27) +-C_TEXT(_savef27): +-C_TEXT(_savefpr_27): stfd fp27,-40(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef28) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_28) +-C_TEXT(_savef28): +-C_TEXT(_savefpr_28): stfd fp28,-32(r1) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savef29) +- ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_29) +-C_TEXT(_savef29): +-C_TEXT(_savefpr_29): stfd fp29,-24(r1) #save f29 +- stfd fp30,-16(r1) #save f30 +- stfd fp31,-8(r1) #save f31 +- stw r0,8(r1) #save LR in callers frame +- blr #return +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/Dist glibc-2.2.5/sysdeps/powerpc/fpu/Dist +--- glibc-2.2.5.old/sysdeps/powerpc/fpu/Dist Wed Jan 26 17:48:02 2000 ++++ glibc-2.2.5/sysdeps/powerpc/fpu/Dist Thu Jul 10 11:43:17 2003 +@@ -1,3 +1,6 @@ ++fe_nomask.c ++fprrest.S ++fprsave.S + fenv_const.c + fenv_libc.h + t_sqrt.c +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/Makefile glibc-2.2.5/sysdeps/powerpc/fpu/Makefile +--- glibc-2.2.5.old/sysdeps/powerpc/fpu/Makefile Mon Oct 11 15:29:00 1999 ++++ glibc-2.2.5/sysdeps/powerpc/fpu/Makefile Thu Jul 10 11:43:17 2003 +@@ -1,3 +1,7 @@ + ifeq ($(subdir),math) + libm-support += fenv_const fe_nomask t_sqrt + endif ++ ++ifeq ($(subdir),misc) ++sysdep_routines += fprsave fprrest ++endif +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/Versions glibc-2.2.5/sysdeps/powerpc/fpu/Versions +--- glibc-2.2.5.old/sysdeps/powerpc/fpu/Versions Wed Dec 31 16:00:00 1969 ++++ glibc-2.2.5/sysdeps/powerpc/fpu/Versions Thu Jul 10 11:43:17 2003 +@@ -0,0 +1,6 @@ ++libm { ++ GLIBC_2.1 { ++ # symbols used in macros from sysdeps/powerpc/bits/fenv.h ++ __fe_dfl_env; __fe_enabled_env; __fe_nonieee_env; __fe_nomask_env; ++ } ++} +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/__longjmp.S glibc-2.2.5/sysdeps/powerpc/fpu/__longjmp.S +--- glibc-2.2.5.old/sysdeps/powerpc/fpu/__longjmp.S Wed Dec 31 16:00:00 1969 ++++ glibc-2.2.5/sysdeps/powerpc/fpu/__longjmp.S Thu Jul 10 11:43:17 2003 +@@ -0,0 +1,74 @@ ++/* longjmp for PowerPC. ++ Copyright (C) 1995, 1996, 1997, 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 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. */ ++ ++#include <sysdep.h> ++#define _ASM ++#define _SETJMP_H ++#include <bits/setjmp.h> ++#include <bp-sym.h> ++#include <bp-asm.h> ++ ++ENTRY (BP_SYM (__longjmp)) ++ CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE) ++ ++ lwz r1,(JB_GPR1*4)(r3) ++ lwz r2,(JB_GPR2*4)(r3) ++ lwz r0,(JB_LR*4)(r3) ++ lwz r14,((JB_GPRS+0)*4)(r3) ++ lfd fp14,((JB_FPRS+0*2)*4)(r3) ++ lwz r15,((JB_GPRS+1)*4)(r3) ++ lfd fp15,((JB_FPRS+1*2)*4)(r3) ++ lwz r16,((JB_GPRS+2)*4)(r3) ++ lfd fp16,((JB_FPRS+2*2)*4)(r3) ++ lwz r17,((JB_GPRS+3)*4)(r3) ++ lfd fp17,((JB_FPRS+3*2)*4)(r3) ++ lwz r18,((JB_GPRS+4)*4)(r3) ++ lfd fp18,((JB_FPRS+4*2)*4)(r3) ++ lwz r19,((JB_GPRS+5)*4)(r3) ++ lfd fp19,((JB_FPRS+5*2)*4)(r3) ++ lwz r20,((JB_GPRS+6)*4)(r3) ++ lfd fp20,((JB_FPRS+6*2)*4)(r3) ++ mtlr r0 ++ lwz r21,((JB_GPRS+7)*4)(r3) ++ lfd fp21,((JB_FPRS+7*2)*4)(r3) ++ lwz r22,((JB_GPRS+8)*4)(r3) ++ lfd fp22,((JB_FPRS+8*2)*4)(r3) ++ lwz r0,(JB_CR*4)(r3) ++ lwz r23,((JB_GPRS+9)*4)(r3) ++ lfd fp23,((JB_FPRS+9*2)*4)(r3) ++ lwz r24,((JB_GPRS+10)*4)(r3) ++ lfd fp24,((JB_FPRS+10*2)*4)(r3) ++ lwz r25,((JB_GPRS+11)*4)(r3) ++ lfd fp25,((JB_FPRS+11*2)*4)(r3) ++ mtcrf 0xFF,r0 ++ lwz r26,((JB_GPRS+12)*4)(r3) ++ lfd fp26,((JB_FPRS+12*2)*4)(r3) ++ lwz r27,((JB_GPRS+13)*4)(r3) ++ lfd fp27,((JB_FPRS+13*2)*4)(r3) ++ lwz r28,((JB_GPRS+14)*4)(r3) ++ lfd fp28,((JB_FPRS+14*2)*4)(r3) ++ lwz r29,((JB_GPRS+15)*4)(r3) ++ lfd fp29,((JB_FPRS+15*2)*4)(r3) ++ lwz r30,((JB_GPRS+16)*4)(r3) ++ lfd fp30,((JB_FPRS+16*2)*4)(r3) ++ lwz r31,((JB_GPRS+17)*4)(r3) ++ lfd fp31,((JB_FPRS+17*2)*4)(r3) ++ mr r3,r4 ++ blr ++END (BP_SYM (__longjmp)) +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/bits/setjmp.h glibc-2.2.5/sysdeps/powerpc/fpu/bits/setjmp.h +--- glibc-2.2.5.old/sysdeps/powerpc/fpu/bits/setjmp.h Wed Dec 31 16:00:00 1969 ++++ glibc-2.2.5/sysdeps/powerpc/fpu/bits/setjmp.h Thu Jul 10 11:43:17 2003 +@@ -0,0 +1,47 @@ ++/* Copyright (C) 1997, 1998, 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 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. */ ++ ++/* Define the machine-dependent type `jmp_buf'. PowerPC version. */ ++ ++#ifndef _SETJMP_H ++# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead." ++#endif ++ ++/* The previous bits/setjmp.h had __jmp_buf defined as a structure. ++ We use an array of 'long int' instead, to make writing the ++ assembler easier. Naturally, user code should not depend on ++ either representation. */ ++ ++#if defined __USE_MISC || defined _ASM ++# define JB_GPR1 0 /* Also known as the stack pointer */ ++# define JB_GPR2 1 ++# define JB_LR 2 /* The address we will return to */ ++# define JB_GPRS 3 /* GPRs 14 through 31 are saved, 18 in total */ ++# define JB_CR 21 /* Condition code registers. */ ++# define JB_FPRS 22 /* FPRs 14 through 31 are saved, 18*2 words total */ ++# define JB_SIZE (58*4) ++#endif ++ ++#ifndef _ASM ++typedef long int __jmp_buf[58]; ++#endif ++ ++/* Test if longjmp to JMPBUF would unwind the frame ++ containing a local variable at ADDRESS. */ ++#define _JMPBUF_UNWINDS(jmpbuf, address) \ ++ ((void *) (address) < (void *) (jmpbuf)[JB_GPR1]) +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/fclrexcpt.c glibc-2.2.5/sysdeps/powerpc/fpu/fclrexcpt.c +--- glibc-2.2.5.old/sysdeps/powerpc/fpu/fclrexcpt.c Wed Dec 31 16:00:00 1969 ++++ glibc-2.2.5/sysdeps/powerpc/fpu/fclrexcpt.c Thu Jul 5 21:56:01 2001 +@@ -0,0 +1,48 @@ ++/* Clear given exceptions in current floating-point environment. ++ Copyright (C) 1997,99,2000,01 Free Software 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 <fenv_libc.h> ++ ++#undef feclearexcept ++int ++__feclearexcept (int excepts) ++{ ++ fenv_union_t u; ++ ++ /* Get the current state. */ ++ u.fenv = fegetenv_register (); ++ ++ /* Clear the relevant bits. */ ++ u.l[1] = u.l[1] & ~((-(excepts >> (31 - FPSCR_VX) & 1) & FE_ALL_INVALID) ++ | (excepts & FPSCR_STICKY_BITS)); ++ ++ /* Put the new state in effect. */ ++ fesetenv_register (u.fenv); ++ ++ /* Success. */ ++ return 0; ++} ++ ++#include <shlib-compat.h> ++#if SHLIB_COMPAT (libm, GLIBC_2_1, GLIBC_2_2) ++strong_alias (__feclearexcept, __old_feclearexcept) ++compat_symbol (libm, __old_feclearexcept, feclearexcept, GLIBC_2_1); ++#endif ++ ++versioned_symbol (libm, __feclearexcept, feclearexcept, GLIBC_2_2); +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/fe_nomask.c glibc-2.2.5/sysdeps/powerpc/fpu/fe_nomask.c +--- glibc-2.2.5.old/sysdeps/powerpc/fpu/fe_nomask.c Wed Dec 31 16:00:00 1969 ++++ glibc-2.2.5/sysdeps/powerpc/fpu/fe_nomask.c Thu Jul 5 21:56:01 2001 +@@ -0,0 +1,32 @@ ++/* Procedure definition for FE_NOMASK_ENV. ++ Copyright (C) 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. */ ++ ++#include <fenv.h> ++#include <errno.h> ++ ++/* This is presently a stub, until it's decided how the kernels should ++ support this. */ ++ ++const fenv_t * ++__fe_nomask_env(void) ++{ ++ __set_errno (ENOSYS); ++ return FE_ENABLED_ENV; ++} ++stub_warning (__fe_nomask_env) +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/fprrest.S glibc-2.2.5/sysdeps/powerpc/fpu/fprrest.S +--- glibc-2.2.5.old/sysdeps/powerpc/fpu/fprrest.S Wed Dec 31 16:00:00 1969 ++++ glibc-2.2.5/sysdeps/powerpc/fpu/fprrest.S Thu Jul 5 21:56:01 2001 +@@ -0,0 +1,94 @@ ++/* Copyright (C) 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. */ ++ ++/* ++ Floating Point Registers (FPRs) restore routine ++*/ ++ ++#include <sysdep.h> ++ ++ENTRY(_restfpr_all) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf14) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_14) ++C_TEXT(_restf14): ++C_TEXT(_restfpr_14): lfd fp14,-144(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf15) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_15) ++C_TEXT(_restf15): ++C_TEXT(_restfpr_15): lfd fp15,-136(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf16) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_16) ++C_TEXT(_restf16): ++C_TEXT(_restfpr_16): lfd fp16,-128(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf17) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_17) ++C_TEXT(_restf17): ++C_TEXT(_restfpr_17): lfd fp17,-120(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf18) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_18) ++C_TEXT(_restf18): ++C_TEXT(_restfpr_18): lfd fp18,-112(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf19) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_19) ++C_TEXT(_restf19): ++C_TEXT(_restfpr_19): lfd fp19,-104(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf20) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_20) ++C_TEXT(_restf20): ++C_TEXT(_restfpr_20): lfd fp20,-96(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf21) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_21) ++C_TEXT(_restf21): ++C_TEXT(_restfpr_21): lfd fp21,-88(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf22) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_22) ++C_TEXT(_restf22): ++C_TEXT(_restfpr_22): lfd fp22,-80(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf23) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_23) ++C_TEXT(_restf23): ++C_TEXT(_restfpr_23): lfd fp23,-72(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf24) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_24) ++C_TEXT(_restf24): ++C_TEXT(_restfpr_24): lfd fp24,-64(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf25) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_25) ++C_TEXT(_restf25): ++C_TEXT(_restfpr_25): lfd fp25,-56(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf26) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_26) ++C_TEXT(_restf26): ++C_TEXT(_restfpr_26): lfd fp26,-48(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf27) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_27) ++C_TEXT(_restf27): ++C_TEXT(_restfpr_27): lfd fp27,-40(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf28) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_28) ++C_TEXT(_restf28): ++C_TEXT(_restfpr_28): lfd fp28,-32(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restf29) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_restfpr_29) ++C_TEXT(_restf29): ++C_TEXT(_restfpr_29): lwz r0,8(r1) #get return address from frame ++ lfd fp29,-24(r1) #restore f29 ++ mtlr r0 #move return address to LR ++ lfd fp30,-16(r1) #restore f30 ++ lfd fp31,-8(r1) #restore f31 ++ blr #return +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/fprsave.S glibc-2.2.5/sysdeps/powerpc/fpu/fprsave.S +--- glibc-2.2.5.old/sysdeps/powerpc/fpu/fprsave.S Wed Dec 31 16:00:00 1969 ++++ glibc-2.2.5/sysdeps/powerpc/fpu/fprsave.S Thu Jul 5 21:56:01 2001 +@@ -0,0 +1,93 @@ ++/* Copyright (C) 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. */ ++ ++/* ++ Floating Point Registers (FPRs) save routine ++*/ ++ ++#include <sysdep.h> ++ ++ENTRY(_savefpr_all) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef14) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_14) ++C_TEXT(_savef14): ++C_TEXT(_savefpr_14): stfd fp14,-144(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef15) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_15) ++C_TEXT(_savef15): ++C_TEXT(_savefpr_15): stfd fp15,-136(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef16) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_16) ++C_TEXT(_savef16): ++C_TEXT(_savefpr_16): stfd fp16,-128(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef17) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_17) ++C_TEXT(_savef17): ++C_TEXT(_savefpr_17): stfd fp17,-120(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef18) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_18) ++C_TEXT(_savef18): ++C_TEXT(_savefpr_18): stfd fp18,-112(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef19) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_19) ++C_TEXT(_savef19): ++C_TEXT(_savefpr_19): stfd fp19,-104(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef20) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_20) ++C_TEXT(_savef20): ++C_TEXT(_savefpr_20): stfd fp20,-96(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef21) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_21) ++C_TEXT(_savef21): ++C_TEXT(_savefpr_21): stfd fp21,-88(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef22) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_22) ++C_TEXT(_savef22): ++C_TEXT(_savefpr_22): stfd fp22,-80(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef23) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_23) ++C_TEXT(_savef23): ++C_TEXT(_savefpr_23): stfd fp23,-72(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef24) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_24) ++C_TEXT(_savef24): ++C_TEXT(_savefpr_24): stfd fp24,-64(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef25) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_25) ++C_TEXT(_savef25): ++C_TEXT(_savefpr_25): stfd fp25,-56(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef26) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_26) ++C_TEXT(_savef26): ++C_TEXT(_savefpr_26): stfd fp26,-48(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef27) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_27) ++C_TEXT(_savef27): ++C_TEXT(_savefpr_27): stfd fp27,-40(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef28) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_28) ++C_TEXT(_savef28): ++C_TEXT(_savefpr_28): stfd fp28,-32(r1) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savef29) ++ ASM_GLOBAL_DIRECTIVE C_TEXT(_savefpr_29) ++C_TEXT(_savef29): ++C_TEXT(_savefpr_29): stfd fp29,-24(r1) #save f29 ++ stfd fp30,-16(r1) #save f30 ++ stfd fp31,-8(r1) #save f31 ++ stw r0,8(r1) #save LR in callers frame ++ blr #return +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/fpu_control.h glibc-2.2.5/sysdeps/powerpc/fpu/fpu_control.h +--- glibc-2.2.5.old/sysdeps/powerpc/fpu/fpu_control.h Wed Dec 31 16:00:00 1969 ++++ glibc-2.2.5/sysdeps/powerpc/fpu/fpu_control.h Thu Jul 5 21:56:01 2001 +@@ -0,0 +1,67 @@ ++/* FPU control word definitions. PowerPC version. ++ Copyright (C) 1996, 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 _FPU_CONTROL_H ++#define _FPU_CONTROL_H ++ ++/* rounding control */ ++#define _FPU_RC_NEAREST 0x00 /* RECOMMENDED */ ++#define _FPU_RC_DOWN 0x03 ++#define _FPU_RC_UP 0x02 ++#define _FPU_RC_ZERO 0x01 ++ ++#define _FPU_MASK_NI 0x04 /* non-ieee mode */ ++ ++/* masking of interrupts */ ++#define _FPU_MASK_ZM 0x10 /* zero divide */ ++#define _FPU_MASK_OM 0x40 /* overflow */ ++#define _FPU_MASK_UM 0x20 /* underflow */ ++#define _FPU_MASK_XM 0x08 /* inexact */ ++#define _FPU_MASK_IM 0x80 /* invalid operation */ ++ ++#define _FPU_RESERVED 0xffffff00 /* These bits are reserved are not changed. */ ++ ++/* The fdlibm code requires no interrupts for exceptions. */ ++#define _FPU_DEFAULT 0x00000000 /* Default value. */ ++ ++/* IEEE: same as above, but (some) exceptions; ++ we leave the 'inexact' exception off. ++ */ ++#define _FPU_IEEE 0x000000f0 ++ ++/* Type of the control word. */ ++typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__))); ++ ++/* Macros for accessing the hardware control word. */ ++#define _FPU_GETCW(cw) ( { \ ++ union { double d; fpu_control_t cw[2]; } tmp __attribute__ ((__aligned__(8))); \ ++ __asm__ ("mffs 0; stfd%U0 0,%0" : "=m" (tmp.d) : : "fr0"); \ ++ (cw)=tmp.cw[1]; \ ++ tmp.cw[1]; } ) ++#define _FPU_SETCW(cw) { \ ++ union { double d; fpu_control_t cw[2]; } tmp __attribute__ ((__aligned__(8))); \ ++ tmp.cw[0] = 0xFFF80000; /* More-or-less arbitrary; this is a QNaN. */ \ ++ tmp.cw[1] = cw; \ ++ __asm__ ("lfd%U0 0,%0; mtfsf 255,0" : : "m" (tmp.d) : "fr0"); \ ++} ++ ++/* Default control word set at startup. */ ++extern fpu_control_t __fpu_control; ++ ++#endif /* _FPU_CONTROL_H */ +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu/setjmp.S glibc-2.2.5/sysdeps/powerpc/fpu/setjmp.S +--- glibc-2.2.5.old/sysdeps/powerpc/fpu/setjmp.S Wed Dec 31 16:00:00 1969 ++++ glibc-2.2.5/sysdeps/powerpc/fpu/setjmp.S Thu Jul 10 11:43:44 2003 +@@ -0,0 +1,73 @@ ++/* setjmp for PowerPC. ++ Copyright (C) 1995, 1996, 1997, 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 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. */ ++ ++#include <sysdep.h> ++#define _ASM ++#define _SETJMP_H ++#include <bits/setjmp.h> ++#include <bp-sym.h> ++#include <bp-asm.h> ++ ++ENTRY (BP_SYM (__sigsetjmp)) ++ CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE) ++ ++ stw r1,(JB_GPR1*4)(3) ++ mflr r0 ++ stw r2,(JB_GPR2*4)(3) ++ stw r14,((JB_GPRS+0)*4)(3) ++ stfd fp14,((JB_FPRS+0*2)*4)(3) ++ stw r0,(JB_LR*4)(3) ++ stw r15,((JB_GPRS+1)*4)(3) ++ stfd fp15,((JB_FPRS+1*2)*4)(3) ++ mfcr r0 ++ stw r16,((JB_GPRS+2)*4)(3) ++ stfd fp16,((JB_FPRS+2*2)*4)(3) ++ stw r0,(JB_CR*4)(3) ++ stw r17,((JB_GPRS+3)*4)(3) ++ stfd fp17,((JB_FPRS+3*2)*4)(3) ++ stw r18,((JB_GPRS+4)*4)(3) ++ stfd fp18,((JB_FPRS+4*2)*4)(3) ++ stw r19,((JB_GPRS+5)*4)(3) ++ stfd fp19,((JB_FPRS+5*2)*4)(3) ++ stw r20,((JB_GPRS+6)*4)(3) ++ stfd fp20,((JB_FPRS+6*2)*4)(3) ++ stw r21,((JB_GPRS+7)*4)(3) ++ stfd fp21,((JB_FPRS+7*2)*4)(3) ++ stw r22,((JB_GPRS+8)*4)(3) ++ stfd fp22,((JB_FPRS+8*2)*4)(3) ++ stw r23,((JB_GPRS+9)*4)(3) ++ stfd fp23,((JB_FPRS+9*2)*4)(3) ++ stw r24,((JB_GPRS+10)*4)(3) ++ stfd fp24,((JB_FPRS+10*2)*4)(3) ++ stw r25,((JB_GPRS+11)*4)(3) ++ stfd fp25,((JB_FPRS+11*2)*4)(3) ++ stw r26,((JB_GPRS+12)*4)(3) ++ stfd fp26,((JB_FPRS+12*2)*4)(3) ++ stw r27,((JB_GPRS+13)*4)(3) ++ stfd fp27,((JB_FPRS+13*2)*4)(3) ++ stw r28,((JB_GPRS+14)*4)(3) ++ stfd fp28,((JB_FPRS+14*2)*4)(3) ++ stw r29,((JB_GPRS+15)*4)(3) ++ stfd fp29,((JB_FPRS+15*2)*4)(3) ++ stw r30,((JB_GPRS+16)*4)(3) ++ stfd fp30,((JB_FPRS+16*2)*4)(3) ++ stw r31,((JB_GPRS+17)*4)(3) ++ stfd fp31,((JB_FPRS+17*2)*4)(3) ++ b JUMPTARGET (BP_SYM (__sigjmp_save)) ++END (BP_SYM (__sigsetjmp)) +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/fpu_control.h glibc-2.2.5/sysdeps/powerpc/fpu_control.h +--- glibc-2.2.5.old/sysdeps/powerpc/fpu_control.h Thu Jul 5 21:56:01 2001 ++++ glibc-2.2.5/sysdeps/powerpc/fpu_control.h Wed Dec 31 16:00:00 1969 +@@ -1,67 +0,0 @@ +-/* FPU control word definitions. PowerPC version. +- Copyright (C) 1996, 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 _FPU_CONTROL_H +-#define _FPU_CONTROL_H +- +-/* rounding control */ +-#define _FPU_RC_NEAREST 0x00 /* RECOMMENDED */ +-#define _FPU_RC_DOWN 0x03 +-#define _FPU_RC_UP 0x02 +-#define _FPU_RC_ZERO 0x01 +- +-#define _FPU_MASK_NI 0x04 /* non-ieee mode */ +- +-/* masking of interrupts */ +-#define _FPU_MASK_ZM 0x10 /* zero divide */ +-#define _FPU_MASK_OM 0x40 /* overflow */ +-#define _FPU_MASK_UM 0x20 /* underflow */ +-#define _FPU_MASK_XM 0x08 /* inexact */ +-#define _FPU_MASK_IM 0x80 /* invalid operation */ +- +-#define _FPU_RESERVED 0xffffff00 /* These bits are reserved are not changed. */ +- +-/* The fdlibm code requires no interrupts for exceptions. */ +-#define _FPU_DEFAULT 0x00000000 /* Default value. */ +- +-/* IEEE: same as above, but (some) exceptions; +- we leave the 'inexact' exception off. +- */ +-#define _FPU_IEEE 0x000000f0 +- +-/* Type of the control word. */ +-typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__SI__))); +- +-/* Macros for accessing the hardware control word. */ +-#define _FPU_GETCW(cw) ( { \ +- union { double d; fpu_control_t cw[2]; } tmp __attribute__ ((__aligned__(8))); \ +- __asm__ ("mffs 0; stfd%U0 0,%0" : "=m" (tmp.d) : : "fr0"); \ +- (cw)=tmp.cw[1]; \ +- tmp.cw[1]; } ) +-#define _FPU_SETCW(cw) { \ +- union { double d; fpu_control_t cw[2]; } tmp __attribute__ ((__aligned__(8))); \ +- tmp.cw[0] = 0xFFF80000; /* More-or-less arbitrary; this is a QNaN. */ \ +- tmp.cw[1] = cw; \ +- __asm__ ("lfd%U0 0,%0; mtfsf 255,0" : : "m" (tmp.d) : "fr0"); \ +-} +- +-/* Default control word set at startup. */ +-extern fpu_control_t __fpu_control; +- +-#endif /* _FPU_CONTROL_H */ +diff -Naur glibc-2.2.5.old/sysdeps/powerpc/setjmp.S glibc-2.2.5/sysdeps/powerpc/setjmp.S +--- glibc-2.2.5.old/sysdeps/powerpc/setjmp.S Thu Jul 5 21:56:01 2001 ++++ glibc-2.2.5/sysdeps/powerpc/setjmp.S Thu Jul 10 11:43:44 2003 +@@ -24,6 +24,8 @@ + #include <bp-sym.h> + #include <bp-asm.h> + ++/* The FPU stores have been removed from this file - see fpu/setjmp.S */ ++ + ENTRY (BP_SYM (__sigsetjmp)) + CHECK_BOUNDS_BOTH_WIDE_LIT (r3, r8, r9, JB_SIZE) + +@@ -31,43 +33,25 @@ + mflr r0 + stw r2,(JB_GPR2*4)(3) + stw r14,((JB_GPRS+0)*4)(3) +- stfd fp14,((JB_FPRS+0*2)*4)(3) + stw r0,(JB_LR*4)(3) + stw r15,((JB_GPRS+1)*4)(3) +- stfd fp15,((JB_FPRS+1*2)*4)(3) + mfcr r0 + stw r16,((JB_GPRS+2)*4)(3) +- stfd fp16,((JB_FPRS+2*2)*4)(3) + stw r0,(JB_CR*4)(3) + stw r17,((JB_GPRS+3)*4)(3) +- stfd fp17,((JB_FPRS+3*2)*4)(3) + stw r18,((JB_GPRS+4)*4)(3) +- stfd fp18,((JB_FPRS+4*2)*4)(3) + stw r19,((JB_GPRS+5)*4)(3) +- stfd fp19,((JB_FPRS+5*2)*4)(3) + stw r20,((JB_GPRS+6)*4)(3) +- stfd fp20,((JB_FPRS+6*2)*4)(3) + stw r21,((JB_GPRS+7)*4)(3) +- stfd fp21,((JB_FPRS+7*2)*4)(3) + stw r22,((JB_GPRS+8)*4)(3) +- stfd fp22,((JB_FPRS+8*2)*4)(3) + stw r23,((JB_GPRS+9)*4)(3) +- stfd fp23,((JB_FPRS+9*2)*4)(3) + stw r24,((JB_GPRS+10)*4)(3) +- stfd fp24,((JB_FPRS+10*2)*4)(3) + stw r25,((JB_GPRS+11)*4)(3) +- stfd fp25,((JB_FPRS+11*2)*4)(3) + stw r26,((JB_GPRS+12)*4)(3) +- stfd fp26,((JB_FPRS+12*2)*4)(3) + stw r27,((JB_GPRS+13)*4)(3) +- stfd fp27,((JB_FPRS+13*2)*4)(3) + stw r28,((JB_GPRS+14)*4)(3) +- stfd fp28,((JB_FPRS+14*2)*4)(3) + stw r29,((JB_GPRS+15)*4)(3) +- stfd fp29,((JB_FPRS+15*2)*4)(3) + stw r30,((JB_GPRS+16)*4)(3) +- stfd fp30,((JB_FPRS+16*2)*4)(3) + stw r31,((JB_GPRS+17)*4)(3) +- stfd fp31,((JB_FPRS+17*2)*4)(3) + b JUMPTARGET (BP_SYM (__sigjmp_save)) + END (BP_SYM (__sigsetjmp)) diff --git a/patches/glibc/2.2.5/glibc-2.2.5-i386-pwrite64.patch b/patches/glibc/2.2.5/glibc-2.2.5-i386-pwrite64.patch new file mode 100644 index 00000000..761771f8 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-i386-pwrite64.patch @@ -0,0 +1,20 @@ +diff -urN glibc-2.2.5-orig/sysdeps/unix/sysv/linux/i386/sysdep.h glibc-2.2.5/sysdeps/unix/sysv/linux/i386/sysdep.h +--- glibc-2.2.5-orig/sysdeps/unix/sysv/linux/i386/sysdep.h 2001-07-06 06:56:16.000000000 +0200 ++++ glibc-2.2.5/sysdeps/unix/sysv/linux/i386/sysdep.h 2004-09-03 12:35:44.000000000 +0200 +@@ -36,6 +36,16 @@ + #undef L + #define L(name) .L##name + ++/* This is a kludge to make syscalls.list find these under the names ++ * pread and pwrite, since some kernel headers define those names ++ * and some define the *64 names for the same system calls. */ ++#if !defined __NR_pread && defined __NR_pread64 ++# define __NR_pread __NR_pread64 ++#endif ++#if !defined __NR_pwrite && defined __NR_pwrite64 ++# define __NR_pwrite __NR_pwrite64 ++#endif ++ + #ifdef __ASSEMBLER__ + + /* Linux uses a negative return value to indicate syscall errors, diff --git a/patches/glibc/2.2.5/glibc-2.2.5-m68k-pwrite.patch b/patches/glibc/2.2.5/glibc-2.2.5-m68k-pwrite.patch new file mode 100644 index 00000000..eefc6fa7 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-m68k-pwrite.patch @@ -0,0 +1,32 @@ +Copied from similar patch for other architectures. + +Should fix this error: +../sysdeps/unix/sysv/linux/pread.c: In function `__libc_pread': +../sysdeps/unix/sysv/linux/pread.c:53: `__NR_pread' undeclared (first use in this function) +../sysdeps/unix/sysv/linux/pread.c:53: (Each undeclared identifier is reported only once +../sysdeps/unix/sysv/linux/pread.c:53: for each function it appears in.) +make[2]: *** [/home/dank/wk/crosstool-0.28-rc37/build/m68k-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.5/build-glibc/posix/pread.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/m68k-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.5/glibc-2.2.5/posix' +make[1]: *** [posix/subdir_lib] Error 2 +make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/m68k-unknown-linux-gnu/gcc-2.95.3-glibc-2.2.5/glibc-2.2.5' +make: *** [all] Error 2 + +--- glibc-2.2.5/sysdeps/unix/sysv/linux/m68k/sysdep.h.old 2004-10-05 08:37:37.000000000 -0700 ++++ glibc-2.2.5/sysdeps/unix/sysv/linux/m68k/sysdep.h 2004-10-05 08:38:22.000000000 -0700 +@@ -32,6 +32,16 @@ + # define SYS_ify(syscall_name) __NR_/**/syscall_name + #endif + ++/* This is a kludge to make syscalls.list find these under the names ++ pread and pwrite, since some kernel headers define those names ++ and some define the *64 names for the same system calls. */ ++#if !defined __NR_pread && defined __NR_pread64 ++# define __NR_pread __NR_pread64 ++#endif ++#if !defined __NR_pwrite && defined __NR_pwrite64 ++# define __NR_pwrite __NR_pwrite64 ++#endif ++ + #ifdef __ASSEMBLER__ + + /* Linux uses a negative return value to indicate syscall errors, unlike diff --git a/patches/glibc/2.2.5/glibc-2.2.5-mips-build-gmon.patch b/patches/glibc/2.2.5/glibc-2.2.5-mips-build-gmon.patch new file mode 100644 index 00000000..a8267e61 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-mips-build-gmon.patch @@ -0,0 +1,86 @@ +From http://www.ltc.com/~brad/mips/glibc-2.2.5-mips-build-gmon.diff +See http://www.ltc.com/~brad/mips/mips-cross-toolchain.html + +--- glibc-2.2.5/sysdeps/mips/machine-gmon.h 2001-08-13 04:42:44.000000000 -0400 ++++ glibc-2.2.5/sysdeps/mips/machine-gmon.h 2002-09-25 17:10:59.000000000 -0400 +@@ -17,42 +17,52 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + +-#define _MCOUNT_DECL static void __mcount ++#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, + and the return PC our caller will return to. */ + #ifdef __PIC__ + #define CPLOAD ".cpload $25;" ++#define CPRESTORE ".cprestore 44\n\t" + #else + #define CPLOAD ++#define CPRESTORE + #endif + + #define MCOUNT asm(\ +- ".globl _mcount;" \ +- ".align 2;" \ +- ".type _mcount,@function;" \ +- "_mcount:;" \ +- ".set noreorder;" \ +- ".set noat;" \ ++ ".globl _mcount;\n\t" \ ++ ".align 2;\n\t" \ ++ ".type _mcount,@function;\n\t" \ ++ ".ent _mcount\n\t" \ ++ "_mcount:\n\t" \ ++ ".frame $sp,44,$31\n\t" \ ++ ".set noreorder;\n\t" \ ++ ".set noat;\n\t" \ + CPLOAD \ +- "sw $4,8($29);" \ +- "sw $5,12($29);" \ +- "sw $6,16($29);" \ +- "sw $7,20($29);" \ +- "sw $1,0($29);" \ +- "sw $31,4($29);" \ +- "move $5,$31;" \ +- "move $4,$1;" \ +- "jal __mcount;" \ +- "nop;" \ +- "lw $4,8($29);" \ +- "lw $5,12($29);" \ +- "lw $6,16($29);" \ +- "lw $7,20($29);" \ +- "lw $31,4($29);" \ +- "lw $1,0($29);" \ +- "addu $29,$29,8;" \ +- "j $31;" \ +- "move $31,$1;" \ +- ".set reorder;" \ +- ".set at"); ++ "subu $29,$29,48;\n\t" \ ++ CPRESTORE \ ++ "sw $4,24($29);\n\t" \ ++ "sw $5,28($29);\n\t" \ ++ "sw $6,32($29);\n\t" \ ++ "sw $7,36($29);\n\t" \ ++ "sw $2,40($29);\n\t" \ ++ "sw $1,16($29);\n\t" \ ++ "sw $31,20($29);\n\t" \ ++ "move $5,$31;\n\t" \ ++ "move $4,$1;\n\t" \ ++ "jal __mcount;\n\t" \ ++ "nop;\n\t" \ ++ "lw $4,24($29);\n\t" \ ++ "lw $5,28($29);\n\t" \ ++ "lw $6,32($29);\n\t" \ ++ "lw $7,36($29);\n\t" \ ++ "lw $2,40($29);\n\t" \ ++ "lw $31,20($29);\n\t" \ ++ "lw $1,16($29);\n\t" \ ++ "addu $29,$29,56;\n\t" \ ++ "j $31;\n\t" \ ++ "move $31,$1;\n\t" \ ++ ".set reorder;\n\t" \ ++ ".set at\n\t" \ ++ ".end _mcount"); diff --git a/patches/glibc/2.2.5/glibc-2.2.5-mips-clone-local-label.patch b/patches/glibc/2.2.5/glibc-2.2.5-mips-clone-local-label.patch new file mode 100644 index 00000000..66fee299 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-mips-clone-local-label.patch @@ -0,0 +1,47 @@ +This is a workaround for + +mipsel-unknown-linux-gnu-gcc ../sysdeps/unix/sysv/linux/mips/clone.S -c -I../include -I. -I/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc -I.. -I../libio -I/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc -I../sysdeps/mips/elf -I../linuxthreads/sysdeps/unix/sysv/linux -I../linuxthreads/sysdeps/pthread -I../sysdeps/pthread -I../linuxthreads/sysdeps/unix/sysv -I../linuxthreads/sysdeps/unix -I../linuxthreads/sysdeps/mips -I../sysdeps/unix/sysv/linux/mips -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix/mips -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/mips/mipsel -I../sysdeps/mips/fpu -I../sysdeps/mips -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic -nostdinc -isystem /home3/dank/crosstool-0.7/result/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/lib/gcc-lib/mipsel-unknown-linux-gnu/3.2.3/include -isystem /home3/dank/crosstool-0.7/result/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/mipsel-unknown-linux-gnu/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h -DPIC -DASSEMBLER -o /home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc/clone.o +../sysdeps/unix/sysv/linux/mips/clone.S: Assembler messages: +../sysdeps/unix/sysv/linux/mips/clone.S:66: Error: Can not represent BFD_RELOC_16_PCREL_S2 relocation in this object file format +make[2]: *** [/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc/clone.o] Error 1 + +which was using h.j.lu's binutils-2.13.90.0.18. + + +But see http://lists.debian.org/debian-mips/2003/debian-mips-200305/msg00011.html +which says +"A newer version of binutils (CVS post 2003-03-12) fixes it without +the need of changing perfectly legal code." +So presumably this can be ditched sooner or later. + +From http://honk.physik.uni-konstanz.de/~agx/linux-mips/glibc/patches/applied/clone-local-label.diff + +2003-03-13 Guido Guenther <agx@sigxcpu.org> + + * 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. + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/mips/clone.S,v +retrieving revision 1.10 +diff -u -r1.10 clone.S +--- glibc-2.2.5/sysdeps/unix/sysv/linux/mips/clone.S 12 Mar 2003 01:04:51 -0000 1.10 ++++ glibc-2.2.5/sysdeps/unix/sysv/linux/mips/clone.S 12 Mar 2003 19:04:39 -0000 +@@ -63,7 +63,7 @@ + syscall + + bnez a3,error +- beqz v0,__thread_start ++ beqz v0,.Lthread_start + + /* Successful return from the parent */ + addiu sp,32 +@@ -85,6 +85,7 @@ + debug info. */ + + ENTRY(__thread_start) ++.Lthread_start: + /* cp is already loaded. */ + .cprestore 16 + /* The stackframe has been created on entry of clone(). */ diff --git a/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.56.patch b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.56.patch new file mode 100644 index 00000000..4276eee9 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.56.patch @@ -0,0 +1,31 @@ +wget http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/mips/dl-machine.h.diff?r1=1.55&r2=1.56&cvsroot=glibc + +Changelog: + (__dl_runtime_resolve): Remove `const' from `got'. + +Fixes error + +dl-runtime.c: In function `__dl_runtime_resolve': +dl-runtime.c:235: error: assignment of read-only location +make[2]: *** [/home/dank/crosstool-0.28-rc32/build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/build-glibc/elf/dl-runtime.o] Error 1 + +when building mipsel-gcc-3.4.0-glibc-2.2.5 + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/mips/dl-machine.h,v +retrieving revision 1.55 +retrieving revision 1.56 +diff -u -r1.55 -r1.56 +--- libc/sysdeps/mips/dl-machine.h 2001/09/08 17:16:44 1.55 ++++ libc/sysdeps/mips/dl-machine.h 2002/01/17 23:21:33 1.56 +@@ -276,8 +276,8 @@ + = (const void *) 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]); \ ++ ElfW(Addr) *got \ ++ = (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 \ diff --git a/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.57.patch b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.57.patch new file mode 100644 index 00000000..129cffad --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.57.patch @@ -0,0 +1,43 @@ +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/mips/dl-machine.h.diff?r1=1.57&r2=1.58&cvsroot=glibc' + +ChangeLog: + (ELF_MACHINE_BEFORE_RTLD_RELOC): Don't use label at end of compound statement. + +Fixes error + +rtld.c: In function `_dl_start': +rtld.c:183: error: label at end of compound statement +make[2]: *** [/home/dank/wk/crosstool-0.28-rc32/build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/build-glibc/elf/rtld.os] Error 1 + + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/mips/dl-machine.h,v +retrieving revision 1.56 +retrieving revision 1.57 +diff -u -r1.56 -r1.57 +--- libc/sysdeps/mips/dl-machine.h 2002/01/17 23:21:33 1.56 ++++ libc/sysdeps/mips/dl-machine.h 2002/01/29 02:58:00 1.57 +@@ -1,5 +1,5 @@ + /* Machine-dependent ELF dynamic relocation inline functions. MIPS version. +- Copyright (C) 1996,1997,1998,1999,2000,2001 Free Software Foundation, Inc. ++ Copyright (C) 1996-2001, 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Kazumoto Kojima <kkojima@info.kanagawa-u.ac.jp>. + +@@ -132,7 +132,7 @@ + got = (ElfW(Addr) *) D_PTR (map, l_info[DT_PLTGOT]); \ + \ + if (__builtin_expect (map->l_addr == 0, 1)) \ +- goto done; \ ++ break; \ + \ + /* got[0] is reserved. got[1] is also reserved for the dynamic object \ + generated by gnu ld. Skip these reserved entries from \ +@@ -169,7 +169,6 @@ + got++; \ + sym++; \ + } \ +-done: \ + } while(0) + + diff --git a/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.59-kinda.patch b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.59-kinda.patch new file mode 100644 index 00000000..ef174c26 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.59-kinda.patch @@ -0,0 +1,35 @@ +Fixes error + +In file included from dynamic-link.h:21, + from dl-load.c:32: +../sysdeps/mips/dl-machine.h:454: error: parse error before "$29" +../sysdeps/mips/dl-machine.h:454: warning: type defaults to `int' in declaration of `$29' +../sysdeps/mips/dl-machine.h:454: error: stray '\' in program +../sysdeps/mips/dl-machine.h:454: error: syntax error at '#' token +../sysdeps/mips/dl-machine.h:454: error: stray '\' in program +../sysdeps/mips/dl-machine.h:454: error: stray '\' in program +../sysdeps/mips/dl-machine.h:454: error: syntax error at '#' token +../sysdeps/mips/dl-machine.h:454: error: stray '\' in program +../sysdeps/mips/dl-machine.h:454: error: stray '\' in program +../sysdeps/mips/dl-machine.h:454: error: stray '\' in program +../sysdeps/mips/dl-machine.h:454: error: stray '\' in program +../sysdeps/mips/dl-machine.h:454: error: missing terminating " character +... +make[2]: *** [/home/dank/wk/crosstool-0.28-rc24/build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/build-glibc/elf/dl-load.o] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc24/build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/glibc-2.2.5/elf' + +See also http://sources.redhat.com/ml/crossgcc/2003-12/msg00014.html + +=================================================================== +diff -u -r1.58 -r1.59 +--- libc/sysdeps/mips/dl-machine.h 2002/02/01 01:31:55 1.58 ++++ libc/sysdeps/mips/dl-machine.h 2002/02/03 00:29:15 1.59 +@@ -449,7 +449,7 @@ + addu $7, $7, 4\n\ + subu $29, 16\n\ + # Call the function to run the initializers.\n\ +- jal _dl_init ++ jal _dl_init\n\ + addiu $29, 16\n\ + # Pass our finalizer function to the user in $2 as per ELF ABI.\n\ + la $2, _dl_fini\n\ diff --git a/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.60.patch b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.60.patch new file mode 100644 index 00000000..ea3e28c4 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-mips-dl-machine-1.60.patch @@ -0,0 +1,53 @@ +Message-ID: <20040926095115.9204.qmail@webmail-2-5.mesa1.secureserver.net> +Date: Sun, 26 Sep 2004 02:51:15 -0700 +From: ml@bitbash.net +Subject: RE: crosstool-0.28-rc36: ld.so.1 undefined reference +To: Dan Kegel <dank@kegel.com> +cc: crossgcc@sources.redhat.com + +gcc-3.4.0-glibc-2.2.5 barfs with a few undefined refereces and multiple +definitions. The follwing patch seems to take care of the undefined +reference of __dl_runtime_resolve symbol. + +Filename: patches/glibc-2.2.5/glibc-2.2.5-mips-dl-machine-1.60.patch +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Retrieved with +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/mips/dl-machine.h.diff?r1=1.59&r2=1.60&cvsroot=glibc' +See http://sources.redhat.com/ml/libc-alpha/2002-02/msg00091.html +See also glibc-2.2.5-mips-build-gmon.patch, which takes care of the other part of this for mips. + +ChangeLog: + sysdeps/mips/dl-machine.h (elf_machine_matches_host): Use + __attribute_used__. + (__dl_runtime_resolve): Likewise. + +Fixes error + +/home/cross/crosstool-0.28-rc36/build/mips-unknown-linux-gnu/gcc-3.4.0-glibc-2.2.5/build-glibc/elf/ld.so.1: +undefined reference to `__dl_runtime_resolve' + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/mips/dl-machine.h,v +retrieving revision 1.59 +retrieving revision 1.60 +diff -u -r1.59 -r1.60 +--- libc/sysdeps/mips/dl-machine.h 2002/02/03 00:29:15 1.59 ++++ libc/sysdeps/mips/dl-machine.h 2002/02/08 18:56:57 1.60 +@@ -69,7 +69,7 @@ + } while (0) + + /* Return nonzero iff ELF header is compatible with the running host. */ +-static inline int __attribute__ ((unused)) ++static inline int __attribute_used__ + elf_machine_matches_host (const ElfW(Ehdr) *ehdr) + { + switch (ehdr->e_machine) +@@ -262,7 +262,7 @@ + /* 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)); \ ++ __attribute_used__; \ + \ + static ElfW(Addr) \ + __dl_runtime_resolve (ElfW(Word) sym_index, \ diff --git a/patches/glibc/2.2.5/glibc-2.2.5-powerpc-as.patch b/patches/glibc/2.2.5/glibc-2.2.5-powerpc-as.patch new file mode 100644 index 00000000..c070bd4c --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-powerpc-as.patch @@ -0,0 +1,29 @@ +Based on glibc-2.3.2/glibc-2.3.2-powerpc-as.patch + +Fixes the following errors when building glibc for ppc7450: + +/tmp/ccwlHdbl.s: Assembler messages: +/tmp/ccwlHdbl.s:73: Error: Unrecognized opcode: `stvx' +/tmp/ccwlHdbl.s:74: Error: Unrecognized opcode: `mfvrsave' +/tmp/ccwlHdbl.s:300: Error: Unrecognized opcode: `lvx' +/tmp/ccwlHdbl.s:302: Error: Unrecognized opcode: `mtvrsave' +make[2]: *** [/usr/local/src/crosstool-0.28-rc34/build/powerpc-7450-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libio/iopopen.o] Error 1 +make[2]: Leaving directory `/home/local/src/crosstool-0.28-rc34/build/powerpc-7450-linux-gnu/gcc-3.2.3-glibc-2.2.5/glibc-2.2.5/libio' +make[1]: *** [libio/subdir_lib] Error 2 +make[1]: Leaving directory `/home/local/src/crosstool-0.28-rc34/build/powerpc-7450-linux-gnu/gcc-3.2.3-glibc-2.2.5/glibc-2.2.5' +make: *** [all] Error 2 + +Contributed by Tom Warzeka <waz@quahog.npt.nuwc.navy.mil> + +=================================================================== +--- glibc-2.2.5/sysdeps/powerpc/Makefile~ 2004-08-31 14:59:15.000000000 -0400 ++++ glibc-2.2.5/sysdeps/powerpc/Makefile 2004-09-02 19:47:21.000000000 -0400 +@@ -1,7 +1,6 @@ + # We always want to use the new mnemonic syntax even if we are on a RS6000 + # machine. +-+cflags += -mnew-mnemonics -Wa,-mppc -mpowerpc +-asm-CPPFLAGS += -Wa,-mppc +++cflags += -mnew-mnemonics + + ifeq ($(subdir),gmon) + sysdep_routines += ppc-mcount diff --git a/patches/glibc/2.2.5/glibc-2.2.5-ppc405erratum77.patch b/patches/glibc/2.2.5/glibc-2.2.5-ppc405erratum77.patch new file mode 100644 index 00000000..2267f856 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.2.5-ppc405erratum77.patch @@ -0,0 +1,65 @@ +# see http://bugs.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&pr=4155 +# and http://www.kegel.com/xgcc3/ppc405erratum77.html +# See also matching patch for linuxthreads + +diff -aur glibc-2.2.5.orig/sysdeps/powerpc/atomicity.h glibc-2.2.5/sysdeps/powerpc/atomicity.h +--- glibc-2.2.5.orig/sysdeps/powerpc/atomicity.h Thu Jul 5 21:56:01 2001 ++++ glibc-2.2.5/sysdeps/powerpc/atomicity.h Tue Jul 23 05:39:38 2002 +@@ -28,6 +28,17 @@ + # define __ATOMICITY_INLINE inline + #endif + ++#ifdef __PPC405__ ++/* workaround for PPC405 erratum #77 - Mark Hatle, dank. References: ++ http://www-3.ibm.com/chips/techlib/techlib.nsf/techdocs/89DED00DEBFF54BF87256A8000491BA2/$file/405CR_C_errata_1_2.pdf ++ http://ppc.bkbits.net:8080/linuxppc_2_4_devel/cset@1.489 ++ http://www.kegel.com/xgcc3/ppc405erratum77.html ++ FIXME: using dbct instead of sync would be faster */ ++#define __LIBC_PPC405_ERR77_SYNC "sync \n\t" ++#else ++#define __LIBC_PPC405_ERR77_SYNC ++#endif ++ + static __ATOMICITY_INLINE int + __attribute__ ((unused)) + exchange_and_add (volatile uint32_t *mem, int val) +@@ -36,6 +47,7 @@ + __asm__ ("\n\ + 0: lwarx %0,0,%2 \n\ + add%I3 %1,%0,%3 \n\ ++ " __LIBC_PPC405_ERR77_SYNC "\n\ + stwcx. %1,0,%2 \n\ + bne- 0b \n\ + " : "=&b"(result), "=&r"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory"); +@@ -50,6 +62,7 @@ + __asm__ ("\n\ + 0: lwarx %0,0,%1 \n\ + add%I2 %0,%0,%2 \n\ ++ " __LIBC_PPC405_ERR77_SYNC "\n\ + stwcx. %0,0,%1 \n\ + bne- 0b \n\ + " : "=&b"(tmp) : "r" (mem), "Ir"(val) : "cr0", "memory"); +@@ -65,6 +78,7 @@ + sub%I2c. %0,%0,%2 \n\ + cntlzw %0,%0 \n\ + bne- 1f \n\ ++ " __LIBC_PPC405_ERR77_SYNC "\n\ + stwcx. %3,0,%1 \n\ + bne- 0b \n\ + 1: \n\ +@@ -79,6 +93,7 @@ + long int result; + __asm__ ("\n\ + 0: lwarx %0,0,%1 \n\ ++ " __LIBC_PPC405_ERR77_SYNC "\n\ + stwcx. %2,0,%1 \n\ + bne- 0b \n\ + " : "=&r"(result) : "r"(p), "r"(newval) : "cr0", "memory"); +@@ -94,6 +109,7 @@ + 0: lwarx %0,0,%1 \n\ + cmpwi %0,0 \n\ + bne- 1f \n\ ++ " __LIBC_PPC405_ERR77_SYNC "\n\ + stwcx. %2,0,%1 \n\ + bne- 0b \n\ + 1: \n\ diff --git a/patches/glibc/2.2.5/glibc-2.3.2-allow-gcc-3.5-xdr.patch b/patches/glibc/2.2.5/glibc-2.3.2-allow-gcc-3.5-xdr.patch new file mode 100644 index 00000000..4d811e9f --- /dev/null +++ b/patches/glibc/2.2.5/glibc-2.3.2-allow-gcc-3.5-xdr.patch @@ -0,0 +1,44 @@ +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sunrpc/rpc/xdr.h.diff?r1=1.27&r2=1.28&cvsroot=glibc +(but see also http://sources.redhat.com/ml/libc-alpha/2004-03/msg00267.html +and http://gcc.gnu.org/ml/gcc-patches/2004-03/msg02056.html) + +Fixes errors + +rpc_cmsg.c: In function `xdr_callmsg': +rpc_cmsg.c:70: error: invalid lvalue in increment +rpc_cmsg.c:71: error: invalid lvalue in increment +rpc_cmsg.c:74: error: invalid lvalue in increment +rpc_cmsg.c:77: error: invalid lvalue in increment +rpc_cmsg.c:78: error: invalid lvalue in increment +rpc_cmsg.c:79: error: invalid lvalue in increment +rpc_cmsg.c:81: error: invalid lvalue in increment +rpc_cmsg.c:89: error: invalid lvalue in increment +rpc_cmsg.c:106: error: invalid lvalue in increment +rpc_cmsg.c:107: error: invalid lvalue in increment +rpc_cmsg.c:112: error: invalid lvalue in increment +rpc_cmsg.c:117: error: invalid lvalue in increment +rpc_cmsg.c:118: error: invalid lvalue in increment +rpc_cmsg.c:119: error: invalid lvalue in increment +rpc_cmsg.c:121: error: invalid lvalue in increment +rpc_cmsg.c:160: error: invalid lvalue in increment + +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/rpc/xdr.h,v +retrieving revision 1.27 +retrieving revision 1.28 +diff -u -r1.27 -r1.28 +--- libc/sunrpc/rpc/xdr.h 2002/12/16 02:05:49 1.27 ++++ libc/sunrpc/rpc/xdr.h 2004/03/22 10:52:33 1.28 +@@ -262,10 +262,8 @@ + * and shouldn't be used any longer. Code which use this defines or longs + * in the RPC code will not work on 64bit Solaris platforms ! + */ +-#define IXDR_GET_LONG(buf) \ +- ((long)ntohl((u_long)*__extension__((u_int32_t*)(buf))++)) +-#define IXDR_PUT_LONG(buf, v) \ +- (*__extension__((u_int32_t*)(buf))++ = (long)htonl((u_long)(v))) ++#define IXDR_GET_LONG(buf) ((long)IXDR_GET_U_INT32(buf)) ++#define IXDR_PUT_LONG(buf, v) ((long)IXDR_PUT_INT32(buf, (long)(v))) + #define IXDR_GET_U_LONG(buf) ((u_long)IXDR_GET_LONG(buf)) + #define IXDR_PUT_U_LONG(buf, v) IXDR_PUT_LONG(buf, (long)(v)) + diff --git a/patches/glibc/2.2.5/glibc-drow-sh.patch b/patches/glibc/2.2.5/glibc-drow-sh.patch new file mode 100644 index 00000000..82984e54 --- /dev/null +++ b/patches/glibc/2.2.5/glibc-drow-sh.patch @@ -0,0 +1,77 @@ +[pread changes deleted, since those seem to be specific to glibc-2.3.2] + +Date: Thu, 19 Jun 2003 20:02:07 -0400 +From: Daniel Jacobowitz <drow@false.org> +Subject: [linux-sh:02808] Patch needed for CVS glibc on SH +To: linux-sh@m17n.org, libc-alpha@sources.redhat.com +Message-Id: <20030620000207.GA19907@nevyn.them.org> +X-ML-Name: linux-sh +X-Mail-Count: 02808 +X-MLServer: fml [fml 4.0.1]; post only (only members can post) +X-ML-Info: If you have a question, send e-mail with the body + "help" (without quotes) to the address linux-sh-ctl@m17n.org; + help=<mailto:linux-sh-ctl@m17n.org?body=help> +Mail-Followup-To: linux-sh@m17n.org, libc-alpha@sources.redhat.com +Content-Disposition: inline +User-Agent: Mutt/1.5.1i +Mime-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Precedence: bulk +Lines: 74 +List-Software: fml [fml 4.0.1] +List-Post: <mailto:linux-sh@m17n.org> +List-Owner: <mailto:linux-sh-admin@m17n.org> +List-Help: <mailto:linux-sh-ctl@m17n.org?body=help> +List-Unsubscribe: <mailto:linux-sh-ctl@m17n.org?body=unsubscribe> +List-Id: linux-sh.m17n.org + +I believe this flushes my current patches to make glibc work on SH. Issues: + - MIPS pread functions have some wackiness in them for the MIPS calling + conventions, which align long longs to even register pairs; it appears + that SH does not do this. This fixes pread64/pwrite64. + - st_ino is _NOT_ 64-bit in the latest SH kernel trees, or at least it + wasn't when I checked in April. --enable-kernel=2.4.x breaks terribly + without this patch; the errors are along the lines of "version GLIBC_2.3 + not found", because that's the first consequence of a messed up inode + field - ld.so compares by inodes at some point. + +-- +Daniel Jacobowitz +MontaVista Software Debian GNU/Linux Developer + +2003-06-19 Daniel Jacobowitz <drow@mvista.com> + + * sysdeps/unix/sysv/linux/kernel-features.h: Update kernel features + for the SH architecture. + * sysdeps/unix/sysv/linux/sh/pread.c: Use generic Linux version + instead of the MIPS version. + * sysdeps/unix/sysv/linux/sh/pread64.c: Likewise. + * sysdeps/unix/sysv/linux/sh/pwrite.c: Likewise. + * sysdeps/unix/sysv/linux/sh/pwrite64.c: Likewise. + +--- glibc-2.3.2/sysdeps/unix/sysv/linux/kernel-features.h.org 2003-04-21 10:57:55.000000000 -0400 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/kernel-features.h 2003-04-21 11:16:47.000000000 -0400 +@@ -151,11 +151,20 @@ + + /* The changed st_ino field appeared in 2.4.0-test6. But we cannot + distinguish this version from other 2.4.0 releases. Therefore play +- save and assume it available is for 2.4.1 and up. */ +-#if __LINUX_KERNEL_VERSION >= 132097 ++ save and assume it available is for 2.4.1 and up. However, SH is lame, ++ and still does not have a 64-bit inode field. */ ++#if __LINUX_KERNEL_VERSION >= 132097 \ ++ && !defined __sh__ + # define __ASSUME_ST_INO_64_BIT 1 + #endif + ++/* SH kernels got stat64, mmap2, and truncate64 during 2.4.0-test. */ ++#if __LINUX_KERNEL_VERSION >= 132096 && defined __sh__ ++# define __ASSUME_TRUNCATE64_SYSCALL 1 ++# define __ASSUME_MMAP2_SYSCALL 1 ++# define __ASSUME_STAT64_SYSCALL 1 ++#endif ++ + /* To support locking of large files a new fcntl() syscall was introduced + in 2.4.0-test7. We test for 2.4.1 for the earliest version we know + the syscall is available. */ + diff --git a/patches/glibc/2.2.5/glibc-test-lowram.patch b/patches/glibc/2.2.5/glibc-test-lowram.patch new file mode 100644 index 00000000..2308629a --- /dev/null +++ b/patches/glibc/2.2.5/glibc-test-lowram.patch @@ -0,0 +1,14 @@ +--- glibc-2.2.5/malloc/tst-calloc.c.old Sun Aug 3 16:17:58 2003 ++++ glibc-2.2.5/malloc/tst-calloc.c Sun Aug 3 16:20:01 2003 +@@ -24,9 +24,8 @@ + #include <stdio.h> + + +-/* Number of samples per size. */ +-#define N 50000 +- ++/* Number of samples per size. This is also the maximum memory consumption in kilobytes. */ ++#define N 8000 + + static void + fixed_test (int size) diff --git a/patches/glibc/2.2.5/initfini-alpha.patch b/patches/glibc/2.2.5/initfini-alpha.patch new file mode 100644 index 00000000..49c4e671 --- /dev/null +++ b/patches/glibc/2.2.5/initfini-alpha.patch @@ -0,0 +1,125 @@ +Trivial fix to allow compiling with gcc3.3. + +--- glibc-2.2.5/sysdeps/alpha/elf/initfini.c.old Fri Jun 6 17:59:45 2003 ++++ glibc-2.2.5/sysdeps/alpha/elf/initfini.c Fri Jun 6 18:00:20 2003 +@@ -37,62 +37,62 @@ + files, all of which may have different GP values. So we must reload + the GP value from crti.o in crtn.o. */ + +-__asm__ (" +- +-#include \"defs.h\" +- +-/*@HEADER_ENDS*/ +- +-/*@_init_PROLOG_BEGINS*/ +- .section .init, \"ax\", @progbits +- .globl _init +- .ent _init +-_init: +- ldgp $29, 0($27) +- subq $30, 16, $30 +- lda $27, __gmon_start__ +- stq $26, 0($30) +- stq $29, 8($30) +- .prologue 1 +- beq $27, 1f +- jsr $26, ($27), __gmon_start__ +- ldq $29, 8($30) +-1: +- .align 3 +- .end _init +- .size _init, 0 +-/*@_init_PROLOG_ENDS*/ +- +-/*@_init_EPILOG_BEGINS*/ +- .section .init, \"ax\", @progbits +- ldq $26, 0($30) +- ldq $29, 8($30) +- addq $30, 16, $30 +- ret +-/*@_init_EPILOG_ENDS*/ +- +-/*@_fini_PROLOG_BEGINS*/ +- .section .fini, \"ax\", @progbits +- .globl _fini +- .ent _fini +-_fini: +- ldgp $29, 0($27) +- subq $30, 16, $30 +- stq $26, 0($30) +- stq $29, 8($30) +- .prologue 1 +- .align 3 +- .end _fini +- .size _fini, 0 +-/*@_fini_PROLOG_ENDS*/ +- +-/*@_fini_EPILOG_BEGINS*/ +- .section .fini, \"ax\", @progbits +- ldq $26, 0($30) +- ldq $29, 8($30) +- addq $30, 16, $30 +- ret +-/*@_fini_EPILOG_ENDS*/ +- +-/*@TRAILER_BEGINS*/ ++__asm__ ("\n\ ++\n\ ++#include \"defs.h\"\n\ ++\n\ ++/*@HEADER_ENDS*/\n\ ++\n\ ++/*@_init_PROLOG_BEGINS*/\n\ ++ .section .init, \"ax\", @progbits\n\ ++ .globl _init\n\ ++ .ent _init\n\ ++_init:\n\ ++ ldgp $29, 0($27)\n\ ++ subq $30, 16, $30\n\ ++ lda $27, __gmon_start__\n\ ++ stq $26, 0($30)\n\ ++ stq $29, 8($30)\n\ ++ .prologue 1\n\ ++ beq $27, 1f\n\ ++ jsr $26, ($27), __gmon_start__\n\ ++ ldq $29, 8($30)\n\ ++1:\n\ ++ .align 3\n\ ++ .end _init\n\ ++ .size _init, 0\n\ ++/*@_init_PROLOG_ENDS*/\n\ ++\n\ ++/*@_init_EPILOG_BEGINS*/\n\ ++ .section .init, \"ax\", @progbits\n\ ++ ldq $26, 0($30)\n\ ++ ldq $29, 8($30)\n\ ++ addq $30, 16, $30\n\ ++ ret\n\ ++/*@_init_EPILOG_ENDS*/\n\ ++\n\ ++/*@_fini_PROLOG_BEGINS*/\n\ ++ .section .fini, \"ax\", @progbits\n\ ++ .globl _fini\n\ ++ .ent _fini\n\ ++_fini:\n\ ++ ldgp $29, 0($27)\n\ ++ subq $30, 16, $30\n\ ++ stq $26, 0($30)\n\ ++ stq $29, 8($30)\n\ ++ .prologue 1\n\ ++ .align 3\n\ ++ .end _fini\n\ ++ .size _fini, 0\n\ ++/*@_fini_PROLOG_ENDS*/\n\ ++\n\ ++/*@_fini_EPILOG_BEGINS*/\n\ ++ .section .fini, \"ax\", @progbits\n\ ++ ldq $26, 0($30)\n\ ++ ldq $29, 8($30)\n\ ++ addq $30, 16, $30\n\ ++ ret\n\ ++/*@_fini_EPILOG_ENDS*/\n\ ++\n\ ++/*@TRAILER_BEGINS*/\n\ + "); diff --git a/patches/glibc/2.2.5/initfini-ia64.patch b/patches/glibc/2.2.5/initfini-ia64.patch new file mode 100644 index 00000000..a55a55a0 --- /dev/null +++ b/patches/glibc/2.2.5/initfini-ia64.patch @@ -0,0 +1,219 @@ +Retrieved with +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/ia64/elf/initfini.c.diff?r1=1.2&r2=1.3&cvsroot=glibc' + +Revision 1.3, Sun Aug 25 00:34:23 2002 UTC (2 years, 1 month ago) by drepper +Branch: MAIN +CVS Tags: glibc-2-3-1, glibc-2-3 +Changes since 1.2: +78 -78 lines + +(__asm__): Don't use newlines embedded in string. + +Fixes error + +../sysdeps/ia64/elf/initfini.c:30:10: missing terminating " character +../sysdeps/ia64/elf/initfini.c:32:10: #include expects "FILENAME" or <FILENAME> +../sysdeps/ia64/elf/initfini.c:37: error: request for member `section' in something not a structure or union +../sysdeps/ia64/elf/initfini.c:38: error: parse error before numeric constant +../sysdeps/ia64/elf/initfini.c:39: error: syntax error at '#' token +../sysdeps/ia64/elf/initfini.c:40: error: syntax error at '#' token +../sysdeps/ia64/elf/initfini.c:46: error: syntax error at '@' token +../sysdeps/ia64/elf/initfini.c:46: error: syntax error at '#' token +../sysdeps/ia64/elf/initfini.c:48: error: parse error before "r15" +../sysdeps/ia64/elf/initfini.c:48: warning: type defaults to `int' in declaration of `r15' +../sysdeps/ia64/elf/initfini.c:50: error: parse error before '.' token +../sysdeps/ia64/elf/initfini.c:56: error: syntax error at '#' token +../sysdeps/ia64/elf/initfini.c:57: error: parse error before "r12" +../sysdeps/ia64/elf/initfini.c:57: warning: type defaults to `int' in declaration of `r12' +../sysdeps/ia64/elf/initfini.c:58: warning: type defaults to `int' in declaration of `r12' +../sysdeps/ia64/elf/initfini.c:58: warning: data definition has no type or storage class +../sysdeps/ia64/elf/initfini.c:59: error: parse error before "gp" +../sysdeps/ia64/elf/initfini.c:59: warning: type defaults to `int' in declaration of `gp' +../sysdeps/ia64/elf/initfini.c:63: error: syntax error at '#' token +../sysdeps/ia64/elf/initfini.c:74: error: syntax error at '#' token +../sysdeps/ia64/elf/initfini.c:80: error: syntax error at '#' token +../sysdeps/ia64/elf/initfini.c:81: error: syntax error at '#' token +../sysdeps/ia64/elf/initfini.c:89: error: syntax error at '#' token +../sysdeps/ia64/elf/initfini.c:92: error: syntax error at '#' token +../sysdeps/ia64/elf/initfini.c:96: error: parse error before '.' token +../sysdeps/ia64/elf/initfini.c:101: error: syntax error at '#' token +../sysdeps/ia64/elf/initfini.c:106: error: syntax error at '#' token +../sysdeps/ia64/elf/initfini.c:107:1: missing terminating " character +make[2]: *** [/home/dank/wk/crosstool-0.28-rc37/build/ia64-unknown-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/csu/initfini.s] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/ia64-unknown-linux-gnu/gcc-3.3.4-glibc-2.2.5/glibc-2.2.5/csu' +make[1]: *** [csu/subdir_lib] Error 2 +make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/ia64-unknown-linux-gnu/gcc-3.3.4-glibc-2.2.5/glibc-2.2.5' +make: *** [all] Error 2 + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/ia64/elf/initfini.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/sysdeps/ia64/elf/initfini.c 2001/07/06 04:55:54 1.2 ++++ libc/sysdeps/ia64/elf/initfini.c 2002/08/25 00:34:23 1.3 +@@ -1,5 +1,5 @@ + /* Special .init and .fini section support for ia64. +- Copyright (C) 2000 Free Software Foundation, Inc. ++ Copyright (C) 2000, 2002 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -27,81 +27,81 @@ + * crtn.s puts the corresponding function epilogues + in the .init and .fini sections. */ + +-__asm__ (" +- +-#include \"defs.h\" +- +-/*@HEADER_ENDS*/ +- +-/*@_init_PROLOG_BEGINS*/ +- .section .init +- .align 16 +- .global _init# +- .proc _init# +-_init: +- alloc r34 = ar.pfs, 0, 3, 0, 0 +- mov r32 = r12 +- mov r33 = b0 +- adds r12 = -16, r12 +- addl r14 = @ltoff(@fptr(__gmon_start__#)), gp +- ;; +- ld8 r15 = [r14] +- ;; +- cmp.eq p6, p7 = 0, r15 +- (p6) br.cond.dptk .L5 +- +-/* we could use r35 to save gp, but we use the stack since that's what +- * all the other init routines will do --davidm 00/04/05 */ +- st8 [r12] = gp, -16 +- br.call.sptk.many b0 = __gmon_start__# ;; +- adds r12 = 16, r12 +- ;; +- ld8 gp = [r12] +- ;; +-.L5: +- .align 16 +- .endp _init# +- +-/*@_init_PROLOG_ENDS*/ +- +-/*@_init_EPILOG_BEGINS*/ +- .section .init +- .regstk 0,2,0,0 +- mov r12 = r32 +- mov ar.pfs = r34 +- mov b0 = r33 +- br.ret.sptk.many b0 +- .endp _init# +-/*@_init_EPILOG_ENDS*/ +- +-/*@_fini_PROLOG_BEGINS*/ +- .section .fini +- .align 16 +- .global _fini# +- .proc _fini# +-_fini: +- alloc r34 = ar.pfs, 0, 3, 0, 0 +- mov r32 = r12 +- mov r33 = b0 +- adds r12 = -16, r12 +- ;; +- .align 16 +- .endp _fini# +- +-/*@_fini_PROLOG_ENDS*/ +- br.call.sptk.many b0 = i_am_not_a_leaf# ;; +- ;; +- +-/*@_fini_EPILOG_BEGINS*/ +- .section .fini +- mov r12 = r32 +- mov ar.pfs = r34 +- mov b0 = r33 +- br.ret.sptk.many b0 +- .endp _fini# +- +-/*@_fini_EPILOG_ENDS*/ +- +-/*@TRAILER_BEGINS*/ +- .weak __gmon_start__# ++__asm__ ("\n\ ++\n\ ++#include \"defs.h\"\n\ ++\n\ ++/*@HEADER_ENDS*/\n\ ++\n\ ++/*@_init_PROLOG_BEGINS*/\n\ ++ .section .init\n\ ++ .align 16\n\ ++ .global _init#\n\ ++ .proc _init#\n\ ++_init:\n\ ++ alloc r34 = ar.pfs, 0, 3, 0, 0\n\ ++ mov r32 = r12\n\ ++ mov r33 = b0\n\ ++ adds r12 = -16, r12\n\ ++ addl r14 = @ltoff(@fptr(__gmon_start__#)), gp\n\ ++ ;;\n\ ++ ld8 r15 = [r14]\n\ ++ ;;\n\ ++ cmp.eq p6, p7 = 0, r15\n\ ++ (p6) br.cond.dptk .L5\n\ ++\n\ ++/* we could use r35 to save gp, but we use the stack since that's what\n\ ++ * all the other init routines will do --davidm 00/04/05 */\n\ ++ st8 [r12] = gp, -16\n\ ++ br.call.sptk.many b0 = __gmon_start__# ;;\n\ ++ adds r12 = 16, r12\n\ ++ ;;\n\ ++ ld8 gp = [r12]\n\ ++ ;;\n\ ++.L5:\n\ ++ .align 16\n\ ++ .endp _init#\n\ ++\n\ ++/*@_init_PROLOG_ENDS*/\n\ ++\n\ ++/*@_init_EPILOG_BEGINS*/\n\ ++ .section .init\n\ ++ .regstk 0,2,0,0\n\ ++ mov r12 = r32\n\ ++ mov ar.pfs = r34\n\ ++ mov b0 = r33\n\ ++ br.ret.sptk.many b0\n\ ++ .endp _init#\n\ ++/*@_init_EPILOG_ENDS*/\n\ ++\n\ ++/*@_fini_PROLOG_BEGINS*/\n\ ++ .section .fini\n\ ++ .align 16\n\ ++ .global _fini#\n\ ++ .proc _fini#\n\ ++_fini:\n\ ++ alloc r34 = ar.pfs, 0, 3, 0, 0\n\ ++ mov r32 = r12\n\ ++ mov r33 = b0\n\ ++ adds r12 = -16, r12\n\ ++ ;;\n\ ++ .align 16\n\ ++ .endp _fini#\n\ ++\n\ ++/*@_fini_PROLOG_ENDS*/\n\ ++ br.call.sptk.many b0 = i_am_not_a_leaf# ;;\n\ ++ ;;\n\ ++\n\ ++/*@_fini_EPILOG_BEGINS*/\n\ ++ .section .fini\n\ ++ mov r12 = r32\n\ ++ mov ar.pfs = r34\n\ ++ mov b0 = r33\n\ ++ br.ret.sptk.many b0\n\ ++ .endp _fini#\n\ ++\n\ ++/*@_fini_EPILOG_ENDS*/\n\ ++\n\ ++/*@TRAILER_BEGINS*/\n\ ++ .weak __gmon_start__#\n\ + "); diff --git a/patches/glibc/2.2.5/initfini-sh.patch b/patches/glibc/2.2.5/initfini-sh.patch new file mode 100644 index 00000000..d1e0eaef --- /dev/null +++ b/patches/glibc/2.2.5/initfini-sh.patch @@ -0,0 +1,243 @@ +--- glibc-2.2.5/sysdeps/sh/elf/initfini.c.orig Thu Jul 5 21:56:03 2001 ++++ glibc-2.2.5/sysdeps/sh/elf/initfini.c Wed May 28 08:45:08 2003 +@@ -27,122 +27,122 @@ + * crtn.s puts the corresponding function epilogues + in the .init and .fini sections. */ + +-__asm__ (" +- +-#include \"defs.h\" +-#define SHARED +- +-/*@HEADER_ENDS*/ +- +-/*@TESTS_BEGIN*/ +- +-/*@TESTS_END*/ +- +-/*@_init_PROLOG_BEGINS*/ +- .section .init +- .align 5 +- .global _init +- .type _init,@function +-_init: +- mov.l r12,@-r15 +- mov.l r14,@-r15 +- sts.l pr,@-r15 +-#ifdef SHARED +- mova .L22,r0 +- mov.l .L22,r12 +- add r0,r12 +- mova .L23,r0 +- mov.l .L23,r1 +- add r0,r1 +-#else +- mov.l .L23,r1 +-#endif +- jsr @r1 +- mov r15,r14 +- bra 1f +- nop +- .align 2 +-#ifdef SHARED +-.L22: +- .long _GLOBAL_OFFSET_TABLE_ +-.L23: +- .long __gmon_start__@PLT +-#else +-.L23: +- .long __gmon_start__ +-#endif +- .data +- .global __fpscr_values +-__fpscr_values: +- .long 0 +- .long 0x80000 +- .previous +-1: +- ALIGN +- END_INIT +- +- +-/*@_init_PROLOG_ENDS*/ +- +-/*@_init_EPILOG_BEGINS*/ +- .section .init +- mov r14,r15 +- lds.l @r15+,pr +- mov.l @r15+,r14 +- rts +- mov.l @r15+,r12 +- END_INIT +- .section .text +- .align 5 +- .weak __gmon_start__ +- .type __gmon_start__,@function +-__gmon_start__: +- mov.l r14,@-r15 +- mov r15,r14 +- mov r14,r15 +- rts +- mov.l @r15+,r14 +- +-/*@_init_EPILOG_ENDS*/ +- +-/*@_fini_PROLOG_BEGINS*/ +- .section .fini +- .align 5 +- .global _fini +- .type _fini,@function +-_fini: +- mov.l r12,@-r15 +- mov.l r14,@-r15 +- sts.l pr,@-r15 +-#ifdef SHARED +- mova .L27,r0 +- mov.l .L27,r12 +- add r0,r12 +-#endif +- mov r15,r14 +- ALIGN +- END_FINI +-#ifdef SHARED +- bra 1f +- nop +- .align 2 +-.L27: +- .long _GLOBAL_OFFSET_TABLE_ +-#endif +-1: +-/*@_fini_PROLOG_ENDS*/ +- +-/*@_fini_EPILOG_BEGINS*/ +- .section .fini +- mov r14,r15 +- lds.l @r15+,pr +- mov.l @r15+,r14 +- rts +- mov.l @r15+,r12 +- +- END_FINI +- +-/*@_fini_EPILOG_ENDS*/ +- +-/*@TRAILER_BEGINS*/ ++__asm__ ("\n\ ++\n\ ++#include \"defs.h\"\n\ ++#define SHARED\n\ ++\n\ ++/*@HEADER_ENDS*/\n\ ++\n\ ++/*@TESTS_BEGIN*/\n\ ++\n\ ++/*@TESTS_END*/\n\ ++\n\ ++/*@_init_PROLOG_BEGINS*/\n\ ++ .section .init\n\ ++ .align 5\n\ ++ .global _init\n\ ++ .type _init,@function\n\ ++_init:\n\ ++ mov.l r12,@-r15\n\ ++ mov.l r14,@-r15\n\ ++ sts.l pr,@-r15\n\ ++#ifdef SHARED\n\ ++ mova .L22,r0\n\ ++ mov.l .L22,r12\n\ ++ add r0,r12\n\ ++ mova .L23,r0\n\ ++ mov.l .L23,r1\n\ ++ add r0,r1\n\ ++#else\n\ ++ mov.l .L23,r1\n\ ++#endif\n\ ++ jsr @r1\n\ ++ mov r15,r14\n\ ++ bra 1f\n\ ++ nop\n\ ++ .align 2\n\ ++#ifdef SHARED\n\ ++.L22:\n\ ++ .long _GLOBAL_OFFSET_TABLE_\n\ ++.L23:\n\ ++ .long __gmon_start__@PLT\n\ ++#else\n\ ++.L23:\n\ ++ .long __gmon_start__\n\ ++#endif\n\ ++ .data\n\ ++ .global __fpscr_values\n\ ++__fpscr_values:\n\ ++ .long 0\n\ ++ .long 0x80000\n\ ++ .previous\n\ ++1:\n\ ++ ALIGN\n\ ++ END_INIT\n\ ++\n\ ++ \n\ ++/*@_init_PROLOG_ENDS*/\n\ ++\n\ ++/*@_init_EPILOG_BEGINS*/\n\ ++ .section .init\n\ ++ mov r14,r15\n\ ++ lds.l @r15+,pr\n\ ++ mov.l @r15+,r14\n\ ++ rts \n\ ++ mov.l @r15+,r12\n\ ++ END_INIT\n\ ++ .section .text\n\ ++ .align 5\n\ ++ .weak __gmon_start__\n\ ++ .type __gmon_start__,@function\n\ ++__gmon_start__:\n\ ++ mov.l r14,@-r15\n\ ++ mov r15,r14\n\ ++ mov r14,r15\n\ ++ rts \n\ ++ mov.l @r15+,r14\n\ ++ \n\ ++/*@_init_EPILOG_ENDS*/\n\ ++\n\ ++/*@_fini_PROLOG_BEGINS*/\n\ ++ .section .fini\n\ ++ .align 5\n\ ++ .global _fini\n\ ++ .type _fini,@function\n\ ++_fini:\n\ ++ mov.l r12,@-r15\n\ ++ mov.l r14,@-r15\n\ ++ sts.l pr,@-r15\n\ ++#ifdef SHARED\n\ ++ mova .L27,r0\n\ ++ mov.l .L27,r12\n\ ++ add r0,r12\n\ ++#endif\n\ ++ mov r15,r14\n\ ++ ALIGN\n\ ++ END_FINI\n\ ++#ifdef SHARED\n\ ++ bra 1f\n\ ++ nop\n\ ++ .align 2\n\ ++.L27:\n\ ++ .long _GLOBAL_OFFSET_TABLE_\n\ ++#endif\n\ ++1:\n\ ++/*@_fini_PROLOG_ENDS*/\n\ ++\n\ ++/*@_fini_EPILOG_BEGINS*/\n\ ++ .section .fini\n\ ++ mov r14,r15\n\ ++ lds.l @r15+,pr\n\ ++ mov.l @r15+,r14\n\ ++ rts \n\ ++ mov.l @r15+,r12\n\ ++\n\ ++ END_FINI\n\ ++ \n\ ++/*@_fini_EPILOG_ENDS*/\n\ ++\n\ ++/*@TRAILER_BEGINS*/\n\ + "); diff --git a/patches/glibc/2.2.5/longjmp-sparc.patch b/patches/glibc/2.2.5/longjmp-sparc.patch new file mode 100644 index 00000000..d11e9f89 --- /dev/null +++ b/patches/glibc/2.2.5/longjmp-sparc.patch @@ -0,0 +1,75 @@ +From libc-alpha-return-8354-listarch-libc-alpha=sourceware dot cygnus dot com at sources dot redhat dot com Mon Jul 01 11:18:29 2002 +Return-Path: <libc-alpha-return-8354-listarch-libc-alpha=sourceware dot cygnus dot com at sources dot redhat dot com> +Delivered-To: listarch-libc-alpha at sourceware dot cygnus dot com +Received: (qmail 10698 invoked by alias); 1 Jul 2002 11:18:28 -0000 +Mailing-List: contact libc-alpha-help at sources dot redhat dot com; run by ezmlm +Precedence: bulk +List-Subscribe: <mailto:libc-alpha-subscribe at sources dot redhat dot com> +List-Archive: <http://sources.redhat.com/ml/libc-alpha/> +List-Post: <mailto:libc-alpha at sources dot redhat dot com> +List-Help: <mailto:libc-alpha-help at sources dot redhat dot com>, <http://sources dot redhat dot com/ml/#faqs> +Sender: libc-alpha-owner at sources dot redhat dot com +Delivered-To: mailing list libc-alpha at sources dot redhat dot com +Received: (qmail 10659 invoked from network); 1 Jul 2002 11:18:27 -0000 +Received: from unknown (HELO sceaux.ilog.fr) (193.55.64.10) + by sources dot redhat dot com with SMTP; 1 Jul 2002 11:18:27 -0000 +Received: from ftp.ilog.fr (ftp.ilog.fr [193.55.64.11]) + by sceaux dot ilog dot fr (8 dot 11 dot 6/8 dot 11 dot 6) with SMTP id g61BFDi08003 + for <libc-alpha at sources dot redhat dot com>; Mon, 1 Jul 2002 13:15:18 +0200 (MET DST) +Received: from laposte.ilog.fr ([193.55.64.67]) + by ftp dot ilog dot fr (NAVGW 2 dot 5 dot 1 dot 16) with SMTP id M2002070113180506608 + for <libc-alpha at sources dot redhat dot com>; Mon, 01 Jul 2002 13:18:05 +0200 +Received: from honolulu.ilog.fr ([172.17.4.43]) + by laposte dot ilog dot fr (8 dot 11 dot 6/8 dot 11 dot 5) with ESMTP id g61BI2w29996; + Mon, 1 Jul 2002 13:18:02 +0200 (MET DST) +Received: (from haible@localhost) + by honolulu dot ilog dot fr (8 dot 9 dot 3/8 dot 9 dot 3/SuSE Linux 8 dot 9 dot 3-0 dot 1) id NAA01763; + Mon, 1 Jul 2002 13:12:40 +0200 +MIME-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: base64 +Message-ID: <15648.14632.526690.249866@honolulu.ilog.fr> +Date: Mon, 1 Jul 2002 13:12:40 +0200 (CEST) +From: Bruno Haible <bruno at clisp dot org> +To: libc-alpha at sources dot redhat dot com +Subject: sparc32/sysdep.h and gcc-3.1 + +Hi, + +When building glibc-2.2.5 for sparc with gcc-3.1 I get a build error + +sparc-linux-gcc ../sysdeps/sparc/sparc32/__longjmp.S -c -I../include -I. -I/backup/cross-build/build-glibc-sparc/setjmp -I.. -I../libio -I/backup/cross-build/build-glibc-sparc -I../sysdeps/sparc/sparc32/elf -I../linuxthreads/sysdeps/unix/sysv/linux/sparc -I../linuxthreads/sysdeps/unix/sysv/linux -I../linuxthreads/sysdeps/pthread -I../sysdeps/pthread -I../linuxthreads/sysdeps/unix/sysv -I../linuxthreads/sysdeps/unix -I../linuxthreads/sysdeps/sparc/sparc32 -I../linuxthreads/sysdeps/sparc -I../sysdeps/unix/sysv/linux/sparc/sparc32 -I../sysdeps/unix/sysv/linux/sparc -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix/sparc -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/sparc/sparc32/fpu -I../sysdeps/sparc/sparc32 -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/sparc/sparc32/soft-fp -I../sysdeps/sparc/fpu -I../sysdeps/sparc -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic -nostdinc -isystem /cross/sparc-linux-tools/lib/gcc-lib/sparc-linux/3.1/include -isystem /cross/sparc-linux/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h -DASSEMBLER -D__ASSEMBLY__ -o /backup/cross-build/build-glibc-sparc/setjmp/__longjmp.o +../sysdeps/sparc/sparc32/__longjmp.S: Assembler messages: +../sysdeps/sparc/sparc32/__longjmp.S:41: Error: Illegal operands +../sysdeps/sparc/sparc32/__longjmp.S:43: Error: Illegal operands +../sysdeps/sparc/sparc32/__longjmp.S:48: Error: unknown pseudo-op: `.' +../sysdeps/sparc/sparc32/__longjmp.S:50: Error: Illegal operands +../sysdeps/sparc/sparc32/__longjmp.S:52: Error: Illegal operands +../sysdeps/sparc/sparc32/__longjmp.S:55: Error: unknown pseudo-op: `.' +../sysdeps/sparc/sparc32/__longjmp.S:72: Error: unknown pseudo-op: `.' +../sysdeps/sparc/sparc32/__longjmp.S:76: Error: unknown pseudo-op: `.' +make[2]: *** [/backup/cross-build/build-glibc-sparc/setjmp/__longjmp.o] Fehler 1 +make[2]: Leaving directory `/packages2/glibc-2.2.5/setjmp' + +Apparently "cpp0 -lang-asm" now leaves spaces around ## in place, if the token +on the left or right of it is a lone dot (not a valid C identifier). Hard to +say that it's a bug in the gcc-3.1 cpp, because -lang-asm is a gcc extension. +The fix is just to remove the spaces. + + +2002-06-05 Bruno Haible <bruno@clisp.org> + + * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h (LOC): Remove spaces. + +--- glibc-2.2.5/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h.bak 2001-07-06 06:56:21.000000000 +0200 ++++ glibc-2.2.5/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h 2002-06-05 23:14:40.000000000 +0200 +@@ -48,7 +48,7 @@ + #define END(name) \ + .size name, . - name + +-#define LOC(name) . ## L ## name ++#define LOC(name) .##L##name + + #ifdef PIC + #define SYSCALL_ERROR_HANDLER \ + diff --git a/patches/glibc/2.2.5/sh-setjmp-fix.patch b/patches/glibc/2.2.5/sh-setjmp-fix.patch new file mode 100644 index 00000000..3f86a5e7 --- /dev/null +++ b/patches/glibc/2.2.5/sh-setjmp-fix.patch @@ -0,0 +1,29 @@ +Fixes glibc 'make tests' failure running isomac + +make[2]: *** [/home3/dank/wk/ixos/dap_interim/linux/3rdParty/crosstool/crosstool-0.15/build/sh4-unknown-linux-gnu/gcc-ss-3_3-20030714-glibc-2.2.5/build-glibc/stdlib/isomac.out] Error 2 + +isomac.out contains: +... +setjmp.h +#define JB_SIZE (4 * 15) + +See http://sources.redhat.com/ml/libc-hacker/2002-11/msg00009.html +and http://www.schweikhardt.net/isomac.c.html + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/sh/bits/setjmp.h,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/sysdeps/sh/bits/setjmp.h 2001/07/06 04:56:03 1.4 ++++ libc/sysdeps/sh/bits/setjmp.h 2002/11/06 00:08:30 1.5 +@@ -42,7 +42,9 @@ + } __jmp_buf[1]; + #endif + ++#if defined __USE_MISC || defined _ASM + #define JB_SIZE (4 * 15) ++#endif + + /* Test if longjmp to JMPBUF would unwind the frame + containing a local variable at ADDRESS. */ diff --git a/patches/glibc/2.2.5/sprintf-prototype.patch b/patches/glibc/2.2.5/sprintf-prototype.patch new file mode 100644 index 00000000..b0d346b6 --- /dev/null +++ b/patches/glibc/2.2.5/sprintf-prototype.patch @@ -0,0 +1,13 @@ +--- glibc-2.2.5/stdio-common/sprintf.c.old Wed May 28 08:59:11 2003 ++++ glibc-2.2.5/stdio-common/sprintf.c Wed May 28 08:59:45 2003 +@@ -27,9 +27,7 @@ + /* Write formatted output into S, according to the format string FORMAT. */ + /* VARARGS2 */ + int +-sprintf (s, format) +- char *s; +- const char *format; ++sprintf (char *s, const char *format, ...) + { + va_list arg; + int done; diff --git a/patches/glibc/2.2.5/sscanf.patch b/patches/glibc/2.2.5/sscanf.patch new file mode 100644 index 00000000..4ee33e2b --- /dev/null +++ b/patches/glibc/2.2.5/sscanf.patch @@ -0,0 +1,82 @@ +[dank] Modified very slightly to apply to 2.2.5. + +2003-03-05 Roland McGrath <roland@redhat.com> + + * stdio-common/sscanf.c: Use prototype defn with ... syntax. + * libio/swscanf.c: Likewise. + * libio/swprintf.c: Likewise. + +=================================================================== +RCS file: /cvs/glibc/libc/stdio-common/sscanf.c,v +retrieving revision 1.8 +retrieving revision 1.9 +diff -u -r1.8 -r1.9 +--- libc/stdio-common/sscanf.c 2002/08/10 09:24:42 1.8 ++++ libc/stdio-common/sscanf.c 2003/03/05 19:58:03 1.9 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1991, 1995, 1996, 1998 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; +=================================================================== +RCS file: /cvs/glibc/libc/libio/swprintf.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/libio/swprintf.c 2001/07/06 04:55:32 1.3 ++++ libc/libio/swprintf.c 2003/03/05 19:58:03 1.4 +@@ -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; +=================================================================== +RCS file: /cvs/glibc/libc/libio/swscanf.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/libio/swscanf.c 2001/07/06 04:55:32 1.2 ++++ libc/libio/swscanf.c 2003/03/05 19:58:03 1.3 +@@ -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 --git a/patches/glibc/2.2.5/unwind-arm.patch b/patches/glibc/2.2.5/unwind-arm.patch new file mode 100644 index 00000000..37f7b8db --- /dev/null +++ b/patches/glibc/2.2.5/unwind-arm.patch @@ -0,0 +1,19 @@ +# See http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2002-September/011508.html +# Fixes error +# arm-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libc.so.6: undefined reference to `size_of_encoded_value' +# arm-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/libc.so.6: undefined reference to `read_encoded_value_with_base' +# make[2]: *** [arm-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/iconv/iconvconfig] Error 1 + +--- glibc-2.2.5/sysdeps/unix/sysv/linux/configure.old Sun Jan 20 19:27:33 2002 ++++ glibc-2.2.5/sysdeps/unix/sysv/linux/configure Sun Jun 8 03:33:03 2003 +@@ -56,6 +56,10 @@ + arch_minimum_kernel=2.1.100 + libc_cv_gcc_unwind_find_fde=yes + ;; ++ arm*) ++ libc_cv_gcc_unwind_find_fde=yes ++ arch_minimum_kernel=2.0.10 ++ ;; + i386*) + libc_cv_gcc_unwind_find_fde=yes + arch_minimum_kernel=2.0.10 diff --git a/patches/glibc/2.3.2/README-hppa b/patches/glibc/2.3.2/README-hppa new file mode 100644 index 00000000..da242827 --- /dev/null +++ b/patches/glibc/2.3.2/README-hppa @@ -0,0 +1,32 @@ +[See also http://parisc-linux.org/toolchain + One of these days I'll have a look at what they've + got there, and incorporate their patches.] + +------- + +The error + +../linuxthreads/sysdeps/pthread/errno-loc.c: In function `__errno_location': +../linuxthreads/sysdeps/pthread/errno-loc.c:39: `pthread_descr' undeclared (first use in this function) +../linuxthreads/sysdeps/pthread/errno-loc.c:39: (Each undeclared identifier is reported only once +../linuxthreads/sysdeps/pthread/errno-loc.c:39: for each function it appears in.) +../linuxthreads/sysdeps/pthread/errno-loc.c:39: syntax error before "self" +../linuxthreads/sysdeps/pthread/errno-loc.c:40: warning: implicit declaration of function `LIBC_THREAD_GETMEM' +../linuxthreads/sysdeps/pthread/errno-loc.c:40: `self' undeclared (first use in this function) +../linuxthreads/sysdeps/pthread/errno-loc.c:40: `p_errnop' undeclared (first use in this function) +../linuxthreads/sysdeps/pthread/errno-loc.c:40: warning: return makes pointer from integer without a cast +make[2]: *** [/home/gotom/glibc/glibc-2.3.2/build/csu/errno-loc.o] Error 1 +make[2]: Leaving directory `/home/gotom/glibc/glibc-2.3.2/glibc-2.3.2/csu' +make[1]: *** [csu/subdir_lib] Error 2 + +means that hppa does not yet have the proper stuff for linuxthreads. + +See +http://groups.google.com/groups?selm=20030322165012%247208%40gated-at.bofh.it +http://lists.debian.org/debian-glibc/2003/debian-glibc-200303/msg00472.html + +A set of experimental patches is at +http://www.baldric.uwo.ca/~carlos/glibc-2.3.2-patches.tar.gz +but since they touch generic code, I'm not comfortable using them in general yet. +Go ahead and grab them if you want to build for hppa before hppa +support is merged into glibc. diff --git a/patches/glibc/2.3.2/arm-asm-clobber.patch b/patches/glibc/2.3.2/arm-asm-clobber.patch new file mode 100644 index 00000000..eca01c37 --- /dev/null +++ b/patches/glibc/2.3.2/arm-asm-clobber.patch @@ -0,0 +1,26 @@ +http://gcc.gnu.org/PR11103 +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/arm/sysdep.h.diff?r1=1.22&r2=1.23&cvsroot=glibc +http://lists.arm.linux.org.uk/pipermail/linux-arm/2003-July/005826.html + +Error: +../sysdeps/unix/sysv/linux/arm/sigaction.c: In function `__libc_sigaction': +../sysdeps/unix/sysv/linux/arm/sigaction.c:100: error: asm-specifier for variable `_a1' conflicts with asm clobber list +../sysdeps/unix/sysv/linux/arm/sigaction.c:139: error: asm-specifier for variable `_a1' conflicts with asm clobber list +make[2]: *** [build-glibc/signal/sigaction.o] Error 1 + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/arm/sysdep.h,v +retrieving revision 1.22 +retrieving revision 1.23 +diff -u -r1.22 -r1.23 +--- libc/sysdeps/unix/sysv/linux/arm/sysdep.h 2003/03/23 19:42:22 1.22 ++++ libc/sysdeps/unix/sysv/linux/arm/sysdep.h 2003/03/24 19:00:28 1.23 +@@ -174,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 --git a/patches/glibc/2.3.2/arm-ctl_bus_isa.patch b/patches/glibc/2.3.2/arm-ctl_bus_isa.patch new file mode 100644 index 00000000..3422070b --- /dev/null +++ b/patches/glibc/2.3.2/arm-ctl_bus_isa.patch @@ -0,0 +1,51 @@ +Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004. +Needed to build glibc with linux kernels 2.4.23 or higher on ARM, +Fixes following error: + +../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys': +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]') +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]') +make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1 + +cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA", http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html + +--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old 2003-02-20 14:22:24.000000000 -0800 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c 2004-01-31 16:01:50.000000000 -0800 +@@ -47,6 +47,12 @@ + #include <asm/page.h> + #include <sys/sysctl.h> + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include <linux/version.h> ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23)) ++#define CTL_BUS_ISA BUS_ISA /* and hope it's not the one from linux/input.h */ ++#endif ++ + #define PATH_ARM_SYSTYPE "/etc/arm_systype" + #define PATH_CPUINFO "/proc/cpuinfo" + +@@ -80,7 +86,7 @@ + * Initialize I/O system. There are several ways to get the information + * we need. Each is tried in turn until one succeeds. + * +- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*). This is the preferred method ++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*). This is the preferred method + * but not all kernels support it. + * + * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE. +@@ -100,8 +106,8 @@ + { + char systype[256]; + int i, n; +- static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE }; +- static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT }; ++ static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE }; ++ static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT }; + size_t len = sizeof(io.base); + + if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0) diff --git a/patches/glibc/2.3.2/arm-mcount_internal.patch b/patches/glibc/2.3.2/arm-mcount_internal.patch new file mode 100644 index 00000000..9e195ba2 --- /dev/null +++ b/patches/glibc/2.3.2/arm-mcount_internal.patch @@ -0,0 +1,30 @@ +# +# Submitted: +# +# Robert Schwebel, 2003-12-22 +# +# Error: +# +# ... undefined reference to mcount_internal ... +# +# Description: +# +# State: +# +# unknown +# + +--- glibc-2.3.2/sysdeps/arm/machine-gmon.h 2001-07-07 21:21:19.000000000 +0200 ++++ glibc-2.3.2-ptx/sysdeps/arm/machine-gmon.h 2003-12-21 23:58:26.000000000 +0100 +@@ -32,10 +32,8 @@ + weak_alias (_mcount, mcount) + #endif + +-static void mcount_internal (u_long frompc, u_long selfpc); +- + #define _MCOUNT_DECL(frompc, selfpc) \ +-static void mcount_internal (u_long frompc, u_long selfpc) ++void mcount_internal (u_long frompc, u_long selfpc) + + /* This macro/func MUST save r0, r1 because the compiler inserts + blind calls to _mount(), ignoring the fact that _mcount may diff --git a/patches/glibc/2.3.2/epoll-epollet.patch b/patches/glibc/2.3.2/epoll-epollet.patch new file mode 100644 index 00000000..c73b36f3 --- /dev/null +++ b/patches/glibc/2.3.2/epoll-epollet.patch @@ -0,0 +1,28 @@ +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/sys/epoll.h.diff?r1=1.1&r2=1.2&cvsroot=glibc +Needed for modern sys_epoll. + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/sys/epoll.h,v +retrieving revision 1.1 +retrieving revision 1.2 +diff -u -r1.1 -r1.2 +--- libc/sysdeps/unix/sysv/linux/sys/epoll.h 2002/12/16 23:35:27 1.1 ++++ libc/sysdeps/unix/sysv/linux/sys/epoll.h 2003/03/24 23:50:25 1.2 +@@ -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 --git a/patches/glibc/2.3.2/epoll-stdint.patch b/patches/glibc/2.3.2/epoll-stdint.patch new file mode 100644 index 00000000..b810e969 --- /dev/null +++ b/patches/glibc/2.3.2/epoll-stdint.patch @@ -0,0 +1,22 @@ +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/sys/epoll.h.diff?r1=1.2&r2=1.3&cvsroot=glibc +Include <stdint.h>. + +Fixes error +/foo/gcc-3.3.2-glibc-2.3.2/powerpc-750-linux-gnu/sys-include/sys/epoll.h:60: error: parse error before "uint32_t" +/foo/gcc-3.3.2-glibc-2.3.2/powerpc-750-linux-gnu/sys-include/sys/epoll.h:66: error: parse error before "uint32_t" + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/sys/epoll.h,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/sysdeps/unix/sysv/linux/sys/epoll.h 2003/03/24 23:50:25 1.2 ++++ libc/sysdeps/unix/sysv/linux/sys/epoll.h 2003/06/13 19:49:50 1.3 +@@ -19,6 +19,7 @@ + #ifndef _SYS_EPOLL_H + #define _SYS_EPOLL_H 1 + ++#include <stdint.h> + #include <sys/types.h> + + diff --git a/patches/glibc/2.3.2/errlist-awk.patch b/patches/glibc/2.3.2/errlist-awk.patch new file mode 100644 index 00000000..6a40253d --- /dev/null +++ b/patches/glibc/2.3.2/errlist-awk.patch @@ -0,0 +1,11 @@ +--- glibc-2.3.2/sysdeps/gnu/errlist.awk.old Tue May 27 18:10:37 2003 ++++ glibc-2.3.2/sysdeps/gnu/errlist.awk Tue May 27 18:10:47 2003 +@@ -39,7 +39,7 @@ + + print "/* This file is generated from errno.texi by errlist.awk. */" + print ""; +- print "#include <errno.h>"; ++ print "#include <stdlib/errno.h>"; + print "#include <libintl.h>"; + print ""; + print "#ifndef ERR_REMAP"; diff --git a/patches/glibc/2.3.2/fixup.patch b/patches/glibc/2.3.2/fixup.patch new file mode 100644 index 00000000..5f1e8a4e --- /dev/null +++ b/patches/glibc/2.3.2/fixup.patch @@ -0,0 +1,74 @@ +Fixes +dl-runtime.c:56: error: conflicting types for 'fixup' +../sysdeps/i386/dl-machine.h:158: error: previous declaration of 'fixup' was here +when building with gcc-3.4.0 + +First hunk: +Define ARCH_FIXUP_ATTRIBUTE and use it in the fixup function declarations. +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/dl-machine.h.diff?r1=1.124&r2=1.125&cvsroot=glibc + +Second hunk: +If ARCH_FIXUP_ATTRIBUTE is not defined, provide dummy definition. +Use macro in fixup function definitions. +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/elf/dl-runtime.c.diff?r1=1.64&r2=1.65&cvsroot=glibc +[rediffed against glibc-2.3.2] + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/i386/dl-machine.h,v +retrieving revision 1.124 +retrieving revision 1.125 +diff -u -r1.124 -r1.125 +--- libc/sysdeps/i386/dl-machine.h 2004/03/05 10:14:49 1.124 ++++ libc/sysdeps/i386/dl-machine.h 2004/03/09 07:42:29 1.125 +@@ -154,11 +154,14 @@ + destroys the passed register information. */ + /* GKM FIXME: Fix trampoline to pass bounds so we can do + without the `__unbounded' qualifier. */ +-static ElfW(Addr) fixup (struct link_map *__unbounded l, ElfW(Word) reloc_offset) +- __attribute__ ((regparm (2), unused)); ++#define ARCH_FIXUP_ATTRIBUTE __attribute__ ((regparm (3), unused)) ++ ++static ElfW(Addr) fixup (struct link_map *__unbounded l, ++ ElfW(Word) reloc_offset) ++ ARCH_FIXUP_ATTRIBUTE; + static ElfW(Addr) profile_fixup (struct link_map *l, ElfW(Word) reloc_offset, + ElfW(Addr) retaddr) +- __attribute__ ((regparm (3), unused)); ++ ARCH_FIXUP_ATTRIBUTE; + # endif + + /* This code is used in dl-runtime.c to call the `fixup' function +=================================================================== +--- /home/dank/downloads/glibc-2.3.2/elf/dl-runtime.c Fri Feb 7 11:41:12 2003 ++++ glibc-2.3.2/elf/dl-runtime.c Thu Apr 8 22:24:26 2004 +@@ -36,6 +36,12 @@ + # define VERSYMIDX(sym) (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (sym)) + #endif + ++/* The fixup functions might have need special attributes. If none ++ are provided define the macro as empty. */ ++#ifndef ARCH_FIXUP_ATTRIBUTE ++# define ARCH_FIXUP_ATTRIBUTE ++#endif ++ + + /* This function is called through a special trampoline from the PLT the + first time each PLT entry is called. We must perform the relocation +@@ -45,7 +51,7 @@ + function. */ + + #ifndef ELF_MACHINE_NO_PLT +-static ElfW(Addr) __attribute_used__ ++static ElfW(Addr) __attribute_used__ ARCH_FIXUP_ATTRIBUTE + fixup ( + # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS + ELF_MACHINE_RUNTIME_FIXUP_ARGS, +@@ -132,7 +138,7 @@ + + #if !defined PROF && !defined ELF_MACHINE_NO_PLT && !__BOUNDED_POINTERS__ + +-static ElfW(Addr) __attribute_used__ ++static ElfW(Addr) __attribute_used__ ARCH_FIXUP_ATTRIBUTE + profile_fixup ( + #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS + ELF_MACHINE_RUNTIME_FIXUP_ARGS, diff --git a/patches/glibc/2.3.2/gcc-pr-9552-workaround.patch b/patches/glibc/2.3.2/gcc-pr-9552-workaround.patch new file mode 100644 index 00000000..325c474f --- /dev/null +++ b/patches/glibc/2.3.2/gcc-pr-9552-workaround.patch @@ -0,0 +1,20 @@ +See http://gcc.gnu.org/PR9552 + +Works around gcc error + "soinit.c:25: internal compiler error: in named_section_flags, at varasm.c:412" +by fixing slightly incorrect code in glibc (the .eh_frame section used to +be read-write, but it's now readonly according to discussion in +http://sources.redhat.com/ml/binutils/2002-11/msg00592.html, +so it's arguably incorrect to continue to put variables in there that aren't const). + +--- glibc-2.3.2/elf/soinit.c 2001-11-16 00:09:20.000000000 +0100 ++++ glibc-2.3.2/elf/soinit.c 2003-08-12 09:13:34.000000000 +0200 +@@ -25,7 +25,7 @@ + } + + #ifdef HAVE_DWARF2_UNWIND_INFO +-static char __EH_FRAME_BEGIN__[] ++const static char __EH_FRAME_BEGIN__[] + __attribute__ ((section (".eh_frame"))) + = { }; + # ifdef HAVE_DWARF2_UNWIND_INFO_STATIC diff --git a/patches/glibc/2.3.2/glibc-2.2.5-crosstest.patch b/patches/glibc/2.3.2/glibc-2.2.5-crosstest.patch new file mode 100644 index 00000000..c9f37011 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.2.5-crosstest.patch @@ -0,0 +1,27 @@ +Fixes errors like + /build-glibc/dlfcn/glrefmain: cannot load `glreflib1.so' +in glibc regression test + +--- glibc-2.2.5/dlfcn/Makefile.old Thu Jul 24 16:30:20 2003 ++++ glibc-2.2.5/dlfcn/Makefile Thu Jul 24 17:25:01 2003 +@@ -60,6 +60,8 @@ + test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(modules-names))) + $(test-modules): $(objpfx)%.so: $(objpfx)%.os + $(build-module) ++# without following rule, test-modules don't get built when cross-compiling ++tests: $(test-modules) + + $(objpfx)glrefmain: $(libdl) + $(objpfx)glrefmain.out: $(objpfx)glrefmain \ +--- glibc-2.2.5/elf/Makefile.old Thu Jul 24 18:17:12 2003 ++++ glibc-2.2.5/elf/Makefile Thu Jul 24 18:18:58 2003 +@@ -263,6 +263,9 @@ + test-modules = $(addprefix $(objpfx),$(addsuffix .so,$(strip $(modules-names)))) + generated += $(addsuffix .so,$(strip $(modules-names))) + ++# without following rule, test-modules don't get built when cross-compiling ++tests: $(test-modules) ++ + ifeq (yes,$(build-shared)) + ifeq ($(cross-compiling),no) + tests: $(objpfx)tst-pathopt.out diff --git a/patches/glibc/2.3.2/glibc-2.2.5-mips-clone-local-label.patch b/patches/glibc/2.3.2/glibc-2.2.5-mips-clone-local-label.patch new file mode 100644 index 00000000..66fee299 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.2.5-mips-clone-local-label.patch @@ -0,0 +1,47 @@ +This is a workaround for + +mipsel-unknown-linux-gnu-gcc ../sysdeps/unix/sysv/linux/mips/clone.S -c -I../include -I. -I/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc -I.. -I../libio -I/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc -I../sysdeps/mips/elf -I../linuxthreads/sysdeps/unix/sysv/linux -I../linuxthreads/sysdeps/pthread -I../sysdeps/pthread -I../linuxthreads/sysdeps/unix/sysv -I../linuxthreads/sysdeps/unix -I../linuxthreads/sysdeps/mips -I../sysdeps/unix/sysv/linux/mips -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../sysdeps/unix/sysv -I../sysdeps/unix/mips -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/mips/mipsel -I../sysdeps/mips/fpu -I../sysdeps/mips -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic -nostdinc -isystem /home3/dank/crosstool-0.7/result/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/lib/gcc-lib/mipsel-unknown-linux-gnu/3.2.3/include -isystem /home3/dank/crosstool-0.7/result/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/mipsel-unknown-linux-gnu/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h -DPIC -DASSEMBLER -o /home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc/clone.o +../sysdeps/unix/sysv/linux/mips/clone.S: Assembler messages: +../sysdeps/unix/sysv/linux/mips/clone.S:66: Error: Can not represent BFD_RELOC_16_PCREL_S2 relocation in this object file format +make[2]: *** [/home3/dank/crosstool-0.7/build/mipsel-unknown-linux-gnu/gcc-3.2.3-glibc-2.2.5/build-glibc/misc/clone.o] Error 1 + +which was using h.j.lu's binutils-2.13.90.0.18. + + +But see http://lists.debian.org/debian-mips/2003/debian-mips-200305/msg00011.html +which says +"A newer version of binutils (CVS post 2003-03-12) fixes it without +the need of changing perfectly legal code." +So presumably this can be ditched sooner or later. + +From http://honk.physik.uni-konstanz.de/~agx/linux-mips/glibc/patches/applied/clone-local-label.diff + +2003-03-13 Guido Guenther <agx@sigxcpu.org> + + * 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. + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/mips/clone.S,v +retrieving revision 1.10 +diff -u -r1.10 clone.S +--- glibc-2.2.5/sysdeps/unix/sysv/linux/mips/clone.S 12 Mar 2003 01:04:51 -0000 1.10 ++++ glibc-2.2.5/sysdeps/unix/sysv/linux/mips/clone.S 12 Mar 2003 19:04:39 -0000 +@@ -63,7 +63,7 @@ + syscall + + bnez a3,error +- beqz v0,__thread_start ++ beqz v0,.Lthread_start + + /* Successful return from the parent */ + addiu sp,32 +@@ -85,6 +85,7 @@ + debug info. */ + + ENTRY(__thread_start) ++.Lthread_start: + /* cp is already loaded. */ + .cprestore 16 + /* The stackframe has been created on entry of clone(). */ diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.4-inline.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.4-inline.patch new file mode 100644 index 00000000..cdcd7ba0 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.4-inline.patch @@ -0,0 +1,23 @@ +Fixes +cc1: error: invalid parameter `max-inline-insns' +make[2]: *** [/home/dank/wk/crosstool-0.28-rc6/build/powerpc64-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/elf/dl-load.o] Error 1 +when building with gcc-3.4.0, which no longer has a single +--max-inline-insns parameter. + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/powerpc/powerpc64/Makefile.diff?r1=1.3&r2=1.4&cvsroot=glibc + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/powerpc/powerpc64/Makefile,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/sysdeps/powerpc/powerpc64/Makefile 2003/10/22 21:30:03 1.3 ++++ libc/sysdeps/powerpc/powerpc64/Makefile 2004/02/20 05:43:52 1.4 +@@ -20,5 +20,5 @@ + + ifeq ($(subdir),elf) + # help gcc inline asm code from dl-machine.h +-+cflags += --param max-inline-insns=2000 +++cflags += -finline-limit=2000 + endif + diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.4-nounit.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.4-nounit.patch new file mode 100644 index 00000000..17f10dae --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.4-nounit.patch @@ -0,0 +1,137 @@ +Fixes errors like + +# gcc-3.4.0-glibc-2.3.2/build-glibc/csu/crtn.o(.text+0x0):mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/csu/crtn.S:20: multiple definition of `dummy' +# gcc-3.4.0-glibc-2.3.2/build-glibc/csu/crti.o(.text+0x0):mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/csu/crti.S:42: first defined here +# /gcc-3.4.0-glibc-2.3.2/build-glibc/csu/crti.o(.init+0x28):mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/csu/crti.S:58: undefined reference to `i_am_not_a_leaf' + +CVSROOT: /cvs/glibc +Module name: libc +Changes by: aj@sourceware.org 2003-12-02 07:37:29 + +Modified files: + . : configure.in configure config.make.in + csu : Makefile + locale : Makefile + linuxthreads : Makefile + linuxthreads/sysdeps/unix/sysv/linux/x86_64: Makefile + nptl : Makefile + nptl/sysdeps/unix/sysv/linux/x86_64: Makefile + +Log message: + * config.make.in (fno-unit-at-a-time): Define. + + * configure.in: Add test for -fno-unit-at-a-time. + Fix text for -fpie. + + * csu/Makefile (CFLAGS-initfini.s): Add $(fno_unit_at_a_time). + * locale/Makefile (CFLAGS-loadlocale.c): Likewise. + + For linuxthreads: + * Makefile (CFLAGS-pt-initfini.s): Add $(fno_unit_at_a_time). + * sysdeps/unix/sysv/linux/x86_64/Makefile (CFLAGS-pt-initfini.s): + Likewise. + + For nptl: + * Makefile (CFLAGS-pt-initfini.s): Add $(fno_unit_at_a_time). + * sysdeps/unix/sysv/linux/x86_64/Makefile (CFLAGS-pt-initfini.s): + Likewise. + +Main glibc change retrieved with +wget -O foo.patch 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/config.make.in.diff?r1=1.98&r2=1.99&cvsroot=glibc' \ +'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/configure.diff?r1=1.393&r2=1.394&cvsroot=glibc' \ +'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/csu/Makefile.diff?r1=1.71&r2=1.72&cvsroot=glibc' \ +'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/locale/Makefile.diff?r1=1.71&r2=1.72&cvsroot=glibc' + +and then rediffed against glibc-2.3.2 +See also ../glibc-linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-allow-3.4.patch + +diff -aur glibc-2.3.2/config.make.in glibc-2.3.2-nounit/config.make.in +--- glibc-2.3.2/config.make.in 2002-11-14 14:53:32.000000000 -0800 ++++ glibc-2.3.2-nounit/config.make.in 2004-05-29 23:19:58.000000000 -0700 +@@ -50,6 +50,7 @@ + old-glibc-headers = @old_glibc_headers@ + unwind-find-fde = @libc_cv_gcc_unwind_find_fde@ + have-initfini-array = @libc_cv_initfinit_array@ ++fno-unit-at-a-time = @fno_unit_at_a_time@ + + static-libgcc = @libc_cv_gcc_static_libgcc@ + +diff -aur glibc-2.3.2/configure glibc-2.3.2-nounit/configure +--- glibc-2.3.2/configure 2003-02-26 01:20:48.000000000 -0800 ++++ glibc-2.3.2-nounit/configure 2004-05-30 06:22:31.000000000 -0700 +@@ -312,7 +312,7 @@ + # include <unistd.h> + #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 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 fno_unit_at_a_time 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_files='' + + # Initialize some variables set by options. +@@ -4984,6 +4984,35 @@ + fi + + ++echo "$as_me:$LINENO: checking for -fno-unit-at-a-time" >&5 ++echo $ECHO_N "checking for -fno-unit-at-a-time... $ECHO_C" >&6 ++if test "${libc_cv_fno_unit_at_a_time+set}" = set; then ++ echo $ECHO_N "(cached) $ECHO_C" >&6 ++else ++ cat > conftest.c <<EOF ++int foo; ++EOF ++if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -S -fno-unit-at-a-time ++ conftest.c 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_fno_unit_at_a_time=yes ++else ++ libc_cv_fno_unit_at_a_time=no ++fi ++rm -f conftest* ++fi ++echo "$as_me:$LINENO: result: $libc_cv_fno_unit_at_a_time" >&5 ++echo "${ECHO_T}$libc_cv_fno_unit_at_a_time" >&6 ++if test $libc_cv_fno_unit_at_a_time = yes; then ++ fno_unit_at_a_time=-fno-unit-at-a-time ++fi ++ ++ + if test $elf != yes; then + echo "$as_me:$LINENO: checking for .init and .fini sections" >&5 + echo $ECHO_N "checking for .init and .fini sections... $ECHO_C" >&6 +@@ -7236,6 +7265,7 @@ + s,@libc_cv_z_initfirst@,$libc_cv_z_initfirst,;t t + s,@libc_cv_Bgroup@,$libc_cv_Bgroup,;t t + s,@libc_cv_z_combreloc@,$libc_cv_z_combreloc,;t t ++s,@fno_unit_at_a_time@,$fno_unit_at_a_time,;t t + s,@libc_cv_have_initfini@,$libc_cv_have_initfini,;t t + s,@no_whole_archive@,$no_whole_archive,;t t + s,@exceptions@,$exceptions,;t t +diff -aur glibc-2.3.2/csu/Makefile glibc-2.3.2-nounit/csu/Makefile +--- glibc-2.3.2/csu/Makefile 2002-12-31 14:24:37.000000000 -0800 ++++ glibc-2.3.2-nounit/csu/Makefile 2004-05-29 23:18:27.000000000 -0700 +@@ -99,7 +99,7 @@ + $(objpfx)crt%.o: $(objpfx)crt%.S $(objpfx)defs.h + $(compile.S) -g0 $(ASFLAGS-.os) -o $@ + +-CFLAGS-initfini.s = -g0 -fPIC -fno-inline-functions ++CFLAGS-initfini.s = -g0 -fPIC -fno-inline-functions $(fno-unit-at-a-time) + + vpath initfini.c $(full_config_sysdirs) + +diff -aur glibc-2.3.2/locale/Makefile glibc-2.3.2-nounit/locale/Makefile +--- glibc-2.3.2/locale/Makefile 2002-10-17 10:05:53.000000000 -0700 ++++ glibc-2.3.2-nounit/locale/Makefile 2004-05-29 23:18:27.000000000 -0700 +@@ -100,6 +100,7 @@ + CFLAGS-charmap.c = -Wno-write-strings -Wno-char-subscripts + CFLAGS-locfile.c = -Wno-write-strings -Wno-char-subscripts + CFLAGS-charmap-dir.c = -Wno-write-strings ++CFLAGS-loadlocale.c = $(fno-unit-at-a-time) + + # This makes sure -DNOT_IN_libc is passed for all these modules. + cpp-srcs-left := $(addsuffix .c,$(localedef-modules) $(localedef-aux) \ diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-PR14096.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-PR14096.patch new file mode 100644 index 00000000..fe97f678 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-PR14096.patch @@ -0,0 +1,55 @@ +--- glibc-2.3.2/stdlib/abs.c.old 2004-07-18 12:08:43.000000000 -0700 ++++ glibc-2.3.2/stdlib/abs.c 2004-07-18 12:09:18.000000000 -0700 +@@ -16,6 +16,8 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + ++#define __NO_INLINE__ 1 /* avoid http://gcc.gnu.org/PR14096 */ ++ + #include <stdlib.h> + + #undef abs +--- glibc-2.3.2/stdlib/atoi.c.old 2004-07-18 12:08:17.000000000 -0700 ++++ glibc-2.3.2/stdlib/atoi.c 2004-07-18 12:08:27.000000000 -0700 +@@ -16,6 +16,8 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + ++#define __NO_INLINE__ 1 /* avoid http://gcc.gnu.org/PR14096 */ ++ + #include <stdlib.h> + + #undef atoi +--- glibc-2.3.2/stdlib/atof.c.old 2004-07-18 12:06:09.000000000 -0700 ++++ glibc-2.3.2/stdlib/atof.c 2004-07-18 12:05:31.000000000 -0700 +@@ -16,6 +16,8 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + ++#define __NO_INLINE__ 1 /* avoid http://gcc.gnu.org/PR14096 */ ++ + #include <stdlib.h> + + #undef atof +--- glibc-2.3.2/stdlib/atol.c.old 2004-07-18 12:08:49.000000000 -0700 ++++ glibc-2.3.2/stdlib/atol.c 2004-07-18 12:09:40.000000000 -0700 +@@ -16,6 +16,8 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + ++#define __NO_INLINE__ 1 /* avoid http://gcc.gnu.org/PR14096 */ ++ + #include <stdlib.h> + + #undef atol +--- glibc-2.3.2/stdlib/atoll.c.old 2004-07-18 12:08:55.000000000 -0700 ++++ glibc-2.3.2/stdlib/atoll.c 2004-07-18 12:09:59.000000000 -0700 +@@ -16,6 +16,8 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + ++#define __NO_INLINE__ 1 /* avoid http://gcc.gnu.org/PR14096 */ ++ + #include <stdlib.h> + + #undef atoll diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-elf.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-elf.patch new file mode 100644 index 00000000..1bd61e50 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-elf.patch @@ -0,0 +1,34 @@ + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/elf/dl-load.c.diff?r1=1.235&r2=1.236&cvsroot=glibc + +Fixes gcc-3.5 errors + +dl-load.c: In function `_dl_map_object_from_fd': +dl-load.c:1179: error: invalid lvalue in assignment +dl-load.c:1205: error: invalid lvalue in assignment + +=================================================================== +RCS file: /cvs/glibc/libc/elf/dl-load.c,v +retrieving revision 1.235 +retrieving revision 1.236 +diff -u -r1.235 -r1.236 +--- libc/elf/dl-load.c 2004/02/09 07:03:48 1.235 ++++ libc/elf/dl-load.c 2004/02/21 18:25:41 1.236 +@@ -1228,7 +1228,7 @@ + } + else + /* Adjust the PT_PHDR value by the runtime load address. */ +- (ElfW(Addr)) l->l_phdr += l->l_addr; ++ l->l_phdr = (ElfW(Phdr) *) ((ElfW(Addr)) l->l_phdr + l->l_addr); + } + + #ifdef USE_TLS +@@ -1254,7 +1254,7 @@ + } + } + else +- (ElfW(Addr)) l->l_ld += l->l_addr; ++ l->l_ld = (ElfW(Dyn) *) ((ElfW(Addr)) l->l_ld + l->l_addr); + + l->l_entry += l->l_addr; + diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-gconv.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-gconv.patch new file mode 100644 index 00000000..3d6df5bd --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-gconv.patch @@ -0,0 +1,228 @@ +Fixes +gconv_open.c: In function `__gconv_open': +gconv_open.c:186: error: invalid lvalue in assignment +when building glibc-2.3.2 with gcc-3.5. + +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/iconv/gconv_simple.c.diff?r1=1.59&r2=1.63&cvsroot=glibc' + * (internal_ucs4_loop): Fix typo in last change. + + * (internal_ucs4le_loop): Remove cast used as lvalue. + + * Fix last commit. + + * iconv/gconv_simple.c (ucs4le_internal_loop): Remove cast used as lvalue. + (internal_ucs4le_loop_single): Likewise. + (ucs4_internal_loop): Likewise. + (BODY): Likewise. + (internal_ucs4_loop_single): Likewise. + +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/iconv/gconv_open.c.diff?r1=1.32&r2=1.33&cvsroot=glibc' + * iconv/gconv_simple.c (ucs4le_internal_loop): Remove cast used as lvalue. + (internal_ucs4le_loop_single): Likewise. + (ucs4_internal_loop): Likewise. + (BODY): Likewise. + (internal_ucs4_loop_single): Likewise. + + +=================================================================== +RCS file: /cvs/glibc/libc/iconv/gconv_open.c,v +retrieving revision 1.32 +retrieving revision 1.33 +diff -u -r1.32 -r1.33 +--- libc/iconv/gconv_open.c 2001/11/29 04:51:58 1.32 ++++ libc/iconv/gconv_open.c 2004/02/07 15:56:32 1.33 +@@ -1,5 +1,5 @@ + /* Find matching transformation algorithms and initialize steps. +- Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + +@@ -182,8 +182,13 @@ + || __builtin_expect (__gconv_translit_find (runp), 0) == 0) + lastp = runp; + else +- /* This means we haven't found the module. Remove it. */ +- (lastp == NULL ? trans : lastp->next) = runp->next; ++ { ++ /* This means we haven't found the module. Remove it. */ ++ if (lastp == NULL) ++ trans = runp->next; ++ else ++ lastp->next = runp->next; ++ } + } + + /* Allocate room for handle. */ +=================================================================== +RCS file: /cvs/glibc/libc/iconv/gconv_simple.c,v +retrieving revision 1.59 +retrieving revision 1.63 +diff -u -r1.59 -r1.63 +--- libc/iconv/gconv_simple.c 2003/06/11 21:36:37 1.59 ++++ libc/iconv/gconv_simple.c 2004/03/09 10:00:31 1.63 +@@ -1,5 +1,5 @@ + /* Simple transformations functions. +- Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc. ++ Copyright (C) 1997-2003, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + +@@ -87,12 +87,13 @@ + #if __BYTE_ORDER == __LITTLE_ENDIAN + /* Sigh, we have to do some real work. */ + size_t cnt; ++ uint32_t *outptr32 = (uint32_t *) outptr; + + for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4) +- *((uint32_t *) outptr)++ = bswap_32 (*(const uint32_t *) inptr); ++ *outptr32++ = bswap_32 (*(const uint32_t *) inptr); + + *inptrp = inptr; +- *outptrp = outptr; ++ *outptrp = (unsigned char *) outptr32; + #elif __BYTE_ORDER == __BIG_ENDIAN + /* Simply copy the data. */ + *inptrp = inptr + n_convert * 4; +@@ -192,13 +193,16 @@ + (*outptrp)[2] = state->__value.__wchb[1]; + (*outptrp)[3] = state->__value.__wchb[0]; + +- *outptrp += 4; + #elif __BYTE_ORDER == __BIG_ENDIAN + /* XXX unaligned */ +- *(*((uint32_t **) outptrp)++) = state->__value.__wch; ++ (*outptrp)[0] = state->__value.__wchb[0]; ++ (*outptrp)[1] = state->__value.__wchb[1]; ++ (*outptrp)[2] = state->__value.__wchb[2]; ++ (*outptrp)[3] = state->__value.__wchb[3]; + #else + # error "This endianess is not supported." + #endif ++ *outptrp += 4; + + /* Clear the state buffer. */ + state->__count &= ~7; +@@ -268,7 +272,8 @@ + return __GCONV_ILLEGAL_INPUT; + } + +- *((uint32_t *) outptr)++ = inval; ++ *((uint32_t *) outptr) = inval; ++ outptr += sizeof (uint32_t); + } + + *inptrp = inptr; +@@ -447,9 +452,11 @@ + #if __BYTE_ORDER == __BIG_ENDIAN + /* Sigh, we have to do some real work. */ + size_t cnt; ++ uint32_t *outptr32 = (uint32_t *) outptr; + + for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4) +- *((uint32_t *) outptr)++ = bswap_32 (*(const uint32_t *) inptr); ++ *outptr32++ = bswap_32 (*(const uint32_t *) inptr); ++ outptr = (unsigned char *) outptr32; + + *inptrp = inptr; + *outptrp = outptr; +@@ -555,12 +562,17 @@ + (*outptrp)[2] = state->__value.__wchb[1]; + (*outptrp)[3] = state->__value.__wchb[0]; + +- *outptrp += 4; + #else + /* XXX unaligned */ +- *(*((uint32_t **) outptrp)++) = state->__value.__wch; ++ (*outptrp)[0] = state->__value.__wchb[0]; ++ (*outptrp)[1] = state->__value.__wchb[1]; ++ (*outptrp)[2] = state->__value.__wchb[2]; ++ (*outptrp)[3] = state->__value.__wchb[3]; ++ + #endif + ++ *outptrp += 4; ++ + /* Clear the state buffer. */ + state->__count &= ~7; + +@@ -626,7 +638,8 @@ + return __GCONV_ILLEGAL_INPUT; + } + +- *((uint32_t *) outptr)++ = inval; ++ *((uint32_t *) outptr) = inval; ++ outptr += sizeof (uint32_t); + } + + *inptrp = inptr; +@@ -808,7 +821,8 @@ + } \ + else \ + /* It's an one byte sequence. */ \ +- *((uint32_t *) outptr)++ = *inptr++; \ ++ *((uint32_t *) outptr) = *inptr++; \ ++ outptr += sizeof (uint32_t); \ + } + #define LOOP_NEED_FLAGS + #include <iconv/loop.c> +@@ -838,7 +852,8 @@ + } \ + else \ + /* It's an one byte sequence. */ \ +- *outptr++ = *((const uint32_t *) inptr)++; \ ++ *outptr++ = *((const uint32_t *) inptr); \ ++ inptr += sizeof (uint32_t); \ + } + #define LOOP_NEED_FLAGS + #include <iconv/loop.c> +@@ -1032,7 +1047,8 @@ + } \ + \ + /* Now adjust the pointers and store the result. */ \ +- *((uint32_t *) outptr)++ = ch; \ ++ *((uint32_t *) outptr) = ch; \ ++ outptr += sizeof (uint32_t); \ + } + #define LOOP_NEED_FLAGS + +@@ -1153,7 +1169,8 @@ + STANDARD_FROM_LOOP_ERR_HANDLER (2); \ + } \ + \ +- *((uint32_t *) outptr)++ = u1; \ ++ *((uint32_t *) outptr) = u1; \ ++ outptr += sizeof (uint32_t); \ + inptr += 2; \ + } + #define LOOP_NEED_FLAGS +@@ -1201,7 +1218,8 @@ + } \ + else \ + { \ +- *((uint16_t *) outptr)++ = val; \ ++ *((uint16_t *) outptr) = val; \ ++ outptr += sizeof (uint16_t); \ + inptr += 4; \ + } \ + } +@@ -1242,7 +1260,8 @@ + continue; \ + } \ + \ +- *((uint32_t *) outptr)++ = u1; \ ++ *((uint32_t *) outptr) = u1; \ ++ outptr += sizeof (uint32_t); \ + inptr += 2; \ + } + #define LOOP_NEED_FLAGS +@@ -1291,7 +1310,8 @@ + } \ + else \ + { \ +- *((uint16_t *) outptr)++ = bswap_16 (val); \ ++ *((uint16_t *) outptr) = bswap_16 (val); \ ++ outptr += sizeof (uint16_t); \ + inptr += 4; \ + } \ + } diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-msort.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-msort.patch new file mode 100644 index 00000000..e2673dec --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-msort.patch @@ -0,0 +1,46 @@ +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/stdlib/msort.c.diff?r1=1.20&r2=1.21&cvsroot=glibc + +Fixes + +msort.c: In function `msort_with_tmp': +msort.c:59: error: invalid lvalue in increment +msort.c:59: error: invalid lvalue in increment +msort.c:64: error: invalid lvalue in increment +msort.c:64: error: invalid lvalue in increment + +when building with gcc-3.5. + +=================================================================== +RCS file: /cvs/glibc/libc/stdlib/msort.c,v +retrieving revision 1.20 +retrieving revision 1.21 +diff -u -r1.20 -r1.21 +--- libc/stdlib/msort.c 2002/09/24 04:20:57 1.20 ++++ libc/stdlib/msort.c 2004/02/07 15:57:34 1.21 +@@ -1,6 +1,6 @@ + /* An alternative to qsort, with an identical interface. + This file is part of the GNU C Library. +- Copyright (C) 1992,95-97,99,2000,01,02 Free Software Foundation, Inc. ++ Copyright (C) 1992,95-97,99,2000,01,02,04 Free Software Foundation, Inc. + Written by Mike Haertel, September 1988. + + The GNU C Library is free software; you can redistribute it and/or +@@ -56,12 +56,16 @@ + if ((*cmp) (b1, b2) <= 0) + { + --n1; +- *((op_t *) tmp)++ = *((op_t *) b1)++; ++ *((op_t *) tmp) = *((op_t *) b1); ++ tmp += sizeof (op_t); ++ b1 += sizeof (op_t); + } + else + { + --n2; +- *((op_t *) tmp)++ = *((op_t *) b2)++; ++ *((op_t *) tmp) = *((op_t *) b2); ++ tmp += sizeof (op_t); ++ b2 += sizeof (op_t); + } + } + else diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-sunrpc.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-sunrpc.patch new file mode 100644 index 00000000..5a68bc24 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-sunrpc.patch @@ -0,0 +1,233 @@ +http://sources.redhat.com/ml/libc-hacker/2004-02/msg00005.html +[Also in CVS, but the original patch is easier to get.] + +Fixes errors like + +clnt_perr.c: In function `_buf': +clnt_perr.c:67: error: invalid lvalue in assignment + +when building with gcc-3.5. + +To: libc-hacker at sources dot redhat dot com +Subject: Fix cast as lvalue in sunrpc +From: Andreas Schwab <schwab at suse dot de> +X-Yow: SHHHH!! I hear SIX TATTOOED TRUCK-DRIVERS tossing ENGINE BLOCKS + into empty OIL DRUMS dot dot +Date: Sun, 08 Feb 2004 17:38:31 +0100 +Message-ID: <je4qu1frw8.fsf@sykes.suse.de> + +This fixes the uses of casts as lvalue in the sunrpc code. + +Andreas. + +2004-02-08 Andreas Schwab <schwab@suse.de> + + * include/rpc/rpc.h: Declare thread variables with their correct + type. + * sunrpc/clnt_perr.c: Don't cast thread variables. + * sunrpc/clnt_raw.c: Likewise. + * sunrpc/clnt_simp.c: Likewise. + * sunrpc/key_call.c: Likewise. + * sunrpc/svcauth_des.c: Likewise. + * sunrpc/svc.c: Likewise. + * sunrpc/svc_raw.c: Likewise. + * sunrpc/svc_simple.c: Likewise. + +Index: include/rpc/rpc.h +=================================================================== +RCS file: /cvs/glibc/libc/include/rpc/rpc.h,v +retrieving revision 1.8 +diff -u -p -a -r1.8 rpc.h +--- glibc/include/rpc/rpc.h 5 Aug 2002 22:10:59 -0000 1.8 ++++ glibc/include/rpc/rpc.h 8 Feb 2004 14:19:14 -0000 +@@ -17,24 +17,24 @@ struct rpc_thread_variables { + struct pollfd *svc_pollfd_s; /* Global, rpc_common.c */ + int svc_max_pollfd_s; /* Global, rpc_common.c */ + +- void *clnt_perr_buf_s; /* clnt_perr.c */ ++ char *clnt_perr_buf_s; /* clnt_perr.c */ + +- void *clntraw_private_s; /* clnt_raw.c */ ++ struct clntraw_private_s *clntraw_private_s; /* clnt_raw.c */ + +- void *callrpc_private_s; /* clnt_simp.c */ ++ struct callrpc_private_s *callrpc_private_s; /* clnt_simp.c */ + +- void *key_call_private_s; /* key_call.c */ ++ struct key_call_private *key_call_private_s; /* key_call.c */ + +- void *authdes_cache_s; /* svcauth_des.c */ +- void *authdes_lru_s; /* svcauth_des.c */ ++ struct cache_entry *authdes_cache_s; /* svcauth_des.c */ ++ int *authdes_lru_s; /* svcauth_des.c */ + +- void *svc_xports_s; /* svc.c */ +- void *svc_head_s; /* svc.c */ ++ SVCXPRT **svc_xports_s; /* svc.c */ ++ struct svc_callout *svc_head_s; /* svc.c */ + +- void *svcraw_private_s; /* svc_raw.c */ ++ struct svcraw_private_s *svcraw_private_s; /* svc_raw.c */ + +- void *svcsimple_proglst_s; /* svc_simple.c */ +- void *svcsimple_transp_s; /* svc_simple.c */ ++ struct proglst_ *svcsimple_proglst_s; /* svc_simple.c */ ++ SVCXPRT *svcsimple_transp_s; /* svc_simple.c */ + }; + + extern struct rpc_thread_variables *__rpc_thread_variables(void) +Index: sunrpc/clnt_perr.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/clnt_perr.c,v +retrieving revision 1.19 +diff -u -p -a -r1.19 clnt_perr.c +--- glibc/sunrpc/clnt_perr.c 1 Nov 2002 20:43:54 -0000 1.19 ++++ glibc/sunrpc/clnt_perr.c 8 Feb 2004 14:19:14 -0000 +@@ -55,7 +55,7 @@ static char *auth_errmsg (enum auth_stat + * buf variable in a few functions. Overriding a global variable + * with a local variable of the same name is a bad idea, anyway. + */ +-#define buf ((char *)RPC_THREAD_VARIABLE(clnt_perr_buf_s)) ++#define buf RPC_THREAD_VARIABLE(clnt_perr_buf_s) + #else + static char *buf; + #endif +Index: sunrpc/clnt_raw.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/clnt_raw.c,v +retrieving revision 1.10 +diff -u -p -a -r1.10 clnt_raw.c +--- glibc/sunrpc/clnt_raw.c 15 May 2002 00:21:00 -0000 1.10 ++++ glibc/sunrpc/clnt_raw.c 8 Feb 2004 14:19:14 -0000 +@@ -61,7 +61,7 @@ struct clntraw_private_s + u_int mcnt; + }; + #ifdef _RPC_THREAD_SAFE_ +-#define clntraw_private ((struct clntraw_private_s *)RPC_THREAD_VARIABLE(clntraw_private_s)) ++#define clntraw_private RPC_THREAD_VARIABLE(clntraw_private_s) + #else + static struct clntraw_private_s *clntraw_private; + #endif +Index: sunrpc/clnt_simp.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/clnt_simp.c,v +retrieving revision 1.14 +diff -u -p -a -r1.14 clnt_simp.c +--- glibc/sunrpc/clnt_simp.c 15 May 2002 00:21:00 -0000 1.14 ++++ glibc/sunrpc/clnt_simp.c 8 Feb 2004 14:19:14 -0000 +@@ -55,7 +55,7 @@ struct callrpc_private_s + char *oldhost; + }; + #ifdef _RPC_THREAD_SAFE_ +-#define callrpc_private ((struct callrpc_private_s *)RPC_THREAD_VARIABLE(callrpc_private_s)) ++#define callrpc_private RPC_THREAD_VARIABLE(callrpc_private_s) + #else + static struct callrpc_private_s *callrpc_private; + #endif +Index: sunrpc/key_call.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/key_call.c,v +retrieving revision 1.16 +diff -u -p -a -r1.16 key_call.c +--- glibc/sunrpc/key_call.c 6 Aug 2002 06:08:50 -0000 1.16 ++++ glibc/sunrpc/key_call.c 8 Feb 2004 14:19:14 -0000 +@@ -370,7 +370,7 @@ struct key_call_private { + uid_t uid; /* user-id at last authorization */ + }; + #ifdef _RPC_THREAD_SAFE_ +-#define key_call_private_main ((struct key_call_private *)RPC_THREAD_VARIABLE(key_call_private_s)) ++#define key_call_private_main RPC_THREAD_VARIABLE(key_call_private_s) + #else + static struct key_call_private *key_call_private_main; + #endif +Index: sunrpc/svc.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/svc.c,v +retrieving revision 1.17 +diff -u -p -a -r1.17 svc.c +--- glibc/sunrpc/svc.c 29 Aug 2003 07:45:18 -0000 1.17 ++++ glibc/sunrpc/svc.c 8 Feb 2004 14:19:14 -0000 +@@ -44,7 +44,7 @@ + #include <sys/poll.h> + + #ifdef _RPC_THREAD_SAFE_ +-#define xports ((SVCXPRT **)RPC_THREAD_VARIABLE(svc_xports_s)) ++#define xports RPC_THREAD_VARIABLE(svc_xports_s) + #else + static SVCXPRT **xports; + #endif +@@ -63,7 +63,7 @@ struct svc_callout { + void (*sc_dispatch) (struct svc_req *, SVCXPRT *); + }; + #ifdef _RPC_THREAD_SAFE_ +-#define svc_head ((struct svc_callout *)RPC_THREAD_VARIABLE(svc_head_s)) ++#define svc_head RPC_THREAD_VARIABLE(svc_head_s) + #else + static struct svc_callout *svc_head; + #endif +Index: sunrpc/svc_raw.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/svc_raw.c,v +retrieving revision 1.5 +diff -u -p -a -r1.5 svc_raw.c +--- glibc/sunrpc/svc_raw.c 26 Feb 2002 01:43:56 -0000 1.5 ++++ glibc/sunrpc/svc_raw.c 8 Feb 2004 14:19:14 -0000 +@@ -54,7 +54,7 @@ struct svcraw_private_s + char verf_body[MAX_AUTH_BYTES]; + }; + #ifdef _RPC_THREAD_SAFE_ +-#define svcraw_private ((struct svcraw_private_s *)RPC_THREAD_VARIABLE(svcraw_private_s)) ++#define svcraw_private RPC_THREAD_VARIABLE(svcraw_private_s) + #else + static struct svcraw_private_s *svcraw_private; + #endif +Index: sunrpc/svc_simple.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/svc_simple.c,v +retrieving revision 1.16 +diff -u -p -a -r1.16 svc_simple.c +--- glibc/sunrpc/svc_simple.c 6 Aug 2002 05:10:30 -0000 1.16 ++++ glibc/sunrpc/svc_simple.c 8 Feb 2004 14:19:14 -0000 +@@ -61,7 +61,7 @@ struct proglst_ + struct proglst_ *p_nxt; + }; + #ifdef _RPC_THREAD_SAFE_ +-#define proglst ((struct proglst_ *)RPC_THREAD_VARIABLE(svcsimple_proglst_s)) ++#define proglst RPC_THREAD_VARIABLE(svcsimple_proglst_s) + #else + static struct proglst_ *proglst; + #endif +@@ -69,7 +69,7 @@ static struct proglst_ *proglst; + + static void universal (struct svc_req *rqstp, SVCXPRT *transp_s); + #ifdef _RPC_THREAD_SAFE_ +-#define transp ((SVCXPRT *)RPC_THREAD_VARIABLE(svcsimple_transp_s)) ++#define transp RPC_THREAD_VARIABLE(svcsimple_transp_s) + #else + static SVCXPRT *transp; + #endif +Index: sunrpc/svcauth_des.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/svcauth_des.c,v +retrieving revision 1.8 +diff -u -p -a -r1.8 svcauth_des.c +--- glibc/sunrpc/svcauth_des.c 20 Aug 2001 06:37:09 -0000 1.8 ++++ glibc/sunrpc/svcauth_des.c 8 Feb 2004 14:19:14 -0000 +@@ -72,8 +72,8 @@ struct cache_entry + char *localcred; /* generic local credential */ + }; + #ifdef _RPC_THREAD_SAFE_ +-#define authdes_cache ((struct cache_entry *)RPC_THREAD_VARIABLE(authdes_cache_s)) +-#define authdes_lru ((int *)RPC_THREAD_VARIABLE(authdes_lru_s)) ++#define authdes_cache RPC_THREAD_VARIABLE(authdes_cache_s) ++#define authdes_lru RPC_THREAD_VARIABLE(authdes_lru_s) + #else + static struct cache_entry *authdes_cache; + static int *authdes_lru; + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, Maxfeldstraße 5, 90409 Nürnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." + diff --git a/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-xdr.patch b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-xdr.patch new file mode 100644 index 00000000..4d811e9f --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-allow-gcc-3.5-xdr.patch @@ -0,0 +1,44 @@ +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sunrpc/rpc/xdr.h.diff?r1=1.27&r2=1.28&cvsroot=glibc +(but see also http://sources.redhat.com/ml/libc-alpha/2004-03/msg00267.html +and http://gcc.gnu.org/ml/gcc-patches/2004-03/msg02056.html) + +Fixes errors + +rpc_cmsg.c: In function `xdr_callmsg': +rpc_cmsg.c:70: error: invalid lvalue in increment +rpc_cmsg.c:71: error: invalid lvalue in increment +rpc_cmsg.c:74: error: invalid lvalue in increment +rpc_cmsg.c:77: error: invalid lvalue in increment +rpc_cmsg.c:78: error: invalid lvalue in increment +rpc_cmsg.c:79: error: invalid lvalue in increment +rpc_cmsg.c:81: error: invalid lvalue in increment +rpc_cmsg.c:89: error: invalid lvalue in increment +rpc_cmsg.c:106: error: invalid lvalue in increment +rpc_cmsg.c:107: error: invalid lvalue in increment +rpc_cmsg.c:112: error: invalid lvalue in increment +rpc_cmsg.c:117: error: invalid lvalue in increment +rpc_cmsg.c:118: error: invalid lvalue in increment +rpc_cmsg.c:119: error: invalid lvalue in increment +rpc_cmsg.c:121: error: invalid lvalue in increment +rpc_cmsg.c:160: error: invalid lvalue in increment + +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/rpc/xdr.h,v +retrieving revision 1.27 +retrieving revision 1.28 +diff -u -r1.27 -r1.28 +--- libc/sunrpc/rpc/xdr.h 2002/12/16 02:05:49 1.27 ++++ libc/sunrpc/rpc/xdr.h 2004/03/22 10:52:33 1.28 +@@ -262,10 +262,8 @@ + * and shouldn't be used any longer. Code which use this defines or longs + * in the RPC code will not work on 64bit Solaris platforms ! + */ +-#define IXDR_GET_LONG(buf) \ +- ((long)ntohl((u_long)*__extension__((u_int32_t*)(buf))++)) +-#define IXDR_PUT_LONG(buf, v) \ +- (*__extension__((u_int32_t*)(buf))++ = (long)htonl((u_long)(v))) ++#define IXDR_GET_LONG(buf) ((long)IXDR_GET_U_INT32(buf)) ++#define IXDR_PUT_LONG(buf, v) ((long)IXDR_PUT_INT32(buf, (long)(v))) + #define IXDR_GET_U_LONG(buf) ((u_long)IXDR_GET_LONG(buf)) + #define IXDR_PUT_U_LONG(buf, v) IXDR_PUT_LONG(buf, (long)(v)) + diff --git a/patches/glibc/2.3.2/glibc-2.3.2-alpha-pwrite64.patch b/patches/glibc/2.3.2/glibc-2.3.2-alpha-pwrite64.patch new file mode 100644 index 00000000..809c1b3c --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-alpha-pwrite64.patch @@ -0,0 +1,54 @@ +Fix for this error: + +crosstool-0.28-rc19/build/alpha-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/libc_pic.os(.text+0xd9b2c): In function `posix_fallocate64': +: undefined reference to `__GI___pwrite64' +collect2: ld returned 1 exit status +make[1]: *** [crosstool-0.28-rc19/build/alpha-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/libc.so] Error 1 +make[1]: Leaving directory `crosstool-0.28-rc19/build/alpha-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2' +make: *** [all] Error 2 + +extracted from GLIBC CVS by Dan Kegel +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.14&r2=1.15&cvsroot=glibc' +(to match context of...) +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.16&r2=1.17&cvsroot=glibc' +and rediffed. + +cf. +http://sources.redhat.com/ml/libc-alpha/2003-10/msg00038.html + +Originally thought we needed this hunk, too: +http://sources.redhat.com/ml/libc-alpha/2003-10/msg00037.html +but it seems the sysdep.h change is sufficient, and works better +when compiling against linux-2.4. + +=================================================================== +--- glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/sysdep.h.old 2004-05-24 22:21:44.000000000 -0700 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/alpha/sysdep.h 2004-05-24 22:22:48.000000000 -0700 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2002, 2003 ++/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2002, 2003, 2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995. +@@ -60,6 +60,21 @@ + #define __NR_osf_getsysinfo 256 + #define __NR_osf_setsysinfo 257 + ++/* Help old kernel headers where particular syscalls are not available. */ ++#ifndef __NR_semtimedop ++# define __NR_semtimedop 423 ++#endif ++ ++/* This is a kludge to make syscalls.list find these under the names ++ pread and pwrite, since some kernel headers define those names ++ and some define the *64 names for the same system calls. */ ++#if !defined __NR_pread && defined __NR_pread64 ++# define __NR_pread __NR_pread64 ++#endif ++#if !defined __NR_pwrite && defined __NR_pwrite64 ++# define __NR_pwrite __NR_pwrite64 ++#endif ++ + /* + * In order to get the hidden arguments for rt_sigaction set up + * properly, we need to call the assembly version. Detect this in the diff --git a/patches/glibc/2.3.2/glibc-2.3.2-arm-fix-strlen.patch b/patches/glibc/2.3.2/glibc-2.3.2-arm-fix-strlen.patch new file mode 100644 index 00000000..03e5c5b2 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-arm-fix-strlen.patch @@ -0,0 +1,54 @@ +See also +http://lists.gnu.org/archive/html/bug-glibc/2002-12/msg00056.html +http://lists.arm.linux.org.uk/pipermail/linux-arm-toolchain/2004-June/000016.html + +2002-12-12 Andreas Schwab <schwab@suse.de> + * sysdeps/arm/strlen.S: Fix last word check for big endian. + +To: libc-alpha at sources dot redhat dot com +Subject: [PATCH] REPOST: ARM big-endian strlen() fix +References: <m3brjy27mo.fsf@defiant.pm.waw.pl> +From: Krzysztof Halasa <khc at pm dot waw dot pl> +Date: Thu, 10 Jun 2004 13:41:44 +0200 +Message-ID: <m3r7sn8wsn.fsf@defiant.pm.waw.pl> +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="=-=-=" + +--=-=-= + +The attached patch fixes strlen() on big-endian ARM. Please apply. +Thanks. +-- +Krzysztof Halasa, B*FH + +--=-=-= +Content-Type: text/x-patch +Content-Disposition: inline; filename=glibc-strlen.patch + +--- glibc-2.3.3.old/sysdeps/arm/strlen.S 2003-04-30 00:47:20.000000000 +0200 ++++ glibc-2.3.3/sysdeps/arm/strlen.S 2004-06-06 03:21:48.351931240 +0200 +@@ -53,12 +53,21 @@ + ldrne r2, [r1], $4 @ and we continue to the next word + bne Laligned @ + Llastword: @ drop through to here once we find a ++#ifdef __ARMEB__ ++ tst r2, $0xff000000 @ word that has a zero byte in it ++ addne r0, r0, $1 @ ++ tstne r2, $0x00ff0000 @ and add up to 3 bytes on to it ++ addne r0, r0, $1 @ ++ tstne r2, $0x0000ff00 @ (if first three all non-zero, 4th ++ addne r0, r0, $1 @ must be zero) ++#else + tst r2, $0x000000ff @ word that has a zero byte in it + addne r0, r0, $1 @ + tstne r2, $0x0000ff00 @ and add up to 3 bytes on to it + addne r0, r0, $1 @ + tstne r2, $0x00ff0000 @ (if first three all non-zero, 4th + addne r0, r0, $1 @ must be zero) ++#endif + RETINSTR(mov,pc,lr) + END(strlen) + libc_hidden_builtin_def (strlen) + +--=-=-=-- + diff --git a/patches/glibc/2.3.2/glibc-2.3.2-cross-2.patch b/patches/glibc/2.3.2/glibc-2.3.2-cross-2.patch new file mode 100644 index 00000000..7eae11a4 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-cross-2.patch @@ -0,0 +1,18 @@ +When configuring canadian cross toolchain and you're unlucky enough to be +using a build and host that are different, but that config.sub thinks mean the same thing, +you might end up without BUILD_CC being defined as 'cc' or 'gcc', +which might cause $CC to be used instead, which would be wrong... + +Dan Kegel + +--- glibc-2.3.2/configure.old 2004-05-26 19:46:43.000000000 -0700 ++++ glibc-2.3.2/configure 2004-05-26 19:52:47.000000000 -0700 +@@ -3323,7 +3323,7 @@ + ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' + ac_compiler_gnu=$ac_cv_c_compiler_gnu + +-if test $host != $build; then ++if test "$cross_compiling" = yes; then + for ac_prog in gcc cc + do + # Extract the first word of "$ac_prog", so it can be a program name with args. diff --git a/patches/glibc/2.3.2/glibc-2.3.2-cross.patch b/patches/glibc/2.3.2/glibc-2.3.2-cross.patch new file mode 100644 index 00000000..d28ab9ea --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-cross.patch @@ -0,0 +1,27 @@ +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/resolv/Makefile.diff?r1=1.41&r2=1.42&cvsroot=glibc + +Fixes +/bin/sh: /crosstool-0.15/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.3.2/build-glibc/elf/ld.so.1: cannot execute binary file +make[2]: *** [/crosstool-0.15/build/powerpc-750-linux-gnu/gcc-3.3-glibc-2.3.2/build-glibc/resolv/tst-leaks.out] Error 126 + +2003-03-01 Andreas Schwab <schwab@suse.de> + + * resolv/Makefile (tests): Don't depend on + $(objpfx)mtrace-tst-leaks when cross compiling. + +=================================================================== +RCS file: /cvs/glibc/libc/resolv/Makefile,v +retrieving revision 1.41 +retrieving revision 1.42 +diff -u -r1.41 -r1.42 +--- libc/resolv/Makefile 2003/02/23 03:35:39 1.41 ++++ libc/resolv/Makefile 2003/03/01 22:15:00 1.42 +@@ -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 --git a/patches/glibc/2.3.2/glibc-2.3.2-cygwin.patch b/patches/glibc/2.3.2/glibc-2.3.2-cygwin.patch new file mode 100644 index 00000000..2b468187 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-cygwin.patch @@ -0,0 +1,90 @@ +Fixes +elf/librtld.os: In function `process_envvars': : undefined reference to `__access' +... +when building glibc-2.3.2 on cygwin + +Idea from +http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch +Basically, make glibc use .oST as suffix for 'object static' +instead of .oS, since cygwin has trouble distinguishing .os from .oS +(Original patch had .on, but .oST is more mnemonic for 'object static') + +glibc-linuxthreads-2.3.2 also requires a patch, see +../glibc-linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-cygwin.patch + + +--- glibc-2.3.2/Makeconfig.orig 2003-01-05 21:31:36.000000000 -0800 ++++ glibc-2.3.2/Makeconfig 2004-03-13 23:42:03.781250000 -0800 +@@ -433,13 +433,13 @@ + # run the linked programs. + link-libc = -Wl,-rpath-link=$(rpath-link) \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib) ++ $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib) + # This is how to find at build-time things that will be installed there. + rpath-dirs = math elf dlfcn nss nis rt resolv crypt + else + ifneq (,$(filter aix aix%,$(config-os))) + link-libc = $(common-objpfx)libc.a \ +- $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib) ++ $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib) + rpath-dirs = math dlfcn nss nis rt resolv crypt + endif + endif +@@ -652,7 +652,7 @@ + # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX}) + # to pass different flags for each flavor. + libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o)) +-all-object-suffixes := .o .os .op .og .ob .oS ++all-object-suffixes := .o .os .op .og .ob .oST + object-suffixes := + CPPFLAGS-.o = $(pic-default) + CFLAGS-.o = $(filter %frame-pointer,$(+cflags)) +@@ -706,14 +706,14 @@ + + ifeq (yes,$(build-shared)) + # Build special library that contains the static-only routines for libc. +-object-suffixes-for-libc += .oS ++object-suffixes-for-libc += .oST + + # Must build the routines as PIC, though, because they can end up in (users') + # shared objects. We don't want to use CFLAGS-os because users may, for + # example, make that processor-specific. +-CFLAGS-.oS = $(CFLAGS-.o) $(pic-ccflag) +-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1 +-libtype.oS = lib%_nonshared.a ++CFLAGS-.oST = $(CFLAGS-.o) $(pic-ccflag) ++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1 ++libtype.oST = lib%_nonshared.a + endif + + +--- glibc-2.3.2/Makerules.orig 2003-02-22 15:23:31.000000000 -0800 ++++ glibc-2.3.2/Makerules 2004-03-13 23:43:40.984375000 -0800 +@@ -446,7 +446,7 @@ + # Bounded pointer thunks are only built for *.ob + elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks)) + +-elide-routines.oS += $(filter-out $(static-only-routines),\ ++elide-routines.oST += $(filter-out $(static-only-routines),\ + $(routines) $(aux) $(sysdep_routines)) \ + $(elide-bp-thunks) + elide-routines.os += $(static-only-routines) $(elide-bp-thunks) +@@ -958,7 +958,7 @@ + install: $(inst_libdir)/libc.so + $(inst_libdir)/libc.so: $(common-objpfx)format.lds \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)$(libc-name)) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -966,7 +966,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\ + ')' \ + ) > $@.new + mv -f $@.new $@ diff --git a/patches/glibc/2.3.2/glibc-2.3.2-mips-user.patch b/patches/glibc/2.3.2/glibc-2.3.2-mips-user.patch new file mode 100644 index 00000000..bd70d4a1 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-mips-user.patch @@ -0,0 +1,588 @@ +Retrieved from +http://sources.redhat.com/cgi-bin/get-raw-msg?listname=libc-alpha&date=2003-04&msgid=orfzoof4j0.fsf%40free.redhat.lsd.ic.unicamp.br +paths adjusted, and rediffed against glibc-2.3.2 +(i.e. to compensate for fact that +http://sources.redhat.com/ml/glibc-cvs/2003-q1/msg01155.html +is not present) + +Should fix + +In file included from ../sysdeps/unix/sysv/linux/mips/sys/procfs.h:29, + from ../linuxthreads_db/proc_service.h:20, + from ../linuxthreads_db/thread_dbP.h:7, + from ../linuxthreads/descr.h:43, + from ../linuxthreads/internals.h:29, + from ../linuxthreads/sysdeps/pthread/bits/libc-lock.h:27, + from ../sysdeps/generic/ldsodefs.h:38, + from ../sysdeps/unix/sysv/linux/ldsodefs.h:25, + from ../sysdeps/mips/elf/ldsodefs.h:25, + from ../sysdeps/unix/sysv/linux/init-first.c:30: +../sysdeps/unix/sysv/linux/mips/sys/user.h:26:21: asm/reg.h: No such file or directory +In file included from ../sysdeps/unix/sysv/linux/mips/sys/procfs.h:29, + from ../linuxthreads_db/proc_service.h:20, + from ../linuxthreads_db/thread_dbP.h:7, + from ../linuxthreads/descr.h:43, + from ../linuxthreads/internals.h:29, + from ../linuxthreads/sysdeps/pthread/bits/libc-lock.h:27, + from ../sysdeps/generic/ldsodefs.h:38, + from ../sysdeps/unix/sysv/linux/ldsodefs.h:25, + from ../sysdeps/mips/elf/ldsodefs.h:25, + from ../sysdeps/unix/sysv/linux/init-first.c:30: +../sysdeps/unix/sysv/linux/mips/sys/user.h:30: error: `EF_SIZE' undeclared here (not in a function) +make[2]: *** [mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/csu/init-first.o] Error 1 +make[2]: Leaving directory `mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/csu' +make[1]: *** [csu/subdir_lib] Error 2 +make[1]: Leaving directory `mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2' +make: *** [all] Error 2 + +From libc-alpha-return-12105-listarch-libc-alpha=sources dot redhat dot com at sources dot redhat dot com Sat Apr 12 09:28:56 2003 +Return-Path: <libc-alpha-return-12105-listarch-libc-alpha=sources dot redhat dot com at sources dot redhat dot com> +Delivered-To: listarch-libc-alpha at sources dot redhat dot com +Received: (qmail 2802 invoked by alias); 12 Apr 2003 09:28:56 -0000 +Mailing-List: contact libc-alpha-help at sources dot redhat dot com; run by ezmlm +Precedence: bulk +List-Subscribe: <mailto:libc-alpha-subscribe at sources dot redhat dot com> +List-Archive: <http://sources.redhat.com/ml/libc-alpha/> +List-Post: <mailto:libc-alpha at sources dot redhat dot com> +List-Help: <mailto:libc-alpha-help at sources dot redhat dot com>, <http://sources dot redhat dot com/ml/#faqs> +Sender: libc-alpha-owner at sources dot redhat dot com +Delivered-To: mailing list libc-alpha at sources dot redhat dot com +Received: (qmail 2795 invoked from network); 12 Apr 2003 09:28:55 -0000 +Received: from unknown (HELO lacrosse.corp.redhat.com) (66.187.233.200) + by sources dot redhat dot com with SMTP; 12 Apr 2003 09:28:55 -0000 +Received: from free.redhat.lsd.ic.unicamp.br (aoliva.cipe.redhat.com [10.0.1.10]) + by lacrosse dot corp dot redhat dot com (8 dot 11 dot 6/8 dot 9 dot 3) with ESMTP id h3C9SqV01131 + for <libc-alpha at sources dot redhat dot com>; Sat, 12 Apr 2003 05:28:52 -0400 +Received: from free.redhat.lsd.ic.unicamp.br (free.redhat.lsd.ic.unicamp.br [127.0.0.1]) + by free dot redhat dot lsd dot ic dot unicamp dot br (8 dot 12 dot 8/8 dot 12 dot 8) with ESMTP id h3C9SpVT028734 + for <libc-alpha at sources dot redhat dot com>; Sat, 12 Apr 2003 06:28:51 -0300 +Received: (from aoliva@localhost) + by free dot redhat dot lsd dot ic dot unicamp dot br (8 dot 12 dot 8/8 dot 12 dot 8/Submit) id h3C9SpFb028730; + Sat, 12 Apr 2003 06:28:51 -0300 +To: libc-alpha at sources dot redhat dot com +Subject: signal-handling tweaks for mips/mips64 +From: Alexandre Oliva <aoliva at redhat dot com> +Organization: GCC Team, Red Hat +Date: 12 Apr 2003 06:28:51 -0300 +Message-ID: <orfzoof4j0.fsf@free.redhat.lsd.ic.unicamp.br> +Lines: 49 +User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2 +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="=-=-=" + +--=-=-= + +It was reported to me that ucontext is utterly broken, even in o32 +with a stable 32-bit mips kernel. Indeed, it doesn't match the +ucontext structure defined by the kernel at all. This means that +programs taking real-time signals in o32 won't be able to extract +correct information from the mcontext_t, since the kernel puts data in +there that's in an entirely different format. + +I've looked for any ways in which the current data structures could +possibly be useful, and didn't find any. gdb and rda thought they +were using the register arrays, but it turned out they were using the +arrays in procps instead. makecontext(), [sg]etcontext() et al aren't +implemented on mips, so any uses thereof will just return ENOSYS, +without messing with the given data structure. So, I believe it is +not too late for us to fix it such that it matches the kernel data +structures. + +While at that, I fixed a number of incompatibilities introduced by +either differences between kernel headers that we used to include, +whose contents are different depending on whether asm points to +asm-mips or asm-mips64. + +With this patch, after some pending kernel patches are checked in, one +will be able to obtain the correct information from signal handlers in +all mips ABIs. With n64, this is already true. With o32, it works +with the 32-bit mips kernel, but the mips64 kernel needs a patch to +implement the proper sigcontext ABI. n32 still a patch to be +developed for it to be possible for ucontext to be POSIX-compliant. +Currently, the kernel uses the same ucontext for n32 and n64, but this +doesn't work in n32 because uc_link must be a pointer and stack_t must +contain a pointer and a size_t, whose sizes differ between n32 and +n64. I believe Ralf is working on a patch for the kernel to generate +n32-compliant ucontext when invoking signal handlers in n32 processes. +The only uncertainty is whether uc_flags will be a 32- or 64-bit value +in n32; I left it as the latter, just because I already had that in +place; if it changes, a (simplifying) follow-up patch will be posted. +However, I wanted to circulate the idea of fixing ucontext_t for o32 +as soon as possible, so I didn't wait for a decision on the exact n32 +ABI. + +Ok to install? + + +--=-=-= +Content-Type: text/x-patch +Content-Disposition: inline; filename=mips-sigstuff.patch + +Index: ChangeLog +from Alexandre Oliva <aoliva@redhat.com> + + * sysdeps/unix/sysv/linux/mips/profil-counter: New. + * sysdeps/unix/sysv/linux/mips/sigcontextinfo.h: Port to n32/n64. + * sysdeps/unix/sysv/linux/mips/bits/sigcontext.h: New. + * sysdeps/unix/sysv/linux/mips/sys/ucontext.h: Port to n32/n64. + (mcontext_t): Make it match the 32-bit mips kernel in o32. + * sysdeps/unix/sysv/linux/mips/sys/user.h: Bring in constants from + the mips and mips64 headers. + (struct user): Port to n32/n64. + +Index: sysdeps/unix/sysv/linux/mips/profil-counter.h +=================================================================== +RCS file: sysdeps/unix/sysv/linux/mips/profil-counter.h +diff -N sysdeps/unix/sysv/linux/mips/profil-counter.h +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ libc/sysdeps/unix/sysv/linux/mips/profil-counter.h 12 Apr 2003 09:13:13 -0000 +@@ -0,0 +1,2 @@ ++/* We can use the ix86 version. */ ++#include <sysdeps/unix/sysv/linux/i386/profil-counter.h> +Index: sysdeps/unix/sysv/linux/mips/sigcontextinfo.h +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/mips/sigcontextinfo.h,v +retrieving revision 1.6 +diff -u -p -r1.6 sigcontextinfo.h +--- libc/sysdeps/unix/sysv/linux/mips/sigcontextinfo.h 6 Jul 2001 04:56:18 -0000 1.6 ++++ libc/sysdeps/unix/sysv/linux/mips/sigcontextinfo.h 12 Apr 2003 09:13:13 -0000 +@@ -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. + Contributed by Andreas Jaeger <aj@suse.de>, 2000. + +@@ -18,6 +18,8 @@ + 02111-1307 USA. */ + + ++#if _MIPS_SIM == _MIPS_SIM_ABI32 ++ + #define SIGCONTEXT unsigned long _code, struct sigcontext * + #define SIGCONTEXT_EXTRA_ARGS _code, + #define GET_PC(ctx) ((void *) ctx->sc_pc) +@@ -25,3 +27,15 @@ + #define GET_STACK(ctx) ((void *) ctx->sc_regs[29]) + #define CALL_SIGHANDLER(handler, signo, ctx) \ + (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) ++ ++#else ++ ++#define SIGCONTEXT unsigned long _code, ucontext_t * ++#define SIGCONTEXT_EXTRA_ARGS _code, ++#define GET_PC(ctx) ((void *) ctx->uc_mcontext.pc) ++#define GET_FRAME(ctx) ((void *) ctx->uc_mcontext.gregs[30]) ++#define GET_STACK(ctx) ((void *) ctx->uc_mcontext.gregs[29]) ++#define CALL_SIGHANDLER(handler, signo, ctx) \ ++ (handler)((signo), SIGCONTEXT_EXTRA_ARGS (ctx)) ++ ++#endif +Index: sysdeps/unix/sysv/linux/mips/bits/sigcontext.h +=================================================================== +RCS file: sysdeps/unix/sysv/linux/mips/bits/sigcontext.h +diff -N sysdeps/unix/sysv/linux/mips/bits/sigcontext.h +--- /dev/null 1 Jan 1970 00:00:00 -0000 ++++ libc/sysdeps/unix/sysv/linux/mips/bits/sigcontext.h 12 Apr 2003 09:13:13 -0000 +@@ -0,0 +1,103 @@ ++/* 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 ++ 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 _SIGNAL_H && !defined _SYS_UCONTEXT_H ++# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead." ++#endif ++ ++#ifndef sigcontext_struct ++/* Kernel headers before 2.1.1 define a struct sigcontext_struct, but ++ we need sigcontext. */ ++# define sigcontext_struct sigcontext ++ ++/* # include <asm/sigcontext.h> */ ++/* Instead of including the kernel header, that will vary depending on ++ whether the 32- or the 64-bit kernel is installed, we paste the ++ contents here. In case you're wondering about the different ++ licenses, the fact that the file is pasted, instead of included, ++ doesn't really make any difference for the program that includes ++ this header. */ ++#if _MIPS_SIM == _MIPS_SIM_ABI32 ++/* ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file "COPYING" in the main directory of this archive ++ * for more details. ++ * ++ * Copyright (C) 1996, 1997, 2000 by Ralf Baechle ++ */ ++#ifndef _ASM_SIGCONTEXT_H ++#define _ASM_SIGCONTEXT_H ++ ++/* ++ * Keep this struct definition in sync with the sigcontext fragment ++ * in arch/mips/tools/offset.c ++ */ ++struct sigcontext { ++ unsigned int sc_regmask; /* Unused */ ++ unsigned int sc_status; ++ unsigned long long sc_pc; ++ unsigned long long sc_regs[32]; ++ unsigned long long sc_fpregs[32]; ++ unsigned int sc_ownedfp; /* Unused */ ++ unsigned int sc_fpc_csr; ++ unsigned int sc_fpc_eir; /* Unused */ ++ unsigned int sc_used_math; ++ unsigned int sc_ssflags; /* Unused */ ++ unsigned long long sc_mdhi; ++ unsigned long long sc_mdlo; ++ ++ unsigned int sc_cause; /* Unused */ ++ unsigned int sc_badvaddr; /* Unused */ ++ ++ unsigned long sc_sigset[4]; /* kernel's sigset_t */ ++}; ++ ++#endif /* _ASM_SIGCONTEXT_H */ ++#else /* _MIPS_SIM != _MIPS_SIM_ABI32 */ ++/* ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file "COPYING" in the main directory of this archive ++ * for more details. ++ * ++ * Copyright (C) 1996, 1997, 1999 by Ralf Baechle ++ * Copyright (C) 1999 Silicon Graphics, Inc. ++ */ ++#ifndef _ASM_SIGCONTEXT_H ++#define _ASM_SIGCONTEXT_H ++ ++/* ++ * Keep this struct definition in sync with the sigcontext fragment ++ * in arch/mips/tools/offset.c ++ */ ++struct sigcontext { ++ unsigned long long sc_regs[32]; ++ unsigned long long sc_fpregs[32]; ++ unsigned long long sc_mdhi; ++ unsigned long long sc_mdlo; ++ unsigned long long sc_pc; ++ unsigned int sc_status; ++ unsigned int sc_fpc_csr; ++ unsigned int sc_fpc_eir; ++ unsigned int sc_used_math; ++ unsigned int sc_cause; ++ unsigned int sc_badvaddr; ++}; ++ ++#endif /* _ASM_SIGCONTEXT_H */ ++#endif /* _MIPS_SIM != _MIPS_SIM_ABI32 */ ++#endif +[hunk deleted, see below] +Index: sysdeps/unix/sysv/linux/mips/sys/user.h +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/mips/sys/user.h,v +retrieving revision 1.1 +diff -u -p -r1.1 user.h +--- libc/sysdeps/unix/sysv/linux/mips/sys/user.h 8 Feb 2002 16:21:00 -0000 1.1 ++++ libc/sysdeps/unix/sysv/linux/mips/sys/user.h 12 Apr 2003 09:13:13 -0000 +@@ -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 +@@ -23,7 +23,154 @@ + too much into it. Don't use it for anything other than GDB unless + you know what you are doing. */ + +-#include <asm/reg.h> ++/* #include <asm/reg.h> */ ++/* Instead of including the kernel header, that will vary depending on ++ whether the 32- or the 64-bit kernel is installed, we paste its ++ contents here. Note that the fact that the file is inline here, ++ instead of included separately, doesn't change in any way the ++ licensing status of a program that includes user.h. Since this is ++ for gdb alone, and gdb is GPLed, no surprises here. */ ++#if _MIPS_SIM == _MIPS_SIM_ABI32 ++/* ++ * Various register offset definitions for debuggers, core file ++ * examiners and whatnot. ++ * ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file "COPYING" in the main directory of this archive ++ * for more details. ++ * ++ * Copyright (C) 1995, 1999 by Ralf Baechle ++ */ ++#ifndef __ASM_MIPS_REG_H ++#define __ASM_MIPS_REG_H ++ ++/* ++ * This defines/structures correspond to the register layout on stack - ++ * if the order here is changed, it needs to be updated in ++ * include/asm-mips/stackframe.h ++ */ ++#define EF_REG0 6 ++#define EF_REG1 7 ++#define EF_REG2 8 ++#define EF_REG3 9 ++#define EF_REG4 10 ++#define EF_REG5 11 ++#define EF_REG6 12 ++#define EF_REG7 13 ++#define EF_REG8 14 ++#define EF_REG9 15 ++#define EF_REG10 16 ++#define EF_REG11 17 ++#define EF_REG12 18 ++#define EF_REG13 19 ++#define EF_REG14 20 ++#define EF_REG15 21 ++#define EF_REG16 22 ++#define EF_REG17 23 ++#define EF_REG18 24 ++#define EF_REG19 25 ++#define EF_REG20 26 ++#define EF_REG21 27 ++#define EF_REG22 28 ++#define EF_REG23 29 ++#define EF_REG24 30 ++#define EF_REG25 31 ++/* ++ * k0/k1 unsaved ++ */ ++#define EF_REG28 34 ++#define EF_REG29 35 ++#define EF_REG30 36 ++#define EF_REG31 37 ++ ++/* ++ * Saved special registers ++ */ ++#define EF_LO 38 ++#define EF_HI 39 ++ ++#define EF_CP0_EPC 40 ++#define EF_CP0_BADVADDR 41 ++#define EF_CP0_STATUS 42 ++#define EF_CP0_CAUSE 43 ++ ++#define EF_SIZE 180 /* size in bytes */ ++ ++#endif /* __ASM_MIPS_REG_H */ ++ ++#else /* _MIPS_SIM != _MIPS_SIM_ABI32 */ ++ ++/* ++ * Various register offset definitions for debuggers, core file ++ * examiners and whatnot. ++ * ++ * This file is subject to the terms and conditions of the GNU General Public ++ * License. See the file "COPYING" in the main directory of this archive ++ * for more details. ++ * ++ * Copyright (C) 1995, 1999 Ralf Baechle ++ * Copyright (C) 1995, 1999 Silicon Graphics ++ */ ++#ifndef _ASM_REG_H ++#define _ASM_REG_H ++ ++/* ++ * This defines/structures correspond to the register layout on stack - ++ * if the order here is changed, it needs to be updated in ++ * include/asm-mips/stackframe.h ++ */ ++#define EF_REG0 0 ++#define EF_REG1 1 ++#define EF_REG2 2 ++#define EF_REG3 3 ++#define EF_REG4 4 ++#define EF_REG5 5 ++#define EF_REG6 6 ++#define EF_REG7 7 ++#define EF_REG8 8 ++#define EF_REG9 9 ++#define EF_REG10 10 ++#define EF_REG11 11 ++#define EF_REG12 12 ++#define EF_REG13 13 ++#define EF_REG14 14 ++#define EF_REG15 15 ++#define EF_REG16 16 ++#define EF_REG17 17 ++#define EF_REG18 18 ++#define EF_REG19 19 ++#define EF_REG20 20 ++#define EF_REG21 21 ++#define EF_REG22 22 ++#define EF_REG23 23 ++#define EF_REG24 24 ++#define EF_REG25 25 ++/* ++ * k0/k1 unsaved ++ */ ++#define EF_REG28 28 ++#define EF_REG29 29 ++#define EF_REG30 30 ++#define EF_REG31 31 ++ ++/* ++ * Saved special registers ++ */ ++#define EF_LO 32 ++#define EF_HI 33 ++ ++#define EF_CP0_EPC 34 ++#define EF_CP0_BADVADDR 35 ++#define EF_CP0_STATUS 36 ++#define EF_CP0_CAUSE 37 ++ ++#define EF_SIZE 304 /* size in bytes */ ++ ++#endif /* _ASM_REG_H */ ++ ++#endif /* _MIPS_SIM != _MIPS_SIM_ABI32 */ ++ ++#if _MIPS_SIM == _MIPS_SIM_ABI32 + + struct user + { +@@ -39,6 +186,24 @@ struct user + unsigned long magic; /* identifies a core file */ + char u_comm[32]; /* user command name */ + }; ++ ++#else ++ ++struct user { ++ __extension__ unsigned long regs[EF_SIZE/8+64]; /* integer and fp regs */ ++ __extension__ unsigned long u_tsize; /* text size (pages) */ ++ __extension__ unsigned long u_dsize; /* data size (pages) */ ++ __extension__ unsigned long u_ssize; /* stack size (pages) */ ++ __extension__ unsigned long long start_code; /* text starting address */ ++ __extension__ unsigned long long start_data; /* data starting address */ ++ __extension__ unsigned long long start_stack; /* stack starting address */ ++ __extension__ long long signal; /* signal causing core dump */ ++ __extension__ unsigned long long u_ar0; /* help gdb find registers */ ++ __extension__ unsigned long long magic; /* identifies a core file */ ++ char u_comm[32]; /* user command name */ ++}; ++ ++#endif + + #define PAGE_SHIFT 12 + #define PAGE_SIZE (1UL << PAGE_SHIFT) + +--=-=-= + + +-- +Alexandre Oliva Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/ +Red Hat GCC Developer aoliva@{redhat.com, gcc.gnu.org} +CS PhD student at IC-Unicamp oliva@{lsd.ic.unicamp.br, gnu.org} +Free Software Evangelist Professional serial bug killer + +--=-=-=-- + +And the rediffed hunk: + +--- glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sys/ucontext.h.old 2004-05-30 07:23:32.000000000 -0700 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/mips/sys/ucontext.h 2004-05-30 07:22:56.000000000 -0700 +@@ -29,43 +29,72 @@ + #include <bits/sigcontext.h> + + +-/* Type for general register. */ +-typedef unsigned long int greg_t; ++/* Type for general register. Even in o32 we assume 64-bit registers, ++ like the kernel. */ ++__extension__ typedef unsigned long long int greg_t; + + /* Number of general registers. */ +-#define NGREG 37 +-#define NFPREG 33 ++#define NGREG 32 ++#define NFPREG 32 + + /* Container for all general registers. */ +-/* gregset_t must be an array. The below declared array corresponds to: +-typedef struct gregset { +- greg_t g_regs[32]; +- greg_t g_hi; +- greg_t g_lo; +- greg_t g_pad[3]; +-} gregset_t; */ + typedef greg_t gregset_t[NGREG]; + + /* Container for all FPU registers. */ + typedef struct fpregset { + union { +- double fp_dregs[32]; ++ double fp_dregs[NFPREG]; + struct { + float _fp_fregs; + unsigned int _fp_pad; +- } fp_fregs[32]; ++ } fp_fregs[NFPREG]; + } fp_r; +- unsigned int fp_csr; +- unsigned int fp_pad; + } fpregset_t; + + + /* Context to describe whole processor state. */ ++#if _MIPS_SIM == _MIPS_SIM_ABI32 ++/* Earlier versions of glibc for mips had an entirely different ++ definition of mcontext_t, that didn't even resemble the ++ corresponding kernel data structure. Since all legitimate uses of ++ ucontext_t in glibc mustn't have accessed anything beyond ++ uc_mcontext and, even then, taking a pointer to it, casting it to ++ sigcontext_t, and accessing it as such, which is what it has always ++ been, this can still be rectified. Fortunately, makecontext, ++ [gs]etcontext et all have never been implemented. */ + typedef struct + { ++ unsigned int regmask; ++ unsigned int status; ++ greg_t pc; + gregset_t gregs; + fpregset_t fpregs; ++ unsigned int fp_owned; ++ unsigned int fpc_csr; ++ unsigned int fpc_eir; ++ unsigned int used_math; ++ unsigned int ssflags; ++ greg_t mdhi; ++ greg_t mdlo; ++ unsigned int cause; ++ unsigned int badvaddr; + } mcontext_t; ++#else ++typedef struct ++ { ++ gregset_t gregs; ++ fpregset_t fpregs; ++ greg_t mdhi; ++ greg_t mdlo; ++ greg_t pc; ++ unsigned int status; ++ unsigned int fpc_csr; ++ unsigned int fpc_eir; ++ unsigned int used_math; ++ unsigned int cause; ++ unsigned int badvaddr; ++ } mcontext_t; ++#endif + + /* Userlevel context. */ + typedef struct ucontext diff --git a/patches/glibc/2.3.2/glibc-2.3.2-mips.patch b/patches/glibc/2.3.2/glibc-2.3.2-mips.patch new file mode 100644 index 00000000..20944294 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-mips.patch @@ -0,0 +1,60 @@ +From Bill Gatliff, who said: +"Attached is a glibc-2.3.2 patchfile I use for MIPS. Versions prior to and including glibc-2.3.2 won't build without it." + +diff -bBurN glibc-2.3.2.orig/elf/dl-conflict.c glibc-2.3.2/elf/dl-conflict.c +--- glibc-2.3.2.orig/elf/dl-conflict.c 2003-06-12 21:07:54.000000000 -0500 ++++ glibc-2.3.2/elf/dl-conflict.c 2003-06-12 21:09:12.000000000 -0500 +@@ -33,6 +33,7 @@ + _dl_resolve_conflicts (struct link_map *l, ElfW(Rela) *conflict, + ElfW(Rela) *conflictend) + { ++#ifndef _DL_HAVE_NO_ELF_MACHINE_RELA + if (__builtin_expect (GL(dl_debug_mask) & DL_DEBUG_RELOC, 0)) + _dl_printf ("\nconflict processing: %s\n", + l->l_name[0] ? l->l_name : rtld_progname); +@@ -64,4 +65,5 @@ + for (; conflict < conflictend; ++conflict) + elf_machine_rela (l, conflict, NULL, NULL, (void *) conflict->r_offset); + } ++#endif + } +diff -bBurN glibc-2.3.2.orig/sysdeps/mips/dl-machine.h glibc-2.3.2/sysdeps/mips/dl-machine.h +--- glibc-2.3.2.orig/sysdeps/mips/dl-machine.h 2003-06-12 21:07:49.000000000 -0500 ++++ glibc-2.3.2/sysdeps/mips/dl-machine.h 2003-06-12 21:11:10.000000000 -0500 +@@ -56,6 +56,10 @@ + #define ELF_MACHINE_JMP_SLOT R_MIPS_REL32 + #define elf_machine_type_class(type) ELF_RTYPE_CLASS_PLT + ++/* MIPS doesn't support RELA; see: ++ http://lists.debian.org/debian-mips/2002/debian-mips-200209/msg00020.html */ ++#define _DL_HAVE_NO_ELF_MACHINE_RELA ++ + /* Translate a processor specific dynamic tag to the index + in l_info array. */ + #define DT_MIPS(x) (DT_MIPS_##x - DT_LOPROC + DT_NUM) +diff -bBurN glibc-2.3.2.orig/sysdeps/mips/Makefile glibc-2.3.2/sysdeps/mips/Makefile +--- glibc-2.3.2.orig/sysdeps/mips/Makefile 2003-06-12 21:07:48.000000000 -0500 ++++ glibc-2.3.2/sysdeps/mips/Makefile 2003-06-12 21:10:14.000000000 -0500 +@@ -6,3 +6,11 @@ + ifeq ($(subdir),setjmp) + sysdep_routines += setjmp_aux + endif ++ ++ifeq ($(subdir),csu) ++ifeq (yes,$(build-shared)) ++# Compatibility ++sysdep_routines += divdi3 ++shared-only-routines += divdi3 ++endif ++endif +diff -bBurN glibc-2.3.2.orig/sysdeps/unix/sysv/linux/mips/syscalls.list glibc-2.3.2/sysdeps/unix/sysv/linux/mips/syscalls.list +--- glibc-2.3.2.orig/sysdeps/unix/sysv/linux/mips/syscalls.list 2003-06-12 21:07:53.000000000 -0500 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/mips/syscalls.list 2003-06-12 21:12:30.000000000 -0500 +@@ -41,6 +41,7 @@ + sys_mknod xmknod mknod i:sii __syscall_mknod + + # System calls with wrappers. ++s_readahead EXTRA readahead i:iipi __syscall_readahead + rt_sigaction - rt_sigaction i:ippi __syscall_rt_sigaction + rt_sigpending - rt_sigpending i:pi __syscall_rt_sigpending + rt_sigprocmask - rt_sigprocmask i:ippi __syscall_rt_sigprocmask diff --git a/patches/glibc/2.3.2/glibc-2.3.2-override.patch b/patches/glibc/2.3.2/glibc-2.3.2-override.patch new file mode 100644 index 00000000..17c999d1 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-override.patch @@ -0,0 +1,38 @@ +The error + +make[2]: *** [.../gcc-3.3.3-glibc-2.1.3/i686-unknown-linux-gnu/share/zoneinfo/Africa/Algiers] Segmentation fault +make[2]: Leaving directory `.../gcc-3.3.3-glibc-2.1.3/glibc-2.1.3/timezone' +make[1]: *** [timezone/subdir_install] Error 2 + +is caused by glibc trying to run something it just compiled. +A crude workaround for this was posted at +http://lists.scratchbox.org/pipermail/scratchbox-users/2004-February/000018.html +but the following patch lets you optionally override these programs at +make time by setting Make variables + localedef_FOR_BUILD rpcgen_FOR_BUILD zic_FOR_BUILD +and maybe a few others to point to versions of those programs +that can run on the build machine. +Thanks to http://groups.google.com/groups?selm=9012160052.AA23106%40kaos.ksr.com +for pointing out the idiom for inline $(ifdef ...) in GNU Make. + +Dan Kegel 2004-05-17 +[rediffed for glibc-2.3.2] +[typos corrected - those are make variables, not environment variables, + and it's $(built-program-override-name), not $(build-program-override-name)] + +--- glibc-2.3.2/Makeconfig.old 2004-05-17 13:53:46.000000000 -0700 ++++ glibc-2.3.2/Makeconfig 2004-05-17 14:09:59.000000000 -0700 +@@ -534,9 +534,12 @@ + run-program-prefix = + endif + # Never use $(run-program-prefix) for the statically-linked %-bp test programs +-built-program-cmd = $(patsubst %,$(run-program-prefix),\ ++built-program-real = $(patsubst %,$(run-program-prefix),\ + $(filter-out %-bp,$(built-program-file))) \ + $(built-program-file) ++# If user set foo_FOR_BUILD, use that instead of actually running the program we just linked. ++built-program-override-name = $(notdir $(word 2,$^))_FOR_BUILD ++built-program-cmd = $(if $(findstring undefined,$(origin $(built-program-override-name))),$(built-program-real),$($(built-program-override-name))) + + ifndef LD + LD := ld -X diff --git a/patches/glibc/2.3.2/glibc-2.3.2-powerpc-as.patch b/patches/glibc/2.3.2/glibc-2.3.2-powerpc-as.patch new file mode 100644 index 00000000..02c72b1c --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-powerpc-as.patch @@ -0,0 +1,58 @@ +Retrieved from + http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/powerpc/powerpc32/Makefile.diff?r1=1.4&r2=1.5&cvsroot=glibc + http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/powerpc/powerpc64/Makefile.diff?r1=1.2&r2=1.3&cvsroot=glibc +Fixes + /tmp/ccEVhqgD.s:279: Error: Unrecognized opcode: `stvx' + /tmp/ccEVhqgD.s:288: Error: Unrecognized opcode: `lvx' + make[2]: *** [powerpc-7450-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/dlfcn/eval.os] Error 1 + make[2]: Leaving directory `powerpc-7450-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/dlfcn' + make[1]: *** [dlfcn/others] Error 2 + make[1]: Leaving directory `powerpc-7450-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2' + make: *** [all] Error 2 + + +Revision 1.5 Wed Oct 22 21:30:02 2003 UTC (7 months, 1 week ago) by roland +Branch: MAIN +CVS Tags: HEAD +Changes since 1.4: +0 -3 lines +Diff to previous 1.4 (colored) + +2003-10-22 Steven Munroe <sjmunroe@us.ibm.com> + + * sysdeps/powerpc/powerpc32/Makefile (+cflags, asm-CPPFLAGS): Don't + append options to these. + * sysdeps/powerpc/powerpc64/Makefile (+cflags, asm-CPPFLAGS): Likewise. + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/powerpc/powerpc32/Makefile,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/sysdeps/powerpc/powerpc32/Makefile 2003/01/27 21:02:01 1.4 ++++ libc/sysdeps/powerpc/powerpc32/Makefile 2003/10/22 21:30:02 1.5 +@@ -1,8 +1,5 @@ + # Powerpc32 specific build options. + +-+cflags += -Wa,-mppc -mpowerpc +-asm-CPPFLAGS += -Wa,-mppc +- + ifeq ($(with-fp),no) + +cflags += -msoft-float + sysdep-LDFLAGS += -msoft-float +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/powerpc/powerpc64/Makefile,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/sysdeps/powerpc/powerpc64/Makefile 2002/09/27 19:44:16 1.2 ++++ libc/sysdeps/powerpc/powerpc64/Makefile 2003/10/22 21:30:03 1.3 +@@ -1,9 +1,6 @@ + # Powerpc64 specific build options. + # this is ./sysdeps/powerpc/powerpc64/Makefile + +-+cflags += -Wa,-mppc64 -mpowerpc64 +-asm-CPPFLAGS += -Wa,-mppc64 +- + # Each TOC entry takes 8 bytes and the TOC holds up to 2^16 bytes, + # or 8192 entries. + # If -fpic is not specified, the latest gcc-3.2.1 now generates diff --git a/patches/glibc/2.3.2/glibc-2.3.2-pr139-fix.patch b/patches/glibc/2.3.2/glibc-2.3.2-pr139-fix.patch new file mode 100644 index 00000000..96e8fb3b --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-pr139-fix.patch @@ -0,0 +1,104 @@ +2004-04-29 Jakub Jelinek <jakub@redhat.com> + + * sysdeps/sparc/sparc64/soft-fp/qp_qtoi.c (_Qp_qtoi): Use %f31 + for single precision register, add it to __asm clobbers [BZ #139]. + * sysdeps/sparc/sparc64/soft-fp/qp_qtoui.c (_Qp_qtoui): Use %f31 + for single precision register, add it to __asm clobbers. + * sysdeps/sparc/sparc64/soft-fp/qp_qtoux.c (_Qp_qtoux): Use fqtox + instead of fqtoi in QP_HANDLE_EXCEPTIONS. + * sysdeps/sparc/sparc64/soft-fp/qp_qtox.c (_Qp_qtox): Likewise. + Reported by M. H. VanLeeuwen <vanl@megsinet.net>. + +See http://sources.redhat.com/bugzilla/show_bug.cgi?id=139 +Fixes error +qp_qtoi.s:261: Error: Illegal operands: There are only 32 single precision f registers; [0-31] +plus a couple other things vanl noticed. + +diff -ur orig/qp_qtoi.c new/qp_qtoi.c +--- orig/qp_qtoi.c Sat May 1 00:40:06 2004 ++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtoi.c Sat May 1 00:39:40 2004 +@@ -1,6 +1,6 @@ + /* Software floating-point emulation. + Return (int)(*a) +- Copyright (C) 1997,1999 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). +@@ -38,9 +38,9 @@ + __asm ( + " ldd [%1], %%f52\n" + " ldd [%1+8], %%f54\n" +-" fqtoi %%f52, %%f60\n" +-" st %%f60, [%0]\n" +-" " : : "r" (&rx), "r" (a) : QP_CLOBBER); ++" fqtoi %%f52, %%f31\n" ++" st %%f31, [%0]\n" ++" " : : "r" (&rx), "r" (a) : QP_CLOBBER, "f31"); + r = rx); + + return r; +diff -ur orig/qp_qtoui.c new/qp_qtoui.c +--- orig/qp_qtoui.c Sat May 1 00:40:06 2004 ++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtoui.c Sat May 1 00:39:40 2004 +@@ -1,6 +1,6 @@ + /* Software floating-point emulation. + Return (unsigned int)(*a) +- Copyright (C) 1997,1999 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). +@@ -38,9 +38,9 @@ + __asm ( + " ldd [%1], %%f52\n" + " ldd [%1+8], %%f54\n" +-" fqtoi %%f52, %%f60\n" +-" st %%f60, [%0]\n" +-" " : : "r" (&rx), "r" (a) : QP_CLOBBER); ++" fqtoi %%f52, %%f31\n" ++" st %%f31, [%0]\n" ++" " : : "r" (&rx), "r" (a) : QP_CLOBBER, "f31"); + r = rx); + + return r; +diff -ur orig/qp_qtoux.c new/qp_qtoux.c +--- orig/qp_qtoux.c Sat May 1 00:40:06 2004 ++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtoux.c Sat May 1 00:39:40 2004 +@@ -1,6 +1,6 @@ + /* Software floating-point emulation. + Return (unsigned long)(*a) +- Copyright (C) 1997,1999 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). +@@ -38,7 +38,7 @@ + __asm ( + " ldd [%1], %%f52\n" + " ldd [%1+8], %%f54\n" +-" fqtoi %%f52, %%f60\n" ++" fqtox %%f52, %%f60\n" + " std %%f60, [%0]\n" + " " : : "r" (&rx), "r" (a) : QP_CLOBBER); + r = rx); +diff -ur orig/qp_qtox.c new/qp_qtox.c +--- orig/qp_qtox.c Sat May 1 00:40:06 2004 ++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtox.c Sat May 1 00:39:40 2004 +@@ -1,6 +1,6 @@ + /* Software floating-point emulation. + Return (long)(*a) +- Copyright (C) 1997,1999 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). +@@ -38,7 +38,7 @@ + __asm ( + " ldd [%1], %%f52\n" + " ldd [%1+8], %%f54\n" +-" fqtoi %%f52, %%f60\n" ++" fqtox %%f52, %%f60\n" + " std %%f60, [%0]\n" + " " : : "r" (&rx), "r" (a) : QP_CLOBBER); + r = rx); diff --git a/patches/glibc/2.3.2/glibc-2.3.2-sh4-socket.patch b/patches/glibc/2.3.2/glibc-2.3.2-sh4-socket.patch new file mode 100644 index 00000000..51de6c8b --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-sh4-socket.patch @@ -0,0 +1,39 @@ +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/sh/socket.S.diff?r1=1.5&r2=1.6&cvsroot=glibc + +Ankur Sheth said: +"The problem that I ran into was that multi-threaded apps would crash with a +seg fault when they invoked some of the socket calls (sendto() in my case. +This happened only on the sh4. Turns out that a certain register (PR) was +not being saved and restored properly before and after invoking the system +call. This patch fixes it. It applies cleanly on glibc 2.3.2. +[Thanks to Kaz for helping us find this.]" + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/sh/socket.S,v +retrieving revision 1.5 +retrieving revision 1.6 +diff -u -r1.5 -r1.6 +--- libc/sysdeps/unix/sysv/linux/sh/socket.S 2003/01/05 11:07:44 1.5 ++++ libc/sysdeps/unix/sysv/linux/sh/socket.S 2003/07/12 01:25:53 1.6 +@@ -94,7 +94,9 @@ + #if defined NEED_CANCELLATION && defined CENABLE + .Lsocket_cancel: + /* Enable asynchronous cancellation. */ ++ sts.l pr,@-r15 + CENABLE ++ lds.l @r15+,pr + + /* Do the system call trap. */ + mov #+P(SOCKOP_,socket), r4 +@@ -102,9 +104,11 @@ + mov.l .L1,r3 + trapa #0x12 + ++ sts.l pr,@-r15 + mov.l r0,@-r15 + CDISABLE + mov.l @r15+,r0 ++ lds.l @r15+,pr + + /* Pop args off the stack */ + P(POPARGS_,NARGS) diff --git a/patches/glibc/2.3.2/glibc-2.3.2-sh4-trapa.patch b/patches/glibc/2.3.2/glibc-2.3.2-sh4-trapa.patch new file mode 100644 index 00000000..f93bb6fb --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-sh4-trapa.patch @@ -0,0 +1,55 @@ +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/sh/sysdep.h.diff?r1=1.9&r2=1.10&cvsroot=glibc + +Ankur Sheth said: + +"This is actually a workaround for a bug in the sh4. The actual bug is +documented here : +http://documentation.renesas.com/eng/products/mpumcu/tu/tnsh7456ae.pdf +Basically the cache & TLB should not be accessed for 4 (or was it 5?) cycles +after isssuing a TRAPA instruction. I didn't run into any specific problem +because of this bug, but it seems useful to have and the patch itself seems +pretty harmless." + + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/sh/sysdep.h,v +retrieving revision 1.9 +retrieving revision 1.10 +diff -u -r1.9 -r1.10 +--- libc/sysdeps/unix/sysv/linux/sh/sysdep.h 2003/09/01 04:05:21 1.9 ++++ libc/sysdeps/unix/sysv/linux/sh/sysdep.h 2003/10/15 04:36:32 1.10 +@@ -183,6 +183,13 @@ + # endif /* _LIBC_REENTRANT */ + #endif /* PIC */ + ++# ifdef NEED_SYSCALL_INST_PAD ++# define SYSCALL_INST_PAD \ ++ or r0,r0; or r0,r0; or r0,r0; or r0,r0; or r0,r0 ++# else ++# define SYSCALL_INST_PAD ++# endif ++ + #define SYSCALL_INST0 trapa #0x10 + #define SYSCALL_INST1 trapa #0x11 + #define SYSCALL_INST2 trapa #0x12 +@@ -195,19 +202,13 @@ + #define DO_CALL(syscall_name, args) \ + mov.l 1f,r3; \ + SYSCALL_INST##args; \ ++ SYSCALL_INST_PAD; \ + bra 2f; \ + nop; \ + .align 2; \ + 1: .long SYS_ify (syscall_name); \ + 2: + +-# ifdef NEED_SYSCALL_INST_PAD +-# define SYSCALL_INST_PAD \ +- or r0,r0; or r0,r0; or r0,r0; or r0,r0; or r0,r0 +-# else +-# define SYSCALL_INST_PAD +-# endif +- + #else /* not __ASSEMBLER__ */ + + #define SYSCALL_INST_STR0 "trapa #0x10\n\t" diff --git a/patches/glibc/2.3.2/glibc-2.3.2-sparc32-sysdep.patch b/patches/glibc/2.3.2/glibc-2.3.2-sparc32-sysdep.patch new file mode 100644 index 00000000..289f66e6 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-sparc32-sysdep.patch @@ -0,0 +1,46 @@ +Fixes the error + +<stdin>: Assembler messages: +<stdin>:2: Error: junk at end of line, first unrecognized character is `1' ... +<stdin>:2: Error: Illegal operands: PC-relative operand can't be a constant +make[4]: *** [/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/io/rtld-open.os] Error 1 +make[4]: Leaving directory `/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/io' +make[3]: *** [/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/io/rtld-xstat64.os] Error 2 +make[3]: Leaving directory `/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/elf' +make[2]: *** [/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/elf/rtld-libc.a] Error 2 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/elf' +make[1]: *** [elf/subdir_lib] Error 2 + +when building glibc-2.3.2 with gcc-3.4.0 for sparc32. + +The .s file left behind by -save-temps contains the big long line + +.text; .global __libc_open; .align 4; __libc_open:; .type __libc_open,@function;; mov 5, %g1; ta 0x10; bcs __syscall_error_handler; nop; .section .gnu.linkonce.t. 1 .get_pic.l7,"ax",@progbits; .globl 1 .get_pic.l7; .hidden 1 .get_pic.l7; .type 1 .get_pic.l7,@function; 1 .get_pic.l7: retl; add %o7, %l7, %l7; .previous; .subsection 3; __syscall_error_handler: save %sp,-96,%sp; sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %l7; call 1 .get_pic.l7; add %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7; ld [%l7 + errno], %l0; st %i0, [%l0]; jmpl %i7+8, %g0; restore %g0, -1, %o0; .previous; + retl; nop + +The error messages appear to refer to the '1 .get_pic.17', e.g. + .globl 1 .get_pic.l7; .hidden 1 .get_pic.l7; +which seems to come from +glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h +where it appears originally as + .globl __sparc.get_pic.l7; \ + .hidden __sparc.get_pic.l7; \ + +Note that __sparc is a predefined symbol on Solaris and some other environments; +it's not surprising to see it predefined on Linux, too. + + +--- glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h.old 2004-05-15 10:23:11.000000000 -0700 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h 2004-05-15 10:24:12.000000000 -0700 +@@ -39,6 +39,11 @@ + #undef END + #undef LOC + ++/* gcc-3.4.0 seems to expand __sparc as a predefined preprocessor symbol, which we don't want here */ ++#ifdef __sparc ++#undef __sparc ++#endif ++ + #define ENTRY(name) \ + .global C_SYMBOL_NAME(name); \ + .align 4;\ diff --git a/patches/glibc/2.3.2/glibc-2.3.2-sparc64-dl-machine.patch b/patches/glibc/2.3.2/glibc-2.3.2-sparc64-dl-machine.patch new file mode 100644 index 00000000..20cb7998 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-sparc64-dl-machine.patch @@ -0,0 +1,29 @@ +See http://gcc.gnu.org/PR15345 + +Quick kludge by H.J.Lu +Works around gcc-3.4.0 error which shows up when building glibc-2.3.2 for sparc64: + +.../sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/libc.a(dl-reloc.o)(.text+0x4b4): In function `elf_machine_load_address.3': +: undefined reference to `_DYNAMIC' +collect2: ld returned 1 exit status +make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/elf/sln] Error 1 + + +--- glibc-2.3.2/sysdeps/sparc/sparc64/dl-machine.h.orig Sat May 8 20:54:26 2004 ++++ glibc-2.3.2/sysdeps/sparc/sparc64/dl-machine.h Sat May 8 17:18:04 2004 +@@ -65,6 +65,7 @@ + } + + /* Return the run-time load address of the shared object. */ ++#ifdef IS_IN_rtld + static inline Elf64_Addr + elf_machine_load_address (void) + { +@@ -84,6 +85,7 @@ + pc[3]*4 is l_addr + _GLOBAL_OFFSET_TABLE_ - (long)pc - 12 */ + return (Elf64_Addr) got - *got + (Elf32_Sword) ((pc[2] - pc[3]) * 4) - 4; + } ++#endif + + /* We have 4 cases to handle. And we code different code sequences + for each one. I love V9 code models... */ diff --git a/patches/glibc/2.3.2/glibc-2.3.2-sparc64-pause.patch b/patches/glibc/2.3.2/glibc-2.3.2-sparc64-pause.patch new file mode 100644 index 00000000..13e33812 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-sparc64-pause.patch @@ -0,0 +1,22 @@ +From: "M.H.VanLeeuwen" +Subject: crosstool, sparc64, linux 2.6.4, gcc 3.3.3, glibc 2.3.2 success +Date: Mon, 15 Mar 2004 00:23:04 -0600 +To: crossgcc@sources.redhat.com +Message-ID: <40554BC8.749A5EC3@megsinet.net> +... + +backported from GLIBC CVS + +Fixes: +../sysdeps/unix/sysv/linux/sparc/sparc64/pause.c:1:39: sysdeps/unix/common/pause.c: No such file or directory +make[2]: *** [/cross/build/sparc64-unknown-linux-gnu/gcc-3.3.2-glibc-2.3.2/build-glibc/posix/pause.o] Error 1 +make[2]: Leaving directory `/cross/build/sparc64-unknown-linux-gnu/gcc-3.3.2-glibc-2.3.2/glibc-2.3.2/posix' +make[1]: *** [posix/subdir_lib] Error 2 +make: *** [all] Error 2 + +========================================================================================================================= +--- glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc64/pause.c.orig Sun Mar 7 08:51:20 2004 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc64/pause.c Sun Mar 7 08:51:29 2004 +@@ -1 +1 @@ +-#include <sysdeps/unix/common/pause.c> ++#include <sysdeps/posix/pause.c> diff --git a/patches/glibc/2.3.2/glibc-2.3.2-sparc64-pwrite64.patch b/patches/glibc/2.3.2/glibc-2.3.2-sparc64-pwrite64.patch new file mode 100644 index 00000000..9eefe578 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-sparc64-pwrite64.patch @@ -0,0 +1,36 @@ +Fix for this error: + +/cross/crosstool-0.27/build/sparc64-unknown-linux-gnu/gcc-3.3.3-glibc-2.3.2/build-glibc/libc_pic.os(.text+0xc4d28): In function `posix_fallocate64': +: undefined reference to `__GI___pwrite64' +collect2: ld returned 1 exit status +make[1]: *** [/cross/crosstool-0.27/build/sparc64-unknown-linux-gnu/gcc-3.3.3-glibc-2.3.2/build-glibc/libc.so] Error 1 + +extracted from GLIBC CVS by M.H.VanLeeuwen + +cf. +http://sources.redhat.com/ml/libc-alpha/2003-10/msg00038.html + +Originally thought we needed this hunk, too: +http://sources.redhat.com/ml/libc-alpha/2003-10/msg00037.html +but it seems the sysdep.h change is sufficient, and works better +when compiling against linux-2.4. + +--- glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h.orig Sat Mar 13 02:01:51 2004 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h Sat Mar 13 02:02:20 2004 +@@ -29,6 +29,16 @@ + #undef SYS_ify + #define SYS_ify(syscall_name) __NR_##syscall_name + ++/* This is a kludge to make syscalls.list find these under the names ++ pread and pwrite, since some kernel headers define those names ++ and some define the *64 names for the same system calls. */ ++#if !defined __NR_pread && defined __NR_pread64 ++# define __NR_pread __NR_pread64 ++#endif ++#if !defined __NR_pwrite && defined __NR_pwrite64 ++# define __NR_pwrite __NR_pwrite64 ++#endif ++ + #ifdef __ASSEMBLER__ + + #define LOADSYSCALL(x) mov __NR_##x, %g1 diff --git a/patches/glibc/2.3.2/glibc-2.3.2-without-fp.patch b/patches/glibc/2.3.2/glibc-2.3.2-without-fp.patch new file mode 100644 index 00000000..76cdfaad --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.2-without-fp.patch @@ -0,0 +1,89 @@ +Sender: libc-alpha-owner@sources.redhat.com +Date: Tue, 29 Jul 2003 17:49:47 -0400 +From: Daniel Jacobowitz <drow@mvista.com> +To: GNU C Library <libc-alpha@sources.redhat.com> +Subject: Re: __sim_exceptions undefined when linking glibc-2.3.2's libm.so with --without-fp +Message-ID: <20030729214947.GA29932@nevyn.them.org> + +On Tue, Jul 29, 2003 at 02:53:33PM -0700, Dan Kegel wrote: +> On ppc405, I'm getting the following when linking glibc's libm: +> /gcc-3.3-glibc-2.3.2/build-glibc/math/libm_pic.a(fclrexcpt.os)(.text+0x1a): +> In function `feclearexcept@GLIBC_2.1': +> : undefined reference to `__sim_exceptions' +> +> That symbol seems to be present in libc.so. nm shows + +--without-fp doesn't work. Try this. Make up a changelog entry if it +works. + +Date: Tue, 29 Jul 2003 14:56:50 -0700 +Message-Id: <200307292156.h6TLuol24356@magilla.sf.frob.com> +From: Roland McGrath <roland@redhat.com> +To: Daniel Jacobowitz <drow@mvista.com> +Cc: GNU C Library <libc-alpha@sources.redhat.com> +Subject: Re: __sim_exceptions undefined when linking glibc-2.3.2's libm.so with --without-fp +In-Reply-To: Daniel Jacobowitz's message of Tuesday, 29 July 2003 17:49:47 -0400 <20030729214947.GA29932@nevyn.them.org> + +> +int __sim_exceptions __attribute__ ((section(".bss"))); + +Use __attribute__ ((nocommon)) instead (and please watch the standard +whitespace conventions, i.e. ``section (''). + +diff -purN glibc-2.3.2.orig/sysdeps/powerpc/nofpu/sim-full.c glibc-2.3.2/sysdeps/powerpc/nofpu/sim-full.c +--- glibc-2.3.2.orig/sysdeps/powerpc/nofpu/sim-full.c 2002-10-19 16:06:29.000000000 -0400 ++++ glibc-2.3.2/sysdeps/powerpc/nofpu/sim-full.c 2003-05-14 15:10:42.000000000 -0400 +@@ -24,11 +24,14 @@ + + /* Global to store sticky exceptions. */ +-int __sim_exceptions; ++int __sim_exceptions __attribute__ ((nocommon)); ++libc_hidden_data_def (__sim_exceptions); + + /* By default, no exceptions should trap. */ + int __sim_disabled_exceptions = 0xffffffff; ++libc_hidden_data_def (__sim_disabled_exceptions); + +-int __sim_round_mode; ++int __sim_round_mode __attribute__ ((nocommon)); ++libc_hidden_data_def (__sim_round_mode); + + void + __simulate_exceptions (int x) +diff -purN glibc-2.3.2.orig/sysdeps/powerpc/nofpu/soft-supp.h glibc-2.3.2/sysdeps/powerpc/nofpu/soft-supp.h +--- glibc-2.3.2.orig/sysdeps/powerpc/nofpu/soft-supp.h 2002-10-19 16:06:29.000000000 -0400 ++++ glibc-2.3.2/sysdeps/powerpc/nofpu/soft-supp.h 2003-05-14 15:09:53.000000000 -0400 +@@ -27,7 +27,11 @@ typedef union + } fenv_union_t; + + +-extern int __sim_exceptions attribute_hidden; +-extern int __sim_disabled_exceptions attribute_hidden; +-extern int __sim_round_mode attribute_hidden; ++extern int __sim_exceptions; ++libc_hidden_proto (__sim_exceptions); ++extern int __sim_disabled_exceptions; ++libc_hidden_proto (__sim_disabled_exceptions); ++extern int __sim_round_mode; ++libc_hidden_proto (__sim_round_mode); ++ + extern void __simulate_exceptions (int x) attribute_hidden; +diff -urp glibc-2.3.2.orig/sysdeps/powerpc/soft-fp/sfp-machine.h glibc-2.3.2/sysdeps/powerpc/soft-fp/sfp-machine.h +--- glibc-2.3.2.orig/sysdeps/powerpc/soft-fp/sfp-machine.h 2002-10-17 18:36:14.000000000 -0400 ++++ glibc-2.3.2/sysdeps/powerpc/soft-fp/sfp-machine.h 2003-05-14 16:48:13.000000000 -0400 +@@ -52,7 +52,11 @@ + #define FP_HANDLE_EXCEPTIONS __simulate_exceptions (_fex) + #define FP_ROUNDMODE __sim_round_mode + +-extern int __sim_exceptions attribute_hidden; +-extern int __sim_disabled_exceptions attribute_hidden; +-extern int __sim_round_mode attribute_hidden; ++extern int __sim_exceptions; ++libc_hidden_proto (__sim_exceptions); ++extern int __sim_disabled_exceptions; ++libc_hidden_proto (__sim_disabled_exceptions); ++extern int __sim_round_mode; ++libc_hidden_proto (__sim_round_mode); ++ + extern void __simulate_exceptions (int x) attribute_hidden; + + diff --git a/patches/glibc/2.3.2/glibc-2.3.3-allow-gcc-4.0-configure.patch b/patches/glibc/2.3.2/glibc-2.3.3-allow-gcc-4.0-configure.patch new file mode 100644 index 00000000..3f568aee --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.3-allow-gcc-4.0-configure.patch @@ -0,0 +1,30 @@ +Fixes following problem building glibc-2.3.3 with gcc-4.0: + +checking version of i686-unknown-linux-gnu-gcc ... 4.0.0, bad +checking for gnumake... no +checking for gmake... gmake +checking version of gmake... 3.79.1, ok +checking for gnumsgfmt... no +checking for gmsgfmt... no +checking for msgfmt... msgfmt +checking version of msgfmt... 0.11.4, ok +checking for makeinfo... makeinfo +checking version of makeinfo... 4.3, ok +checking for sed... sed +checking version of sed... 4.0.5, ok +checking for autoconf... autoconf +checking whether autoconf works... yes +configure: error: +*** These critical programs are missing or too old: gcc + +--- glibc-2.3.3/configure.old Mon Mar 14 12:01:10 2005 ++++ glibc-2.3.3/configure Mon Mar 14 12:02:03 2005 +@@ -3899,7 +3899,7 @@ + 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]*) ++ 3.[2-9]*|4.[01]*) + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + diff --git a/patches/glibc/2.3.2/glibc-2.3.3-allow-gcc-4.0-powerpc-procfs.patch b/patches/glibc/2.3.2/glibc-2.3.3-allow-gcc-4.0-powerpc-procfs.patch new file mode 100644 index 00000000..0c824bcf --- /dev/null +++ b/patches/glibc/2.3.2/glibc-2.3.3-allow-gcc-4.0-powerpc-procfs.patch @@ -0,0 +1,65 @@ +(Combined with earlier fix old/glibc-2.3.2-powerpc-procfs.patch +from http://sources.redhat.com/ml/libc-alpha/2003-12/msg00101.html) + +This fix discussed here: +http://gcc.gnu.org/ml/gcc/2005-01/msg00509.html + +Revision 1.12, Wed Mar 2 20:11:38 2005 UTC by roland +Branch: MAIN +CVS Tags: fedora-glibc-20050303T1335, HEAD +Changes since 1.11: +3 -8 lines +Diff to previous 1.11 (colored) + +2005-02-21 Alan Modra <amodra@bigpond.net.au> + + * sysdeps/unix/sysv/linux/powerpc/sys/procfs.h (elf_vrreg_t): Don't + use __uint128_t. + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h?cvsroot=glibc +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h.diff?r1=1.11&r2=1.12&cvsroot=glibc + +Fixes + +In file included from ../linuxthreads_db/proc_service.h:20, + from ../linuxthreads_db/thread_dbP.h:7, + from ../linuxthreads/descr.h:44, + from ../linuxthreads/internals.h:30, + from ../linuxthreads/sysdeps/pthread/bits/libc-lock.h:27, + from ../sysdeps/generic/ldsodefs.h:38, + from ../sysdeps/unix/sysv/linux/ldsodefs.h:25, + from <stdin>:2: +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: error: syntax error before 'elf_vrreg_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: type defaults to 'int' in declaration of 'elf_vrreg_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: data definition has no type or storage class +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: error: syntax error before 'elf_vrregset_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: type defaults to 'int' in declaration of 'elf_vrregset_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: data definition has no type or storage class +make[2]: make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/csu' + +Rediffed against glibc-2.3.3 + +--- glibc-2.3.3.orig/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h Sun Jan 12 00:24:23 2003 ++++ glibc-2.3.3.new/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h Fri Mar 18 11:20:58 2005 +@@ -45,18 +45,13 @@ + + typedef double elf_fpreg_t; + typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; +-#endif +- +-/* gcc 3.1 and newer support __uint128_t. */ +-#if !__GNUC_PREREQ(3,1) +-typedef struct { +- unsigned long u[4]; +-} __attribute((aligned(16))) __uint128_t; +-#endif + + /* Altivec registers */ +-typedef __uint128_t elf_vrreg_t; ++typedef struct { ++ unsigned int u[4]; ++} __attribute__ ((aligned (16))) elf_vrreg_t; + typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG]; ++#endif + + struct elf_siginfo + { diff --git a/patches/glibc/2.3.2/glibc-configure-apple-as.patch b/patches/glibc/2.3.2/glibc-configure-apple-as.patch new file mode 100644 index 00000000..604c36d5 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-configure-apple-as.patch @@ -0,0 +1,23 @@ +http://in3www.epfl.ch/~schaffne/glibc-configure-apple-as.patch +http://sources.redhat.com/ml/crossgcc/2004-02/msg00151.html + +The following makes it possible to configure glibc-2.3.2 on Mac OS X, +where the assembler but doesn't understand the --version flag. + +Fixes the symptom +checking whether ld is GNU ld... no +checking for /usr/libexec/gcc/darwin/ppc/as... /usr/libexec/gcc/darwin/ppc/as +checking version of /usr/libexec/gcc/darwin/ppc/as... +<PAUSES HERE AND JUST SITS THERE DOING NOTHING> + +--- glibc-2.3.2/configure~ Wed Feb 26 09:20:48 2003 ++++ glibc-2.3.2/configure Fri Feb 27 13:12:53 2004 +@@ -3789,7 +3789,7 @@ + # Found it, now check the version. + echo "$as_me:$LINENO: checking version of $AS" >&5 + echo $ECHO_N "checking version of $AS... $ECHO_C" >&6 +- ac_prog_version=`$AS --version 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'` ++ ac_prog_version=`$AS -v </dev/null 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 2.1[3-9]*) diff --git a/patches/glibc/2.3.2/glibc-drow-sh.patch b/patches/glibc/2.3.2/glibc-drow-sh.patch new file mode 100644 index 00000000..82984e54 --- /dev/null +++ b/patches/glibc/2.3.2/glibc-drow-sh.patch @@ -0,0 +1,77 @@ +[pread changes deleted, since those seem to be specific to glibc-2.3.2] + +Date: Thu, 19 Jun 2003 20:02:07 -0400 +From: Daniel Jacobowitz <drow@false.org> +Subject: [linux-sh:02808] Patch needed for CVS glibc on SH +To: linux-sh@m17n.org, libc-alpha@sources.redhat.com +Message-Id: <20030620000207.GA19907@nevyn.them.org> +X-ML-Name: linux-sh +X-Mail-Count: 02808 +X-MLServer: fml [fml 4.0.1]; post only (only members can post) +X-ML-Info: If you have a question, send e-mail with the body + "help" (without quotes) to the address linux-sh-ctl@m17n.org; + help=<mailto:linux-sh-ctl@m17n.org?body=help> +Mail-Followup-To: linux-sh@m17n.org, libc-alpha@sources.redhat.com +Content-Disposition: inline +User-Agent: Mutt/1.5.1i +Mime-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Precedence: bulk +Lines: 74 +List-Software: fml [fml 4.0.1] +List-Post: <mailto:linux-sh@m17n.org> +List-Owner: <mailto:linux-sh-admin@m17n.org> +List-Help: <mailto:linux-sh-ctl@m17n.org?body=help> +List-Unsubscribe: <mailto:linux-sh-ctl@m17n.org?body=unsubscribe> +List-Id: linux-sh.m17n.org + +I believe this flushes my current patches to make glibc work on SH. Issues: + - MIPS pread functions have some wackiness in them for the MIPS calling + conventions, which align long longs to even register pairs; it appears + that SH does not do this. This fixes pread64/pwrite64. + - st_ino is _NOT_ 64-bit in the latest SH kernel trees, or at least it + wasn't when I checked in April. --enable-kernel=2.4.x breaks terribly + without this patch; the errors are along the lines of "version GLIBC_2.3 + not found", because that's the first consequence of a messed up inode + field - ld.so compares by inodes at some point. + +-- +Daniel Jacobowitz +MontaVista Software Debian GNU/Linux Developer + +2003-06-19 Daniel Jacobowitz <drow@mvista.com> + + * sysdeps/unix/sysv/linux/kernel-features.h: Update kernel features + for the SH architecture. + * sysdeps/unix/sysv/linux/sh/pread.c: Use generic Linux version + instead of the MIPS version. + * sysdeps/unix/sysv/linux/sh/pread64.c: Likewise. + * sysdeps/unix/sysv/linux/sh/pwrite.c: Likewise. + * sysdeps/unix/sysv/linux/sh/pwrite64.c: Likewise. + +--- glibc-2.3.2/sysdeps/unix/sysv/linux/kernel-features.h.org 2003-04-21 10:57:55.000000000 -0400 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/kernel-features.h 2003-04-21 11:16:47.000000000 -0400 +@@ -151,11 +151,20 @@ + + /* The changed st_ino field appeared in 2.4.0-test6. But we cannot + distinguish this version from other 2.4.0 releases. Therefore play +- save and assume it available is for 2.4.1 and up. */ +-#if __LINUX_KERNEL_VERSION >= 132097 ++ save and assume it available is for 2.4.1 and up. However, SH is lame, ++ and still does not have a 64-bit inode field. */ ++#if __LINUX_KERNEL_VERSION >= 132097 \ ++ && !defined __sh__ + # define __ASSUME_ST_INO_64_BIT 1 + #endif + ++/* SH kernels got stat64, mmap2, and truncate64 during 2.4.0-test. */ ++#if __LINUX_KERNEL_VERSION >= 132096 && defined __sh__ ++# define __ASSUME_TRUNCATE64_SYSCALL 1 ++# define __ASSUME_MMAP2_SYSCALL 1 ++# define __ASSUME_STAT64_SYSCALL 1 ++#endif ++ + /* To support locking of large files a new fcntl() syscall was introduced + in 2.4.0-test7. We test for 2.4.1 for the earliest version we know + the syscall is available. */ + diff --git a/patches/glibc/2.3.2/glibc-fp-byteorder.patch b/patches/glibc/2.3.2/glibc-fp-byteorder.patch new file mode 100644 index 00000000..f20432ea --- /dev/null +++ b/patches/glibc/2.3.2/glibc-fp-byteorder.patch @@ -0,0 +1,203 @@ +Taken from http://sources.redhat.com/ml/crossgcc/2004-02/msg00104.html +Author: addsub@eyou.com +Target: ARM + +Fixes http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/920501-8.c +and makes printf("%f", 1.0) work. + +Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00115.html : + It ... fixes the 'printf("%f\n", 0.5); prints 0.000000' and general 'floating point + is broken' on my big-endian hardfloat FPA ARM platform. ... + It's definitely needed for hardfloat. So I'd think it's needed for + big-endian systems in any case, and for VFP on little-endian systems + too. Someone would have to verify that though. + +Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00123.html + I just had a look at glibc-20040830, and [this patch] is still needed and useful + for this version. glibc-20040830 out-of-the-box still contains the + following wrong assumptions: + - sysdeps/arm/bits/endian.h: float word order is big endian (which it is + not on vfp systems) + - sysdeps/arm/gmp-mparam.h: IEEE doubles are mixed endian (which they + are not on big endian systems, neither on vfp systems) + - sysdeps/arm/ieee754.h: IEEE doubles are in little endian byte order + (which they are not on big endian systems) + [This patch] seems the right solution for all of these issues. + +Dimitry Andric wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00132.html : + It's even needed for glibc CVS, AFAICS. + The patch hunk which modifies glibc.new/sysdeps/arm/bits/endian.h + (currently at version 1.4) is only needed for proper VFP operation. + But the hunk which modifies sysdeps/arm/gmp-mparam.h, and the hunk + that deletes sysdeps/arm/ieee754.h (yes, this IS correct), are needed + for proper operation of *any* FP model on big endian ARM. + +See also discussion in followups to +http://sources.redhat.com/ml/crossgcc/2004-05/msg00245.html) + +Message-ID: <276985760.37584@eyou.com> +Received: from unknown (HELO eyou.com) (172.16.2.2) + by 0.0.0.0 with SMTP; Tue, 17 Feb 2004 10:42:40 +0800 +Received: (qmail 8238 invoked by uid 65534); 17 Feb 2004 10:42:38 +0800 +Date: 17 Feb 2004 10:42:38 +0800 +Message-ID: <20040217104238.8237.qmail@eyou.com> +From: "add" <addsub@eyou.com> +To: dank@kegel.com +Reply-To: "add" <addsub@eyou.com> +Subject: Re: problem while building arm vfp softfloat gcc ` + +Hi, Dan, This is a patch I applied to my glibc-2.3.2, then my softfloat +toolchain can printf("%f\n",1.0). So you may have a try of this + + +diff -uNrp glibc.old/sysdeps/arm/bits/endian.h glibc.new/sysdeps/arm/bits/endian.h +--- glibc.old/sysdeps/arm/bits/endian.h 1999-04-12 11:59:13.000000000 -0400 ++++ glibc.new/sysdeps/arm/bits/endian.h 2004-02-12 09:15:13.000000000 -0500 +@@ -9,4 +9,9 @@ + #else + #define __BYTE_ORDER __LITTLE_ENDIAN + #endif ++ ++#ifdef __VFP_FP__ ++#define __FLOAT_WORD_ORDER __BYTE_ORDER ++#else + #define __FLOAT_WORD_ORDER __BIG_ENDIAN ++#endif +diff -uNrp glibc.old/sysdeps/arm/gmp-mparam.h glibc.new/sysdeps/arm/gmp-mparam.h +--- glibc.old/sysdeps/arm/gmp-mparam.h 2001-07-07 15:21:19.000000000 -0400 ++++ glibc.new/sysdeps/arm/gmp-mparam.h 2004-02-12 09:15:13.000000000 -0500 +@@ -26,5 +26,13 @@ MA 02111-1307, USA. */ + #define BITS_PER_SHORTINT 16 + #define BITS_PER_CHAR 8 + +-#define IEEE_DOUBLE_BIG_ENDIAN 0 +-#define IEEE_DOUBLE_MIXED_ENDIAN 1 ++#if defined(__ARMEB__) ++# define IEEE_DOUBLE_MIXED_ENDIAN 0 ++# define IEEE_DOUBLE_BIG_ENDIAN 1 ++#elif defined(__VFP_FP__) ++# define IEEE_DOUBLE_MIXED_ENDIAN 0 ++# define IEEE_DOUBLE_BIG_ENDIAN 0 ++#else ++# define IEEE_DOUBLE_BIG_ENDIAN 0 ++# define IEEE_DOUBLE_MIXED_ENDIAN 1 ++#endif +diff -uNrp glibc.old/sysdeps/arm/ieee754.h glibc.new/sysdeps/arm/ieee754.h +--- glibc.old/sysdeps/arm/ieee754.h 2001-07-07 15:21:19.000000000 -0400 ++++ glibc.new/sysdeps/arm/ieee754.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,115 +0,0 @@ +-/* Copyright (C) 1992, 1995, 1996, 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 _IEEE754_H +- +-#define _IEEE754_H 1 +-#include <features.h> +- +-#include <endian.h> +- +-__BEGIN_DECLS +- +-union ieee754_float +- { +- float f; +- +- /* This is the IEEE 754 single-precision format. */ +- struct +- { +- unsigned int mantissa:23; +- unsigned int exponent:8; +- unsigned int negative:1; +- } ieee; +- +- /* This format makes it easier to see if a NaN is a signalling NaN. */ +- struct +- { +- unsigned int mantissa:22; +- unsigned int quiet_nan:1; +- unsigned int exponent:8; +- unsigned int negative:1; +- } ieee_nan; +- }; +- +-#define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */ +- +- +-union ieee754_double +- { +- double d; +- +- /* This is the IEEE 754 double-precision format. */ +- struct +- { +- unsigned int mantissa0:20; +- unsigned int exponent:11; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- } ieee; +- +- /* This format makes it easier to see if a NaN is a signalling NaN. */ +- struct +- { +- unsigned int mantissa0:19; +- unsigned int quiet_nan:1; +- unsigned int exponent:11; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- } ieee_nan; +- }; +- +-#define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ +- +- +-/* The following two structures are correct for `new' floating point systems but +- wrong for the old FPPC. The only solution seems to be to avoid their use on +- old hardware. */ +- +-union ieee854_long_double +- { +- long double d; +- +- /* This is the IEEE 854 double-extended-precision format. */ +- struct +- { +- unsigned int exponent:15; +- unsigned int empty:16; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- unsigned int mantissa0:32; +- } ieee; +- +- /* This is for NaNs in the IEEE 854 double-extended-precision format. */ +- struct +- { +- unsigned int exponent:15; +- unsigned int empty:16; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- unsigned int mantissa0:30; +- unsigned int quiet_nan:1; +- unsigned int one:1; +- } ieee_nan; +- }; +- +-#define IEEE854_LONG_DOUBLE_BIAS 0x3fff +- +-__END_DECLS +- +-#endif /* ieee754.h */ diff --git a/patches/glibc/2.3.2/glibc-test-lowram.patch b/patches/glibc/2.3.2/glibc-test-lowram.patch new file mode 100644 index 00000000..2308629a --- /dev/null +++ b/patches/glibc/2.3.2/glibc-test-lowram.patch @@ -0,0 +1,14 @@ +--- glibc-2.2.5/malloc/tst-calloc.c.old Sun Aug 3 16:17:58 2003 ++++ glibc-2.2.5/malloc/tst-calloc.c Sun Aug 3 16:20:01 2003 +@@ -24,9 +24,8 @@ + #include <stdio.h> + + +-/* Number of samples per size. */ +-#define N 50000 +- ++/* Number of samples per size. This is also the maximum memory consumption in kilobytes. */ ++#define N 8000 + + static void + fixed_test (int size) diff --git a/patches/glibc/2.3.2/nobits.patch b/patches/glibc/2.3.2/nobits.patch new file mode 100644 index 00000000..c639051a --- /dev/null +++ b/patches/glibc/2.3.2/nobits.patch @@ -0,0 +1,27 @@ +Fix build on architectures (like arm) where gas accepts @ as comment. + +First reported here: +http://sources.redhat.com/ml/libc-alpha/2003-04/msg00265.html + +In use here: +http://www.netwinder.org/autobuild/nw-9/patches/glibc-2.3.2-nobits.patch + +Committed to cvs: +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/include/libc-symbols.h.diff?r1=1.52&r2=1.53&cvsroot=glibc + +=================================================================== +RCS file: /cvs/glibc/libc/include/libc-symbols.h,v +retrieving revision 1.52 +retrieving revision 1.53 +diff -u -r1.52 -r1.53 +--- libc/include/libc-symbols.h 2003/04/30 04:18:03 1.52 ++++ libc/include/libc-symbols.h 2003/05/02 02:20:48 1.53 +@@ -247,7 +247,7 @@ + __attribute__ ((unused, section (".gnu.warning." #symbol __sec_comment))) \ + = msg; + # define libc_freeres_ptr(decl) \ +- __make_section_unallocated ("__libc_freeres_ptrs, \"aw\", @nobits") \ ++ __make_section_unallocated ("__libc_freeres_ptrs, \"aw\", %nobits") \ + decl __attribute__ ((section ("__libc_freeres_ptrs" __sec_comment))) + # define __libc_freeres_fn_section \ + __attribute__ ((section ("__libc_freeres_fn"))) diff --git a/patches/glibc/2.3.2/old/glibc-2.3.2-powerpc-procfs.patch b/patches/glibc/2.3.2/old/glibc-2.3.2-powerpc-procfs.patch new file mode 100644 index 00000000..e0bf46dc --- /dev/null +++ b/patches/glibc/2.3.2/old/glibc-2.3.2-powerpc-procfs.patch @@ -0,0 +1,28 @@ +See http://sources.redhat.com/ml/libc-alpha/2003-12/msg00101.html +Fixes +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: error: conflicting types for 'elf_vrreg_t' +when building glibc-2.3.2 for powerpc64 and linux-2.6.x + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h,v +retrieving revision 1.10 +retrieving revision 1.11 +diff -u -r1.10 -r1.11 +--- libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h 2003/01/12 08:24:23 1.10 ++++ libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h 2003/12/17 23:09:34 1.11 +@@ -45,7 +45,6 @@ + + typedef double elf_fpreg_t; + typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; +-#endif + + /* gcc 3.1 and newer support __uint128_t. */ + #if !__GNUC_PREREQ(3,1) +@@ -57,6 +56,7 @@ + /* Altivec registers */ + typedef __uint128_t elf_vrreg_t; + typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG]; ++#endif + + struct elf_siginfo + { diff --git a/patches/glibc/2.3.2/sscanf.patch b/patches/glibc/2.3.2/sscanf.patch new file mode 100644 index 00000000..b18985ac --- /dev/null +++ b/patches/glibc/2.3.2/sscanf.patch @@ -0,0 +1,80 @@ +2003-03-05 Roland McGrath <roland@redhat.com> + + * stdio-common/sscanf.c: Use prototype defn with ... syntax. + * libio/swscanf.c: Likewise. + * libio/swprintf.c: Likewise. + +=================================================================== +RCS file: /cvs/glibc/libc/stdio-common/sscanf.c,v +retrieving revision 1.8 +retrieving revision 1.9 +diff -u -r1.8 -r1.9 +--- libc/stdio-common/sscanf.c 2002/08/10 09:24:42 1.8 ++++ libc/stdio-common/sscanf.c 2003/03/05 19:58:03 1.9 +@@ -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; +=================================================================== +RCS file: /cvs/glibc/libc/libio/swprintf.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/libio/swprintf.c 2001/07/06 04:55:32 1.3 ++++ libc/libio/swprintf.c 2003/03/05 19:58:03 1.4 +@@ -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; +=================================================================== +RCS file: /cvs/glibc/libc/libio/swscanf.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/libio/swscanf.c 2001/07/06 04:55:32 1.2 ++++ libc/libio/swscanf.c 2003/03/05 19:58:03 1.3 +@@ -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 --git a/patches/glibc/2.3.2/string2-typedef.patch b/patches/glibc/2.3.2/string2-typedef.patch new file mode 100644 index 00000000..1cf48467 --- /dev/null +++ b/patches/glibc/2.3.2/string2-typedef.patch @@ -0,0 +1,35 @@ +See http://gcc.gnu.org/ml/gcc/2003-08/msg00959.html + +Compiling glibc-2.3.2 with a gcc-3.4 snapshot, I'm seeing +a whole bunch of warnings like this: + +../string/bits/string2.h:80: warning: `packed' attribute ignored +../string/bits/string2.h:81: warning: `packed' attribute ignored +... + +Looks like it was bad code that was silently ignored by previous compilers. +Ulrich fixed it as follows: + +=================================================================== +RCS file: /cvs/glibc/libc/string/bits/string2.h,v +retrieving revision 1.68 +retrieving revision 1.69 +diff -u -r1.68 -r1.69 +--- libc/string/bits/string2.h 2002/05/25 06:10:18 1.68 ++++ libc/string/bits/string2.h 2003/08/20 00:07:37 1.69 +@@ -1,5 +1,5 @@ + /* Machine-independant string function optimizations. +- 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 <drepper@cygnus.com>, 1997. + +@@ -76,7 +76,7 @@ + use unaligned memory accesses. */ + # define __STRING2_COPY_TYPE(N) \ + typedef struct { unsigned char __arr[N]; } \ +- __STRING2_COPY_ARR##N __attribute__ ((packed)) ++ __attribute__ ((__packed__)) __STRING2_COPY_ARR##N + __STRING2_COPY_TYPE (2); + __STRING2_COPY_TYPE (3); + __STRING2_COPY_TYPE (4); diff --git a/patches/glibc/2.3.3/arm-ctl_bus_isa.patch b/patches/glibc/2.3.3/arm-ctl_bus_isa.patch new file mode 100644 index 00000000..3422070b --- /dev/null +++ b/patches/glibc/2.3.3/arm-ctl_bus_isa.patch @@ -0,0 +1,51 @@ +Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004. +Needed to build glibc with linux kernels 2.4.23 or higher on ARM, +Fixes following error: + +../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys': +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]') +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]') +make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1 + +cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA", http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html + +--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old 2003-02-20 14:22:24.000000000 -0800 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c 2004-01-31 16:01:50.000000000 -0800 +@@ -47,6 +47,12 @@ + #include <asm/page.h> + #include <sys/sysctl.h> + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include <linux/version.h> ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23)) ++#define CTL_BUS_ISA BUS_ISA /* and hope it's not the one from linux/input.h */ ++#endif ++ + #define PATH_ARM_SYSTYPE "/etc/arm_systype" + #define PATH_CPUINFO "/proc/cpuinfo" + +@@ -80,7 +86,7 @@ + * Initialize I/O system. There are several ways to get the information + * we need. Each is tried in turn until one succeeds. + * +- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*). This is the preferred method ++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*). This is the preferred method + * but not all kernels support it. + * + * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE. +@@ -100,8 +106,8 @@ + { + char systype[256]; + int i, n; +- static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE }; +- static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT }; ++ static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE }; ++ static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT }; + size_t len = sizeof(io.base); + + if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0) diff --git a/patches/glibc/2.3.3/bad/glibc-2.3.3-alpha-pwrite64.patch b/patches/glibc/2.3.3/bad/glibc-2.3.3-alpha-pwrite64.patch new file mode 100644 index 00000000..fadee0e7 --- /dev/null +++ b/patches/glibc/2.3.3/bad/glibc-2.3.3-alpha-pwrite64.patch @@ -0,0 +1,51 @@ +Attempted fix for this error: + + +crosstool-0.30/build/alpha-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.3/build-glibc/libc_pic.os(.text+0xc8bd0): In function `__posix_fallocate64_l64': +: undefined reference to `__GI___pwrite64' +collect2: ld returned 1 exit status +make[1]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-0.30/build/alpha-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.3/glibc-2.3.3' +make[1]: *** [/home/dank/queue/jobdir.fast2/crosstool-0.30/build/alpha-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.3/build-glibc/libc.so] Error 1 +make: *** [all] Error 2 + +extracted from GLIBC CVS by Dan Kegel +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.14&r2=1.15&cvsroot=glibc' +(to match context of...) +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.16&r2=1.17&cvsroot=glibc' +and rediffed. + +cf. +http://sources.redhat.com/ml/libc-alpha/2003-10/msg00038.html + +Originally thought we needed this hunk, too: +http://sources.redhat.com/ml/libc-alpha/2003-10/msg00037.html +but it seems the sysdep.h change is sufficient, and works better +when compiling against linux-2.4. + +And then rediffed again against glibc-2.3.3 + +--- glibc-2.3.3.orig/sysdeps/unix/sysv/linux/alpha/sysdep.h Fri Jun 20 09:24:36 2003 ++++ glibc-2.3.3/sysdeps/unix/sysv/linux/alpha/sysdep.h Wed Mar 23 23:59:58 2005 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2002, 2003 ++/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2002, 2003, 2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995. +@@ -63,6 +63,16 @@ + /* Help old kernel headers where particular syscalls are not available. */ + #ifndef __NR_semtimedop + # define __NR_semtimedop 423 ++#endif ++ ++/* This is a kludge to make syscalls.list find these under the names ++ pread and pwrite, since some kernel headers define those names ++ and some define the *64 names for the same system calls. */ ++#if !defined __NR_pread && defined __NR_pread64 ++# define __NR_pread __NR_pread64 ++#endif ++#if !defined __NR_pwrite && defined __NR_pwrite64 ++# define __NR_pwrite __NR_pwrite64 + #endif + + /* diff --git a/patches/glibc/2.3.3/fixup.patch b/patches/glibc/2.3.3/fixup.patch new file mode 100644 index 00000000..5f1e8a4e --- /dev/null +++ b/patches/glibc/2.3.3/fixup.patch @@ -0,0 +1,74 @@ +Fixes +dl-runtime.c:56: error: conflicting types for 'fixup' +../sysdeps/i386/dl-machine.h:158: error: previous declaration of 'fixup' was here +when building with gcc-3.4.0 + +First hunk: +Define ARCH_FIXUP_ATTRIBUTE and use it in the fixup function declarations. +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/dl-machine.h.diff?r1=1.124&r2=1.125&cvsroot=glibc + +Second hunk: +If ARCH_FIXUP_ATTRIBUTE is not defined, provide dummy definition. +Use macro in fixup function definitions. +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/elf/dl-runtime.c.diff?r1=1.64&r2=1.65&cvsroot=glibc +[rediffed against glibc-2.3.2] + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/i386/dl-machine.h,v +retrieving revision 1.124 +retrieving revision 1.125 +diff -u -r1.124 -r1.125 +--- libc/sysdeps/i386/dl-machine.h 2004/03/05 10:14:49 1.124 ++++ libc/sysdeps/i386/dl-machine.h 2004/03/09 07:42:29 1.125 +@@ -154,11 +154,14 @@ + destroys the passed register information. */ + /* GKM FIXME: Fix trampoline to pass bounds so we can do + without the `__unbounded' qualifier. */ +-static ElfW(Addr) fixup (struct link_map *__unbounded l, ElfW(Word) reloc_offset) +- __attribute__ ((regparm (2), unused)); ++#define ARCH_FIXUP_ATTRIBUTE __attribute__ ((regparm (3), unused)) ++ ++static ElfW(Addr) fixup (struct link_map *__unbounded l, ++ ElfW(Word) reloc_offset) ++ ARCH_FIXUP_ATTRIBUTE; + static ElfW(Addr) profile_fixup (struct link_map *l, ElfW(Word) reloc_offset, + ElfW(Addr) retaddr) +- __attribute__ ((regparm (3), unused)); ++ ARCH_FIXUP_ATTRIBUTE; + # endif + + /* This code is used in dl-runtime.c to call the `fixup' function +=================================================================== +--- /home/dank/downloads/glibc-2.3.2/elf/dl-runtime.c Fri Feb 7 11:41:12 2003 ++++ glibc-2.3.2/elf/dl-runtime.c Thu Apr 8 22:24:26 2004 +@@ -36,6 +36,12 @@ + # define VERSYMIDX(sym) (DT_NUM + DT_THISPROCNUM + DT_VERSIONTAGIDX (sym)) + #endif + ++/* The fixup functions might have need special attributes. If none ++ are provided define the macro as empty. */ ++#ifndef ARCH_FIXUP_ATTRIBUTE ++# define ARCH_FIXUP_ATTRIBUTE ++#endif ++ + + /* This function is called through a special trampoline from the PLT the + first time each PLT entry is called. We must perform the relocation +@@ -45,7 +51,7 @@ + function. */ + + #ifndef ELF_MACHINE_NO_PLT +-static ElfW(Addr) __attribute_used__ ++static ElfW(Addr) __attribute_used__ ARCH_FIXUP_ATTRIBUTE + fixup ( + # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS + ELF_MACHINE_RUNTIME_FIXUP_ARGS, +@@ -132,7 +138,7 @@ + + #if !defined PROF && !defined ELF_MACHINE_NO_PLT && !__BOUNDED_POINTERS__ + +-static ElfW(Addr) __attribute_used__ ++static ElfW(Addr) __attribute_used__ ARCH_FIXUP_ATTRIBUTE + profile_fixup ( + #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS + ELF_MACHINE_RUNTIME_FIXUP_ARGS, diff --git a/patches/glibc/2.3.3/glibc-2.2.5-allow-gcc-4.0-malloc.patch b/patches/glibc/2.3.3/glibc-2.2.5-allow-gcc-4.0-malloc.patch new file mode 100644 index 00000000..2d9f0924 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.2.5-allow-gcc-4.0-malloc.patch @@ -0,0 +1,48 @@ +Fixes +programs/ld-collate.c: In function 'obstack_int32_grow': +programs/ld-collate.c:48: error: invalid lvalue in increment +programs/ld-collate.c: In function 'obstack_int32_grow_fast': +programs/ld-collate.c:57: error: invalid lvalue in increment + +Change taken by eyeball from version 1.20 at +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/malloc/obstack.h?cvsroot=glibc + +--- /home/dank/downloads/glibc-2.2.5/malloc/obstack.h 2001-07-05 21:55:35.000000000 -0700 ++++ glibc-2.2.5/malloc/obstack.h 2005-03-11 16:12:16.175812224 -0800 +@@ -423,22 +423,29 @@ + ({ struct obstack *__o = (OBSTACK); \ + if (__o->next_free + sizeof (void *) > __o->chunk_limit) \ + _obstack_newchunk (__o, sizeof (void *)); \ +- *((void **)__o->next_free)++ = (datum); \ +- (void) 0; }) ++ obstack_ptr_grow_fast (__o, datum); }) + + # define obstack_int_grow(OBSTACK,datum) \ + __extension__ \ + ({ struct obstack *__o = (OBSTACK); \ + if (__o->next_free + sizeof (int) > __o->chunk_limit) \ + _obstack_newchunk (__o, sizeof (int)); \ +- *((int *)__o->next_free)++ = (datum); \ ++ obstack_int_grow_fast (__o, datum); }) ++ ++# define obstack_ptr_grow_fast(OBSTACK,aptr) \ ++__extension__ \ ++({ struct obstack *__o1 = (OBSTACK); \ ++ *(const void **) __o1->next_free = (aptr); \ ++ __o1->next_free += sizeof (const void *); \ + (void) 0; }) + +-# define obstack_ptr_grow_fast(h,aptr) \ +- (*((void **) (h)->next_free)++ = (aptr)) ++# define obstack_int_grow_fast(OBSTACK,aint) \ ++__extension__ \ ++({ struct obstack *__o1 = (OBSTACK); \ ++ *(int *) __o1->next_free = (aint); \ ++ __o1->next_free += sizeof (int); \ ++ (void) 0; }) + +-# define obstack_int_grow_fast(h,aint) \ +- (*((int *) (h)->next_free)++ = (aint)) + + # define obstack_blank(OBSTACK,length) \ + __extension__ \ diff --git a/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.4-inline.patch b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.4-inline.patch new file mode 100644 index 00000000..cdcd7ba0 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.4-inline.patch @@ -0,0 +1,23 @@ +Fixes +cc1: error: invalid parameter `max-inline-insns' +make[2]: *** [/home/dank/wk/crosstool-0.28-rc6/build/powerpc64-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/elf/dl-load.o] Error 1 +when building with gcc-3.4.0, which no longer has a single +--max-inline-insns parameter. + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/powerpc/powerpc64/Makefile.diff?r1=1.3&r2=1.4&cvsroot=glibc + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/powerpc/powerpc64/Makefile,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/sysdeps/powerpc/powerpc64/Makefile 2003/10/22 21:30:03 1.3 ++++ libc/sysdeps/powerpc/powerpc64/Makefile 2004/02/20 05:43:52 1.4 +@@ -20,5 +20,5 @@ + + ifeq ($(subdir),elf) + # help gcc inline asm code from dl-machine.h +-+cflags += --param max-inline-insns=2000 +++cflags += -finline-limit=2000 + endif + diff --git a/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-elf.patch b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-elf.patch new file mode 100644 index 00000000..1bd61e50 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-elf.patch @@ -0,0 +1,34 @@ + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/elf/dl-load.c.diff?r1=1.235&r2=1.236&cvsroot=glibc + +Fixes gcc-3.5 errors + +dl-load.c: In function `_dl_map_object_from_fd': +dl-load.c:1179: error: invalid lvalue in assignment +dl-load.c:1205: error: invalid lvalue in assignment + +=================================================================== +RCS file: /cvs/glibc/libc/elf/dl-load.c,v +retrieving revision 1.235 +retrieving revision 1.236 +diff -u -r1.235 -r1.236 +--- libc/elf/dl-load.c 2004/02/09 07:03:48 1.235 ++++ libc/elf/dl-load.c 2004/02/21 18:25:41 1.236 +@@ -1228,7 +1228,7 @@ + } + else + /* Adjust the PT_PHDR value by the runtime load address. */ +- (ElfW(Addr)) l->l_phdr += l->l_addr; ++ l->l_phdr = (ElfW(Phdr) *) ((ElfW(Addr)) l->l_phdr + l->l_addr); + } + + #ifdef USE_TLS +@@ -1254,7 +1254,7 @@ + } + } + else +- (ElfW(Addr)) l->l_ld += l->l_addr; ++ l->l_ld = (ElfW(Dyn) *) ((ElfW(Addr)) l->l_ld + l->l_addr); + + l->l_entry += l->l_addr; + diff --git a/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-gconv.patch b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-gconv.patch new file mode 100644 index 00000000..3d6df5bd --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-gconv.patch @@ -0,0 +1,228 @@ +Fixes +gconv_open.c: In function `__gconv_open': +gconv_open.c:186: error: invalid lvalue in assignment +when building glibc-2.3.2 with gcc-3.5. + +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/iconv/gconv_simple.c.diff?r1=1.59&r2=1.63&cvsroot=glibc' + * (internal_ucs4_loop): Fix typo in last change. + + * (internal_ucs4le_loop): Remove cast used as lvalue. + + * Fix last commit. + + * iconv/gconv_simple.c (ucs4le_internal_loop): Remove cast used as lvalue. + (internal_ucs4le_loop_single): Likewise. + (ucs4_internal_loop): Likewise. + (BODY): Likewise. + (internal_ucs4_loop_single): Likewise. + +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/iconv/gconv_open.c.diff?r1=1.32&r2=1.33&cvsroot=glibc' + * iconv/gconv_simple.c (ucs4le_internal_loop): Remove cast used as lvalue. + (internal_ucs4le_loop_single): Likewise. + (ucs4_internal_loop): Likewise. + (BODY): Likewise. + (internal_ucs4_loop_single): Likewise. + + +=================================================================== +RCS file: /cvs/glibc/libc/iconv/gconv_open.c,v +retrieving revision 1.32 +retrieving revision 1.33 +diff -u -r1.32 -r1.33 +--- libc/iconv/gconv_open.c 2001/11/29 04:51:58 1.32 ++++ libc/iconv/gconv_open.c 2004/02/07 15:56:32 1.33 +@@ -1,5 +1,5 @@ + /* Find matching transformation algorithms and initialize steps. +- Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1998, 1999, 2000, 2001, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + +@@ -182,8 +182,13 @@ + || __builtin_expect (__gconv_translit_find (runp), 0) == 0) + lastp = runp; + else +- /* This means we haven't found the module. Remove it. */ +- (lastp == NULL ? trans : lastp->next) = runp->next; ++ { ++ /* This means we haven't found the module. Remove it. */ ++ if (lastp == NULL) ++ trans = runp->next; ++ else ++ lastp->next = runp->next; ++ } + } + + /* Allocate room for handle. */ +=================================================================== +RCS file: /cvs/glibc/libc/iconv/gconv_simple.c,v +retrieving revision 1.59 +retrieving revision 1.63 +diff -u -r1.59 -r1.63 +--- libc/iconv/gconv_simple.c 2003/06/11 21:36:37 1.59 ++++ libc/iconv/gconv_simple.c 2004/03/09 10:00:31 1.63 +@@ -1,5 +1,5 @@ + /* Simple transformations functions. +- Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc. ++ Copyright (C) 1997-2003, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + +@@ -87,12 +87,13 @@ + #if __BYTE_ORDER == __LITTLE_ENDIAN + /* Sigh, we have to do some real work. */ + size_t cnt; ++ uint32_t *outptr32 = (uint32_t *) outptr; + + for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4) +- *((uint32_t *) outptr)++ = bswap_32 (*(const uint32_t *) inptr); ++ *outptr32++ = bswap_32 (*(const uint32_t *) inptr); + + *inptrp = inptr; +- *outptrp = outptr; ++ *outptrp = (unsigned char *) outptr32; + #elif __BYTE_ORDER == __BIG_ENDIAN + /* Simply copy the data. */ + *inptrp = inptr + n_convert * 4; +@@ -192,13 +193,16 @@ + (*outptrp)[2] = state->__value.__wchb[1]; + (*outptrp)[3] = state->__value.__wchb[0]; + +- *outptrp += 4; + #elif __BYTE_ORDER == __BIG_ENDIAN + /* XXX unaligned */ +- *(*((uint32_t **) outptrp)++) = state->__value.__wch; ++ (*outptrp)[0] = state->__value.__wchb[0]; ++ (*outptrp)[1] = state->__value.__wchb[1]; ++ (*outptrp)[2] = state->__value.__wchb[2]; ++ (*outptrp)[3] = state->__value.__wchb[3]; + #else + # error "This endianess is not supported." + #endif ++ *outptrp += 4; + + /* Clear the state buffer. */ + state->__count &= ~7; +@@ -268,7 +272,8 @@ + return __GCONV_ILLEGAL_INPUT; + } + +- *((uint32_t *) outptr)++ = inval; ++ *((uint32_t *) outptr) = inval; ++ outptr += sizeof (uint32_t); + } + + *inptrp = inptr; +@@ -447,9 +452,11 @@ + #if __BYTE_ORDER == __BIG_ENDIAN + /* Sigh, we have to do some real work. */ + size_t cnt; ++ uint32_t *outptr32 = (uint32_t *) outptr; + + for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4) +- *((uint32_t *) outptr)++ = bswap_32 (*(const uint32_t *) inptr); ++ *outptr32++ = bswap_32 (*(const uint32_t *) inptr); ++ outptr = (unsigned char *) outptr32; + + *inptrp = inptr; + *outptrp = outptr; +@@ -555,12 +562,17 @@ + (*outptrp)[2] = state->__value.__wchb[1]; + (*outptrp)[3] = state->__value.__wchb[0]; + +- *outptrp += 4; + #else + /* XXX unaligned */ +- *(*((uint32_t **) outptrp)++) = state->__value.__wch; ++ (*outptrp)[0] = state->__value.__wchb[0]; ++ (*outptrp)[1] = state->__value.__wchb[1]; ++ (*outptrp)[2] = state->__value.__wchb[2]; ++ (*outptrp)[3] = state->__value.__wchb[3]; ++ + #endif + ++ *outptrp += 4; ++ + /* Clear the state buffer. */ + state->__count &= ~7; + +@@ -626,7 +638,8 @@ + return __GCONV_ILLEGAL_INPUT; + } + +- *((uint32_t *) outptr)++ = inval; ++ *((uint32_t *) outptr) = inval; ++ outptr += sizeof (uint32_t); + } + + *inptrp = inptr; +@@ -808,7 +821,8 @@ + } \ + else \ + /* It's an one byte sequence. */ \ +- *((uint32_t *) outptr)++ = *inptr++; \ ++ *((uint32_t *) outptr) = *inptr++; \ ++ outptr += sizeof (uint32_t); \ + } + #define LOOP_NEED_FLAGS + #include <iconv/loop.c> +@@ -838,7 +852,8 @@ + } \ + else \ + /* It's an one byte sequence. */ \ +- *outptr++ = *((const uint32_t *) inptr)++; \ ++ *outptr++ = *((const uint32_t *) inptr); \ ++ inptr += sizeof (uint32_t); \ + } + #define LOOP_NEED_FLAGS + #include <iconv/loop.c> +@@ -1032,7 +1047,8 @@ + } \ + \ + /* Now adjust the pointers and store the result. */ \ +- *((uint32_t *) outptr)++ = ch; \ ++ *((uint32_t *) outptr) = ch; \ ++ outptr += sizeof (uint32_t); \ + } + #define LOOP_NEED_FLAGS + +@@ -1153,7 +1169,8 @@ + STANDARD_FROM_LOOP_ERR_HANDLER (2); \ + } \ + \ +- *((uint32_t *) outptr)++ = u1; \ ++ *((uint32_t *) outptr) = u1; \ ++ outptr += sizeof (uint32_t); \ + inptr += 2; \ + } + #define LOOP_NEED_FLAGS +@@ -1201,7 +1218,8 @@ + } \ + else \ + { \ +- *((uint16_t *) outptr)++ = val; \ ++ *((uint16_t *) outptr) = val; \ ++ outptr += sizeof (uint16_t); \ + inptr += 4; \ + } \ + } +@@ -1242,7 +1260,8 @@ + continue; \ + } \ + \ +- *((uint32_t *) outptr)++ = u1; \ ++ *((uint32_t *) outptr) = u1; \ ++ outptr += sizeof (uint32_t); \ + inptr += 2; \ + } + #define LOOP_NEED_FLAGS +@@ -1291,7 +1310,8 @@ + } \ + else \ + { \ +- *((uint16_t *) outptr)++ = bswap_16 (val); \ ++ *((uint16_t *) outptr) = bswap_16 (val); \ ++ outptr += sizeof (uint16_t); \ + inptr += 4; \ + } \ + } diff --git a/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-msort.patch b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-msort.patch new file mode 100644 index 00000000..e2673dec --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-msort.patch @@ -0,0 +1,46 @@ +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/stdlib/msort.c.diff?r1=1.20&r2=1.21&cvsroot=glibc + +Fixes + +msort.c: In function `msort_with_tmp': +msort.c:59: error: invalid lvalue in increment +msort.c:59: error: invalid lvalue in increment +msort.c:64: error: invalid lvalue in increment +msort.c:64: error: invalid lvalue in increment + +when building with gcc-3.5. + +=================================================================== +RCS file: /cvs/glibc/libc/stdlib/msort.c,v +retrieving revision 1.20 +retrieving revision 1.21 +diff -u -r1.20 -r1.21 +--- libc/stdlib/msort.c 2002/09/24 04:20:57 1.20 ++++ libc/stdlib/msort.c 2004/02/07 15:57:34 1.21 +@@ -1,6 +1,6 @@ + /* An alternative to qsort, with an identical interface. + This file is part of the GNU C Library. +- Copyright (C) 1992,95-97,99,2000,01,02 Free Software Foundation, Inc. ++ Copyright (C) 1992,95-97,99,2000,01,02,04 Free Software Foundation, Inc. + Written by Mike Haertel, September 1988. + + The GNU C Library is free software; you can redistribute it and/or +@@ -56,12 +56,16 @@ + if ((*cmp) (b1, b2) <= 0) + { + --n1; +- *((op_t *) tmp)++ = *((op_t *) b1)++; ++ *((op_t *) tmp) = *((op_t *) b1); ++ tmp += sizeof (op_t); ++ b1 += sizeof (op_t); + } + else + { + --n2; +- *((op_t *) tmp)++ = *((op_t *) b2)++; ++ *((op_t *) tmp) = *((op_t *) b2); ++ tmp += sizeof (op_t); ++ b2 += sizeof (op_t); + } + } + else diff --git a/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-sunrpc.patch b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-sunrpc.patch new file mode 100644 index 00000000..5a68bc24 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-sunrpc.patch @@ -0,0 +1,233 @@ +http://sources.redhat.com/ml/libc-hacker/2004-02/msg00005.html +[Also in CVS, but the original patch is easier to get.] + +Fixes errors like + +clnt_perr.c: In function `_buf': +clnt_perr.c:67: error: invalid lvalue in assignment + +when building with gcc-3.5. + +To: libc-hacker at sources dot redhat dot com +Subject: Fix cast as lvalue in sunrpc +From: Andreas Schwab <schwab at suse dot de> +X-Yow: SHHHH!! I hear SIX TATTOOED TRUCK-DRIVERS tossing ENGINE BLOCKS + into empty OIL DRUMS dot dot +Date: Sun, 08 Feb 2004 17:38:31 +0100 +Message-ID: <je4qu1frw8.fsf@sykes.suse.de> + +This fixes the uses of casts as lvalue in the sunrpc code. + +Andreas. + +2004-02-08 Andreas Schwab <schwab@suse.de> + + * include/rpc/rpc.h: Declare thread variables with their correct + type. + * sunrpc/clnt_perr.c: Don't cast thread variables. + * sunrpc/clnt_raw.c: Likewise. + * sunrpc/clnt_simp.c: Likewise. + * sunrpc/key_call.c: Likewise. + * sunrpc/svcauth_des.c: Likewise. + * sunrpc/svc.c: Likewise. + * sunrpc/svc_raw.c: Likewise. + * sunrpc/svc_simple.c: Likewise. + +Index: include/rpc/rpc.h +=================================================================== +RCS file: /cvs/glibc/libc/include/rpc/rpc.h,v +retrieving revision 1.8 +diff -u -p -a -r1.8 rpc.h +--- glibc/include/rpc/rpc.h 5 Aug 2002 22:10:59 -0000 1.8 ++++ glibc/include/rpc/rpc.h 8 Feb 2004 14:19:14 -0000 +@@ -17,24 +17,24 @@ struct rpc_thread_variables { + struct pollfd *svc_pollfd_s; /* Global, rpc_common.c */ + int svc_max_pollfd_s; /* Global, rpc_common.c */ + +- void *clnt_perr_buf_s; /* clnt_perr.c */ ++ char *clnt_perr_buf_s; /* clnt_perr.c */ + +- void *clntraw_private_s; /* clnt_raw.c */ ++ struct clntraw_private_s *clntraw_private_s; /* clnt_raw.c */ + +- void *callrpc_private_s; /* clnt_simp.c */ ++ struct callrpc_private_s *callrpc_private_s; /* clnt_simp.c */ + +- void *key_call_private_s; /* key_call.c */ ++ struct key_call_private *key_call_private_s; /* key_call.c */ + +- void *authdes_cache_s; /* svcauth_des.c */ +- void *authdes_lru_s; /* svcauth_des.c */ ++ struct cache_entry *authdes_cache_s; /* svcauth_des.c */ ++ int *authdes_lru_s; /* svcauth_des.c */ + +- void *svc_xports_s; /* svc.c */ +- void *svc_head_s; /* svc.c */ ++ SVCXPRT **svc_xports_s; /* svc.c */ ++ struct svc_callout *svc_head_s; /* svc.c */ + +- void *svcraw_private_s; /* svc_raw.c */ ++ struct svcraw_private_s *svcraw_private_s; /* svc_raw.c */ + +- void *svcsimple_proglst_s; /* svc_simple.c */ +- void *svcsimple_transp_s; /* svc_simple.c */ ++ struct proglst_ *svcsimple_proglst_s; /* svc_simple.c */ ++ SVCXPRT *svcsimple_transp_s; /* svc_simple.c */ + }; + + extern struct rpc_thread_variables *__rpc_thread_variables(void) +Index: sunrpc/clnt_perr.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/clnt_perr.c,v +retrieving revision 1.19 +diff -u -p -a -r1.19 clnt_perr.c +--- glibc/sunrpc/clnt_perr.c 1 Nov 2002 20:43:54 -0000 1.19 ++++ glibc/sunrpc/clnt_perr.c 8 Feb 2004 14:19:14 -0000 +@@ -55,7 +55,7 @@ static char *auth_errmsg (enum auth_stat + * buf variable in a few functions. Overriding a global variable + * with a local variable of the same name is a bad idea, anyway. + */ +-#define buf ((char *)RPC_THREAD_VARIABLE(clnt_perr_buf_s)) ++#define buf RPC_THREAD_VARIABLE(clnt_perr_buf_s) + #else + static char *buf; + #endif +Index: sunrpc/clnt_raw.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/clnt_raw.c,v +retrieving revision 1.10 +diff -u -p -a -r1.10 clnt_raw.c +--- glibc/sunrpc/clnt_raw.c 15 May 2002 00:21:00 -0000 1.10 ++++ glibc/sunrpc/clnt_raw.c 8 Feb 2004 14:19:14 -0000 +@@ -61,7 +61,7 @@ struct clntraw_private_s + u_int mcnt; + }; + #ifdef _RPC_THREAD_SAFE_ +-#define clntraw_private ((struct clntraw_private_s *)RPC_THREAD_VARIABLE(clntraw_private_s)) ++#define clntraw_private RPC_THREAD_VARIABLE(clntraw_private_s) + #else + static struct clntraw_private_s *clntraw_private; + #endif +Index: sunrpc/clnt_simp.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/clnt_simp.c,v +retrieving revision 1.14 +diff -u -p -a -r1.14 clnt_simp.c +--- glibc/sunrpc/clnt_simp.c 15 May 2002 00:21:00 -0000 1.14 ++++ glibc/sunrpc/clnt_simp.c 8 Feb 2004 14:19:14 -0000 +@@ -55,7 +55,7 @@ struct callrpc_private_s + char *oldhost; + }; + #ifdef _RPC_THREAD_SAFE_ +-#define callrpc_private ((struct callrpc_private_s *)RPC_THREAD_VARIABLE(callrpc_private_s)) ++#define callrpc_private RPC_THREAD_VARIABLE(callrpc_private_s) + #else + static struct callrpc_private_s *callrpc_private; + #endif +Index: sunrpc/key_call.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/key_call.c,v +retrieving revision 1.16 +diff -u -p -a -r1.16 key_call.c +--- glibc/sunrpc/key_call.c 6 Aug 2002 06:08:50 -0000 1.16 ++++ glibc/sunrpc/key_call.c 8 Feb 2004 14:19:14 -0000 +@@ -370,7 +370,7 @@ struct key_call_private { + uid_t uid; /* user-id at last authorization */ + }; + #ifdef _RPC_THREAD_SAFE_ +-#define key_call_private_main ((struct key_call_private *)RPC_THREAD_VARIABLE(key_call_private_s)) ++#define key_call_private_main RPC_THREAD_VARIABLE(key_call_private_s) + #else + static struct key_call_private *key_call_private_main; + #endif +Index: sunrpc/svc.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/svc.c,v +retrieving revision 1.17 +diff -u -p -a -r1.17 svc.c +--- glibc/sunrpc/svc.c 29 Aug 2003 07:45:18 -0000 1.17 ++++ glibc/sunrpc/svc.c 8 Feb 2004 14:19:14 -0000 +@@ -44,7 +44,7 @@ + #include <sys/poll.h> + + #ifdef _RPC_THREAD_SAFE_ +-#define xports ((SVCXPRT **)RPC_THREAD_VARIABLE(svc_xports_s)) ++#define xports RPC_THREAD_VARIABLE(svc_xports_s) + #else + static SVCXPRT **xports; + #endif +@@ -63,7 +63,7 @@ struct svc_callout { + void (*sc_dispatch) (struct svc_req *, SVCXPRT *); + }; + #ifdef _RPC_THREAD_SAFE_ +-#define svc_head ((struct svc_callout *)RPC_THREAD_VARIABLE(svc_head_s)) ++#define svc_head RPC_THREAD_VARIABLE(svc_head_s) + #else + static struct svc_callout *svc_head; + #endif +Index: sunrpc/svc_raw.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/svc_raw.c,v +retrieving revision 1.5 +diff -u -p -a -r1.5 svc_raw.c +--- glibc/sunrpc/svc_raw.c 26 Feb 2002 01:43:56 -0000 1.5 ++++ glibc/sunrpc/svc_raw.c 8 Feb 2004 14:19:14 -0000 +@@ -54,7 +54,7 @@ struct svcraw_private_s + char verf_body[MAX_AUTH_BYTES]; + }; + #ifdef _RPC_THREAD_SAFE_ +-#define svcraw_private ((struct svcraw_private_s *)RPC_THREAD_VARIABLE(svcraw_private_s)) ++#define svcraw_private RPC_THREAD_VARIABLE(svcraw_private_s) + #else + static struct svcraw_private_s *svcraw_private; + #endif +Index: sunrpc/svc_simple.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/svc_simple.c,v +retrieving revision 1.16 +diff -u -p -a -r1.16 svc_simple.c +--- glibc/sunrpc/svc_simple.c 6 Aug 2002 05:10:30 -0000 1.16 ++++ glibc/sunrpc/svc_simple.c 8 Feb 2004 14:19:14 -0000 +@@ -61,7 +61,7 @@ struct proglst_ + struct proglst_ *p_nxt; + }; + #ifdef _RPC_THREAD_SAFE_ +-#define proglst ((struct proglst_ *)RPC_THREAD_VARIABLE(svcsimple_proglst_s)) ++#define proglst RPC_THREAD_VARIABLE(svcsimple_proglst_s) + #else + static struct proglst_ *proglst; + #endif +@@ -69,7 +69,7 @@ static struct proglst_ *proglst; + + static void universal (struct svc_req *rqstp, SVCXPRT *transp_s); + #ifdef _RPC_THREAD_SAFE_ +-#define transp ((SVCXPRT *)RPC_THREAD_VARIABLE(svcsimple_transp_s)) ++#define transp RPC_THREAD_VARIABLE(svcsimple_transp_s) + #else + static SVCXPRT *transp; + #endif +Index: sunrpc/svcauth_des.c +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/svcauth_des.c,v +retrieving revision 1.8 +diff -u -p -a -r1.8 svcauth_des.c +--- glibc/sunrpc/svcauth_des.c 20 Aug 2001 06:37:09 -0000 1.8 ++++ glibc/sunrpc/svcauth_des.c 8 Feb 2004 14:19:14 -0000 +@@ -72,8 +72,8 @@ struct cache_entry + char *localcred; /* generic local credential */ + }; + #ifdef _RPC_THREAD_SAFE_ +-#define authdes_cache ((struct cache_entry *)RPC_THREAD_VARIABLE(authdes_cache_s)) +-#define authdes_lru ((int *)RPC_THREAD_VARIABLE(authdes_lru_s)) ++#define authdes_cache RPC_THREAD_VARIABLE(authdes_cache_s) ++#define authdes_lru RPC_THREAD_VARIABLE(authdes_lru_s) + #else + static struct cache_entry *authdes_cache; + static int *authdes_lru; + +-- +Andreas Schwab, SuSE Labs, schwab@suse.de +SuSE Linux AG, Maxfeldstraße 5, 90409 Nürnberg, Germany +Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 +"And now for something completely different." + diff --git a/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-xdr.patch b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-xdr.patch new file mode 100644 index 00000000..4d811e9f --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.2-allow-gcc-3.5-xdr.patch @@ -0,0 +1,44 @@ +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sunrpc/rpc/xdr.h.diff?r1=1.27&r2=1.28&cvsroot=glibc +(but see also http://sources.redhat.com/ml/libc-alpha/2004-03/msg00267.html +and http://gcc.gnu.org/ml/gcc-patches/2004-03/msg02056.html) + +Fixes errors + +rpc_cmsg.c: In function `xdr_callmsg': +rpc_cmsg.c:70: error: invalid lvalue in increment +rpc_cmsg.c:71: error: invalid lvalue in increment +rpc_cmsg.c:74: error: invalid lvalue in increment +rpc_cmsg.c:77: error: invalid lvalue in increment +rpc_cmsg.c:78: error: invalid lvalue in increment +rpc_cmsg.c:79: error: invalid lvalue in increment +rpc_cmsg.c:81: error: invalid lvalue in increment +rpc_cmsg.c:89: error: invalid lvalue in increment +rpc_cmsg.c:106: error: invalid lvalue in increment +rpc_cmsg.c:107: error: invalid lvalue in increment +rpc_cmsg.c:112: error: invalid lvalue in increment +rpc_cmsg.c:117: error: invalid lvalue in increment +rpc_cmsg.c:118: error: invalid lvalue in increment +rpc_cmsg.c:119: error: invalid lvalue in increment +rpc_cmsg.c:121: error: invalid lvalue in increment +rpc_cmsg.c:160: error: invalid lvalue in increment + +=================================================================== +RCS file: /cvs/glibc/libc/sunrpc/rpc/xdr.h,v +retrieving revision 1.27 +retrieving revision 1.28 +diff -u -r1.27 -r1.28 +--- libc/sunrpc/rpc/xdr.h 2002/12/16 02:05:49 1.27 ++++ libc/sunrpc/rpc/xdr.h 2004/03/22 10:52:33 1.28 +@@ -262,10 +262,8 @@ + * and shouldn't be used any longer. Code which use this defines or longs + * in the RPC code will not work on 64bit Solaris platforms ! + */ +-#define IXDR_GET_LONG(buf) \ +- ((long)ntohl((u_long)*__extension__((u_int32_t*)(buf))++)) +-#define IXDR_PUT_LONG(buf, v) \ +- (*__extension__((u_int32_t*)(buf))++ = (long)htonl((u_long)(v))) ++#define IXDR_GET_LONG(buf) ((long)IXDR_GET_U_INT32(buf)) ++#define IXDR_PUT_LONG(buf, v) ((long)IXDR_PUT_INT32(buf, (long)(v))) + #define IXDR_GET_U_LONG(buf) ((u_long)IXDR_GET_LONG(buf)) + #define IXDR_PUT_U_LONG(buf, v) IXDR_PUT_LONG(buf, (long)(v)) + diff --git a/patches/glibc/2.3.3/glibc-2.3.2-arm-fix-strlen.patch b/patches/glibc/2.3.3/glibc-2.3.2-arm-fix-strlen.patch new file mode 100644 index 00000000..03e5c5b2 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.2-arm-fix-strlen.patch @@ -0,0 +1,54 @@ +See also +http://lists.gnu.org/archive/html/bug-glibc/2002-12/msg00056.html +http://lists.arm.linux.org.uk/pipermail/linux-arm-toolchain/2004-June/000016.html + +2002-12-12 Andreas Schwab <schwab@suse.de> + * sysdeps/arm/strlen.S: Fix last word check for big endian. + +To: libc-alpha at sources dot redhat dot com +Subject: [PATCH] REPOST: ARM big-endian strlen() fix +References: <m3brjy27mo.fsf@defiant.pm.waw.pl> +From: Krzysztof Halasa <khc at pm dot waw dot pl> +Date: Thu, 10 Jun 2004 13:41:44 +0200 +Message-ID: <m3r7sn8wsn.fsf@defiant.pm.waw.pl> +MIME-Version: 1.0 +Content-Type: multipart/mixed; boundary="=-=-=" + +--=-=-= + +The attached patch fixes strlen() on big-endian ARM. Please apply. +Thanks. +-- +Krzysztof Halasa, B*FH + +--=-=-= +Content-Type: text/x-patch +Content-Disposition: inline; filename=glibc-strlen.patch + +--- glibc-2.3.3.old/sysdeps/arm/strlen.S 2003-04-30 00:47:20.000000000 +0200 ++++ glibc-2.3.3/sysdeps/arm/strlen.S 2004-06-06 03:21:48.351931240 +0200 +@@ -53,12 +53,21 @@ + ldrne r2, [r1], $4 @ and we continue to the next word + bne Laligned @ + Llastword: @ drop through to here once we find a ++#ifdef __ARMEB__ ++ tst r2, $0xff000000 @ word that has a zero byte in it ++ addne r0, r0, $1 @ ++ tstne r2, $0x00ff0000 @ and add up to 3 bytes on to it ++ addne r0, r0, $1 @ ++ tstne r2, $0x0000ff00 @ (if first three all non-zero, 4th ++ addne r0, r0, $1 @ must be zero) ++#else + tst r2, $0x000000ff @ word that has a zero byte in it + addne r0, r0, $1 @ + tstne r2, $0x0000ff00 @ and add up to 3 bytes on to it + addne r0, r0, $1 @ + tstne r2, $0x00ff0000 @ (if first three all non-zero, 4th + addne r0, r0, $1 @ must be zero) ++#endif + RETINSTR(mov,pc,lr) + END(strlen) + libc_hidden_builtin_def (strlen) + +--=-=-=-- + diff --git a/patches/glibc/2.3.3/glibc-2.3.2-pr139-fix.patch b/patches/glibc/2.3.3/glibc-2.3.2-pr139-fix.patch new file mode 100644 index 00000000..96e8fb3b --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.2-pr139-fix.patch @@ -0,0 +1,104 @@ +2004-04-29 Jakub Jelinek <jakub@redhat.com> + + * sysdeps/sparc/sparc64/soft-fp/qp_qtoi.c (_Qp_qtoi): Use %f31 + for single precision register, add it to __asm clobbers [BZ #139]. + * sysdeps/sparc/sparc64/soft-fp/qp_qtoui.c (_Qp_qtoui): Use %f31 + for single precision register, add it to __asm clobbers. + * sysdeps/sparc/sparc64/soft-fp/qp_qtoux.c (_Qp_qtoux): Use fqtox + instead of fqtoi in QP_HANDLE_EXCEPTIONS. + * sysdeps/sparc/sparc64/soft-fp/qp_qtox.c (_Qp_qtox): Likewise. + Reported by M. H. VanLeeuwen <vanl@megsinet.net>. + +See http://sources.redhat.com/bugzilla/show_bug.cgi?id=139 +Fixes error +qp_qtoi.s:261: Error: Illegal operands: There are only 32 single precision f registers; [0-31] +plus a couple other things vanl noticed. + +diff -ur orig/qp_qtoi.c new/qp_qtoi.c +--- orig/qp_qtoi.c Sat May 1 00:40:06 2004 ++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtoi.c Sat May 1 00:39:40 2004 +@@ -1,6 +1,6 @@ + /* Software floating-point emulation. + Return (int)(*a) +- Copyright (C) 1997,1999 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). +@@ -38,9 +38,9 @@ + __asm ( + " ldd [%1], %%f52\n" + " ldd [%1+8], %%f54\n" +-" fqtoi %%f52, %%f60\n" +-" st %%f60, [%0]\n" +-" " : : "r" (&rx), "r" (a) : QP_CLOBBER); ++" fqtoi %%f52, %%f31\n" ++" st %%f31, [%0]\n" ++" " : : "r" (&rx), "r" (a) : QP_CLOBBER, "f31"); + r = rx); + + return r; +diff -ur orig/qp_qtoui.c new/qp_qtoui.c +--- orig/qp_qtoui.c Sat May 1 00:40:06 2004 ++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtoui.c Sat May 1 00:39:40 2004 +@@ -1,6 +1,6 @@ + /* Software floating-point emulation. + Return (unsigned int)(*a) +- Copyright (C) 1997,1999 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). +@@ -38,9 +38,9 @@ + __asm ( + " ldd [%1], %%f52\n" + " ldd [%1+8], %%f54\n" +-" fqtoi %%f52, %%f60\n" +-" st %%f60, [%0]\n" +-" " : : "r" (&rx), "r" (a) : QP_CLOBBER); ++" fqtoi %%f52, %%f31\n" ++" st %%f31, [%0]\n" ++" " : : "r" (&rx), "r" (a) : QP_CLOBBER, "f31"); + r = rx); + + return r; +diff -ur orig/qp_qtoux.c new/qp_qtoux.c +--- orig/qp_qtoux.c Sat May 1 00:40:06 2004 ++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtoux.c Sat May 1 00:39:40 2004 +@@ -1,6 +1,6 @@ + /* Software floating-point emulation. + Return (unsigned long)(*a) +- Copyright (C) 1997,1999 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). +@@ -38,7 +38,7 @@ + __asm ( + " ldd [%1], %%f52\n" + " ldd [%1+8], %%f54\n" +-" fqtoi %%f52, %%f60\n" ++" fqtox %%f52, %%f60\n" + " std %%f60, [%0]\n" + " " : : "r" (&rx), "r" (a) : QP_CLOBBER); + r = rx); +diff -ur orig/qp_qtox.c new/qp_qtox.c +--- orig/qp_qtox.c Sat May 1 00:40:06 2004 ++++ libc/sysdeps/sparc/sparc64/soft-fp/qp_qtox.c Sat May 1 00:39:40 2004 +@@ -1,6 +1,6 @@ + /* Software floating-point emulation. + Return (long)(*a) +- Copyright (C) 1997,1999 Free Software Foundation, Inc. ++ Copyright (C) 1997, 1999, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Richard Henderson (rth@cygnus.com) and + Jakub Jelinek (jj@ultra.linux.cz). +@@ -38,7 +38,7 @@ + __asm ( + " ldd [%1], %%f52\n" + " ldd [%1+8], %%f54\n" +-" fqtoi %%f52, %%f60\n" ++" fqtox %%f52, %%f60\n" + " std %%f60, [%0]\n" + " " : : "r" (&rx), "r" (a) : QP_CLOBBER); + r = rx); diff --git a/patches/glibc/2.3.3/glibc-2.3.2-sparc32-sysdep.patch b/patches/glibc/2.3.3/glibc-2.3.2-sparc32-sysdep.patch new file mode 100644 index 00000000..289f66e6 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.2-sparc32-sysdep.patch @@ -0,0 +1,46 @@ +Fixes the error + +<stdin>: Assembler messages: +<stdin>:2: Error: junk at end of line, first unrecognized character is `1' ... +<stdin>:2: Error: Illegal operands: PC-relative operand can't be a constant +make[4]: *** [/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/io/rtld-open.os] Error 1 +make[4]: Leaving directory `/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/io' +make[3]: *** [/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/io/rtld-xstat64.os] Error 2 +make[3]: Leaving directory `/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/elf' +make[2]: *** [/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/elf/rtld-libc.a] Error 2 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc13/build/sparc-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/elf' +make[1]: *** [elf/subdir_lib] Error 2 + +when building glibc-2.3.2 with gcc-3.4.0 for sparc32. + +The .s file left behind by -save-temps contains the big long line + +.text; .global __libc_open; .align 4; __libc_open:; .type __libc_open,@function;; mov 5, %g1; ta 0x10; bcs __syscall_error_handler; nop; .section .gnu.linkonce.t. 1 .get_pic.l7,"ax",@progbits; .globl 1 .get_pic.l7; .hidden 1 .get_pic.l7; .type 1 .get_pic.l7,@function; 1 .get_pic.l7: retl; add %o7, %l7, %l7; .previous; .subsection 3; __syscall_error_handler: save %sp,-96,%sp; sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %l7; call 1 .get_pic.l7; add %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7; ld [%l7 + errno], %l0; st %i0, [%l0]; jmpl %i7+8, %g0; restore %g0, -1, %o0; .previous; + retl; nop + +The error messages appear to refer to the '1 .get_pic.17', e.g. + .globl 1 .get_pic.l7; .hidden 1 .get_pic.l7; +which seems to come from +glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h +where it appears originally as + .globl __sparc.get_pic.l7; \ + .hidden __sparc.get_pic.l7; \ + +Note that __sparc is a predefined symbol on Solaris and some other environments; +it's not surprising to see it predefined on Linux, too. + + +--- glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h.old 2004-05-15 10:23:11.000000000 -0700 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h 2004-05-15 10:24:12.000000000 -0700 +@@ -39,6 +39,11 @@ + #undef END + #undef LOC + ++/* gcc-3.4.0 seems to expand __sparc as a predefined preprocessor symbol, which we don't want here */ ++#ifdef __sparc ++#undef __sparc ++#endif ++ + #define ENTRY(name) \ + .global C_SYMBOL_NAME(name); \ + .align 4;\ diff --git a/patches/glibc/2.3.3/glibc-2.3.2-sparc64-dl-machine.patch b/patches/glibc/2.3.3/glibc-2.3.2-sparc64-dl-machine.patch new file mode 100644 index 00000000..20cb7998 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.2-sparc64-dl-machine.patch @@ -0,0 +1,29 @@ +See http://gcc.gnu.org/PR15345 + +Quick kludge by H.J.Lu +Works around gcc-3.4.0 error which shows up when building glibc-2.3.2 for sparc64: + +.../sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/libc.a(dl-reloc.o)(.text+0x4b4): In function `elf_machine_load_address.3': +: undefined reference to `_DYNAMIC' +collect2: ld returned 1 exit status +make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/elf/sln] Error 1 + + +--- glibc-2.3.2/sysdeps/sparc/sparc64/dl-machine.h.orig Sat May 8 20:54:26 2004 ++++ glibc-2.3.2/sysdeps/sparc/sparc64/dl-machine.h Sat May 8 17:18:04 2004 +@@ -65,6 +65,7 @@ + } + + /* Return the run-time load address of the shared object. */ ++#ifdef IS_IN_rtld + static inline Elf64_Addr + elf_machine_load_address (void) + { +@@ -84,6 +85,7 @@ + pc[3]*4 is l_addr + _GLOBAL_OFFSET_TABLE_ - (long)pc - 12 */ + return (Elf64_Addr) got - *got + (Elf32_Sword) ((pc[2] - pc[3]) * 4) - 4; + } ++#endif + + /* We have 4 cases to handle. And we code different code sequences + for each one. I love V9 code models... */ diff --git a/patches/glibc/2.3.3/glibc-2.3.2-without-fp.patch b/patches/glibc/2.3.3/glibc-2.3.2-without-fp.patch new file mode 100644 index 00000000..76cdfaad --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.2-without-fp.patch @@ -0,0 +1,89 @@ +Sender: libc-alpha-owner@sources.redhat.com +Date: Tue, 29 Jul 2003 17:49:47 -0400 +From: Daniel Jacobowitz <drow@mvista.com> +To: GNU C Library <libc-alpha@sources.redhat.com> +Subject: Re: __sim_exceptions undefined when linking glibc-2.3.2's libm.so with --without-fp +Message-ID: <20030729214947.GA29932@nevyn.them.org> + +On Tue, Jul 29, 2003 at 02:53:33PM -0700, Dan Kegel wrote: +> On ppc405, I'm getting the following when linking glibc's libm: +> /gcc-3.3-glibc-2.3.2/build-glibc/math/libm_pic.a(fclrexcpt.os)(.text+0x1a): +> In function `feclearexcept@GLIBC_2.1': +> : undefined reference to `__sim_exceptions' +> +> That symbol seems to be present in libc.so. nm shows + +--without-fp doesn't work. Try this. Make up a changelog entry if it +works. + +Date: Tue, 29 Jul 2003 14:56:50 -0700 +Message-Id: <200307292156.h6TLuol24356@magilla.sf.frob.com> +From: Roland McGrath <roland@redhat.com> +To: Daniel Jacobowitz <drow@mvista.com> +Cc: GNU C Library <libc-alpha@sources.redhat.com> +Subject: Re: __sim_exceptions undefined when linking glibc-2.3.2's libm.so with --without-fp +In-Reply-To: Daniel Jacobowitz's message of Tuesday, 29 July 2003 17:49:47 -0400 <20030729214947.GA29932@nevyn.them.org> + +> +int __sim_exceptions __attribute__ ((section(".bss"))); + +Use __attribute__ ((nocommon)) instead (and please watch the standard +whitespace conventions, i.e. ``section (''). + +diff -purN glibc-2.3.2.orig/sysdeps/powerpc/nofpu/sim-full.c glibc-2.3.2/sysdeps/powerpc/nofpu/sim-full.c +--- glibc-2.3.2.orig/sysdeps/powerpc/nofpu/sim-full.c 2002-10-19 16:06:29.000000000 -0400 ++++ glibc-2.3.2/sysdeps/powerpc/nofpu/sim-full.c 2003-05-14 15:10:42.000000000 -0400 +@@ -24,11 +24,14 @@ + + /* Global to store sticky exceptions. */ +-int __sim_exceptions; ++int __sim_exceptions __attribute__ ((nocommon)); ++libc_hidden_data_def (__sim_exceptions); + + /* By default, no exceptions should trap. */ + int __sim_disabled_exceptions = 0xffffffff; ++libc_hidden_data_def (__sim_disabled_exceptions); + +-int __sim_round_mode; ++int __sim_round_mode __attribute__ ((nocommon)); ++libc_hidden_data_def (__sim_round_mode); + + void + __simulate_exceptions (int x) +diff -purN glibc-2.3.2.orig/sysdeps/powerpc/nofpu/soft-supp.h glibc-2.3.2/sysdeps/powerpc/nofpu/soft-supp.h +--- glibc-2.3.2.orig/sysdeps/powerpc/nofpu/soft-supp.h 2002-10-19 16:06:29.000000000 -0400 ++++ glibc-2.3.2/sysdeps/powerpc/nofpu/soft-supp.h 2003-05-14 15:09:53.000000000 -0400 +@@ -27,7 +27,11 @@ typedef union + } fenv_union_t; + + +-extern int __sim_exceptions attribute_hidden; +-extern int __sim_disabled_exceptions attribute_hidden; +-extern int __sim_round_mode attribute_hidden; ++extern int __sim_exceptions; ++libc_hidden_proto (__sim_exceptions); ++extern int __sim_disabled_exceptions; ++libc_hidden_proto (__sim_disabled_exceptions); ++extern int __sim_round_mode; ++libc_hidden_proto (__sim_round_mode); ++ + extern void __simulate_exceptions (int x) attribute_hidden; +diff -urp glibc-2.3.2.orig/sysdeps/powerpc/soft-fp/sfp-machine.h glibc-2.3.2/sysdeps/powerpc/soft-fp/sfp-machine.h +--- glibc-2.3.2.orig/sysdeps/powerpc/soft-fp/sfp-machine.h 2002-10-17 18:36:14.000000000 -0400 ++++ glibc-2.3.2/sysdeps/powerpc/soft-fp/sfp-machine.h 2003-05-14 16:48:13.000000000 -0400 +@@ -52,7 +52,11 @@ + #define FP_HANDLE_EXCEPTIONS __simulate_exceptions (_fex) + #define FP_ROUNDMODE __sim_round_mode + +-extern int __sim_exceptions attribute_hidden; +-extern int __sim_disabled_exceptions attribute_hidden; +-extern int __sim_round_mode attribute_hidden; ++extern int __sim_exceptions; ++libc_hidden_proto (__sim_exceptions); ++extern int __sim_disabled_exceptions; ++libc_hidden_proto (__sim_disabled_exceptions); ++extern int __sim_round_mode; ++libc_hidden_proto (__sim_round_mode); ++ + extern void __simulate_exceptions (int x) attribute_hidden; + + diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-configure.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-configure.patch new file mode 100644 index 00000000..3f568aee --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-configure.patch @@ -0,0 +1,30 @@ +Fixes following problem building glibc-2.3.3 with gcc-4.0: + +checking version of i686-unknown-linux-gnu-gcc ... 4.0.0, bad +checking for gnumake... no +checking for gmake... gmake +checking version of gmake... 3.79.1, ok +checking for gnumsgfmt... no +checking for gmsgfmt... no +checking for msgfmt... msgfmt +checking version of msgfmt... 0.11.4, ok +checking for makeinfo... makeinfo +checking version of makeinfo... 4.3, ok +checking for sed... sed +checking version of sed... 4.0.5, ok +checking for autoconf... autoconf +checking whether autoconf works... yes +configure: error: +*** These critical programs are missing or too old: gcc + +--- glibc-2.3.3/configure.old Mon Mar 14 12:01:10 2005 ++++ glibc-2.3.3/configure Mon Mar 14 12:02:03 2005 +@@ -3899,7 +3899,7 @@ + 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]*) ++ 3.[2-9]*|4.[01]*) + ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;; + *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;; + diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-elf-2.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-elf-2.patch new file mode 100644 index 00000000..3a235a4c --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-elf-2.patch @@ -0,0 +1,53 @@ +Fixes + +In file included from dynamic-link.h:310, + from dl-reloc.c:265: +do-rel.h:56: error: invalid storage class for function 'elf_dynamic_do_rela' +In file included from dl-reloc.c:265: +dynamic-link.h: In function '_dl_relocate_object': +dynamic-link.h:33: error: invalid storage class for function 'elf_get_dynamic_info' + +when building glibc-2.3.3 with gcc-4.0 +2nd hunk is like http://sourceware.org/cgi-bin/cvsweb.cgi/libc/elf/dynamic-link.h.diff?r1=1.50&r2=1.51&cvsroot=glibc +but works with older compilers, too + +--- glibc-2.3.3/elf/do-rel.h.old 2005-03-16 13:09:37.000000000 -0800 ++++ glibc-2.3.3/elf/do-rel.h 2005-03-16 13:10:50.000000000 -0800 +@@ -49,7 +49,14 @@ + relocations; they should be set up to call _dl_runtime_resolve, rather + than fully resolved now. */ + +-static inline void __attribute__ ((always_inline)) ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_dynamic_do_rel (struct link_map *map, + ElfW(Addr) reladdr, ElfW(Addr) relsize, + int lazy) +--- glibc-2.3.3/elf/dynamic-link.h.old 2005-03-16 13:22:35.000000000 -0800 ++++ glibc-2.3.3/elf/dynamic-link.h 2005-03-16 13:26:23.000000000 -0800 +@@ -27,8 +27,17 @@ + + + /* Read the dynamic section at DYN and fill in INFO with indices DT_*. */ +- +-static inline void __attribute__ ((unused, always_inline)) ++#if !defined(RESOLVE) || __GNUC__ < 4 ++static ++#else ++auto ++#endif ++inline void ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute__ ((unused, always_inline)) ++#else ++ __attribute__ ((unused)) ++#endif + elf_get_dynamic_info (struct link_map *l, ElfW(Dyn) *temp) + { + ElfW(Dyn) *dyn = l->l_ld; diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-elf-3.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-elf-3.patch new file mode 100644 index 00000000..354bdee9 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-elf-3.patch @@ -0,0 +1,79 @@ +Fixes +In file included from ldconfig.c:136: +../sysdeps/i386/dl-procinfo.c:53: error: static declaration of '_dl_x86_cap_flags' follows non-static declaration +../sysdeps/i386/dl-procinfo.c:61: error: previous declaration of '_dl_x86_cap_flags' was here +../sysdeps/i386/dl-procinfo.c:72: error: static declaration of '_dl_x86_platforms' follows non-static declaration +../sysdeps/i386/dl-procinfo.c:77: error: previous declaration of '_dl_x86_platforms' was here +make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/glibc-2.3.3/elf' +when building with gcc-4.0. + +2004-07-10 Ulrich Drepper <drepper@redhat.com> + + * elf/ldconfig.c: Define PROCINFO_CLASS as static before including + ldsodefs.h. + * sysdeps/generic/ldsodefs.h: Only define PROCINFO_CLASS if it is not + already defined. + * sysdeps/i386/dl-procinfo.c: Define PROCINFO_CALLS only if not + already defined. + +See +http://sources.redhat.com/ml/glibc-cvs/2004-q3/msg00093.html +http://sources.redhat.com/ml/glibc-cvs/2004-q3/msg00097.html +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/dl-procinfo.c.diff?cvsroot=glibc&r1=1.1&r2=1.2 + +rediffed against glibc-2.3.3 + +diff -ur glibc-2.3.3.orig/elf/ldconfig.c glibc-2.3.3/elf/ldconfig.c +--- glibc-2.3.3.orig/elf/ldconfig.c Tue Aug 26 01:07:19 2003 ++++ glibc-2.3.3/elf/ldconfig.c Sat Mar 19 12:02:08 2005 +@@ -17,6 +17,7 @@ + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA. */ + ++#define PROCINFO_CLASS static + #include <alloca.h> + #include <argp.h> + #include <dirent.h> +diff -ur glibc-2.3.3.orig/sysdeps/generic/ldsodefs.h glibc-2.3.3/sysdeps/generic/ldsodefs.h +--- glibc-2.3.3.orig/sysdeps/generic/ldsodefs.h Mon Nov 24 14:56:07 2003 ++++ glibc-2.3.3/sysdeps/generic/ldsodefs.h Sat Mar 19 12:02:08 2005 +@@ -348,7 +348,9 @@ + + /* Get architecture specific definitions. */ + #define PROCINFO_DECL +-#define PROCINFO_CLASS EXTERN ++#ifndef PROCINFO_CLASS ++# define PROCINFO_CLASS EXTERN ++#endif + #include <dl-procinfo.c> + + /* Structure describing the dynamic linker itself. */ +Only in glibc-2.3.3/sysdeps/generic: ldsodefs.h~ +diff -ur glibc-2.3.3.orig/sysdeps/i386/dl-procinfo.c glibc-2.3.3/sysdeps/i386/dl-procinfo.c +--- glibc-2.3.3.orig/sysdeps/i386/dl-procinfo.c Wed Sep 24 20:54:54 2003 ++++ glibc-2.3.3/sysdeps/i386/dl-procinfo.c Sat Mar 19 12:02:08 2005 +@@ -1,5 +1,5 @@ + /* Data for i386 version of processor capability information. +- Copyright (C) 2001,2002,2003 Free Software Foundation, Inc. ++ Copyright (C) 2001,2002,2003, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@redhat.com>, 2001. + +@@ -24,7 +24,7 @@ + If anything should be added here check whether the size of each string + is still ok with the given array size. + +- All the #ifdefs in the definitions ar equite irritating but ++ All the #ifdefs in the definitions are quite irritating but + necessary if we want to avoid duplicating the information. There + are three different modes: + +@@ -41,7 +41,7 @@ + */ + + #ifndef PROCINFO_CLASS +-#define PROCINFO_CLASS ++# define PROCINFO_CLASS + #endif + + #if !defined PROCINFO_DECL && defined SHARED diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-i386.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-i386.patch new file mode 100644 index 00000000..d0ebb13f --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-i386.patch @@ -0,0 +1,111 @@ +Fixes + +In file included from dynamic-link.h:22, + from dl-reloc.c:265: +../sysdeps/i386/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/i386/dl-machine.h:395: error: invalid storage class for function 'elf_machine_rel' +../sysdeps/i386/dl-machine.h:539: error: invalid storage class for function 'elf_machine_rela' +../sysdeps/i386/dl-machine.h:640: error: invalid storage class for function 'elf_machine_rel_relative' +../sysdeps/i386/dl-machine.h:650: error: invalid storage class for function 'elf_machine_rela_relative' +../sysdeps/i386/dl-machine.h:659: error: invalid storage class for function 'elf_machine_lazy_rel' +../sysdeps/i386/dl-machine.h:680: error: invalid storage class for function 'elf_machine_lazy_rela' +make[2]: *** [/home/dank/queue/jobdir.dual2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/build-glibc/elf/dl-reloc.o] Error 1 + +--- glibc-2.3.3/sysdeps/i386/dl-machine.h.old Wed Mar 16 22:24:09 2005 ++++ glibc-2.3.3/sysdeps/i386/dl-machine.h Thu Mar 17 01:30:09 2005 +@@ -385,7 +385,14 @@ + /* Perform the relocation specified by RELOC and SYM (which is fully resolved). + MAP is the object containing the reloc. */ + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, + const Elf32_Sym *sym, const struct r_found_version *version, + void *const reloc_addr_arg) +@@ -529,7 +536,14 @@ + } + + #ifndef RTLD_BOOTSTRAP +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, + const Elf32_Sym *sym, const struct r_found_version *version, + void *const reloc_addr_arg) +@@ -631,7 +645,14 @@ + } + #endif /* !RTLD_BOOTSTRAP */ + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc, + void *const reloc_addr_arg) + { +@@ -641,7 +662,14 @@ + } + + #ifndef RTLD_BOOTSTRAP +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc, + void *const reloc_addr_arg) + { +@@ -650,7 +678,14 @@ + } + #endif /* !RTLD_BOOTSTRAP */ + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_lazy_rel (struct link_map *map, + Elf32_Addr l_addr, const Elf32_Rel *reloc) + { +@@ -671,7 +706,14 @@ + + #ifndef RTLD_BOOTSTRAP + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_lazy_rela (struct link_map *map, + Elf32_Addr l_addr, const Elf32_Rela *reloc) + { diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconv.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconv.patch new file mode 100644 index 00000000..1aa023b4 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconv.patch @@ -0,0 +1,24 @@ +Fixes +iconvconfig.c: In function 'write_output': +iconvconfig.c:1014: error: invalid storage class for function 'name_insert' +make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/x86_64-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/glibc-2.3.3/iconv' + +Like http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/iconv/iconvconfig.c.diff?r1=1.19&r2=1.20&cvsroot=glibc +but works with older compilers + +--- glibc-2.3.3/iconv/iconvconfig.c.old Thu Mar 17 01:23:04 2005 ++++ glibc-2.3.3/iconv/iconvconfig.c Thu Mar 17 01:24:56 2005 +@@ -1010,7 +1010,12 @@ + char finalname[prefix_len + sizeof (GCONV_MODULES_CACHE)]; + + /* Function to insert the names. */ +- static void name_insert (const void *nodep, VISIT value, int level) ++#if __GNUC__ >= 4 ++ auto void ++#else ++ static void ++#endif ++ name_insert (const void *nodep, VISIT value, int level) + { + struct name *name; + unsigned int idx; diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconvdata-2.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconvdata-2.patch new file mode 100644 index 00000000..98e99035 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconvdata-2.patch @@ -0,0 +1,124 @@ +To: Glibc hackers <libc-hacker at sources dot redhat dot com> +Subject: iconvdata: Get rid of lvalue casts +From: Andreas Jaeger <aj at suse dot de> +Date: Sun, 07 Mar 2004 08:29:47 +0100 +Message-ID: <m3fzclt8r8.fsf@gromit.moeb> + +Here's one more patch to get rid of lvalues to make GCC 3.5 happy. It +generates the same code as before on my machine and passes the +testsuite. + +Ok to commit? + +Andreas + +2004-03-07 Andreas Jaeger <aj@suse.de> + + * iconvdata/iso-2022-cn-ext.c (BODY): Remove cast used as lvalue. + * iconvdata/tcvn5712-1.c (EMIT_SHIFT_TO_INIT): Likewise. + * iconvdata/euc-jisx0213.c (EMIT_SHIFT_TO_INIT): Likewise. + * iconvdata/shift_jisx0213.c (EMIT_SHIFT_TO_INIT): Likewise. + * iconvdata/tscii.c (EMIT_SHIFT_TO_INIT): Likewise. + +[rediffed to make crosstool happy] + +diff -ur glibc-2.3.3.orig/iconvdata/euc-jisx0213.c glibc-2.3.3.new/iconvdata/euc-jisx0213.c +--- glibc-2.3.3.orig/iconvdata/euc-jisx0213.c Mon Dec 2 14:07:54 2002 ++++ glibc-2.3.3.new/iconvdata/euc-jisx0213.c Fri Mar 18 09:29:22 2005 +@@ -1,5 +1,5 @@ + /* Conversion from and to EUC-JISX0213. +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Bruno Haible <bruno@clisp.org>, 2002. + +@@ -83,7 +83,8 @@ + if (__builtin_expect (outbuf + 4 <= outend, 1)) \ + { \ + /* Write out the last character. */ \ +- *((uint32_t *) outbuf)++ = data->__statep->__count >> 3; \ ++ *((uint32_t *) outbuf) = data->__statep->__count >> 3; \ ++ outbuf += sizeof (uint32_t); \ + data->__statep->__count = 0; \ + } \ + else \ +diff -ur glibc-2.3.3.orig/iconvdata/iso-2022-cn-ext.c glibc-2.3.3.new/iconvdata/iso-2022-cn-ext.c +--- glibc-2.3.3.orig/iconvdata/iso-2022-cn-ext.c Fri Jun 28 14:13:14 2002 ++++ glibc-2.3.3.new/iconvdata/iso-2022-cn-ext.c Fri Mar 18 09:29:22 2005 +@@ -1,5 +1,5 @@ + /* Conversion module for ISO-2022-CN-EXT. +- Copyright (C) 2000-2002 Free Software Foundation, Inc. ++ Copyright (C) 2000-2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 2000. + +@@ -377,7 +377,8 @@ + } \ + } \ + \ +- *((uint32_t *) outptr)++ = ch; \ ++ *((uint32_t *) outptr) = ch; \ ++ outptr += sizeof (uint32_t); \ + } + #define EXTRA_LOOP_DECLS , int *setp + #define INIT_PARAMS int set = (*setp >> 3) & CURRENT_MASK; \ +diff -ur glibc-2.3.3.orig/iconvdata/shift_jisx0213.c glibc-2.3.3.new/iconvdata/shift_jisx0213.c +--- glibc-2.3.3.orig/iconvdata/shift_jisx0213.c Mon Dec 2 14:07:56 2002 ++++ glibc-2.3.3.new/iconvdata/shift_jisx0213.c Fri Mar 18 09:29:22 2005 +@@ -1,5 +1,5 @@ + /* Conversion from and to Shift_JISX0213. +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Bruno Haible <bruno@clisp.org>, 2002. + +@@ -83,7 +83,8 @@ + if (__builtin_expect (outbuf + 4 <= outend, 1)) \ + { \ + /* Write out the last character. */ \ +- *((uint32_t *) outbuf)++ = data->__statep->__count >> 3; \ ++ *((uint32_t *) outbuf) = data->__statep->__count >> 3; \ ++ outbuf += sizeof (uint32_t); \ + data->__statep->__count = 0; \ + } \ + else \ +diff -ur glibc-2.3.3.orig/iconvdata/tcvn5712-1.c glibc-2.3.3.new/iconvdata/tcvn5712-1.c +--- glibc-2.3.3.orig/iconvdata/tcvn5712-1.c Mon Dec 2 14:07:52 2002 ++++ glibc-2.3.3.new/iconvdata/tcvn5712-1.c Fri Mar 18 09:29:22 2005 +@@ -1,5 +1,5 @@ + /* Conversion to and from TCVN5712-1. +- Copyright (C) 2001, 2002 Free Software Foundation, Inc. ++ Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@redhat.com>, 2001. + +@@ -68,7 +68,8 @@ + if (__builtin_expect (outbuf + 4 <= outend, 1)) \ + { \ + /* Write out the last character. */ \ +- *((uint32_t *) outbuf)++ = data->__statep->__count >> 3; \ ++ *((uint32_t *) outbuf) = data->__statep->__count >> 3; \ ++ outbuf += sizeof (uint32_t); \ + data->__statep->__count = 0; \ + } \ + else \ +diff -ur glibc-2.3.3.orig/iconvdata/tscii.c glibc-2.3.3.new/iconvdata/tscii.c +--- glibc-2.3.3.orig/iconvdata/tscii.c Mon Sep 23 20:39:45 2002 ++++ glibc-2.3.3.new/iconvdata/tscii.c Fri Mar 18 09:29:22 2005 +@@ -1,5 +1,5 @@ + /* Conversion from and to TSCII. +- Copyright (C) 2002 Free Software Foundation, Inc. ++ Copyright (C) 2002, 2004 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Bruno Haible <bruno@clisp.org>, 2002. + +@@ -98,7 +98,8 @@ + break; \ + } \ + /* Write out the pending character. */ \ +- *((uint32_t *) outbuf)++ = data->__statep->__count >> 8; \ ++ *((uint32_t *) outbuf) = data->__statep->__count >> 8; \ ++ outbuf += sizeof (uint32_t); \ + /* Retrieve the successor state. */ \ + data->__statep->__count = \ + tscii_next_state[(data->__statep->__count >> 4) & 0x0f]; \ diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconvdata.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconvdata.patch new file mode 100644 index 00000000..e0ceba6a --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-iconvdata.patch @@ -0,0 +1,142 @@ +Fixes + +In file included from jis0208.c:23: +jis0208.h:32: error: array type has incomplete element type +when building with gcc-4.0 + +In file included from cp1258.c:869: +../iconv/skeleton.c: In function 'gconv': +../iconv/skeleton.c:323: error: invalid lvalue in increment + +In file included from cp1255.c:550: +../iconv/skeleton.c: In function 'gconv': +../iconv/skeleton.c:323: error: invalid lvalue in increment + +In file included from gb18030.c:22114: +../iconv/loop.c: In function 'from_gb18030': +../iconv/loop.c:282: error: invalid lvalue in increment +../iconv/loop.c: In function 'from_gb18030_single': +../iconv/loop.c:384: error: invalid lvalue in increment + +In file included from iso8859-1.c:43: +../iconv/loop.c: In function 'from_iso8859_1': +../iconv/loop.c:311: error: invalid lvalue in increment + +Rediffed, updated for glibc-2.3.3, added: + +In file included from armscii-8.c:85: +../iconv/loop.c: In function 'from_armscii_8': +../iconv/loop.c:311: error: invalid lvalue in increment +../iconv/loop.c:311: error: invalid lvalue in increment + +--- glibc-2.3.3.orig/iconvdata/armscii-8.c Mon Dec 2 14:07:52 2002 ++++ glibc-2.3.3/iconvdata/armscii-8.c Thu Mar 17 16:01:23 2005 +@@ -57,11 +57,17 @@ + uint_fast8_t ch = *inptr; \ + \ + if (ch <= 0xa0) \ +- /* Upto and including 0xa0 the ARMSCII-8 corresponds to Unicode. */ \ +- *((uint32_t *) outptr)++ = ch; \ ++ { \ ++ /* Upto and including 0xa0 the ARMSCII-8 corresponds to Unicode. */ \ ++ *((uint32_t *) outptr) = ch; \ ++ outptr += sizeof (uint32_t); \ ++ } \ + else if (ch >= 0xa2 && ch <= 0xfe) \ +- /* Use the table. */ \ +- *((uint32_t *) outptr)++ = map_from_armscii_8[ch - 0xa2]; \ ++ { \ ++ /* Use the table. */ \ ++ *((uint32_t *) outptr) = map_from_armscii_8[ch - 0xa2]; \ ++ outptr += sizeof (uint32_t); \ ++ } \ + else \ + { \ + /* This is an illegal character. */ \ +diff -ur glibc-2.3.3.orig/iconvdata/cp1255.c glibc-2.3.3/iconvdata/cp1255.c +--- glibc-2.3.3.orig/iconvdata/cp1255.c Mon Dec 2 14:07:52 2002 ++++ glibc-2.3.3/iconvdata/cp1255.c Thu Mar 17 08:20:13 2005 +@@ -69,7 +69,8 @@ + if (__builtin_expect (outbuf + 4 <= outend, 1)) \ + { \ + /* Write out the last character. */ \ +- *((uint32_t *) outbuf)++ = data->__statep->__count >> 3; \ ++ *((uint32_t *) outbuf) = data->__statep->__count >> 3; \ ++ outbuf += sizeof (uint32_t); \ + data->__statep->__count = 0; \ + } \ + else \ +diff -ur glibc-2.3.3.orig/iconvdata/cp1258.c glibc-2.3.3/iconvdata/cp1258.c +--- glibc-2.3.3.orig/iconvdata/cp1258.c Mon Dec 2 14:07:52 2002 ++++ glibc-2.3.3/iconvdata/cp1258.c Thu Mar 17 08:20:13 2005 +@@ -70,7 +70,8 @@ + if (__builtin_expect (outbuf + 4 <= outend, 1)) \ + { \ + /* Write out the last character. */ \ +- *((uint32_t *) outbuf)++ = data->__statep->__count >> 3; \ ++ *((uint32_t *) outbuf) = data->__statep->__count >> 3; \ ++ outbuf += sizeof (uint32_t); \ + data->__statep->__count = 0; \ + } \ + else \ +diff -ur glibc-2.3.3.orig/iconvdata/gb18030.c glibc-2.3.3/iconvdata/gb18030.c +--- glibc-2.3.3.orig/iconvdata/gb18030.c Mon Dec 2 14:07:54 2002 ++++ glibc-2.3.3/iconvdata/gb18030.c Thu Mar 17 08:20:13 2005 +@@ -25769,7 +25769,8 @@ + } \ + } \ + \ +- *((uint32_t *) outptr)++ = ch; \ ++ *((uint32_t *) outptr) = ch; \ ++ outptr += sizeof (uint32_t); \ + } + #define LOOP_NEED_FLAGS + #define ONEBYTE_BODY \ +diff -ur glibc-2.3.3.orig/iconvdata/iso8859-1.c glibc-2.3.3/iconvdata/iso8859-1.c +--- glibc-2.3.3.orig/iconvdata/iso8859-1.c Mon Dec 2 14:07:56 2002 ++++ glibc-2.3.3/iconvdata/iso8859-1.c Thu Mar 17 08:20:47 2005 +@@ -35,7 +35,8 @@ + #define MIN_NEEDED_OUTPUT MIN_NEEDED_TO + #define LOOPFCT FROM_LOOP + #define BODY \ +- *((uint32_t *) outptr)++ = *inptr++; ++ *((uint32_t *) outptr) = *inptr++; \ ++ outptr += sizeof (uint32_t); + #define ONEBYTE_BODY \ + { \ + return c; \ +diff -ur glibc-2.3.3.orig/iconvdata/jis0208.h glibc-2.3.3/iconvdata/jis0208.h +--- glibc-2.3.3.orig/iconvdata/jis0208.h Wed Jun 11 14:40:42 2003 ++++ glibc-2.3.3/iconvdata/jis0208.h Thu Mar 17 08:20:13 2005 +@@ -24,15 +24,6 @@ + #include <gconv.h> + #include <stdint.h> + +-/* Conversion table. */ +-extern const uint16_t __jis0208_to_ucs[]; +- +-extern const char __jisx0208_from_ucs4_lat1[256][2]; +-extern const char __jisx0208_from_ucs4_greek[0xc1][2]; +-extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[]; +-extern const char __jisx0208_from_ucs_tab[][2]; +- +- + /* Struct for table with indeces in UCS mapping table. */ + struct jisx0208_ucs_idx + { +@@ -40,6 +31,15 @@ + uint16_t end; + uint16_t idx; + }; ++ ++ ++/* Conversion table. */ ++extern const uint16_t __jis0208_to_ucs[]; ++ ++extern const char __jisx0208_from_ucs4_lat1[256][2]; ++extern const char __jisx0208_from_ucs4_greek[0xc1][2]; ++extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[]; ++extern const char __jisx0208_from_ucs_tab[][2]; + + + static inline uint32_t diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-locale.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-locale.patch new file mode 100644 index 00000000..a0858223 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-locale.patch @@ -0,0 +1,34 @@ +--- glibc-2.3.3/locale/weight.h.old 2003-06-11 14:52:12.000000000 -0700 ++++ glibc-2.3.3/locale/weight.h 2005-03-15 12:05:37.000000000 -0800 +@@ -18,8 +18,14 @@ + 02111-1307 USA. */ + + /* Find index of weight. */ ++#if __GNUC__ >= 4 ++auto inline int32_t ++#else + static inline int32_t ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) + __attribute ((always_inline)) ++#endif + findidx (const unsigned char **cpp) + { + int_fast32_t i = table[*(*cpp)++]; +--- glibc-2.3.3/locale/weightwc.h.old 2003-06-13 13:44:58.000000000 -0700 ++++ glibc-2.3.3/locale/weightwc.h 2005-03-15 12:06:46.000000000 -0800 +@@ -18,8 +18,14 @@ + 02111-1307 USA. */ + + /* Find index of weight. */ ++#if __GNUC__ >= 4 ++auto inline int32_t ++#else + static inline int32_t ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) + __attribute ((always_inline)) ++#endif + findidx (const wint_t **cpp) + { + int32_t i; diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-posix.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-posix.patch new file mode 100644 index 00000000..20f8825f --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-posix.patch @@ -0,0 +1,77 @@ +Fixes errors + +regcomp.c: In function 'parse_bracket_exp': +regcomp.c:2724: error: invalid storage class for function 'seek_collating_symbol_entry' +regcomp.c:2757: error: invalid storage class for function 'lookup_collation_sequence_value' +regcomp.c:2826: error: invalid storage class for function 'build_range_exp' +regcomp.c:2913: error: invalid storage class for function 'build_collating_symbol' +... +make[2]: *** [/home/dank/queue/jobdir.fast/crosstool-dev/build/x86_64-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/build-glibc/posix/regex.o] Error 1 + +See also http://sources.redhat.com/ml/glibc-cvs/2004-q3/msg01071.html +That fix requires gcc-4.0, but the fix proposed here works with older compilers, too + +--- glibc-2.3.3/posix/regcomp.c.old 2005-03-16 11:40:55.000000000 -0800 ++++ glibc-2.3.3/posix/regcomp.c 2005-03-16 11:50:31.000000000 -0800 +@@ -2718,8 +2718,14 @@ + Seek the collating symbol entry correspondings to NAME. + Return the index of the symbol in the SYMB_TABLE. */ + ++#if __GNUC__ >= 4 ++ auto inline int32_t ++#else + static inline int32_t ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) + __attribute ((always_inline)) ++#endif + seek_collating_symbol_entry (name, name_len) + const unsigned char *name; + size_t name_len; +@@ -2751,8 +2757,14 @@ + Look up the collation sequence value of BR_ELEM. + Return the value if succeeded, UINT_MAX otherwise. */ + ++#if __GNUC__ >= 4 ++ auto inline unsigned int ++#else + static inline unsigned int ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) + __attribute ((always_inline)) ++#endif + lookup_collation_sequence_value (br_elem) + bracket_elem_t *br_elem; + { +@@ -2819,8 +2831,14 @@ + mbcset->range_ends, is a pointer argument sinse we may + update it. */ + +- static inline reg_errcode_t ++#if __GNUC__ >= 4 ++ auto inline reg_errcode_t ++#else ++ static inline reg_errcode_t ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) + __attribute ((always_inline)) ++#endif + # ifdef RE_ENABLE_I18N + build_range_exp (sbcset, mbcset, range_alloc, start_elem, end_elem) + re_charset_t *mbcset; +@@ -2906,8 +2924,14 @@ + COLL_SYM_ALLOC is the allocated size of mbcset->coll_sym, is a + pointer argument sinse we may update it. */ + +- static inline reg_errcode_t ++#if __GNUC__ >= 4 ++ auto inline reg_errcode_t ++#else ++ static inline reg_errcode_t ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) + __attribute ((always_inline)) ++#endif + # ifdef RE_ENABLE_I18N + build_collating_symbol (sbcset, mbcset, coll_sym_alloc, name) + re_charset_t *mbcset; diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-powerpc-procfs.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-powerpc-procfs.patch new file mode 100644 index 00000000..0c824bcf --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-powerpc-procfs.patch @@ -0,0 +1,65 @@ +(Combined with earlier fix old/glibc-2.3.2-powerpc-procfs.patch +from http://sources.redhat.com/ml/libc-alpha/2003-12/msg00101.html) + +This fix discussed here: +http://gcc.gnu.org/ml/gcc/2005-01/msg00509.html + +Revision 1.12, Wed Mar 2 20:11:38 2005 UTC by roland +Branch: MAIN +CVS Tags: fedora-glibc-20050303T1335, HEAD +Changes since 1.11: +3 -8 lines +Diff to previous 1.11 (colored) + +2005-02-21 Alan Modra <amodra@bigpond.net.au> + + * sysdeps/unix/sysv/linux/powerpc/sys/procfs.h (elf_vrreg_t): Don't + use __uint128_t. + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h?cvsroot=glibc +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h.diff?r1=1.11&r2=1.12&cvsroot=glibc + +Fixes + +In file included from ../linuxthreads_db/proc_service.h:20, + from ../linuxthreads_db/thread_dbP.h:7, + from ../linuxthreads/descr.h:44, + from ../linuxthreads/internals.h:30, + from ../linuxthreads/sysdeps/pthread/bits/libc-lock.h:27, + from ../sysdeps/generic/ldsodefs.h:38, + from ../sysdeps/unix/sysv/linux/ldsodefs.h:25, + from <stdin>:2: +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: error: syntax error before 'elf_vrreg_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: type defaults to 'int' in declaration of 'elf_vrreg_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: data definition has no type or storage class +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: error: syntax error before 'elf_vrregset_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: type defaults to 'int' in declaration of 'elf_vrregset_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: data definition has no type or storage class +make[2]: make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/csu' + +Rediffed against glibc-2.3.3 + +--- glibc-2.3.3.orig/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h Sun Jan 12 00:24:23 2003 ++++ glibc-2.3.3.new/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h Fri Mar 18 11:20:58 2005 +@@ -45,18 +45,13 @@ + + typedef double elf_fpreg_t; + typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; +-#endif +- +-/* gcc 3.1 and newer support __uint128_t. */ +-#if !__GNUC_PREREQ(3,1) +-typedef struct { +- unsigned long u[4]; +-} __attribute((aligned(16))) __uint128_t; +-#endif + + /* Altivec registers */ +-typedef __uint128_t elf_vrreg_t; ++typedef struct { ++ unsigned int u[4]; ++} __attribute__ ((aligned (16))) elf_vrreg_t; + typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG]; ++#endif + + struct elf_siginfo + { diff --git a/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-x86_64.patch b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-x86_64.patch new file mode 100644 index 00000000..c85aab90 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-allow-gcc-4.0-x86_64.patch @@ -0,0 +1,60 @@ +Fixes + +In file included from dynamic-link.h:22, + from dl-reloc.c:265: +../sysdeps/x86_64/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/x86_64/dl-machine.h:361: error: invalid storage class for function 'elf_machine_rela' +../sysdeps/x86_64/dl-machine.h:525: error: invalid storage class for function 'elf_machine_rela_relative' +../sysdeps/x86_64/dl-machine.h:534: error: invalid storage class for function 'elf_machine_lazy_rel' +make[2]: *** [/home/dank/queue/jobdir.fast/crosstool-dev/build/x86_64-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/build-glibc/elf/dl-reloc.o] Error 1 + +--- glibc-2.3.3/sysdeps/x86_64/dl-machine.h.old Wed Mar 16 16:19:15 2005 ++++ glibc-2.3.3/sysdeps/x86_64/dl-machine.h Wed Mar 16 16:22:09 2005 +@@ -354,7 +354,14 @@ + /* Perform the relocation specified by RELOC and SYM (which is fully resolved). + MAP is the object containing the reloc. */ + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela (struct link_map *map, const Elf64_Rela *reloc, + const Elf64_Sym *sym, const struct r_found_version *version, + void *const reloc_addr_arg) +@@ -519,7 +526,14 @@ + } + } + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc, + void *const reloc_addr_arg) + { +@@ -528,7 +542,14 @@ + *reloc_addr = l_addr + reloc->r_addend; + } + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_lazy_rel (struct link_map *map, + Elf64_Addr l_addr, const Elf64_Rela *reloc) + { diff --git a/patches/glibc/2.3.3/glibc-2.3.3-alpha-pwrite64.patch b/patches/glibc/2.3.3/glibc-2.3.3-alpha-pwrite64.patch new file mode 100644 index 00000000..7baea61c --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-alpha-pwrite64.patch @@ -0,0 +1,41 @@ +Fix for this error: + +crosstool-0.32/build/alpha-unknown-linux-gnu/gcc-3.3.5-glibc-2.3.3/build-glibc/libc_pic.os(.text+0xc8bd0): In function `__posix_fallocate64_l64': +: undefined reference to `__GI___pwrite64' +collect2: ld returned 1 exit status +make[1]: *** [crosstool-0.32/build/alpha-unknown-linux-gnu/gcc-3.3.5-glibc-2.3.3/build-glibc/libc.so] Error 1 +make[1]: Leaving directory `crosstool-0.32/build/alpha-unknown-linux-gnu/gcc-3.3.5-glibc-2.3.3/glibc-2.3.3' +make: *** [all] Error 2 + +extracted from GLIBC CVS by Dan Kegel +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/alpha/sysdep.h.diff?r1=1.16&r2=1.17&cvsroot=glibc' + +cf. +http://sources.redhat.com/ml/libc-alpha/2003-10/msg00038.html + + +--- glibc-2.3.3/sysdeps/unix/sysv/linux/alpha/sysdep.h.old 2003-06-20 09:24:36.000000000 -0700 ++++ glibc-2.3.3/sysdeps/unix/sysv/linux/alpha/sysdep.h 2005-04-27 11:23:46.000000000 -0700 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2002, 2003 ++/* Copyright (C) 1992, 1993, 1995, 1996, 1997, 2002, 2003, 2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper, <drepper@gnu.ai.mit.edu>, August 1995. +@@ -65,6 +65,16 @@ + # define __NR_semtimedop 423 + #endif + ++/* This is a kludge to make syscalls.list find these under the names ++ pread and pwrite, since some kernel headers define those names ++ and some define the *64 names for the same system calls. */ ++#if !defined __NR_pread && defined __NR_pread64 ++# define __NR_pread __NR_pread64 ++#endif ++#if !defined __NR_pwrite && defined __NR_pwrite64 ++# define __NR_pwrite __NR_pwrite64 ++#endif ++ + /* + * In order to get the hidden arguments for rt_sigaction set up + * properly, we need to call the assembly version. This shouldn't diff --git a/patches/glibc/2.3.3/glibc-2.3.3-cygwin.patch b/patches/glibc/2.3.3/glibc-2.3.3-cygwin.patch new file mode 100644 index 00000000..0ad9a717 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-cygwin.patch @@ -0,0 +1,103 @@ +Fixes +elf/librtld.os: In function `process_envvars': : undefined reference to `__access' +... +when building glibc-2.3.3 on cygwin + +Idea from +http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch +Basically, make glibc use .oST as suffix for 'object static' +instead of .oS, since cygwin has trouble distinguishing .os from .oS +(Original patch had .on, but .oST is more mnemonic for 'object static') + +glibc-linuxthreads-2.3.3 also requires a patch, see +../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch + +[ Rediffed against glibc-2.3.3 ] + + +diff -aur glibc-2.3.3/Makeconfig glibc-2.3.3-cygwin/Makeconfig +--- glibc-2.3.3/Makeconfig 2003-09-17 01:36:10.000000000 -0700 ++++ glibc-2.3.3-cygwin/Makeconfig 2004-08-27 20:34:43.000000000 -0700 +@@ -439,13 +439,13 @@ + # run the linked programs. + link-libc = -Wl,-rpath-link=$(rpath-link) \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib) ++ $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib) + # This is how to find at build-time things that will be installed there. + rpath-dirs = math elf dlfcn nss nis rt resolv crypt + else + ifneq (,$(filter aix aix%,$(config-os))) + link-libc = $(common-objpfx)libc.a \ +- $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib) ++ $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib) + rpath-dirs = math dlfcn nss nis rt resolv crypt + endif + endif +@@ -658,7 +658,7 @@ + # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX}) + # to pass different flags for each flavor. + libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o)) +-all-object-suffixes := .o .os .op .og .ob .oS ++all-object-suffixes := .o .os .op .og .ob .oST + object-suffixes := + CPPFLAGS-.o = $(pic-default) + CFLAGS-.o = $(filter %frame-pointer,$(+cflags)) +@@ -714,14 +714,14 @@ + + ifeq (yes,$(build-shared)) + # Build special library that contains the static-only routines for libc. +-object-suffixes-for-libc += .oS ++object-suffixes-for-libc += .oST + + # Must build the routines as PIC, though, because they can end up in (users') + # shared objects. We don't want to use CFLAGS-os because users may, for + # example, make that processor-specific. +-CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag) +-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1 +-libtype.oS = lib%_nonshared.a ++CFLAGS-.oST = $(CFLAGS-.o) $(pic-ccflag) ++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1 ++libtype.oST = lib%_nonshared.a + endif + + # The assembler can generate debug information too. +diff -aur glibc-2.3.3/Makerules glibc-2.3.3-cygwin/Makerules +--- glibc-2.3.3/Makerules 2003-10-31 16:35:57.000000000 -0800 ++++ glibc-2.3.3-cygwin/Makerules 2004-08-27 20:33:47.000000000 -0700 +@@ -414,7 +414,7 @@ + # Bounded pointer thunks are only built for *.ob + elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks)) + +-elide-routines.oS += $(filter-out $(static-only-routines),\ ++elide-routines.oST += $(filter-out $(static-only-routines),\ + $(routines) $(aux) $(sysdep_routines)) \ + $(elide-bp-thunks) + elide-routines.os += $(static-only-routines) $(elide-bp-thunks) +@@ -934,7 +934,7 @@ + install: $(inst_libdir)/libc.so + $(inst_libdir)/libc.so: $(common-objpfx)format.lds \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)$(libc-name)) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -942,7 +942,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\ + ')' \ + ) > $@.new + mv -f $@.new $@ +diff -aur glibc-2.3.3/sysdeps/sparc/sparc32/sparcv9/Makefile glibc-2.3.3-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile +--- glibc-2.3.3/sysdeps/sparc/sparc32/sparcv9/Makefile 2002-08-29 03:41:15.000000000 -0700 ++++ glibc-2.3.3-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile 2004-08-27 20:35:43.000000000 -0700 +@@ -10,4 +10,4 @@ + ASFLAGS-.op += -Wa,-Av9a + ASFLAGS-.og += -Wa,-Av9a + ASFLAGS-.ob += -Wa,-Av9a +-ASFLAGS-.oS += -Wa,-Av9a ++ASFLAGS-.oST += -Wa,-Av9a diff --git a/patches/glibc/2.3.3/glibc-2.3.3-libeh-kludge.patch b/patches/glibc/2.3.3/glibc-2.3.3-libeh-kludge.patch new file mode 100644 index 00000000..6ddc020f --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-libeh-kludge.patch @@ -0,0 +1,75 @@ +wget "http://sources.redhat.com/cgi-bin/get-raw-msg?listname=libc-alpha&date=2003-09&msgid=20030911190500.GE12344%40sunsite.ms.mff.cuni.cz" +aka http://sources.redhat.com/ml/libc-alpha/2003-09/msg00104.html + +This seems to fix the error + gcc-3.4.1-glibc-2.3.3/lib/gcc/powerpc-7400-linux-gnu/3.4.1/../../../../powerpc-7400-linux-gnu/bin/ld: cannot find -lgcc_eh + make[1]: *** [build/powerpc-7400-linux-gnu/gcc-3.4.1-glibc-2.3.3/build-glibc/libc.so] Error 1 +but I assume it might cause trouble with nptl +FIXME: once we figure out why this patch is wrong, fix it right :-) + +Date: Thu, 11 Sep 2003 21:05:00 +0200 +From: Jakub Jelinek <jakub at redhat dot com> +To: libc-alpha at sources dot redhat dot com +Subject: Re: Another ugly bootstrapping patch for libgcc_eh +Message-ID: <20030911190500.GE12344@sunsite.ms.mff.cuni.cz> +Reply-To: Jakub Jelinek <jakub at redhat dot com> +References: <20030911194944.GA6104@nevyn.them.org> <20030911180703.GD12344@sunsite.ms.mff.cuni.cz> <20030911203621.GA31503@nevyn.them.org> +In-Reply-To: <20030911203621 dot GA31503 at nevyn dot them dot org> + +On Thu, Sep 11, 2003 at 04:36:21PM -0400, Daniel Jacobowitz wrote: +> > Why exactly do you need that? +> > What exact library needs the functions from libgcc_eh.a? +> > There shouldn't be any these days (__register_*/__frame_state_for etc. +> > functions should come from sysdeps/generic on arches which need them, +> > _Unwind_* come from unwind*.c). +> > IMHO both: +> > +> > # Force the backward compatibility EH functions to be linked. +> > LDFLAGS-c.so += -u __register_frame +> > +> > in Makerules and -lgcc_eh in Makeconfig should go. +> +> If you say so. That -lgcc_eh's been in and out quite a number of +> times. I was just assuming that it was necessary. + +I have been testing following patch on hammer. +linuxthreads built just fine and NPTL libraries too, +and in both cases libraries had the same exported symbols as without +the patch (though its .text slightly shrunk because it no longer contained +unneeded libgcc_eh routines (and also libc.so has fewer .plt slots). +Unfortunately, sln in NPTL build doesn't link, as libgcc_eh.a is needed +in this case. +So, IMHO we need my Makerules change and Daniel's patch. + +2003-09-11 Jakub Jelinek <jakub@redhat.com> + + #* Makerules (LDFLAGS-c.so): Remove -u __register_frame. + * Makeconfig (gnulib): Remove -lgcc_eh. + +# Ulrich already applied this. +#--- libc/Makerules.jj 2003-07-23 03:56:16.000000000 -0400 +#+++ libc/Makerules 2003-09-11 16:22:44.000000000 -0400 +#@@ -572,8 +572,6 @@ LDFLAGS-c.so = -nostdlib -nostartfiles +# LDLIBS-c.so += $(gnulib) +# # Give libc.so an entry point and make it directly runnable itself. +# LDFLAGS-c.so += -e __libc_main +#-# Force the backward compatibility EH functions to be linked. +#-LDFLAGS-c.so += -u __register_frame +# # Pre-link the objects of libc_pic.a so that we can locally resolve +# # COMMON symbols before we link against ld.so. This is because ld.so +# # contains some of libc_pic.a already, which will prevent the COMMONs +--- libc/Makeconfig.jj 2003-07-22 08:25:32.000000000 -0400 ++++ libc/Makeconfig 2003-09-11 16:23:08.000000000 -0400 +@@ -505,7 +505,7 @@ link-libc-bounded = $(common-objpfx)libc + link-extra-libs-bounded = $(foreach lib,$(LDLIBS-$(@F:%-bp=%)),$(common-objpfx)$(lib)_b.a) + + ifndef gnulib +-gnulib := -lgcc -lgcc_eh ++gnulib := -lgcc + endif + ifeq ($(elf),yes) + +preinit = $(addprefix $(csu-objpfx),crti.o) + + + Jakub + diff --git a/patches/glibc/2.3.3/glibc-2.3.3-s390-fadvise64.patch b/patches/glibc/2.3.3/glibc-2.3.3-s390-fadvise64.patch new file mode 100644 index 00000000..9f217445 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-s390-fadvise64.patch @@ -0,0 +1,128 @@ +See http://sources.redhat.com/ml/libc-hacker/2003-12/msg00023.html +or http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c?cvsroot=glibc + +Should fix error + +../sysdeps/unix/sysv/linux/posix_fadvise64.c: In function `__posix_fadvise64_l64': +../sysdeps/unix/sysv/linux/posix_fadvise64.c:35: warning: implicit declaration of function `DECLARGS_6' +../sysdeps/unix/sysv/linux/posix_fadvise64.c:35: error: parse error before "register" +... +../sysdeps/unix/sysv/linux/posix_fadvise64.c:35: error: parse error before "ASMFMT_6" +make[2]: *** [crosstool-0.28-rc34/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-2.3.3/build-glibc/io/posix_fadvise64.o] Error 1 + + +From: Martin Schwidefsky <schwidefsky at de dot ibm dot com> +Organization: IBM Deutschland GmbH +To: libc-hacker at sources dot redhat dot com +Subject: fadvise64_64 for s390-32. +Date: Fri, 5 Dec 2003 18:46:33 +0100 + +Hi, +on s390* system calls can have up to 5 paramters. The generic linux +implemenation of fadvise64_64 for 32 bit systems needs 6 parameters, +so we need to have a s390-32 special version of posix_fadvise64.c. +For s390-64 we do not have the problem because there fadvise64_64 +has only 4 parameters. + +blue skies, + Martin. + +2003-12-05 Martin Schwidefsky <schwidefsky@de.ibm.com> + + * sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c: New file. + +diff -urN libc/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c libc-s390/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c +--- libc/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c 1970-01-01 01:00:00.000000000 +0100 ++++ libc-s390/sysdeps/unix/sysv/linux/s390/s390-32/posix_fadvise64.c 2003-11-13 15:31:40.000000000 +0100 +@@ -0,0 +1,90 @@ ++/* 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 <errno.h> ++#include <fcntl.h> ++#include <sysdep.h> ++#include <kernel-features.h> ++ ++int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise); ++int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise); ++ ++/* Advice the system about the expected behaviour of the application with ++ respect to the file associated with FD. */ ++ ++struct fadvise64_64_layout ++{ ++ int fd; ++ off64_t offset; ++ off64_t len; ++ int advise; ++}; ++ ++int ++__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) ++{ ++#ifdef __NR_fadvise64_64 ++ struct fadvise64_64_layout parameters; ++ INTERNAL_SYSCALL_DECL (err); ++ ++ parameters.fd = fd; ++ parameters.offset = offset; ++ parameters.len = len; ++ parameters.advise = advise; ++ int ret = INTERNAL_SYSCALL (fadvise64_64, err, 1, ¶meters); ++ if (!INTERNAL_SYSCALL_ERROR_P (ret, err)) ++ return 0; ++# ifndef __ASSUME_FADVISE64_64_SYSCALL ++ if (INTERNAL_SYSCALL_ERRNO (ret, err) != ENOSYS) ++# endif ++ return INTERNAL_SYSCALL_ERRNO (ret, err); ++#endif ++#ifndef __ASSUME_FADVISE64_64_SYSCALL ++# ifdef __NR_fadvise64 ++ if (len != (off_t) len) ++ return EOVERFLOW; ++ ++ INTERNAL_SYSCALL_DECL (err2); ++ int ret2 = INTERNAL_SYSCALL (fadvise64, err2, 5, fd, ++ __LONG_LONG_PAIR ((long) (offset >> 32), ++ (long) offset), ++ (off_t) len, advise); ++ if (!INTERNAL_SYSCALL_ERROR_P (ret2, err2)) ++ return 0; ++ return INTERNAL_SYSCALL_ERRNO (ret2, err2); ++# else ++ return ENOSYS; ++# endif ++#endif ++} ++ ++#include <shlib-compat.h> ++ ++#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) ++ ++int ++__posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) ++{ ++ return __posix_fadvise64_l64 (fd, offset, len, advise); ++} ++ ++versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); ++compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); ++#else ++strong_alias (__posix_fadvise64_l64, posix_fadvise64); ++#endif + diff --git a/patches/glibc/2.3.3/glibc-2.3.3-unwind-dw2.patch b/patches/glibc/2.3.3/glibc-2.3.3-unwind-dw2.patch new file mode 100644 index 00000000..d75c4ba8 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.3-unwind-dw2.patch @@ -0,0 +1,66 @@ +See http://sources.redhat.com/ml/libc-alpha/2004-02/msg00138.html +aka http://sources.redhat.com/cgi-bin/get-raw-msg?listname=libc-alpha&date=2004-02&msgid=20040220044155.GE22135%40baldric.uwo.ca + +In CVS as +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/generic/unwind-dw2.c.diff?r1=1.7&r2=1.8&cvsroot=glibc' + +Revision 1.8, Sat Feb 21 09:07:29 2004 UTC (5 months, 3 weeks ago) by drepper + + Allow sjlj enabled compilers to build the code by removing + __USING_SJLJ_EXCEPTIONS__ wrapper. + +plus +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/generic/framestate.c.diff?r1=1.3&r2=1.4&cvsroot=glibc' + +Revision 1.4, Sat Feb 21 09:07:05 2004 UTC (5 months, 3 weeks ago) by drepper + + [__USING_SJLJ_EXCEPTIONS__] (__frame_state_for): Set frame_State_for + to abort if the compiler is using sjlj. + +Fixes compile error + +../sysdeps/generic/framestate.c: In function `__frame_state_for': +../sysdeps/generic/framestate.c:44: error: `fallback_frame_state_for' undeclared (first use in this function) +../sysdeps/generic/framestate.c:44: error: (Each undeclared identifier is reported only once +../sysdeps/generic/framestate.c:44: error: for each function it appears in.) +make[2]: *** [crosstool-0.28-rc34/build/arm-unknown-linux-gnu/gcc-3.4.1-glibc-2.3.3/build-glibc/elf/framestate.os] Error 1 + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/generic/unwind-dw2.c,v +retrieving revision 1.7 +retrieving revision 1.8 +diff -u -r1.7 -r1.8 +--- libc/sysdeps/generic/unwind-dw2.c 2003/07/22 23:55:55 1.7 ++++ libc/sysdeps/generic/unwind-dw2.c 2004/02/21 09:07:29 1.8 +@@ -39,7 +39,6 @@ + #endif + + +-#ifndef __USING_SJLJ_EXCEPTIONS__ + + #ifndef STACK_GROWS_DOWNWARD + #define STACK_GROWS_DOWNWARD 0 +@@ -1287,4 +1286,3 @@ + #include "unwind.inc" + + #endif /* _LIBC */ +-#endif /* !USING_SJLJ_EXCEPTIONS */ +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/generic/framestate.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/sysdeps/generic/framestate.c 2003/01/08 06:46:06 1.3 ++++ libc/sysdeps/generic/framestate.c 2004/02/21 09:07:05 1.4 +@@ -41,7 +41,11 @@ + if (handle == NULL + || (frame_state_for + = (framesf) __libc_dlsym (handle, "__frame_state_for")) == NULL) ++#ifndef __USING_SJLJ_EXCEPTIONS__ + frame_state_for = fallback_frame_state_for; ++#else ++ frame_state_for = abort; ++#endif + } + + return frame_state_for (pc, frame_state); diff --git a/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-arm.patch b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-arm.patch new file mode 100644 index 00000000..f3ad0c61 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-arm.patch @@ -0,0 +1,117 @@ +Fixes +In file included from dynamic-link.h:22, + from dl-reloc.c:265: +../sysdeps/arm/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/arm/dl-machine.h:371: error: invalid storage class for function 'fix_bad_pc24' +../sysdeps/arm/dl-machine.h:406: error: invalid storage class for function 'elf_machine_rel' +../sysdeps/arm/dl-machine.h:532: error: invalid storage class for function 'elf_machine_rela' +../sysdeps/arm/dl-machine.h:612: error: invalid storage class for function 'elf_machine_rel_relative' +../sysdeps/arm/dl-machine.h:621: error: invalid storage class for function 'elf_machine_rela_relative' +../sysdeps/arm/dl-machine.h:630: error: invalid storage class for function 'elf_machine_lazy_rel' +make[2]: Leaving directory `/home/dank/queue/jobdir.k8/crosstool-dev/build/arm-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/glibc-2.3.3/elf' + +when building glibc-2.3.[34] with gcc-4.0 + +Like +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/arm/dl-machine.h.diff?r1=1.51&r2=1.52&cvsroot=glibc +but works with older compilers, and fixes fix_bad_pc24. + + +--- glibc-2.3.4/sysdeps/arm/dl-machine.h.old Sun Mar 20 17:54:37 2005 ++++ glibc-2.3.4/sysdeps/arm/dl-machine.h Sun Mar 20 17:57:32 2005 +@@ -359,7 +359,14 @@ + # endif + + /* Deal with an out-of-range PC24 reloc. */ +-static Elf32_Addr ++#if __GNUC__ >= 4 ++ auto inline Elf32_Addr ++#else ++ static inline Elf32_Addr ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + fix_bad_pc24 (Elf32_Addr *const reloc_addr, Elf32_Addr value) + { + static void *fix_page; +@@ -392,7 +399,14 @@ + /* Perform the relocation specified by RELOC and SYM (which is fully resolved). + MAP is the object containing the reloc. */ + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, + const Elf32_Sym *sym, const struct r_found_version *version, + void *const reloc_addr_arg) +@@ -517,7 +531,14 @@ + } + + # ifndef RTLD_BOOTSTRAP +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, + const Elf32_Sym *sym, const struct r_found_version *version, + void *const reloc_addr_arg) +@@ -597,7 +618,14 @@ + } + # endif + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc, + void *const reloc_addr_arg) + { +@@ -606,7 +634,14 @@ + } + + # ifndef RTLD_BOOTSTRAP +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc, + void *const reloc_addr_arg) + { +@@ -615,7 +650,14 @@ + } + # endif + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_lazy_rel (struct link_map *map, + Elf32_Addr l_addr, const Elf32_Rel *reloc) + { diff --git a/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-elf.patch b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-elf.patch new file mode 100644 index 00000000..3bbe6ea8 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-elf.patch @@ -0,0 +1,61 @@ +From http://www.mail-archive.com/pld-cvs-commit@pld-linux.org/msg00229.html +Fixes + rtld.c: In function '_dl_start': + dynamic-link.h:47: error: nested function 'elf_machine_rela_relative' declared but never defined + dynamic-link.h:41: error: nested function 'elf_machine_rela' declared but never defined +when compiling glibc-2.3.4 with gcc-4.0 + +But see also +http://sources.redhat.com/ml/libc-hacker/2005-02/msg00000.html +and +http://sources.redhat.com/ml/libc-hacker/2005-03/msg00008.html +which seem to propose less radical fixes? + +Aha. See also http://sources.redhat.com/bugzilla/show_bug.cgi?id=721 + +--- glibc-2.3-20050307/elf/dynamic-link.h.old 2005-03-12 18:12:37.000000000 -0800 ++++ glibc-2.3-20050307/elf/dynamic-link.h 2005-03-12 18:12:59.777820848 -0800 +@@ -19,43 +19,6 @@ + + #include <elf.h> + #include <assert.h> +- +-#ifdef RESOLVE +-/* We pass reloc_addr as a pointer to void, as opposed to a pointer to +- ElfW(Addr), because not all architectures can assume that the +- relocated address is properly aligned, whereas the compiler is +- entitled to assume that a pointer to a type is properly aligned for +- the type. Even if we cast the pointer back to some other type with +- less strict alignment requirements, the compiler might still +- remember that the pointer was originally more aligned, thereby +- optimizing away alignment tests or using word instructions for +- copying memory, breaking the very code written to handle the +- unaligned cases. */ +-auto void __attribute__((always_inline)) +-elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc, +- const ElfW(Sym) *sym, const struct r_found_version *version, +- void *const reloc_addr); +-auto void __attribute__((always_inline)) +-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc, +- const ElfW(Sym) *sym, const struct r_found_version *version, +- void *const reloc_addr); +-auto void __attribute__((always_inline)) +-elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc, +- void *const reloc_addr); +-auto void __attribute__((always_inline)) +-elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc, +- void *const reloc_addr); +-# if ELF_MACHINE_NO_RELA || defined ELF_MACHINE_PLT_REL +-auto void __attribute__((always_inline)) +-elf_machine_lazy_rel (struct link_map *map, +- ElfW(Addr) l_addr, const ElfW(Rel) *reloc); +-# else +-auto void __attribute__((always_inline)) +-elf_machine_lazy_rel (struct link_map *map, +- ElfW(Addr) l_addr, const ElfW(Rela) *reloc); +-# endif +-#endif +- + #include <dl-machine.h> + + #ifndef VERSYMIDX diff --git a/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch new file mode 100644 index 00000000..949a203e --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch @@ -0,0 +1,42 @@ +Fixes + +../sysdeps/powerpc/powerpc32/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/powerpc/powerpc32/dl-machine.h:461: error: invalid storage class for function 'elf_machine_rela_relative' +../sysdeps/powerpc/powerpc32/dl-machine.h:469: error: invalid storage class for function 'elf_machine_lazy_rel' +make[2]: *** [/home/dank/queue/jobdir.dual2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/build-glibc/elf/dl-reloc.o] Error 1 + +diff -ur glibc-2.3-20050307.orig/sysdeps/powerpc/powerpc32/dl-machine.h glibc-2.3-20050307/sysdeps/powerpc/powerpc32/dl-machine.h +--- glibc-2.3-20050307.orig/sysdeps/powerpc/powerpc32/dl-machine.h Wed Jul 30 23:33:52 2003 ++++ glibc-2.3-20050307/sysdeps/powerpc/powerpc32/dl-machine.h Thu Mar 17 13:19:16 2005 +@@ -455,7 +455,14 @@ + } + } + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc, + void *const reloc_addr_arg) + { +@@ -463,7 +470,14 @@ + *reloc_addr = l_addr + reloc->r_addend; + } + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_lazy_rel (struct link_map *map, + Elf32_Addr l_addr, const Elf32_Rela *reloc) + { diff --git a/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch new file mode 100644 index 00000000..6844a9cd --- /dev/null +++ b/patches/glibc/2.3.3/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch @@ -0,0 +1,60 @@ +Fixes: + +In file included from dynamic-link.h:22, + from dl-reloc.c:269: +../sysdeps/powerpc/powerpc64/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/powerpc/powerpc64/dl-machine.h:573: error: invalid storage class for function 'elf_machine_rela_relative' +../sysdeps/powerpc/powerpc64/dl-machine.h:607: error: invalid storage class for function 'elf_machine_rela' +../sysdeps/powerpc/powerpc64/dl-machine.h:889: error: invalid storage class for function 'elf_machine_lazy_rel' +make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc64-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/elf' + +--- glibc-2.3-20050307/sysdeps/powerpc/powerpc64/dl-machine.h.old Thu Mar 17 13:35:23 2005 ++++ glibc-2.3-20050307/sysdeps/powerpc/powerpc64/dl-machine.h Thu Mar 17 13:37:12 2005 +@@ -567,7 +567,14 @@ + const Elf64_Sym *refsym) + attribute_hidden; + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc, + void *const reloc_addr_arg) + { +@@ -598,7 +605,14 @@ + + /* Perform the relocation specified by RELOC and SYM (which is fully + resolved). MAP is the object containing the reloc. */ +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela (struct link_map *map, + const Elf64_Rela *reloc, + const Elf64_Sym *sym, +@@ -883,7 +897,14 @@ + MODIFIED_CODE_NOQUEUE (reloc_addr); + } + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_lazy_rel (struct link_map *map, + Elf64_Addr l_addr, const Elf64_Rela *reloc) + { diff --git a/patches/glibc/2.3.3/glibc-configure-apple-as.patch b/patches/glibc/2.3.3/glibc-configure-apple-as.patch new file mode 100644 index 00000000..604c36d5 --- /dev/null +++ b/patches/glibc/2.3.3/glibc-configure-apple-as.patch @@ -0,0 +1,23 @@ +http://in3www.epfl.ch/~schaffne/glibc-configure-apple-as.patch +http://sources.redhat.com/ml/crossgcc/2004-02/msg00151.html + +The following makes it possible to configure glibc-2.3.2 on Mac OS X, +where the assembler but doesn't understand the --version flag. + +Fixes the symptom +checking whether ld is GNU ld... no +checking for /usr/libexec/gcc/darwin/ppc/as... /usr/libexec/gcc/darwin/ppc/as +checking version of /usr/libexec/gcc/darwin/ppc/as... +<PAUSES HERE AND JUST SITS THERE DOING NOTHING> + +--- glibc-2.3.2/configure~ Wed Feb 26 09:20:48 2003 ++++ glibc-2.3.2/configure Fri Feb 27 13:12:53 2004 +@@ -3789,7 +3789,7 @@ + # Found it, now check the version. + echo "$as_me:$LINENO: checking version of $AS" >&5 + echo $ECHO_N "checking version of $AS... $ECHO_C" >&6 +- ac_prog_version=`$AS --version 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'` ++ ac_prog_version=`$AS -v </dev/null 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 2.1[3-9]*) diff --git a/patches/glibc/2.3.3/glibc-fp-byteorder.patch b/patches/glibc/2.3.3/glibc-fp-byteorder.patch new file mode 100644 index 00000000..f20432ea --- /dev/null +++ b/patches/glibc/2.3.3/glibc-fp-byteorder.patch @@ -0,0 +1,203 @@ +Taken from http://sources.redhat.com/ml/crossgcc/2004-02/msg00104.html +Author: addsub@eyou.com +Target: ARM + +Fixes http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/920501-8.c +and makes printf("%f", 1.0) work. + +Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00115.html : + It ... fixes the 'printf("%f\n", 0.5); prints 0.000000' and general 'floating point + is broken' on my big-endian hardfloat FPA ARM platform. ... + It's definitely needed for hardfloat. So I'd think it's needed for + big-endian systems in any case, and for VFP on little-endian systems + too. Someone would have to verify that though. + +Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00123.html + I just had a look at glibc-20040830, and [this patch] is still needed and useful + for this version. glibc-20040830 out-of-the-box still contains the + following wrong assumptions: + - sysdeps/arm/bits/endian.h: float word order is big endian (which it is + not on vfp systems) + - sysdeps/arm/gmp-mparam.h: IEEE doubles are mixed endian (which they + are not on big endian systems, neither on vfp systems) + - sysdeps/arm/ieee754.h: IEEE doubles are in little endian byte order + (which they are not on big endian systems) + [This patch] seems the right solution for all of these issues. + +Dimitry Andric wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00132.html : + It's even needed for glibc CVS, AFAICS. + The patch hunk which modifies glibc.new/sysdeps/arm/bits/endian.h + (currently at version 1.4) is only needed for proper VFP operation. + But the hunk which modifies sysdeps/arm/gmp-mparam.h, and the hunk + that deletes sysdeps/arm/ieee754.h (yes, this IS correct), are needed + for proper operation of *any* FP model on big endian ARM. + +See also discussion in followups to +http://sources.redhat.com/ml/crossgcc/2004-05/msg00245.html) + +Message-ID: <276985760.37584@eyou.com> +Received: from unknown (HELO eyou.com) (172.16.2.2) + by 0.0.0.0 with SMTP; Tue, 17 Feb 2004 10:42:40 +0800 +Received: (qmail 8238 invoked by uid 65534); 17 Feb 2004 10:42:38 +0800 +Date: 17 Feb 2004 10:42:38 +0800 +Message-ID: <20040217104238.8237.qmail@eyou.com> +From: "add" <addsub@eyou.com> +To: dank@kegel.com +Reply-To: "add" <addsub@eyou.com> +Subject: Re: problem while building arm vfp softfloat gcc ` + +Hi, Dan, This is a patch I applied to my glibc-2.3.2, then my softfloat +toolchain can printf("%f\n",1.0). So you may have a try of this + + +diff -uNrp glibc.old/sysdeps/arm/bits/endian.h glibc.new/sysdeps/arm/bits/endian.h +--- glibc.old/sysdeps/arm/bits/endian.h 1999-04-12 11:59:13.000000000 -0400 ++++ glibc.new/sysdeps/arm/bits/endian.h 2004-02-12 09:15:13.000000000 -0500 +@@ -9,4 +9,9 @@ + #else + #define __BYTE_ORDER __LITTLE_ENDIAN + #endif ++ ++#ifdef __VFP_FP__ ++#define __FLOAT_WORD_ORDER __BYTE_ORDER ++#else + #define __FLOAT_WORD_ORDER __BIG_ENDIAN ++#endif +diff -uNrp glibc.old/sysdeps/arm/gmp-mparam.h glibc.new/sysdeps/arm/gmp-mparam.h +--- glibc.old/sysdeps/arm/gmp-mparam.h 2001-07-07 15:21:19.000000000 -0400 ++++ glibc.new/sysdeps/arm/gmp-mparam.h 2004-02-12 09:15:13.000000000 -0500 +@@ -26,5 +26,13 @@ MA 02111-1307, USA. */ + #define BITS_PER_SHORTINT 16 + #define BITS_PER_CHAR 8 + +-#define IEEE_DOUBLE_BIG_ENDIAN 0 +-#define IEEE_DOUBLE_MIXED_ENDIAN 1 ++#if defined(__ARMEB__) ++# define IEEE_DOUBLE_MIXED_ENDIAN 0 ++# define IEEE_DOUBLE_BIG_ENDIAN 1 ++#elif defined(__VFP_FP__) ++# define IEEE_DOUBLE_MIXED_ENDIAN 0 ++# define IEEE_DOUBLE_BIG_ENDIAN 0 ++#else ++# define IEEE_DOUBLE_BIG_ENDIAN 0 ++# define IEEE_DOUBLE_MIXED_ENDIAN 1 ++#endif +diff -uNrp glibc.old/sysdeps/arm/ieee754.h glibc.new/sysdeps/arm/ieee754.h +--- glibc.old/sysdeps/arm/ieee754.h 2001-07-07 15:21:19.000000000 -0400 ++++ glibc.new/sysdeps/arm/ieee754.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,115 +0,0 @@ +-/* Copyright (C) 1992, 1995, 1996, 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 _IEEE754_H +- +-#define _IEEE754_H 1 +-#include <features.h> +- +-#include <endian.h> +- +-__BEGIN_DECLS +- +-union ieee754_float +- { +- float f; +- +- /* This is the IEEE 754 single-precision format. */ +- struct +- { +- unsigned int mantissa:23; +- unsigned int exponent:8; +- unsigned int negative:1; +- } ieee; +- +- /* This format makes it easier to see if a NaN is a signalling NaN. */ +- struct +- { +- unsigned int mantissa:22; +- unsigned int quiet_nan:1; +- unsigned int exponent:8; +- unsigned int negative:1; +- } ieee_nan; +- }; +- +-#define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */ +- +- +-union ieee754_double +- { +- double d; +- +- /* This is the IEEE 754 double-precision format. */ +- struct +- { +- unsigned int mantissa0:20; +- unsigned int exponent:11; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- } ieee; +- +- /* This format makes it easier to see if a NaN is a signalling NaN. */ +- struct +- { +- unsigned int mantissa0:19; +- unsigned int quiet_nan:1; +- unsigned int exponent:11; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- } ieee_nan; +- }; +- +-#define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ +- +- +-/* The following two structures are correct for `new' floating point systems but +- wrong for the old FPPC. The only solution seems to be to avoid their use on +- old hardware. */ +- +-union ieee854_long_double +- { +- long double d; +- +- /* This is the IEEE 854 double-extended-precision format. */ +- struct +- { +- unsigned int exponent:15; +- unsigned int empty:16; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- unsigned int mantissa0:32; +- } ieee; +- +- /* This is for NaNs in the IEEE 854 double-extended-precision format. */ +- struct +- { +- unsigned int exponent:15; +- unsigned int empty:16; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- unsigned int mantissa0:30; +- unsigned int quiet_nan:1; +- unsigned int one:1; +- } ieee_nan; +- }; +- +-#define IEEE854_LONG_DOUBLE_BIAS 0x3fff +- +-__END_DECLS +- +-#endif /* ieee754.h */ diff --git a/patches/glibc/2.3.4/arm-ctl_bus_isa.patch b/patches/glibc/2.3.4/arm-ctl_bus_isa.patch new file mode 100644 index 00000000..3422070b --- /dev/null +++ b/patches/glibc/2.3.4/arm-ctl_bus_isa.patch @@ -0,0 +1,51 @@ +Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004. +Needed to build glibc with linux kernels 2.4.23 or higher on ARM, +Fixes following error: + +../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys': +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]') +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]') +make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1 + +cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA", http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html + +--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old 2003-02-20 14:22:24.000000000 -0800 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c 2004-01-31 16:01:50.000000000 -0800 +@@ -47,6 +47,12 @@ + #include <asm/page.h> + #include <sys/sysctl.h> + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include <linux/version.h> ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23)) ++#define CTL_BUS_ISA BUS_ISA /* and hope it's not the one from linux/input.h */ ++#endif ++ + #define PATH_ARM_SYSTYPE "/etc/arm_systype" + #define PATH_CPUINFO "/proc/cpuinfo" + +@@ -80,7 +86,7 @@ + * Initialize I/O system. There are several ways to get the information + * we need. Each is tried in turn until one succeeds. + * +- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*). This is the preferred method ++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*). This is the preferred method + * but not all kernels support it. + * + * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE. +@@ -100,8 +106,8 @@ + { + char systype[256]; + int i, n; +- static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE }; +- static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT }; ++ static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE }; ++ static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT }; + size_t len = sizeof(io.base); + + if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0) diff --git a/patches/glibc/2.3.4/bad/glibc-2.3.4-cygwin.patch b/patches/glibc/2.3.4/bad/glibc-2.3.4-cygwin.patch new file mode 100644 index 00000000..23ebc829 --- /dev/null +++ b/patches/glibc/2.3.4/bad/glibc-2.3.4-cygwin.patch @@ -0,0 +1,96 @@ +Fixes +elf/librtld.os: In function `process_envvars': : undefined reference to `__access' +... +when building glibc-2.3.3 on cygwin + +Idea from +http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch +Basically, make glibc use .oST as suffix for 'object static' +instead of .oS, since cygwin has trouble distinguishing .os from .oS +(Original patch had .on, but .oST is more mnemonic for 'object static') + +glibc-linuxthreads-2.3.3 also requires a patch, see +../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch + +[ Rediffed against glibc-2.3.3 ] + + +diff -urN glibc-2.3.4-orig/Makeconfig glibc-2.3.4/Makeconfig +--- glibc-2.3.4-orig/Makeconfig 2004-12-15 19:51:47.000000000 +0100 ++++ glibc-2.3.4/Makeconfig 2005-03-13 18:54:58.000000000 +0100 +@@ -449,7 +449,7 @@ + # run the linked programs. + link-libc = -Wl,-rpath-link=$(rpath-link) \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib) ++ $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib) + # This is how to find at build-time things that will be installed there. + rpath-dirs = math elf dlfcn nss nis rt resolv crypt + endif +@@ -667,7 +667,7 @@ + # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX}) + # to pass different flags for each flavor. + libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o)) +-all-object-suffixes := .o .os .op .og .ob .oS ++all-object-suffixes := .o .os .op .og .ob .oST + object-suffixes := + CPPFLAGS-.o = $(pic-default) + CFLAGS-.o = $(filter %frame-pointer,$(+cflags)) +@@ -723,14 +723,14 @@ + + ifeq (yes,$(build-shared)) + # Build special library that contains the static-only routines for libc. +-object-suffixes-for-libc += .oS ++object-suffixes-for-libc += .oST + + # Must build the routines as PIC, though, because they can end up in (users') + # shared objects. We don't want to use CFLAGS-os because users may, for + # example, make that processor-specific. +-CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag) +-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1 +-libtype.oS = lib%_nonshared.a ++CFLAGS-.oST = $(CFLAGS-.o) $(pic-ccflag) ++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1 ++libtype.oST = lib%_nonshared.a + endif + + # The assembler can generate debug information too. +diff -urN glibc-2.3.4-orig/Makerules glibc-2.3.4/Makerules +--- glibc-2.3.4-orig/Makerules 2004-12-15 19:52:39.000000000 +0100 ++++ glibc-2.3.4/Makerules 2005-03-13 18:50:09.000000000 +0100 +@@ -416,7 +416,7 @@ + # Bounded pointer thunks are only built for *.ob + elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks)) + +-elide-routines.oS += $(filter-out $(static-only-routines),\ ++elide-routines.oST += $(filter-out $(static-only-routines),\ + $(routines) $(aux) $(sysdep_routines)) \ + $(elide-bp-thunks) + elide-routines.os += $(static-only-routines) $(elide-bp-thunks) +@@ -961,7 +961,7 @@ + install: $(inst_libdir)/libc.so + $(inst_libdir)/libc.so: $(common-objpfx)format.lds \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)$(libc-name)) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -969,7 +969,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\ + ')' \ + ) > $@.new + mv -f $@.new $@ +diff -urN glibc-2.3.4-orig/sysdeps/sparc/sparc32/sparcv9/Makefile glibc-2.3.4/sysdeps/sparc/sparc32/sparcv9/Makefile +--- glibc-2.3.4-orig/sysdeps/sparc/sparc32/sparcv9/Makefile 2004-08-16 08:46:14.000000000 +0200 ++++ glibc-2.3.4/sysdeps/sparc/sparc32/sparcv9/Makefile 2005-03-13 18:50:09.000000000 +0100 +@@ -10,4 +10,4 @@ + ASFLAGS-.op += -Wa,-Av9a + ASFLAGS-.og += -Wa,-Av9a + ASFLAGS-.ob += -Wa,-Av9a +-ASFLAGS-.oS += -Wa,-Av9a ++ASFLAGS-.oST += -Wa,-Av9a diff --git a/patches/glibc/2.3.4/fix-pr398.patch b/patches/glibc/2.3.4/fix-pr398.patch new file mode 100644 index 00000000..d5d03091 --- /dev/null +++ b/patches/glibc/2.3.4/fix-pr398.patch @@ -0,0 +1,70 @@ +Fixes error + +dl-runtime.c:222: error: parse error before "CFI_STARTPROC" +make[2]: *** [crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/elf/dl-runtim +e.o] Error 1 +make[2]: Leaving directory `crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040 +822/elf' +make[1]: *** [elf/subdir_lib] Error 2 +make[1]: Leaving directory `crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040 +822' +make: *** [all] Error 2 + +----------------- + +See http://sources.redhat.com/bugzilla/show_bug.cgi?id=398 +http://sources.redhat.com/ml/libc-alpha/2004-07/msg00023.html + +----------------- + +CVSROOT: /cvs/glibc +Module name: libc +Branch: glibc-2_3-branch +Changes by: roland@sources.redhat.com 2006-02-23 22:36:51 + +Modified files: + sysdeps/s390/s390-64: dl-machine.h + sysdeps/s390/s390-32: dl-machine.h + +Log message: + 2004-07-10 GOTO Masanori <gotom@debian.or.jp> + + [BZ #398] + * sysdeps/s390/s390-32/dl-machine.h: Include <sysdep.h> for CFI + directive. + * sysdeps/s390/s390-64/dl-machine.h: Likewise. + +Patches: +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/s390/s390-64/dl-machine.h.diff?cvsroot=glibc&only_with_tag=glibc-2_3-branch&r1=1.19.4.1&r2=1.19.4.2 +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/s390/s390-32/dl-machine.h.diff?cvsroot=glibc&only_with_tag=glibc-2_3-branch&r1=1.20.4.1&r2=1.20.4.2 + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/s390/s390-64/dl-machine.h,v +retrieving revision 1.19.4.1 +retrieving revision 1.19.4.2 +diff -u -r1.19.4.1 -r1.19.4.2 +--- libc/sysdeps/s390/s390-64/dl-machine.h 2005/10/17 04:57:27 1.19.4.1 ++++ libc/sysdeps/s390/s390-64/dl-machine.h 2006/02/23 22:36:51 1.19.4.2 +@@ -27,6 +27,7 @@ + #include <sys/param.h> + #include <string.h> + #include <link.h> ++#include <sysdep.h> + + /* This is an older, now obsolete value. */ + #define EM_S390_OLD 0xA390 +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/s390/s390-32/dl-machine.h,v +retrieving revision 1.20.4.1 +retrieving revision 1.20.4.2 +diff -u -r1.20.4.1 -r1.20.4.2 +--- libc/sysdeps/s390/s390-32/dl-machine.h 2005/10/17 04:57:27 1.20.4.1 ++++ libc/sysdeps/s390/s390-32/dl-machine.h 2006/02/23 22:36:51 1.20.4.2 +@@ -27,6 +27,7 @@ + #include <sys/param.h> + #include <string.h> + #include <link.h> ++#include <sysdep.h> + + /* This is an older, now obsolete value. */ + #define EM_S390_OLD 0xA390 diff --git a/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-arm.patch b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-arm.patch new file mode 100644 index 00000000..f3ad0c61 --- /dev/null +++ b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-arm.patch @@ -0,0 +1,117 @@ +Fixes +In file included from dynamic-link.h:22, + from dl-reloc.c:265: +../sysdeps/arm/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/arm/dl-machine.h:371: error: invalid storage class for function 'fix_bad_pc24' +../sysdeps/arm/dl-machine.h:406: error: invalid storage class for function 'elf_machine_rel' +../sysdeps/arm/dl-machine.h:532: error: invalid storage class for function 'elf_machine_rela' +../sysdeps/arm/dl-machine.h:612: error: invalid storage class for function 'elf_machine_rel_relative' +../sysdeps/arm/dl-machine.h:621: error: invalid storage class for function 'elf_machine_rela_relative' +../sysdeps/arm/dl-machine.h:630: error: invalid storage class for function 'elf_machine_lazy_rel' +make[2]: Leaving directory `/home/dank/queue/jobdir.k8/crosstool-dev/build/arm-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/glibc-2.3.3/elf' + +when building glibc-2.3.[34] with gcc-4.0 + +Like +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/arm/dl-machine.h.diff?r1=1.51&r2=1.52&cvsroot=glibc +but works with older compilers, and fixes fix_bad_pc24. + + +--- glibc-2.3.4/sysdeps/arm/dl-machine.h.old Sun Mar 20 17:54:37 2005 ++++ glibc-2.3.4/sysdeps/arm/dl-machine.h Sun Mar 20 17:57:32 2005 +@@ -359,7 +359,14 @@ + # endif + + /* Deal with an out-of-range PC24 reloc. */ +-static Elf32_Addr ++#if __GNUC__ >= 4 ++ auto inline Elf32_Addr ++#else ++ static inline Elf32_Addr ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + fix_bad_pc24 (Elf32_Addr *const reloc_addr, Elf32_Addr value) + { + static void *fix_page; +@@ -392,7 +399,14 @@ + /* Perform the relocation specified by RELOC and SYM (which is fully resolved). + MAP is the object containing the reloc. */ + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, + const Elf32_Sym *sym, const struct r_found_version *version, + void *const reloc_addr_arg) +@@ -517,7 +531,14 @@ + } + + # ifndef RTLD_BOOTSTRAP +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, + const Elf32_Sym *sym, const struct r_found_version *version, + void *const reloc_addr_arg) +@@ -597,7 +618,14 @@ + } + # endif + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc, + void *const reloc_addr_arg) + { +@@ -606,7 +634,14 @@ + } + + # ifndef RTLD_BOOTSTRAP +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc, + void *const reloc_addr_arg) + { +@@ -615,7 +650,14 @@ + } + # endif + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_lazy_rel (struct link_map *map, + Elf32_Addr l_addr, const Elf32_Rel *reloc) + { diff --git a/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-elf.patch b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-elf.patch new file mode 100644 index 00000000..3bbe6ea8 --- /dev/null +++ b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-elf.patch @@ -0,0 +1,61 @@ +From http://www.mail-archive.com/pld-cvs-commit@pld-linux.org/msg00229.html +Fixes + rtld.c: In function '_dl_start': + dynamic-link.h:47: error: nested function 'elf_machine_rela_relative' declared but never defined + dynamic-link.h:41: error: nested function 'elf_machine_rela' declared but never defined +when compiling glibc-2.3.4 with gcc-4.0 + +But see also +http://sources.redhat.com/ml/libc-hacker/2005-02/msg00000.html +and +http://sources.redhat.com/ml/libc-hacker/2005-03/msg00008.html +which seem to propose less radical fixes? + +Aha. See also http://sources.redhat.com/bugzilla/show_bug.cgi?id=721 + +--- glibc-2.3-20050307/elf/dynamic-link.h.old 2005-03-12 18:12:37.000000000 -0800 ++++ glibc-2.3-20050307/elf/dynamic-link.h 2005-03-12 18:12:59.777820848 -0800 +@@ -19,43 +19,6 @@ + + #include <elf.h> + #include <assert.h> +- +-#ifdef RESOLVE +-/* We pass reloc_addr as a pointer to void, as opposed to a pointer to +- ElfW(Addr), because not all architectures can assume that the +- relocated address is properly aligned, whereas the compiler is +- entitled to assume that a pointer to a type is properly aligned for +- the type. Even if we cast the pointer back to some other type with +- less strict alignment requirements, the compiler might still +- remember that the pointer was originally more aligned, thereby +- optimizing away alignment tests or using word instructions for +- copying memory, breaking the very code written to handle the +- unaligned cases. */ +-auto void __attribute__((always_inline)) +-elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc, +- const ElfW(Sym) *sym, const struct r_found_version *version, +- void *const reloc_addr); +-auto void __attribute__((always_inline)) +-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc, +- const ElfW(Sym) *sym, const struct r_found_version *version, +- void *const reloc_addr); +-auto void __attribute__((always_inline)) +-elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc, +- void *const reloc_addr); +-auto void __attribute__((always_inline)) +-elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc, +- void *const reloc_addr); +-# if ELF_MACHINE_NO_RELA || defined ELF_MACHINE_PLT_REL +-auto void __attribute__((always_inline)) +-elf_machine_lazy_rel (struct link_map *map, +- ElfW(Addr) l_addr, const ElfW(Rel) *reloc); +-# else +-auto void __attribute__((always_inline)) +-elf_machine_lazy_rel (struct link_map *map, +- ElfW(Addr) l_addr, const ElfW(Rela) *reloc); +-# endif +-#endif +- + #include <dl-machine.h> + + #ifndef VERSYMIDX diff --git a/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-iconvdata.patch b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-iconvdata.patch new file mode 100644 index 00000000..42be8a38 --- /dev/null +++ b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-iconvdata.patch @@ -0,0 +1,44 @@ +See http://sources.redhat.com/ml/libc-hacker/2005-02/msg00000.html +and http://www.mail-archive.com/pld-cvs-commit@pld-linux.org/msg00229.html + +Fixes + In file included from jis0208.c:23: + jis0208.h:32: error: array type has incomplete element type +when building glibc with gcc-4.0 +The bug has been present since at least glibc-2.2.5. +This patch applies cleanly to glibc-2.3.4 + +--- /home/dank/downloads/glibc-2.3-20050307/iconvdata/jis0208.h 2003-06-11 14:40:42.000000000 -0700 ++++ glibc-2.3-20050307/iconvdata/jis0208.h 2005-03-13 20:55:01.784054760 -0800 +@@ -24,15 +24,6 @@ + #include <gconv.h> + #include <stdint.h> + +-/* Conversion table. */ +-extern const uint16_t __jis0208_to_ucs[]; +- +-extern const char __jisx0208_from_ucs4_lat1[256][2]; +-extern const char __jisx0208_from_ucs4_greek[0xc1][2]; +-extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[]; +-extern const char __jisx0208_from_ucs_tab[][2]; +- +- + /* Struct for table with indeces in UCS mapping table. */ + struct jisx0208_ucs_idx + { +@@ -42,6 +33,15 @@ + }; + + ++/* Conversion table. */ ++extern const uint16_t __jis0208_to_ucs[]; ++ ++extern const char __jisx0208_from_ucs4_lat1[256][2]; ++extern const char __jisx0208_from_ucs4_greek[0xc1][2]; ++extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[]; ++extern const char __jisx0208_from_ucs_tab[][2]; ++ ++ + static inline uint32_t + __attribute ((always_inline)) + jisx0208_to_ucs4 (const unsigned char **s, size_t avail, unsigned char offset) diff --git a/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc-procfs.patch b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc-procfs.patch new file mode 100644 index 00000000..d5d82934 --- /dev/null +++ b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc-procfs.patch @@ -0,0 +1,62 @@ +First discussed here: +http://gcc.gnu.org/ml/gcc/2005-01/msg00509.html + +Revision 1.12, Wed Mar 2 20:11:38 2005 UTC by roland +Branch: MAIN +CVS Tags: fedora-glibc-20050303T1335, HEAD +Changes since 1.11: +3 -8 lines +Diff to previous 1.11 (colored) + +2005-02-21 Alan Modra <amodra@bigpond.net.au> + + * sysdeps/unix/sysv/linux/powerpc/sys/procfs.h (elf_vrreg_t): Don't + use __uint128_t. + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h?cvsroot=glibc +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h.diff?r1=1.11&r2=1.12&cvsroot=glibc + +Fixes + +In file included from ../linuxthreads_db/proc_service.h:20, + from ../linuxthreads_db/thread_dbP.h:7, + from ../linuxthreads/descr.h:44, + from ../linuxthreads/internals.h:30, + from ../linuxthreads/sysdeps/pthread/bits/libc-lock.h:27, + from ../sysdeps/generic/ldsodefs.h:38, + from ../sysdeps/unix/sysv/linux/ldsodefs.h:25, + from <stdin>:2: +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: error: syntax error before 'elf_vrreg_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: type defaults to 'int' in declaration of 'elf_vrreg_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: data definition has no type or storage class +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: error: syntax error before 'elf_vrregset_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: type defaults to 'int' in declaration of 'elf_vrregset_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: data definition has no type or storage class +make[2]: make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/csu' + + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h,v +retrieving revision 1.11 +retrieving revision 1.12 +diff -u -r1.11 -r1.12 +--- libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h 2003/12/17 23:09:34 1.11 ++++ libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h 2005/03/02 20:11:38 1.12 +@@ -46,15 +46,10 @@ + typedef double elf_fpreg_t; + typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; + +-/* gcc 3.1 and newer support __uint128_t. */ +-#if !__GNUC_PREREQ(3,1) +-typedef struct { +- unsigned long u[4]; +-} __attribute((aligned(16))) __uint128_t; +-#endif +- + /* Altivec registers */ +-typedef __uint128_t elf_vrreg_t; ++typedef struct { ++ unsigned int u[4]; ++} __attribute__ ((aligned (16))) elf_vrreg_t; + typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG]; + #endif + diff --git a/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch new file mode 100644 index 00000000..949a203e --- /dev/null +++ b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch @@ -0,0 +1,42 @@ +Fixes + +../sysdeps/powerpc/powerpc32/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/powerpc/powerpc32/dl-machine.h:461: error: invalid storage class for function 'elf_machine_rela_relative' +../sysdeps/powerpc/powerpc32/dl-machine.h:469: error: invalid storage class for function 'elf_machine_lazy_rel' +make[2]: *** [/home/dank/queue/jobdir.dual2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/build-glibc/elf/dl-reloc.o] Error 1 + +diff -ur glibc-2.3-20050307.orig/sysdeps/powerpc/powerpc32/dl-machine.h glibc-2.3-20050307/sysdeps/powerpc/powerpc32/dl-machine.h +--- glibc-2.3-20050307.orig/sysdeps/powerpc/powerpc32/dl-machine.h Wed Jul 30 23:33:52 2003 ++++ glibc-2.3-20050307/sysdeps/powerpc/powerpc32/dl-machine.h Thu Mar 17 13:19:16 2005 +@@ -455,7 +455,14 @@ + } + } + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc, + void *const reloc_addr_arg) + { +@@ -463,7 +470,14 @@ + *reloc_addr = l_addr + reloc->r_addend; + } + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_lazy_rel (struct link_map *map, + Elf32_Addr l_addr, const Elf32_Rela *reloc) + { diff --git a/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch new file mode 100644 index 00000000..6844a9cd --- /dev/null +++ b/patches/glibc/2.3.4/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch @@ -0,0 +1,60 @@ +Fixes: + +In file included from dynamic-link.h:22, + from dl-reloc.c:269: +../sysdeps/powerpc/powerpc64/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/powerpc/powerpc64/dl-machine.h:573: error: invalid storage class for function 'elf_machine_rela_relative' +../sysdeps/powerpc/powerpc64/dl-machine.h:607: error: invalid storage class for function 'elf_machine_rela' +../sysdeps/powerpc/powerpc64/dl-machine.h:889: error: invalid storage class for function 'elf_machine_lazy_rel' +make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc64-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/elf' + +--- glibc-2.3-20050307/sysdeps/powerpc/powerpc64/dl-machine.h.old Thu Mar 17 13:35:23 2005 ++++ glibc-2.3-20050307/sysdeps/powerpc/powerpc64/dl-machine.h Thu Mar 17 13:37:12 2005 +@@ -567,7 +567,14 @@ + const Elf64_Sym *refsym) + attribute_hidden; + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc, + void *const reloc_addr_arg) + { +@@ -598,7 +605,14 @@ + + /* Perform the relocation specified by RELOC and SYM (which is fully + resolved). MAP is the object containing the reloc. */ +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela (struct link_map *map, + const Elf64_Rela *reloc, + const Elf64_Sym *sym, +@@ -883,7 +897,14 @@ + MODIFIED_CODE_NOQUEUE (reloc_addr); + } + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_lazy_rel (struct link_map *map, + Elf64_Addr l_addr, const Elf64_Rela *reloc) + { diff --git a/patches/glibc/2.3.4/glibc-2.3.4-cygwin.patch b/patches/glibc/2.3.4/glibc-2.3.4-cygwin.patch new file mode 100644 index 00000000..ac72f53a --- /dev/null +++ b/patches/glibc/2.3.4/glibc-2.3.4-cygwin.patch @@ -0,0 +1,166 @@ +Fixes +elf/librtld.os: In function `process_envvars': : undefined reference to `__access' +... +when building glibc-2.3.4 on cygwin + +Idea from +http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch +Basically, make glibc use .oST as suffix for 'object static' +instead of .oS, since cygwin has trouble distinguishing .os from .oS +(Original patch had .on, but .oST is more mnemonic for 'object static') + +glibc-linuxthreads-2.3.4 also requires a patch, see +../glibc-linuxthreads-2.3.4/glibc-linuxthreads-2.3.4-cygwin.patch + +[ Ported to glibc-2.3.4 by steve@digidescorp.com ] + +--- glibc-2.3.4/Makeconfig.orig 2004-12-15 12:51:47.000000000 -0600 ++++ glibc-2.3.4/Makeconfig 2005-06-29 00:31:27.000000000 -0500 +@@ -449,7 +449,7 @@ + # run the linked programs. + link-libc = -Wl,-rpath-link=$(rpath-link) \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib) ++ $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib) + # This is how to find at build-time things that will be installed there. + rpath-dirs = math elf dlfcn nss nis rt resolv crypt + endif +@@ -667,7 +667,7 @@ + # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX}) + # to pass different flags for each flavor. + libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o)) +-all-object-suffixes := .o .os .op .og .ob .oS ++all-object-suffixes := .o .os .op .og .ob .oST + object-suffixes := + CPPFLAGS-.o = $(pic-default) + CFLAGS-.o = $(filter %frame-pointer,$(+cflags)) +@@ -723,14 +723,14 @@ + + ifeq (yes,$(build-shared)) + # Build special library that contains the static-only routines for libc. +-object-suffixes-for-libc += .oS ++object-suffixes-for-libc += .oST + + # Must build the routines as PIC, though, because they can end up in (users') + # shared objects. We don't want to use CFLAGS-os because users may, for + # example, make that processor-specific. +-CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag) +-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1 +-libtype.oS = lib%_nonshared.a ++CFLAGS-.oST = $(CFLAGS-.o) $(pic-ccflag) ++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1 ++libtype.oST = lib%_nonshared.a + endif + + # The assembler can generate debug information too. +--- glibc-2.3.4/Makerules.orig 2005-06-28 20:57:52.562500000 -0500 ++++ glibc-2.3.4/Makerules 2005-06-29 00:27:21.328125000 -0500 +@@ -416,7 +416,7 @@ + # Bounded pointer thunks are only built for *.ob + elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks)) + +-elide-routines.oS += $(filter-out $(static-only-routines),\ ++elide-routines.oST += $(filter-out $(static-only-routines),\ + $(routines) $(aux) $(sysdep_routines)) \ + $(elide-bp-thunks) + elide-routines.os += $(static-only-routines) $(elide-bp-thunks) +@@ -968,7 +968,7 @@ + install: $(inst_libdir)/libc.so + $(inst_libdir)/libc.so: $(common-objpfx)format.lds \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)$(libc-name)) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -976,7 +976,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\ + ')' \ + ) > $@.new + mv -f $@.new $@ +diff -aur glibc-2.3.5/extra-lib.mk glibc-2.3.5-cygwin/extra-lib.mk +--- glibc-2.3.5/extra-lib.mk 2004-12-02 23:54:47.000000000 +0100 ++++ glibc-2.3.5-cygwin/extra-lib.mk 2005-05-11 08:27:28.156250000 +0200 +@@ -13,7 +13,7 @@ + + ifneq (,$($(lib)-static-only-routines)) + ifneq (,$(filter yesyes%,$(build-shared)$(elf)$($(lib).so-version))) +-object-suffixes-$(lib) += $(filter-out $($(lib)-inhibit-o),.oS) ++object-suffixes-$(lib) += $(filter-out $($(lib)-inhibit-o),.oST) + endif + endif + +@@ -29,7 +29,7 @@ + + # Add each flavor of library to the lists of things to build and install. + install-lib += $(foreach o,$(object-suffixes-$(lib)),$(lib:lib%=$(libtype$o))) +-extra-objs += $(foreach o,$(filter-out .os .oS,$(object-suffixes-$(lib))),\ ++extra-objs += $(foreach o,$(filter-out .os .oST,$(object-suffixes-$(lib))),\ + $(patsubst %,%$o,$(filter-out \ + $($(lib)-shared-only-routines),\ + $(all-$(lib)-routines)))) +@@ -57,7 +57,7 @@ + + + # Use o-iterator.mk to generate a rule for each flavor of library. +-ifneq (,$(filter-out .os .oS,$(object-suffixes-$(lib)))) ++ifneq (,$(filter-out .os .oST,$(object-suffixes-$(lib)))) + define o-iterator-doit + $(objpfx)$(patsubst %,$(libtype$o),$(lib:lib%=%)): \ + $(patsubst %,$(objpfx)%$o,\ +@@ -65,7 +65,7 @@ + $(all-$(lib)-routines))); \ + $$(build-extra-lib) + endef +-object-suffixes-left = $(filter-out .os .oS,$(object-suffixes-$(lib))) ++object-suffixes-left = $(filter-out .os .oST,$(object-suffixes-$(lib))) + include $(patsubst %,$(..)o-iterator.mk,$(object-suffixes-left)) + endif + +@@ -77,9 +77,9 @@ + $(build-extra-lib) + endif + +-ifneq (,$(filter .oS,$(object-suffixes-$(lib)))) +-$(objpfx)$(patsubst %,$(libtype.oS),$(lib:lib%=%)): \ +- $(patsubst %,$(objpfx)%.oS,\ ++ifneq (,$(filter .oST,$(object-suffixes-$(lib)))) ++$(objpfx)$(patsubst %,$(libtype.oST),$(lib:lib%=%)): \ ++ $(patsubst %,$(objpfx)%.oST,\ + $(filter $($(lib)-static-only-routines),\ + $(all-$(lib)-routines))) + $(build-extra-lib) +diff -aur glibc-2.3.5/nptl/Makefile glibc-2.3.5-cygwin/nptl/Makefile +--- glibc-2.3.5/nptl/Makefile 2005-02-16 09:45:56.000000000 +0100 ++++ glibc-2.3.5-cygwin/nptl/Makefile 2005-05-11 08:26:01.812500000 +0200 +@@ -360,7 +360,7 @@ + + $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \ + $(objpfx)libpthread.so$(libpthread.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)pthread) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -368,7 +368,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\ + ')' \ + ) > $@.new + mv -f $@.new $@ +diff -aur glibc-2.3.5/sysdeps/sparc/sparc32/sparcv9/Makefile glibc-2.3.5-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile +--- glibc-2.3.5/sysdeps/sparc/sparc32/sparcv9/Makefile 2004-08-16 08:46:14.000000000 +0200 ++++ glibc-2.3.5-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile 2005-05-11 08:26:25.937500000 +0200 +@@ -10,4 +10,4 @@ + ASFLAGS-.op += -Wa,-Av9a + ASFLAGS-.og += -Wa,-Av9a + ASFLAGS-.ob += -Wa,-Av9a +-ASFLAGS-.oS += -Wa,-Av9a ++ASFLAGS-.oST += -Wa,-Av9a diff --git a/patches/glibc/2.3.4/glibc-2.3.4-memcmp.patch b/patches/glibc/2.3.4/glibc-2.3.4-memcmp.patch new file mode 100644 index 00000000..c01faf83 --- /dev/null +++ b/patches/glibc/2.3.4/glibc-2.3.4-memcmp.patch @@ -0,0 +1,46 @@ +Fixes + ../sysdeps/i386/i686/memcmp.S: Assembler messages: + ../sysdeps/i386/i686/memcmp.S:390: Error: can't resolve `.rodata' {.rodata section} - `memcmp' {.text section} +when building on macosx. + +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/i686/memcmp.S?cvsroot=glibc +Revision 1.4, Thu Apr 28 18:19:25 2005 UTC by drepper +Branch: MAIN +CVS Tags: fedora-glibc-20050503T0852 +Changes since 1.3: +2 -2 lines +Diff to previous 1.3 (colored) + +Move misplaced END. + +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/i686/memcmp.S.diff?r1=1.3&r2=1.4&cvsroot=glibc + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/i386/i686/memcmp.S,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/sysdeps/i386/i686/memcmp.S 2004/04/01 23:28:37 1.3 ++++ libc/sysdeps/i386/i686/memcmp.S 2005/04/28 18:19:25 1.4 +@@ -1,5 +1,5 @@ + /* Compare two memory blocks for differences in the first COUNT bytes. +- Copyright (C) 2004 Free Software Foundation, Inc. ++ Copyright (C) 2004, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -350,6 +350,7 @@ + sbbl $-1, %eax + popl %esi + RETURN ++END (BP_SYM (memcmp)) + + .section .rodata + ALIGN (2) +@@ -387,7 +388,6 @@ + .long L(30bytes) - . + 0x78 + .long L(31bytes) - . + 0x7c + +-END (BP_SYM (memcmp)) + + #undef bcmp + weak_alias (BP_SYM (memcmp), BP_SYM (bcmp)) diff --git a/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-string.patch b/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-string.patch new file mode 100644 index 00000000..7e2fdc8e --- /dev/null +++ b/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-string.patch @@ -0,0 +1,83 @@ + +Fixes? the following error when building with gcc-4.0.0: + +../string/strcoll.c:39: error: '__EI_strcoll' aliased to undefined symbol '__GI_strcoll' +make[2]: *** [/home/dank/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/wcsmbs/wcscoll.os] Error 1 +make[2]: Leaving directory `/home/dank/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/glibc-2.3.4/wcsmbs' + + +Thu Mar 17 21:06:24 2005 UTC (3 weeks, 5 days ago) by roland +Branch: MAIN +CVS Tags: fedora-glibc-20050405T2114, fedora-glibc-20050401T1444, fedora-glibc-20050324T0715, fedora-glibc-20050319T1907, HEAD + +2005-03-16 Richard Henderson <rth@redhat.com> + + * include/wchar.h (__wcscoll): Remove. + * wcsmbs/wcscoll.c: Define wcscoll directly instead of via __wcscoll. + * string/strcoll.c: Don't issue libc_hidden_def STRCOLL redefined. + +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/string/strcoll.c.diff?r1=1.33&r2=1.34&cvsroot=glibc +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/include/wchar.h.diff?r1=1.26&r2=1.27&cvsroot=glibc +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/wcsmbs/wcscoll.c.diff?r1=1.13&r2=1.14&cvsroot=glibc + +=================================================================== +RCS file: /cvs/glibc/libc/string/strcoll.c,v +retrieving revision 1.33 +retrieving revision 1.34 +diff -u -r1.33 -r1.34 +--- libc/string/strcoll.c 2004/03/14 20:51:30 1.33 ++++ libc/string/strcoll.c 2005/03/17 21:06:24 1.34 +@@ -23,6 +23,7 @@ + # define STRING_TYPE char + # define STRCOLL strcoll + # define STRCOLL_L __strcoll_l ++# define USE_HIDDEN_DEF + #endif + + #include "../locale/localeinfo.h" +@@ -35,6 +36,7 @@ + { + return STRCOLL_L (s1, s2, _NL_CURRENT_LOCALE); + } +-#if !defined WIDE_CHAR_VERSION +-libc_hidden_def (strcoll) ++ ++#ifdef USE_HIDDEN_DEF ++libc_hidden_def (STRCOLL) + #endif +=================================================================== +RCS file: /cvs/glibc/libc/include/wchar.h,v +retrieving revision 1.26 +retrieving revision 1.27 +diff -u -r1.26 -r1.27 +--- libc/include/wchar.h 2004/03/14 20:45:10 1.26 ++++ libc/include/wchar.h 2005/03/17 21:06:24 1.27 +@@ -56,7 +56,6 @@ + extern int __wcsncasecmp (__const wchar_t *__s1, __const wchar_t *__s2, + size_t __n) + __attribute_pure__; +-extern int __wcscoll (__const wchar_t *__s1, __const wchar_t *__s2); + extern size_t __wcslen (__const wchar_t *__s) __attribute_pure__; + extern size_t __wcsnlen (__const wchar_t *__s, size_t __maxlen) + __attribute_pure__; +=================================================================== +RCS file: /cvs/glibc/libc/wcsmbs/wcscoll.c,v +retrieving revision 1.13 +retrieving revision 1.14 +diff -u -r1.13 -r1.14 +--- libc/wcsmbs/wcscoll.c 2004/03/14 21:05:48 1.13 ++++ libc/wcsmbs/wcscoll.c 2005/03/17 21:06:24 1.14 +@@ -22,12 +22,11 @@ + + #define STRING_TYPE wchar_t + #define USTRING_TYPE wint_t +-#define STRCOLL __wcscoll ++#define STRCOLL wcscoll + #define STRCOLL_L __wcscoll_l + + #include "../string/strcoll.c" + + #ifndef USE_IN_EXTENDED_LOCALE_MODEL +-weak_alias (__wcscoll, wcscoll) + libc_hidden_weak (wcscoll) + #endif diff --git a/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-symbols.patch b/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-symbols.patch new file mode 100644 index 00000000..ace71e24 --- /dev/null +++ b/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-symbols.patch @@ -0,0 +1,126 @@ +If I'm really lucky, this fixes the following error building with gcc-4.0.0: + +../sysdeps/ieee754/dbl-64/s_isinf.c:29: error: 'isinf' aliased to undefined symbol '__isinf' +make[2]: *** [/home/dank/queue/jobdir.fast/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/math/s_isinf.os] Error 1 +make[1]: *** [math/subdir_lib] Error 2 +make: *** [lib] Error 2 + +--- + + +Revision 1.71, Thu Mar 17 21:06:27 2005 UTC (3 weeks, 5 days ago) by roland +Branch: MAIN +CVS Tags: fedora-glibc-20050405T2114, fedora-glibc-20050401T1444, fedora-glibc-20050324T0715, fedora-glibc-20050319T1907, HEAD +Changes since 1.70: +11 -66 lines +Diff to previous 1.70 (colored) + +2005-03-16 Richard Henderson <rth@redhat.com> + + * include/libc-symbols.h (__hidden_proto): Remove bogus declaration + of internal. + (__hidden_def1, __hidden_dot_def1): Remove. + (__hidden_def2, __hidden_def3): Remove. + (__hidden_ver1): New. + (hidden_ver, hidden_def, hidden_weak): Use it. + (hidden_data_ver, hidden_data_ver, hidden_data_weak): Use non-data + version of the macro. + +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/include/libc-symbols.h.diff?r1=1.70&r2=1.71&cvsroot=glibc + +=================================================================== +RCS file: /cvs/glibc/libc/include/libc-symbols.h,v +retrieving revision 1.70 +retrieving revision 1.71 +diff -u -r1.70 -r1.71 +--- libc/include/libc-symbols.h 2005/02/11 00:29:46 1.70 ++++ libc/include/libc-symbols.h 2005/03/17 21:06:27 1.71 +@@ -583,78 +583,23 @@ + # define hidden_proto(name, attrs...) \ + __hidden_proto (name, __GI_##name, ##attrs) + # define __hidden_proto(name, internal, attrs...) \ +- extern __typeof (name) internal; \ + extern __typeof (name) name __asm__ (__hidden_asmname (#internal)) \ + __hidden_proto_hiddenattr (attrs); + # define __hidden_asmname(name) \ + __hidden_asmname1 (__USER_LABEL_PREFIX__, name) + # define __hidden_asmname1(prefix, name) __hidden_asmname2(prefix, name) + # define __hidden_asmname2(prefix, name) #prefix name +-# ifdef HAVE_ASM_SET_DIRECTIVE +-# define __hidden_def1(original, alias) \ +- ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \ +- .set C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original) +-# ifdef HAVE_ASM_GLOBAL_DOT_NAME +-# define __hidden_dot_def1(original, alias) ASM_LINE_SEP \ +- ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP \ +- .set C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original) +-# else +-# define __hidden_dot_def1(original, alias) +-# endif +-# else +-# define __hidden_def1(original, alias) \ +- ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \ +- C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) +-# ifdef HAVE_ASM_GLOBAL_DOT_NAME +-# define __hidden_dot_def1(original, alias) ASM_LINE_SEP \ +- ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP \ +- C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original) +-# else +-# define __hidden_dot_def1(original, alias) +-# endif +-# endif +-# define __hidden_def2(...) #__VA_ARGS__ +-# define __hidden_def3(...) __hidden_def2 (__VA_ARGS__) +-# define hidden_def(name) \ +- __asm__ (__hidden_def3 (__hidden_def1 (__GI_##name, name) \ +- __hidden_dot_def1 (__GI_##name, name))); +-# define hidden_data_def(name) \ +- __asm__ (__hidden_def3 (__hidden_def1 (__GI_##name, name))); +-# define hidden_ver(local, name) \ +- __asm__ (__hidden_def3 (__hidden_def1 (local, __GI_##name) \ +- __hidden_dot_def1 (local, __GI_##name))); +-# define hidden_data_ver(local, name) \ +- __asm__ (__hidden_def3 (__hidden_def1 (local, __GI_##name))); +-# ifdef HAVE_WEAK_SYMBOLS +-# ifdef HAVE_ASM_WEAKEXT_DIRECTIVE +-# define __hidden_weak1(original, alias) \ +- .weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original) +-# ifdef HAVE_ASM_GLOBAL_DOT_NAME +-# define __hidden_dot_weak1(original, alias) ASM_LINE_SEP \ +- .weakext C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original) +-# else +-# define __hidden_dot_weak1(original, alias) +-# endif +-# else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */ +-# define __hidden_weak1(original, alias) \ +- .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP \ +- C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) +-# ifdef HAVE_ASM_GLOBAL_DOT_NAME +-# define __hidden_dot_weak1(original, alias) ASM_LINE_SEP \ +- .weak C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP \ +- C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original) +-# else +-# define __hidden_dot_weak1(original, alias) +-# endif +-# endif +-# define hidden_weak(name) \ +- __asm__ (__hidden_def3 (__hidden_weak1 (__GI_##name, name) \ +- __hidden_dot_weak1 (__GI_##name, name))); +-# define hidden_data_weak(name) \ +- __asm__ (__hidden_def3 (__hidden_weak1 (__GI_##name, name))); +-# else +-# define hidden_weak(name) hidden_def (name) +-# endif ++# define __hidden_ver1(local, internal, name) \ ++ extern __typeof (name) __EI_##name __asm__(__hidden_asmname (#internal)); \ ++ extern __typeof (name) __EI_##name \ ++ __attribute__((alias (__hidden_asmname (#local)))) ++# define hidden_ver(local, name) __hidden_ver1(local, __GI_##name, name); ++# define hidden_data_ver(local, name) hidden_ver(local, name) ++# define hidden_def(name) __hidden_ver1(__GI_##name, name, name); ++# define hidden_data_def(name) hidden_def(name) ++# define hidden_weak(name) \ ++ __hidden_ver1(__GI_##name, name, name) __attribute__((weak)); ++# define hidden_data_weak(name) hidden_weak(name) + # else + /* For assembly, we need to do the opposite of what we do in C: + in assembly gcc __REDIRECT stuff is not in place, so functions diff --git a/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-wcstol_l.patch b/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-wcstol_l.patch new file mode 100644 index 00000000..5637ce64 --- /dev/null +++ b/patches/glibc/2.3.4/glibc-2.3.5-allow-gcc4-wcstol_l.patch @@ -0,0 +1,57 @@ +Fixes +../sysdeps/wordsize-64/wcstol_l.c:11: error: '____wcstoll_l_internal' aliased to undefined symbol '____wcstol_l_internal' +../sysdeps/wordsize-64/wcstol_l.c:12: error: '__wcstoll_l' aliased to undefined symbol '__wcstol_l' +../sysdeps/wordsize-64/wcstol_l.c:13: error: 'wcstoll_l' aliased to undefined symbol '__wcstol_l' +make[2]: *** [/home/dkegel/queue/jobdir.produser_cpsm10/crosstool-0.32/build/x86_64-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/wcsmbs/wcstoul_l.o] Error 1 + +https://www.redhat.com/archives/fedora-cvs-commits/2005-March/msg00408.html +%changelog ++* Fri Mar 25 2005 Jakub Jelinek <jakub redhat com> 2.3.4-18 ++- fix build on 64-bit arches with new GCC + +Revision 1.4.2.1, Fri Mar 25 11:59:01 2005 UTC (3 weeks, 4 days ago) by jakub +Branch: fedora-branch +CVS Tags: fedora-glibc-2_3_4-18 +Changes since 1.4: +2 -0 lines +Diff to previous 1.4 (colored) + + * sysdeps/wordsize-64/strtol_l.c: Don't add aliases if UNSIGNED. + * sysdeps/wordsize-64/wcstol_l.c: Likewise. + + +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/wordsize-64/strtol_l.c.diff?r1=1.4&r2=1.4.2.1&cvsroot=glibc +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/wordsize-64/wcstol_l.c.diff?r1=1.4&r2=1.4.2.1&cvsroot=glibc + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/wordsize-64/strtol_l.c,v +retrieving revision 1.4 +retrieving revision 1.4.2.1 +diff -u -r1.4 -r1.4.2.1 +--- libc/sysdeps/wordsize-64/strtol_l.c 2003/03/03 09:45:12 1.4 ++++ libc/sysdeps/wordsize-64/strtol_l.c 2005/03/25 11:59:01 1.4.2.1 +@@ -8,7 +8,9 @@ + #undef ____strtoll_l_internal + #undef __strtoll_l + #undef strtoll_l ++#if !UNSIGNED + 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) ++#endif +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/wordsize-64/wcstol_l.c,v +retrieving revision 1.4 +retrieving revision 1.4.2.1 +diff -u -r1.4 -r1.4.2.1 +--- libc/sysdeps/wordsize-64/wcstol_l.c 2002/08/08 11:44:51 1.4 ++++ libc/sysdeps/wordsize-64/wcstol_l.c 2005/03/25 11:59:01 1.4.2.1 +@@ -8,6 +8,8 @@ + #undef ____wcstoll_l_internal + #undef __wcstoll_l + #undef wcstoll_l ++#if !UNSIGNED + strong_alias (____wcstol_l_internal, ____wcstoll_l_internal) + weak_alias (__wcstol_l, __wcstoll_l) + weak_alias (__wcstol_l, wcstoll_l) ++#endif diff --git a/patches/glibc/2.3.4/glibc-configure-apple-as.patch b/patches/glibc/2.3.4/glibc-configure-apple-as.patch new file mode 100644 index 00000000..604c36d5 --- /dev/null +++ b/patches/glibc/2.3.4/glibc-configure-apple-as.patch @@ -0,0 +1,23 @@ +http://in3www.epfl.ch/~schaffne/glibc-configure-apple-as.patch +http://sources.redhat.com/ml/crossgcc/2004-02/msg00151.html + +The following makes it possible to configure glibc-2.3.2 on Mac OS X, +where the assembler but doesn't understand the --version flag. + +Fixes the symptom +checking whether ld is GNU ld... no +checking for /usr/libexec/gcc/darwin/ppc/as... /usr/libexec/gcc/darwin/ppc/as +checking version of /usr/libexec/gcc/darwin/ppc/as... +<PAUSES HERE AND JUST SITS THERE DOING NOTHING> + +--- glibc-2.3.2/configure~ Wed Feb 26 09:20:48 2003 ++++ glibc-2.3.2/configure Fri Feb 27 13:12:53 2004 +@@ -3789,7 +3789,7 @@ + # Found it, now check the version. + echo "$as_me:$LINENO: checking version of $AS" >&5 + echo $ECHO_N "checking version of $AS... $ECHO_C" >&6 +- ac_prog_version=`$AS --version 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'` ++ ac_prog_version=`$AS -v </dev/null 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 2.1[3-9]*) diff --git a/patches/glibc/2.3.4/glibc-fp-byteorder.patch b/patches/glibc/2.3.4/glibc-fp-byteorder.patch new file mode 100644 index 00000000..f20432ea --- /dev/null +++ b/patches/glibc/2.3.4/glibc-fp-byteorder.patch @@ -0,0 +1,203 @@ +Taken from http://sources.redhat.com/ml/crossgcc/2004-02/msg00104.html +Author: addsub@eyou.com +Target: ARM + +Fixes http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/920501-8.c +and makes printf("%f", 1.0) work. + +Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00115.html : + It ... fixes the 'printf("%f\n", 0.5); prints 0.000000' and general 'floating point + is broken' on my big-endian hardfloat FPA ARM platform. ... + It's definitely needed for hardfloat. So I'd think it's needed for + big-endian systems in any case, and for VFP on little-endian systems + too. Someone would have to verify that though. + +Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00123.html + I just had a look at glibc-20040830, and [this patch] is still needed and useful + for this version. glibc-20040830 out-of-the-box still contains the + following wrong assumptions: + - sysdeps/arm/bits/endian.h: float word order is big endian (which it is + not on vfp systems) + - sysdeps/arm/gmp-mparam.h: IEEE doubles are mixed endian (which they + are not on big endian systems, neither on vfp systems) + - sysdeps/arm/ieee754.h: IEEE doubles are in little endian byte order + (which they are not on big endian systems) + [This patch] seems the right solution for all of these issues. + +Dimitry Andric wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00132.html : + It's even needed for glibc CVS, AFAICS. + The patch hunk which modifies glibc.new/sysdeps/arm/bits/endian.h + (currently at version 1.4) is only needed for proper VFP operation. + But the hunk which modifies sysdeps/arm/gmp-mparam.h, and the hunk + that deletes sysdeps/arm/ieee754.h (yes, this IS correct), are needed + for proper operation of *any* FP model on big endian ARM. + +See also discussion in followups to +http://sources.redhat.com/ml/crossgcc/2004-05/msg00245.html) + +Message-ID: <276985760.37584@eyou.com> +Received: from unknown (HELO eyou.com) (172.16.2.2) + by 0.0.0.0 with SMTP; Tue, 17 Feb 2004 10:42:40 +0800 +Received: (qmail 8238 invoked by uid 65534); 17 Feb 2004 10:42:38 +0800 +Date: 17 Feb 2004 10:42:38 +0800 +Message-ID: <20040217104238.8237.qmail@eyou.com> +From: "add" <addsub@eyou.com> +To: dank@kegel.com +Reply-To: "add" <addsub@eyou.com> +Subject: Re: problem while building arm vfp softfloat gcc ` + +Hi, Dan, This is a patch I applied to my glibc-2.3.2, then my softfloat +toolchain can printf("%f\n",1.0). So you may have a try of this + + +diff -uNrp glibc.old/sysdeps/arm/bits/endian.h glibc.new/sysdeps/arm/bits/endian.h +--- glibc.old/sysdeps/arm/bits/endian.h 1999-04-12 11:59:13.000000000 -0400 ++++ glibc.new/sysdeps/arm/bits/endian.h 2004-02-12 09:15:13.000000000 -0500 +@@ -9,4 +9,9 @@ + #else + #define __BYTE_ORDER __LITTLE_ENDIAN + #endif ++ ++#ifdef __VFP_FP__ ++#define __FLOAT_WORD_ORDER __BYTE_ORDER ++#else + #define __FLOAT_WORD_ORDER __BIG_ENDIAN ++#endif +diff -uNrp glibc.old/sysdeps/arm/gmp-mparam.h glibc.new/sysdeps/arm/gmp-mparam.h +--- glibc.old/sysdeps/arm/gmp-mparam.h 2001-07-07 15:21:19.000000000 -0400 ++++ glibc.new/sysdeps/arm/gmp-mparam.h 2004-02-12 09:15:13.000000000 -0500 +@@ -26,5 +26,13 @@ MA 02111-1307, USA. */ + #define BITS_PER_SHORTINT 16 + #define BITS_PER_CHAR 8 + +-#define IEEE_DOUBLE_BIG_ENDIAN 0 +-#define IEEE_DOUBLE_MIXED_ENDIAN 1 ++#if defined(__ARMEB__) ++# define IEEE_DOUBLE_MIXED_ENDIAN 0 ++# define IEEE_DOUBLE_BIG_ENDIAN 1 ++#elif defined(__VFP_FP__) ++# define IEEE_DOUBLE_MIXED_ENDIAN 0 ++# define IEEE_DOUBLE_BIG_ENDIAN 0 ++#else ++# define IEEE_DOUBLE_BIG_ENDIAN 0 ++# define IEEE_DOUBLE_MIXED_ENDIAN 1 ++#endif +diff -uNrp glibc.old/sysdeps/arm/ieee754.h glibc.new/sysdeps/arm/ieee754.h +--- glibc.old/sysdeps/arm/ieee754.h 2001-07-07 15:21:19.000000000 -0400 ++++ glibc.new/sysdeps/arm/ieee754.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,115 +0,0 @@ +-/* Copyright (C) 1992, 1995, 1996, 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 _IEEE754_H +- +-#define _IEEE754_H 1 +-#include <features.h> +- +-#include <endian.h> +- +-__BEGIN_DECLS +- +-union ieee754_float +- { +- float f; +- +- /* This is the IEEE 754 single-precision format. */ +- struct +- { +- unsigned int mantissa:23; +- unsigned int exponent:8; +- unsigned int negative:1; +- } ieee; +- +- /* This format makes it easier to see if a NaN is a signalling NaN. */ +- struct +- { +- unsigned int mantissa:22; +- unsigned int quiet_nan:1; +- unsigned int exponent:8; +- unsigned int negative:1; +- } ieee_nan; +- }; +- +-#define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */ +- +- +-union ieee754_double +- { +- double d; +- +- /* This is the IEEE 754 double-precision format. */ +- struct +- { +- unsigned int mantissa0:20; +- unsigned int exponent:11; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- } ieee; +- +- /* This format makes it easier to see if a NaN is a signalling NaN. */ +- struct +- { +- unsigned int mantissa0:19; +- unsigned int quiet_nan:1; +- unsigned int exponent:11; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- } ieee_nan; +- }; +- +-#define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ +- +- +-/* The following two structures are correct for `new' floating point systems but +- wrong for the old FPPC. The only solution seems to be to avoid their use on +- old hardware. */ +- +-union ieee854_long_double +- { +- long double d; +- +- /* This is the IEEE 854 double-extended-precision format. */ +- struct +- { +- unsigned int exponent:15; +- unsigned int empty:16; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- unsigned int mantissa0:32; +- } ieee; +- +- /* This is for NaNs in the IEEE 854 double-extended-precision format. */ +- struct +- { +- unsigned int exponent:15; +- unsigned int empty:16; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- unsigned int mantissa0:30; +- unsigned int quiet_nan:1; +- unsigned int one:1; +- } ieee_nan; +- }; +- +-#define IEEE854_LONG_DOUBLE_BIAS 0x3fff +- +-__END_DECLS +- +-#endif /* ieee754.h */ diff --git a/patches/glibc/2.3.4/make-install-lib-all.patch b/patches/glibc/2.3.4/make-install-lib-all.patch new file mode 100644 index 00000000..38457228 --- /dev/null +++ b/patches/glibc/2.3.4/make-install-lib-all.patch @@ -0,0 +1,24 @@ +From http://svn.exactcode.de/t2/trunk/package/base/glibc32/make-install-lib-all.patch +Rule to install all needed libraries, not just the ones installed by install-lib, +yet not install programs. +Needed because we can't use the main install target, as we can't build programs before +we have the final gcc installed; linking fails because libeh.a is not present, +and glibc insists on linking programs with that library. + +diff -Naur glibc-2.3.4.orig/Makerules glibc-2.3.4/Makerules +--- glibc-2.3.4.orig/Makerules 2004-12-15 20:52:39.000000000 +0200 ++++ glibc-2.3.4/Makerules 2005-02-19 15:16:31.415125176 +0200 +@@ -844,6 +844,13 @@ + installed-libcs := $(foreach o,$(filter-out .os,$(object-suffixes-for-libc)),\ + $(inst_libdir)/$(patsubst %,$(libtype$o),\ + $(libprefix)$(libc-name))) ++ ++install-lib-all: $(inst_slibdir)/libc.so$(libc.so-version) \ ++ $(inst_slibdir)/libc-$(version).so \ ++ $(inst_libdir)/libc.so \ ++ $(inst_libdir)/libc.a \ ++ install-lib ++ + install: $(installed-libcs) + $(installed-libcs): $(inst_libdir)/lib$(libprefix)%: lib $(+force) + $(make-target-directory) diff --git a/patches/glibc/2.3.4/pr758.patch b/patches/glibc/2.3.4/pr758.patch new file mode 100644 index 00000000..d1142a2d --- /dev/null +++ b/patches/glibc/2.3.4/pr758.patch @@ -0,0 +1,256 @@ +See http://sources.redhat.com/bugzilla/show_bug.cgi?id=758 + +Submitted By: Jim Gifford (patches at jg555 dot com) +Date: 2005-02-23 +Initial Package Version: 2.3.4 +Origin: Richard Sandiford +Upstream Status: Unknown +Description: Fixes Syscall.h generation + +diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/Makefile glibc-2.3.4/sysdeps/unix/sysv/linux/mips/Makefile +--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/Makefile 2004-11-24 04:38:15 +0000 ++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/Makefile 2005-02-23 18:21:54 +0000 +@@ -9,11 +9,73 @@ + + no_syscall_list_h = 1 + +-# Generate the list of SYS_* macros for the system calls (__NR_* macros). +-# We generate not only SYS_<syscall>, pointing at SYS_<abi>_<syscall> if +-# it exists, but also define SYS_<abi>_<syscall> for all ABIs. ++# A callable macro that expands to a shell command. Preprocess file $(1) ++# using ABI option $(2) and see which macros it defines. Print FOO for each ++# macro of the form __NR$(3)_FOO, filtering out ABI-specific __NR macros ++# that have a prefix other than $(3). ++mips_list_syscalls = $(filter-out -m%,$(CC)) -E -x c $(+includes) \ ++ $(sysincludes) -D_LIBC -dM -mabi=$(2) $(1) | \ ++ sed -n 's@^\#define __NR$(3)_\([^ ]*\) .*@\1@p' | \ ++ sed -e '/^[ON]32_/d' -e '/^N64_/d' -e '/^64_/d' | \ ++ LC_ALL=C sort ++ ++# Generate a list of SYS_* macros from the linux __NR macros. ++# ++# Before version 2.6, linux had separate 32-bit and 64-bit MIPS ports, ++# each with its own set of headers. The ports were merged for 2.6 and ++# this merged port defines the syscalls in a slightly different way. ++# There are therefore three sets of headers that we need to consider: ++# ++# (1) Headers from the separate 32-bit MIPS port. They just define ++# a single list of __NR macros. ++# ++# (2) Headers from the separate 64-bit MIPS port. They unconditionally ++# define syscalls for all three ABIs, with o32 syscalls prefixed ++# by __NR_O32, n32 syscalls prefixed by __NR_N32 and n64 syscalls ++# prefixed by plain __NR. ++# ++# (3) Headers from the combined port. They use the _MIPS_SIM macro to ++# define the right set of syscalls for the current ABI. The syscalls ++# themselves have no special ABI prefix, but the headers also define: ++# ++# __NR_O32_Linux{,_syscalls} ++# __NR_N32_Linux{,_syscalls} ++# __NR_64_Linux{,_syscalls} ++# ++# In case (1) we just want a simple list of SYS_* macros. In cases (2) ++# and (3) we want a file that will work for all three ABIs, regardless ++# of which ABI we are currently using. We also want the file to work ++# if the user later moves from (2) to (3). Thus the file we create ++# for (2) and (3) has the form: ++# ++# #if _MIPS_SIM == _MIPS_SIM_NABI32 ++# # ifdef __NR_N32_open ++# # define SYS_n32syscall1 __NR_N32_n32syscall1 ++# # ... ++# # else ++# # define SYS_n32syscall1 __NR_n32syscall1 ++# # ... ++# # endif ++# #elif _MIPS_SIM == _MIPS_SIM_ABI64 ++# # define SYS_n64syscall1 __NR_n64syscall1 ++# # ... ++# #else ++# # ifdef __NR_O32_open ++# # define SYS_o32syscall1 __NR_O32_o32syscall1 ++# # ... ++# # else ++# # define SYS_o32syscall1 __NR_o32syscall1 ++# # ... ++# # endif ++# #endif ++# ++# Here, __NR_N32_open and __NR_O32_open are used to detect case (2) ++# over case (3). The n64 SYS_* macros can always use the normal ++# ABI-less names. + $(objpfx)syscall-%.h $(objpfx)syscall-%.d: ../sysdeps/unix/sysv/linux/mips/sys/syscall.h + $(make-target-directory) ++ $(CC) -E -x c $(+includes) $(sysincludes) -D_LIBC $< -MD -MP \ ++ -MF $(@:.h=.d)-t -MT '$(@:.d=.h) $(@:.h=.d)' > /dev/null + { \ + echo '/* Generated at libc build time from kernel syscall list. */';\ + echo ''; \ +@@ -22,28 +84,38 @@ + echo '#endif'; \ + echo ''; \ + echo '#include <sgidefs.h>'; \ +- rm -f $(@:.d=.h).newt; \ +- $(CC) -E -MD -MP -MF $(@:.h=.d)-t -MT '$(@:.d=.h) $(@:.h=.d)' \ +- -x c $(+includes) $(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 \ ++ rm -f $(@:.d=.h).new32 $(@:.d=.h).newn32 $(@:.d=.h).new64; \ ++ $(call mips_list_syscalls,$<,n32,_N32) > $(@:.d=.h).newn32; \ ++ if test -s $(@:.d=.h).newn32; then \ ++ if grep open $(@:.d=.h).newn32 > /dev/null; then \ ++ $(call mips_list_syscalls,$<,32,_O32) > $(@:.d=.h).new32; \ ++ $(call mips_list_syscalls,$<,64,) > $(@:.d=.h).new64; \ ++ else \ ++ $(call mips_list_syscalls,$<,32,) > $(@:.d=.h).new32; \ ++ $(call mips_list_syscalls,$<,n32,) > $(@:.d=.h).newn32; \ ++ $(call mips_list_syscalls,$<,64,) > $(@:.d=.h).new64; \ ++ fi; \ + echo '#if _MIPS_SIM == _ABIN32'; \ +- sed -n 's/^\(#define SYS_\)N32_/\1/p' < $(@:.d=.h).newt | \ +- LC_ALL=C sort; \ ++ echo '# ifdef __NR_N32_open'; \ ++ sed 's@\(.*\)@# define SYS_\1 __NR_N32_\1@' < $(@:.d=.h).newn32; \ ++ echo '# else'; \ ++ sed 's@\(.*\)@# define SYS_\1 __NR_\1@' < $(@:.d=.h).newn32; \ ++ echo '# endif'; \ + echo '#elif _MIPS_SIM == _ABI64'; \ +- sed -n 's/^\(#define SYS_\)N64_/\1/p' < $(@:.d=.h).newt | \ +- LC_ALL=C sort; \ ++ sed 's@\(.*\)@# define SYS_\1 __NR_\1@' < $(@:.d=.h).new64; \ + echo '#else'; \ +- sed -n 's/^\(#define SYS_\)O32_/\1/p' < $(@:.d=.h).newt | \ +- LC_ALL=C sort; \ ++ echo '# ifdef __NR_O32_open'; \ ++ sed 's@\(.*\)@# define SYS_\1 __NR_O32_\1@' < $(@:.d=.h).new32; \ ++ echo '# else'; \ ++ sed 's@\(.*\)@# define SYS_\1 __NR_\1@' < $(@:.d=.h).new32; \ ++ echo '# endif'; \ + echo '#endif'; \ +- sed -n '/^#define SYS_\([ON]32\|N64\)_/p' < $(@:.d=.h).newt | \ +- LC_ALL=C sort +1.8; \ + else \ +- cat $(@:.d=.h).newt; \ ++ $(CC) -E -x c $(+includes) $(sysincludes) -D_LIBC -dM $< | \ ++ sed -n 's@^\#define __NR_\([^ ]*\) .*@\#define SYS_\1 __NR_\1@p' | \ ++ LC_ALL=C sort; \ + fi; \ +- rm $(@:.d=.h).newt; \ ++ rm -f $(@:.d=.h).new32 $(@:.d=.h).newn32 $(@:.d=.h).new64; \ + } > $(@:.d=.h).new + mv -f $(@:.d=.h).new $(@:.d=.h) + ifneq (,$(objpfx)) +diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure +--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure 2004-11-24 04:42:45 +0000 ++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure 2005-02-23 18:10:11 +0000 +@@ -18,7 +18,7 @@ + { 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>' > asm-unistd.h +- else ++ elif grep __NR_N32_open "$asm_unistd_h" > /dev/null; then + # The point of this preprocessing is to turn __NR_<syscall> into + # __NR_N64_<syscall>, as well as to define __NR_<syscall> to + # __NR_<abi>_<syscall>, if __NR_<abi>_<syscall> is defined +@@ -68,6 +68,8 @@ + { + print; + }' ++ else ++ echo '#include <asm/unistd.h>' > asm-unistd.h + fi ;; + mips*) + rm -f asm-unistd.h +diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure.in glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure.in +--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure.in 2004-11-24 04:38:31 +0000 ++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure.in 2005-02-23 18:10:11 +0000 +@@ -18,7 +18,7 @@ + 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>' > asm-unistd.h +- else ++ elif grep __NR_N32_open "$asm_unistd_h" > /dev/null; then + # The point of this preprocessing is to turn __NR_<syscall> into + # __NR_N64_<syscall>, as well as to define __NR_<syscall> to + # __NR_<abi>_<syscall>, if __NR_<abi>_<syscall> is defined +@@ -68,6 +68,8 @@ + { + print; + }' ++ else ++ echo '#include <asm/unistd.h>' > asm-unistd.h + fi ;; + mips*) + rm -f asm-unistd.h +diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h +--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h 2003-03-29 08:15:29 +0000 ++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h 2005-02-23 18:10:11 +0000 +@@ -1,36 +0,0 @@ +-/* 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 <sysdeps/unix/sysv/linux/mips/mips32/sysdep.h> +- +-/* 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 -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h +--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h 2004-10-18 05:16:07 +0000 ++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h 2005-02-23 18:10:11 +0000 +@@ -28,9 +28,9 @@ + so we have to redefine the `SYS_ify' macro here. */ + #undef SYS_ify + #ifdef __STDC__ +-# define SYS_ify(syscall_name) __NR_N32_##syscall_name ++# define SYS_ify(syscall_name) __NR_##syscall_name + #else +-# define SYS_ify(syscall_name) __NR_N32_/**/syscall_name ++# define SYS_ify(syscall_name) __NR_/**/syscall_name + #endif + + #ifdef __ASSEMBLER__ +diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h +--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h 2004-10-18 05:16:08 +0000 ++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h 2005-02-23 18:10:11 +0000 +@@ -28,9 +28,9 @@ + so we have to redefine the `SYS_ify' macro here. */ + #undef SYS_ify + #ifdef __STDC__ +-# define SYS_ify(syscall_name) __NR_N64_##syscall_name ++# define SYS_ify(syscall_name) __NR_##syscall_name + #else +-# define SYS_ify(syscall_name) __NR_N64_/**/syscall_name ++# define SYS_ify(syscall_name) __NR_/**/syscall_name + #endif + + #ifdef __ASSEMBLER__ diff --git a/patches/glibc/2.3.5/arm-ctl_bus_isa.patch b/patches/glibc/2.3.5/arm-ctl_bus_isa.patch new file mode 100644 index 00000000..3422070b --- /dev/null +++ b/patches/glibc/2.3.5/arm-ctl_bus_isa.patch @@ -0,0 +1,51 @@ +Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004. +Needed to build glibc with linux kernels 2.4.23 or higher on ARM, +Fixes following error: + +../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys': +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]') +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]') +make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1 + +cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA", http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html + +--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old 2003-02-20 14:22:24.000000000 -0800 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c 2004-01-31 16:01:50.000000000 -0800 +@@ -47,6 +47,12 @@ + #include <asm/page.h> + #include <sys/sysctl.h> + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include <linux/version.h> ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23)) ++#define CTL_BUS_ISA BUS_ISA /* and hope it's not the one from linux/input.h */ ++#endif ++ + #define PATH_ARM_SYSTYPE "/etc/arm_systype" + #define PATH_CPUINFO "/proc/cpuinfo" + +@@ -80,7 +86,7 @@ + * Initialize I/O system. There are several ways to get the information + * we need. Each is tried in turn until one succeeds. + * +- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*). This is the preferred method ++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*). This is the preferred method + * but not all kernels support it. + * + * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE. +@@ -100,8 +106,8 @@ + { + char systype[256]; + int i, n; +- static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE }; +- static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT }; ++ static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE }; ++ static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT }; + size_t len = sizeof(io.base); + + if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0) diff --git a/patches/glibc/2.3.5/fix-pr398.patch b/patches/glibc/2.3.5/fix-pr398.patch new file mode 100644 index 00000000..d5d03091 --- /dev/null +++ b/patches/glibc/2.3.5/fix-pr398.patch @@ -0,0 +1,70 @@ +Fixes error + +dl-runtime.c:222: error: parse error before "CFI_STARTPROC" +make[2]: *** [crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/elf/dl-runtim +e.o] Error 1 +make[2]: Leaving directory `crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040 +822/elf' +make[1]: *** [elf/subdir_lib] Error 2 +make[1]: Leaving directory `crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040 +822' +make: *** [all] Error 2 + +----------------- + +See http://sources.redhat.com/bugzilla/show_bug.cgi?id=398 +http://sources.redhat.com/ml/libc-alpha/2004-07/msg00023.html + +----------------- + +CVSROOT: /cvs/glibc +Module name: libc +Branch: glibc-2_3-branch +Changes by: roland@sources.redhat.com 2006-02-23 22:36:51 + +Modified files: + sysdeps/s390/s390-64: dl-machine.h + sysdeps/s390/s390-32: dl-machine.h + +Log message: + 2004-07-10 GOTO Masanori <gotom@debian.or.jp> + + [BZ #398] + * sysdeps/s390/s390-32/dl-machine.h: Include <sysdep.h> for CFI + directive. + * sysdeps/s390/s390-64/dl-machine.h: Likewise. + +Patches: +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/s390/s390-64/dl-machine.h.diff?cvsroot=glibc&only_with_tag=glibc-2_3-branch&r1=1.19.4.1&r2=1.19.4.2 +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/s390/s390-32/dl-machine.h.diff?cvsroot=glibc&only_with_tag=glibc-2_3-branch&r1=1.20.4.1&r2=1.20.4.2 + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/s390/s390-64/dl-machine.h,v +retrieving revision 1.19.4.1 +retrieving revision 1.19.4.2 +diff -u -r1.19.4.1 -r1.19.4.2 +--- libc/sysdeps/s390/s390-64/dl-machine.h 2005/10/17 04:57:27 1.19.4.1 ++++ libc/sysdeps/s390/s390-64/dl-machine.h 2006/02/23 22:36:51 1.19.4.2 +@@ -27,6 +27,7 @@ + #include <sys/param.h> + #include <string.h> + #include <link.h> ++#include <sysdep.h> + + /* This is an older, now obsolete value. */ + #define EM_S390_OLD 0xA390 +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/s390/s390-32/dl-machine.h,v +retrieving revision 1.20.4.1 +retrieving revision 1.20.4.2 +diff -u -r1.20.4.1 -r1.20.4.2 +--- libc/sysdeps/s390/s390-32/dl-machine.h 2005/10/17 04:57:27 1.20.4.1 ++++ libc/sysdeps/s390/s390-32/dl-machine.h 2006/02/23 22:36:51 1.20.4.2 +@@ -27,6 +27,7 @@ + #include <sys/param.h> + #include <string.h> + #include <link.h> ++#include <sysdep.h> + + /* This is an older, now obsolete value. */ + #define EM_S390_OLD 0xA390 diff --git a/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-arm.patch b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-arm.patch new file mode 100644 index 00000000..f3ad0c61 --- /dev/null +++ b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-arm.patch @@ -0,0 +1,117 @@ +Fixes +In file included from dynamic-link.h:22, + from dl-reloc.c:265: +../sysdeps/arm/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/arm/dl-machine.h:371: error: invalid storage class for function 'fix_bad_pc24' +../sysdeps/arm/dl-machine.h:406: error: invalid storage class for function 'elf_machine_rel' +../sysdeps/arm/dl-machine.h:532: error: invalid storage class for function 'elf_machine_rela' +../sysdeps/arm/dl-machine.h:612: error: invalid storage class for function 'elf_machine_rel_relative' +../sysdeps/arm/dl-machine.h:621: error: invalid storage class for function 'elf_machine_rela_relative' +../sysdeps/arm/dl-machine.h:630: error: invalid storage class for function 'elf_machine_lazy_rel' +make[2]: Leaving directory `/home/dank/queue/jobdir.k8/crosstool-dev/build/arm-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.3/glibc-2.3.3/elf' + +when building glibc-2.3.[34] with gcc-4.0 + +Like +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/arm/dl-machine.h.diff?r1=1.51&r2=1.52&cvsroot=glibc +but works with older compilers, and fixes fix_bad_pc24. + + +--- glibc-2.3.4/sysdeps/arm/dl-machine.h.old Sun Mar 20 17:54:37 2005 ++++ glibc-2.3.4/sysdeps/arm/dl-machine.h Sun Mar 20 17:57:32 2005 +@@ -359,7 +359,14 @@ + # endif + + /* Deal with an out-of-range PC24 reloc. */ +-static Elf32_Addr ++#if __GNUC__ >= 4 ++ auto inline Elf32_Addr ++#else ++ static inline Elf32_Addr ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + fix_bad_pc24 (Elf32_Addr *const reloc_addr, Elf32_Addr value) + { + static void *fix_page; +@@ -392,7 +399,14 @@ + /* Perform the relocation specified by RELOC and SYM (which is fully resolved). + MAP is the object containing the reloc. */ + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, + const Elf32_Sym *sym, const struct r_found_version *version, + void *const reloc_addr_arg) +@@ -517,7 +531,14 @@ + } + + # ifndef RTLD_BOOTSTRAP +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, + const Elf32_Sym *sym, const struct r_found_version *version, + void *const reloc_addr_arg) +@@ -597,7 +618,14 @@ + } + # endif + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rel_relative (Elf32_Addr l_addr, const Elf32_Rel *reloc, + void *const reloc_addr_arg) + { +@@ -606,7 +634,14 @@ + } + + # ifndef RTLD_BOOTSTRAP +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc, + void *const reloc_addr_arg) + { +@@ -615,7 +650,14 @@ + } + # endif + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_lazy_rel (struct link_map *map, + Elf32_Addr l_addr, const Elf32_Rel *reloc) + { diff --git a/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-elf.patch b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-elf.patch new file mode 100644 index 00000000..3bbe6ea8 --- /dev/null +++ b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-elf.patch @@ -0,0 +1,61 @@ +From http://www.mail-archive.com/pld-cvs-commit@pld-linux.org/msg00229.html +Fixes + rtld.c: In function '_dl_start': + dynamic-link.h:47: error: nested function 'elf_machine_rela_relative' declared but never defined + dynamic-link.h:41: error: nested function 'elf_machine_rela' declared but never defined +when compiling glibc-2.3.4 with gcc-4.0 + +But see also +http://sources.redhat.com/ml/libc-hacker/2005-02/msg00000.html +and +http://sources.redhat.com/ml/libc-hacker/2005-03/msg00008.html +which seem to propose less radical fixes? + +Aha. See also http://sources.redhat.com/bugzilla/show_bug.cgi?id=721 + +--- glibc-2.3-20050307/elf/dynamic-link.h.old 2005-03-12 18:12:37.000000000 -0800 ++++ glibc-2.3-20050307/elf/dynamic-link.h 2005-03-12 18:12:59.777820848 -0800 +@@ -19,43 +19,6 @@ + + #include <elf.h> + #include <assert.h> +- +-#ifdef RESOLVE +-/* We pass reloc_addr as a pointer to void, as opposed to a pointer to +- ElfW(Addr), because not all architectures can assume that the +- relocated address is properly aligned, whereas the compiler is +- entitled to assume that a pointer to a type is properly aligned for +- the type. Even if we cast the pointer back to some other type with +- less strict alignment requirements, the compiler might still +- remember that the pointer was originally more aligned, thereby +- optimizing away alignment tests or using word instructions for +- copying memory, breaking the very code written to handle the +- unaligned cases. */ +-auto void __attribute__((always_inline)) +-elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc, +- const ElfW(Sym) *sym, const struct r_found_version *version, +- void *const reloc_addr); +-auto void __attribute__((always_inline)) +-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc, +- const ElfW(Sym) *sym, const struct r_found_version *version, +- void *const reloc_addr); +-auto void __attribute__((always_inline)) +-elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc, +- void *const reloc_addr); +-auto void __attribute__((always_inline)) +-elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc, +- void *const reloc_addr); +-# if ELF_MACHINE_NO_RELA || defined ELF_MACHINE_PLT_REL +-auto void __attribute__((always_inline)) +-elf_machine_lazy_rel (struct link_map *map, +- ElfW(Addr) l_addr, const ElfW(Rel) *reloc); +-# else +-auto void __attribute__((always_inline)) +-elf_machine_lazy_rel (struct link_map *map, +- ElfW(Addr) l_addr, const ElfW(Rela) *reloc); +-# endif +-#endif +- + #include <dl-machine.h> + + #ifndef VERSYMIDX diff --git a/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-iconvdata.patch b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-iconvdata.patch new file mode 100644 index 00000000..42be8a38 --- /dev/null +++ b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-iconvdata.patch @@ -0,0 +1,44 @@ +See http://sources.redhat.com/ml/libc-hacker/2005-02/msg00000.html +and http://www.mail-archive.com/pld-cvs-commit@pld-linux.org/msg00229.html + +Fixes + In file included from jis0208.c:23: + jis0208.h:32: error: array type has incomplete element type +when building glibc with gcc-4.0 +The bug has been present since at least glibc-2.2.5. +This patch applies cleanly to glibc-2.3.4 + +--- /home/dank/downloads/glibc-2.3-20050307/iconvdata/jis0208.h 2003-06-11 14:40:42.000000000 -0700 ++++ glibc-2.3-20050307/iconvdata/jis0208.h 2005-03-13 20:55:01.784054760 -0800 +@@ -24,15 +24,6 @@ + #include <gconv.h> + #include <stdint.h> + +-/* Conversion table. */ +-extern const uint16_t __jis0208_to_ucs[]; +- +-extern const char __jisx0208_from_ucs4_lat1[256][2]; +-extern const char __jisx0208_from_ucs4_greek[0xc1][2]; +-extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[]; +-extern const char __jisx0208_from_ucs_tab[][2]; +- +- + /* Struct for table with indeces in UCS mapping table. */ + struct jisx0208_ucs_idx + { +@@ -42,6 +33,15 @@ + }; + + ++/* Conversion table. */ ++extern const uint16_t __jis0208_to_ucs[]; ++ ++extern const char __jisx0208_from_ucs4_lat1[256][2]; ++extern const char __jisx0208_from_ucs4_greek[0xc1][2]; ++extern const struct jisx0208_ucs_idx __jisx0208_from_ucs_idx[]; ++extern const char __jisx0208_from_ucs_tab[][2]; ++ ++ + static inline uint32_t + __attribute ((always_inline)) + jisx0208_to_ucs4 (const unsigned char **s, size_t avail, unsigned char offset) diff --git a/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc-procfs.patch b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc-procfs.patch new file mode 100644 index 00000000..d5d82934 --- /dev/null +++ b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc-procfs.patch @@ -0,0 +1,62 @@ +First discussed here: +http://gcc.gnu.org/ml/gcc/2005-01/msg00509.html + +Revision 1.12, Wed Mar 2 20:11:38 2005 UTC by roland +Branch: MAIN +CVS Tags: fedora-glibc-20050303T1335, HEAD +Changes since 1.11: +3 -8 lines +Diff to previous 1.11 (colored) + +2005-02-21 Alan Modra <amodra@bigpond.net.au> + + * sysdeps/unix/sysv/linux/powerpc/sys/procfs.h (elf_vrreg_t): Don't + use __uint128_t. + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h?cvsroot=glibc +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h.diff?r1=1.11&r2=1.12&cvsroot=glibc + +Fixes + +In file included from ../linuxthreads_db/proc_service.h:20, + from ../linuxthreads_db/thread_dbP.h:7, + from ../linuxthreads/descr.h:44, + from ../linuxthreads/internals.h:30, + from ../linuxthreads/sysdeps/pthread/bits/libc-lock.h:27, + from ../sysdeps/generic/ldsodefs.h:38, + from ../sysdeps/unix/sysv/linux/ldsodefs.h:25, + from <stdin>:2: +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: error: syntax error before 'elf_vrreg_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: type defaults to 'int' in declaration of 'elf_vrreg_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:57: warning: data definition has no type or storage class +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: error: syntax error before 'elf_vrregset_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: type defaults to 'int' in declaration of 'elf_vrregset_t' +../sysdeps/unix/sysv/linux/powerpc/sys/procfs.h:58: warning: data definition has no type or storage class +make[2]: make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/csu' + + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h,v +retrieving revision 1.11 +retrieving revision 1.12 +diff -u -r1.11 -r1.12 +--- libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h 2003/12/17 23:09:34 1.11 ++++ libc/sysdeps/unix/sysv/linux/powerpc/sys/procfs.h 2005/03/02 20:11:38 1.12 +@@ -46,15 +46,10 @@ + typedef double elf_fpreg_t; + typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; + +-/* gcc 3.1 and newer support __uint128_t. */ +-#if !__GNUC_PREREQ(3,1) +-typedef struct { +- unsigned long u[4]; +-} __attribute((aligned(16))) __uint128_t; +-#endif +- + /* Altivec registers */ +-typedef __uint128_t elf_vrreg_t; ++typedef struct { ++ unsigned int u[4]; ++} __attribute__ ((aligned (16))) elf_vrreg_t; + typedef elf_vrreg_t elf_vrregset_t[ELF_NVRREG]; + #endif + diff --git a/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch new file mode 100644 index 00000000..949a203e --- /dev/null +++ b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc32.patch @@ -0,0 +1,42 @@ +Fixes + +../sysdeps/powerpc/powerpc32/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/powerpc/powerpc32/dl-machine.h:461: error: invalid storage class for function 'elf_machine_rela_relative' +../sysdeps/powerpc/powerpc32/dl-machine.h:469: error: invalid storage class for function 'elf_machine_lazy_rel' +make[2]: *** [/home/dank/queue/jobdir.dual2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/build-glibc/elf/dl-reloc.o] Error 1 + +diff -ur glibc-2.3-20050307.orig/sysdeps/powerpc/powerpc32/dl-machine.h glibc-2.3-20050307/sysdeps/powerpc/powerpc32/dl-machine.h +--- glibc-2.3-20050307.orig/sysdeps/powerpc/powerpc32/dl-machine.h Wed Jul 30 23:33:52 2003 ++++ glibc-2.3-20050307/sysdeps/powerpc/powerpc32/dl-machine.h Thu Mar 17 13:19:16 2005 +@@ -455,7 +455,14 @@ + } + } + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc, + void *const reloc_addr_arg) + { +@@ -463,7 +470,14 @@ + *reloc_addr = l_addr + reloc->r_addend; + } + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_lazy_rel (struct link_map *map, + Elf32_Addr l_addr, const Elf32_Rela *reloc) + { diff --git a/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch new file mode 100644 index 00000000..6844a9cd --- /dev/null +++ b/patches/glibc/2.3.5/glibc-2.3.4-allow-gcc-4.0-powerpc64.patch @@ -0,0 +1,60 @@ +Fixes: + +In file included from dynamic-link.h:22, + from dl-reloc.c:269: +../sysdeps/powerpc/powerpc64/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/powerpc/powerpc64/dl-machine.h:573: error: invalid storage class for function 'elf_machine_rela_relative' +../sysdeps/powerpc/powerpc64/dl-machine.h:607: error: invalid storage class for function 'elf_machine_rela' +../sysdeps/powerpc/powerpc64/dl-machine.h:889: error: invalid storage class for function 'elf_machine_lazy_rel' +make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc64-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/elf' + +--- glibc-2.3-20050307/sysdeps/powerpc/powerpc64/dl-machine.h.old Thu Mar 17 13:35:23 2005 ++++ glibc-2.3-20050307/sysdeps/powerpc/powerpc64/dl-machine.h Thu Mar 17 13:37:12 2005 +@@ -567,7 +567,14 @@ + const Elf64_Sym *refsym) + attribute_hidden; + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc, + void *const reloc_addr_arg) + { +@@ -598,7 +605,14 @@ + + /* Perform the relocation specified by RELOC and SYM (which is fully + resolved). MAP is the object containing the reloc. */ +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela (struct link_map *map, + const Elf64_Rela *reloc, + const Elf64_Sym *sym, +@@ -883,7 +897,14 @@ + MODIFIED_CODE_NOQUEUE (reloc_addr); + } + +-static inline void ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_lazy_rel (struct link_map *map, + Elf64_Addr l_addr, const Elf64_Rela *reloc) + { diff --git a/patches/glibc/2.3.5/glibc-2.3.4-memcmp.patch b/patches/glibc/2.3.5/glibc-2.3.4-memcmp.patch new file mode 100644 index 00000000..c01faf83 --- /dev/null +++ b/patches/glibc/2.3.5/glibc-2.3.4-memcmp.patch @@ -0,0 +1,46 @@ +Fixes + ../sysdeps/i386/i686/memcmp.S: Assembler messages: + ../sysdeps/i386/i686/memcmp.S:390: Error: can't resolve `.rodata' {.rodata section} - `memcmp' {.text section} +when building on macosx. + +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/i686/memcmp.S?cvsroot=glibc +Revision 1.4, Thu Apr 28 18:19:25 2005 UTC by drepper +Branch: MAIN +CVS Tags: fedora-glibc-20050503T0852 +Changes since 1.3: +2 -2 lines +Diff to previous 1.3 (colored) + +Move misplaced END. + +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/i386/i686/memcmp.S.diff?r1=1.3&r2=1.4&cvsroot=glibc + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/i386/i686/memcmp.S,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/sysdeps/i386/i686/memcmp.S 2004/04/01 23:28:37 1.3 ++++ libc/sysdeps/i386/i686/memcmp.S 2005/04/28 18:19:25 1.4 +@@ -1,5 +1,5 @@ + /* Compare two memory blocks for differences in the first COUNT bytes. +- Copyright (C) 2004 Free Software Foundation, Inc. ++ Copyright (C) 2004, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -350,6 +350,7 @@ + sbbl $-1, %eax + popl %esi + RETURN ++END (BP_SYM (memcmp)) + + .section .rodata + ALIGN (2) +@@ -387,7 +388,6 @@ + .long L(30bytes) - . + 0x78 + .long L(31bytes) - . + 0x7c + +-END (BP_SYM (memcmp)) + + #undef bcmp + weak_alias (BP_SYM (memcmp), BP_SYM (bcmp)) diff --git a/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc-4.0-wordexp.patch b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc-4.0-wordexp.patch new file mode 100644 index 00000000..1df59555 --- /dev/null +++ b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc-4.0-wordexp.patch @@ -0,0 +1,19 @@ +../sysdeps/generic/wordexp.c: In function 'exec_comm': +../sysdeps/generic/wordexp.c:815: sorry, unimplemented: inlining failed in call to 'exec_comm_child': function body not available +../sysdeps/generic/wordexp.c:900: sorry, unimplemented: called from here +make[2]: *** [/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/build-glibc/posix/wordexp.o] Error + +I had to add the keyword 'inline' to get it to compile: + +--- glibc-2.3-20050307/sysdeps/generic/wordexp.c.old 2005-03-12 08:54:15.709253928 -0800 ++++ glibc-2.3-20050307/sysdeps/generic/wordexp.c 2005-03-12 08:54:51.242852000 -0800 +@@ -809,7 +809,7 @@ + } + + /* Function called by child process in exec_comm() */ +-static void ++static inline void + internal_function __attribute__ ((always_inline)) + exec_comm_child (char *comm, int *fildes, int showerr, int noexec) + { + diff --git a/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-string.patch b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-string.patch new file mode 100644 index 00000000..7e2fdc8e --- /dev/null +++ b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-string.patch @@ -0,0 +1,83 @@ + +Fixes? the following error when building with gcc-4.0.0: + +../string/strcoll.c:39: error: '__EI_strcoll' aliased to undefined symbol '__GI_strcoll' +make[2]: *** [/home/dank/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/wcsmbs/wcscoll.os] Error 1 +make[2]: Leaving directory `/home/dank/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/glibc-2.3.4/wcsmbs' + + +Thu Mar 17 21:06:24 2005 UTC (3 weeks, 5 days ago) by roland +Branch: MAIN +CVS Tags: fedora-glibc-20050405T2114, fedora-glibc-20050401T1444, fedora-glibc-20050324T0715, fedora-glibc-20050319T1907, HEAD + +2005-03-16 Richard Henderson <rth@redhat.com> + + * include/wchar.h (__wcscoll): Remove. + * wcsmbs/wcscoll.c: Define wcscoll directly instead of via __wcscoll. + * string/strcoll.c: Don't issue libc_hidden_def STRCOLL redefined. + +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/string/strcoll.c.diff?r1=1.33&r2=1.34&cvsroot=glibc +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/include/wchar.h.diff?r1=1.26&r2=1.27&cvsroot=glibc +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/wcsmbs/wcscoll.c.diff?r1=1.13&r2=1.14&cvsroot=glibc + +=================================================================== +RCS file: /cvs/glibc/libc/string/strcoll.c,v +retrieving revision 1.33 +retrieving revision 1.34 +diff -u -r1.33 -r1.34 +--- libc/string/strcoll.c 2004/03/14 20:51:30 1.33 ++++ libc/string/strcoll.c 2005/03/17 21:06:24 1.34 +@@ -23,6 +23,7 @@ + # define STRING_TYPE char + # define STRCOLL strcoll + # define STRCOLL_L __strcoll_l ++# define USE_HIDDEN_DEF + #endif + + #include "../locale/localeinfo.h" +@@ -35,6 +36,7 @@ + { + return STRCOLL_L (s1, s2, _NL_CURRENT_LOCALE); + } +-#if !defined WIDE_CHAR_VERSION +-libc_hidden_def (strcoll) ++ ++#ifdef USE_HIDDEN_DEF ++libc_hidden_def (STRCOLL) + #endif +=================================================================== +RCS file: /cvs/glibc/libc/include/wchar.h,v +retrieving revision 1.26 +retrieving revision 1.27 +diff -u -r1.26 -r1.27 +--- libc/include/wchar.h 2004/03/14 20:45:10 1.26 ++++ libc/include/wchar.h 2005/03/17 21:06:24 1.27 +@@ -56,7 +56,6 @@ + extern int __wcsncasecmp (__const wchar_t *__s1, __const wchar_t *__s2, + size_t __n) + __attribute_pure__; +-extern int __wcscoll (__const wchar_t *__s1, __const wchar_t *__s2); + extern size_t __wcslen (__const wchar_t *__s) __attribute_pure__; + extern size_t __wcsnlen (__const wchar_t *__s, size_t __maxlen) + __attribute_pure__; +=================================================================== +RCS file: /cvs/glibc/libc/wcsmbs/wcscoll.c,v +retrieving revision 1.13 +retrieving revision 1.14 +diff -u -r1.13 -r1.14 +--- libc/wcsmbs/wcscoll.c 2004/03/14 21:05:48 1.13 ++++ libc/wcsmbs/wcscoll.c 2005/03/17 21:06:24 1.14 +@@ -22,12 +22,11 @@ + + #define STRING_TYPE wchar_t + #define USTRING_TYPE wint_t +-#define STRCOLL __wcscoll ++#define STRCOLL wcscoll + #define STRCOLL_L __wcscoll_l + + #include "../string/strcoll.c" + + #ifndef USE_IN_EXTENDED_LOCALE_MODEL +-weak_alias (__wcscoll, wcscoll) + libc_hidden_weak (wcscoll) + #endif diff --git a/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-symbols.patch b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-symbols.patch new file mode 100644 index 00000000..ace71e24 --- /dev/null +++ b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-symbols.patch @@ -0,0 +1,126 @@ +If I'm really lucky, this fixes the following error building with gcc-4.0.0: + +../sysdeps/ieee754/dbl-64/s_isinf.c:29: error: 'isinf' aliased to undefined symbol '__isinf' +make[2]: *** [/home/dank/queue/jobdir.fast/crosstool-0.32/build/i686-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/math/s_isinf.os] Error 1 +make[1]: *** [math/subdir_lib] Error 2 +make: *** [lib] Error 2 + +--- + + +Revision 1.71, Thu Mar 17 21:06:27 2005 UTC (3 weeks, 5 days ago) by roland +Branch: MAIN +CVS Tags: fedora-glibc-20050405T2114, fedora-glibc-20050401T1444, fedora-glibc-20050324T0715, fedora-glibc-20050319T1907, HEAD +Changes since 1.70: +11 -66 lines +Diff to previous 1.70 (colored) + +2005-03-16 Richard Henderson <rth@redhat.com> + + * include/libc-symbols.h (__hidden_proto): Remove bogus declaration + of internal. + (__hidden_def1, __hidden_dot_def1): Remove. + (__hidden_def2, __hidden_def3): Remove. + (__hidden_ver1): New. + (hidden_ver, hidden_def, hidden_weak): Use it. + (hidden_data_ver, hidden_data_ver, hidden_data_weak): Use non-data + version of the macro. + +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/include/libc-symbols.h.diff?r1=1.70&r2=1.71&cvsroot=glibc + +=================================================================== +RCS file: /cvs/glibc/libc/include/libc-symbols.h,v +retrieving revision 1.70 +retrieving revision 1.71 +diff -u -r1.70 -r1.71 +--- libc/include/libc-symbols.h 2005/02/11 00:29:46 1.70 ++++ libc/include/libc-symbols.h 2005/03/17 21:06:27 1.71 +@@ -583,78 +583,23 @@ + # define hidden_proto(name, attrs...) \ + __hidden_proto (name, __GI_##name, ##attrs) + # define __hidden_proto(name, internal, attrs...) \ +- extern __typeof (name) internal; \ + extern __typeof (name) name __asm__ (__hidden_asmname (#internal)) \ + __hidden_proto_hiddenattr (attrs); + # define __hidden_asmname(name) \ + __hidden_asmname1 (__USER_LABEL_PREFIX__, name) + # define __hidden_asmname1(prefix, name) __hidden_asmname2(prefix, name) + # define __hidden_asmname2(prefix, name) #prefix name +-# ifdef HAVE_ASM_SET_DIRECTIVE +-# define __hidden_def1(original, alias) \ +- ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \ +- .set C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original) +-# ifdef HAVE_ASM_GLOBAL_DOT_NAME +-# define __hidden_dot_def1(original, alias) ASM_LINE_SEP \ +- ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP \ +- .set C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original) +-# else +-# define __hidden_dot_def1(original, alias) +-# endif +-# else +-# define __hidden_def1(original, alias) \ +- ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME (alias) ASM_LINE_SEP \ +- C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) +-# ifdef HAVE_ASM_GLOBAL_DOT_NAME +-# define __hidden_dot_def1(original, alias) ASM_LINE_SEP \ +- ASM_GLOBAL_DIRECTIVE C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP \ +- C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original) +-# else +-# define __hidden_dot_def1(original, alias) +-# endif +-# endif +-# define __hidden_def2(...) #__VA_ARGS__ +-# define __hidden_def3(...) __hidden_def2 (__VA_ARGS__) +-# define hidden_def(name) \ +- __asm__ (__hidden_def3 (__hidden_def1 (__GI_##name, name) \ +- __hidden_dot_def1 (__GI_##name, name))); +-# define hidden_data_def(name) \ +- __asm__ (__hidden_def3 (__hidden_def1 (__GI_##name, name))); +-# define hidden_ver(local, name) \ +- __asm__ (__hidden_def3 (__hidden_def1 (local, __GI_##name) \ +- __hidden_dot_def1 (local, __GI_##name))); +-# define hidden_data_ver(local, name) \ +- __asm__ (__hidden_def3 (__hidden_def1 (local, __GI_##name))); +-# ifdef HAVE_WEAK_SYMBOLS +-# ifdef HAVE_ASM_WEAKEXT_DIRECTIVE +-# define __hidden_weak1(original, alias) \ +- .weakext C_SYMBOL_NAME (alias), C_SYMBOL_NAME (original) +-# ifdef HAVE_ASM_GLOBAL_DOT_NAME +-# define __hidden_dot_weak1(original, alias) ASM_LINE_SEP \ +- .weakext C_SYMBOL_DOT_NAME (alias), C_SYMBOL_DOT_NAME (original) +-# else +-# define __hidden_dot_weak1(original, alias) +-# endif +-# else /* ! HAVE_ASM_WEAKEXT_DIRECTIVE */ +-# define __hidden_weak1(original, alias) \ +- .weak C_SYMBOL_NAME (alias) ASM_LINE_SEP \ +- C_SYMBOL_NAME (alias) = C_SYMBOL_NAME (original) +-# ifdef HAVE_ASM_GLOBAL_DOT_NAME +-# define __hidden_dot_weak1(original, alias) ASM_LINE_SEP \ +- .weak C_SYMBOL_DOT_NAME (alias) ASM_LINE_SEP \ +- C_SYMBOL_DOT_NAME (alias) = C_SYMBOL_DOT_NAME (original) +-# else +-# define __hidden_dot_weak1(original, alias) +-# endif +-# endif +-# define hidden_weak(name) \ +- __asm__ (__hidden_def3 (__hidden_weak1 (__GI_##name, name) \ +- __hidden_dot_weak1 (__GI_##name, name))); +-# define hidden_data_weak(name) \ +- __asm__ (__hidden_def3 (__hidden_weak1 (__GI_##name, name))); +-# else +-# define hidden_weak(name) hidden_def (name) +-# endif ++# define __hidden_ver1(local, internal, name) \ ++ extern __typeof (name) __EI_##name __asm__(__hidden_asmname (#internal)); \ ++ extern __typeof (name) __EI_##name \ ++ __attribute__((alias (__hidden_asmname (#local)))) ++# define hidden_ver(local, name) __hidden_ver1(local, __GI_##name, name); ++# define hidden_data_ver(local, name) hidden_ver(local, name) ++# define hidden_def(name) __hidden_ver1(__GI_##name, name, name); ++# define hidden_data_def(name) hidden_def(name) ++# define hidden_weak(name) \ ++ __hidden_ver1(__GI_##name, name, name) __attribute__((weak)); ++# define hidden_data_weak(name) hidden_weak(name) + # else + /* For assembly, we need to do the opposite of what we do in C: + in assembly gcc __REDIRECT stuff is not in place, so functions diff --git a/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-wcstol_l.patch b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-wcstol_l.patch new file mode 100644 index 00000000..5637ce64 --- /dev/null +++ b/patches/glibc/2.3.5/glibc-2.3.5-allow-gcc4-wcstol_l.patch @@ -0,0 +1,57 @@ +Fixes +../sysdeps/wordsize-64/wcstol_l.c:11: error: '____wcstoll_l_internal' aliased to undefined symbol '____wcstol_l_internal' +../sysdeps/wordsize-64/wcstol_l.c:12: error: '__wcstoll_l' aliased to undefined symbol '__wcstol_l' +../sysdeps/wordsize-64/wcstol_l.c:13: error: 'wcstoll_l' aliased to undefined symbol '__wcstol_l' +make[2]: *** [/home/dkegel/queue/jobdir.produser_cpsm10/crosstool-0.32/build/x86_64-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/wcsmbs/wcstoul_l.o] Error 1 + +https://www.redhat.com/archives/fedora-cvs-commits/2005-March/msg00408.html +%changelog ++* Fri Mar 25 2005 Jakub Jelinek <jakub redhat com> 2.3.4-18 ++- fix build on 64-bit arches with new GCC + +Revision 1.4.2.1, Fri Mar 25 11:59:01 2005 UTC (3 weeks, 4 days ago) by jakub +Branch: fedora-branch +CVS Tags: fedora-glibc-2_3_4-18 +Changes since 1.4: +2 -0 lines +Diff to previous 1.4 (colored) + + * sysdeps/wordsize-64/strtol_l.c: Don't add aliases if UNSIGNED. + * sysdeps/wordsize-64/wcstol_l.c: Likewise. + + +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/wordsize-64/strtol_l.c.diff?r1=1.4&r2=1.4.2.1&cvsroot=glibc +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/wordsize-64/wcstol_l.c.diff?r1=1.4&r2=1.4.2.1&cvsroot=glibc + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/wordsize-64/strtol_l.c,v +retrieving revision 1.4 +retrieving revision 1.4.2.1 +diff -u -r1.4 -r1.4.2.1 +--- libc/sysdeps/wordsize-64/strtol_l.c 2003/03/03 09:45:12 1.4 ++++ libc/sysdeps/wordsize-64/strtol_l.c 2005/03/25 11:59:01 1.4.2.1 +@@ -8,7 +8,9 @@ + #undef ____strtoll_l_internal + #undef __strtoll_l + #undef strtoll_l ++#if !UNSIGNED + 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) ++#endif +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/wordsize-64/wcstol_l.c,v +retrieving revision 1.4 +retrieving revision 1.4.2.1 +diff -u -r1.4 -r1.4.2.1 +--- libc/sysdeps/wordsize-64/wcstol_l.c 2002/08/08 11:44:51 1.4 ++++ libc/sysdeps/wordsize-64/wcstol_l.c 2005/03/25 11:59:01 1.4.2.1 +@@ -8,6 +8,8 @@ + #undef ____wcstoll_l_internal + #undef __wcstoll_l + #undef wcstoll_l ++#if !UNSIGNED + strong_alias (____wcstol_l_internal, ____wcstoll_l_internal) + weak_alias (__wcstol_l, __wcstoll_l) + weak_alias (__wcstol_l, wcstoll_l) ++#endif diff --git a/patches/glibc/2.3.5/glibc-2.3.5-cygwin.patch b/patches/glibc/2.3.5/glibc-2.3.5-cygwin.patch new file mode 100644 index 00000000..8adea8bb --- /dev/null +++ b/patches/glibc/2.3.5/glibc-2.3.5-cygwin.patch @@ -0,0 +1,185 @@ +Fixes +elf/librtld.os: In function `process_envvars': : undefined reference to `__access' +... +when building glibc-2.3.x on cygwin + +Idea from +http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch +Basically, make glibc use .oST as suffix for 'object static' +instead of .oS, since cygwin has trouble distinguishing .os from .oS +(Original patch had .on, but .oST is more mnemonic for 'object static') + +glibc-linuxthreads-2.3.5 also requires a patch, see +../glibc-linuxthreads-2.3.5/glibc-linuxthreads-2.3.5-cygwin.patch + +[ forward ported to glibc-2.3.5 by Petr Cvachoucek: + +Message-ID: <4282FCBA.3040000@unicontrols.cz> +Date: Thu, 12 May 2005 08:50:34 +0200 +From: Petr Cvachoucek <cvachoucek@unicontrols.cz> +To: Dan Kegel <dank@kegel.com> +CC: crossgcc@sources.redhat.com +Subject: Patches to build gcc 3.4.3 / glibc 2.3.5 on cygwin + +Hi Dan, +following patches are needed to build gcc-3.4.3/glibc-2.3.5 toolchain +on cygwin. Tested to build toolchains for powerpc 604 and 750 targets. + +-- + Petr Cvachoucek + Unicontrols a.s. + http://www.unicontrols.cz +] + +diff -aur glibc-2.3.5/Makeconfig glibc-2.3.5-cygwin/Makeconfig +--- glibc-2.3.5/Makeconfig 2005-02-16 11:50:19.000000000 +0100 ++++ glibc-2.3.5-cygwin/Makeconfig 2005-05-11 08:24:51.046875000 +0200 +@@ -449,7 +449,7 @@ + # run the linked programs. + link-libc = -Wl,-rpath-link=$(rpath-link) \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib) ++ $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib) + # This is how to find at build-time things that will be installed there. + rpath-dirs = math elf dlfcn nss nis rt resolv crypt + endif +@@ -656,7 +656,7 @@ + # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX}) + # to pass different flags for each flavor. + libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o)) +-all-object-suffixes := .o .os .op .og .ob .oS ++all-object-suffixes := .o .os .op .og .ob .oST + object-suffixes := + CPPFLAGS-.o = $(pic-default) + CFLAGS-.o = $(filter %frame-pointer,$(+cflags)) +@@ -712,14 +712,14 @@ + + ifeq (yes,$(build-shared)) + # Build special library that contains the static-only routines for libc. +-object-suffixes-for-libc += .oS ++object-suffixes-for-libc += .oST + + # Must build the routines as PIC, though, because they can end up in (users') + # shared objects. We don't want to use CFLAGS-os because users may, for + # example, make that processor-specific. +-CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag) +-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1 +-libtype.oS = lib%_nonshared.a ++CFLAGS-.oST = $(CFLAGS-.o) $(PIC-ccflag) ++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1 ++libtype.oST = lib%_nonshared.a + endif + + # The assembler can generate debug information too. +diff -aur glibc-2.3.5/Makerules glibc-2.3.5-cygwin/Makerules +--- glibc-2.3.5/Makerules 2004-12-15 19:52:39.000000000 +0100 ++++ glibc-2.3.5-cygwin/Makerules 2005-05-11 08:25:33.578125000 +0200 +@@ -416,7 +416,7 @@ + # Bounded pointer thunks are only built for *.ob + elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks)) + +-elide-routines.oS += $(filter-out $(static-only-routines),\ ++elide-routines.oST += $(filter-out $(static-only-routines),\ + $(routines) $(aux) $(sysdep_routines)) \ + $(elide-bp-thunks) + elide-routines.os += $(static-only-routines) $(elide-bp-thunks) +@@ -961,7 +961,7 @@ + install: $(inst_libdir)/libc.so + $(inst_libdir)/libc.so: $(common-objpfx)format.lds \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)$(libc-name)) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -969,7 +969,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\ + ')' \ + ) > $@.new + mv -f $@.new $@ +diff -aur glibc-2.3.5/extra-lib.mk glibc-2.3.5-cygwin/extra-lib.mk +--- glibc-2.3.5/extra-lib.mk 2004-12-02 23:54:47.000000000 +0100 ++++ glibc-2.3.5-cygwin/extra-lib.mk 2005-05-11 08:27:28.156250000 +0200 +@@ -13,7 +13,7 @@ + + ifneq (,$($(lib)-static-only-routines)) + ifneq (,$(filter yesyes%,$(build-shared)$(elf)$($(lib).so-version))) +-object-suffixes-$(lib) += $(filter-out $($(lib)-inhibit-o),.oS) ++object-suffixes-$(lib) += $(filter-out $($(lib)-inhibit-o),.oST) + endif + endif + +@@ -29,7 +29,7 @@ + + # Add each flavor of library to the lists of things to build and install. + install-lib += $(foreach o,$(object-suffixes-$(lib)),$(lib:lib%=$(libtype$o))) +-extra-objs += $(foreach o,$(filter-out .os .oS,$(object-suffixes-$(lib))),\ ++extra-objs += $(foreach o,$(filter-out .os .oST,$(object-suffixes-$(lib))),\ + $(patsubst %,%$o,$(filter-out \ + $($(lib)-shared-only-routines),\ + $(all-$(lib)-routines)))) +@@ -57,7 +57,7 @@ + + + # Use o-iterator.mk to generate a rule for each flavor of library. +-ifneq (,$(filter-out .os .oS,$(object-suffixes-$(lib)))) ++ifneq (,$(filter-out .os .oST,$(object-suffixes-$(lib)))) + define o-iterator-doit + $(objpfx)$(patsubst %,$(libtype$o),$(lib:lib%=%)): \ + $(patsubst %,$(objpfx)%$o,\ +@@ -65,7 +65,7 @@ + $(all-$(lib)-routines))); \ + $$(build-extra-lib) + endef +-object-suffixes-left = $(filter-out .os .oS,$(object-suffixes-$(lib))) ++object-suffixes-left = $(filter-out .os .oST,$(object-suffixes-$(lib))) + include $(patsubst %,$(..)o-iterator.mk,$(object-suffixes-left)) + endif + +@@ -77,9 +77,9 @@ + $(build-extra-lib) + endif + +-ifneq (,$(filter .oS,$(object-suffixes-$(lib)))) +-$(objpfx)$(patsubst %,$(libtype.oS),$(lib:lib%=%)): \ +- $(patsubst %,$(objpfx)%.oS,\ ++ifneq (,$(filter .oST,$(object-suffixes-$(lib)))) ++$(objpfx)$(patsubst %,$(libtype.oST),$(lib:lib%=%)): \ ++ $(patsubst %,$(objpfx)%.oST,\ + $(filter $($(lib)-static-only-routines),\ + $(all-$(lib)-routines))) + $(build-extra-lib) +diff -aur glibc-2.3.5/nptl/Makefile glibc-2.3.5-cygwin/nptl/Makefile +--- glibc-2.3.5/nptl/Makefile 2005-02-16 09:45:56.000000000 +0100 ++++ glibc-2.3.5-cygwin/nptl/Makefile 2005-05-11 08:26:01.812500000 +0200 +@@ -360,7 +360,7 @@ + + $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \ + $(objpfx)libpthread.so$(libpthread.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)pthread) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -368,7 +368,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\ + ')' \ + ) > $@.new + mv -f $@.new $@ +diff -aur glibc-2.3.5/sysdeps/sparc/sparc32/sparcv9/Makefile glibc-2.3.5-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile +--- glibc-2.3.5/sysdeps/sparc/sparc32/sparcv9/Makefile 2004-08-16 08:46:14.000000000 +0200 ++++ glibc-2.3.5-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile 2005-05-11 08:26:25.937500000 +0200 +@@ -10,4 +10,4 @@ + ASFLAGS-.op += -Wa,-Av9a + ASFLAGS-.og += -Wa,-Av9a + ASFLAGS-.ob += -Wa,-Av9a +-ASFLAGS-.oS += -Wa,-Av9a ++ASFLAGS-.oST += -Wa,-Av9a diff --git a/patches/glibc/2.3.5/glibc-2.3.5-fix-pr631.patch b/patches/glibc/2.3.5/glibc-2.3.5-fix-pr631.patch new file mode 100644 index 00000000..2ef3ae32 --- /dev/null +++ b/patches/glibc/2.3.5/glibc-2.3.5-fix-pr631.patch @@ -0,0 +1,43 @@ +From dank@kegel.com +Wed Jun 15 09:12:43 PDT 2005 + +Fixes + +build-glibc/libc.a(nsswitch.o)(.data+0x64): undefined reference to `_nss_files_getaliasent_r' +build-glibc/libc.a(nsswitch.o)(.data+0x6c): undefined reference to `_nss_files_endaliasent' +... 53 lines deleted ... +build-glibc/libc.a(nsswitch.o)(.data+0x21c): undefined reference to `_nss_files_getspnam_r' +collect2: ld returned 1 exit status +make[2]: *** [/build/gcc-3.4.3-glibc-2.3.5-hdrs-2.6.11.2/i686-unknown-linux-gnu/build-glibc/elf/ldconfig] Error 1 + +when building glibc with --enable-static-nss. + +See http://sources.redhat.com/bugzilla/show_bug.cgi?id=631 + +--- glibc-2.3.5/Makeconfig.old Wed Jun 15 08:13:12 2005 ++++ glibc-2.3.5/Makeconfig Wed Jun 15 08:13:14 2005 +@@ -487,7 +487,7 @@ + + # The static libraries. + ifeq (yes,$(build-static)) +-link-libc-static = $(common-objpfx)libc.a $(static-gnulib) $(common-objpfx)libc.a ++link-libc-static = $(common-objpfx)libc.a $(static-gnulib) $(otherlibs) $(common-objpfx)libc.a + else + ifeq (yes,$(build-shared)) + # We can try to link the programs with lib*_pic.a... +--- glibc-2.3.5/elf/Makefile.old Wed Jun 15 07:46:49 2005 ++++ glibc-2.3.5/elf/Makefile Wed Jun 15 08:14:00 2005 +@@ -114,6 +114,13 @@ + install-bin-script = ldd + endif + ++ifeq (yes,$(build-static-nss)) ++nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss) ++resolvobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)resolv) ++otherlibs += $(nssobjdir)/libnss_files.a $(resolvobjdir)/libnss_dns.a \ ++ $(resolvobjdir)/libresolv.a ++endif ++ + others = sprof sln + install-bin = sprof + others-static = sln diff --git a/patches/glibc/2.3.5/glibc-2.3.5-sh-memset.patch b/patches/glibc/2.3.5/glibc-2.3.5-sh-memset.patch new file mode 100644 index 00000000..dcc7c9bd --- /dev/null +++ b/patches/glibc/2.3.5/glibc-2.3.5-sh-memset.patch @@ -0,0 +1,69 @@ +[http://sources.redhat.com/ml/crossgcc/2005-10/msg00035.html] + +Message-ID: <434576E1.6020305@sscd.de> +Date: Thu, 06 Oct 2005 21:11:29 +0200 +From: Alexander Sieb <sieb@sscd.de> +To: crossgcc@sourceware.org +Subject: Crosstool sh4-linux-gcc-4.0.2-glibc-2.3.5 patches + +Hi, + +attached you find the files I needed to add to crosstool-0.38 +in order to build a sh4-linux gcc-4.0.2-glibc-2.3.5 tool chain. + +Files attached: + +sh4-gcc4.dat: + * gcc4 needs --with-multilib-list=m4,m4-nofpu otherwise a linux + kernel won't build as it uses the -m4-nofpu option. + +gcc-pr21623.patch: + * Kaz Kojima provided a patch [really, a workaround -dank] for http://gcc.gnu.org/PR21623 + +glibc-2.3.5-sh-memset.patch: + * A patch for glibc-2.3.5 which corrects memset. From SUGIOKA Toshinobu. + See content for rationale. + +-- snip -- + +-- Here's patch 2 of 2, plus URLs showing where it is in CVS -- + +[http://sources.redhat.com/ml/glibc-cvs/2005-q3/msg00319.html] + +Date: 24 Jul 2005 22:54:32 -0000 +Message-ID: <20050724225432.2111.qmail@sourceware.org> +From: roland at sourceware dot org +To: glibc-cvs at sources dot redhat dot com +Subject: libc/sysdeps/sh memset.S + +CVSROOT: /cvs/glibc +Module name: libc +Changes by: roland@sources.redhat.com 2005-07-24 22:54:32 + +Modified files: + sysdeps/sh : memset.S + +Log message: + 2005-07-24 SUGIOKA Toshinobu <sugioka@itonet.co.jp> + + * sysdeps/sh/memset.S (memset): Correct 2nd argument handling. + +[http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/sh/memset.S.diff?cvsroot=glibc&r1=1.4&r2=1.5] + +RCS file: /cvs/glibc/libc/sysdeps/sh/memset.S,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/sysdeps/sh/memset.S 2003/04/29 22:47:18 1.4 ++++ libc/sysdeps/sh/memset.S 2005/07/24 22:54:32 1.5 +@@ -28,6 +28,7 @@ + bt.s L_byte_loop_init + mov r4,r7 + ++ extu.b r5,r5 + swap.b r5,r1 + or r1,r5 + swap.w r5,r1 + + +[See also http://sources.redhat.com/ml/libc-alpha/2005-07/msg00051.html] diff --git a/patches/glibc/2.3.5/glibc-configure-apple-as.patch b/patches/glibc/2.3.5/glibc-configure-apple-as.patch new file mode 100644 index 00000000..604c36d5 --- /dev/null +++ b/patches/glibc/2.3.5/glibc-configure-apple-as.patch @@ -0,0 +1,23 @@ +http://in3www.epfl.ch/~schaffne/glibc-configure-apple-as.patch +http://sources.redhat.com/ml/crossgcc/2004-02/msg00151.html + +The following makes it possible to configure glibc-2.3.2 on Mac OS X, +where the assembler but doesn't understand the --version flag. + +Fixes the symptom +checking whether ld is GNU ld... no +checking for /usr/libexec/gcc/darwin/ppc/as... /usr/libexec/gcc/darwin/ppc/as +checking version of /usr/libexec/gcc/darwin/ppc/as... +<PAUSES HERE AND JUST SITS THERE DOING NOTHING> + +--- glibc-2.3.2/configure~ Wed Feb 26 09:20:48 2003 ++++ glibc-2.3.2/configure Fri Feb 27 13:12:53 2004 +@@ -3789,7 +3789,7 @@ + # Found it, now check the version. + echo "$as_me:$LINENO: checking version of $AS" >&5 + echo $ECHO_N "checking version of $AS... $ECHO_C" >&6 +- ac_prog_version=`$AS --version 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'` ++ ac_prog_version=`$AS -v </dev/null 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 2.1[3-9]*) diff --git a/patches/glibc/2.3.5/glibc-fp-byteorder.patch b/patches/glibc/2.3.5/glibc-fp-byteorder.patch new file mode 100644 index 00000000..f20432ea --- /dev/null +++ b/patches/glibc/2.3.5/glibc-fp-byteorder.patch @@ -0,0 +1,203 @@ +Taken from http://sources.redhat.com/ml/crossgcc/2004-02/msg00104.html +Author: addsub@eyou.com +Target: ARM + +Fixes http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/920501-8.c +and makes printf("%f", 1.0) work. + +Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00115.html : + It ... fixes the 'printf("%f\n", 0.5); prints 0.000000' and general 'floating point + is broken' on my big-endian hardfloat FPA ARM platform. ... + It's definitely needed for hardfloat. So I'd think it's needed for + big-endian systems in any case, and for VFP on little-endian systems + too. Someone would have to verify that though. + +Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00123.html + I just had a look at glibc-20040830, and [this patch] is still needed and useful + for this version. glibc-20040830 out-of-the-box still contains the + following wrong assumptions: + - sysdeps/arm/bits/endian.h: float word order is big endian (which it is + not on vfp systems) + - sysdeps/arm/gmp-mparam.h: IEEE doubles are mixed endian (which they + are not on big endian systems, neither on vfp systems) + - sysdeps/arm/ieee754.h: IEEE doubles are in little endian byte order + (which they are not on big endian systems) + [This patch] seems the right solution for all of these issues. + +Dimitry Andric wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00132.html : + It's even needed for glibc CVS, AFAICS. + The patch hunk which modifies glibc.new/sysdeps/arm/bits/endian.h + (currently at version 1.4) is only needed for proper VFP operation. + But the hunk which modifies sysdeps/arm/gmp-mparam.h, and the hunk + that deletes sysdeps/arm/ieee754.h (yes, this IS correct), are needed + for proper operation of *any* FP model on big endian ARM. + +See also discussion in followups to +http://sources.redhat.com/ml/crossgcc/2004-05/msg00245.html) + +Message-ID: <276985760.37584@eyou.com> +Received: from unknown (HELO eyou.com) (172.16.2.2) + by 0.0.0.0 with SMTP; Tue, 17 Feb 2004 10:42:40 +0800 +Received: (qmail 8238 invoked by uid 65534); 17 Feb 2004 10:42:38 +0800 +Date: 17 Feb 2004 10:42:38 +0800 +Message-ID: <20040217104238.8237.qmail@eyou.com> +From: "add" <addsub@eyou.com> +To: dank@kegel.com +Reply-To: "add" <addsub@eyou.com> +Subject: Re: problem while building arm vfp softfloat gcc ` + +Hi, Dan, This is a patch I applied to my glibc-2.3.2, then my softfloat +toolchain can printf("%f\n",1.0). So you may have a try of this + + +diff -uNrp glibc.old/sysdeps/arm/bits/endian.h glibc.new/sysdeps/arm/bits/endian.h +--- glibc.old/sysdeps/arm/bits/endian.h 1999-04-12 11:59:13.000000000 -0400 ++++ glibc.new/sysdeps/arm/bits/endian.h 2004-02-12 09:15:13.000000000 -0500 +@@ -9,4 +9,9 @@ + #else + #define __BYTE_ORDER __LITTLE_ENDIAN + #endif ++ ++#ifdef __VFP_FP__ ++#define __FLOAT_WORD_ORDER __BYTE_ORDER ++#else + #define __FLOAT_WORD_ORDER __BIG_ENDIAN ++#endif +diff -uNrp glibc.old/sysdeps/arm/gmp-mparam.h glibc.new/sysdeps/arm/gmp-mparam.h +--- glibc.old/sysdeps/arm/gmp-mparam.h 2001-07-07 15:21:19.000000000 -0400 ++++ glibc.new/sysdeps/arm/gmp-mparam.h 2004-02-12 09:15:13.000000000 -0500 +@@ -26,5 +26,13 @@ MA 02111-1307, USA. */ + #define BITS_PER_SHORTINT 16 + #define BITS_PER_CHAR 8 + +-#define IEEE_DOUBLE_BIG_ENDIAN 0 +-#define IEEE_DOUBLE_MIXED_ENDIAN 1 ++#if defined(__ARMEB__) ++# define IEEE_DOUBLE_MIXED_ENDIAN 0 ++# define IEEE_DOUBLE_BIG_ENDIAN 1 ++#elif defined(__VFP_FP__) ++# define IEEE_DOUBLE_MIXED_ENDIAN 0 ++# define IEEE_DOUBLE_BIG_ENDIAN 0 ++#else ++# define IEEE_DOUBLE_BIG_ENDIAN 0 ++# define IEEE_DOUBLE_MIXED_ENDIAN 1 ++#endif +diff -uNrp glibc.old/sysdeps/arm/ieee754.h glibc.new/sysdeps/arm/ieee754.h +--- glibc.old/sysdeps/arm/ieee754.h 2001-07-07 15:21:19.000000000 -0400 ++++ glibc.new/sysdeps/arm/ieee754.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,115 +0,0 @@ +-/* Copyright (C) 1992, 1995, 1996, 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 _IEEE754_H +- +-#define _IEEE754_H 1 +-#include <features.h> +- +-#include <endian.h> +- +-__BEGIN_DECLS +- +-union ieee754_float +- { +- float f; +- +- /* This is the IEEE 754 single-precision format. */ +- struct +- { +- unsigned int mantissa:23; +- unsigned int exponent:8; +- unsigned int negative:1; +- } ieee; +- +- /* This format makes it easier to see if a NaN is a signalling NaN. */ +- struct +- { +- unsigned int mantissa:22; +- unsigned int quiet_nan:1; +- unsigned int exponent:8; +- unsigned int negative:1; +- } ieee_nan; +- }; +- +-#define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */ +- +- +-union ieee754_double +- { +- double d; +- +- /* This is the IEEE 754 double-precision format. */ +- struct +- { +- unsigned int mantissa0:20; +- unsigned int exponent:11; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- } ieee; +- +- /* This format makes it easier to see if a NaN is a signalling NaN. */ +- struct +- { +- unsigned int mantissa0:19; +- unsigned int quiet_nan:1; +- unsigned int exponent:11; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- } ieee_nan; +- }; +- +-#define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ +- +- +-/* The following two structures are correct for `new' floating point systems but +- wrong for the old FPPC. The only solution seems to be to avoid their use on +- old hardware. */ +- +-union ieee854_long_double +- { +- long double d; +- +- /* This is the IEEE 854 double-extended-precision format. */ +- struct +- { +- unsigned int exponent:15; +- unsigned int empty:16; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- unsigned int mantissa0:32; +- } ieee; +- +- /* This is for NaNs in the IEEE 854 double-extended-precision format. */ +- struct +- { +- unsigned int exponent:15; +- unsigned int empty:16; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- unsigned int mantissa0:30; +- unsigned int quiet_nan:1; +- unsigned int one:1; +- } ieee_nan; +- }; +- +-#define IEEE854_LONG_DOUBLE_BIAS 0x3fff +- +-__END_DECLS +- +-#endif /* ieee754.h */ diff --git a/patches/glibc/2.3.5/glibc-mips-bootstrap-gcc-header-install.patch b/patches/glibc/2.3.5/glibc-mips-bootstrap-gcc-header-install.patch new file mode 100644 index 00000000..38873ec6 --- /dev/null +++ b/patches/glibc/2.3.5/glibc-mips-bootstrap-gcc-header-install.patch @@ -0,0 +1,35 @@ +http://sourceware.org/ml/crossgcc/2005-05/msg00165.html +Fixes a MIPS build problem (unrelated to NPTL) + +Message-ID: <428E8B24.1000201@realitydiluted.com> +Date: Fri, 20 May 2005 20:13:08 -0500 +From: "Steven J dot Hill" <sjhill at realitydiluted dot com> +To: crossgcc at sources dot redhat dot com, toolchain at gentoo dot org, + Shay_Gal-On at pmc-sierra dot com, TheNop at gmx dot net +Subject: New NPTL patches for crosstools and MIPS NPTL patches.... + +Greetings. + +I have uploaded the latest NPTL patch for crosstool-0.34. I have also +uploaded a tarball of the patches necessary to build a MIPS NPTL +cross toolchain. To build a MIPS NPTL toolchain you will need the +released version of binutils-2.16 and the absolute latest GCC and +glibc code from the HEAD of cvs. Use the 'demo-mips-nptl.sh' script +to build the toolchain. Please report bugs or issues to the crossgcc +mailing list. Here is the link off of my FTP site: + + ftp://ftp.realitydiluted.com/crosstools/crosstool-0.34/ + +[Note: BOOTSTRAP_GCC is set by crosstool.sh when invoking make install-headers] + +diff -ur glibc-2.4.0-20050406/sysdeps/mips/mips32/Makefile glibc-2.4.0-20050406-patched/sysdeps/mips/mips32/Makefile +--- glibc-2.4.0-20050406/sysdeps/mips/mips32/Makefile 2003-03-29 02:15:28.000000000 -0600 ++++ glibc-2.4.0-20050406-patched/sysdeps/mips/mips32/Makefile 2005-04-12 21:36:51.318837655 -0500 +@@ -1,3 +1,7 @@ ++ifeq ($(filter -DBOOTSTRAP_GCC,$(CFLAGS)),) + ifeq ($(filter -mabi=32,$(CC)),) + CC += -mabi=32 + endif ++else ++CC += -D"_MIPS_SZPTR=32" ++endif diff --git a/patches/glibc/2.3.5/make-install-lib-all.patch b/patches/glibc/2.3.5/make-install-lib-all.patch new file mode 100644 index 00000000..38457228 --- /dev/null +++ b/patches/glibc/2.3.5/make-install-lib-all.patch @@ -0,0 +1,24 @@ +From http://svn.exactcode.de/t2/trunk/package/base/glibc32/make-install-lib-all.patch +Rule to install all needed libraries, not just the ones installed by install-lib, +yet not install programs. +Needed because we can't use the main install target, as we can't build programs before +we have the final gcc installed; linking fails because libeh.a is not present, +and glibc insists on linking programs with that library. + +diff -Naur glibc-2.3.4.orig/Makerules glibc-2.3.4/Makerules +--- glibc-2.3.4.orig/Makerules 2004-12-15 20:52:39.000000000 +0200 ++++ glibc-2.3.4/Makerules 2005-02-19 15:16:31.415125176 +0200 +@@ -844,6 +844,13 @@ + installed-libcs := $(foreach o,$(filter-out .os,$(object-suffixes-for-libc)),\ + $(inst_libdir)/$(patsubst %,$(libtype$o),\ + $(libprefix)$(libc-name))) ++ ++install-lib-all: $(inst_slibdir)/libc.so$(libc.so-version) \ ++ $(inst_slibdir)/libc-$(version).so \ ++ $(inst_libdir)/libc.so \ ++ $(inst_libdir)/libc.a \ ++ install-lib ++ + install: $(installed-libcs) + $(installed-libcs): $(inst_libdir)/lib$(libprefix)%: lib $(+force) + $(make-target-directory) diff --git a/patches/glibc/2.3.5/pr758.patch b/patches/glibc/2.3.5/pr758.patch new file mode 100644 index 00000000..d1142a2d --- /dev/null +++ b/patches/glibc/2.3.5/pr758.patch @@ -0,0 +1,256 @@ +See http://sources.redhat.com/bugzilla/show_bug.cgi?id=758 + +Submitted By: Jim Gifford (patches at jg555 dot com) +Date: 2005-02-23 +Initial Package Version: 2.3.4 +Origin: Richard Sandiford +Upstream Status: Unknown +Description: Fixes Syscall.h generation + +diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/Makefile glibc-2.3.4/sysdeps/unix/sysv/linux/mips/Makefile +--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/Makefile 2004-11-24 04:38:15 +0000 ++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/Makefile 2005-02-23 18:21:54 +0000 +@@ -9,11 +9,73 @@ + + no_syscall_list_h = 1 + +-# Generate the list of SYS_* macros for the system calls (__NR_* macros). +-# We generate not only SYS_<syscall>, pointing at SYS_<abi>_<syscall> if +-# it exists, but also define SYS_<abi>_<syscall> for all ABIs. ++# A callable macro that expands to a shell command. Preprocess file $(1) ++# using ABI option $(2) and see which macros it defines. Print FOO for each ++# macro of the form __NR$(3)_FOO, filtering out ABI-specific __NR macros ++# that have a prefix other than $(3). ++mips_list_syscalls = $(filter-out -m%,$(CC)) -E -x c $(+includes) \ ++ $(sysincludes) -D_LIBC -dM -mabi=$(2) $(1) | \ ++ sed -n 's@^\#define __NR$(3)_\([^ ]*\) .*@\1@p' | \ ++ sed -e '/^[ON]32_/d' -e '/^N64_/d' -e '/^64_/d' | \ ++ LC_ALL=C sort ++ ++# Generate a list of SYS_* macros from the linux __NR macros. ++# ++# Before version 2.6, linux had separate 32-bit and 64-bit MIPS ports, ++# each with its own set of headers. The ports were merged for 2.6 and ++# this merged port defines the syscalls in a slightly different way. ++# There are therefore three sets of headers that we need to consider: ++# ++# (1) Headers from the separate 32-bit MIPS port. They just define ++# a single list of __NR macros. ++# ++# (2) Headers from the separate 64-bit MIPS port. They unconditionally ++# define syscalls for all three ABIs, with o32 syscalls prefixed ++# by __NR_O32, n32 syscalls prefixed by __NR_N32 and n64 syscalls ++# prefixed by plain __NR. ++# ++# (3) Headers from the combined port. They use the _MIPS_SIM macro to ++# define the right set of syscalls for the current ABI. The syscalls ++# themselves have no special ABI prefix, but the headers also define: ++# ++# __NR_O32_Linux{,_syscalls} ++# __NR_N32_Linux{,_syscalls} ++# __NR_64_Linux{,_syscalls} ++# ++# In case (1) we just want a simple list of SYS_* macros. In cases (2) ++# and (3) we want a file that will work for all three ABIs, regardless ++# of which ABI we are currently using. We also want the file to work ++# if the user later moves from (2) to (3). Thus the file we create ++# for (2) and (3) has the form: ++# ++# #if _MIPS_SIM == _MIPS_SIM_NABI32 ++# # ifdef __NR_N32_open ++# # define SYS_n32syscall1 __NR_N32_n32syscall1 ++# # ... ++# # else ++# # define SYS_n32syscall1 __NR_n32syscall1 ++# # ... ++# # endif ++# #elif _MIPS_SIM == _MIPS_SIM_ABI64 ++# # define SYS_n64syscall1 __NR_n64syscall1 ++# # ... ++# #else ++# # ifdef __NR_O32_open ++# # define SYS_o32syscall1 __NR_O32_o32syscall1 ++# # ... ++# # else ++# # define SYS_o32syscall1 __NR_o32syscall1 ++# # ... ++# # endif ++# #endif ++# ++# Here, __NR_N32_open and __NR_O32_open are used to detect case (2) ++# over case (3). The n64 SYS_* macros can always use the normal ++# ABI-less names. + $(objpfx)syscall-%.h $(objpfx)syscall-%.d: ../sysdeps/unix/sysv/linux/mips/sys/syscall.h + $(make-target-directory) ++ $(CC) -E -x c $(+includes) $(sysincludes) -D_LIBC $< -MD -MP \ ++ -MF $(@:.h=.d)-t -MT '$(@:.d=.h) $(@:.h=.d)' > /dev/null + { \ + echo '/* Generated at libc build time from kernel syscall list. */';\ + echo ''; \ +@@ -22,28 +84,38 @@ + echo '#endif'; \ + echo ''; \ + echo '#include <sgidefs.h>'; \ +- rm -f $(@:.d=.h).newt; \ +- $(CC) -E -MD -MP -MF $(@:.h=.d)-t -MT '$(@:.d=.h) $(@:.h=.d)' \ +- -x c $(+includes) $(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 \ ++ rm -f $(@:.d=.h).new32 $(@:.d=.h).newn32 $(@:.d=.h).new64; \ ++ $(call mips_list_syscalls,$<,n32,_N32) > $(@:.d=.h).newn32; \ ++ if test -s $(@:.d=.h).newn32; then \ ++ if grep open $(@:.d=.h).newn32 > /dev/null; then \ ++ $(call mips_list_syscalls,$<,32,_O32) > $(@:.d=.h).new32; \ ++ $(call mips_list_syscalls,$<,64,) > $(@:.d=.h).new64; \ ++ else \ ++ $(call mips_list_syscalls,$<,32,) > $(@:.d=.h).new32; \ ++ $(call mips_list_syscalls,$<,n32,) > $(@:.d=.h).newn32; \ ++ $(call mips_list_syscalls,$<,64,) > $(@:.d=.h).new64; \ ++ fi; \ + echo '#if _MIPS_SIM == _ABIN32'; \ +- sed -n 's/^\(#define SYS_\)N32_/\1/p' < $(@:.d=.h).newt | \ +- LC_ALL=C sort; \ ++ echo '# ifdef __NR_N32_open'; \ ++ sed 's@\(.*\)@# define SYS_\1 __NR_N32_\1@' < $(@:.d=.h).newn32; \ ++ echo '# else'; \ ++ sed 's@\(.*\)@# define SYS_\1 __NR_\1@' < $(@:.d=.h).newn32; \ ++ echo '# endif'; \ + echo '#elif _MIPS_SIM == _ABI64'; \ +- sed -n 's/^\(#define SYS_\)N64_/\1/p' < $(@:.d=.h).newt | \ +- LC_ALL=C sort; \ ++ sed 's@\(.*\)@# define SYS_\1 __NR_\1@' < $(@:.d=.h).new64; \ + echo '#else'; \ +- sed -n 's/^\(#define SYS_\)O32_/\1/p' < $(@:.d=.h).newt | \ +- LC_ALL=C sort; \ ++ echo '# ifdef __NR_O32_open'; \ ++ sed 's@\(.*\)@# define SYS_\1 __NR_O32_\1@' < $(@:.d=.h).new32; \ ++ echo '# else'; \ ++ sed 's@\(.*\)@# define SYS_\1 __NR_\1@' < $(@:.d=.h).new32; \ ++ echo '# endif'; \ + echo '#endif'; \ +- sed -n '/^#define SYS_\([ON]32\|N64\)_/p' < $(@:.d=.h).newt | \ +- LC_ALL=C sort +1.8; \ + else \ +- cat $(@:.d=.h).newt; \ ++ $(CC) -E -x c $(+includes) $(sysincludes) -D_LIBC -dM $< | \ ++ sed -n 's@^\#define __NR_\([^ ]*\) .*@\#define SYS_\1 __NR_\1@p' | \ ++ LC_ALL=C sort; \ + fi; \ +- rm $(@:.d=.h).newt; \ ++ rm -f $(@:.d=.h).new32 $(@:.d=.h).newn32 $(@:.d=.h).new64; \ + } > $(@:.d=.h).new + mv -f $(@:.d=.h).new $(@:.d=.h) + ifneq (,$(objpfx)) +diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure +--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure 2004-11-24 04:42:45 +0000 ++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure 2005-02-23 18:10:11 +0000 +@@ -18,7 +18,7 @@ + { 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>' > asm-unistd.h +- else ++ elif grep __NR_N32_open "$asm_unistd_h" > /dev/null; then + # The point of this preprocessing is to turn __NR_<syscall> into + # __NR_N64_<syscall>, as well as to define __NR_<syscall> to + # __NR_<abi>_<syscall>, if __NR_<abi>_<syscall> is defined +@@ -68,6 +68,8 @@ + { + print; + }' ++ else ++ echo '#include <asm/unistd.h>' > asm-unistd.h + fi ;; + mips*) + rm -f asm-unistd.h +diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure.in glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure.in +--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure.in 2004-11-24 04:38:31 +0000 ++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure.in 2005-02-23 18:10:11 +0000 +@@ -18,7 +18,7 @@ + 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>' > asm-unistd.h +- else ++ elif grep __NR_N32_open "$asm_unistd_h" > /dev/null; then + # The point of this preprocessing is to turn __NR_<syscall> into + # __NR_N64_<syscall>, as well as to define __NR_<syscall> to + # __NR_<abi>_<syscall>, if __NR_<abi>_<syscall> is defined +@@ -68,6 +68,8 @@ + { + print; + }' ++ else ++ echo '#include <asm/unistd.h>' > asm-unistd.h + fi ;; + mips*) + rm -f asm-unistd.h +diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h +--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h 2003-03-29 08:15:29 +0000 ++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h 2005-02-23 18:10:11 +0000 +@@ -1,36 +0,0 @@ +-/* 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 <sysdeps/unix/sysv/linux/mips/mips32/sysdep.h> +- +-/* 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 -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h +--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h 2004-10-18 05:16:07 +0000 ++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h 2005-02-23 18:10:11 +0000 +@@ -28,9 +28,9 @@ + so we have to redefine the `SYS_ify' macro here. */ + #undef SYS_ify + #ifdef __STDC__ +-# define SYS_ify(syscall_name) __NR_N32_##syscall_name ++# define SYS_ify(syscall_name) __NR_##syscall_name + #else +-# define SYS_ify(syscall_name) __NR_N32_/**/syscall_name ++# define SYS_ify(syscall_name) __NR_/**/syscall_name + #endif + + #ifdef __ASSEMBLER__ +diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h +--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h 2004-10-18 05:16:08 +0000 ++++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h 2005-02-23 18:10:11 +0000 +@@ -28,9 +28,9 @@ + so we have to redefine the `SYS_ify' macro here. */ + #undef SYS_ify + #ifdef __STDC__ +-# define SYS_ify(syscall_name) __NR_N64_##syscall_name ++# define SYS_ify(syscall_name) __NR_##syscall_name + #else +-# define SYS_ify(syscall_name) __NR_N64_/**/syscall_name ++# define SYS_ify(syscall_name) __NR_/**/syscall_name + #endif + + #ifdef __ASSEMBLER__ diff --git a/patches/glibc/2.3.6/arm-ctl_bus_isa.patch b/patches/glibc/2.3.6/arm-ctl_bus_isa.patch new file mode 100644 index 00000000..413c685a --- /dev/null +++ b/patches/glibc/2.3.6/arm-ctl_bus_isa.patch @@ -0,0 +1,53 @@ +Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004. +Needed to build glibc with linux kernels 2.4.23 or higher on ARM, +Fixes following error: + +../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys': +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]') +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]') +make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1 + +cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA", http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html + +--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old 2003-02-20 14:22:24.000000000 -0800 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c 2004-01-31 16:01:50.000000000 -0800 +@@ -47,6 +47,12 @@ + #include <asm/page.h> + #include <sys/sysctl.h> + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include <linux/version.h> ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23)) ++#define CTL_BUS_ISA BUS_ISA /* and hope it's not the one from linux/input.h */ ++#endif ++ + #define PATH_ARM_SYSTYPE "/etc/arm_systype" + #define PATH_CPUINFO "/proc/cpuinfo" + +@@ -80,7 +86,7 @@ + * Initialize I/O system. There are several ways to get the information + * we need. Each is tried in turn until one succeeds. + * +- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*). This is the preferred method ++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*). This is the preferred method + * but not all kernels support it. + * + * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE. +@@ -100,8 +106,8 @@ + { + char systype[256]; + int i, n; +- static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE }; +- static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT }; ++ static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE }; ++ static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT }; + size_t len = sizeof(io.base); + + if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0) + +Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> diff --git a/patches/glibc/2.3.6/fix-pr398.patch b/patches/glibc/2.3.6/fix-pr398.patch new file mode 100644 index 00000000..d5d03091 --- /dev/null +++ b/patches/glibc/2.3.6/fix-pr398.patch @@ -0,0 +1,70 @@ +Fixes error + +dl-runtime.c:222: error: parse error before "CFI_STARTPROC" +make[2]: *** [crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/build-glibc/elf/dl-runtim +e.o] Error 1 +make[2]: Leaving directory `crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040 +822/elf' +make[1]: *** [elf/subdir_lib] Error 2 +make[1]: Leaving directory `crosstool-0.28-rc35/build/s390-unknown-linux-gnu/gcc-3.4.1-glibc-20040822/glibc-20040 +822' +make: *** [all] Error 2 + +----------------- + +See http://sources.redhat.com/bugzilla/show_bug.cgi?id=398 +http://sources.redhat.com/ml/libc-alpha/2004-07/msg00023.html + +----------------- + +CVSROOT: /cvs/glibc +Module name: libc +Branch: glibc-2_3-branch +Changes by: roland@sources.redhat.com 2006-02-23 22:36:51 + +Modified files: + sysdeps/s390/s390-64: dl-machine.h + sysdeps/s390/s390-32: dl-machine.h + +Log message: + 2004-07-10 GOTO Masanori <gotom@debian.or.jp> + + [BZ #398] + * sysdeps/s390/s390-32/dl-machine.h: Include <sysdep.h> for CFI + directive. + * sysdeps/s390/s390-64/dl-machine.h: Likewise. + +Patches: +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/s390/s390-64/dl-machine.h.diff?cvsroot=glibc&only_with_tag=glibc-2_3-branch&r1=1.19.4.1&r2=1.19.4.2 +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/s390/s390-32/dl-machine.h.diff?cvsroot=glibc&only_with_tag=glibc-2_3-branch&r1=1.20.4.1&r2=1.20.4.2 + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/s390/s390-64/dl-machine.h,v +retrieving revision 1.19.4.1 +retrieving revision 1.19.4.2 +diff -u -r1.19.4.1 -r1.19.4.2 +--- libc/sysdeps/s390/s390-64/dl-machine.h 2005/10/17 04:57:27 1.19.4.1 ++++ libc/sysdeps/s390/s390-64/dl-machine.h 2006/02/23 22:36:51 1.19.4.2 +@@ -27,6 +27,7 @@ + #include <sys/param.h> + #include <string.h> + #include <link.h> ++#include <sysdep.h> + + /* This is an older, now obsolete value. */ + #define EM_S390_OLD 0xA390 +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/s390/s390-32/dl-machine.h,v +retrieving revision 1.20.4.1 +retrieving revision 1.20.4.2 +diff -u -r1.20.4.1 -r1.20.4.2 +--- libc/sysdeps/s390/s390-32/dl-machine.h 2005/10/17 04:57:27 1.20.4.1 ++++ libc/sysdeps/s390/s390-32/dl-machine.h 2006/02/23 22:36:51 1.20.4.2 +@@ -27,6 +27,7 @@ + #include <sys/param.h> + #include <string.h> + #include <link.h> ++#include <sysdep.h> + + /* This is an older, now obsolete value. */ + #define EM_S390_OLD 0xA390 diff --git a/patches/glibc/2.3.6/glibc-2.3.5-allow-gcc-4.0-wordexp.patch b/patches/glibc/2.3.6/glibc-2.3.5-allow-gcc-4.0-wordexp.patch new file mode 100644 index 00000000..996359a8 --- /dev/null +++ b/patches/glibc/2.3.6/glibc-2.3.5-allow-gcc-4.0-wordexp.patch @@ -0,0 +1,21 @@ +../sysdeps/generic/wordexp.c: In function 'exec_comm': +../sysdeps/generic/wordexp.c:815: sorry, unimplemented: inlining failed in call to 'exec_comm_child': function body not available +../sysdeps/generic/wordexp.c:900: sorry, unimplemented: called from here +make[2]: *** [/home/dank/queue/jobdir.fast2/crosstool-dev/build/i686-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/build-glibc/posix/wordexp.o] Error + +I had to add the keyword 'inline' to get it to compile: + +--- glibc-2.3-20050307/sysdeps/generic/wordexp.c.old 2005-03-12 08:54:15.709253928 -0800 ++++ glibc-2.3-20050307/sysdeps/generic/wordexp.c 2005-03-12 08:54:51.242852000 -0800 +@@ -809,7 +809,7 @@ + } + + /* Function called by child process in exec_comm() */ +-static void ++static inline void + internal_function __attribute__ ((always_inline)) + exec_comm_child (char *comm, int *fildes, int showerr, int noexec) + { + + +Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> diff --git a/patches/glibc/2.3.6/glibc-2.3.5-allow-gcc4-wcstol_l.patch b/patches/glibc/2.3.6/glibc-2.3.5-allow-gcc4-wcstol_l.patch new file mode 100644 index 00000000..0e6776f3 --- /dev/null +++ b/patches/glibc/2.3.6/glibc-2.3.5-allow-gcc4-wcstol_l.patch @@ -0,0 +1,59 @@ +Fixes +../sysdeps/wordsize-64/wcstol_l.c:11: error: '____wcstoll_l_internal' aliased to undefined symbol '____wcstol_l_internal' +../sysdeps/wordsize-64/wcstol_l.c:12: error: '__wcstoll_l' aliased to undefined symbol '__wcstol_l' +../sysdeps/wordsize-64/wcstol_l.c:13: error: 'wcstoll_l' aliased to undefined symbol '__wcstol_l' +make[2]: *** [/home/dkegel/queue/jobdir.produser_cpsm10/crosstool-0.32/build/x86_64-unknown-linux-gnu/gcc-4.0.0-20050410-glibc-2.3.4/build-glibc/wcsmbs/wcstoul_l.o] Error 1 + +https://www.redhat.com/archives/fedora-cvs-commits/2005-March/msg00408.html +%changelog ++* Fri Mar 25 2005 Jakub Jelinek <jakub redhat com> 2.3.4-18 ++- fix build on 64-bit arches with new GCC + +Revision 1.4.2.1, Fri Mar 25 11:59:01 2005 UTC (3 weeks, 4 days ago) by jakub +Branch: fedora-branch +CVS Tags: fedora-glibc-2_3_4-18 +Changes since 1.4: +2 -0 lines +Diff to previous 1.4 (colored) + + * sysdeps/wordsize-64/strtol_l.c: Don't add aliases if UNSIGNED. + * sysdeps/wordsize-64/wcstol_l.c: Likewise. + + +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/wordsize-64/strtol_l.c.diff?r1=1.4&r2=1.4.2.1&cvsroot=glibc +http://sourceware.org/cgi-bin/cvsweb.cgi/libc/sysdeps/wordsize-64/wcstol_l.c.diff?r1=1.4&r2=1.4.2.1&cvsroot=glibc + +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/wordsize-64/strtol_l.c,v +retrieving revision 1.4 +retrieving revision 1.4.2.1 +diff -u -r1.4 -r1.4.2.1 +--- libc/sysdeps/wordsize-64/strtol_l.c 2003/03/03 09:45:12 1.4 ++++ libc/sysdeps/wordsize-64/strtol_l.c 2005/03/25 11:59:01 1.4.2.1 +@@ -8,7 +8,9 @@ + #undef ____strtoll_l_internal + #undef __strtoll_l + #undef strtoll_l ++#if !UNSIGNED + 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) ++#endif +=================================================================== +RCS file: /cvs/glibc/libc/sysdeps/wordsize-64/wcstol_l.c,v +retrieving revision 1.4 +retrieving revision 1.4.2.1 +diff -u -r1.4 -r1.4.2.1 +--- libc/sysdeps/wordsize-64/wcstol_l.c 2002/08/08 11:44:51 1.4 ++++ libc/sysdeps/wordsize-64/wcstol_l.c 2005/03/25 11:59:01 1.4.2.1 +@@ -8,6 +8,8 @@ + #undef ____wcstoll_l_internal + #undef __wcstoll_l + #undef wcstoll_l ++#if !UNSIGNED + strong_alias (____wcstol_l_internal, ____wcstoll_l_internal) + weak_alias (__wcstol_l, __wcstoll_l) + weak_alias (__wcstol_l, wcstoll_l) ++#endif + +Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> diff --git a/patches/glibc/2.3.6/glibc-2.3.5-cygwin.patch b/patches/glibc/2.3.6/glibc-2.3.5-cygwin.patch new file mode 100644 index 00000000..423a1c50 --- /dev/null +++ b/patches/glibc/2.3.6/glibc-2.3.5-cygwin.patch @@ -0,0 +1,187 @@ +Fixes +elf/librtld.os: In function `process_envvars': : undefined reference to `__access' +... +when building glibc-2.3.x on cygwin + +Idea from +http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch +Basically, make glibc use .oST as suffix for 'object static' +instead of .oS, since cygwin has trouble distinguishing .os from .oS +(Original patch had .on, but .oST is more mnemonic for 'object static') + +glibc-linuxthreads-2.3.5 also requires a patch, see +../glibc-linuxthreads-2.3.5/glibc-linuxthreads-2.3.5-cygwin.patch + +[ forward ported to glibc-2.3.5 by Petr Cvachoucek: + +Message-ID: <4282FCBA.3040000@unicontrols.cz> +Date: Thu, 12 May 2005 08:50:34 +0200 +From: Petr Cvachoucek <cvachoucek@unicontrols.cz> +To: Dan Kegel <dank@kegel.com> +CC: crossgcc@sources.redhat.com +Subject: Patches to build gcc 3.4.3 / glibc 2.3.5 on cygwin + +Hi Dan, +following patches are needed to build gcc-3.4.3/glibc-2.3.5 toolchain +on cygwin. Tested to build toolchains for powerpc 604 and 750 targets. + +-- + Petr Cvachoucek + Unicontrols a.s. + http://www.unicontrols.cz +] + +diff -aur glibc-2.3.5/Makeconfig glibc-2.3.5-cygwin/Makeconfig +--- glibc-2.3.5/Makeconfig 2005-02-16 11:50:19.000000000 +0100 ++++ glibc-2.3.5-cygwin/Makeconfig 2005-05-11 08:24:51.046875000 +0200 +@@ -449,7 +449,7 @@ + # run the linked programs. + link-libc = -Wl,-rpath-link=$(rpath-link) \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib) ++ $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib) + # This is how to find at build-time things that will be installed there. + rpath-dirs = math elf dlfcn nss nis rt resolv crypt + endif +@@ -656,7 +656,7 @@ + # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX}) + # to pass different flags for each flavor. + libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o)) +-all-object-suffixes := .o .os .op .og .ob .oS ++all-object-suffixes := .o .os .op .og .ob .oST + object-suffixes := + CPPFLAGS-.o = $(pic-default) + CFLAGS-.o = $(filter %frame-pointer,$(+cflags)) +@@ -712,14 +712,14 @@ + + ifeq (yes,$(build-shared)) + # Build special library that contains the static-only routines for libc. +-object-suffixes-for-libc += .oS ++object-suffixes-for-libc += .oST + + # Must build the routines as PIC, though, because they can end up in (users') + # shared objects. We don't want to use CFLAGS-os because users may, for + # example, make that processor-specific. +-CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag) +-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1 +-libtype.oS = lib%_nonshared.a ++CFLAGS-.oST = $(CFLAGS-.o) $(PIC-ccflag) ++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1 ++libtype.oST = lib%_nonshared.a + endif + + # The assembler can generate debug information too. +diff -aur glibc-2.3.5/Makerules glibc-2.3.5-cygwin/Makerules +--- glibc-2.3.5/Makerules 2004-12-15 19:52:39.000000000 +0100 ++++ glibc-2.3.5-cygwin/Makerules 2005-05-11 08:25:33.578125000 +0200 +@@ -416,7 +416,7 @@ + # Bounded pointer thunks are only built for *.ob + elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks)) + +-elide-routines.oS += $(filter-out $(static-only-routines),\ ++elide-routines.oST += $(filter-out $(static-only-routines),\ + $(routines) $(aux) $(sysdep_routines)) \ + $(elide-bp-thunks) + elide-routines.os += $(static-only-routines) $(elide-bp-thunks) +@@ -961,7 +961,7 @@ + install: $(inst_libdir)/libc.so + $(inst_libdir)/libc.so: $(common-objpfx)format.lds \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)$(libc-name)) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -969,7 +969,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\ + ')' \ + ) > $@.new + mv -f $@.new $@ +diff -aur glibc-2.3.5/extra-lib.mk glibc-2.3.5-cygwin/extra-lib.mk +--- glibc-2.3.5/extra-lib.mk 2004-12-02 23:54:47.000000000 +0100 ++++ glibc-2.3.5-cygwin/extra-lib.mk 2005-05-11 08:27:28.156250000 +0200 +@@ -13,7 +13,7 @@ + + ifneq (,$($(lib)-static-only-routines)) + ifneq (,$(filter yesyes%,$(build-shared)$(elf)$($(lib).so-version))) +-object-suffixes-$(lib) += $(filter-out $($(lib)-inhibit-o),.oS) ++object-suffixes-$(lib) += $(filter-out $($(lib)-inhibit-o),.oST) + endif + endif + +@@ -29,7 +29,7 @@ + + # Add each flavor of library to the lists of things to build and install. + install-lib += $(foreach o,$(object-suffixes-$(lib)),$(lib:lib%=$(libtype$o))) +-extra-objs += $(foreach o,$(filter-out .os .oS,$(object-suffixes-$(lib))),\ ++extra-objs += $(foreach o,$(filter-out .os .oST,$(object-suffixes-$(lib))),\ + $(patsubst %,%$o,$(filter-out \ + $($(lib)-shared-only-routines),\ + $(all-$(lib)-routines)))) +@@ -57,7 +57,7 @@ + + + # Use o-iterator.mk to generate a rule for each flavor of library. +-ifneq (,$(filter-out .os .oS,$(object-suffixes-$(lib)))) ++ifneq (,$(filter-out .os .oST,$(object-suffixes-$(lib)))) + define o-iterator-doit + $(objpfx)$(patsubst %,$(libtype$o),$(lib:lib%=%)): \ + $(patsubst %,$(objpfx)%$o,\ +@@ -65,7 +65,7 @@ + $(all-$(lib)-routines))); \ + $$(build-extra-lib) + endef +-object-suffixes-left = $(filter-out .os .oS,$(object-suffixes-$(lib))) ++object-suffixes-left = $(filter-out .os .oST,$(object-suffixes-$(lib))) + include $(patsubst %,$(..)o-iterator.mk,$(object-suffixes-left)) + endif + +@@ -77,9 +77,9 @@ + $(build-extra-lib) + endif + +-ifneq (,$(filter .oS,$(object-suffixes-$(lib)))) +-$(objpfx)$(patsubst %,$(libtype.oS),$(lib:lib%=%)): \ +- $(patsubst %,$(objpfx)%.oS,\ ++ifneq (,$(filter .oST,$(object-suffixes-$(lib)))) ++$(objpfx)$(patsubst %,$(libtype.oST),$(lib:lib%=%)): \ ++ $(patsubst %,$(objpfx)%.oST,\ + $(filter $($(lib)-static-only-routines),\ + $(all-$(lib)-routines))) + $(build-extra-lib) +diff -aur glibc-2.3.5/nptl/Makefile glibc-2.3.5-cygwin/nptl/Makefile +--- glibc-2.3.5/nptl/Makefile 2005-02-16 09:45:56.000000000 +0100 ++++ glibc-2.3.5-cygwin/nptl/Makefile 2005-05-11 08:26:01.812500000 +0200 +@@ -360,7 +360,7 @@ + + $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \ + $(objpfx)libpthread.so$(libpthread.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)pthread) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -368,7 +368,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\ + ')' \ + ) > $@.new + mv -f $@.new $@ +diff -aur glibc-2.3.5/sysdeps/sparc/sparc32/sparcv9/Makefile glibc-2.3.5-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile +--- glibc-2.3.5/sysdeps/sparc/sparc32/sparcv9/Makefile 2004-08-16 08:46:14.000000000 +0200 ++++ glibc-2.3.5-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile 2005-05-11 08:26:25.937500000 +0200 +@@ -10,4 +10,4 @@ + ASFLAGS-.op += -Wa,-Av9a + ASFLAGS-.og += -Wa,-Av9a + ASFLAGS-.ob += -Wa,-Av9a +-ASFLAGS-.oS += -Wa,-Av9a ++ASFLAGS-.oST += -Wa,-Av9a + +Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> diff --git a/patches/glibc/2.3.6/glibc-2.3.5-sh-lowlevellock.patch b/patches/glibc/2.3.6/glibc-2.3.5-sh-lowlevellock.patch new file mode 100644 index 00000000..9af78d1b --- /dev/null +++ b/patches/glibc/2.3.6/glibc-2.3.5-sh-lowlevellock.patch @@ -0,0 +1,43 @@ +ML: http://sources.redhat.com/ml/libc-hacker/2005-09/msg00002.html + +Date: Mon, 05 Sep 2005 21:07:15 +0900 (JST) +Message-Id: <20050905.210715.15267870.kkojima@rr.iij4u.or.jp> +To: libc-hacker at sources dot redhat dot com +Subject: SH: A typo in lowlevellock.S +From: Kaz Kojima <kkojima at rr dot iij4u dot or dot jp> + +Hi, + +The appended patch fixes a typo in a low-level lock function. It +set the correct 3rd argument for the futex syscall in loop. Sorry +for missing such an embarrassing bug. + +Regards, + kaz + +nptl/ChangeLog: +2005-09-05 Kaz Kojima <kkojima@rr.iij4u.or.jp> + + * sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_mutex_lock_wait): + Fix typo in register name. + +--- glibc.old/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S 2004-10-26 04:06:44.000000000 +0900 ++++ glibc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S 2005-09-05 19:18:25.000000000 +0900 +@@ -1,4 +1,4 @@ +-/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. ++/* Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or +@@ -51,8 +51,8 @@ __lll_mutex_lock_wait: + SYSCALL_INST_PAD + + 2: +- mov #2, r4 +- XCHG (r4, @r8, r2) ++ mov #2, r6 ++ XCHG (r6, @r8, r2) + tst r2, r2 + bf 1b + +Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> diff --git a/patches/glibc/2.3.6/glibc-2.3.5-sh-memset.patch b/patches/glibc/2.3.6/glibc-2.3.5-sh-memset.patch new file mode 100644 index 00000000..1ccc1e18 --- /dev/null +++ b/patches/glibc/2.3.6/glibc-2.3.5-sh-memset.patch @@ -0,0 +1,30 @@ +From: + http://sources.redhat.com/ml/libc-alpha/2005-07/msg00051.html + http://sources.redhat.com/ml/crossgcc/2005-10/msg00035.html + +Message-ID: <434576E1.6020305@sscd.de> +Date: Thu, 06 Oct 2005 21:11:29 +0200 +From: Alexander Sieb <sieb at sscd dot de> +To: crossgcc at sourceware dot org +Subject: Crosstool sh4-linux-gcc-4.0.2-glibc-2.3.5 patches + +On sh[34]-linux, memset function does not work if 2nd argument is negative +and 3rd argument is greater than 12. +for example, memset(ptr, "\xda", 20) sets 0xff instead of 0xda. + +Attached patch fixes this problem. + + * sysdeps/sh/memset.S (memset): Correct 2nd argument handling. + +--- glibc-2.3.5.old/sysdeps/sh/memset.S 29 Apr 2003 22:47:18 -0000 1.4 ++++ glibc-2.3.5/sysdeps/sh/memset.S 23 Jul 2005 08:37:21 -0000 +@@ -28,6 +28,7 @@ ENTRY(memset) + bt.s L_byte_loop_init + mov r4,r7 + ++ extu.b r5,r5 + swap.b r5,r1 + or r1,r5 + swap.w r5,r1 + +Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> diff --git a/patches/glibc/2.3.6/glibc-2.3.6-allow-gcc-4.0-arm.patch b/patches/glibc/2.3.6/glibc-2.3.6-allow-gcc-4.0-arm.patch new file mode 100644 index 00000000..ea885eae --- /dev/null +++ b/patches/glibc/2.3.6/glibc-2.3.6-allow-gcc-4.0-arm.patch @@ -0,0 +1,35 @@ +Fixes +In file included from dynamic-link.h:22, + from dl-reloc.c:265: +../sysdeps/arm/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/arm/dl-machine.h:371: error: invalid storage class for function 'fix_bad_pc24' +make[2]: Leaving directory `/home/dank/queue/jobdir.k8/crosstool-dev/build/arm-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3.6/glibc-2.3.6/elf' + +when building glibc-2.3.6 with gcc-4.0 + +Like +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/sysdeps/arm/dl-machine.h.diff?r1=1.51&r2=1.52&cvsroot=glibc +but fixes fix_bad_pc24. + + +--- glibc-2.3.6-orig/sysdeps/arm/dl-machine.h Sun Mar 20 17:54:37 2005 ++++ glibc-2.3.6/sysdeps/arm/dl-machine.h Sun Mar 20 17:57:32 2005 +@@ -357,7 +357,14 @@ + #ifdef RESOLVE + + /* Deal with an out-of-range PC24 reloc. */ +-static Elf32_Addr ++#if __GNUC__ >= 4 ++ auto inline Elf32_Addr ++#else ++ static inline Elf32_Addr ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + fix_bad_pc24 (Elf32_Addr *const reloc_addr, Elf32_Addr value) + { + static void *fix_page; + +Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> +with a little editing by dank@kegel.com diff --git a/patches/glibc/2.3.6/glibc-2.3.6-allow-gcc-4.0-elf.patch b/patches/glibc/2.3.6/glibc-2.3.6-allow-gcc-4.0-elf.patch new file mode 100644 index 00000000..ec48544f --- /dev/null +++ b/patches/glibc/2.3.6/glibc-2.3.6-allow-gcc-4.0-elf.patch @@ -0,0 +1,67 @@ +From http://www.mail-archive.com/pld-cvs-commit@pld-linux.org/msg00229.html +Fixes + rtld.c: In function '_dl_start': + dynamic-link.h:47: error: nested function 'elf_machine_rela_relative' declared but never defined + dynamic-link.h:41: error: nested function 'elf_machine_rela' declared but never defined +when compiling glibc-2.3.4 with gcc-4.0 + +But see also +http://sources.redhat.com/ml/libc-hacker/2005-02/msg00000.html +and +http://sources.redhat.com/ml/libc-hacker/2005-03/msg00008.html +which seem to propose less radical fixes? + +Aha. See also http://sources.redhat.com/bugzilla/show_bug.cgi?id=721 + +--- glibc-2.3.6.orig/elf/dynamic-link.h 2005-03-12 18:12:37.000000000 -0800 ++++ glibc-2.3.6/elf/dynamic-link.h 2005-03-12 18:12:59.777820848 -0800 +@@ -19,47 +19,6 @@ + + #include <elf.h> + #include <assert.h> +- +-#ifdef RESOLVE +-/* We pass reloc_addr as a pointer to void, as opposed to a pointer to +- ElfW(Addr), because not all architectures can assume that the +- relocated address is properly aligned, whereas the compiler is +- entitled to assume that a pointer to a type is properly aligned for +- the type. Even if we cast the pointer back to some other type with +- less strict alignment requirements, the compiler might still +- remember that the pointer was originally more aligned, thereby +- optimizing away alignment tests or using word instructions for +- copying memory, breaking the very code written to handle the +- unaligned cases. */ +-# if ! ELF_MACHINE_NO_REL +-auto inline void __attribute__((always_inline)) +-elf_machine_rel (struct link_map *map, const ElfW(Rel) *reloc, +- const ElfW(Sym) *sym, const struct r_found_version *version, +- void *const reloc_addr); +-auto inline void __attribute__((always_inline)) +-elf_machine_rel_relative (ElfW(Addr) l_addr, const ElfW(Rel) *reloc, +- void *const reloc_addr); +-# endif +-# if ! ELF_MACHINE_NO_RELA +-auto inline void __attribute__((always_inline)) +-elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc, +- const ElfW(Sym) *sym, const struct r_found_version *version, +- void *const reloc_addr); +-auto inline void __attribute__((always_inline)) +-elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc, +- void *const reloc_addr); +-# endif +-# if ELF_MACHINE_NO_RELA || defined ELF_MACHINE_PLT_REL +-auto inline void __attribute__((always_inline)) +-elf_machine_lazy_rel (struct link_map *map, +- ElfW(Addr) l_addr, const ElfW(Rel) *reloc); +-# else +-auto inline void __attribute__((always_inline)) +-elf_machine_lazy_rel (struct link_map *map, +- ElfW(Addr) l_addr, const ElfW(Rela) *reloc); +-# endif +-#endif +- + #include <dl-machine.h> + + #ifndef VERSYMIDX + +Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> diff --git a/patches/glibc/2.3.6/glibc-2.3.6-configure-apple-as.patch b/patches/glibc/2.3.6/glibc-2.3.6-configure-apple-as.patch new file mode 100644 index 00000000..5d9943a5 --- /dev/null +++ b/patches/glibc/2.3.6/glibc-2.3.6-configure-apple-as.patch @@ -0,0 +1,25 @@ +http://in3www.epfl.ch/~schaffne/glibc-configure-apple-as.patch +http://sources.redhat.com/ml/crossgcc/2004-02/msg00151.html + +The following makes it possible to configure glibc-2.3.2 on Mac OS X, +where the assembler but doesn't understand the --version flag. + +Fixes the symptom +checking whether ld is GNU ld... no +checking for /usr/libexec/gcc/darwin/ppc/as... /usr/libexec/gcc/darwin/ppc/as +checking version of /usr/libexec/gcc/darwin/ppc/as... +<PAUSES HERE AND JUST SITS THERE DOING NOTHING> + +--- glibc-2.3.2/configure~ Wed Feb 26 09:20:48 2003 ++++ glibc-2.3.2/configure Fri Feb 27 13:12:53 2004 +@@ -3914,7 +3914,7 @@ + # Found it, now check the version. + echo "$as_me:$LINENO: checking version of $AS" >&5 + echo $ECHO_N "checking version of $AS... $ECHO_C" >&6 +- ac_prog_version=`$AS --version 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'` ++ ac_prog_version=`$AS -v </dev/null 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 2.1[3-9]*) + +Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> diff --git a/patches/glibc/2.3.6/glibc-2.3.6-fix-pr631.patch b/patches/glibc/2.3.6/glibc-2.3.6-fix-pr631.patch new file mode 100644 index 00000000..899fa2ae --- /dev/null +++ b/patches/glibc/2.3.6/glibc-2.3.6-fix-pr631.patch @@ -0,0 +1,45 @@ +From dank@kegel.com +Wed Jun 15 09:12:43 PDT 2005 + +Fixes + +build-glibc/libc.a(nsswitch.o)(.data+0x64): undefined reference to `_nss_files_getaliasent_r' +build-glibc/libc.a(nsswitch.o)(.data+0x6c): undefined reference to `_nss_files_endaliasent' +... 53 lines deleted ... +build-glibc/libc.a(nsswitch.o)(.data+0x21c): undefined reference to `_nss_files_getspnam_r' +collect2: ld returned 1 exit status +make[2]: *** [/build/gcc-3.4.3-glibc-2.3.5-hdrs-2.6.11.2/i686-unknown-linux-gnu/build-glibc/elf/ldconfig] Error 1 + +when building glibc with --enable-static-nss. + +See http://sources.redhat.com/bugzilla/show_bug.cgi?id=631 + +--- glibc-2.3.5/Makeconfig.old Wed Jun 15 08:13:12 2005 ++++ glibc-2.3.5/Makeconfig Wed Jun 15 08:13:14 2005 +@@ -487,7 +487,7 @@ + + # The static libraries. + ifeq (yes,$(build-static)) +-link-libc-static = $(common-objpfx)libc.a $(static-gnulib) $(common-objpfx)libc.a ++link-libc-static = $(common-objpfx)libc.a $(static-gnulib) $(otherlibs) $(common-objpfx)libc.a + else + ifeq (yes,$(build-shared)) + # We can try to link the programs with lib*_pic.a... +--- glibc-2.3.5/elf/Makefile.old Wed Jun 15 07:46:49 2005 ++++ glibc-2.3.5/elf/Makefile Wed Jun 15 08:14:00 2005 +@@ -115,6 +115,13 @@ + install-bin-script = ldd + endif + ++ifeq (yes,$(build-static-nss)) ++nssobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)nss) ++resolvobjdir := $(patsubst ../$(subdir),.,$(common-objpfx)resolv) ++otherlibs += $(nssobjdir)/libnss_files.a $(resolvobjdir)/libnss_dns.a \ ++ $(resolvobjdir)/libresolv.a ++endif ++ + others = sprof sln + install-bin = sprof + others-static = sln + +Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> diff --git a/patches/glibc/2.3.6/glibc-fp-byteorder.patch b/patches/glibc/2.3.6/glibc-fp-byteorder.patch new file mode 100644 index 00000000..d45cdbc8 --- /dev/null +++ b/patches/glibc/2.3.6/glibc-fp-byteorder.patch @@ -0,0 +1,205 @@ +Taken from http://sources.redhat.com/ml/crossgcc/2004-02/msg00104.html +Author: addsub@eyou.com +Target: ARM + +Fixes http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/920501-8.c +and makes printf("%f", 1.0) work. + +Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00115.html : + It ... fixes the 'printf("%f\n", 0.5); prints 0.000000' and general 'floating point + is broken' on my big-endian hardfloat FPA ARM platform. ... + It's definitely needed for hardfloat. So I'd think it's needed for + big-endian systems in any case, and for VFP on little-endian systems + too. Someone would have to verify that though. + +Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00123.html + I just had a look at glibc-20040830, and [this patch] is still needed and useful + for this version. glibc-20040830 out-of-the-box still contains the + following wrong assumptions: + - sysdeps/arm/bits/endian.h: float word order is big endian (which it is + not on vfp systems) + - sysdeps/arm/gmp-mparam.h: IEEE doubles are mixed endian (which they + are not on big endian systems, neither on vfp systems) + - sysdeps/arm/ieee754.h: IEEE doubles are in little endian byte order + (which they are not on big endian systems) + [This patch] seems the right solution for all of these issues. + +Dimitry Andric wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00132.html : + It's even needed for glibc CVS, AFAICS. + The patch hunk which modifies glibc.new/sysdeps/arm/bits/endian.h + (currently at version 1.4) is only needed for proper VFP operation. + But the hunk which modifies sysdeps/arm/gmp-mparam.h, and the hunk + that deletes sysdeps/arm/ieee754.h (yes, this IS correct), are needed + for proper operation of *any* FP model on big endian ARM. + +See also discussion in followups to +http://sources.redhat.com/ml/crossgcc/2004-05/msg00245.html) + +Message-ID: <276985760.37584@eyou.com> +Received: from unknown (HELO eyou.com) (172.16.2.2) + by 0.0.0.0 with SMTP; Tue, 17 Feb 2004 10:42:40 +0800 +Received: (qmail 8238 invoked by uid 65534); 17 Feb 2004 10:42:38 +0800 +Date: 17 Feb 2004 10:42:38 +0800 +Message-ID: <20040217104238.8237.qmail@eyou.com> +From: "add" <addsub@eyou.com> +To: dank@kegel.com +Reply-To: "add" <addsub@eyou.com> +Subject: Re: problem while building arm vfp softfloat gcc ` + +Hi, Dan, This is a patch I applied to my glibc-2.3.2, then my softfloat +toolchain can printf("%f\n",1.0). So you may have a try of this + + +diff -uNrp glibc.old/sysdeps/arm/bits/endian.h glibc.new/sysdeps/arm/bits/endian.h +--- glibc.old/sysdeps/arm/bits/endian.h 1999-04-12 11:59:13.000000000 -0400 ++++ glibc.new/sysdeps/arm/bits/endian.h 2004-02-12 09:15:13.000000000 -0500 +@@ -9,4 +9,9 @@ + #else + #define __BYTE_ORDER __LITTLE_ENDIAN + #endif ++ ++#ifdef __VFP_FP__ ++#define __FLOAT_WORD_ORDER __BYTE_ORDER ++#else + #define __FLOAT_WORD_ORDER __BIG_ENDIAN ++#endif +diff -uNrp glibc.old/sysdeps/arm/gmp-mparam.h glibc.new/sysdeps/arm/gmp-mparam.h +--- glibc.old/sysdeps/arm/gmp-mparam.h 2001-07-07 15:21:19.000000000 -0400 ++++ glibc.new/sysdeps/arm/gmp-mparam.h 2004-02-12 09:15:13.000000000 -0500 +@@ -26,5 +26,13 @@ MA 02111-1307, USA. */ + #define BITS_PER_SHORTINT 16 + #define BITS_PER_CHAR 8 + +-#define IEEE_DOUBLE_BIG_ENDIAN 0 +-#define IEEE_DOUBLE_MIXED_ENDIAN 1 ++#if defined(__ARMEB__) ++# define IEEE_DOUBLE_MIXED_ENDIAN 0 ++# define IEEE_DOUBLE_BIG_ENDIAN 1 ++#elif defined(__VFP_FP__) ++# define IEEE_DOUBLE_MIXED_ENDIAN 0 ++# define IEEE_DOUBLE_BIG_ENDIAN 0 ++#else ++# define IEEE_DOUBLE_BIG_ENDIAN 0 ++# define IEEE_DOUBLE_MIXED_ENDIAN 1 ++#endif +diff -uNrp glibc.old/sysdeps/arm/ieee754.h glibc.new/sysdeps/arm/ieee754.h +--- glibc.old/sysdeps/arm/ieee754.h 2001-07-07 15:21:19.000000000 -0400 ++++ glibc.new/sysdeps/arm/ieee754.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,115 +0,0 @@ +-/* Copyright (C) 1992, 1995, 1996, 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 _IEEE754_H +- +-#define _IEEE754_H 1 +-#include <features.h> +- +-#include <endian.h> +- +-__BEGIN_DECLS +- +-union ieee754_float +- { +- float f; +- +- /* This is the IEEE 754 single-precision format. */ +- struct +- { +- unsigned int mantissa:23; +- unsigned int exponent:8; +- unsigned int negative:1; +- } ieee; +- +- /* This format makes it easier to see if a NaN is a signalling NaN. */ +- struct +- { +- unsigned int mantissa:22; +- unsigned int quiet_nan:1; +- unsigned int exponent:8; +- unsigned int negative:1; +- } ieee_nan; +- }; +- +-#define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */ +- +- +-union ieee754_double +- { +- double d; +- +- /* This is the IEEE 754 double-precision format. */ +- struct +- { +- unsigned int mantissa0:20; +- unsigned int exponent:11; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- } ieee; +- +- /* This format makes it easier to see if a NaN is a signalling NaN. */ +- struct +- { +- unsigned int mantissa0:19; +- unsigned int quiet_nan:1; +- unsigned int exponent:11; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- } ieee_nan; +- }; +- +-#define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ +- +- +-/* The following two structures are correct for `new' floating point systems but +- wrong for the old FPPC. The only solution seems to be to avoid their use on +- old hardware. */ +- +-union ieee854_long_double +- { +- long double d; +- +- /* This is the IEEE 854 double-extended-precision format. */ +- struct +- { +- unsigned int exponent:15; +- unsigned int empty:16; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- unsigned int mantissa0:32; +- } ieee; +- +- /* This is for NaNs in the IEEE 854 double-extended-precision format. */ +- struct +- { +- unsigned int exponent:15; +- unsigned int empty:16; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- unsigned int mantissa0:30; +- unsigned int quiet_nan:1; +- unsigned int one:1; +- } ieee_nan; +- }; +- +-#define IEEE854_LONG_DOUBLE_BIAS 0x3fff +- +-__END_DECLS +- +-#endif /* ieee754.h */ + +Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> diff --git a/patches/glibc/2.3.6/glibc-mips-bootstrap-gcc-header-install.patch b/patches/glibc/2.3.6/glibc-mips-bootstrap-gcc-header-install.patch new file mode 100644 index 00000000..2fd72f8b --- /dev/null +++ b/patches/glibc/2.3.6/glibc-mips-bootstrap-gcc-header-install.patch @@ -0,0 +1,37 @@ +http://sourceware.org/ml/crossgcc/2005-05/msg00165.html +Fixes a MIPS build problem (unrelated to NPTL) + +Message-ID: <428E8B24.1000201@realitydiluted.com> +Date: Fri, 20 May 2005 20:13:08 -0500 +From: "Steven J dot Hill" <sjhill at realitydiluted dot com> +To: crossgcc at sources dot redhat dot com, toolchain at gentoo dot org, + Shay_Gal-On at pmc-sierra dot com, TheNop at gmx dot net +Subject: New NPTL patches for crosstools and MIPS NPTL patches.... + +Greetings. + +I have uploaded the latest NPTL patch for crosstool-0.34. I have also +uploaded a tarball of the patches necessary to build a MIPS NPTL +cross toolchain. To build a MIPS NPTL toolchain you will need the +released version of binutils-2.16 and the absolute latest GCC and +glibc code from the HEAD of cvs. Use the 'demo-mips-nptl.sh' script +to build the toolchain. Please report bugs or issues to the crossgcc +mailing list. Here is the link off of my FTP site: + + ftp://ftp.realitydiluted.com/crosstools/crosstool-0.34/ + +[Note: BOOTSTRAP_GCC is set by crosstool.sh when invoking make install-headers] + +diff -ur glibc-2.4.0-20050406/sysdeps/mips/mips32/Makefile glibc-2.4.0-20050406-patched/sysdeps/mips/mips32/Makefile +--- glibc-2.4.0-20050406/sysdeps/mips/mips32/Makefile 2003-03-29 02:15:28.000000000 -0600 ++++ glibc-2.4.0-20050406-patched/sysdeps/mips/mips32/Makefile 2005-04-12 21:36:51.318837655 -0500 +@@ -1,3 +1,7 @@ ++ifeq ($(filter -DBOOTSTRAP_GCC,$(CFLAGS)),) + ifeq ($(filter -mabi=32,$(CC)),) + CC += -mabi=32 + endif ++else ++CC += -D"_MIPS_SZPTR=32" ++endif + +Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> diff --git a/patches/glibc/2.3.6/make-install-lib-all.patch b/patches/glibc/2.3.6/make-install-lib-all.patch new file mode 100644 index 00000000..1e69bb23 --- /dev/null +++ b/patches/glibc/2.3.6/make-install-lib-all.patch @@ -0,0 +1,26 @@ +From http://svn.exactcode.de/t2/trunk/package/base/glibc32/make-install-lib-all.patch +Rule to install all needed libraries, not just the ones installed by install-lib, +yet not install programs. +Needed because we can't use the main install target, as we can't build programs before +we have the final gcc installed; linking fails because libeh.a is not present, +and glibc insists on linking programs with that library. + +diff -Naur glibc-2.3.4.orig/Makerules glibc-2.3.4/Makerules +--- glibc-2.3.4.orig/Makerules 2004-12-15 20:52:39.000000000 +0200 ++++ glibc-2.3.4/Makerules 2005-02-19 15:16:31.415125176 +0200 +@@ -844,6 +844,13 @@ + installed-libcs := $(foreach o,$(filter-out .os,$(object-suffixes-for-libc)),\ + $(inst_libdir)/$(patsubst %,$(libtype$o),\ + $(libprefix)$(libc-name))) ++ ++install-lib-all: $(inst_slibdir)/libc.so$(libc.so-version) \ ++ $(inst_slibdir)/libc-$(version).so \ ++ $(inst_libdir)/libc.so \ ++ $(inst_libdir)/libc.a \ ++ install-lib ++ + install: $(installed-libcs) + $(installed-libcs): $(inst_libdir)/lib$(libprefix)%: lib $(+force) + $(make-target-directory) + +Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> diff --git a/patches/glibc/2.3.6/maybe/glibc-2.3.6-allow-gcc-4.0-powerpc32.patch b/patches/glibc/2.3.6/maybe/glibc-2.3.6-allow-gcc-4.0-powerpc32.patch new file mode 100644 index 00000000..d8810fca --- /dev/null +++ b/patches/glibc/2.3.6/maybe/glibc-2.3.6-allow-gcc-4.0-powerpc32.patch @@ -0,0 +1,45 @@ +Fixes + +../sysdeps/powerpc/powerpc32/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/powerpc/powerpc32/dl-machine.h:461: error: invalid storage class for function 'elf_machine_rela_relative' +../sysdeps/powerpc/powerpc32/dl-machine.h:469: error: invalid storage class for function 'elf_machine_lazy_rel' +make[2]: *** [/home/dank/queue/jobdir.dual2/crosstool-dev/build/powerpc-750-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/build-glibc/elf/dl-reloc.o] Error 1 + +--- glibc-2.3.6.orig/sysdeps/powerpc/powerpc32/dl-machine.h Wed Jul 30 23:33:52 2003 ++++ glibc-2.3.6/sysdeps/powerpc/powerpc32/dl-machine.h Thu Mar 17 13:19:16 2005 +@@ -455,8 +455,14 @@ + } + } + +-auto inline void +-__attribute__ ((always_inline)) ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela_relative (Elf32_Addr l_addr, const Elf32_Rela *reloc, + void *const reloc_addr_arg) + { +@@ -464,8 +470,14 @@ + *reloc_addr = l_addr + reloc->r_addend; + } + +-auto inline void +-__attribute__ ((always_inline)) ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_lazy_rel (struct link_map *map, + Elf32_Addr l_addr, const Elf32_Rela *reloc) + { + +Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> diff --git a/patches/glibc/2.3.6/maybe/glibc-2.3.6-allow-gcc-4.0-powerpc64.patch b/patches/glibc/2.3.6/maybe/glibc-2.3.6-allow-gcc-4.0-powerpc64.patch new file mode 100644 index 00000000..a729541d --- /dev/null +++ b/patches/glibc/2.3.6/maybe/glibc-2.3.6-allow-gcc-4.0-powerpc64.patch @@ -0,0 +1,65 @@ +Fixes: + +In file included from dynamic-link.h:22, + from dl-reloc.c:269: +../sysdeps/powerpc/powerpc64/dl-machine.h: In function '_dl_relocate_object': +../sysdeps/powerpc/powerpc64/dl-machine.h:573: error: invalid storage class for function 'elf_machine_rela_relative' +../sysdeps/powerpc/powerpc64/dl-machine.h:607: error: invalid storage class for function 'elf_machine_rela' +../sysdeps/powerpc/powerpc64/dl-machine.h:889: error: invalid storage class for function 'elf_machine_lazy_rel' +make[2]: Leaving directory `/home/dank/queue/jobdir.fast2/crosstool-dev/build/powerpc64-unknown-linux-gnu/gcc-4.0-20050305-glibc-2.3-20050307/glibc-2.3-20050307/elf' + +--- glibc-2.3.6.orig/sysdeps/powerpc/powerpc64/dl-machine.h Thu Mar 17 13:35:23 2005 ++++ glibc-2.3.6/sysdeps/powerpc/powerpc64/dl-machine.h Thu Mar 17 13:37:12 2005 +@@ -567,8 +567,14 @@ + const Elf64_Sym *refsym) + attribute_hidden; + +-auto inline void +-__attribute__ ((always_inline)) ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela_relative (Elf64_Addr l_addr, const Elf64_Rela *reloc, + void *const reloc_addr_arg) + { +@@ -599,8 +605,14 @@ + + /* Perform the relocation specified by RELOC and SYM (which is fully + resolved). MAP is the object containing the reloc. */ +-auto inline void +-__attribute__ ((always_inline)) ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_rela (struct link_map *map, + const Elf64_Rela *reloc, + const Elf64_Sym *sym, +@@ -885,8 +897,14 @@ + MODIFIED_CODE_NOQUEUE (reloc_addr); + } + +-auto inline void +-__attribute__ ((always_inline)) ++#if __GNUC__ >= 4 ++ auto inline void ++#else ++ static inline void ++#endif ++#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2) ++ __attribute ((always_inline)) ++#endif + elf_machine_lazy_rel (struct link_map *map, + Elf64_Addr l_addr, const Elf64_Rela *reloc) + { + +Signed-off-by: Robert P. J. Day <rpjday@mindspring.com> diff --git a/patches/glibc/20040827/arm-ctl_bus_isa.patch b/patches/glibc/20040827/arm-ctl_bus_isa.patch new file mode 100644 index 00000000..3422070b --- /dev/null +++ b/patches/glibc/20040827/arm-ctl_bus_isa.patch @@ -0,0 +1,51 @@ +Applies to both glibc-2.2.5 and glibc-2.3.2, and probably glibc cvs as of Aug 2004. +Needed to build glibc with linux kernels 2.4.23 or higher on ARM, +Fixes following error: + +../sysdeps/unix/sysv/linux/arm/ioperm.c: In function `init_iosys': +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: `BUS_ISA' undeclared (first use in this function) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (Each undeclared identifier is reported only once +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: for each function it appears in.) +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:103: error: (near initialization for `iobase_name[1]') +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: initializer element is not constant +../sysdeps/unix/sysv/linux/arm/ioperm.c:104: error: (near initialization for `ioshift_name[1]') +make[2]: *** [/home/dank/crosstool-0.28/build/arm-softfloat-linux-gnu/gcc-3.3.4-glibc-2.2.5/build-glibc/misc/ioperm.o] Error 1 + +cf. "[SYSCTL] BUS_ISA -> CTL_BUS_ISA", http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html + +--- glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c.old 2003-02-20 14:22:24.000000000 -0800 ++++ glibc-2.3.2/sysdeps/unix/sysv/linux/arm/ioperm.c 2004-01-31 16:01:50.000000000 -0800 +@@ -47,6 +47,12 @@ + #include <asm/page.h> + #include <sys/sysctl.h> + ++/* see http://www.ussg.iu.edu/hypermail/linux/kernel/0311.0/0529.html */ ++#include <linux/version.h> ++#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,23)) ++#define CTL_BUS_ISA BUS_ISA /* and hope it's not the one from linux/input.h */ ++#endif ++ + #define PATH_ARM_SYSTYPE "/etc/arm_systype" + #define PATH_CPUINFO "/proc/cpuinfo" + +@@ -80,7 +86,7 @@ + * Initialize I/O system. There are several ways to get the information + * we need. Each is tried in turn until one succeeds. + * +- * 1. Sysctl (CTL_BUS, BUS_ISA, ISA_*). This is the preferred method ++ * 1. Sysctl (CTL_BUS, CTL_BUS_ISA, ISA_*). This is the preferred method + * but not all kernels support it. + * + * 2. Read the value (not the contents) of symlink PATH_ARM_SYSTYPE. +@@ -100,8 +106,8 @@ + { + char systype[256]; + int i, n; +- static int iobase_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_BASE }; +- static int ioshift_name[] = { CTL_BUS, BUS_ISA, BUS_ISA_PORT_SHIFT }; ++ static int iobase_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_BASE }; ++ static int ioshift_name[] = { CTL_BUS, CTL_BUS_ISA, BUS_ISA_PORT_SHIFT }; + size_t len = sizeof(io.base); + + if (! sysctl (iobase_name, 3, &io.io_base, &len, NULL, 0) diff --git a/patches/glibc/20040827/glibc-2.3.2-sparc64-dl-machine.patch b/patches/glibc/20040827/glibc-2.3.2-sparc64-dl-machine.patch new file mode 100644 index 00000000..20cb7998 --- /dev/null +++ b/patches/glibc/20040827/glibc-2.3.2-sparc64-dl-machine.patch @@ -0,0 +1,29 @@ +See http://gcc.gnu.org/PR15345 + +Quick kludge by H.J.Lu +Works around gcc-3.4.0 error which shows up when building glibc-2.3.2 for sparc64: + +.../sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/libc.a(dl-reloc.o)(.text+0x4b4): In function `elf_machine_load_address.3': +: undefined reference to `_DYNAMIC' +collect2: ld returned 1 exit status +make[2]: *** [/home/dank/wk/crosstool-0.28-rc10/build/sparc64-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/elf/sln] Error 1 + + +--- glibc-2.3.2/sysdeps/sparc/sparc64/dl-machine.h.orig Sat May 8 20:54:26 2004 ++++ glibc-2.3.2/sysdeps/sparc/sparc64/dl-machine.h Sat May 8 17:18:04 2004 +@@ -65,6 +65,7 @@ + } + + /* Return the run-time load address of the shared object. */ ++#ifdef IS_IN_rtld + static inline Elf64_Addr + elf_machine_load_address (void) + { +@@ -84,6 +85,7 @@ + pc[3]*4 is l_addr + _GLOBAL_OFFSET_TABLE_ - (long)pc - 12 */ + return (Elf64_Addr) got - *got + (Elf32_Sword) ((pc[2] - pc[3]) * 4) - 4; + } ++#endif + + /* We have 4 cases to handle. And we code different code sequences + for each one. I love V9 code models... */ diff --git a/patches/glibc/20040827/glibc-2.3.3-cygwin.patch b/patches/glibc/20040827/glibc-2.3.3-cygwin.patch new file mode 100644 index 00000000..0ad9a717 --- /dev/null +++ b/patches/glibc/20040827/glibc-2.3.3-cygwin.patch @@ -0,0 +1,103 @@ +Fixes +elf/librtld.os: In function `process_envvars': : undefined reference to `__access' +... +when building glibc-2.3.3 on cygwin + +Idea from +http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch +Basically, make glibc use .oST as suffix for 'object static' +instead of .oS, since cygwin has trouble distinguishing .os from .oS +(Original patch had .on, but .oST is more mnemonic for 'object static') + +glibc-linuxthreads-2.3.3 also requires a patch, see +../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch + +[ Rediffed against glibc-2.3.3 ] + + +diff -aur glibc-2.3.3/Makeconfig glibc-2.3.3-cygwin/Makeconfig +--- glibc-2.3.3/Makeconfig 2003-09-17 01:36:10.000000000 -0700 ++++ glibc-2.3.3-cygwin/Makeconfig 2004-08-27 20:34:43.000000000 -0700 +@@ -439,13 +439,13 @@ + # run the linked programs. + link-libc = -Wl,-rpath-link=$(rpath-link) \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib) ++ $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib) + # This is how to find at build-time things that will be installed there. + rpath-dirs = math elf dlfcn nss nis rt resolv crypt + else + ifneq (,$(filter aix aix%,$(config-os))) + link-libc = $(common-objpfx)libc.a \ +- $(common-objpfx)$(patsubst %,$(libtype.oS),c) $(gnulib) ++ $(common-objpfx)$(patsubst %,$(libtype.oST),c) $(gnulib) + rpath-dirs = math dlfcn nss nis rt resolv crypt + endif + endif +@@ -658,7 +658,7 @@ + # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX}) + # to pass different flags for each flavor. + libtypes = $(foreach o,$(object-suffixes-for-libc),$(libtype$o)) +-all-object-suffixes := .o .os .op .og .ob .oS ++all-object-suffixes := .o .os .op .og .ob .oST + object-suffixes := + CPPFLAGS-.o = $(pic-default) + CFLAGS-.o = $(filter %frame-pointer,$(+cflags)) +@@ -714,14 +714,14 @@ + + ifeq (yes,$(build-shared)) + # Build special library that contains the static-only routines for libc. +-object-suffixes-for-libc += .oS ++object-suffixes-for-libc += .oST + + # Must build the routines as PIC, though, because they can end up in (users') + # shared objects. We don't want to use CFLAGS-os because users may, for + # example, make that processor-specific. +-CFLAGS-.oS = $(CFLAGS-.o) $(PIC-ccflag) +-CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1 +-libtype.oS = lib%_nonshared.a ++CFLAGS-.oST = $(CFLAGS-.o) $(pic-ccflag) ++CPPFLAGS-.oST = $(CPPFLAGS-.o) -DPIC -DLIBC_NONSHARED=1 ++libtype.oST = lib%_nonshared.a + endif + + # The assembler can generate debug information too. +diff -aur glibc-2.3.3/Makerules glibc-2.3.3-cygwin/Makerules +--- glibc-2.3.3/Makerules 2003-10-31 16:35:57.000000000 -0800 ++++ glibc-2.3.3-cygwin/Makerules 2004-08-27 20:33:47.000000000 -0700 +@@ -414,7 +414,7 @@ + # Bounded pointer thunks are only built for *.ob + elide-bp-thunks = $(addprefix $(bppfx),$(bp-thunks)) + +-elide-routines.oS += $(filter-out $(static-only-routines),\ ++elide-routines.oST += $(filter-out $(static-only-routines),\ + $(routines) $(aux) $(sysdep_routines)) \ + $(elide-bp-thunks) + elide-routines.os += $(static-only-routines) $(elide-bp-thunks) +@@ -934,7 +934,7 @@ + install: $(inst_libdir)/libc.so + $(inst_libdir)/libc.so: $(common-objpfx)format.lds \ + $(common-objpfx)libc.so$(libc.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)$(libc-name)) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -942,7 +942,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libc.so$(libc.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)$(libc-name))'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)$(libc-name))'\ + ')' \ + ) > $@.new + mv -f $@.new $@ +diff -aur glibc-2.3.3/sysdeps/sparc/sparc32/sparcv9/Makefile glibc-2.3.3-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile +--- glibc-2.3.3/sysdeps/sparc/sparc32/sparcv9/Makefile 2002-08-29 03:41:15.000000000 -0700 ++++ glibc-2.3.3-cygwin/sysdeps/sparc/sparc32/sparcv9/Makefile 2004-08-27 20:35:43.000000000 -0700 +@@ -10,4 +10,4 @@ + ASFLAGS-.op += -Wa,-Av9a + ASFLAGS-.og += -Wa,-Av9a + ASFLAGS-.ob += -Wa,-Av9a +-ASFLAGS-.oS += -Wa,-Av9a ++ASFLAGS-.oST += -Wa,-Av9a diff --git a/patches/glibc/20040827/glibc-2.3.3-libeh-kludge.patch b/patches/glibc/20040827/glibc-2.3.3-libeh-kludge.patch new file mode 100644 index 00000000..0e8c2a66 --- /dev/null +++ b/patches/glibc/20040827/glibc-2.3.3-libeh-kludge.patch @@ -0,0 +1,26 @@ +wget "http://sources.redhat.com/cgi-bin/get-raw-msg?listname=libc-alpha&date=2003-09&msgid=20030911190500.GE12344%40sunsite.ms.mff.cuni.cz" +aka http://sources.redhat.com/ml/libc-alpha/2003-09/msg00104.html + +This seems to fix the error + gcc-3.4.1-glibc-2.3.3/lib/gcc/powerpc-7400-linux-gnu/3.4.1/../../../../powerpc-7400-linux-gnu/bin/ld: cannot find -lgcc_eh + make[1]: *** [build/powerpc-7400-linux-gnu/gcc-3.4.1-glibc-2.3.3/build-glibc/libc.so] Error 1 +but I assume it will cause trouble with nptl, since it's so violent + +FIXME: once we figure out why this patch is wrong, fix it right :-) + +Rediffed against glibc-20040822 + + +--- glibc-20040822/Makeconfig.orig 2004-08-04 20:34:28.000000000 -0700 ++++ glibc-20040822/Makeconfig 2004-08-24 07:36:49.000000000 -0700 +@@ -527,8 +527,8 @@ + libgcc_eh := -Wl,--as-needed -lgcc_s$(libgcc_s_suffix) -Wl,--no-as-needed + endif + ifneq ($(have-cc-with-libunwind),yes) +- gnulib := -lgcc $(libgcc_eh) +- static-gnulib := -lgcc -lgcc_eh ++ gnulib := -lgcc ++ static-gnulib := -lgcc + else + gnulib := -lgcc $(libgcc_eh) -lunwind + static-gnulib := -lgcc -lgcc_eh -lunwind diff --git a/patches/glibc/20040827/glibc-configure-apple-as.patch b/patches/glibc/20040827/glibc-configure-apple-as.patch new file mode 100644 index 00000000..604c36d5 --- /dev/null +++ b/patches/glibc/20040827/glibc-configure-apple-as.patch @@ -0,0 +1,23 @@ +http://in3www.epfl.ch/~schaffne/glibc-configure-apple-as.patch +http://sources.redhat.com/ml/crossgcc/2004-02/msg00151.html + +The following makes it possible to configure glibc-2.3.2 on Mac OS X, +where the assembler but doesn't understand the --version flag. + +Fixes the symptom +checking whether ld is GNU ld... no +checking for /usr/libexec/gcc/darwin/ppc/as... /usr/libexec/gcc/darwin/ppc/as +checking version of /usr/libexec/gcc/darwin/ppc/as... +<PAUSES HERE AND JUST SITS THERE DOING NOTHING> + +--- glibc-2.3.2/configure~ Wed Feb 26 09:20:48 2003 ++++ glibc-2.3.2/configure Fri Feb 27 13:12:53 2004 +@@ -3789,7 +3789,7 @@ + # Found it, now check the version. + echo "$as_me:$LINENO: checking version of $AS" >&5 + echo $ECHO_N "checking version of $AS... $ECHO_C" >&6 +- ac_prog_version=`$AS --version 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'` ++ ac_prog_version=`$AS -v </dev/null 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'` + case $ac_prog_version in + '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;; + 2.1[3-9]*) diff --git a/patches/glibc/20040827/glibc-fp-byteorder.patch b/patches/glibc/20040827/glibc-fp-byteorder.patch new file mode 100644 index 00000000..f20432ea --- /dev/null +++ b/patches/glibc/20040827/glibc-fp-byteorder.patch @@ -0,0 +1,203 @@ +Taken from http://sources.redhat.com/ml/crossgcc/2004-02/msg00104.html +Author: addsub@eyou.com +Target: ARM + +Fixes http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.c-torture/execute/920501-8.c +and makes printf("%f", 1.0) work. + +Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00115.html : + It ... fixes the 'printf("%f\n", 0.5); prints 0.000000' and general 'floating point + is broken' on my big-endian hardfloat FPA ARM platform. ... + It's definitely needed for hardfloat. So I'd think it's needed for + big-endian systems in any case, and for VFP on little-endian systems + too. Someone would have to verify that though. + +Lennert Buytenhek wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00123.html + I just had a look at glibc-20040830, and [this patch] is still needed and useful + for this version. glibc-20040830 out-of-the-box still contains the + following wrong assumptions: + - sysdeps/arm/bits/endian.h: float word order is big endian (which it is + not on vfp systems) + - sysdeps/arm/gmp-mparam.h: IEEE doubles are mixed endian (which they + are not on big endian systems, neither on vfp systems) + - sysdeps/arm/ieee754.h: IEEE doubles are in little endian byte order + (which they are not on big endian systems) + [This patch] seems the right solution for all of these issues. + +Dimitry Andric wrote in http://sources.redhat.com/ml/crossgcc/2004-09/msg00132.html : + It's even needed for glibc CVS, AFAICS. + The patch hunk which modifies glibc.new/sysdeps/arm/bits/endian.h + (currently at version 1.4) is only needed for proper VFP operation. + But the hunk which modifies sysdeps/arm/gmp-mparam.h, and the hunk + that deletes sysdeps/arm/ieee754.h (yes, this IS correct), are needed + for proper operation of *any* FP model on big endian ARM. + +See also discussion in followups to +http://sources.redhat.com/ml/crossgcc/2004-05/msg00245.html) + +Message-ID: <276985760.37584@eyou.com> +Received: from unknown (HELO eyou.com) (172.16.2.2) + by 0.0.0.0 with SMTP; Tue, 17 Feb 2004 10:42:40 +0800 +Received: (qmail 8238 invoked by uid 65534); 17 Feb 2004 10:42:38 +0800 +Date: 17 Feb 2004 10:42:38 +0800 +Message-ID: <20040217104238.8237.qmail@eyou.com> +From: "add" <addsub@eyou.com> +To: dank@kegel.com +Reply-To: "add" <addsub@eyou.com> +Subject: Re: problem while building arm vfp softfloat gcc ` + +Hi, Dan, This is a patch I applied to my glibc-2.3.2, then my softfloat +toolchain can printf("%f\n",1.0). So you may have a try of this + + +diff -uNrp glibc.old/sysdeps/arm/bits/endian.h glibc.new/sysdeps/arm/bits/endian.h +--- glibc.old/sysdeps/arm/bits/endian.h 1999-04-12 11:59:13.000000000 -0400 ++++ glibc.new/sysdeps/arm/bits/endian.h 2004-02-12 09:15:13.000000000 -0500 +@@ -9,4 +9,9 @@ + #else + #define __BYTE_ORDER __LITTLE_ENDIAN + #endif ++ ++#ifdef __VFP_FP__ ++#define __FLOAT_WORD_ORDER __BYTE_ORDER ++#else + #define __FLOAT_WORD_ORDER __BIG_ENDIAN ++#endif +diff -uNrp glibc.old/sysdeps/arm/gmp-mparam.h glibc.new/sysdeps/arm/gmp-mparam.h +--- glibc.old/sysdeps/arm/gmp-mparam.h 2001-07-07 15:21:19.000000000 -0400 ++++ glibc.new/sysdeps/arm/gmp-mparam.h 2004-02-12 09:15:13.000000000 -0500 +@@ -26,5 +26,13 @@ MA 02111-1307, USA. */ + #define BITS_PER_SHORTINT 16 + #define BITS_PER_CHAR 8 + +-#define IEEE_DOUBLE_BIG_ENDIAN 0 +-#define IEEE_DOUBLE_MIXED_ENDIAN 1 ++#if defined(__ARMEB__) ++# define IEEE_DOUBLE_MIXED_ENDIAN 0 ++# define IEEE_DOUBLE_BIG_ENDIAN 1 ++#elif defined(__VFP_FP__) ++# define IEEE_DOUBLE_MIXED_ENDIAN 0 ++# define IEEE_DOUBLE_BIG_ENDIAN 0 ++#else ++# define IEEE_DOUBLE_BIG_ENDIAN 0 ++# define IEEE_DOUBLE_MIXED_ENDIAN 1 ++#endif +diff -uNrp glibc.old/sysdeps/arm/ieee754.h glibc.new/sysdeps/arm/ieee754.h +--- glibc.old/sysdeps/arm/ieee754.h 2001-07-07 15:21:19.000000000 -0400 ++++ glibc.new/sysdeps/arm/ieee754.h 1969-12-31 19:00:00.000000000 -0500 +@@ -1,115 +0,0 @@ +-/* Copyright (C) 1992, 1995, 1996, 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 _IEEE754_H +- +-#define _IEEE754_H 1 +-#include <features.h> +- +-#include <endian.h> +- +-__BEGIN_DECLS +- +-union ieee754_float +- { +- float f; +- +- /* This is the IEEE 754 single-precision format. */ +- struct +- { +- unsigned int mantissa:23; +- unsigned int exponent:8; +- unsigned int negative:1; +- } ieee; +- +- /* This format makes it easier to see if a NaN is a signalling NaN. */ +- struct +- { +- unsigned int mantissa:22; +- unsigned int quiet_nan:1; +- unsigned int exponent:8; +- unsigned int negative:1; +- } ieee_nan; +- }; +- +-#define IEEE754_FLOAT_BIAS 0x7f /* Added to exponent. */ +- +- +-union ieee754_double +- { +- double d; +- +- /* This is the IEEE 754 double-precision format. */ +- struct +- { +- unsigned int mantissa0:20; +- unsigned int exponent:11; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- } ieee; +- +- /* This format makes it easier to see if a NaN is a signalling NaN. */ +- struct +- { +- unsigned int mantissa0:19; +- unsigned int quiet_nan:1; +- unsigned int exponent:11; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- } ieee_nan; +- }; +- +-#define IEEE754_DOUBLE_BIAS 0x3ff /* Added to exponent. */ +- +- +-/* The following two structures are correct for `new' floating point systems but +- wrong for the old FPPC. The only solution seems to be to avoid their use on +- old hardware. */ +- +-union ieee854_long_double +- { +- long double d; +- +- /* This is the IEEE 854 double-extended-precision format. */ +- struct +- { +- unsigned int exponent:15; +- unsigned int empty:16; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- unsigned int mantissa0:32; +- } ieee; +- +- /* This is for NaNs in the IEEE 854 double-extended-precision format. */ +- struct +- { +- unsigned int exponent:15; +- unsigned int empty:16; +- unsigned int negative:1; +- unsigned int mantissa1:32; +- unsigned int mantissa0:30; +- unsigned int quiet_nan:1; +- unsigned int one:1; +- } ieee_nan; +- }; +- +-#define IEEE854_LONG_DOUBLE_BIAS 0x3fff +- +-__END_DECLS +- +-#endif /* ieee754.h */ diff --git a/patches/glibc/20050502/make-install-lib-all.patch b/patches/glibc/20050502/make-install-lib-all.patch new file mode 100644 index 00000000..6de9f7e3 --- /dev/null +++ b/patches/glibc/20050502/make-install-lib-all.patch @@ -0,0 +1,24 @@ +From http://svn.exactcode.de/t2/trunk/package/base/glibc32/make-install-lib-all.patch +Rule to install all needed libraries, not just the ones installed by install-lib, +yet not install programs. +Needed because we can't use the main install target, as we can't build programs before +we have the final gcc installed; linking fails because libeh.a is not present, +and glibc insists on linking programs with that library. + +diff -Naur glibc-2.3.4.orig/Makerules glibc-2.3.4/Makerules +--- glibc-2.3.4.orig/Makerules 2004-12-15 20:52:39.000000000 +0200 ++++ glibc-2.3.4/Makerules 2005-02-19 15:16:31.415125176 +0200 +@@ -844,6 +844,13 @@ + installed-libcs := $(foreach o,$(filter-out .os,$(object-suffixes-for-libc)),\ + $(inst_libdir)/$(patsubst %,$(libtype$o),\ + $(libprefix)$(libc-name))) ++ ++install-lib-all: $(inst_slibdir)/libc.so$(libc.so-version) \ ++ $(inst_slibdir)/libc-$(version).so \ ++ $(inst_libdir)/libc.so \ ++ $(inst_libdir)/libc.a \ ++ install-lib ++ + install: $(installed-libcs) + $(installed-libcs): $(inst_libdir)/lib$(libprefix)%: lib $(+force) + $(make-target-directory) diff --git a/patches/glibc/compat-2.1/rh62-09-glibc-compat-2.1.3-security2.patch b/patches/glibc/compat-2.1/rh62-09-glibc-compat-2.1.3-security2.patch new file mode 100644 index 00000000..a16b4aff --- /dev/null +++ b/patches/glibc/compat-2.1/rh62-09-glibc-compat-2.1.3-security2.patch @@ -0,0 +1,66 @@ +2002-07-05 Tomohiro Kato <tomop@teamgedoh.net> + + * glibc-compat/nss_dns/dns-network.c (getanswer_r): Reduce + linebuflen in parallel to bumping up the buffer pointer. + * glibc-compat/nss_dns/dns-host.c (getanswer_r): Likewise. + Compare n with linebuflen instead of buflen. + +2002-07-02 Andreas Schwab <schwab@suse.de> + + * resolv/nss_dns/dns-network.c (getanswer_r): Reduce linebuflen + in parallel to bumping up the buffer pointer. + +--- libc/glibc-compat/nss_dns/dns-network.c.jj Wed Jan 10 11:58:20 2001 ++++ libc/glibc-compat/nss_dns/dns-network.c Tue Jul 9 10:31:15 2002 +@@ -283,7 +283,9 @@ getanswer_r (const querybuf *answer, int + } + cp += n; + *alias_pointer++ = bp; +- bp += strlen (bp) + 1; ++ n = strlen (bp) + 1; ++ bp += n; ++ linebuflen -= n; + result->n_addrtype = class == C_IN ? AF_INET : AF_UNSPEC; + ++have_answer; + } +--- libc/glibc-compat/nss_dns/dns-host.c.jj Wed Jan 10 11:58:20 2001 ++++ libc/glibc-compat/nss_dns/dns-host.c Tue Jul 9 10:36:41 2002 +@@ -424,7 +424,7 @@ getanswer_r (const querybuf *answer, int + linebuflen -= n; + /* Get canonical name. */ + n = strlen (tbuf) + 1; /* For the \0. */ +- if ((size_t) n > buflen || n >= MAXHOSTNAMELEN) ++ if ((size_t) n > linebuflen || n >= MAXHOSTNAMELEN) + { + ++had_error; + continue; +@@ -447,7 +447,7 @@ getanswer_r (const querybuf *answer, int + cp += n; + /* Get canonical name. */ + n = strlen (tbuf) + 1; /* For the \0. */ +- if ((size_t) n > buflen || n >= MAXHOSTNAMELEN) ++ if ((size_t) n > linebuflen || n >= MAXHOSTNAMELEN) + { + ++had_error; + continue; +@@ -542,6 +542,7 @@ getanswer_r (const querybuf *answer, int + linebuflen -= nn; + } + ++ linebuflen -= sizeof (align) - ((u_long) bp % sizeof (align)); + bp += sizeof (align) - ((u_long) bp % sizeof (align)); + + if (n >= linebuflen) +#--- libc/resolv/nss_dns/dns-network.c.jj Mon Jul 9 14:59:24 2001 +#+++ libc/resolv/nss_dns/dns-network.c Tue Jul 9 10:30:31 2002 +#@@ -328,7 +328,9 @@ getanswer_r (const querybuf *answer, int +# } +# cp += n; +# *alias_pointer++ = bp; +#- bp += strlen (bp) + 1; +#+ n = strlen (bp) + 1; +#+ bp += n; +#+ linebuflen -= n; +# result->n_addrtype = class == C_IN ? AF_INET : AF_UNSPEC; +# ++have_answer; +# } diff --git a/patches/glibc/compat-2.1/rh62-12-glibc-compat-2.1.3-maxpacket.patch b/patches/glibc/compat-2.1/rh62-12-glibc-compat-2.1.3-maxpacket.patch new file mode 100644 index 00000000..a5edd25d --- /dev/null +++ b/patches/glibc/compat-2.1/rh62-12-glibc-compat-2.1.3-maxpacket.patch @@ -0,0 +1,512 @@ +#--- libc/resolv/nss_dns/dns-host.c.jj Tue Sep 14 03:05:08 1999 +#+++ libc/resolv/nss_dns/dns-host.c Thu Oct 10 13:07:33 2002 +#@@ -129,9 +129,10 @@ _nss_dns_gethostbyname2_r (const char *n +# char *buffer, size_t buflen, int *errnop, +# int *h_errnop) +# { +#- querybuf host_buffer; +#+ querybuf *host_buffer; +# int size, type, n; +# const char *cp; +#+ enum nss_status status; +# +# switch (af) { +# case AF_INET: +#@@ -159,16 +160,25 @@ _nss_dns_gethostbyname2_r (const char *n +# if (strchr (name, '.') == NULL && (cp = __hostalias (name)) != NULL) +# name = cp; +# +#- n = res_search (name, C_IN, type, host_buffer.buf, sizeof (host_buffer.buf)); +#+ host_buffer = (querybuf *) malloc (sizeof (*host_buffer)); +#+ if (host_buffer == NULL) { +#+ *errnop = ENOMEM; +#+ return NSS_STATUS_UNAVAIL; +#+ } +#+ +#+ n = res_search (name, C_IN, type, host_buffer->buf, sizeof (host_buffer->buf)); +# if (n < 0) +# { +# *h_errnop = h_errno; +# *errnop = *h_errnop == TRY_AGAIN ? EAGAIN : ENOENT; +#+ free (host_buffer); +# return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; +# } +# +#- return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen, +#- errnop, h_errnop); +#+ status = getanswer_r (host_buffer, n, name, type, result, buffer, buflen, +#+ errnop, h_errnop); +#+ free (host_buffer); +#+ return status; +# } +# +# +#@@ -205,7 +215,7 @@ _nss_dns_gethostbyaddr_r (const char *ad +# char *h_addr_ptrs[MAX_NR_ADDRS + 1]; +# char linebuffer[0]; +# } *host_data = (struct host_data *) buffer; +#- querybuf host_buffer; +#+ querybuf *host_buffer; +# char qbuf[MAXDNAME+1], *qp; +# size_t size; +# int n, status; +#@@ -257,17 +267,25 @@ _nss_dns_gethostbyaddr_r (const char *ad +# /* Cannot happen. */ +# } +# +#- n = res_query (qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf, +#- sizeof host_buffer); +#+ host_buffer = (querybuf *) malloc (sizeof (*host_buffer)); +#+ if (host_buffer == NULL) { +#+ *errnop = ENOMEM; +#+ return NSS_STATUS_UNAVAIL; +#+ } +#+ +#+ n = res_query (qbuf, C_IN, T_PTR, host_buffer->buf, +#+ sizeof (host_buffer->buf)); +# if (n < 0) +# { +# *h_errnop = h_errno; +# *errnop = errno; +#+ free (host_buffer); +# return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; +# } +# +#- status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen, +#+ status = getanswer_r (host_buffer, n, qbuf, T_PTR, result, buffer, buflen, +# errnop, h_errnop); +#+ free (host_buffer); +# if (status != NSS_STATUS_SUCCESS) +# { +# *h_errnop = h_errno; +#--- libc/resolv/nss_dns/dns-network.c.jj Wed Jun 30 12:01:14 1999 +#+++ libc/resolv/nss_dns/dns-network.c Thu Oct 10 13:09:49 2002 +#@@ -113,24 +113,36 @@ _nss_dns_getnetbyname_r (const char *nam +# char *buffer, size_t buflen, int *errnop) +# { +# /* Return entry for network with NAME. */ +#- querybuf net_buffer; +#+ querybuf *net_buffer; +# int anslen; +# char *qbuf; +#+ enum nss_status status; +# +# qbuf = strdupa (name); +#- anslen = res_search (qbuf, C_IN, T_PTR, (u_char *) &net_buffer, +#- sizeof (querybuf)); +#+ +#+ net_buffer = (querybuf *) malloc (sizeof (*net_buffer)); +#+ if (net_buffer == NULL) +#+ { +#+ *errnop = ENOMEM; +#+ return NSS_STATUS_UNAVAIL; +#+ } +#+ +#+ anslen = res_search (qbuf, C_IN, T_PTR, net_buffer->buf, +#+ sizeof (net_buffer->buf)); +# if (anslen < 0) +# { +# /* Nothing found. */ +# *errnop = errno; +#+ free (net_buffer); +# return (errno == ECONNREFUSED +# || errno == EPFNOSUPPORT +# || errno == EAFNOSUPPORT) +# ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; +# } +# +#- return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME); +#+ status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYNAME); +#+ free (net_buffer); +#+ return status; +# } +# +# +#@@ -140,7 +152,7 @@ _nss_dns_getnetbyaddr_r (long net, int t +# { +# /* Return entry for network with NAME. */ +# enum nss_status status; +#- querybuf net_buffer; +#+ querybuf *net_buffer; +# unsigned int net_bytes[4]; +# char qbuf[MAXDNAME]; +# int cnt, anslen; +#@@ -176,19 +188,28 @@ _nss_dns_getnetbyaddr_r (long net, int t +# break; +# } +# +#- anslen = res_query (qbuf, C_IN, T_PTR, (u_char *) &net_buffer, +#- sizeof (querybuf)); +#+ net_buffer = (querybuf *) malloc (sizeof (*net_buffer)); +#+ if (net_buffer == NULL) +#+ { +#+ *errnop = ENOMEM; +#+ return NSS_STATUS_UNAVAIL; +#+ } +#+ +#+ anslen = res_query (qbuf, C_IN, T_PTR, net_buffer->buf, +#+ sizeof (net_buffer->buf)); +# if (anslen < 0) +# { +# /* Nothing found. */ +# *errnop = errno; +#+ free (net_buffer); +# return (errno == ECONNREFUSED +# || errno == EPFNOSUPPORT +# || errno == EAFNOSUPPORT) +# ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; +# } +# +#- status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR); +#+ status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYADDR); +#+ free (net_buffer); +# if (status == NSS_STATUS_SUCCESS) +# { +# /* Strip trailing zeros. */ +#--- libc/resolv/res_query.c.jj Wed Jun 30 12:01:06 1999 +#+++ libc/resolv/res_query.c Thu Oct 10 13:01:12 2002 +#@@ -106,7 +106,7 @@ res_query(name, class, type, answer, ans +# u_char *answer; /* buffer to put answer */ +# int anslen; /* size of answer buffer */ +# { +#- u_char buf[MAXPACKET]; +#+ u_char *buf; +# register HEADER *hp = (HEADER *) answer; +# int n; +# +#@@ -121,17 +121,25 @@ res_query(name, class, type, answer, ans +# printf(";; res_query(%s, %d, %d)\n", name, class, type); +# #endif +# +#+ buf = malloc (MAXPACKET); +#+ if (buf == NULL) { +#+ __set_h_errno (NETDB_INTERNAL); +#+ return -1; +#+ } +#+ +# n = res_mkquery(QUERY, name, class, type, NULL, 0, NULL, +#- buf, sizeof(buf)); +#+ buf, MAXPACKET); +# if (n <= 0) { +# #ifdef DEBUG +# if (_res.options & RES_DEBUG) +# printf(";; res_query: mkquery failed\n"); +# #endif +# __set_h_errno (NO_RECOVERY); +#+ free (buf); +# return (n); +# } +# n = res_send(buf, n, answer, anslen); +#+ free (buf); +# if (n < 0) { +# #ifdef DEBUG +# if (_res.options & RES_DEBUG) +#--- libc/resolv/gethnamaddr.c.jj Tue Dec 7 11:50:36 1999 +#+++ libc/resolv/gethnamaddr.c Thu Oct 10 15:05:50 2002 +#@@ -512,10 +512,11 @@ gethostbyname2(name, af) +# const char *name; +# int af; +# { +#- querybuf buf; +#+ querybuf *buf; +# register const char *cp; +# char *bp; +# int n, size, type, len; +#+ struct hostent *ret; +# extern struct hostent *_gethtbyname2(); +# +# if ((_res.options & RES_INIT) == 0 && res_init() == -1) { +#@@ -617,13 +618,22 @@ gethostbyname2(name, af) +# break; +# } +# +#- if ((n = res_search(name, C_IN, type, buf.buf, sizeof(buf.buf))) < 0) { +#+ buf = (querybuf *) malloc (sizeof (*buf)); +#+ if (buf == NULL) { +#+ __set_h_errno (NETDB_INTERNAL); +#+ return NULL; +#+ } +#+ +#+ if ((n = res_search(name, C_IN, type, buf->buf, sizeof(buf->buf))) < 0) { +#+ free (buf); +# dprintf("res_search failed (%d)\n", n); +# if (errno == ECONNREFUSED) +# return (_gethtbyname2(name, af)); +# return (NULL); +# } +#- return (getanswer(&buf, n, name, type)); +#+ ret = getanswer(buf, n, name, type); +#+ free (buf); +#+ return ret; +# } +# +# struct hostent * +#@@ -636,7 +646,7 @@ gethostbyaddr(addr, len, af) +# static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff }; +# static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 }; +# int n, size; +#- querybuf buf; +#+ querybuf *buf; +# register struct hostent *hp; +# char qbuf[MAXDNAME+1], *qp; +# #ifdef SUNSECURITY +#@@ -697,14 +707,24 @@ gethostbyaddr(addr, len, af) +# default: +# abort(); +# } +#- n = res_query(qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf); +#+ +#+ buf = (querybuf *) malloc (sizeof (*buf)); +#+ if (buf == NULL) { +#+ __set_h_errno (NETDB_INTERNAL); +#+ return NULL; +#+ } +#+ +#+ n = res_query(qbuf, C_IN, T_PTR, buf->buf, sizeof buf->buf); +# if (n < 0) { +#+ free (buf); +# dprintf("res_query failed (%d)\n", n); +# if (errno == ECONNREFUSED) +# return (_gethtbyaddr(addr, len, af)); +# return (NULL); +# } +#- if (!(hp = getanswer(&buf, n, qbuf, T_PTR))) +#+ hp = getanswer(buf, n, qbuf, T_PTR); +#+ free (buf); +#+ if (!hp) +# return (NULL); /* h_errno was set by getanswer() */ +# #ifdef SUNSECURITY +# if (af == AF_INET) { +#--- libc/resolv/getnetnamadr.c.jj Wed Jun 30 12:00:50 1999 +#+++ libc/resolv/getnetnamadr.c Thu Oct 10 13:14:01 2002 +#@@ -210,7 +210,7 @@ getnetbyaddr(net, net_type) +# { +# unsigned int netbr[4]; +# int nn, anslen; +#- querybuf buf; +#+ querybuf *buf; +# char qbuf[MAXDNAME]; +# u_int32_t net2; /* Changed from unsigned long --roland */ +# struct netent *net_entry; +#@@ -236,8 +236,15 @@ getnetbyaddr(net, net_type) +# netbr[1], netbr[0]); +# break; +# } +#- anslen = res_query(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf)); +#+ +#+ buf = (querybuf *) malloc (sizeof (*buf)); +#+ if (buf == NULL) { +#+ return NULL; +#+ } +#+ +#+ anslen = res_query(qbuf, C_IN, T_PTR, buf->buf, sizeof(buf->buf)); +# if (anslen < 0) { +#+ free (buf); +# #ifdef DEBUG +# if (_res.options & RES_DEBUG) +# printf("res_query failed\n"); +#@@ -246,7 +253,8 @@ getnetbyaddr(net, net_type) +# return (_getnetbyaddr(net, net_type)); +# return (NULL); +# } +#- net_entry = getnetanswer(&buf, anslen, BYADDR); +#+ net_entry = getnetanswer(buf, anslen, BYADDR); +#+ free (buf); +# if (net_entry) { +# unsigned u_net = net; /* maybe net should be unsigned ? */ +# +#@@ -264,7 +272,7 @@ getnetbyname(net) +# register const char *net; +# { +# int anslen; +#- querybuf buf; +#+ querybuf *buf; +# char qbuf[MAXDNAME]; +# struct netent *net_entry; +# +#@@ -273,8 +281,13 @@ getnetbyname(net) +# return (NULL); +# } +# strcpy(&qbuf[0], net); +#- anslen = res_search(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf)); +#+ buf = (querybuf *) malloc (sizeof (*buf)); +#+ if (buf == NULL) { +#+ return NULL; +#+ } +#+ anslen = res_search(qbuf, C_IN, T_PTR, buf->buf, sizeof(buf->buf)); +# if (anslen < 0) { +#+ free (buf); +# #ifdef DEBUG +# if (_res.options & RES_DEBUG) +# printf("res_query failed\n"); +#@@ -283,7 +296,8 @@ getnetbyname(net) +# return (_getnetbyname(net)); +# return (_getnetbyname(net)); +# } +#- net_entry = getnetanswer(&buf, anslen, BYNAME); +#+ net_entry = getnetanswer(buf, anslen, BYNAME); +#+ free (buf); +# if (net_entry) +# return (net_entry); +# return (_getnetbyname(net)); +--- libc/glibc-compat/nss_dns/dns-host.c.jj Mon Jan 3 20:07:08 2000 ++++ libc/glibc-compat/nss_dns/dns-host.c Thu Oct 10 12:46:24 2002 +@@ -126,9 +126,10 @@ enum nss_status + _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result, + char *buffer, size_t buflen, int *h_errnop) + { +- querybuf host_buffer; ++ querybuf *host_buffer; + int size, type, n; + const char *cp; ++ enum nss_status status; + + switch (af) { + case AF_INET: +@@ -156,15 +157,22 @@ _nss_dns_gethostbyname2_r (const char *n + if (strchr (name, '.') == NULL && (cp = __hostalias (name)) != NULL) + name = cp; + +- n = res_search (name, C_IN, type, host_buffer.buf, sizeof (host_buffer.buf)); ++ host_buffer = (querybuf *) malloc (sizeof (querybuf)); ++ if (host_buffer == NULL) ++ return NSS_STATUS_UNAVAIL; ++ ++ n = res_search (name, C_IN, type, host_buffer->buf, sizeof (host_buffer->buf)); + if (n < 0) + { + *h_errnop = h_errno; ++ free (host_buffer); + return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; + } + +- return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen, +- h_errnop); ++ status = getanswer_r (host_buffer, n, name, type, result, buffer, buflen, ++ h_errnop); ++ free (host_buffer); ++ return status; + } + + +@@ -200,7 +208,7 @@ _nss_dns_gethostbyaddr_r (const char *ad + char *h_addr_ptrs[MAX_NR_ADDRS + 1]; + char linebuffer[0]; + } *host_data = (struct host_data *) buffer; +- querybuf host_buffer; ++ querybuf *host_buffer; + char qbuf[MAXDNAME+1], *qp; + int size, n, status; + +@@ -251,16 +259,22 @@ _nss_dns_gethostbyaddr_r (const char *ad + /* Cannot happen. */ + } + +- n = res_query (qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf, +- sizeof host_buffer); ++ host_buffer = (querybuf *) malloc (sizeof (querybuf)); ++ if (host_buffer == NULL) ++ return NSS_STATUS_UNAVAIL; ++ ++ n = res_query (qbuf, C_IN, T_PTR, host_buffer->buf, ++ sizeof (host_buffer->buf)); + if (n < 0) + { + *h_errnop = h_errno; ++ free (host_buffer); + return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; + } + +- status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen, ++ status = getanswer_r (host_buffer, n, qbuf, T_PTR, result, buffer, buflen, + h_errnop); ++ free (host_buffer); + if (status != NSS_STATUS_SUCCESS) + { + *h_errnop = h_errno; +--- libc/glibc-compat/nss_dns/dns-network.c.jj Mon Jan 3 20:07:08 2000 ++++ libc/glibc-compat/nss_dns/dns-network.c Thu Oct 10 12:46:24 2002 +@@ -107,21 +107,32 @@ _nss_dns_getnetbyname_r (const char *nam + char *buffer, size_t buflen) + { + /* Return entry for network with NAME. */ +- querybuf net_buffer; ++ querybuf *net_buffer; + int anslen; + char *qbuf; ++ enum nss_status status; + + qbuf = strdupa (name); +- anslen = res_search (qbuf, C_IN, T_PTR, (u_char *) &net_buffer, +- sizeof (querybuf)); ++ ++ net_buffer = (querybuf *) malloc (sizeof (querybuf)); ++ if (net_buffer == NULL) ++ return NSS_STATUS_UNAVAIL; ++ ++ anslen = res_search (qbuf, C_IN, T_PTR, net_buffer->buf, ++ sizeof (net_buffer->buf)); + if (anslen < 0) +- /* Nothing found. */ +- return (errno == ECONNREFUSED +- || errno == EPFNOSUPPORT +- || errno == EAFNOSUPPORT) +- ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; ++ { ++ free (net_buffer); ++ /* Nothing found. */ ++ return (errno == ECONNREFUSED ++ || errno == EPFNOSUPPORT ++ || errno == EAFNOSUPPORT) ++ ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; ++ } + +- return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME); ++ status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYNAME); ++ free (net_buffer); ++ return status; + } + + +@@ -131,7 +142,7 @@ _nss_dns_getnetbyaddr_r (long net, int t + { + /* Return entry for network with NAME. */ + enum nss_status status; +- querybuf net_buffer; ++ querybuf *net_buffer; + unsigned int net_bytes[4]; + char qbuf[MAXDNAME]; + int cnt, anslen; +@@ -167,16 +178,24 @@ _nss_dns_getnetbyaddr_r (long net, int t + break; + } + +- anslen = res_query (qbuf, C_IN, T_PTR, (u_char *) &net_buffer, +- sizeof (querybuf)); ++ net_buffer = (querybuf *) malloc (sizeof (querybuf)); ++ if (net_buffer == NULL) ++ return NSS_STATUS_UNAVAIL; ++ ++ anslen = res_query (qbuf, C_IN, T_PTR, net_buffer->buf, ++ sizeof (net_buffer->buf)); + if (anslen < 0) +- /* Nothing found. */ +- return (errno == ECONNREFUSED +- || errno == EPFNOSUPPORT +- || errno == EAFNOSUPPORT) +- ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; ++ { ++ free (net_buffer); ++ /* Nothing found. */ ++ return (errno == ECONNREFUSED ++ || errno == EPFNOSUPPORT ++ || errno == EAFNOSUPPORT) ++ ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND; ++ } + +- status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR); ++ status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYADDR); ++ free (net_buffer); + if (status == NSS_STATUS_SUCCESS) + { + /* Strip trailing zeros. */ diff --git a/patches/glibc/linuxthreads-2.1.3/glibc-2.1.3-allow-gcc3-pthread.patch b/patches/glibc/linuxthreads-2.1.3/glibc-2.1.3-allow-gcc3-pthread.patch new file mode 100644 index 00000000..b52f3249 --- /dev/null +++ b/patches/glibc/linuxthreads-2.1.3/glibc-2.1.3-allow-gcc3-pthread.patch @@ -0,0 +1,33 @@ +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/pthread/pthread.h.diff?r1=1.31&r2=1.32&cvsroot=glibc + +Fixes +../linuxthreads/sysdeps/pthread/pthread.h:141: error: parse error before "__thread" +../linuxthreads/sysdeps/pthread/pthread.h:141: error: `pthread_create' declared as function returning a function +../linuxthreads/sysdeps/pthread/pthread.h:141: warning: function declaration isn't a prototype +../linuxthreads/sysdeps/pthread/pthread.h:141: error: parse error before "void" +../linuxthreads/sysdeps/pthread/pthread.h:462: error: storage class specified for parameter `type name' + +when compiling with gcc3.x + +Rediffed against glibc-2.1.3 + +--- glibc-2.1.3/linuxthreads/sysdeps/pthread/pthread.h.orig 2000-01-20 17:40:19.000000000 -0800 ++++ glibc-2.1.3/linuxthreads/sysdeps/pthread/pthread.h 2004-03-04 15:56:43.000000000 -0800 +@@ -138,7 +138,7 @@ + /* Create a thread with given attributes ATTR (or default attributes + if ATTR is NULL), and call function START_ROUTINE with given + arguments ARG. */ +-extern int pthread_create __P ((pthread_t *__thread, ++extern int pthread_create __P ((pthread_t *__threadp, + __const pthread_attr_t *__attr, + void *(*__start_routine) (void *), + void *__arg)); +@@ -459,7 +459,7 @@ + extern int pthread_setcanceltype __P ((int __type, int *__oldtype)); + + /* Cancel THREAD immediately or at the next possibility. */ +-extern int pthread_cancel __P ((pthread_t __thread)); ++extern int pthread_cancel __P ((pthread_t __cancelthread)); + + /* Test for pending cancellation for the current thread and terminate + the thread as per pthread_exit(PTHREAD_CANCELED) if it has been diff --git a/patches/glibc/linuxthreads-2.1.3/glibc-2.1.3-allow-gcc3-pthread2.patch b/patches/glibc/linuxthreads-2.1.3/glibc-2.1.3-allow-gcc3-pthread2.patch new file mode 100644 index 00000000..6234797f --- /dev/null +++ b/patches/glibc/linuxthreads-2.1.3/glibc-2.1.3-allow-gcc3-pthread2.patch @@ -0,0 +1,18 @@ +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h.diff?r1=1.5&r2=1.6&cvsroot=glibc + +Fixes + +../linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h:35: error: storage class specified for parameter `type name' + +Rediffed to match glibc-2.1.3 + +--- glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h.orig 1998-09-12 14:33:14.000000000 -0700 ++++ glibc-2.1.3/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h 2004-03-04 15:50:30.000000000 -0800 +@@ -32,6 +32,6 @@ + __sigset_t *__oldmask)); + + /* Send signal SIGNO to the given thread. */ +-extern int pthread_kill __P ((pthread_t __thread, int __signo)); ++extern int pthread_kill __P ((pthread_t __threadid, int __signo)); + + #endif /* bits/sigthread.h */ diff --git a/patches/glibc/linuxthreads-2.1.3/rh62-05-glibc-2.1.3-pthread.patch b/patches/glibc/linuxthreads-2.1.3/rh62-05-glibc-2.1.3-pthread.patch new file mode 100644 index 00000000..081bc298 --- /dev/null +++ b/patches/glibc/linuxthreads-2.1.3/rh62-05-glibc-2.1.3-pthread.patch @@ -0,0 +1,16 @@ +2000-08-03 Ulrich Drepper <drepper@redhat.com> + + * pthread.c (__pthread_set_own_extricate_if): Remove locking. + +--- glibc-2.1.3/linuxthreads/pthread.c.jj Wed Mar 22 22:26:01 2000 ++++ glibc-2.1.3/linuxthreads/pthread.c Fri Aug 25 09:37:26 2000 +@@ -775,9 +775,7 @@ weak_alias (__pthread_getconcurrency, pt + + void __pthread_set_own_extricate_if(pthread_descr self, pthread_extricate_if *peif) + { +- __pthread_lock(self->p_lock, self); + THREAD_SETMEM(self, p_extricate, peif); +- __pthread_unlock(self->p_lock); + } + + /* Primitives for controlling thread execution */ diff --git a/patches/glibc/linuxthreads-2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-td.patch b/patches/glibc/linuxthreads-2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-td.patch new file mode 100644 index 00000000..59f6060e --- /dev/null +++ b/patches/glibc/linuxthreads-2.1.3/rh62-99-glibc-2.1.3-allow-gcc-3.4-td.patch @@ -0,0 +1,808 @@ +Fixes following error building glibc-2.2.5 with gcc-3.4: +td_init.c: In function `td_init': +td_init.c:30: error: parse error before string constant +td_init.c:30: error: parse error before string constant +make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.2.5/build-glibc/linuxthreads_db/td_init.os] Error 1 + +# Retrieved by diffing a +-1 day rng around the time mentioned +# in http://sources.redhat.com/ml/glibc-cvs/2001-q4/msg00654.html +# cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/glibc diff -u -D"2001-12-27 08:41:30" -D"2001-12-29 08:41:32" +# then fixing paths. + +# And then removing hunks that don't apply to rh6.2's glibc-2.1.3 +# (thankfully, all were comments) +# and rediffing one hunk for glibc-2.1.3 + +Index: td_init.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_init.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_init.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_init.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Initialization function of thread debugger support library. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -27,6 +27,6 @@ + td_init (void) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_init"); + return TD_OK; + } +Index: td_log.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_log.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_log.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_log.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Noop, left for historical reasons. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,8 +25,8 @@ + td_log (void) + { + /* This interface is deprecated in the Sun interface. We provide it +- for compatibility but don't do anyhting ourself. We might in ++ for compatibility but don't do anything ourself. We might in + future do some logging if this seems reasonable. */ +- LOG (__FUNCTION__); ++ LOG ("td_log"); + return TD_OK; + } +Index: td_ta_clear_event.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_clear_event.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_ta_clear_event.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_ta_clear_event.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Globally disable events. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -29,7 +29,7 @@ + td_thr_events_t old_event; + int i; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_clear_event"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_delete.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_delete.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_ta_delete.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_ta_delete.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Detach to target process. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -26,7 +26,7 @@ + td_err_e + td_ta_delete (td_thragent_t *ta) + { +- LOG (__FUNCTION__); ++ LOG ("td_ta_delete"); + + /* Safety check. */ + if (ta == NULL || __td_agent_list == NULL) +Index: td_ta_enable_stats.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_enable_stats.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_ta_enable_stats.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_ta_enable_stats.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Enable collection of statistics for process. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,7 +25,7 @@ + td_ta_enable_stats (const td_thragent_t *ta, int enable) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_ta_enable_stats"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_event_addr.c +=================================================================== +--- glibc-2.1.3/linuxthreads_db/td_ta_event_addr.c~ Tue Nov 9 21:05:07 1999 ++++ glibc-2.1.3/linuxthreads_db/td_ta_event_addr.c Sun Apr 11 22:23:28 2004 +@@ -29,7 +29,7 @@ + td_err_e res = TD_NOEVENT; + const char *symbol = NULL; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_event_addr"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_event_getmsg.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_event_getmsg.c,v +retrieving revision 1.5 +retrieving revision 1.6 +diff -u -r1.5 -r1.6 +--- libc/linuxthreads_db/td_ta_event_getmsg.c 6 Jul 2001 05:27:23 -0000 1.5 ++++ libc/linuxthreads_db/td_ta_event_getmsg.c 28 Dec 2001 16:41:29 -0000 1.6 +@@ -1,5 +1,5 @@ + /* Retrieve event. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -32,7 +32,7 @@ + td_eventbuf_t event; + psaddr_t addr; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_event_getmsg"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_get_nthreads.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_get_nthreads.c,v +retrieving revision 1.5 +retrieving revision 1.6 +diff -u -r1.5 -r1.6 +--- libc/linuxthreads_db/td_ta_get_nthreads.c 6 Jul 2001 05:27:23 -0000 1.5 ++++ libc/linuxthreads_db/td_ta_get_nthreads.c 28 Dec 2001 16:41:29 -0000 1.6 +@@ -25,7 +25,7 @@ + { + psaddr_t addr; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_get_nthreads"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_get_ph.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_get_ph.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_ta_get_ph.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_ta_get_ph.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Get external process handle. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -24,7 +24,7 @@ + td_err_e + td_ta_get_ph (const td_thragent_t *ta, struct ps_prochandle **ph) + { +- LOG (__FUNCTION__); ++ LOG ("td_ta_get_ph"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_get_stats.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_get_stats.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_ta_get_stats.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_ta_get_stats.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Retrieve statistics for process. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,7 +25,7 @@ + td_ta_get_stats (const td_thragent_t *ta, td_ta_stats_t *statsp) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_ta_get_stats"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_map_id2thr.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_map_id2thr.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/linuxthreads_db/td_ta_map_id2thr.c 6 Jul 2001 05:27:23 -0000 1.4 ++++ libc/linuxthreads_db/td_ta_map_id2thr.c 28 Dec 2001 16:41:29 -0000 1.5 +@@ -28,7 +28,7 @@ + struct _pthread_descr_struct pds; + int pthread_threads_max; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_map_id2thr"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_map_lwp2thr.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_map_lwp2thr.c,v +retrieving revision 1.5 +retrieving revision 1.6 +diff -u -r1.5 -r1.6 +--- libc/linuxthreads_db/td_ta_map_lwp2thr.c 6 Jul 2001 05:27:23 -0000 1.5 ++++ libc/linuxthreads_db/td_ta_map_lwp2thr.c 28 Dec 2001 16:41:29 -0000 1.6 +@@ -1,5 +1,5 @@ + /* Which thread is running on an lwp? +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -34,7 +34,7 @@ + # define num 1 + #endif + +- LOG (__FUNCTION__); ++ LOG ("td_ta_map_lwp2thr"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_new.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_new.c,v +retrieving revision 1.10 +retrieving revision 1.11 +diff -u -r1.10 -r1.11 +--- libc/linuxthreads_db/td_ta_new.c 6 Jul 2001 05:27:23 -0000 1.10 ++++ libc/linuxthreads_db/td_ta_new.c 28 Dec 2001 16:41:29 -0000 1.11 +@@ -35,7 +35,7 @@ + psaddr_t addr; + struct agent_list *elemp; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_new"); + + /* Get the global event mask. This is one of the variables which + are new in the thread library to enable debugging. If it is +Index: td_ta_reset_stats.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_reset_stats.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_ta_reset_stats.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_ta_reset_stats.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Reset statistics. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,7 +25,7 @@ + td_ta_reset_stats (const td_thragent_t *ta) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_ta_reset_stats"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_set_event.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_set_event.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/linuxthreads_db/td_ta_set_event.c 6 Jul 2001 05:27:23 -0000 1.4 ++++ libc/linuxthreads_db/td_ta_set_event.c 28 Dec 2001 16:41:29 -0000 1.5 +@@ -1,5 +1,5 @@ + /* Globally enable events. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -29,7 +29,7 @@ + td_thr_events_t old_event; + int i; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_set_event"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_setconcurrency.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_setconcurrency.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_ta_setconcurrency.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_ta_setconcurrency.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Set suggested concurrency level for process. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,7 +25,7 @@ + td_ta_setconcurrency (const td_thragent_t *ta, int level) + { + /* This is something LinuxThreads does not support. */ +- LOG (__FUNCTION__); ++ LOG ("td_ta_setconcurrency"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_thr_iter.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_thr_iter.c,v +retrieving revision 1.11 +retrieving revision 1.12 +diff -u -r1.11 -r1.12 +--- libc/linuxthreads_db/td_ta_thr_iter.c 6 Jul 2001 05:27:23 -0000 1.11 ++++ libc/linuxthreads_db/td_ta_thr_iter.c 28 Dec 2001 16:41:29 -0000 1.12 +@@ -86,7 +86,7 @@ + # define num 1 + #endif + +- LOG (__FUNCTION__); ++ LOG ("td_ta_thr_iter"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_tsd_iter.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_tsd_iter.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/linuxthreads_db/td_ta_tsd_iter.c 6 Jul 2001 05:27:23 -0000 1.4 ++++ libc/linuxthreads_db/td_ta_tsd_iter.c 28 Dec 2001 16:41:29 -0000 1.5 +@@ -29,7 +29,7 @@ + int pthread_keys_max; + int cnt; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_tsd_iter"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_thr_clear_event.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_clear_event.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_thr_clear_event.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_thr_clear_event.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Disable specific event for thread. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -31,7 +31,7 @@ + td_thr_events_t old_event; + int i; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_clear_event"); + + /* Write the new value into the thread data structure. */ + if (ps_pdread (th->th_ta_p->ph, +Index: td_thr_dbresume.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_dbresume.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_dbresume.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_dbresume.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Resume execution of given thread. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,6 +25,6 @@ + td_thr_dbresume (const td_thrhandle_t *th) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_dbresume"); + return TD_NOCAPAB; + } +Index: td_thr_dbsuspend.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_dbsuspend.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_dbsuspend.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_dbsuspend.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Suspend execution of given thread. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,6 +25,6 @@ + td_thr_dbsuspend (const td_thrhandle_t *th) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_dbsuspend"); + return TD_NOCAPAB; + } +Index: td_thr_event_enable.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_event_enable.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_thr_event_enable.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_thr_event_enable.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Enable event process-wide. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -28,7 +28,7 @@ + const td_thrhandle_t *th; + int onoff; + { +- LOG (__FUNCTION__); ++ LOG ("td_thr_event_enable"); + + /* Write the new value into the thread data structure. */ + if (ps_pdwrite (th->th_ta_p->ph, +Index: td_thr_event_getmsg.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_event_getmsg.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_thr_event_getmsg.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_thr_event_getmsg.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Retrieve event. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -29,7 +29,7 @@ + { + td_eventbuf_t event; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_event_getmsg"); + + /* Read the even structure from the target. */ + if (ps_pdread (th->th_ta_p->ph, +Index: td_thr_get_info.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_get_info.c,v +retrieving revision 1.9 +retrieving revision 1.10 +diff -u -r1.9 -r1.10 +--- libc/linuxthreads_db/td_thr_get_info.c 6 Jul 2001 05:27:23 -0000 1.9 ++++ libc/linuxthreads_db/td_thr_get_info.c 28 Dec 2001 16:41:29 -0000 1.10 +@@ -29,7 +29,7 @@ + { + struct _pthread_descr_struct pds; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_get_info"); + + /* Get the thread descriptor. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +Index: td_thr_getfpregs.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getfpregs.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/linuxthreads_db/td_thr_getfpregs.c 6 Jul 2001 05:27:23 -0000 1.4 ++++ libc/linuxthreads_db/td_thr_getfpregs.c 28 Dec 2001 16:41:29 -0000 1.5 +@@ -26,7 +26,7 @@ + { + struct _pthread_descr_struct pds; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_getfpregs"); + + /* We have to get the state and the PID for this thread. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +Index: td_thr_getgregs.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getgregs.c,v +retrieving revision 1.8 +retrieving revision 1.9 +diff -u -r1.8 -r1.9 +--- libc/linuxthreads_db/td_thr_getgregs.c 6 Jul 2001 05:27:23 -0000 1.8 ++++ libc/linuxthreads_db/td_thr_getgregs.c 28 Dec 2001 16:41:29 -0000 1.9 +@@ -26,7 +26,7 @@ + { + struct _pthread_descr_struct pds; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_getgregs"); + + /* We have to get the state and the PID for this thread. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +Index: td_thr_getxregs.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getxregs.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_getxregs.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_getxregs.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Get a thread's extra state register set. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,6 +25,6 @@ + td_thr_getxregs (const td_thrhandle_t *th, void *xregs) + { + /* XXX This might be platform specific. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_getxregs"); + return TD_NOXREGS; + } +Index: td_thr_getxregsize.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getxregsize.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_getxregsize.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_getxregsize.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Get the size of the extra state register set for this architecture. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,6 +25,6 @@ + td_thr_getxregsize (const td_thrhandle_t *th, int *sizep) + { + /* XXX This might be platform specific. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_getxregsize"); + return TD_NOXREGS; + } +Index: td_thr_set_event.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_set_event.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/linuxthreads_db/td_thr_set_event.c 6 Jul 2001 05:27:23 -0000 1.4 ++++ libc/linuxthreads_db/td_thr_set_event.c 28 Dec 2001 16:41:29 -0000 1.5 +@@ -1,5 +1,5 @@ + /* Enable specific event for thread. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -31,7 +31,7 @@ + td_thr_events_t old_event; + int i; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_set_event"); + + /* Write the new value into the thread data structure. */ + if (ps_pdread (th->th_ta_p->ph, +Index: td_thr_setfpregs.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setfpregs.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/linuxthreads_db/td_thr_setfpregs.c 6 Jul 2001 05:27:23 -0000 1.4 ++++ libc/linuxthreads_db/td_thr_setfpregs.c 28 Dec 2001 16:41:29 -0000 1.5 +@@ -26,7 +26,7 @@ + { + struct _pthread_descr_struct pds; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_setfpregs"); + + /* We have to get the state and the PID for this thread. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +Index: td_thr_setgregs.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setgregs.c,v +retrieving revision 1.6 +retrieving revision 1.7 +diff -u -r1.6 -r1.7 +--- libc/linuxthreads_db/td_thr_setgregs.c 6 Jul 2001 05:27:23 -0000 1.6 ++++ libc/linuxthreads_db/td_thr_setgregs.c 28 Dec 2001 16:41:29 -0000 1.7 +@@ -26,7 +26,7 @@ + { + struct _pthread_descr_struct pds; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_setgregs"); + + /* We have to get the state and the PID for this thread. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +Index: td_thr_setprio.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setprio.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_setprio.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_setprio.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Set a thread's priority. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,6 +25,6 @@ + td_thr_setprio (const td_thrhandle_t *th, int prio) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_setprio"); + return TD_OK; + } +Index: td_thr_setsigpending.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setsigpending.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_setsigpending.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_setsigpending.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Raise a signal for a thread. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -26,6 +26,6 @@ + const sigset_t *ss) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_setsigpending"); + return TD_OK; + } +Index: td_thr_setxregs.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setxregs.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_setxregs.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_setxregs.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Set a thread's extra state register set. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,6 +25,6 @@ + td_thr_setxregs (const td_thrhandle_t *ta, const void *addr) + { + /* XXX This might have to be platform specific. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_setxregs"); + return TD_NOXREGS; + } +Index: td_thr_sigsetmask.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_sigsetmask.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_sigsetmask.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_sigsetmask.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Set a thread's signal mask. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,6 +25,6 @@ + td_thr_sigsetmask (const td_thrhandle_t *th, const sigset_t *ss) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_sigsetmask"); + return TD_OK; + } +Index: td_thr_tsd.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_tsd.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_tsd.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_tsd.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Get a thread-specific data pointer for a thread. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -33,7 +33,7 @@ + unsigned int idx2nd; + void *p; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_tsd"); + + /* Get the thread descriptor. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +Index: td_thr_validate.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_validate.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/linuxthreads_db/td_thr_validate.c 6 Jul 2001 05:27:23 -0000 1.4 ++++ libc/linuxthreads_db/td_thr_validate.c 28 Dec 2001 16:41:29 -0000 1.5 +@@ -28,7 +28,7 @@ + int pthread_threads_max = th->th_ta_p->pthread_threads_max; + int cnt; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_validate"); + + /* Now get all descriptors, one after the other. */ + for (cnt = 0; cnt < pthread_threads_max; ++cnt, ++handles) diff --git a/patches/glibc/linuxthreads-2.2.2/glibc-linuxthreads-2.2.2-allow-gcc3.patch b/patches/glibc/linuxthreads-2.2.2/glibc-linuxthreads-2.2.2-allow-gcc3.patch new file mode 100644 index 00000000..7719e5e4 --- /dev/null +++ b/patches/glibc/linuxthreads-2.2.2/glibc-linuxthreads-2.2.2-allow-gcc3.patch @@ -0,0 +1,497 @@ +Fixes +td_init.c:30: error: parse error before string constant +td_init.c:30: error: parse error before string constant + +From http://sources.redhat.com/ml/crossgcc/2005-01/msg00106.html : +--- +Date: Mon, 31 Jan 2005 10:27:32 -0800 +Message-ID: <BF124E1E7928E546B5705D93C699ABDC0C7E99@glimmer.glimmerglassnet.com> +From: "Vince Chen" <chen at glimmerglass dot com> +To: <crossgcc at sources dot redhat dot com> + +I needed to build glibc-2.2.2 using gcc-3.x to support +some of our older redhat machines. + +This file patches glibc-linuxthreads-2.2.2. + +When using crosstool, I placed it in: + + patches/glibc-linuxthreads-2.2.2/linuxthreads-gcc3.patch + +(you also need the glibc-gcc3.patch) + +-vince +--- +[removed parts already in threadparam.patch] + +=================================================================== +--- glibc-2.2.2/linuxthreads_db.orig/td_init.c 1999-11-22 12:52:34.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_init.c 2005-01-27 19:05:36.000000000 -0800 +@@ -27,6 +27,6 @@ + td_init (void) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_init"); + return TD_OK; + } +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_log.c glibc-2.2.2/linuxthreads_db/td_log.c +--- glibc-2.2.2/linuxthreads_db.orig/td_log.c 1999-10-07 23:31:32.000000000 -0700 ++++ glibc-2.2.2/linuxthreads_db/td_log.c 2005-01-27 19:05:29.000000000 -0800 +@@ -27,6 +27,6 @@ + /* This interface is deprecated in the Sun interface. We provide it + for compatibility but don't do anyhting ourself. We might in + future do some logging if this seems reasonable. */ +- LOG (__FUNCTION__); ++ LOG ("td_log"); + return TD_OK; + } +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_clear_event.c glibc-2.2.2/linuxthreads_db/td_ta_clear_event.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_clear_event.c 1999-11-08 14:52:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_clear_event.c 2005-01-27 19:05:20.000000000 -0800 +@@ -22,14 +22,12 @@ + + + td_err_e +-td_ta_clear_event (ta, event) +- const td_thragent_t *ta; +- td_thr_events_t *event; ++td_ta_clear_event (const td_thragent_t *ta, td_thr_events_t *event) + { + td_thr_events_t old_event; + int i; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_clear_event"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_delete.c glibc-2.2.2/linuxthreads_db/td_ta_delete.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_delete.c 1999-11-08 14:52:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_delete.c 2005-01-27 19:04:59.000000000 -0800 +@@ -26,7 +26,7 @@ + td_err_e + td_ta_delete (td_thragent_t *ta) + { +- LOG (__FUNCTION__); ++ LOG ("td_ta_delete"); + + /* Safety check. */ + if (ta == NULL || __td_agent_list == NULL) +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_enable_stats.c glibc-2.2.2/linuxthreads_db/td_ta_enable_stats.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_enable_stats.c 1999-11-08 14:52:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_enable_stats.c 2005-01-27 19:04:50.000000000 -0800 +@@ -25,7 +25,7 @@ + td_ta_enable_stats (const td_thragent_t *ta, int enable) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_ta_enable_stats"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_event_addr.c glibc-2.2.2/linuxthreads_db/td_ta_event_addr.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_event_addr.c 1999-11-08 14:52:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_event_addr.c 2005-01-27 19:04:41.000000000 -0800 +@@ -29,7 +29,7 @@ + td_err_e res = TD_NOEVENT; + const char *symbol = NULL; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_event_addr"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_event_getmsg.c glibc-2.2.2/linuxthreads_db/td_ta_event_getmsg.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_event_getmsg.c 1999-11-08 14:52:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_event_getmsg.c 2005-01-27 19:04:33.000000000 -0800 +@@ -32,7 +32,7 @@ + td_eventbuf_t event; + psaddr_t addr; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_event_getmsg"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_get_nthreads.c glibc-2.2.2/linuxthreads_db/td_ta_get_nthreads.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_get_nthreads.c 1999-11-08 14:52:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_get_nthreads.c 2005-01-27 19:04:25.000000000 -0800 +@@ -26,7 +26,7 @@ + { + psaddr_t addr; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_get_nthreads"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_get_ph.c glibc-2.2.2/linuxthreads_db/td_ta_get_ph.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_get_ph.c 1999-11-08 14:52:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_get_ph.c 2005-01-27 19:04:17.000000000 -0800 +@@ -24,7 +24,7 @@ + td_err_e + td_ta_get_ph (const td_thragent_t *ta, struct ps_prochandle **ph) + { +- LOG (__FUNCTION__); ++ LOG ("td_ta_get_ph"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_get_stats.c glibc-2.2.2/linuxthreads_db/td_ta_get_stats.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_get_stats.c 1999-11-08 14:52:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_get_stats.c 2005-01-27 19:04:06.000000000 -0800 +@@ -25,7 +25,7 @@ + td_ta_get_stats (const td_thragent_t *ta, td_ta_stats_t *statsp) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_ta_get_stats"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_map_id2thr.c glibc-2.2.2/linuxthreads_db/td_ta_map_id2thr.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_map_id2thr.c 1999-11-08 14:52:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_map_id2thr.c 2005-01-27 19:03:54.000000000 -0800 +@@ -28,7 +28,7 @@ + struct _pthread_descr_struct pds; + int pthread_threads_max; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_map_id2thr"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_map_lwp2thr.c glibc-2.2.2/linuxthreads_db/td_ta_map_lwp2thr.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_map_lwp2thr.c 1999-11-22 18:25:26.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_map_lwp2thr.c 2005-01-27 19:03:46.000000000 -0800 +@@ -34,7 +34,7 @@ + # define num 1 + #endif + +- LOG (__FUNCTION__); ++ LOG ("td_ta_map_lwp2thr"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_new.c glibc-2.2.2/linuxthreads_db/td_ta_new.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_new.c 1999-11-08 14:52:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_new.c 2005-01-27 19:03:36.000000000 -0800 +@@ -36,7 +36,7 @@ + psaddr_t addr; + struct agent_list *elemp; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_new"); + + /* Get the global event mask. This is one of the variables which + are new in the thread library to enable debugging. If it is +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_reset_stats.c glibc-2.2.2/linuxthreads_db/td_ta_reset_stats.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_reset_stats.c 1999-11-08 14:52:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_reset_stats.c 2005-01-27 19:03:27.000000000 -0800 +@@ -25,7 +25,7 @@ + td_ta_reset_stats (const td_thragent_t *ta) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_ta_reset_stats"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_set_event.c glibc-2.2.2/linuxthreads_db/td_ta_set_event.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_set_event.c 1999-11-08 14:52:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_set_event.c 2005-01-27 19:03:15.000000000 -0800 +@@ -22,14 +22,12 @@ + + + td_err_e +-td_ta_set_event (ta, event) +- const td_thragent_t *ta; +- td_thr_events_t *event; ++td_ta_set_event (const td_thragent_t *ta, td_thr_events_t *event) + { + td_thr_events_t old_event; + int i; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_set_event"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_setconcurrency.c glibc-2.2.2/linuxthreads_db/td_ta_setconcurrency.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_setconcurrency.c 1999-11-08 14:52:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_setconcurrency.c 2005-01-27 19:02:48.000000000 -0800 +@@ -25,7 +25,7 @@ + td_ta_setconcurrency (const td_thragent_t *ta, int level) + { + /* This is something LinuxThreads does not support. */ +- LOG (__FUNCTION__); ++ LOG ("td_ta_setconcurrency"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_thr_iter.c glibc-2.2.2/linuxthreads_db/td_ta_thr_iter.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_thr_iter.c 2000-02-28 12:34:06.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_thr_iter.c 2005-01-27 19:02:39.000000000 -0800 +@@ -86,7 +86,7 @@ + # define num 1 + #endif + +- LOG (__FUNCTION__); ++ LOG ("td_ta_thr_iter"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_ta_tsd_iter.c glibc-2.2.2/linuxthreads_db/td_ta_tsd_iter.c +--- glibc-2.2.2/linuxthreads_db.orig/td_ta_tsd_iter.c 2000-02-28 12:34:06.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_ta_tsd_iter.c 2005-01-27 19:02:29.000000000 -0800 +@@ -29,7 +29,7 @@ + int pthread_keys_max; + int cnt; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_tsd_iter"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_clear_event.c glibc-2.2.2/linuxthreads_db/td_thr_clear_event.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_clear_event.c 1999-11-03 10:37:18.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_thr_clear_event.c 2005-01-27 19:02:19.000000000 -0800 +@@ -24,14 +24,12 @@ + + + td_err_e +-td_thr_clear_event (th, event) +- const td_thrhandle_t *th; +- td_thr_events_t *event; ++td_thr_clear_event (const td_thrhandle_t *th, td_thr_events_t *event) + { + td_thr_events_t old_event; + int i; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_clear_event"); + + /* Write the new value into the thread data structure. */ + if (ps_pdread (th->th_ta_p->ph, +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_dbresume.c glibc-2.2.2/linuxthreads_db/td_thr_dbresume.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_dbresume.c 1999-10-07 23:40:02.000000000 -0700 ++++ glibc-2.2.2/linuxthreads_db/td_thr_dbresume.c 2005-01-27 19:01:54.000000000 -0800 +@@ -25,6 +25,6 @@ + td_thr_dbresume (const td_thrhandle_t *th) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_dbresume"); + return TD_NOCAPAB; + } +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_dbsuspend.c glibc-2.2.2/linuxthreads_db/td_thr_dbsuspend.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_dbsuspend.c 1999-10-07 23:40:33.000000000 -0700 ++++ glibc-2.2.2/linuxthreads_db/td_thr_dbsuspend.c 2005-01-27 19:01:46.000000000 -0800 +@@ -25,6 +25,6 @@ + td_thr_dbsuspend (const td_thrhandle_t *th) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_dbsuspend"); + return TD_NOCAPAB; + } +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_event_enable.c glibc-2.2.2/linuxthreads_db/td_thr_event_enable.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_event_enable.c 1999-11-02 16:06:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_thr_event_enable.c 2005-01-27 19:01:35.000000000 -0800 +@@ -24,11 +24,9 @@ + + + td_err_e +-td_thr_event_enable (th, onoff) +- const td_thrhandle_t *th; +- int onoff; ++td_thr_event_enable (const td_thrhandle_t *th, int onoff) + { +- LOG (__FUNCTION__); ++ LOG ("td_thr_event_enable"); + + /* Write the new value into the thread data structure. */ + if (ps_pdwrite (th->th_ta_p->ph, +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_event_getmsg.c glibc-2.2.2/linuxthreads_db/td_thr_event_getmsg.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_event_getmsg.c 1999-11-02 16:06:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_thr_event_getmsg.c 2005-01-27 19:01:11.000000000 -0800 +@@ -29,7 +29,7 @@ + { + td_eventbuf_t event; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_event_getmsg"); + + /* Read the even structure from the target. */ + if (ps_pdread (th->th_ta_p->ph, +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_get_info.c glibc-2.2.2/linuxthreads_db/td_thr_get_info.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_get_info.c 2000-05-01 14:56:42.000000000 -0700 ++++ glibc-2.2.2/linuxthreads_db/td_thr_get_info.c 2005-01-27 19:00:59.000000000 -0800 +@@ -29,7 +29,7 @@ + { + struct _pthread_descr_struct pds; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_get_info"); + + /* Get the thread descriptor. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_getfpregs.c glibc-2.2.2/linuxthreads_db/td_thr_getfpregs.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_getfpregs.c 1999-11-02 16:06:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_thr_getfpregs.c 2005-01-27 19:00:49.000000000 -0800 +@@ -26,7 +26,7 @@ + { + struct _pthread_descr_struct pds; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_getfpregs"); + + /* We have to get the state and the PID for this thread. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_getgregs.c glibc-2.2.2/linuxthreads_db/td_thr_getgregs.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_getgregs.c 2000-02-11 15:48:51.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_thr_getgregs.c 2005-01-27 19:00:37.000000000 -0800 +@@ -26,7 +26,7 @@ + { + struct _pthread_descr_struct pds; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_getgregs"); + + /* We have to get the state and the PID for this thread. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_getxregs.c glibc-2.2.2/linuxthreads_db/td_thr_getxregs.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_getxregs.c 1999-10-07 23:46:09.000000000 -0700 ++++ glibc-2.2.2/linuxthreads_db/td_thr_getxregs.c 2005-01-27 19:00:26.000000000 -0800 +@@ -25,6 +25,6 @@ + td_thr_getxregs (const td_thrhandle_t *th, void *xregs) + { + /* XXX This might be platform specific. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_getxregs"); + return TD_NOXREGS; + } +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_getxregsize.c glibc-2.2.2/linuxthreads_db/td_thr_getxregsize.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_getxregsize.c 1999-10-07 23:46:33.000000000 -0700 ++++ glibc-2.2.2/linuxthreads_db/td_thr_getxregsize.c 2005-01-27 19:00:16.000000000 -0800 +@@ -25,6 +25,6 @@ + td_thr_getxregsize (const td_thrhandle_t *th, int *sizep) + { + /* XXX This might be platform specific. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_getxregsize"); + return TD_NOXREGS; + } +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_set_event.c glibc-2.2.2/linuxthreads_db/td_thr_set_event.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_set_event.c 1999-11-03 10:37:18.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_thr_set_event.c 2005-01-27 19:00:08.000000000 -0800 +@@ -24,14 +24,12 @@ + + + td_err_e +-td_thr_set_event (th, event) +- const td_thrhandle_t *th; +- td_thr_events_t *event; ++td_thr_set_event (const td_thrhandle_t *th, td_thr_events_t *event) + { + td_thr_events_t old_event; + int i; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_set_event"); + + /* Write the new value into the thread data structure. */ + if (ps_pdread (th->th_ta_p->ph, +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_setfpregs.c glibc-2.2.2/linuxthreads_db/td_thr_setfpregs.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_setfpregs.c 1999-11-02 16:06:10.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_thr_setfpregs.c 2005-01-27 18:59:06.000000000 -0800 +@@ -26,7 +26,7 @@ + { + struct _pthread_descr_struct pds; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_setfpregs"); + + /* We have to get the state and the PID for this thread. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_setgregs.c glibc-2.2.2/linuxthreads_db/td_thr_setgregs.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_setgregs.c 2000-02-11 15:48:51.000000000 -0800 ++++ glibc-2.2.2/linuxthreads_db/td_thr_setgregs.c 2005-01-27 18:58:57.000000000 -0800 +@@ -26,7 +26,7 @@ + { + struct _pthread_descr_struct pds; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_setgregs"); + + /* We have to get the state and the PID for this thread. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_setprio.c glibc-2.2.2/linuxthreads_db/td_thr_setprio.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_setprio.c 1999-10-07 23:49:11.000000000 -0700 ++++ glibc-2.2.2/linuxthreads_db/td_thr_setprio.c 2005-01-27 18:58:46.000000000 -0800 +@@ -25,6 +25,6 @@ + td_thr_setprio (const td_thrhandle_t *th, int prio) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_setprio"); + return TD_OK; + } +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_setsigpending.c glibc-2.2.2/linuxthreads_db/td_thr_setsigpending.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_setsigpending.c 1999-10-07 23:49:38.000000000 -0700 ++++ glibc-2.2.2/linuxthreads_db/td_thr_setsigpending.c 2005-01-27 18:58:34.000000000 -0800 +@@ -26,6 +26,6 @@ + const sigset_t *ss) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_setsigpending"); + return TD_OK; + } +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_setxregs.c glibc-2.2.2/linuxthreads_db/td_thr_setxregs.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_setxregs.c 1999-10-07 23:48:20.000000000 -0700 ++++ glibc-2.2.2/linuxthreads_db/td_thr_setxregs.c 2005-01-27 18:58:21.000000000 -0800 +@@ -25,6 +25,6 @@ + td_thr_setxregs (const td_thrhandle_t *ta, const void *addr) + { + /* XXX This might have to be platform specific. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_setxregs"); + return TD_NOXREGS; + } +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_sigsetmask.c glibc-2.2.2/linuxthreads_db/td_thr_sigsetmask.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_sigsetmask.c 1999-10-07 23:50:34.000000000 -0700 ++++ glibc-2.2.2/linuxthreads_db/td_thr_sigsetmask.c 2005-01-27 18:57:58.000000000 -0800 +@@ -25,6 +25,6 @@ + td_thr_sigsetmask (const td_thrhandle_t *th, const sigset_t *ss) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_sigsetmask"); + return TD_OK; + } +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_tsd.c glibc-2.2.2/linuxthreads_db/td_thr_tsd.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_tsd.c 1999-10-07 23:52:15.000000000 -0700 ++++ glibc-2.2.2/linuxthreads_db/td_thr_tsd.c 2005-01-27 18:58:09.000000000 -0800 +@@ -33,7 +33,7 @@ + unsigned int idx2nd; + void *p; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_tsd"); + + /* Get the thread descriptor. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +diff -ru glibc-2.2.2/linuxthreads_db.orig/td_thr_validate.c glibc-2.2.2/linuxthreads_db/td_thr_validate.c +--- glibc-2.2.2/linuxthreads_db.orig/td_thr_validate.c 1999-10-14 17:24:20.000000000 -0700 ++++ glibc-2.2.2/linuxthreads_db/td_thr_validate.c 2005-01-27 18:57:41.000000000 -0800 +@@ -28,7 +28,7 @@ + int pthread_threads_max = th->th_ta_p->pthread_threads_max; + int cnt; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_validate"); + + /* Now get all descriptors, one after the other. */ + for (cnt = 0; cnt < pthread_threads_max; ++cnt, ++handles) diff --git a/patches/glibc/linuxthreads-2.2.2/threadparam.patch b/patches/glibc/linuxthreads-2.2.2/threadparam.patch new file mode 100644 index 00000000..dd97838c --- /dev/null +++ b/patches/glibc/linuxthreads-2.2.2/threadparam.patch @@ -0,0 +1,69 @@ +2002-05-21 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/pthread/pthread.h (pthread_create): Rename first parameter. + (pthread_cancel): Likewise. + * internals.h (__pthread_create_2_1): Likewise. + * sysdeps/unix/sysv/linux/bits/sigthread.h (pthread_kill): Likewise. +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads/internals.h,v +retrieving revision 1.69.2.2 +retrieving revision 1.69.2.3 +diff -u -r1.69.2.2 -r1.69.2.3 +--- libc/linuxthreads/internals.h 2002/03/22 08:30:32 1.69.2.2 ++++ libc/linuxthreads/internals.h 2002/08/20 22:01:25 1.69.2.3 +@@ -554,7 +554,7 @@ + /* Prototypes for compatibility functions. */ + extern int __pthread_attr_init_2_1 (pthread_attr_t *__attr); + extern int __pthread_attr_init_2_0 (pthread_attr_t *__attr); +-extern int __pthread_create_2_1 (pthread_t *__restrict __thread, ++extern int __pthread_create_2_1 (pthread_t *__restrict __threadp, + const pthread_attr_t *__attr, + void *(*__start_routine) (void *), + void *__restrict __arg); +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/pthread/pthread.h,v +retrieving revision 1.31 +retrieving revision 1.31.2.1 +diff -u -r1.31 -r1.31.2.1 +--- libc/linuxthreads/sysdeps/pthread/pthread.h 2001/03/15 21:12:31 1.31 ++++ libc/linuxthreads/sysdeps/pthread/pthread.h 2002/08/20 22:01:26 1.31.2.1 +@@ -160,7 +160,7 @@ + /* Create a thread with given attributes ATTR (or default attributes + if ATTR is NULL), and call function START_ROUTINE with given + arguments ARG. */ +-extern int pthread_create (pthread_t *__restrict __thread, ++extern int pthread_create (pthread_t *__restrict __threadp, + __const pthread_attr_t *__restrict __attr, + void *(*__start_routine) (void *), + void *__restrict __arg) __THROW; +@@ -588,7 +588,7 @@ + extern int pthread_setcanceltype (int __type, int *__oldtype) __THROW; + + /* Cancel THREAD immediately or at the next possibility. */ +-extern int pthread_cancel (pthread_t __thread) __THROW; ++extern int pthread_cancel (pthread_t __cancelthread) __THROW; + + /* Test for pending cancellation for the current thread and terminate + the thread as per pthread_exit(PTHREAD_CANCELED) if it has been +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h,v +retrieving revision 1.5 +retrieving revision 1.5.2.1 +diff -u -r1.5 -r1.5.2.1 +--- libc/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h 2000/08/21 06:48:03 1.5 ++++ libc/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h 2002/08/20 22:01:26 1.5.2.1 +@@ -1,5 +1,5 @@ + /* Signal handling function for threaded programs. +- Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. ++ Copyright (C) 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 +@@ -33,6 +33,6 @@ + __sigset_t *__restrict __oldmask)__THROW; + + /* Send signal SIGNO to the given thread. */ +-extern int pthread_kill (pthread_t __thread, int __signo) __THROW; ++extern int pthread_kill (pthread_t __threadid, int __signo) __THROW; + + #endif /* bits/sigthread.h */ diff --git a/patches/glibc/linuxthreads-2.2.5/glibc-2.2.5-allow-gcc-3.4-td.patch b/patches/glibc/linuxthreads-2.2.5/glibc-2.2.5-allow-gcc-3.4-td.patch new file mode 100644 index 00000000..0a6cee11 --- /dev/null +++ b/patches/glibc/linuxthreads-2.2.5/glibc-2.2.5-allow-gcc-3.4-td.patch @@ -0,0 +1,881 @@ +Fixes following error building glibc-2.2.5 with gcc-3.4: +td_init.c: In function `td_init': +td_init.c:30: error: parse error before string constant +td_init.c:30: error: parse error before string constant +make[2]: *** [/home/dank/wk/crosstool-0.28-rc4h/build/i686-unknown-linux-gnu/gcc-3.4.0-20040406-glibc-2.2.5/build-glibc/linuxthreads_db/td_init.os] Error 1 + +# Retrieved by diffing a +-1 day rng around the time mentioned +# in http://sources.redhat.com/ml/glibc-cvs/2001-q4/msg00654.html +# cvs -z 9 -d :pserver:anoncvs@sources.redhat.com:/cvs/glibc diff -u -D"2001-12-27 08:41:30" -D"2001-12-29 08:41:32" +# then fixing paths. + +Index: ChangeLog +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/ChangeLog,v +retrieving revision 1.41 +retrieving revision 1.42 +diff -u -r1.41 -r1.42 +--- libc/linuxthreads_db/ChangeLog 13 Apr 2001 00:09:54 -0000 1.41 ++++ libc/linuxthreads_db/ChangeLog 29 Dec 2001 00:59:58 -0000 1.42 +@@ -1,3 +1,43 @@ ++2001-12-28 Andreas Jaeger <aj@suse.de> ++ ++ * td_init.c (td_init): Don't use __FUNCTION__ as literal. ++ * td_log.c (td_log): Likewise. ++ * td_ta_delete.c (td_ta_delete): Likewise. ++ * td_ta_get_nthreads.c (td_ta_get_nthreads): Likewise. ++ * td_ta_get_ph.c (td_ta_get_ph): Likewise. ++ * td_ta_map_id2thr.c (td_ta_map_id2thr): Likewise. ++ * td_ta_map_lwp2thr.c (td_ta_map_lwp2thr): Likewise. ++ * td_ta_new.c (td_ta_new): Likewise. ++ * td_ta_clear_event.c (td_ta_clear_event): Likewise. ++ * td_ta_enable_stats.c (td_ta_enable_stats): Likewise. ++ * td_ta_event_addr.c (td_ta_event_addr): Likewise. ++ * td_ta_event_getmsg.c (td_ta_event_getmsg): Likewise. ++ * td_ta_get_stats.c (td_ta_get_stats): Likewise. ++ * td_ta_reset_stats.c (td_ta_reset_stats): Likewise. ++ * td_ta_set_event.c (td_ta_set_event): Likewise. ++ * td_ta_setconcurrency.c (td_ta_setconcurrency): Likewise. ++ * td_ta_thr_iter.c (td_ta_thr_iter): Likewise. ++ * td_ta_tsd_iter.c (td_ta_tsd_iter): Likewise. ++ * td_thr_clear_event.c (td_thr_clear_event): Likewise. ++ * td_thr_dbresume.c (td_thr_dbresume): Likewise. ++ * td_thr_dbsuspend.c (td_thr_dbsuspend): Likewise. ++ * td_thr_event_enable.c (td_thr_event_enable): Likewise. ++ * td_thr_event_getmsg.c (td_thr_event_getmsg): Likewise. ++ * td_thr_get_info.c (td_thr_get_info): Likewise. ++ * td_thr_getfpregs.c (td_thr_getfpregs): Likewise. ++ * td_thr_getgregs.c (td_thr_getgregs): Likewise. ++ * td_thr_getxregs.c (td_thr_getxregs): Likewise. ++ * td_thr_getxregsize.c (td_thr_getxregsize): Likewise. ++ * td_thr_set_event.c (td_thr_set_event): Likewise. ++ * td_thr_setfpregs.c (td_thr_setfpregs): Likewise. ++ * td_thr_setgregs.c (td_thr_setgregs): Likewise. ++ * td_thr_setprio.c (td_thr_setprio): Likewise. ++ * td_thr_setsigpending.c (td_thr_setsigpending): Likewise. ++ * td_thr_setxregs.c (td_thr_setxregs): Likewise. ++ * td_thr_sigsetmask.c (td_thr_sigsetmask): Likewise. ++ * td_thr_tsd.c (td_thr_tsd): Likewise. ++ * td_thr_validate.c (td_thr_validate): Likewise. ++ + 2001-04-12 Ulrich Drepper <drepper@redhat.com> + + * td_ta_map_id2thr.c: If thread terminated return TD_NOTHR. +Index: td_init.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_init.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_init.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_init.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Initialization function of thread debugger support library. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -27,6 +27,6 @@ + td_init (void) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_init"); + return TD_OK; + } +Index: td_log.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_log.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_log.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_log.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Noop, left for historical reasons. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,8 +25,8 @@ + td_log (void) + { + /* This interface is deprecated in the Sun interface. We provide it +- for compatibility but don't do anyhting ourself. We might in ++ for compatibility but don't do anything ourself. We might in + future do some logging if this seems reasonable. */ +- LOG (__FUNCTION__); ++ LOG ("td_log"); + return TD_OK; + } +Index: td_ta_clear_event.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_clear_event.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_ta_clear_event.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_ta_clear_event.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Globally disable events. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -29,7 +29,7 @@ + td_thr_events_t old_event; + int i; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_clear_event"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_delete.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_delete.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_ta_delete.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_ta_delete.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Detach to target process. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -26,7 +26,7 @@ + td_err_e + td_ta_delete (td_thragent_t *ta) + { +- LOG (__FUNCTION__); ++ LOG ("td_ta_delete"); + + /* Safety check. */ + if (ta == NULL || __td_agent_list == NULL) +Index: td_ta_enable_stats.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_enable_stats.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_ta_enable_stats.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_ta_enable_stats.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Enable collection of statistics for process. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,7 +25,7 @@ + td_ta_enable_stats (const td_thragent_t *ta, int enable) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_ta_enable_stats"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_event_addr.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_event_addr.c,v +retrieving revision 1.5 +retrieving revision 1.6 +diff -u -r1.5 -r1.6 +--- libc/linuxthreads_db/td_ta_event_addr.c 6 Jul 2001 05:27:23 -0000 1.5 ++++ libc/linuxthreads_db/td_ta_event_addr.c 28 Dec 2001 16:41:29 -0000 1.6 +@@ -27,7 +27,7 @@ + td_err_e res = TD_NOEVENT; + int idx = -1; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_event_addr"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_event_getmsg.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_event_getmsg.c,v +retrieving revision 1.5 +retrieving revision 1.6 +diff -u -r1.5 -r1.6 +--- libc/linuxthreads_db/td_ta_event_getmsg.c 6 Jul 2001 05:27:23 -0000 1.5 ++++ libc/linuxthreads_db/td_ta_event_getmsg.c 28 Dec 2001 16:41:29 -0000 1.6 +@@ -1,5 +1,5 @@ + /* Retrieve event. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -32,7 +32,7 @@ + td_eventbuf_t event; + psaddr_t addr; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_event_getmsg"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_get_nthreads.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_get_nthreads.c,v +retrieving revision 1.5 +retrieving revision 1.6 +diff -u -r1.5 -r1.6 +--- libc/linuxthreads_db/td_ta_get_nthreads.c 6 Jul 2001 05:27:23 -0000 1.5 ++++ libc/linuxthreads_db/td_ta_get_nthreads.c 28 Dec 2001 16:41:29 -0000 1.6 +@@ -25,7 +25,7 @@ + { + psaddr_t addr; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_get_nthreads"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_get_ph.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_get_ph.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_ta_get_ph.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_ta_get_ph.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Get external process handle. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -24,7 +24,7 @@ + td_err_e + td_ta_get_ph (const td_thragent_t *ta, struct ps_prochandle **ph) + { +- LOG (__FUNCTION__); ++ LOG ("td_ta_get_ph"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_get_stats.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_get_stats.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_ta_get_stats.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_ta_get_stats.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Retrieve statistics for process. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,7 +25,7 @@ + td_ta_get_stats (const td_thragent_t *ta, td_ta_stats_t *statsp) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_ta_get_stats"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_map_id2thr.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_map_id2thr.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/linuxthreads_db/td_ta_map_id2thr.c 6 Jul 2001 05:27:23 -0000 1.4 ++++ libc/linuxthreads_db/td_ta_map_id2thr.c 28 Dec 2001 16:41:29 -0000 1.5 +@@ -28,7 +28,7 @@ + struct _pthread_descr_struct pds; + int pthread_threads_max; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_map_id2thr"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_map_lwp2thr.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_map_lwp2thr.c,v +retrieving revision 1.5 +retrieving revision 1.6 +diff -u -r1.5 -r1.6 +--- libc/linuxthreads_db/td_ta_map_lwp2thr.c 6 Jul 2001 05:27:23 -0000 1.5 ++++ libc/linuxthreads_db/td_ta_map_lwp2thr.c 28 Dec 2001 16:41:29 -0000 1.6 +@@ -1,5 +1,5 @@ + /* Which thread is running on an lwp? +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -34,7 +34,7 @@ + # define num 1 + #endif + +- LOG (__FUNCTION__); ++ LOG ("td_ta_map_lwp2thr"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_new.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_new.c,v +retrieving revision 1.10 +retrieving revision 1.11 +diff -u -r1.10 -r1.11 +--- libc/linuxthreads_db/td_ta_new.c 6 Jul 2001 05:27:23 -0000 1.10 ++++ libc/linuxthreads_db/td_ta_new.c 28 Dec 2001 16:41:29 -0000 1.11 +@@ -35,7 +35,7 @@ + psaddr_t addr; + struct agent_list *elemp; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_new"); + + /* Get the global event mask. This is one of the variables which + are new in the thread library to enable debugging. If it is +Index: td_ta_reset_stats.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_reset_stats.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_ta_reset_stats.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_ta_reset_stats.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Reset statistics. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,7 +25,7 @@ + td_ta_reset_stats (const td_thragent_t *ta) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_ta_reset_stats"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_set_event.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_set_event.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/linuxthreads_db/td_ta_set_event.c 6 Jul 2001 05:27:23 -0000 1.4 ++++ libc/linuxthreads_db/td_ta_set_event.c 28 Dec 2001 16:41:29 -0000 1.5 +@@ -1,5 +1,5 @@ + /* Globally enable events. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -29,7 +29,7 @@ + td_thr_events_t old_event; + int i; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_set_event"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_setconcurrency.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_setconcurrency.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_ta_setconcurrency.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_ta_setconcurrency.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Set suggested concurrency level for process. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,7 +25,7 @@ + td_ta_setconcurrency (const td_thragent_t *ta, int level) + { + /* This is something LinuxThreads does not support. */ +- LOG (__FUNCTION__); ++ LOG ("td_ta_setconcurrency"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_thr_iter.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_thr_iter.c,v +retrieving revision 1.11 +retrieving revision 1.12 +diff -u -r1.11 -r1.12 +--- libc/linuxthreads_db/td_ta_thr_iter.c 6 Jul 2001 05:27:23 -0000 1.11 ++++ libc/linuxthreads_db/td_ta_thr_iter.c 28 Dec 2001 16:41:29 -0000 1.12 +@@ -1,5 +1,5 @@ + /* Iterate over a process's threads. +- Copyright (C) 1999, 2000 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -86,7 +86,7 @@ + # define num 1 + #endif + +- LOG (__FUNCTION__); ++ LOG ("td_ta_thr_iter"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_ta_tsd_iter.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_ta_tsd_iter.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/linuxthreads_db/td_ta_tsd_iter.c 6 Jul 2001 05:27:23 -0000 1.4 ++++ libc/linuxthreads_db/td_ta_tsd_iter.c 28 Dec 2001 16:41:29 -0000 1.5 +@@ -1,5 +1,5 @@ + /* Iterate over a process's thread-specific data. +- Copyright (C) 1999, 2000 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -29,7 +29,7 @@ + int pthread_keys_max; + int cnt; + +- LOG (__FUNCTION__); ++ LOG ("td_ta_tsd_iter"); + + /* Test whether the TA parameter is ok. */ + if (! ta_ok (ta)) +Index: td_thr_clear_event.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_clear_event.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_thr_clear_event.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_thr_clear_event.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Disable specific event for thread. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -31,7 +31,7 @@ + td_thr_events_t old_event; + int i; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_clear_event"); + + /* Write the new value into the thread data structure. */ + if (ps_pdread (th->th_ta_p->ph, +Index: td_thr_dbresume.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_dbresume.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_dbresume.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_dbresume.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Resume execution of given thread. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,6 +25,6 @@ + td_thr_dbresume (const td_thrhandle_t *th) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_dbresume"); + return TD_NOCAPAB; + } +Index: td_thr_dbsuspend.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_dbsuspend.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_dbsuspend.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_dbsuspend.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Suspend execution of given thread. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,6 +25,6 @@ + td_thr_dbsuspend (const td_thrhandle_t *th) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_dbsuspend"); + return TD_NOCAPAB; + } +Index: td_thr_event_enable.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_event_enable.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_thr_event_enable.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_thr_event_enable.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Enable event process-wide. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -28,7 +28,7 @@ + const td_thrhandle_t *th; + int onoff; + { +- LOG (__FUNCTION__); ++ LOG ("td_thr_event_enable"); + + /* Write the new value into the thread data structure. */ + if (ps_pdwrite (th->th_ta_p->ph, +Index: td_thr_event_getmsg.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_event_getmsg.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads_db/td_thr_event_getmsg.c 6 Jul 2001 05:27:23 -0000 1.3 ++++ libc/linuxthreads_db/td_thr_event_getmsg.c 28 Dec 2001 16:41:29 -0000 1.4 +@@ -1,5 +1,5 @@ + /* Retrieve event. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -29,7 +29,7 @@ + { + td_eventbuf_t event; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_event_getmsg"); + + /* Read the even structure from the target. */ + if (ps_pdread (th->th_ta_p->ph, +Index: td_thr_get_info.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_get_info.c,v +retrieving revision 1.9 +retrieving revision 1.10 +diff -u -r1.9 -r1.10 +--- libc/linuxthreads_db/td_thr_get_info.c 6 Jul 2001 05:27:23 -0000 1.9 ++++ libc/linuxthreads_db/td_thr_get_info.c 28 Dec 2001 16:41:29 -0000 1.10 +@@ -1,5 +1,5 @@ + /* Get thread information. +- Copyright (C) 1999, 2000 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -29,7 +29,7 @@ + { + struct _pthread_descr_struct pds; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_get_info"); + + /* Get the thread descriptor. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +Index: td_thr_getfpregs.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getfpregs.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/linuxthreads_db/td_thr_getfpregs.c 6 Jul 2001 05:27:23 -0000 1.4 ++++ libc/linuxthreads_db/td_thr_getfpregs.c 28 Dec 2001 16:41:29 -0000 1.5 +@@ -26,7 +26,7 @@ + { + struct _pthread_descr_struct pds; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_getfpregs"); + + /* We have to get the state and the PID for this thread. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +Index: td_thr_getgregs.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getgregs.c,v +retrieving revision 1.8 +retrieving revision 1.9 +diff -u -r1.8 -r1.9 +--- libc/linuxthreads_db/td_thr_getgregs.c 6 Jul 2001 05:27:23 -0000 1.8 ++++ libc/linuxthreads_db/td_thr_getgregs.c 28 Dec 2001 16:41:29 -0000 1.9 +@@ -26,7 +26,7 @@ + { + struct _pthread_descr_struct pds; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_getgregs"); + + /* We have to get the state and the PID for this thread. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +Index: td_thr_getxregs.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getxregs.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_getxregs.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_getxregs.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Get a thread's extra state register set. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,6 +25,6 @@ + td_thr_getxregs (const td_thrhandle_t *th, void *xregs) + { + /* XXX This might be platform specific. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_getxregs"); + return TD_NOXREGS; + } +Index: td_thr_getxregsize.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_getxregsize.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_getxregsize.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_getxregsize.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Get the size of the extra state register set for this architecture. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,6 +25,6 @@ + td_thr_getxregsize (const td_thrhandle_t *th, int *sizep) + { + /* XXX This might be platform specific. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_getxregsize"); + return TD_NOXREGS; + } +Index: td_thr_set_event.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_set_event.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/linuxthreads_db/td_thr_set_event.c 6 Jul 2001 05:27:23 -0000 1.4 ++++ libc/linuxthreads_db/td_thr_set_event.c 28 Dec 2001 16:41:29 -0000 1.5 +@@ -1,5 +1,5 @@ + /* Enable specific event for thread. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -31,7 +31,7 @@ + td_thr_events_t old_event; + int i; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_set_event"); + + /* Write the new value into the thread data structure. */ + if (ps_pdread (th->th_ta_p->ph, +Index: td_thr_setfpregs.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setfpregs.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/linuxthreads_db/td_thr_setfpregs.c 6 Jul 2001 05:27:23 -0000 1.4 ++++ libc/linuxthreads_db/td_thr_setfpregs.c 28 Dec 2001 16:41:29 -0000 1.5 +@@ -26,7 +26,7 @@ + { + struct _pthread_descr_struct pds; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_setfpregs"); + + /* We have to get the state and the PID for this thread. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +Index: td_thr_setgregs.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setgregs.c,v +retrieving revision 1.6 +retrieving revision 1.7 +diff -u -r1.6 -r1.7 +--- libc/linuxthreads_db/td_thr_setgregs.c 6 Jul 2001 05:27:23 -0000 1.6 ++++ libc/linuxthreads_db/td_thr_setgregs.c 28 Dec 2001 16:41:29 -0000 1.7 +@@ -26,7 +26,7 @@ + { + struct _pthread_descr_struct pds; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_setgregs"); + + /* We have to get the state and the PID for this thread. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +Index: td_thr_setprio.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setprio.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_setprio.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_setprio.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Set a thread's priority. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,6 +25,6 @@ + td_thr_setprio (const td_thrhandle_t *th, int prio) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_setprio"); + return TD_OK; + } +Index: td_thr_setsigpending.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setsigpending.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_setsigpending.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_setsigpending.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Raise a signal for a thread. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -26,6 +26,6 @@ + const sigset_t *ss) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_setsigpending"); + return TD_OK; + } +Index: td_thr_setxregs.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_setxregs.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_setxregs.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_setxregs.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Set a thread's extra state register set. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,6 +25,6 @@ + td_thr_setxregs (const td_thrhandle_t *ta, const void *addr) + { + /* XXX This might have to be platform specific. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_setxregs"); + return TD_NOXREGS; + } +Index: td_thr_sigsetmask.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_sigsetmask.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_sigsetmask.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_sigsetmask.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Set a thread's signal mask. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -25,6 +25,6 @@ + td_thr_sigsetmask (const td_thrhandle_t *th, const sigset_t *ss) + { + /* XXX We have to figure out what has to be done. */ +- LOG (__FUNCTION__); ++ LOG ("td_thr_sigsetmask"); + return TD_OK; + } +Index: td_thr_tsd.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_tsd.c,v +retrieving revision 1.2 +retrieving revision 1.3 +diff -u -r1.2 -r1.3 +--- libc/linuxthreads_db/td_thr_tsd.c 6 Jul 2001 05:27:23 -0000 1.2 ++++ libc/linuxthreads_db/td_thr_tsd.c 28 Dec 2001 16:41:29 -0000 1.3 +@@ -1,5 +1,5 @@ + /* Get a thread-specific data pointer for a thread. +- Copyright (C) 1999 Free Software Foundation, Inc. ++ Copyright (C) 1999, 2001 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1999. + +@@ -33,7 +33,7 @@ + unsigned int idx2nd; + void *p; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_tsd"); + + /* Get the thread descriptor. */ + if (ps_pdread (th->th_ta_p->ph, th->th_unique, &pds, +Index: td_thr_validate.c +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads_db/td_thr_validate.c,v +retrieving revision 1.4 +retrieving revision 1.5 +diff -u -r1.4 -r1.5 +--- libc/linuxthreads_db/td_thr_validate.c 6 Jul 2001 05:27:23 -0000 1.4 ++++ libc/linuxthreads_db/td_thr_validate.c 28 Dec 2001 16:41:29 -0000 1.5 +@@ -28,7 +28,7 @@ + int pthread_threads_max = th->th_ta_p->pthread_threads_max; + int cnt; + +- LOG (__FUNCTION__); ++ LOG ("td_thr_validate"); + + /* Now get all descriptors, one after the other. */ + for (cnt = 0; cnt < pthread_threads_max; ++cnt, ++handles) diff --git a/patches/glibc/linuxthreads-2.2.5/glibc-2.2.5-alpha-self-clobber.patch b/patches/glibc/linuxthreads-2.2.5/glibc-2.2.5-alpha-self-clobber.patch new file mode 100644 index 00000000..fd340340 --- /dev/null +++ b/patches/glibc/linuxthreads-2.2.5/glibc-2.2.5-alpha-self-clobber.patch @@ -0,0 +1,25 @@ +wget http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/alpha/pt-machine.h.diff?r1=1.9&r2=1.10&cvsroot=glibc + +Should fix error + +internals.h: In function `pthread_setcancelstate': +internals.h:381: error: asm-specifier for variable `__self' conflicts with asm clobber list +make[2]: *** [/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/build-glibc/linuxthreads/cancel.o] Error 1 +make[2]: Leaving directory `/home/dank/crosstool-0.28/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.2.5/glibc-2.2.5/linuxthreads' + +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/alpha/pt-machine.h,v +retrieving revision 1.9 +retrieving revision 1.10 +diff -u -r1.9 -r1.10 +--- libc/linuxthreads/sysdeps/alpha/pt-machine.h 2002/04/06 04:05:13 1.9 ++++ libc/linuxthreads/sysdeps/alpha/pt-machine.h 2002/05/20 20:09:34 1.10 +@@ -76,7 +76,7 @@ + #define THREAD_SELF \ + ({ \ + register pthread_descr __self __asm__("$0"); \ +- __asm__ ("call_pal %1" : "=r"(__self) : "i"(PAL_rduniq) : "$0"); \ ++ __asm__ ("call_pal %1" : "=r"(__self) : "i"(PAL_rduniq)); \ + __self; \ + }) + diff --git a/patches/glibc/linuxthreads-2.2.5/linuxthreads-2.2.5-ppc405erratum77.patch b/patches/glibc/linuxthreads-2.2.5/linuxthreads-2.2.5-ppc405erratum77.patch new file mode 100644 index 00000000..48127a12 --- /dev/null +++ b/patches/glibc/linuxthreads-2.2.5/linuxthreads-2.2.5-ppc405erratum77.patch @@ -0,0 +1,34 @@ +# see http://bugs.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&pr=4155 +# and http://www.kegel.com/xgcc3/ppc405erratum77.html +# See also matching patch for glibc + +diff -aur glibc-2.2.5.orig/linuxthreads/sysdeps/powerpc/pt-machine.h glibc-2.2.5/linuxthreads/sysdeps/powerpc/pt-machine.h +--- glibc-2.2.5.orig/linuxthreads/sysdeps/powerpc/pt-machine.h Thu May 17 12:47:46 2001 ++++ glibc-2.2.5/linuxthreads/sysdeps/powerpc/pt-machine.h Tue Jul 23 05:38:24 2002 +@@ -41,6 +41,17 @@ + #define HAS_COMPARE_AND_SWAP_WITH_RELEASE_SEMANTICS + #define IMPLEMENT_TAS_WITH_CAS + ++#ifdef __PPC405__ ++/* workaround for PPC405 erratum #77 - Mark Hatle, dank. References: ++ http://www-3.ibm.com/chips/techlib/techlib.nsf/techdocs/89DED00DEBFF54BF87256A8000491BA2/$file/405CR_C_errata_1_2.pdf ++ http://ppc.bkbits.net:8080/linuxppc_2_4_devel/cset@1.489 ++ http://www.kegel.com/xgcc3/ppc405erratum77.html ++ FIXME: using dbct instead of sync would be faster */ ++#define __LINUXTHREADS_PPC405_ERR77_SYNC "sync \n\t" ++#else ++#define __LINUXTHREADS_PPC405_ERR77_SYNC ++#endif ++ + PT_EI int + __compare_and_swap (long int *p, long int oldval, long int newval) + { +@@ -50,6 +61,7 @@ + "0: lwarx %0,0,%1 ;" + " xor. %0,%3,%0;" + " bne 1f;" ++ __LINUXTHREADS_PPC405_ERR77_SYNC + " stwcx. %2,0,%1;" + " bne- 0b;" + "1: " + diff --git a/patches/glibc/linuxthreads-2.2.5/pt-initfini-alpha.patch b/patches/glibc/linuxthreads-2.2.5/pt-initfini-alpha.patch new file mode 100644 index 00000000..22a1cfed --- /dev/null +++ b/patches/glibc/linuxthreads-2.2.5/pt-initfini-alpha.patch @@ -0,0 +1,119 @@ +--- glibc-2.2.5/linuxthreads/sysdeps/alpha/elf/pt-initfini.c.old Fri Jun 6 22:02:08 2003 ++++ glibc-2.2.5/linuxthreads/sysdeps/alpha/elf/pt-initfini.c Fri Jun 6 22:02:33 2003 +@@ -37,60 +37,60 @@ + files, all of which may have different GP values. So we must reload + the GP value from crti.o in crtn.o. */ + +-__asm__ (" +- +-#include \"defs.h\" +- +-/*@HEADER_ENDS*/ +- +-/*@_init_PROLOG_BEGINS*/ +- .section .init, \"ax\", @progbits +- .globl _init +- .ent _init +-_init: +- ldgp $29, 0($27) +- subq $30, 16, $30 +- lda $27, __pthread_initialize_minimal +- stq $26, 0($30) +- stq $29, 8($30) +- .prologue 1 +- jsr $26, ($27), __pthread_initialize_minimal +- ldq $29, 8($30) +- .align 3 +- .end _init +- .size _init, 0 +-/*@_init_PROLOG_ENDS*/ +- +-/*@_init_EPILOG_BEGINS*/ +- .section .init, \"ax\", @progbits +- ldq $26, 0($30) +- ldq $29, 8($30) +- addq $30, 16, $30 +- ret +-/*@_init_EPILOG_ENDS*/ +- +-/*@_fini_PROLOG_BEGINS*/ +- .section .fini, \"ax\", @progbits +- .globl _fini +- .ent _fini +-_fini: +- ldgp $29, 0($27) +- subq $30, 16, $30 +- stq $26, 0($30) +- stq $29, 8($30) +- .prologue 1 +- .align 3 +- .end _fini +- .size _fini, 0 +-/*@_fini_PROLOG_ENDS*/ +- +-/*@_fini_EPILOG_BEGINS*/ +- .section .fini, \"ax\", @progbits +- ldq $26, 0($30) +- ldq $29, 8($30) +- addq $30, 16, $30 +- ret +-/*@_fini_EPILOG_ENDS*/ +- +-/*@TRAILER_BEGINS*/ ++__asm__ ("\n\ ++\n\ ++#include \"defs.h\"\n\ ++\n\ ++/*@HEADER_ENDS*/\n\ ++\n\ ++/*@_init_PROLOG_BEGINS*/\n\ ++ .section .init, \"ax\", @progbits\n\ ++ .globl _init\n\ ++ .ent _init\n\ ++_init:\n\ ++ ldgp $29, 0($27)\n\ ++ subq $30, 16, $30\n\ ++ lda $27, __pthread_initialize_minimal\n\ ++ stq $26, 0($30)\n\ ++ stq $29, 8($30)\n\ ++ .prologue 1\n\ ++ jsr $26, ($27), __pthread_initialize_minimal\n\ ++ ldq $29, 8($30)\n\ ++ .align 3\n\ ++ .end _init\n\ ++ .size _init, 0\n\ ++/*@_init_PROLOG_ENDS*/\n\ ++\n\ ++/*@_init_EPILOG_BEGINS*/\n\ ++ .section .init, \"ax\", @progbits\n\ ++ ldq $26, 0($30)\n\ ++ ldq $29, 8($30)\n\ ++ addq $30, 16, $30\n\ ++ ret\n\ ++/*@_init_EPILOG_ENDS*/\n\ ++\n\ ++/*@_fini_PROLOG_BEGINS*/\n\ ++ .section .fini, \"ax\", @progbits\n\ ++ .globl _fini\n\ ++ .ent _fini\n\ ++_fini:\n\ ++ ldgp $29, 0($27)\n\ ++ subq $30, 16, $30\n\ ++ stq $26, 0($30)\n\ ++ stq $29, 8($30)\n\ ++ .prologue 1\n\ ++ .align 3\n\ ++ .end _fini\n\ ++ .size _fini, 0\n\ ++/*@_fini_PROLOG_ENDS*/\n\ ++\n\ ++/*@_fini_EPILOG_BEGINS*/\n\ ++ .section .fini, \"ax\", @progbits\n\ ++ ldq $26, 0($30)\n\ ++ ldq $29, 8($30)\n\ ++ addq $30, 16, $30\n\ ++ ret\n\ ++/*@_fini_EPILOG_ENDS*/\n\ ++\n\ ++/*@TRAILER_BEGINS*/\n\ + "); diff --git a/patches/glibc/linuxthreads-2.2.5/pt-initfini-sh.patch b/patches/glibc/linuxthreads-2.2.5/pt-initfini-sh.patch new file mode 100644 index 00000000..8c9cdb8a --- /dev/null +++ b/patches/glibc/linuxthreads-2.2.5/pt-initfini-sh.patch @@ -0,0 +1,267 @@ +--- glibc-2.2.5/linuxthreads/sysdeps/unix/sysv/linux/sh/pt-initfini.c.old Wed May 28 09:29:55 2003 ++++ glibc-2.2.5/linuxthreads/sysdeps/unix/sysv/linux/sh/pt-initfini.c Wed May 28 09:30:11 2003 +@@ -36,134 +36,134 @@ + * crtn.s puts the corresponding function epilogues + in the .init and .fini sections. */ + +-__asm__ (" +- +-#include \"defs.h\" +-#define SHARED +- +-/*@HEADER_ENDS*/ +- +-/*@TESTS_BEGIN*/ +- +-/*@TESTS_END*/ +- +-/*@_init_PROLOG_BEGINS*/ +- .section .init +- .align 5 +- .global _init +- .type _init,@function +-_init: +- mov.l r12,@-r15 +- mov.l r14,@-r15 +- sts.l pr,@-r15 +-#ifdef SHARED +- mova .L22,r0 +- mov.l .L22,r12 +- add r0,r12 +- mova .L24,r0 +- mov.l .L24,r1 +- add r0,r1 +- jsr @r1 +- nop +- mova .L23,r0 +- mov.l .L23,r1 +- add r0,r1 +-#else +- mov.l .L24,r1 +- jsr @r1 +- nop +- mov.l .L23,r1 +-#endif +- jsr @r1 +- mov r15,r14 +- bra 1f +- nop +- .align 2 +-#ifdef SHARED +-.L22: +- .long _GLOBAL_OFFSET_TABLE_ +-.L23: +- .long __gmon_start__@PLT +-.L24: +- .long __pthread_initialize_minimal@PLT +-#else +-.L23: +- .long __gmon_start__ +-.L24: +- .long __pthread_initialize_minimal +-#endif +- .data +- .global __fpscr_values +-__fpscr_values: +- .long 0 +- .long 0x80000 +- .previous +-1: +- ALIGN +- END_INIT +- +- +-/*@_init_PROLOG_ENDS*/ +- +-/*@_init_EPILOG_BEGINS*/ +- .section .init +- mov r14,r15 +- lds.l @r15+,pr +- mov.l @r15+,r14 +- rts +- mov.l @r15+,r12 +- END_INIT +- .section .text +- .align 5 +- .weak __gmon_start__ +- .type __gmon_start__,@function +-__gmon_start__: +- mov.l r14,@-r15 +- mov r15,r14 +- mov r14,r15 +- rts +- mov.l @r15+,r14 +- +-/*@_init_EPILOG_ENDS*/ +- +-/*@_fini_PROLOG_BEGINS*/ +- .section .fini +- .align 5 +- .global _fini +- .type _fini,@function +-_fini: +- mov.l r12,@-r15 +- mov.l r14,@-r15 +- sts.l pr,@-r15 +-#ifdef SHARED +- mova .L27,r0 +- mov.l .L27,r12 +- add r0,r12 +-#endif +- mov r15,r14 +- ALIGN +- END_FINI +-#ifdef SHARED +- bra 1f +- nop +- .align 2 +-.L27: +- .long _GLOBAL_OFFSET_TABLE_ +-#endif +-1: +-/*@_fini_PROLOG_ENDS*/ +- +-/*@_fini_EPILOG_BEGINS*/ +- .section .fini +- mov r14,r15 +- lds.l @r15+,pr +- mov.l @r15+,r14 +- rts +- mov.l @r15+,r12 +- +- END_FINI +- +-/*@_fini_EPILOG_ENDS*/ +- +-/*@TRAILER_BEGINS*/ ++__asm__ ("\n\ ++\n\ ++#include \"defs.h\"\n\ ++#define SHARED\n\ ++\n\ ++/*@HEADER_ENDS*/\n\ ++\n\ ++/*@TESTS_BEGIN*/\n\ ++\n\ ++/*@TESTS_END*/\n\ ++\n\ ++/*@_init_PROLOG_BEGINS*/\n\ ++ .section .init\n\ ++ .align 5\n\ ++ .global _init\n\ ++ .type _init,@function\n\ ++_init:\n\ ++ mov.l r12,@-r15\n\ ++ mov.l r14,@-r15\n\ ++ sts.l pr,@-r15\n\ ++#ifdef SHARED\n\ ++ mova .L22,r0\n\ ++ mov.l .L22,r12\n\ ++ add r0,r12\n\ ++ mova .L24,r0\n\ ++ mov.l .L24,r1\n\ ++ add r0,r1\n\ ++ jsr @r1\n\ ++ nop\n\ ++ mova .L23,r0\n\ ++ mov.l .L23,r1\n\ ++ add r0,r1\n\ ++#else\n\ ++ mov.l .L24,r1\n\ ++ jsr @r1\n\ ++ nop\n\ ++ mov.l .L23,r1\n\ ++#endif\n\ ++ jsr @r1\n\ ++ mov r15,r14\n\ ++ bra 1f\n\ ++ nop\n\ ++ .align 2\n\ ++#ifdef SHARED\n\ ++.L22:\n\ ++ .long _GLOBAL_OFFSET_TABLE_\n\ ++.L23:\n\ ++ .long __gmon_start__@PLT\n\ ++.L24:\n\ ++ .long __pthread_initialize_minimal@PLT\n\ ++#else\n\ ++.L23:\n\ ++ .long __gmon_start__\n\ ++.L24:\n\ ++ .long __pthread_initialize_minimal\n\ ++#endif\n\ ++ .data\n\ ++ .global __fpscr_values\n\ ++__fpscr_values:\n\ ++ .long 0\n\ ++ .long 0x80000\n\ ++ .previous\n\ ++1:\n\ ++ ALIGN\n\ ++ END_INIT\n\ ++\n\ ++ \n\ ++/*@_init_PROLOG_ENDS*/\n\ ++\n\ ++/*@_init_EPILOG_BEGINS*/\n\ ++ .section .init\n\ ++ mov r14,r15\n\ ++ lds.l @r15+,pr\n\ ++ mov.l @r15+,r14\n\ ++ rts \n\ ++ mov.l @r15+,r12\n\ ++ END_INIT\n\ ++ .section .text\n\ ++ .align 5\n\ ++ .weak __gmon_start__\n\ ++ .type __gmon_start__,@function\n\ ++__gmon_start__:\n\ ++ mov.l r14,@-r15\n\ ++ mov r15,r14\n\ ++ mov r14,r15\n\ ++ rts \n\ ++ mov.l @r15+,r14\n\ ++ \n\ ++/*@_init_EPILOG_ENDS*/\n\ ++\n\ ++/*@_fini_PROLOG_BEGINS*/\n\ ++ .section .fini\n\ ++ .align 5\n\ ++ .global _fini\n\ ++ .type _fini,@function\n\ ++_fini:\n\ ++ mov.l r12,@-r15\n\ ++ mov.l r14,@-r15\n\ ++ sts.l pr,@-r15\n\ ++#ifdef SHARED\n\ ++ mova .L27,r0\n\ ++ mov.l .L27,r12\n\ ++ add r0,r12\n\ ++#endif\n\ ++ mov r15,r14\n\ ++ ALIGN\n\ ++ END_FINI\n\ ++#ifdef SHARED\n\ ++ bra 1f\n\ ++ nop\n\ ++ .align 2\n\ ++.L27:\n\ ++ .long _GLOBAL_OFFSET_TABLE_\n\ ++#endif\n\ ++1:\n\ ++/*@_fini_PROLOG_ENDS*/\n\ ++\n\ ++/*@_fini_EPILOG_BEGINS*/\n\ ++ .section .fini\n\ ++ mov r14,r15\n\ ++ lds.l @r15+,pr\n\ ++ mov.l @r15+,r14\n\ ++ rts \n\ ++ mov.l @r15+,r12\n\ ++\n\ ++ END_FINI\n\ ++ \n\ ++/*@_fini_EPILOG_ENDS*/\n\ ++\n\ ++/*@TRAILER_BEGINS*/\n\ + "); diff --git a/patches/glibc/linuxthreads-2.2.5/threadparam.patch b/patches/glibc/linuxthreads-2.2.5/threadparam.patch new file mode 100644 index 00000000..dd97838c --- /dev/null +++ b/patches/glibc/linuxthreads-2.2.5/threadparam.patch @@ -0,0 +1,69 @@ +2002-05-21 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/pthread/pthread.h (pthread_create): Rename first parameter. + (pthread_cancel): Likewise. + * internals.h (__pthread_create_2_1): Likewise. + * sysdeps/unix/sysv/linux/bits/sigthread.h (pthread_kill): Likewise. +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads/internals.h,v +retrieving revision 1.69.2.2 +retrieving revision 1.69.2.3 +diff -u -r1.69.2.2 -r1.69.2.3 +--- libc/linuxthreads/internals.h 2002/03/22 08:30:32 1.69.2.2 ++++ libc/linuxthreads/internals.h 2002/08/20 22:01:25 1.69.2.3 +@@ -554,7 +554,7 @@ + /* Prototypes for compatibility functions. */ + extern int __pthread_attr_init_2_1 (pthread_attr_t *__attr); + extern int __pthread_attr_init_2_0 (pthread_attr_t *__attr); +-extern int __pthread_create_2_1 (pthread_t *__restrict __thread, ++extern int __pthread_create_2_1 (pthread_t *__restrict __threadp, + const pthread_attr_t *__attr, + void *(*__start_routine) (void *), + void *__restrict __arg); +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/pthread/pthread.h,v +retrieving revision 1.31 +retrieving revision 1.31.2.1 +diff -u -r1.31 -r1.31.2.1 +--- libc/linuxthreads/sysdeps/pthread/pthread.h 2001/03/15 21:12:31 1.31 ++++ libc/linuxthreads/sysdeps/pthread/pthread.h 2002/08/20 22:01:26 1.31.2.1 +@@ -160,7 +160,7 @@ + /* Create a thread with given attributes ATTR (or default attributes + if ATTR is NULL), and call function START_ROUTINE with given + arguments ARG. */ +-extern int pthread_create (pthread_t *__restrict __thread, ++extern int pthread_create (pthread_t *__restrict __threadp, + __const pthread_attr_t *__restrict __attr, + void *(*__start_routine) (void *), + void *__restrict __arg) __THROW; +@@ -588,7 +588,7 @@ + extern int pthread_setcanceltype (int __type, int *__oldtype) __THROW; + + /* Cancel THREAD immediately or at the next possibility. */ +-extern int pthread_cancel (pthread_t __thread) __THROW; ++extern int pthread_cancel (pthread_t __cancelthread) __THROW; + + /* Test for pending cancellation for the current thread and terminate + the thread as per pthread_exit(PTHREAD_CANCELED) if it has been +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h,v +retrieving revision 1.5 +retrieving revision 1.5.2.1 +diff -u -r1.5 -r1.5.2.1 +--- libc/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h 2000/08/21 06:48:03 1.5 ++++ libc/linuxthreads/sysdeps/unix/sysv/linux/bits/sigthread.h 2002/08/20 22:01:26 1.5.2.1 +@@ -1,5 +1,5 @@ + /* Signal handling function for threaded programs. +- Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. ++ Copyright (C) 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 +@@ -33,6 +33,6 @@ + __sigset_t *__restrict __oldmask)__THROW; + + /* Send signal SIGNO to the given thread. */ +-extern int pthread_kill (pthread_t __thread, int __signo) __THROW; ++extern int pthread_kill (pthread_t __threadid, int __signo) __THROW; + + #endif /* bits/sigthread.h */ diff --git a/patches/glibc/linuxthreads-2.3.2/alpha_cfi1.patch b/patches/glibc/linuxthreads-2.3.2/alpha_cfi1.patch new file mode 100644 index 00000000..e9532c75 --- /dev/null +++ b/patches/glibc/linuxthreads-2.3.2/alpha_cfi1.patch @@ -0,0 +1,136 @@ +Retrieved with +$ wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S.diff?r1=1.5&r2=1.6&cvsroot=glibc' +$ wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h.diff?r1=1.3&r2=1.4&cvsroot=glibc' + +Might fix problem building with binutils-2.14.90.0.8/gcc-3.3.3 that was not +present with binutils-2.13.90.0.18/gcc-3.3.2: + +../linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S: Assembler messages: +../linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S:63: Warning: .ent +directive without matching .end +../linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S:63: Error: can't resolve +`0' {.text section} - `L0^A' {.text section} +make[2]: *** +[/home/dkegel/wk/crosstool-0.26-pre3/build/alpha-unknown-linux-gnu/gcc-3.3-20040112-glibc-2.3.2/build-glibc/posix/vfork.o] +Error 1 +make[2]: Leaving directory +`/home/dkegel/wk/crosstool-0.26-pre3/build/alpha-unknown-linux-gnu/gcc-3.3-20040112-glibc-2.3.2/glibc-2.3.2/posix' +make[1]: *** [posix/subdir_lib] Error 2 +make[1]: Leaving directory +`/home/dkegel/wk/crosstool-0.26-pre3/build/alpha-unknown-linux-gnu/gcc-3.3-20040112-glibc-2.3.2/glibc-2.3.2' +make: *** [all] Error 2 + +See also alpha_cfi2.patch + +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S,v +retrieving revision 1.5 +retrieving revision 1.6 +diff -u -r1.5 -r1.6 +--- libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S 2003/02/11 06:27:53 1.5 ++++ libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S 2003/06/06 05:51:03 1.6 +@@ -19,12 +19,13 @@ + + #include <sysdep-cancel.h> + +- .globl __vfork + .align 4 +- .ent __vfork,0 +-__LABEL(__vfork) ++ .globl __vfork ++ .type __vfork, @function ++ .usepv __vfork, std ++ cfi_startproc ++__vfork: + ldgp gp, 0(pv) +- .prologue 1 + PSEUDO_PROF + + #ifdef SHARED +@@ -46,18 +47,24 @@ + fork and vfork object files. */ + $do_fork: + subq sp, 16, sp ++ cfi_adjust_cfa_offset(16) + stq ra, 0(sp) ++ cfi_offset(ra, -16) + jsr ra, HIDDEN_JUMPTARGET (__fork) + ldgp gp, 0(ra) + ldq ra, 0(sp) + addq sp, 16, sp ++ cfi_restore(ra) ++ cfi_adjust_cfa_offset(-16) + ret + + $syscall_error: + SYSCALL_ERROR_HANDLER + #endif + +-PSEUDO_END(__vfork) ++ cfi_endproc ++ .size __vfork, .-__vfork ++ + libc_hidden_def (__vfork) + + weak_alias (__vfork, vfork) +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h 2003/01/12 19:26:41 1.3 ++++ libc/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h 2003/06/06 05:51:03 1.4 +@@ -40,10 +40,11 @@ + # define PSEUDO(name, syscall_name, args) \ + .globl name; \ + .align 4; \ +- .ent name, 0; \ ++ .type name, @function; \ ++ .usepv name, std; \ ++ cfi_startproc; \ + __LABEL(name) \ + ldgp gp, 0(pv); \ +- .prologue 1; \ + PSEUDO_PROF; \ + PSEUDO_PREPARE_ARGS \ + SINGLE_THREAD_P(t0); \ +@@ -55,7 +56,9 @@ + .subsection 2; \ + __LABEL($pseudo_cancel) \ + subq sp, 64, sp; \ ++ cfi_def_cfa_offset(64); \ + stq ra, 0(sp); \ ++ cfi_offset(ra, -64); \ + SAVE_ARGS_##args; \ + CENABLE; \ + LOAD_ARGS_##args; \ +@@ -67,19 +70,27 @@ + ldq ra, 0(sp); \ + ldq v0, 8(sp); \ + addq sp, 64, sp; \ ++ cfi_remember_state; \ ++ cfi_restore(ra); \ ++ cfi_def_cfa_offset(0); \ + ret; \ ++ cfi_restore_state; \ + __LABEL($multi_error) \ + CDISABLE; \ + ldq ra, 0(sp); \ + ldq v0, 8(sp); \ + addq sp, 64, sp; \ ++ cfi_restore(ra); \ ++ cfi_def_cfa_offset(0); \ + __LABEL($syscall_error) \ + SYSCALL_ERROR_HANDLER; \ +- END(name); \ + .previous + + # undef PSEUDO_END +-# define PSEUDO_END(sym) ++# define PSEUDO_END(sym) \ ++ .subsection 2; \ ++ cfi_endproc; \ ++ .size sym, .-sym + + # define SAVE_ARGS_0 /* Nothing. */ + # define SAVE_ARGS_1 SAVE_ARGS_0; stq a0, 8(sp) diff --git a/patches/glibc/linuxthreads-2.3.2/alpha_cfi2.patch b/patches/glibc/linuxthreads-2.3.2/alpha_cfi2.patch new file mode 100644 index 00000000..45373f8b --- /dev/null +++ b/patches/glibc/linuxthreads-2.3.2/alpha_cfi2.patch @@ -0,0 +1,118 @@ +See http://sources.redhat.com/ml/libc-alpha/2004-05/msg00110.html + +Both his patches pulled into this file + +Should fix +../sysdeps/unix/sysv/linux/alpha/sigsuspend.S: Assembler messages: +../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_startproc' +../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_def_cfa_offset' +../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: missing ')' +../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: syntax error +../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_remember_state' +../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_restore' +../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_def_cfa_offset' +../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_restore_state' +../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_restore' +../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:28: Error: unknown opcode `cfi_def_cfa_offset' +../sysdeps/unix/sysv/linux/alpha/sigsuspend.S:30: Error: unknown opcode `cfi_endproc' +make[2]: *** [/usr/src/crosstool/crosstool-0.28-rc14/build/alpha-linux/gcc-3.4.0-glibc-2.3.2/build-glibc/signal/sigsuspend.o] Error 1 + +when building with binutils-2.15.90.0.3 and gcc-3.4.0 + +--- glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h.orig 2004-05-13 00:33:54.000000000 -0400 ++++ glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/alpha/sysdep-cancel.h 2004-05-13 00:34:19.000000000 -0400 +@@ -42,7 +42,7 @@ + .align 4; \ + .type name, @function; \ + .usepv name, std; \ +- cfi_startproc; \ ++ .cfi_startproc; \ + __LABEL(name) \ + ldgp gp, 0(pv); \ + PSEUDO_PROF; \ +@@ -56,9 +56,9 @@ + .subsection 2; \ + __LABEL($pseudo_cancel) \ + subq sp, 64, sp; \ +- cfi_def_cfa_offset(64); \ ++ .cfi_def_cfa_offset(64); \ + stq ra, 0(sp); \ +- cfi_offset(ra, -64); \ ++ .cfi_offset ra, -64; \ + SAVE_ARGS_##args; \ + CENABLE; \ + LOAD_ARGS_##args; \ +@@ -70,18 +70,18 @@ + ldq ra, 0(sp); \ + ldq v0, 8(sp); \ + addq sp, 64, sp; \ +- cfi_remember_state; \ +- cfi_restore(ra); \ +- cfi_def_cfa_offset(0); \ ++ .cfi_remember_state; \ ++ .cfi_restore(ra); \ ++ .cfi_def_cfa_offset(0); \ + ret; \ +- cfi_restore_state; \ ++ .cfi_restore_state; \ + __LABEL($multi_error) \ + CDISABLE; \ + ldq ra, 0(sp); \ + ldq v0, 8(sp); \ + addq sp, 64, sp; \ +- cfi_restore(ra); \ +- cfi_def_cfa_offset(0); \ ++ .cfi_restore(ra); \ ++ .cfi_def_cfa_offset(0); \ + __LABEL($syscall_error) \ + SYSCALL_ERROR_HANDLER; \ + .previous +@@ -89,7 +89,7 @@ + # undef PSEUDO_END + # define PSEUDO_END(sym) \ + .subsection 2; \ +- cfi_endproc; \ ++ .cfi_endproc; \ + .size sym, .-sym + + # define SAVE_ARGS_0 /* Nothing. */ + +--- glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S.orig 2004-05-13 01:47:46.000000000 -0400 ++++ glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/alpha/vfork.S 2004-05-13 01:48:17.000000000 -0400 +@@ -23,7 +23,7 @@ + .globl __vfork + .type __vfork, @function + .usepv __vfork, std +- cfi_startproc ++ .cfi_startproc + __vfork: + ldgp gp, 0(pv) + PSEUDO_PROF +@@ -47,22 +47,22 @@ + fork and vfork object files. */ + $do_fork: + subq sp, 16, sp +- cfi_adjust_cfa_offset(16) ++ .cfi_adjust_cfa_offset(16) + stq ra, 0(sp) +- cfi_offset(ra, -16) ++ .cfi_offset ra, -16 + jsr ra, HIDDEN_JUMPTARGET (__fork) + ldgp gp, 0(ra) + ldq ra, 0(sp) + addq sp, 16, sp +- cfi_restore(ra) +- cfi_adjust_cfa_offset(-16) ++ .cfi_restore(ra) ++ .cfi_adjust_cfa_offset(-16) + ret + + $syscall_error: + SYSCALL_ERROR_HANDLER + #endif + +- cfi_endproc ++ .cfi_endproc + .size __vfork, .-__vfork + + libc_hidden_def (__vfork) diff --git a/patches/glibc/linuxthreads-2.3.2/glibc-2.3.2-sparc64-sigproc.patch b/patches/glibc/linuxthreads-2.3.2/glibc-2.3.2-sparc64-sigproc.patch new file mode 100644 index 00000000..90ecc880 --- /dev/null +++ b/patches/glibc/linuxthreads-2.3.2/glibc-2.3.2-sparc64-sigproc.patch @@ -0,0 +1,26 @@ +From: "M.H.VanLeeuwen" +Subject: crosstool, sparc64, linux 2.6.4, gcc 3.3.3, glibc 2.3.2 success +Date: Mon, 15 Mar 2004 00:23:04 -0600 +To: crossgcc@sources.redhat.com +Message-ID: <40554BC8.749A5EC3@megsinet.net> +... + +backported from GLIBC CVS + +Fix this error: + +/cross/crosstool-0.27/build/sparc64-unknown-linux-gnu/gcc-3.3.3-glibc-2.3.2/build-glibc/linuxthreads/libpthread_pic.a(ptw-pause.os)(.text+0x2c): In function `pause': +: undefined reference to `__sigprocmask' +collect2: ld returned 1 exit status +make[2]: *** [/cross/crosstool-0.27/build/sparc64-unknown-linux-gnu/gcc-3.3.3-glibc-2.3.2/build-glibc/linuxthreads/libpthread.so] Error 1 + + +--- /cross/sources/glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile Wed Dec 31 18:00:00 1969 ++++ glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile Sat Mar 13 10:18:43 2004 +@@ -0,0 +1,5 @@ ++# glibc makefile fragment for linuxthreads on sparc/sparc64. ++ ++ifeq ($(subdir),linuxthreads) ++libpthread-routines += ptw-sigprocmask ++endif + diff --git a/patches/glibc/linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-allow-3.4.patch b/patches/glibc/linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-allow-3.4.patch new file mode 100644 index 00000000..3c4e3a10 --- /dev/null +++ b/patches/glibc/linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-allow-3.4.patch @@ -0,0 +1,100 @@ +[ Revised; now also changes CFLAGS-pt-initfini.s as suggested by + http://sources.redhat.com/ml/crossgcc/2004-07/msg00169.html + to not crash when building a debug glibc on mips ] + +Fixes errors like + +mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.o(.text+0x0):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.S:20: multiple definition of `dummy' +mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.o(.text+0x0):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.S:42: first defined here +mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.o(.text+0x18):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.S:37: multiple definition of `_init' +mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.o(.text+0x30):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.S:76: first defined here +mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.o(.init+0x1c):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.S:86: multiple definition of `_fini' +mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.o(.init+0x10):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.S:48: first defined here +mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.o(.init+0x28):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crti.S:58: undefined reference to `i_am_not_a_leaf' +mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.o(.init+0x4c):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.S:108: undefined reference to `i_am_not_a_leaf' +mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.o(.init+0x50):build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/crtn.S:109: undefined reference to `i_am_not_a_leaf' +collect2: ld returned 1 exit status +make[2]: *** [build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/build-glibc/linuxthreads/libpthread.so] Error 1 +make[2]: Leaving directory `build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2/linuxthreads' +make[1]: *** [linuxthreads/others] Error 2 +make[1]: Leaving directory `build/mipsel-unknown-linux-gnu/gcc-3.4.0-glibc-2.3.2/glibc-2.3.2' +make: *** [all] Error 2 + + +CVSROOT: /cvs/glibc +Module name: libc +Changes by: aj@sourceware.org 2003-12-02 07:37:29 + +Modified files: + . : configure.in configure config.make.in + csu : Makefile + locale : Makefile + linuxthreads : Makefile + linuxthreads/sysdeps/unix/sysv/linux/x86_64: Makefile + nptl : Makefile + nptl/sysdeps/unix/sysv/linux/x86_64: Makefile + +Log message: + * config.make.in (fno-unit-at-a-time): Define. + + * configure.in: Add test for -fno-unit-at-a-time. + Fix text for -fpie. + + * csu/Makefile (CFLAGS-initfini.s): Add $(fno_unit_at_a_time). + * locale/Makefile (CFLAGS-loadlocale.c): Likewise. + + For linuxthreads: + * Makefile (CFLAGS-pt-initfini.s): Add $(fno_unit_at_a_time). + * sysdeps/unix/sysv/linux/x86_64/Makefile (CFLAGS-pt-initfini.s): + Likewise. + + For nptl: + * Makefile (CFLAGS-pt-initfini.s): Add $(fno_unit_at_a_time). + * sysdeps/unix/sysv/linux/x86_64/Makefile (CFLAGS-pt-initfini.s): + Likewise. + +linuxthreads change retrieved with +wget -O foo.patch 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/Makefile.diff?r1=1.83&r2=1.84&cvsroot=glibc' \ +'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile.diff?r1=1.5&r2=1.6&cvsroot=glibc' + +and then rediffed against glibc-2.3.2 +And then extended to mips... + +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads/Makefile,v +retrieving revision 1.83 +retrieving revision 1.84 +diff -u -r1.83 -r1.84 +--- libc/linuxthreads/Makefile 2003/10/02 18:48:48 1.83 ++++ libc/linuxthreads/Makefile 2003/12/02 07:37:28 1.84 +@@ -101,7 +101,7 @@ + extra-objs += $(crti-objs) $(crtn-objs) + omit-deps += crti crtn + +-CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions ++CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions $(fno-unit-at-a-time) + endif + + librt-tests = ex10 ex11 +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile,v +retrieving revision 1.5 +retrieving revision 1.6 +diff -u -r1.5 -r1.6 +--- libc/linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile 2003/04/11 23:34:02 1.5 ++++ libc/linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile 2003/12/02 07:37:28 1.6 +@@ -1,3 +1,4 @@ + ifeq ($(subdir),linuxthreads) +-CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions -fno-asynchronous-unwind-tables ++CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions \ ++ -fno-asynchronous-unwind-tables $(fno-unit-at-a-time) + endif +--- glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/mips/Makefile.old 2004-05-30 18:24:41.000000000 -0700 ++++ glibc-2.3.2/linuxthreads/sysdeps/unix/sysv/linux/mips/Makefile 2004-05-30 18:28:03.000000000 -0700 +@@ -1,2 +1,6 @@ + # pull in __syscall_error routine + libpthread-routines += sysdep ++ ++ifeq ($(subdir),linuxthreads) ++CFLAGS-pt-initfini.s = -g0 -fPIC -fno-inline-functions $(fno-unit-at-a-time) ++endif diff --git a/patches/glibc/linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-cygwin.patch b/patches/glibc/linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-cygwin.patch new file mode 100644 index 00000000..a382a0a9 --- /dev/null +++ b/patches/glibc/linuxthreads-2.3.2/glibc-linuxthreads-2.3.2-cygwin.patch @@ -0,0 +1,30 @@ +Goes with ../glibc-2.3.2/glibc-2.3.2-cygwin.patch + +If you apply the above patch, but forget this one, you get a cryptic error + .../bin/../x86_64-unknown-linux-gnu/sys-root/usr/lib64/: file not recognized: Is a directory +when linking with -lpthread, because the generated libpthread.so +is missing a filename + +by dank@kegel.com, 2004 Mar 30 + + +--- glibc-linuxthreads-2.3.2/linuxthreads/Makefile.old Tue Mar 30 10:33:12 2004 ++++ glibc-linuxthreads-2.3.2/linuxthreads/Makefile Tue Mar 30 10:33:24 2004 +@@ -114,7 +114,7 @@ + install: $(inst_libdir)/libpthread.so + $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \ + $(objpfx)libpthread.so$(libpthread.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)pthread) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -122,7 +122,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\ + ')' \ + ) > $@.new + mv -f $@.new $@ diff --git a/patches/glibc/linuxthreads-2.3.2/sysdep-cancel-arm-1.2-1.6.patch b/patches/glibc/linuxthreads-2.3.2/sysdep-cancel-arm-1.2-1.6.patch new file mode 100644 index 00000000..09ae0077 --- /dev/null +++ b/patches/glibc/linuxthreads-2.3.2/sysdep-cancel-arm-1.2-1.6.patch @@ -0,0 +1,53 @@ +I haven't built glibc-2.3.2 for arm myself, but +http://sources.redhat.com/ml/bug-glibc/2003-05/msg00076.html and +http://www.linux.org.uk/pipermail/linux-arm/2003-November/006560.html +give me the distinct impression that you need the latest sysdep-cancel.h from +cvs. + +Retrieved with + +http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h.diff?cvsroot=glibc&r1=text&tr1=1.2&r2=text&tr2=1.6&f=u + +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h,v +retrieving revision 1.2 +retrieving revision 1.6 +diff -u -r1.2 -r1.6 +--- libc/linuxthreads/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h 2003/01/12 09:14:25 1.2 ++++ libc/linuxthreads/sysdeps/unix/sysv/linux/arm/sysdep-cancel.h 2003/06/06 17:31:40 1.6 +@@ -24,6 +24,17 @@ + + #if !defined NOT_IN_libc || defined IS_IN_libpthread + ++/* We push lr onto the stack, so we have to use ldmib instead of ldmia ++ to find the saved arguments. */ ++# ifdef PIC ++# undef DOARGS_5 ++# undef DOARGS_6 ++# undef DOARGS_7 ++# define DOARGS_5 str r4, [sp, $-4]!; ldr r4, [sp, $8]; ++# define DOARGS_6 mov ip, sp; stmfd sp!, {r4, r5}; ldmib ip, {r4, r5}; ++# define DOARGS_7 mov ip, sp; stmfd sp!, {r4, r5, r6}; ldmib ip, {r4, r5, r6}; ++# endif ++ + # undef PSEUDO_RET + # define PSEUDO_RET \ + ldrcc pc, [sp], $4; \ +@@ -34,7 +45,7 @@ + # define PSEUDO(name, syscall_name, args) \ + .section ".text"; \ + PSEUDO_PROLOGUE; \ +- ENTRY (name) \ ++ ENTRY (name); \ + SINGLE_THREAD_P_INT; \ + bne .Lpseudo_cancel; \ + DO_CALL (syscall_name, args); \ +@@ -110,7 +121,7 @@ + ldr reg, 2b; \ + 3: \ + add ip, pc, ip; \ +- ldr ip, [ip, lr]; \ ++ ldr ip, [ip, reg]; \ + teq ip, #0; + # define SINGLE_THREAD_P_INT \ + str lr, [sp, $-4]!; \ diff --git a/patches/glibc/linuxthreads-2.3.3/glibc-2.3.3-alpha-prolog.patch b/patches/glibc/linuxthreads-2.3.3/glibc-2.3.3-alpha-prolog.patch new file mode 100644 index 00000000..87877ee3 --- /dev/null +++ b/patches/glibc/linuxthreads-2.3.3/glibc-2.3.3-alpha-prolog.patch @@ -0,0 +1,36 @@ +wget 'http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/linuxthreads/sysdeps/alpha/elf/pt-initfini.c.diff?r1=1.3&r2=1.4&cvsroot=glibc' + +Revision 1.4, Wed Dec 10 05:46:41 2003 UTC (8 months, 1 week ago) by aj + (__asm__): Remove extra .prologue. + +Fixes error + +crosstool-0.28-rc34/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.3.3/build-glibc/linuxthreads/crti.S: Assembler messages: +crosstool-0.28-rc34/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.3.3/build-glibc/linuxthreads/crti.S:34: Error: .prologue directive without a preceding .ent directive +make[2]: *** [crosstool-0.28-rc34/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.3.3/build-glibc/linuxthreads/crti.o] Error 1 +make[2]: Leaving directory `crosstool-0.28-rc34/build/alpha-unknown-linux-gnu/gcc-3.4.1-glibc-2.3.3/glibc-2.3.3/linuxthreads' + +when building with gcc-3.4.1 + +=================================================================== +RCS file: /cvs/glibc/libc/linuxthreads/sysdeps/alpha/elf/pt-initfini.c,v +retrieving revision 1.3 +retrieving revision 1.4 +diff -u -r1.3 -r1.4 +--- libc/linuxthreads/sysdeps/alpha/elf/pt-initfini.c 2003/07/05 22:56:39 1.3 ++++ libc/linuxthreads/sysdeps/alpha/elf/pt-initfini.c 2003/12/10 05:46:41 1.4 +@@ -1,5 +1,5 @@ + /* Special .init and .fini section support for Alpha. Linuxthreads 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 +@@ -75,7 +75,6 @@ + subq $30, 16, $30 \n\ + stq $26, 0($30) \n\ + stq $29, 8($30) \n\ +- .prologue 1 \n\ + .align 3 \n\ + /*@_fini_PROLOG_ENDS*/ \n\ + \n\ diff --git a/patches/glibc/linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch b/patches/glibc/linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch new file mode 100644 index 00000000..239b2909 --- /dev/null +++ b/patches/glibc/linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch @@ -0,0 +1,38 @@ +Fixes +elf/librtld.os: In function `process_envvars': : undefined reference to `__access' +... +when building glibc-2.3.3 on cygwin + +Idea from +http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch +Basically, make glibc use .oST as suffix for 'object static' +instead of .oS, since cygwin has trouble distinguishing .os from .oS +(Original patch had .on, but .oST is more mnemonic for 'object static') + +glibc-linuxthreads-2.3.3 also requires a patch, see +../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch + +[ rediffed against glibc-2.3.3 ] + + +diff -aur glibc-linuxthreads-2.3.3/linuxthreads/Makefile glibc-linuxthreads-2.3.3-cygwin/linuxthreads/Makefile +--- glibc-linuxthreads-2.3.3/linuxthreads/Makefile 2004-08-27 20:38:40.000000000 -0700 ++++ glibc-linuxthreads-2.3.3-cygwin/linuxthreads/Makefile 2003-10-02 11:48:48.000000000 -0700 +@@ -156,7 +156,7 @@ + install: $(inst_libdir)/libpthread.so + $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \ + $(objpfx)libpthread.so$(libpthread.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)pthread) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -164,7 +164,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\ + ')' \ + ) > $@.new + mv -f $@.new $@ diff --git a/patches/glibc/linuxthreads-2.3.4/glibc-linuxthreads-2.3.3-cygwin.patch b/patches/glibc/linuxthreads-2.3.4/glibc-linuxthreads-2.3.3-cygwin.patch new file mode 100644 index 00000000..239b2909 --- /dev/null +++ b/patches/glibc/linuxthreads-2.3.4/glibc-linuxthreads-2.3.3-cygwin.patch @@ -0,0 +1,38 @@ +Fixes +elf/librtld.os: In function `process_envvars': : undefined reference to `__access' +... +when building glibc-2.3.3 on cygwin + +Idea from +http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch +Basically, make glibc use .oST as suffix for 'object static' +instead of .oS, since cygwin has trouble distinguishing .os from .oS +(Original patch had .on, but .oST is more mnemonic for 'object static') + +glibc-linuxthreads-2.3.3 also requires a patch, see +../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch + +[ rediffed against glibc-2.3.3 ] + + +diff -aur glibc-linuxthreads-2.3.3/linuxthreads/Makefile glibc-linuxthreads-2.3.3-cygwin/linuxthreads/Makefile +--- glibc-linuxthreads-2.3.3/linuxthreads/Makefile 2004-08-27 20:38:40.000000000 -0700 ++++ glibc-linuxthreads-2.3.3-cygwin/linuxthreads/Makefile 2003-10-02 11:48:48.000000000 -0700 +@@ -156,7 +156,7 @@ + install: $(inst_libdir)/libpthread.so + $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \ + $(objpfx)libpthread.so$(libpthread.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)pthread) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -164,7 +164,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\ + ')' \ + ) > $@.new + mv -f $@.new $@ diff --git a/patches/glibc/linuxthreads-2.3.4/glibc-linuxthreads-2.3.4-allow-gcc-4.0-rtld.patch b/patches/glibc/linuxthreads-2.3.4/glibc-linuxthreads-2.3.4-allow-gcc-4.0-rtld.patch new file mode 100644 index 00000000..46ee02ca --- /dev/null +++ b/patches/glibc/linuxthreads-2.3.4/glibc-linuxthreads-2.3.4-allow-gcc-4.0-rtld.patch @@ -0,0 +1,89 @@ +See http://sources.redhat.com/ml/libc-hacker/2005-03/msg00008.html + +From libc-hacker-return-8343-listarch-libc-hacker=sources dot redhat dot com at sources dot redhat dot com Sat Mar 05 09:21:18 2005 +Return-Path: <libc-hacker-return-8343-listarch-libc-hacker=sources dot redhat dot com at sources dot redhat dot com> +Delivered-To: listarch-libc-hacker at sources dot redhat dot com +Received: (qmail 23370 invoked by alias); 5 Mar 2005 09:21:15 -0000 +Mailing-List: contact libc-hacker-help at sources dot redhat dot com; run by ezmlm +Precedence: bulk +List-Subscribe: <mailto:libc-hacker-subscribe at sources dot redhat dot com> +List-Archive: <http://sources.redhat.com/ml/libc-hacker/> +List-Post: <mailto:libc-hacker at sources dot redhat dot com> +List-Help: <mailto:libc-hacker-help at sources dot redhat dot com>, <http://sources dot redhat dot com/ml/#faqs> +Sender: libc-hacker-owner at sources dot redhat dot com +Delivered-To: mailing list libc-hacker at sources dot redhat dot com +Received: (qmail 22971 invoked from network); 5 Mar 2005 09:20:51 -0000 +Received: from unknown (HELO sunsite.mff.cuni.cz) (195.113.15.26) + by sourceware dot org with SMTP; 5 Mar 2005 09:20:51 -0000 +Received: from sunsite.mff.cuni.cz (sunsite.mff.cuni.cz [127.0.0.1]) + by sunsite dot mff dot cuni dot cz (8 dot 13 dot 1/8 dot 13 dot 1) with ESMTP id j259KoB5020894; + Sat, 5 Mar 2005 10:20:50 +0100 +Received: (from jj@localhost) + by sunsite dot mff dot cuni dot cz (8 dot 13 dot 1/8 dot 13 dot 1/Submit) id j259KnO1020889; + Sat, 5 Mar 2005 10:20:49 +0100 +Date: Sat, 5 Mar 2005 10:20:49 +0100 +From: Jakub Jelinek <jakub at redhat dot com> +To: Ulrich Drepper <drepper at redhat dot com>, Roland McGrath <roland at redhat dot com> +Cc: Glibc hackers <libc-hacker at sources dot redhat dot com> +Subject: [PATCH] Fix build with GCC 4 +Message-ID: <20050305092049.GJ4777@sunsite.mff.cuni.cz> +Reply-To: Jakub Jelinek <jakub at redhat dot com> +Mime-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Disposition: inline +User-Agent: Mutt/1.4.1i + +Hi! + +The thread_offsetof change just mirrors what Alan Modra did to NPTL +tcb-offsets.sym. Apparently for GCC 4 an offsetof like expression, +but not really offsetof, is no longer constant folded and therefore +not suitable for "i" constraint. + +The ELF_MACHINE_NO_RELA change is needed to avoid +rtld.c: In function '_dl_start': +dynamic-link.h:50: error: nested function 'elf_machine_rela_relative' declared but never defined +dynamic-link.h:47: error: nested function 'elf_machine_rela' declared but never defined +This is what happens. +rtld.c first includes dl-machine.h without RESOLVE_MAP +and without RTLD_BOOTSTRAP defined. This means that ELF_MACHINE_NO_RELA +is not defined on i386/arm. Later on it defines RESOLVE_MAP +and RTLD_BOOTSTRAP and includes dynamic-link.h which has: +# if ! ELF_MACHINE_NO_RELA +auto void __attribute__((always_inline)) +elf_machine_rela (struct link_map *map, const ElfW(Rela) *reloc, + const ElfW(Sym) *sym, const struct r_found_version *version, + void *const reloc_addr); +auto void __attribute__((always_inline)) +elf_machine_rela_relative (ElfW(Addr) l_addr, const ElfW(Rela) *reloc, + void *const reloc_addr); +# endif +and later on includes dl-machine.h which sees RTLD_BOOTSTRAP is +defined and defines ELF_MACHINE_NO_RELA and doesn't define +elf_machine_rela* nested functions. +But the prototypes were already defined and GCC 4 doesn't like this. +ELF_MACHINE_NO_RELA is only ever used in preprocessing conditionals +and never in defined ELF_MACHINE_NO_RELA, so the trick below +already defines ELF_MACHINE_NO_RELA to 1/0 depending on whether +RTLD_BOOTSTRAP is defined and thus the prototypes in dynamic-link.h +that are not desirable are gone. + +2005-03-05 Jakub Jelinek <jakub@redhat.com> + + * sysdeps/i386/dl-machine.h (ELF_MACHINE_NO_RELA): Define + unconditionally to (defined RTLD_BOOTSTRAP). + * sysdeps/arm/dl-machine.h (ELF_MACHINE_NO_RELA): Likewise. +linuxthreads/ + * sysdeps/powerpc/tcb-offsets.sym (thread_offsetof): Rework for GCC 4. + +--- libc/linuxthreads/sysdeps/powerpc/tcb-offsets.sym.jj 2005-03-04 14:21:29.000000000 -0500 ++++ libc/linuxthreads/sysdeps/powerpc/tcb-offsets.sym 2005-03-04 14:26:29.000000000 -0500 +@@ -8,7 +8,7 @@ + -- Abuse tls.h macros to derive offsets relative to the thread register. + # undef __thread_register + # define __thread_register ((void *) 0) +-# define thread_offsetof(mem) ((void *) &THREAD_SELF->p_##mem - (void *) 0) ++# define thread_offsetof(mem) ((ptrdiff_t) THREAD_SELF + offsetof (struct _pthread_descr_struct, p_##mem)) + + # else + diff --git a/patches/glibc/linuxthreads-2.3.5/glibc-linuxthreads-2.3.5-cygwin.patch b/patches/glibc/linuxthreads-2.3.5/glibc-linuxthreads-2.3.5-cygwin.patch new file mode 100644 index 00000000..0c0dac04 --- /dev/null +++ b/patches/glibc/linuxthreads-2.3.5/glibc-linuxthreads-2.3.5-cygwin.patch @@ -0,0 +1,37 @@ +Fixes +elf/librtld.os: In function `process_envvars': : undefined reference to `__access' +... +when building glibc-2.3.3 on cygwin + +Idea from +http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch +Basically, make glibc use .oST as suffix for 'object static' +instead of .oS, since cygwin has trouble distinguishing .os from .oS +(Original patch had .on, but .oST is more mnemonic for 'object static') + +glibc-linuxthreads-2.3.3 also requires a patch, see +../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch + +[ rediffed against glibc-2.3.5 ] + +diff -aur glibc-2.3.5/linuxthreads/Makefile glibc-2.3.5-cygwin/linuxthreads/Makefile +--- glibc-2.3.5/linuxthreads/Makefile 2005-02-16 12:26:38.000000000 +0100 ++++ glibc-2.3.5-cygwin/linuxthreads/Makefile 2005-05-11 08:32:50.453125000 +0200 +@@ -159,7 +159,7 @@ + install: $(inst_libdir)/libpthread.so + $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \ + $(objpfx)libpthread.so$(libpthread.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)pthread) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -167,7 +167,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\ + ')' \ + ) > $@.new + mv -f $@.new $@ diff --git a/patches/glibc/linuxthreads-2.3.6/glibc-linuxthreads-2.3.5-cygwin.patch b/patches/glibc/linuxthreads-2.3.6/glibc-linuxthreads-2.3.5-cygwin.patch new file mode 100644 index 00000000..0c0dac04 --- /dev/null +++ b/patches/glibc/linuxthreads-2.3.6/glibc-linuxthreads-2.3.5-cygwin.patch @@ -0,0 +1,37 @@ +Fixes +elf/librtld.os: In function `process_envvars': : undefined reference to `__access' +... +when building glibc-2.3.3 on cygwin + +Idea from +http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch +Basically, make glibc use .oST as suffix for 'object static' +instead of .oS, since cygwin has trouble distinguishing .os from .oS +(Original patch had .on, but .oST is more mnemonic for 'object static') + +glibc-linuxthreads-2.3.3 also requires a patch, see +../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch + +[ rediffed against glibc-2.3.5 ] + +diff -aur glibc-2.3.5/linuxthreads/Makefile glibc-2.3.5-cygwin/linuxthreads/Makefile +--- glibc-2.3.5/linuxthreads/Makefile 2005-02-16 12:26:38.000000000 +0100 ++++ glibc-2.3.5-cygwin/linuxthreads/Makefile 2005-05-11 08:32:50.453125000 +0200 +@@ -159,7 +159,7 @@ + install: $(inst_libdir)/libpthread.so + $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \ + $(objpfx)libpthread.so$(libpthread.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)pthread) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -167,7 +167,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\ + ')' \ + ) > $@.new + mv -f $@.new $@ diff --git a/patches/glibc/linuxthreads-20040827/glibc-linuxthreads-2.3.3-cygwin.patch b/patches/glibc/linuxthreads-20040827/glibc-linuxthreads-2.3.3-cygwin.patch new file mode 100644 index 00000000..239b2909 --- /dev/null +++ b/patches/glibc/linuxthreads-20040827/glibc-linuxthreads-2.3.3-cygwin.patch @@ -0,0 +1,38 @@ +Fixes +elf/librtld.os: In function `process_envvars': : undefined reference to `__access' +... +when building glibc-2.3.3 on cygwin + +Idea from +http://sources.redhat.com/ml/bug-glibc/2002-01/msg00071/glibc-2.2-cygin-shared.patch +Basically, make glibc use .oST as suffix for 'object static' +instead of .oS, since cygwin has trouble distinguishing .os from .oS +(Original patch had .on, but .oST is more mnemonic for 'object static') + +glibc-linuxthreads-2.3.3 also requires a patch, see +../glibc-linuxthreads-2.3.3/glibc-linuxthreads-2.3.3-cygwin.patch + +[ rediffed against glibc-2.3.3 ] + + +diff -aur glibc-linuxthreads-2.3.3/linuxthreads/Makefile glibc-linuxthreads-2.3.3-cygwin/linuxthreads/Makefile +--- glibc-linuxthreads-2.3.3/linuxthreads/Makefile 2004-08-27 20:38:40.000000000 -0700 ++++ glibc-linuxthreads-2.3.3-cygwin/linuxthreads/Makefile 2003-10-02 11:48:48.000000000 -0700 +@@ -156,7 +156,7 @@ + install: $(inst_libdir)/libpthread.so + $(inst_libdir)/libpthread.so: $(common-objpfx)format.lds \ + $(objpfx)libpthread.so$(libpthread.so-version) \ +- $(inst_libdir)/$(patsubst %,$(libtype.oS),\ ++ $(inst_libdir)/$(patsubst %,$(libtype.oST),\ + $(libprefix)pthread) \ + $(+force) + (echo '/* GNU ld script';\ +@@ -164,7 +164,7 @@ + echo ' the static library, so try that secondarily. */';\ + cat $<; \ + echo 'GROUP ( $(slibdir)/libpthread.so$(libpthread.so-version)' \ +- '$(libdir)/$(patsubst %,$(libtype.oS),$(libprefix)pthread)'\ ++ '$(libdir)/$(patsubst %,$(libtype.oST),$(libprefix)pthread)'\ + ')' \ + ) > $@.new + mv -f $@.new $@ diff --git a/patches/libfloat/990616/100-libfloat_990616-3-lib-versioning.patch b/patches/libfloat/990616/100-libfloat_990616-3-lib-versioning.patch new file mode 100644 index 00000000..30e7f2a3 --- /dev/null +++ b/patches/libfloat/990616/100-libfloat_990616-3-lib-versioning.patch @@ -0,0 +1,48 @@ +This patch comes from the Debian archive: + ftp://ftp.de.debian.org/debian/pool/main/libf/libfloat/libfloat_990616-3.diff.gz + +It was stripped of all Debian-related hunks. +Kept is the library versioning. + +--- libfloat-990616.orig/Makefile ++++ libfloat-990616/Makefile +@@ -4,15 +4,15 @@ + #CC=gcc -g -O2 -freg-struct-return -D__LIBFLOAT__ + AR=ar + +-all: libfloat.a libfloat.so ++all: libfloat.a libfloat.so.1 + + libfloat.a: softfloat.o fplib_glue.o + rm -f libfloat.a + $(AR) cq libfloat.a softfloat.o fplib_glue.o + +-libfloat.so: softfloat.os fplib_glue.os +- rm -f libfloat.so +- gcc -shared softfloat.os fplib_glue.os -o libfloat.so ++libfloat.so.1: softfloat.os fplib_glue.os ++ rm -f libfloat.so.1 ++ gcc -shared -Wl,-soname,libfloat.so.1 softfloat.os fplib_glue.os -o libfloat.so.1 + + softfloat.o: softfloat/bits64/softfloat.c + $(CC) -c -o softfloat.o -Isoftfloat/bits64/ARM-gcc softfloat/bits64/softfloat.c +@@ -26,14 +26,14 @@ + fplib_glue.os: fplib_glue.S + $(CC) -fpic -c -o fplib_glue.os fplib_glue.S + +-install: libfloat.a libfloat.so +- cp -a libfloat.a /usr/lib +- cp -a libfloat.so /usr/lib +- ldconfig ++install: libfloat.a libfloat.so.1 ++ cp -a libfloat.a $(DESTDIR)/usr/lib ++ cp -a libfloat.so.1 $(DESTDIR)/usr/lib ++ cd $(DESTDIR)/usr/lib; ln -s libfloat.so.1 libfloat.so + + clean: + rm -f *.o + rm -f *.os + rm -f libfloat.a +- rm -f libfloat.so ++ rm -f libfloat.so.1 + rm -f *~ diff --git a/patches/libfloat/990616/200-cross_compile.patch b/patches/libfloat/990616/200-cross_compile.patch new file mode 100644 index 00000000..640008cb --- /dev/null +++ b/patches/libfloat/990616/200-cross_compile.patch @@ -0,0 +1,63 @@ +When linking, call directly ld in place of the gcc wrapper, because the wrapper +will try to link with -lfloat, which we don't have right now... + +Simplify CFLAGS to stay ABI compliant (ot so I guess)... + +diff -dur libfloat.orig/Makefile libfloat/Makefile +--- libfloat.orig/Makefile 2007-02-16 19:38:55.000000000 +0100 ++++ libfloat/Makefile 2007-02-16 19:46:23.000000000 +0100 +@@ -1,8 +1,11 @@ + # Makefile for the Linux soft-float library + +-CC=gcc -O2 -freg-struct-return -fomit-frame-pointer -D__LIBFLOAT__ +-#CC=gcc -g -O2 -freg-struct-return -D__LIBFLOAT__ +-AR=ar ++AR=$(CROSS_COMPILE)ar ++#CFLAGS=-O2 -freg-struct-return -fomit-frame-pointer -D__LIBFLOAT__ ++CFLAGS=-O2 -D__LIBFLOAT__ ++CC=$(CROSS_COMPILE)gcc ++LDFLAGS=-shared -nostdlib ++LD=$(CROSS_COMPILE)ld + + all: libfloat.a libfloat.so.1 + +@@ -12,28 +13,31 @@ + + libfloat.so.1: softfloat.os fplib_glue.os + rm -f libfloat.so.1 +- gcc -shared -Wl,-soname,libfloat.so.1 softfloat.os fplib_glue.os -o libfloat.so.1 ++ $(LD) $(LDFLAGS) -soname=libfloat.so.1 softfloat.os fplib_glue.os -o libfloat.so.1 + + softfloat.o: softfloat/bits64/softfloat.c +- $(CC) -c -o softfloat.o -Isoftfloat/bits64/ARM-gcc softfloat/bits64/softfloat.c ++ $(CC) $(CFLAGS) -c -o softfloat.o -Isoftfloat/bits64/ARM-gcc softfloat/bits64/softfloat.c + + fplib_glue.o: fplib_glue.S +- $(CC) -c -o fplib_glue.o fplib_glue.S ++ $(CC) $(CFLAGS) -c -o fplib_glue.o fplib_glue.S + + softfloat.os: softfloat/bits64/softfloat.c +- $(CC) -fpic -c -o softfloat.os -Isoftfloat/bits64/ARM-gcc softfloat/bits64/softfloat.c ++ $(CC) $(CFLAGS) -fpic -c -o softfloat.os -Isoftfloat/bits64/ARM-gcc softfloat/bits64/softfloat.c + + fplib_glue.os: fplib_glue.S +- $(CC) -fpic -c -o fplib_glue.os fplib_glue.S ++ $(CC) $(CFLAGS) -fpic -c -o fplib_glue.os fplib_glue.S + + install: libfloat.a libfloat.so.1 +- cp -a libfloat.a $(DESTDIR)/usr/lib +- cp -a libfloat.so.1 $(DESTDIR)/usr/lib +- cd $(DESTDIR)/usr/lib; ln -s libfloat.so.1 libfloat.so ++ install -d -m 755 "$(DESTDIR)/usr/lib" ++ install -m 755 libfloat.a "$(DESTDIR)/usr/lib" ++ install -m 755 libfloat.so.1 "$(DESTDIR)/usr/lib" ++ cd $(DESTDIR)/usr/lib ++ ln -s libfloat.so.1 libfloat.so + + clean: + rm -f *.o + rm -f *.os + rm -f libfloat.a + rm -f libfloat.so.1 ++ rm -f libfloat.so + rm -f *~ diff --git a/patches/linux/2.4.26/01-kmap-types-cleanup.patch b/patches/linux/2.4.26/01-kmap-types-cleanup.patch new file mode 100644 index 00000000..4a900bc1 --- /dev/null +++ b/patches/linux/2.4.26/01-kmap-types-cleanup.patch @@ -0,0 +1,306 @@ +From http://www.uwsg.iu.edu/hypermail/linux/kernel/0307.2/att-1234/01-kmap-types-cleanup.patch +See http://www.uwsg.iu.edu/hypermail/linux/kernel/0307.2/1234.html + +From: Marc-Christian Petersen (m.c.p@wolk-project.de) + +> > on alpha: +> > internal.h:19:28: asm/kmap_types.h: No such file or directory +> Same on s390 and some other platforms.We should just get rid of +> this problem by providing a generic kmap_types header. +I agree on this but your patch is bogus. Please use the attached one instead. + +Marcello, please apply this one instead. Against 2.4.22-BK (2.4.21-bk14) + +[ I commented out the hunk +#+++ b/include/asm-mips/kmap_types.h 1970-01-01 01:00:00.000000000 +0100 +to get this to apply to linux-2.4.26. +- dank] + +diff -Naurp a/crypto/internal.h b/crypto/internal.h +--- a/crypto/internal.h 2003-07-19 14:09:06.000000000 +0200 ++++ b/crypto/internal.h 2003-07-19 14:18:58.000000000 +0200 +@@ -14,9 +14,9 @@ + #include <linux/mm.h> + #include <linux/highmem.h> + #include <linux/init.h> ++#include <linux/kmap_types.h> + #include <asm/hardirq.h> + #include <asm/softirq.h> +-#include <asm/kmap_types.h> + + extern enum km_type crypto_km_types[]; + +diff -Naurp a/include/asm-i386/fixmap.h b/include/asm-i386/fixmap.h +--- a/include/asm-i386/fixmap.h 2003-07-19 14:09:31.000000000 +0200 ++++ b/include/asm-i386/fixmap.h 2003-07-19 14:18:58.000000000 +0200 +@@ -20,7 +20,7 @@ + #include <asm/page.h> + #ifdef CONFIG_HIGHMEM + #include <linux/threads.h> +-#include <asm/kmap_types.h> ++#include <linux/kmap_types.h> + #endif + + /* +diff -Naurp a/include/asm-i386/highmem.h b/include/asm-i386/highmem.h +--- a/include/asm-i386/highmem.h 2003-07-15 10:28:54.000000000 +0200 ++++ b/include/asm-i386/highmem.h 2003-07-19 14:18:58.000000000 +0200 +@@ -23,7 +23,6 @@ + #include <linux/config.h> + #include <linux/init.h> + #include <linux/interrupt.h> +-#include <asm/kmap_types.h> + #include <asm/pgtable.h> + + #ifdef CONFIG_DEBUG_HIGHMEM +diff -Naurp a/include/asm-i386/kmap_types.h b/include/asm-i386/kmap_types.h +--- a/include/asm-i386/kmap_types.h 2003-07-19 14:09:31.000000000 +0200 ++++ b/include/asm-i386/kmap_types.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,16 +0,0 @@ +-#ifndef _ASM_KMAP_TYPES_H +-#define _ASM_KMAP_TYPES_H +- +-enum km_type { +- KM_BOUNCE_READ, +- KM_SKB_SUNRPC_DATA, +- KM_SKB_DATA_SOFTIRQ, +- KM_USER0, +- KM_USER1, +- KM_BH_IRQ, +- KM_SOFTIRQ0, +- KM_SOFTIRQ1, +- KM_TYPE_NR +-}; +- +-#endif +diff -Naurp a/include/asm-m68k/kmap_types.h b/include/asm-m68k/kmap_types.h +--- a/include/asm-m68k/kmap_types.h 2003-07-19 14:09:33.000000000 +0200 ++++ b/include/asm-m68k/kmap_types.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,18 +0,0 @@ +-#ifdef __KERNEL__ +-#ifndef _ASM_KMAP_TYPES_H +-#define _ASM_KMAP_TYPES_H +- +-enum km_type { +- KM_BOUNCE_READ, +- KM_SKB_SUNRPC_DATA, +- KM_SKB_DATA_SOFTIRQ, +- KM_USER0, +- KM_USER1, +- KM_BH_IRQ, +- KM_SOFTIRQ0, +- KM_SOFTIRQ1, +- KM_TYPE_NR +-}; +- +-#endif +-#endif /* __KERNEL__ */ +diff -Naurp a/include/asm-mips/fixmap.h b/include/asm-mips/fixmap.h +--- a/include/asm-mips/fixmap.h 2002-09-27 23:26:03.000000000 +0200 ++++ b/include/asm-mips/fixmap.h 2003-07-19 14:18:58.000000000 +0200 +@@ -18,7 +18,7 @@ + #include <asm/page.h> + #ifdef CONFIG_HIGHMEM + #include <linux/threads.h> +-#include <asm/kmap_types.h> ++#include <linux/kmap_types.h> + #endif + + /* +diff -Naurp a/include/asm-mips/highmem.h b/include/asm-mips/highmem.h +--- a/include/asm-mips/highmem.h 2002-12-18 01:03:59.000000000 +0100 ++++ b/include/asm-mips/highmem.h 2003-07-19 14:18:58.000000000 +0200 +@@ -22,7 +22,6 @@ + + #include <linux/init.h> + #include <linux/interrupt.h> +-#include <asm/kmap_types.h> + #include <asm/pgtable.h> + + /* undef for production */ +#diff -Naurp a/include/asm-mips/kmap_types.h b/include/asm-mips/kmap_types.h +#--- a/include/asm-mips/kmap_types.h 2002-12-18 01:03:59.000000000 +0100 +#+++ b/include/asm-mips/kmap_types.h 1970-01-01 01:00:00.000000000 +0100 +#@@ -1,14 +0,0 @@ +#-#ifndef _ASM_KMAP_TYPES_H +#-#define _ASM_KMAP_TYPES_H +#- +#-enum km_type { +#- KM_BOUNCE_READ, +#- KM_SKB_SUNRPC_DATA, +#- KM_SKB_DATA_SOFTIRQ, +#- KM_USER0, +#- KM_USER1, +#- KM_BIO_IRQ, +#- KM_TYPE_NR +#-}; +#- +#-#endif +diff -Naurp a/include/asm-ppc/highmem.h b/include/asm-ppc/highmem.h +--- a/include/asm-ppc/highmem.h 2003-07-19 14:09:33.000000000 +0200 ++++ b/include/asm-ppc/highmem.h 2003-07-19 14:18:58.000000000 +0200 +@@ -24,7 +24,7 @@ + + #include <linux/init.h> + #include <linux/interrupt.h> +-#include <asm/kmap_types.h> ++#include <linux/kmap_types.h> + #include <asm/pgtable.h> + + /* undef for production */ +diff -Naurp a/include/asm-ppc/kmap_types.h b/include/asm-ppc/kmap_types.h +--- a/include/asm-ppc/kmap_types.h 2003-07-19 14:09:33.000000000 +0200 ++++ b/include/asm-ppc/kmap_types.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,18 +0,0 @@ +-#ifdef __KERNEL__ +-#ifndef _ASM_KMAP_TYPES_H +-#define _ASM_KMAP_TYPES_H +- +-enum km_type { +- KM_BOUNCE_READ, +- KM_SKB_SUNRPC_DATA, +- KM_SKB_DATA_SOFTIRQ, +- KM_USER0, +- KM_USER1, +- KM_BH_IRQ, +- KM_SOFTIRQ0, +- KM_SOFTIRQ1, +- KM_TYPE_NR +-}; +- +-#endif +-#endif /* __KERNEL__ */ +diff -Naurp a/include/asm-ppc64/kmap_types.h b/include/asm-ppc64/kmap_types.h +--- a/include/asm-ppc64/kmap_types.h 2003-07-19 14:09:35.000000000 +0200 ++++ b/include/asm-ppc64/kmap_types.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,23 +0,0 @@ +-#ifdef __KERNEL__ +-#ifndef _ASM_KMAP_TYPES_H +-#define _ASM_KMAP_TYPES_H +- +-enum km_type { +- KM_BOUNCE_READ, +- KM_SKB_SUNRPC_DATA, +- KM_SKB_DATA_SOFTIRQ, +- KM_USER0, +- KM_USER1, +- KM_BIO_SRC_IRQ, +- KM_BIO_DST_IRQ, +- KM_PTE0, +- KM_PTE1, +- KM_IRQ0, +- KM_IRQ1, +- KM_SOFTIRQ0, +- KM_SOFTIRQ1, +- KM_TYPE_NR +-}; +- +-#endif +-#endif /* __KERNEL__ */ +diff -Naurp a/include/asm-sparc/highmem.h b/include/asm-sparc/highmem.h +--- a/include/asm-sparc/highmem.h 2003-07-15 10:28:56.000000000 +0200 ++++ b/include/asm-sparc/highmem.h 2003-07-19 14:18:58.000000000 +0200 +@@ -21,7 +21,7 @@ + #ifdef __KERNEL__ + + #include <linux/interrupt.h> +-#include <asm/kmap_types.h> ++#include <linux/kmap_types.h> + + /* undef for production */ + #define HIGHMEM_DEBUG 1 +diff -Naurp a/include/asm-sparc/kmap_types.h b/include/asm-sparc/kmap_types.h +--- a/include/asm-sparc/kmap_types.h 2003-07-19 14:09:37.000000000 +0200 ++++ b/include/asm-sparc/kmap_types.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,16 +0,0 @@ +-#ifndef _ASM_KMAP_TYPES_H +-#define _ASM_KMAP_TYPES_H +- +-enum km_type { +- KM_BOUNCE_READ, +- KM_SKB_SUNRPC_DATA, +- KM_SKB_DATA_SOFTIRQ, +- KM_USER0, +- KM_USER1, +- KM_BH_IRQ, +- KM_SOFTIRQ0, +- KM_SOFTIRQ1, +- KM_TYPE_NR +-}; +- +-#endif +diff -Naurp a/include/asm-sparc64/kmap_types.h b/include/asm-sparc64/kmap_types.h +--- a/include/asm-sparc64/kmap_types.h 2003-07-19 14:09:37.000000000 +0200 ++++ b/include/asm-sparc64/kmap_types.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,20 +0,0 @@ +-#ifndef _ASM_KMAP_TYPES_H +-#define _ASM_KMAP_TYPES_H +- +-/* Dummy header just to define km_type. None of this +- * is actually used on sparc64. -DaveM +- */ +- +-enum km_type { +- KM_BOUNCE_READ, +- KM_SKB_SUNRPC_DATA, +- KM_SKB_DATA_SOFTIRQ, +- KM_USER0, +- KM_USER1, +- KM_BH_IRQ, +- KM_SOFTIRQ0, +- KM_SOFTIRQ1, +- KM_TYPE_NR +-}; +- +-#endif +diff -Naurp a/include/asm-x86_64/kmap_types.h b/include/asm-x86_64/kmap_types.h +--- a/include/asm-x86_64/kmap_types.h 2003-07-19 14:09:37.000000000 +0200 ++++ b/include/asm-x86_64/kmap_types.h 1970-01-01 01:00:00.000000000 +0100 +@@ -1,15 +0,0 @@ +-#ifndef _ASM_KMAP_TYPES_H +-#define _ASM_KMAP_TYPES_H +- +-enum km_type { +- KM_BOUNCE_READ, +- KM_SKB_DATA, +- KM_SKB_DATA_SOFTIRQ, +- KM_USER0, +- KM_USER1, +- KM_SOFTIRQ0, +- KM_SOFTIRQ1, +- KM_TYPE_NR +-}; +- +-#endif +diff -Naurp a/include/linux/highmem.h b/include/linux/highmem.h +--- a/include/linux/highmem.h 2003-07-19 14:09:37.000000000 +0200 ++++ b/include/linux/highmem.h 2003-07-19 14:18:58.000000000 +0200 +@@ -2,6 +2,7 @@ + #define _LINUX_HIGHMEM_H + + #include <linux/config.h> ++#include <linux/kmap_types.h> + #include <asm/pgalloc.h> + + #ifdef CONFIG_HIGHMEM +diff -Naurp a/include/linux/kmap_types.h b/include/linux/kmap_types.h +--- a/include/linux/kmap_types.h 1970-01-01 01:00:00.000000000 +0100 ++++ b/include/linux/kmap_types.h 2003-07-19 14:18:58.000000000 +0200 +@@ -0,0 +1,16 @@ ++#ifndef _LINUX_KMAP_TYPES_H ++#define _LINUX_KMAP_TYPES_H ++ ++enum km_type { ++ KM_BOUNCE_READ, ++ KM_SKB_SUNRPC_DATA, ++ KM_SKB_DATA_SOFTIRQ, ++ KM_USER0, ++ KM_USER1, ++ KM_BH_IRQ, ++ KM_SOFTIRQ0, ++ KM_SOFTIRQ1, ++ KM_TYPE_NR ++}; ++ ++#endif + diff --git a/patches/linux/2.4.26/kaz-types.patch b/patches/linux/2.4.26/kaz-types.patch new file mode 100644 index 00000000..ec5de36a --- /dev/null +++ b/patches/linux/2.4.26/kaz-types.patch @@ -0,0 +1,60 @@ +The following fixes an error that occurs when building glibc-2.3.2 (but not glibc-2.2.5) for sh4: + +In file included from sys/ustat.h:30, + from ../sysdeps/unix/sysv/linux/ustat.c:21: +../sysdeps/generic/bits/ustat.h:26: error: redefinition of `struct ustat' +make[2]: *** [/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/build-glibc/misc/ustat.o] Error 1 +make[2]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2/misc' +make[1]: *** [misc/subdir_lib] Error 2 +make[1]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2' +make: *** [all] Error 2 + +----------- snip --------------- + +Date: Fri, 06 Jun 2003 08:00:00 +0900 +From: kaz Kojima <kkojima@rr.iij4u.or.jp> +Subject: [linux-sh:02770] Re: Compiling glibc-2.3.2 for sh4 fails with "include/asm/user.h:32: + error: redefinition of `struct user_fpu_struct'" +To: linux-sh@m17n.org +Message-Id: <200306052250.h55Moeb08707@r-rr.iij4u.or.jp> + +Hi, + +Dan Kegel <dank@kegel.com> wrote: +> When I try to build glibc-2.3.2 for sh4, it fails with the error +[snip] +> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:32: error: redefinition of `struct user_fpu_struct' +> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:39: error: redefinition of `struct user' +[snip] +> The error reminds me of the kind of thing fixed by +> http://www.kegel.com/crossgcc/crosstool-0.4/glibc-2.3.2-patches/sh-user.patch + +It seems that the definitions in asm/user.h and the above patch collide. +I'm not sure why you need this patch, but is it needed for the problem +about struct ustat that you pointed out in this list, isn't it? +I found why I don't hit ustat problem - my local kernel tree includes +the following patch, though I can't recall about it. + +Regards, + kaz +-- +diff -u linux-2.5.69-sf-orig/include/linux/types.h /usr/local/sh4-unknown-linux-gnu/include/linux/types.h +--- linux-2.5.69-sf-orig/include/linux/types.h Wed Mar 5 12:29:34 2003 ++++ sh4-unknown-linux-gnu/include/linux/types.h Sat Apr 19 10:05:52 2003 +@@ -141,6 +141,7 @@ + + #endif /* __KERNEL_STRICT_NAMES */ + ++#ifdef __KERNEL__ + /* + * Below are truly Linux-specific types that should never collide with + * any application/library that wants linux/types.h. +@@ -152,5 +153,6 @@ + char f_fname[6]; + char f_fpack[6]; + }; ++#endif + + #endif /* _LINUX_TYPES_H */ + + diff --git a/patches/linux/2.4.26/linux-2.4-bsd-expr.patch b/patches/linux/2.4.26/linux-2.4-bsd-expr.patch new file mode 100644 index 00000000..17625e53 --- /dev/null +++ b/patches/linux/2.4.26/linux-2.4-bsd-expr.patch @@ -0,0 +1,25 @@ +# http://in3www.epfl.ch/~schaffne/linux-2.4-bsd-expr.patch +The following makes it possible to compile linux 2.4.19 to 2.4.25 on Mac OS X, +where "expr" doesn't understand the "length" construct +(which it doesn't have to, according to SuSv3 +(see http://www.opengroup.org/onlinepubs/007904975/utilities/expr.html) +See also http://sources.redhat.com/ml/crossgcc/2004-02/msg00131.html + +Fixes error + expr: syntax error + KERNELRELEASE "2.4.21" exceeds 64 characters + make: *** [include/linux/version.h] Error 1 + + +diff -ur linux-2.4.23-old/Makefile linux-2.4.23/Makefile +--- linux-2.4.23-old/Makefile 2003-12-09 14:27:56.000000000 +0100 ++++ linux-2.4.23/Makefile 2003-12-09 14:28:37.000000000 +0100 +@@ -353,7 +353,7 @@ + @rm -f .ver1 + + include/linux/version.h: ./Makefile +- @expr length "$(KERNELRELEASE)" \<= $(uts_len) > /dev/null || \ ++ @expr "$(KERNELRELEASE)" : '.*' \<= $(uts_len) > /dev/null || \ + (echo KERNELRELEASE \"$(KERNELRELEASE)\" exceeds $(uts_len) characters >&2; false) + @echo \#define UTS_RELEASE \"$(KERNELRELEASE)\" > .ver + @echo \#define LINUX_VERSION_CODE `expr $(VERSION) \\* 65536 + $(PATCHLEVEL) \\* 256 + $(SUBLEVEL)` >> .ver diff --git a/patches/linux/2.4.26/linux-2.4.21-allow-gcc-3.3-arm-lib.patch b/patches/linux/2.4.26/linux-2.4.21-allow-gcc-3.3-arm-lib.patch new file mode 100644 index 00000000..8f8ddd67 --- /dev/null +++ b/patches/linux/2.4.26/linux-2.4.21-allow-gcc-3.3-arm-lib.patch @@ -0,0 +1,203 @@ +Reconstructed from http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2003-December/018647.html +See also http://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=1540 + +Message-ID: <DDA001.8070502@de.bosch.com> +Subject: Help cross compiling the kernel for arm. +From: dirk.behme at de.bosch.com + +Aitor Garcia wrote: +> Hello everybody, +> +> I am having problems cross compiling the kernel for arm. +> +> This is the error message I get: +> +> blkpg.c: In function `blk_ioctl': +> blkpg.c:252: error: asm-specifier for variable `__r1' conflicts with asm clobber list +> blkpg.c:252: confused by earlier errors, bailing out make[3]: *** [blkpg.o] Error 1 +> make[3]: Leaving directory `/root/toolchain/kernel-arm/linux-2.4.21/drivers/block' +> make[2]: *** [first_rule] Error 2 +> make[2]: Leaving directory `/root/toolchain/kernel-arm/linux-2.4.21/drivers/block' +> make[1]: *** [_subdir_block] Error 2 +> make[1]: Leaving directory `/root/toolchain/kernel-arm/linux-2.4.21/drivers' +> make: *** [_dir_drivers] Error 2 +> +> These are the toolchain versions I am using: +> host=i686-pc-linux-gnu +> binutils_version=2.14 +> gcc_version=3.3.2 +> glibc_version=2.3.2 +> kernel_version=2.4.21 +> and applied the kernel patch for arm. 2.4.21-rmk1. +> ... +> I have also seen references to this bug in ARM linux +> Developer. Patch Number = 1540. But this patch is +> classified as discarded. + +You need something like 1540 to compile 2.4.21 with gcc 3.3.2. 1540 was +discarded because of AFLAGS change. + +Try the attachment. + +Dirk +-------------- next part -------------- +--- linux/arch/arm/lib/getuser.S.orig Mon Nov 17 07:41:51 2003 ++++ linux/arch/arm/lib/getuser.S Mon Nov 17 07:43:16 2003 +@@ -17,7 +17,7 @@ + * + * Inputs: r0 contains the address + * Outputs: r0 is the error code +- * r1, r2 contains the zero-extended value ++ * r1, ip contains the zero-extended value + * lr corrupted + * + * No other registers must be altered. (see include/asm-arm/uaccess.h +@@ -42,14 +42,14 @@ __get_user_1: + + .global __get_user_2 + __get_user_2: +- bic r2, sp, #0x1f00 +- bic r2, r2, #0x00ff +- ldr r2, [r2, #TSK_ADDR_LIMIT] +- sub r2, r2, #2 +- cmp r0, r2 ++ bic ip, sp, #0x1f00 ++ bic ip, ip, #0x00ff ++ ldr ip, [ip, #TSK_ADDR_LIMIT] ++ sub ip, ip, #2 ++ cmp r0, ip + 2: ldrlsbt r1, [r0], #1 +-3: ldrlsbt r2, [r0] +- orrls r1, r1, r2, lsl #8 ++3: ldrlsbt ip, [r0] ++ orrls r1, r1, ip, lsl #8 + movls r0, #0 + movls pc, lr + b __get_user_bad +@@ -68,20 +68,20 @@ __get_user_4: + + .global __get_user_8 + __get_user_8: +- bic r2, sp, #0x1f00 +- bic r2, r2, #0x00ff +- ldr r2, [r2, #TSK_ADDR_LIMIT] +- sub r2, r2, #8 +- cmp r0, r2 ++ bic ip, sp, #0x1f00 ++ bic ip, ip, #0x00ff ++ ldr ip, [ip, #TSK_ADDR_LIMIT] ++ sub ip, ip, #8 ++ cmp r0, ip + 5: ldrlst r1, [r0], #4 +-6: ldrlst r2, [r0] ++6: ldrlst ip, [r0] + movls r0, #0 + movls pc, lr + + /* fall through */ + + __get_user_bad_8: +- mov r2, #0 ++ mov ip, #0 + __get_user_bad: + mov r1, #0 + mov r0, #-14 +--- linux/arch/arm/lib/putuser.S.orig Mon Nov 17 07:41:57 2003 ++++ linux/arch/arm/lib/putuser.S Mon Nov 17 07:42:26 2003 +@@ -16,7 +16,7 @@ + * __put_user_X + * + * Inputs: r0 contains the address +- * r1, r2 contains the value ++ * r1, ip contains the value + * Outputs: r0 is the error code + * lr corrupted + * +@@ -30,11 +30,11 @@ + + .global __put_user_1 + __put_user_1: +- bic r2, sp, #0x1f00 +- bic r2, r2, #0x00ff +- ldr r2, [r2, #TSK_ADDR_LIMIT] +- sub r2, r2, #1 +- cmp r0, r2 ++ bic ip, sp, #0x1f00 ++ bic ip, ip, #0x00ff ++ ldr ip, [ip, #TSK_ADDR_LIMIT] ++ sub ip, ip, #1 ++ cmp r0, ip + 1: strlsbt r1, [r0] + movls r0, #0 + movls pc, lr +@@ -42,11 +42,11 @@ __put_user_1: + + .global __put_user_2 + __put_user_2: +- bic r2, sp, #0x1f00 +- bic r2, r2, #0x00ff +- ldr r2, [r2, #TSK_ADDR_LIMIT] +- sub r2, r2, #2 +- cmp r0, r2 ++ bic ip, sp, #0x1f00 ++ bic ip, ip, #0x00ff ++ ldr ip, [ip, #TSK_ADDR_LIMIT] ++ sub ip, ip, #2 ++ cmp r0, ip + 2: strlsbt r1, [r0], #1 + movls r1, r1, lsr #8 + 3: strlsbt r1, [r0] +@@ -56,11 +56,11 @@ __put_user_2: + + .global __put_user_4 + __put_user_4: +- bic r2, sp, #0x1f00 +- bic r2, r2, #0x00ff +- ldr r2, [r2, #TSK_ADDR_LIMIT] +- sub r2, r2, #4 +- cmp r0, r2 ++ bic ip, sp, #0x1f00 ++ bic ip, ip, #0x00ff ++ ldr ip, [ip, #TSK_ADDR_LIMIT] ++ sub ip, ip, #4 ++ cmp r0, ip + 4: strlst r1, [r0] + movls r0, #0 + movls pc, lr +@@ -74,7 +74,7 @@ __put_user_8: + sub ip, ip, #8 + cmp r0, ip + 5: strlst r1, [r0], #4 +-6: strlst r2, [r0] ++6: strlst ip, [r0] + movls r0, #0 + movls pc, lr + +--- linux/include/asm-arm/uaccess.h.orig Mon Nov 17 07:41:04 2003 ++++ linux/include/asm-arm/uaccess.h Mon Nov 17 07:41:37 2003 +@@ -86,7 +86,7 @@ extern int __get_user_bad(void); + __get_user_x(__r1, __p, __e, 1, "lr"); \ + break; \ + case 2: \ +- __get_user_x(__r1, __p, __e, 2, "r2", "lr"); \ ++ __get_user_x(__r1, __p, __e, 2, "ip", "lr"); \ + break; \ + case 4: \ + __get_user_x(__r1, __p, __e, 4, "lr"); \ +@@ -122,13 +122,13 @@ extern int __put_user_bad(void); + register int __e asm("r0"); \ + switch (sizeof(*(p))) { \ + case 1: \ +- __put_user_x(__r1, __p, __e, 1, "r2", "lr"); \ ++ __put_user_x(__r1, __p, __e, 1, "ip", "lr"); \ + break; \ + case 2: \ +- __put_user_x(__r1, __p, __e, 2, "r2", "lr"); \ ++ __put_user_x(__r1, __p, __e, 2, "ip", "lr"); \ + break; \ + case 4: \ +- __put_user_x(__r1, __p, __e, 4, "r2", "lr"); \ ++ __put_user_x(__r1, __p, __e, 4, "ip", "lr"); \ + break; \ + case 8: \ + __put_user_x(__r1, __p, __e, 8, "ip", "lr"); \ diff --git a/patches/linux/2.4.26/linux-2.4.26-allow-gcc-3.4-arm-kernel.patch b/patches/linux/2.4.26/linux-2.4.26-allow-gcc-3.4-arm-kernel.patch new file mode 100644 index 00000000..384926da --- /dev/null +++ b/patches/linux/2.4.26/linux-2.4.26-allow-gcc-3.4-arm-kernel.patch @@ -0,0 +1,23 @@ +Fixes +semaphore.c:180:5: missing terminating " character +semaphore.c:213:9: missing terminating " character +make[1]: *** [semaphore.o] Error 1 +make[1]: Leaving directory `/home/dank/queue/jobdir.fast/crosstool-dev/build/arm-unknown-linux-gnu/gcc-3.3.4-glibc-2.2.5/linux-2.4.26/arch/arm/kernel' +make: *** [_dir_arch/arm/kernel] Error 2 + +when building kernel.org 2.4.26 for arm with gcc-3.3.x +(Note: one probably wants to apply ftp://ftp.arm.linux.org.uk/pub/armlinux/source/kernel-patches/v2.4/patch-2.4.26-vrs1.bz2 +instead of my patches when really building 2.4.26 for arm; +my patches only include the bare minimum to get the vanilla kernel to compile.) + +--- linux-2.4.26/arch/arm/kernel/semaphore.c.old Mon Mar 21 06:50:38 2005 ++++ linux-2.4.26/arch/arm/kernel/semaphore.c Mon Mar 21 06:50:55 2005 +@@ -193,7 +193,7 @@ + bl __down_interruptible \n\ + mov ip, r0 \n\ + ldmfd sp!, {r0 - r3, pc}^ \n\ +- ++ \n\ + .align 5 \n\ + .globl __down_trylock_failed \n\ + __down_trylock_failed: \n\ diff --git a/patches/linux/2.4.26/linux-2.4.26-arm-nonofpu.patch b/patches/linux/2.4.26/linux-2.4.26-arm-nonofpu.patch new file mode 100644 index 00000000..1dd0b5e7 --- /dev/null +++ b/patches/linux/2.4.26/linux-2.4.26-arm-nonofpu.patch @@ -0,0 +1,40 @@ +Backport of linux-2.6.8-arm-nonofpu.patch. +Fixes error when building linux-2.4.26 kernel with gcc-3.4 on arm. + +/opt/crosstool/arm-unknown-linux-gnu/gcc-3.4.2-glibc-2.2.5/bin/arm-unknown-linux-gnu-gcc -D__KERNEL__ -I/home/dank/wk/crosstool-0.28-rc37/build/arm-unknown-linux-gnu/gcc-3.4.2-glibc-2.2.5/linux-2.4.26/include -Wall -Wstrict-prototypes -Wno-trigraphs -Os -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=4 -march=armv4 -mtune=strongarm110 -mshort-load-bytes -msoft-float -Uarm -S -o constants.h.tmp.1 getconstants.c +cc1: error: invalid option `short-load-bytes' +make[2]: *** [constants.h] Error 1 +make[2]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/arm-unknown-linux-gnu/gcc-3.4.2-glibc-2.2.5/linux-2.4.26/arch/arm/tools' +make[1]: *** [dep] Error 2 +make[1]: Leaving directory `/home/dank/wk/crosstool-0.28-rc37/build/arm-unknown-linux-gnu/gcc-3.4.2-glibc-2.2.5/linux-2.4.26/arch/arm/tools' +make: *** [archdep] Error 2 + + +--- linux-2.4.26/Makefile.old Thu Sep 30 23:21:14 2004 ++++ linux-2.4.26/Makefile Thu Sep 30 23:24:12 2004 +@@ -21,6 +21,10 @@ + + CROSS_COMPILE = + ++# From linux-2.6 ++check_gcc = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;) ++export check_gcc ++ + # + # Include the make variables (CC, etc...) + # +--- linux-2.4.26/arch/arm/Makefile.old Thu Sep 30 23:16:49 2004 ++++ linux-2.4.26/arch/arm/Makefile Thu Sep 30 23:25:27 2004 +@@ -50,9 +50,9 @@ + tune-$(CONFIG_CPU_SA110) :=-mtune=strongarm110 + tune-$(CONFIG_CPU_SA1100) :=-mtune=strongarm1100 + +-CFLAGS_BOOT :=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float -Uarm +-CFLAGS +=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float -Uarm +-AFLAGS +=$(apcs-y) $(arch-y) -mno-fpu -msoft-float ++CFLAGS_BOOT :=$(apcs-y) $(arch-y) $(tune-y) $(call check_gcc,-malignment-traps,-mshort-load-bytes) -msoft-float -Uarm ++CFLAGS +=$(apcs-y) $(arch-y) $(tune-y) $(call check_gcc,-malignment-traps,-mshort-load-bytes) -msoft-float -Uarm ++AFLAGS +=$(apcs-y) $(arch-y) -msoft-float + + ifeq ($(CONFIG_CPU_26),y) + PROCESSOR := armo diff --git a/patches/linux/2.4.26/linux-2.4.26-mkdep-xargs.patch b/patches/linux/2.4.26/linux-2.4.26-mkdep-xargs.patch new file mode 100644 index 00000000..60c68eff --- /dev/null +++ b/patches/linux/2.4.26/linux-2.4.26-mkdep-xargs.patch @@ -0,0 +1,28 @@ +About ten times, various people have noticed that 'make dep' uses +really, really long commandlines. This breaks sh even on linux sometimes. + +For 2.4, see e.g. +http://marc.theaimsgroup.com/?l=linux-kernel&m=96589814004919&w=2 +http://marc.theaimsgroup.com/?l=linux-kernel&m=96589814004919&q=p3 +http://www.xraylith.wisc.edu/~khan/software/gnu-win32/cygwin-to-linux-cross-howto.txt +http://www.uclinux.org/pub/uClinux/archive/1728.html + +Fixes error when building linux kernel for some default arm configurations: + +scripts/mkdep -- `find /home/dank/wk/crosstool-0.28-rc36/build/arm-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.2/linux-2.4.26/include/asm /home/dank/wk/crosstool-0.28-rc36/build/arm-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.2/linux-2.4.26/include/linux /home/dank/wk/crosstool-0.28-rc36/build/arm-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.2/linux-2.4.26/include/scsi /home/dank/wk/crosstool-0.28-rc36/build/arm-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.2/linux-2.4.26/include/net /home/dank/wk/crosstool-0.28-rc36/build/arm-unknown-linux-gnu/gcc-3.3.4-glibc-2.3.2/linux-2.4.26/include/math-emu \( -name SCCS -o -name .svn \) -prune -o -follow -name \*.h ! -name modversions.h -print` > .hdepend +/bin/sh: line 1: scripts/mkdep: Argument list too long +make: *** [dep-files] Error 126 + +[ For linux-2.4.26 ] + +--- linux-2.4.26/Makefile.old 2004-04-14 06:05:41.000000000 -0700 ++++ linux-2.4.26/Makefile 2004-09-13 21:27:39.000000000 -0700 +@@ -500,7 +500,7 @@ + ifdef CONFIG_MODVERSIONS + $(MAKE) update-modverfile + endif +- scripts/mkdep -- `find $(FINDHPATH) \( -name SCCS -o -name .svn \) -prune -o -follow -name \*.h ! -name modversions.h -print` > .hdepend ++ find $(FINDHPATH) \( -name SCCS -o -name .svn \) -prune -o -follow -name \*.h ! -name modversions.h -print | xargs scripts/mkdep | cat > .hdepend + scripts/mkdep -- init/*.c > .depend + + ifdef CONFIG_MODVERSIONS diff --git a/patches/linux/2.4.26/linux-2.4.26-wdt977-uaccess.patch b/patches/linux/2.4.26/linux-2.4.26-wdt977-uaccess.patch new file mode 100644 index 00000000..3dc0a48b --- /dev/null +++ b/patches/linux/2.4.26/linux-2.4.26-wdt977-uaccess.patch @@ -0,0 +1,17 @@ +Fixes drivers/char/char.o(.text+0x178a4): In function `$a': +: undefined reference to `get_user' + +Part of ftp://ftp.arm.linux.org.uk/pub/armlinux/source/kernel-patches/v2.4/patch-2.4.26-vrs1.bz2 + +diff -urN linux-2.4.26/drivers/char/wdt977.c linux-2.4.26-vrs1/drivers/char/wdt977.c +--- linux-2.4.26/drivers/char/wdt977.c 2002-11-28 23:53:12.000000000 +0000 ++++ linux-2.4.26-vrs1/drivers/char/wdt977.c 2004-01-14 21:32:25.000000000 +0000 +@@ -27,6 +27,7 @@ + #include <asm/io.h> + #include <asm/system.h> + #include <asm/mach-types.h> ++#include <asm/uaccess.h> + + #define WATCHDOG_MINOR 130 + + diff --git a/patches/linux/2.6.11.3/arch_alpha_kernel_srcons.patch b/patches/linux/2.6.11.3/arch_alpha_kernel_srcons.patch new file mode 100644 index 00000000..c163a1ee --- /dev/null +++ b/patches/linux/2.6.11.3/arch_alpha_kernel_srcons.patch @@ -0,0 +1,134 @@ +Date: Sun, 20 Mar 2005 20:26:02 -0800 +From: Richard Henderson <rth@twiddle.net> +To: Andrew Morton <akpm@osdl.org> +Cc: Dan Kegel <dank@kegel.com>, jbglaw@lug-owl.de, + linux-kernel@vger.kernel.org, torvalds@osdl.org +Subject: Re: 2.6.11.3 build problem in arch/alpha/kernel/srcons.c with gcc-4.0 +Message-ID: <20050321042602.GA3795@twiddle.net> +Mail-Followup-To: Andrew Morton <akpm@osdl.org>, Dan Kegel <dank@kegel.com>, + jbglaw@lug-owl.de, linux-kernel@vger.kernel.org, torvalds@osdl.org +References: <423E238F.3030805@kegel.com> <20050320190352.65cc1396.akpm@osdl.org> +Mime-Version: 1.0 +Content-Type: text/plain; charset=us-ascii +Content-Disposition: inline +In-Reply-To: <20050320190352.65cc1396.akpm@osdl.org> +User-Agent: Mutt/1.4.1i + +On Sun, Mar 20, 2005 at 07:03:52PM -0800, Andrew Morton wrote: +> Dan Kegel <dank@kegel.com> wrote: +> > +> > Anyone with an alpha care to suggest a fix for this? +> > +> > arch/alpha/kernel/srmcons.c: In function 'srmcons_open': +> > arch/alpha/kernel/srmcons.c:196: warning: 'srmconsp' may be used uninitialized in this function +> > make[1]: *** [arch/alpha/kernel/srmcons.o] Error 1 +> > make: *** [arch/alpha/kernel] Error 2 +> > +> > I get this when building the 2.6.11.3 kernel with a recent gcc-4.0 snapshot. +> > +> +> It's beyond gcc's ability to figure out that the code is OK. Options would +> be to disable -Werror, or to artificially initialise that variable. + +Fixed thus. + +Note that even with a _raw_read_trylock implementation, smp still +doesn't work. Everything that init spawns dies immediately. I +havn't had a chance to find out why yet... + +[ Note: deleted changes to smp.c, since they didn't apply cleanly + to 2.6.11.3 (the function had moved, I guess), and they seemed unrelated.] + +r~ + + + +You can import this changeset into BK by piping this whole message to: +'| bk receive [path to repository]' or apply the patch as usual. + +=================================================================== + + +ChangeSet@1.2289, 2005-03-20 12:29:41-08:00, rth@kanga.twiddle.home + [ALPHA] Elimitate two warnings from gcc4. + + + smp.c | 43 ------------------------------------------- + srmcons.c | 27 ++++++++++----------------- + 2 files changed, 10 insertions(+), 60 deletions(-) + + +diff -Nru a/arch/alpha/kernel/srmcons.c b/arch/alpha/kernel/srmcons.c +--- a/arch/alpha/kernel/srmcons.c 2005-03-20 20:23:28 -08:00 ++++ b/arch/alpha/kernel/srmcons.c 2005-03-20 20:23:28 -08:00 +@@ -164,29 +164,22 @@ + unsigned long flags; + int retval = 0; + +- spin_lock_irqsave(&srmconsp_lock, flags); +- +- do { +- if (srmconsp != NULL) { +- *ps = srmconsp; +- break; +- } ++ if (srmconsp == NULL) { ++ spin_lock_irqsave(&srmconsp_lock, flags); + + srmconsp = kmalloc(sizeof(*srmconsp), GFP_KERNEL); +- if (srmconsp == NULL) { ++ if (srmconsp == NULL) + retval = -ENOMEM; +- break; ++ else { ++ srmconsp->tty = NULL; ++ spin_lock_init(&srmconsp->lock); ++ init_timer(&srmconsp->timer); + } + +- srmconsp->tty = NULL; +- spin_lock_init(&srmconsp->lock); +- init_timer(&srmconsp->timer); +- +- *ps = srmconsp; +- } while(0); +- +- spin_unlock_irqrestore(&srmconsp_lock, flags); ++ spin_unlock_irqrestore(&srmconsp_lock, flags); ++ } + ++ *ps = srmconsp; + return retval; + } + + +=================================================================== + + +This BitKeeper patch contains the following changesets: +1.2289 +## Wrapped with gzip_uu ## + + +M'XL( $!,/D( [56[V_;-A#]+/X5!Q38FFV628KZY<!!TJ98BP9;D"&?BL)@ +M),H6+%$:2=DQIOWO)>4XSH8D1KK%-F#@>'J\]^[>V6_@6@LU\919H#?PL=%F +MXG$E?+,N\[P2OA3&QJ^:QL;'BZ868YLY?O=YS&_;$?4C9$\ON<D6L!)*3SSB +M!_<1LVG%Q+OZ\.OUQ=D50M,IO%]P.1=_" /3*3*-6O$JUZ?<+*I&^D9QJ6MA +MN)\U=7^?VE.,J7V') YP&/4DPBSN,Y(3PAD1.:8LB=@>3:P:O]%YY3=J_D^4 +M$ <DH4&0!LRBL"A YT!\2I,4<#C&P9AB('1"TPDC(YQ,, 9+]G1I(?B]($X# +M^)G""*-W\/]2>(\R^')V<?GQ["M\J,JZ--P(,.L&UES)4LXU%*JI89YES$>? +M@82,8'2Y5Q6-7OA""'.,3AZA:?O><Y4MQKQJ%WR\%$J*:JQ5G352^YEC%&!" +ML664!%%/+:^PCW-:I 7)XUSDE*;Q$_(= K9]<FK1E(0]HPPS6^'S2C\"6+=; +ML#O=&::T#^*8QGU*;D@>)3BWJA?I3?Z"*G>@#RND49R&PW0_0\O-^RN)C,R\ +MNCVM2MD9U<CRUL_%EYU:7P]+32@A$644]RQ,*!TL0>B_#4'" X8@&$8D?A5+ +M7(FU*JT1[@J?S869M:I<67/,M%%=9D!W;MTLN(&?6@VE!EZM^4:#>] (Z<RR +M':3?8:36P\<._^5S'?L.+YV3*(88?;*4@"*O+.#M'5QK^P^_75]<',%?R/-T +M6\I9U63+6:G^U'PEWOZP2QS"OT!1\;D^.K:0<03$0;HO[W%,EY5LLQ)@-DM4 +M6@P7>;O<T8DQ&]CF'P\'^Q)D:?;WCTY<\&C(<2<S4]9"/3P? D-I"8'$7IHD +MCNT6L9,[6DIH.PI/,_/^=H^FCI7KV737WO;X*2\Y\QW^W?A/JP#==')YJDVG +M+=HA'SU8!H1AS!@-^X"F=LJ<AT+R8@]9"['@52QT+BKA'%2W,]-):YML(?+. +M[HSY,90&\D9H^:,!GIF.5]4&6J&*1M7 Y08Z+8JNLB!%)S-3-M)%:]M:YZKM +I\COL*J?5=SG*3;1=2J%3<?]?PY:?+7573PFE(L5)@+X!A'U=W,@( + + + diff --git a/patches/linux/2.6.11.3/kaz-types.patch b/patches/linux/2.6.11.3/kaz-types.patch new file mode 100644 index 00000000..ec5de36a --- /dev/null +++ b/patches/linux/2.6.11.3/kaz-types.patch @@ -0,0 +1,60 @@ +The following fixes an error that occurs when building glibc-2.3.2 (but not glibc-2.2.5) for sh4: + +In file included from sys/ustat.h:30, + from ../sysdeps/unix/sysv/linux/ustat.c:21: +../sysdeps/generic/bits/ustat.h:26: error: redefinition of `struct ustat' +make[2]: *** [/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/build-glibc/misc/ustat.o] Error 1 +make[2]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2/misc' +make[1]: *** [misc/subdir_lib] Error 2 +make[1]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2' +make: *** [all] Error 2 + +----------- snip --------------- + +Date: Fri, 06 Jun 2003 08:00:00 +0900 +From: kaz Kojima <kkojima@rr.iij4u.or.jp> +Subject: [linux-sh:02770] Re: Compiling glibc-2.3.2 for sh4 fails with "include/asm/user.h:32: + error: redefinition of `struct user_fpu_struct'" +To: linux-sh@m17n.org +Message-Id: <200306052250.h55Moeb08707@r-rr.iij4u.or.jp> + +Hi, + +Dan Kegel <dank@kegel.com> wrote: +> When I try to build glibc-2.3.2 for sh4, it fails with the error +[snip] +> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:32: error: redefinition of `struct user_fpu_struct' +> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:39: error: redefinition of `struct user' +[snip] +> The error reminds me of the kind of thing fixed by +> http://www.kegel.com/crossgcc/crosstool-0.4/glibc-2.3.2-patches/sh-user.patch + +It seems that the definitions in asm/user.h and the above patch collide. +I'm not sure why you need this patch, but is it needed for the problem +about struct ustat that you pointed out in this list, isn't it? +I found why I don't hit ustat problem - my local kernel tree includes +the following patch, though I can't recall about it. + +Regards, + kaz +-- +diff -u linux-2.5.69-sf-orig/include/linux/types.h /usr/local/sh4-unknown-linux-gnu/include/linux/types.h +--- linux-2.5.69-sf-orig/include/linux/types.h Wed Mar 5 12:29:34 2003 ++++ sh4-unknown-linux-gnu/include/linux/types.h Sat Apr 19 10:05:52 2003 +@@ -141,6 +141,7 @@ + + #endif /* __KERNEL_STRICT_NAMES */ + ++#ifdef __KERNEL__ + /* + * Below are truly Linux-specific types that should never collide with + * any application/library that wants linux/types.h. +@@ -152,5 +153,6 @@ + char f_fname[6]; + char f_fpack[6]; + }; ++#endif + + #endif /* _LINUX_TYPES_H */ + + diff --git a/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-i386.patch b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-i386.patch new file mode 100644 index 00000000..1193a8cd --- /dev/null +++ b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-i386.patch @@ -0,0 +1,150 @@ +Fixes + +In file included from include/asm/thread_info.h:16, + from include/linux/thread_info.h:21, + from include/linux/spinlock.h:12, + from include/linux/capability.h:45, + from include/linux/sched.h:7, + from arch/i386/kernel/asm-offsets.c:7: +include/asm/processor.h:87: error: array type has incomplete element type +make[1]: *** [arch/i386/kernel/asm-offsets.asm] Error 1 + +--- linux-2.6.11.3/include/asm-i386/processor.h.old Tue Mar 15 06:45:26 2005 ++++ linux-2.6.11.3/include/asm-i386/processor.h Tue Mar 15 06:46:45 2005 +@@ -81,6 +81,64 @@ + #define X86_VENDOR_UNKNOWN 0xff + + /* ++ * Size of io_bitmap. ++ */ ++#define IO_BITMAP_BITS 65536 ++#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8) ++#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long)) ++#define INVALID_IO_BITMAP_OFFSET 0x8000 ++#define INVALID_IO_BITMAP_OFFSET_LAZY 0x9000 ++ ++struct tss_struct { ++ unsigned short back_link,__blh; ++ unsigned long esp0; ++ unsigned short ss0,__ss0h; ++ unsigned long esp1; ++ unsigned short ss1,__ss1h; /* ss1 is used to cache MSR_IA32_SYSENTER_CS */ ++ unsigned long esp2; ++ unsigned short ss2,__ss2h; ++ unsigned long __cr3; ++ unsigned long eip; ++ unsigned long eflags; ++ unsigned long eax,ecx,edx,ebx; ++ unsigned long esp; ++ unsigned long ebp; ++ unsigned long esi; ++ unsigned long edi; ++ unsigned short es, __esh; ++ unsigned short cs, __csh; ++ unsigned short ss, __ssh; ++ unsigned short ds, __dsh; ++ unsigned short fs, __fsh; ++ unsigned short gs, __gsh; ++ unsigned short ldt, __ldth; ++ unsigned short trace, io_bitmap_base; ++ /* ++ * The extra 1 is there because the CPU will access an ++ * additional byte beyond the end of the IO permission ++ * bitmap. The extra byte must be all 1 bits, and must ++ * be within the limit. ++ */ ++ unsigned long io_bitmap[IO_BITMAP_LONGS + 1]; ++ /* ++ * Cache the current maximum and the last task that used the bitmap: ++ */ ++ unsigned long io_bitmap_max; ++ struct thread_struct *io_bitmap_owner; ++ /* ++ * pads the TSS to be cacheline-aligned (size is 0x100) ++ */ ++ unsigned long __cacheline_filler[35]; ++ /* ++ * .. and then another 0x100 bytes for emergency kernel stack ++ */ ++ unsigned long stack[64]; ++} __attribute__((packed)); ++ ++#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap) ++#define ARCH_MIN_TASKALIGN 16 ++ ++/* + * capabilities of CPUs + */ + +@@ -308,16 +366,6 @@ + + #define HAVE_ARCH_PICK_MMAP_LAYOUT + +-/* +- * Size of io_bitmap. +- */ +-#define IO_BITMAP_BITS 65536 +-#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8) +-#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long)) +-#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap) +-#define INVALID_IO_BITMAP_OFFSET 0x8000 +-#define INVALID_IO_BITMAP_OFFSET_LAZY 0x9000 +- + struct i387_fsave_struct { + long cwd; + long swd; +@@ -371,54 +419,6 @@ + } mm_segment_t; + + struct thread_struct; +- +-struct tss_struct { +- unsigned short back_link,__blh; +- unsigned long esp0; +- unsigned short ss0,__ss0h; +- unsigned long esp1; +- unsigned short ss1,__ss1h; /* ss1 is used to cache MSR_IA32_SYSENTER_CS */ +- unsigned long esp2; +- unsigned short ss2,__ss2h; +- unsigned long __cr3; +- unsigned long eip; +- unsigned long eflags; +- unsigned long eax,ecx,edx,ebx; +- unsigned long esp; +- unsigned long ebp; +- unsigned long esi; +- unsigned long edi; +- unsigned short es, __esh; +- unsigned short cs, __csh; +- unsigned short ss, __ssh; +- unsigned short ds, __dsh; +- unsigned short fs, __fsh; +- unsigned short gs, __gsh; +- unsigned short ldt, __ldth; +- unsigned short trace, io_bitmap_base; +- /* +- * The extra 1 is there because the CPU will access an +- * additional byte beyond the end of the IO permission +- * bitmap. The extra byte must be all 1 bits, and must +- * be within the limit. +- */ +- unsigned long io_bitmap[IO_BITMAP_LONGS + 1]; +- /* +- * Cache the current maximum and the last task that used the bitmap: +- */ +- unsigned long io_bitmap_max; +- struct thread_struct *io_bitmap_owner; +- /* +- * pads the TSS to be cacheline-aligned (size is 0x100) +- */ +- unsigned long __cacheline_filler[35]; +- /* +- * .. and then another 0x100 bytes for emergency kernel stack +- */ +- unsigned long stack[64]; +-} __attribute__((packed)); +- +-#define ARCH_MIN_TASKALIGN 16 + + struct thread_struct { + /* cached TLS descriptors. */ diff --git a/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-m68k.patch b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-m68k.patch new file mode 100644 index 00000000..b349ee02 --- /dev/null +++ b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-m68k.patch @@ -0,0 +1,32 @@ +Fixes + +In file included from include/asm/setup.h:8, + from include/asm/machdep.h:8, + from include/asm/irq.h:6, + from include/asm/hardirq.h:8, + from include/linux/hardirq.h:6, + from include/asm-generic/local.h:6, + from include/asm/local.h:4, + from include/linux/module.h:21, + from init/main.c:16: +include/asm-m68k/setup.h:365: error: array type has incomplete element type + +when compiling with gcc-4.0. (Affects ppc, too, for some reason.) + +--- linux-2.6.11.3/include/asm-m68k/setup.h.old Fri Mar 18 13:48:03 2005 ++++ linux-2.6.11.3/include/asm-m68k/setup.h Fri Mar 18 13:48:14 2005 +@@ -362,12 +362,13 @@ + #ifndef __ASSEMBLY__ + extern int m68k_num_memory; /* # of memory blocks found (and used) */ + extern int m68k_realnum_memory; /* real # of memory blocks found */ +-extern struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */ + + struct mem_info { + unsigned long addr; /* physical address of memory chunk */ + unsigned long size; /* length of memory chunk (in bytes) */ + }; ++ ++extern struct mem_info m68k_memory[NUM_MEMINFO];/* memory description */ + #endif + + #endif /* __KERNEL__ */ diff --git a/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-ppc64.patch b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-ppc64.patch new file mode 100644 index 00000000..58e376d0 --- /dev/null +++ b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-ppc64.patch @@ -0,0 +1,30 @@ +Fixes + +In file included from include/asm/current.h:4, + from include/linux/wait.h:27, + from include/asm/semaphore.h:15, + from include/linux/sched.h:19, + from arch/ppc64/kernel/asm-offsets.c:18: +include/asm/paca.h:25: error: array type has incomplete element type +make[1]: *** [arch/ppc64/kernel/asm-offsets.s] Error 1 + +when building with gcc-4.0 + +--- linux-2.6.11.3/include/asm-ppc64/paca.h.old Fri Mar 18 13:23:40 2005 ++++ linux-2.6.11.3/include/asm-ppc64/paca.h Fri Mar 18 13:24:04 2005 +@@ -22,7 +22,6 @@ + #include <asm/iSeries/ItLpRegSave.h> + #include <asm/mmu.h> + +-extern struct paca_struct paca[]; + register struct paca_struct *local_paca asm("r13"); + #define get_paca() local_paca + +@@ -114,5 +113,7 @@ + struct ItLpRegSave reg_save; + #endif + }; ++ ++extern struct paca_struct paca[]; + + #endif /* _PPC64_PACA_H */ diff --git a/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-x86_64.patch b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-x86_64.patch new file mode 100644 index 00000000..a87e12ef --- /dev/null +++ b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-asm-x86_64.patch @@ -0,0 +1,28 @@ +Fixes: + +In file included from include/linux/spinlock.h:16, + from include/linux/capability.h:45, + from include/linux/sched.h:7, + from arch/x86_64/kernel/asm-offsets.c:7: +include/asm/processor.h:79: error: array type has incomplete element type +make[1]: *** [arch/x86_64/kernel/asm-offsets.asm] Error 1 + +--- linux-2.6.11.3/include/asm-x86_64/processor.h.old Tue Mar 15 07:05:07 2005 ++++ linux-2.6.11.3/include/asm-x86_64/processor.h Tue Mar 15 07:09:53 2005 +@@ -179,7 +179,6 @@ + #define IO_BITMAP_BITS 65536 + #define IO_BITMAP_BYTES (IO_BITMAP_BITS/8) + #define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long)) +-#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap) + #define INVALID_IO_BITMAP_OFFSET 0x8000 + + struct i387_fxsave_struct { +@@ -222,6 +221,8 @@ + */ + unsigned long io_bitmap[IO_BITMAP_LONGS + 1]; + } __attribute__((packed)) ____cacheline_aligned; ++ ++#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap) + + extern struct cpuinfo_x86 boot_cpu_data; + DECLARE_PER_CPU(struct tss_struct,init_tss); diff --git a/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-i2c.patch b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-i2c.patch new file mode 100644 index 00000000..c1df43da --- /dev/null +++ b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-i2c.patch @@ -0,0 +1,58 @@ +Fixes + +In file included from fs/compat_ioctl.c:69, + from arch/ppc64/kernel/ioctl32.c:24: +include/linux/i2c.h:58: error: array type has incomplete element type +include/linux/i2c.h:197: error: array type has incomplete element type + +when compiling with gcc-4.0. + +--- linux-2.6.11.3/include/linux/i2c.h.old 2005-03-19 10:59:09.000000000 -0800 ++++ linux-2.6.11.3/include/linux/i2c.h 2005-03-19 11:01:37.000000000 -0800 +@@ -36,7 +36,22 @@ + + /* --- General options ------------------------------------------------ */ + +-struct i2c_msg; ++/* ++ * I2C Message - used for pure i2c transaction, also from /dev interface ++ */ ++struct i2c_msg { ++ __u16 addr; /* slave address */ ++ __u16 flags; ++#define I2C_M_TEN 0x10 /* we have a ten bit chip address */ ++#define I2C_M_RD 0x01 ++#define I2C_M_NOSTART 0x4000 ++#define I2C_M_REV_DIR_ADDR 0x2000 ++#define I2C_M_IGNORE_NAK 0x1000 ++#define I2C_M_NO_RD_ACK 0x0800 ++ __u16 len; /* msg length */ ++ __u8 *buf; /* pointer to msg data */ ++}; ++ + struct i2c_algorithm; + struct i2c_adapter; + struct i2c_client; +@@ -379,22 +394,6 @@ + /* Return 1 if adapter supports everything we need, 0 if not. */ + extern int i2c_check_functionality (struct i2c_adapter *adap, u32 func); + +-/* +- * I2C Message - used for pure i2c transaction, also from /dev interface +- */ +-struct i2c_msg { +- __u16 addr; /* slave address */ +- __u16 flags; +-#define I2C_M_TEN 0x10 /* we have a ten bit chip address */ +-#define I2C_M_RD 0x01 +-#define I2C_M_NOSTART 0x4000 +-#define I2C_M_REV_DIR_ADDR 0x2000 +-#define I2C_M_IGNORE_NAK 0x1000 +-#define I2C_M_NO_RD_ACK 0x0800 +- __u16 len; /* msg length */ +- __u8 *buf; /* pointer to msg data */ +-}; +- + /* To determine what functionality is present */ + + #define I2C_FUNC_I2C 0x00000001 diff --git a/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-ppc-mikpe.patch b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-ppc-mikpe.patch new file mode 100644 index 00000000..60f02e3c --- /dev/null +++ b/patches/linux/2.6.11.3/linux-2.6.11-allow-gcc-4.0-ppc-mikpe.patch @@ -0,0 +1,86 @@ + +Fixes + +In file included from arch/ppc/kernel/time.c:68: +arch/ppc/kernel/time.c:92: error: static declaration of 'time_offset' follows non-static declaration +include/linux/timex.h:236: error: previous declaration of 'time_offset' was here +make[1]: *** [arch/ppc/kernel/time.o] Error 1 + +when compiling with gcc-4.0 + +Taken from +http://user.it.uu.se/~mikpe/linux/patches/2.6/patch-gcc4-fixes-v2-2.6.11 +Also removes some obsolete externs that caused problems for Mike +Mike's patch has a bit more stuff in it, but this was enough for me + + +diff -rupN linux-2.6.11/arch/ppc/kernel/time.c linux-2.6.11.gcc4-fixes-v2/arch/ppc/kernel/time.c +--- linux-2.6.11/arch/ppc/kernel/time.c 2005-03-02 19:24:14.000000000 +0100 ++++ linux-2.6.11.gcc4-fixes-v2/arch/ppc/kernel/time.c 2005-03-02 19:36:26.000000000 +0100 +@@ -89,7 +89,7 @@ unsigned long tb_to_ns_scale; + + extern unsigned long wall_jiffies; + +-static long time_offset; ++static long ppc_time_offset; + + DEFINE_SPINLOCK(rtc_lock); + +@@ -172,7 +172,7 @@ void timer_interrupt(struct pt_regs * re + xtime.tv_sec - last_rtc_update >= 659 && + abs((xtime.tv_nsec / 1000) - (1000000-1000000/HZ)) < 500000/HZ && + jiffies - wall_jiffies == 1) { +- if (ppc_md.set_rtc_time(xtime.tv_sec+1 + time_offset) == 0) ++ if (ppc_md.set_rtc_time(xtime.tv_sec+1 + ppc_time_offset) == 0) + last_rtc_update = xtime.tv_sec+1; + else + /* Try again one minute later */ +@@ -289,7 +289,7 @@ void __init time_init(void) + unsigned old_stamp, stamp, elapsed; + + if (ppc_md.time_init != NULL) +- time_offset = ppc_md.time_init(); ++ ppc_time_offset = ppc_md.time_init(); + + if (__USE_RTC()) { + /* 601 processor: dec counts down by 128 every 128ns */ +@@ -334,10 +334,10 @@ void __init time_init(void) + set_dec(tb_ticks_per_jiffy); + + /* If platform provided a timezone (pmac), we correct the time */ +- if (time_offset) { +- sys_tz.tz_minuteswest = -time_offset / 60; ++ if (ppc_time_offset) { ++ sys_tz.tz_minuteswest = -ppc_time_offset / 60; + sys_tz.tz_dsttime = 0; +- xtime.tv_sec -= time_offset; ++ xtime.tv_sec -= ppc_time_offset; + } + set_normalized_timespec(&wall_to_monotonic, + -xtime.tv_sec, -xtime.tv_nsec); +diff -rupN linux-2.6.11/arch/ppc/syslib/open_pic_defs.h linux-2.6.11.gcc4-fixes-v2/arch/ppc/syslib/open_pic_defs.h +--- linux-2.6.11/arch/ppc/syslib/open_pic_defs.h 2005-03-02 19:24:14.000000000 +0100 ++++ linux-2.6.11.gcc4-fixes-v2/arch/ppc/syslib/open_pic_defs.h 2005-03-02 19:36:26.000000000 +0100 +@@ -172,9 +172,6 @@ struct OpenPIC { + OpenPIC_Processor Processor[OPENPIC_MAX_PROCESSORS]; + }; + +-extern volatile struct OpenPIC __iomem *OpenPIC; +- +- + /* + * Current Task Priority Register + */ +diff -rupN linux-2.6.11/include/asm-ppc/prom.h linux-2.6.11.gcc4-fixes-v2/include/asm-ppc/prom.h +--- linux-2.6.11/include/asm-ppc/prom.h 2003-09-28 12:19:57.000000000 +0200 ++++ linux-2.6.11.gcc4-fixes-v2/include/asm-ppc/prom.h 2005-03-02 19:36:26.000000000 +0100 +@@ -13,9 +13,6 @@ + typedef void *phandle; + typedef void *ihandle; + +-extern char *prom_display_paths[]; +-extern unsigned int prom_num_displays; +- + struct address_range { + unsigned int space; + unsigned int address; diff --git a/patches/linux/2.6.5/linux-2.6.5-x86_64-unistd.patch b/patches/linux/2.6.5/linux-2.6.5-x86_64-unistd.patch new file mode 100644 index 00000000..829f0d95 --- /dev/null +++ b/patches/linux/2.6.5/linux-2.6.5-x86_64-unistd.patch @@ -0,0 +1,80 @@ +Retrieved with wget http://www.x86-64.org/lists/discuss/msg04963.html +then tabs fixed up by rediffing + +Message-Id: EFF62C7EE88E71429E38641A1172F4C2077104@net.teracruz.com +To: discuss@xxxxxxxxxx +Subject: Compile error with glibc 2.3.2 + Linux 2.6.5 ARCH=x86_64 +From: "David Lee" david.lee@xxxxxxxxxxxx +Date: Wed, 21 Apr 2004 15:26:04 -0500</li> + +I am getting compiler errors when trying to compile glibc 2.3.2 using +the kernel headers from linux 2.6.5. The headers from linux 2.6.3 work +fine. + +I've traced the cause of the problem to a change made in +./include/asm-x86_64/unistd.h in the 2.6.4 release. + ++#ifndef __ASSEMBLY__ ++ ++#include <linux/linkage.h> ++#include <linux/compiler.h> ++#include <linux/types.h> ++#include <asm/ptrace.h> ++ ++asmlinkage long sys_ptrace(long request, long pid, ++ unsigned long addr, long data); ++asmlinkage long sys_iopl(unsigned int level, struct pt_regs regs); ++asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int +turn_on); ++struct sigaction; ++asmlinkage long sys_rt_sigaction(int sig, ++ const struct sigaction __user *act, ++ struct sigaction __user *oact, ++ size_t sigsetsize); ++ ++#endif /* __ASSEMBLY__ */ + +Within glibc, ./sysdeps/unix/sysv/linux/x86_64/syscall.S ends up +including this file, which chokes the assembler with the struct +declarations in the above #include's. + +/home/dlee/vcs/Products/Breeze/Dev/Prj/LinuxRH8/tscale2/tools/x86_64/x86 +_64-linux/glibcinclude/linux/posix_types.h: Assembler messages: +/home/dlee/vcs/Products/Breeze/Dev/Prj/LinuxRH8/tscale2/tools/x86_64/x86 +_64-linux/glibcinclude/linux/posix_types.h:36: Error: no such +instruction: `typedef struct{' + +There are also errors about conflicting re-declarations further along in +the glibc build. + +../posix/sys/types.h:62: error: conflicting types for `dev_t' +/home/dlee/vcs/Products/Breeze/Dev/Prj/LinuxRH8/tscale2/tools/x86_64/x86 +_64-linux/glibcinclude/linux/types.h:23: error: previous declaration of +`dev_t' + +Changing the '#ifndef __ASSEMBLY__' to '#if ((!defined __ASSEMBLY__) && +(defined __KERNEL__))' clears up the problem. My patch is below. + +dave + + +--- linux-2.6.5/include/asm-x86_64/unistd.h.old 2004-04-03 19:37:36.000000000 -0800 ++++ linux-2.6.5/include/asm-x86_64/unistd.h 2004-05-05 11:07:11.000000000 -0700 +@@ -713,7 +713,7 @@ + + #endif /* __KERNEL_SYSCALLS__ */ + +-#ifndef __ASSEMBLY__ ++#if ((!defined __ASSEMBLY__) && (defined __KERNEL__)) + + #include <linux/linkage.h> + #include <linux/compiler.h> +@@ -730,7 +730,7 @@ + struct sigaction __user *oact, + size_t sigsetsize); + +-#endif /* __ASSEMBLY__ */ ++#endif /* ((!defined __ASSEMBLY__) && (defined __KERNEL__) */ + + #endif /* __NO_STUBS */ + diff --git a/patches/linux/2.6.6/kaz-types.patch b/patches/linux/2.6.6/kaz-types.patch new file mode 100644 index 00000000..ec5de36a --- /dev/null +++ b/patches/linux/2.6.6/kaz-types.patch @@ -0,0 +1,60 @@ +The following fixes an error that occurs when building glibc-2.3.2 (but not glibc-2.2.5) for sh4: + +In file included from sys/ustat.h:30, + from ../sysdeps/unix/sysv/linux/ustat.c:21: +../sysdeps/generic/bits/ustat.h:26: error: redefinition of `struct ustat' +make[2]: *** [/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/build-glibc/misc/ustat.o] Error 1 +make[2]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2/misc' +make[1]: *** [misc/subdir_lib] Error 2 +make[1]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2' +make: *** [all] Error 2 + +----------- snip --------------- + +Date: Fri, 06 Jun 2003 08:00:00 +0900 +From: kaz Kojima <kkojima@rr.iij4u.or.jp> +Subject: [linux-sh:02770] Re: Compiling glibc-2.3.2 for sh4 fails with "include/asm/user.h:32: + error: redefinition of `struct user_fpu_struct'" +To: linux-sh@m17n.org +Message-Id: <200306052250.h55Moeb08707@r-rr.iij4u.or.jp> + +Hi, + +Dan Kegel <dank@kegel.com> wrote: +> When I try to build glibc-2.3.2 for sh4, it fails with the error +[snip] +> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:32: error: redefinition of `struct user_fpu_struct' +> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:39: error: redefinition of `struct user' +[snip] +> The error reminds me of the kind of thing fixed by +> http://www.kegel.com/crossgcc/crosstool-0.4/glibc-2.3.2-patches/sh-user.patch + +It seems that the definitions in asm/user.h and the above patch collide. +I'm not sure why you need this patch, but is it needed for the problem +about struct ustat that you pointed out in this list, isn't it? +I found why I don't hit ustat problem - my local kernel tree includes +the following patch, though I can't recall about it. + +Regards, + kaz +-- +diff -u linux-2.5.69-sf-orig/include/linux/types.h /usr/local/sh4-unknown-linux-gnu/include/linux/types.h +--- linux-2.5.69-sf-orig/include/linux/types.h Wed Mar 5 12:29:34 2003 ++++ sh4-unknown-linux-gnu/include/linux/types.h Sat Apr 19 10:05:52 2003 +@@ -141,6 +141,7 @@ + + #endif /* __KERNEL_STRICT_NAMES */ + ++#ifdef __KERNEL__ + /* + * Below are truly Linux-specific types that should never collide with + * any application/library that wants linux/types.h. +@@ -152,5 +153,6 @@ + char f_fname[6]; + char f_fpack[6]; + }; ++#endif + + #endif /* _LINUX_TYPES_H */ + + diff --git a/patches/linux/2.6.6/linux-2.6.5-x86_64-unistd.patch b/patches/linux/2.6.6/linux-2.6.5-x86_64-unistd.patch new file mode 100644 index 00000000..829f0d95 --- /dev/null +++ b/patches/linux/2.6.6/linux-2.6.5-x86_64-unistd.patch @@ -0,0 +1,80 @@ +Retrieved with wget http://www.x86-64.org/lists/discuss/msg04963.html +then tabs fixed up by rediffing + +Message-Id: EFF62C7EE88E71429E38641A1172F4C2077104@net.teracruz.com +To: discuss@xxxxxxxxxx +Subject: Compile error with glibc 2.3.2 + Linux 2.6.5 ARCH=x86_64 +From: "David Lee" david.lee@xxxxxxxxxxxx +Date: Wed, 21 Apr 2004 15:26:04 -0500</li> + +I am getting compiler errors when trying to compile glibc 2.3.2 using +the kernel headers from linux 2.6.5. The headers from linux 2.6.3 work +fine. + +I've traced the cause of the problem to a change made in +./include/asm-x86_64/unistd.h in the 2.6.4 release. + ++#ifndef __ASSEMBLY__ ++ ++#include <linux/linkage.h> ++#include <linux/compiler.h> ++#include <linux/types.h> ++#include <asm/ptrace.h> ++ ++asmlinkage long sys_ptrace(long request, long pid, ++ unsigned long addr, long data); ++asmlinkage long sys_iopl(unsigned int level, struct pt_regs regs); ++asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int +turn_on); ++struct sigaction; ++asmlinkage long sys_rt_sigaction(int sig, ++ const struct sigaction __user *act, ++ struct sigaction __user *oact, ++ size_t sigsetsize); ++ ++#endif /* __ASSEMBLY__ */ + +Within glibc, ./sysdeps/unix/sysv/linux/x86_64/syscall.S ends up +including this file, which chokes the assembler with the struct +declarations in the above #include's. + +/home/dlee/vcs/Products/Breeze/Dev/Prj/LinuxRH8/tscale2/tools/x86_64/x86 +_64-linux/glibcinclude/linux/posix_types.h: Assembler messages: +/home/dlee/vcs/Products/Breeze/Dev/Prj/LinuxRH8/tscale2/tools/x86_64/x86 +_64-linux/glibcinclude/linux/posix_types.h:36: Error: no such +instruction: `typedef struct{' + +There are also errors about conflicting re-declarations further along in +the glibc build. + +../posix/sys/types.h:62: error: conflicting types for `dev_t' +/home/dlee/vcs/Products/Breeze/Dev/Prj/LinuxRH8/tscale2/tools/x86_64/x86 +_64-linux/glibcinclude/linux/types.h:23: error: previous declaration of +`dev_t' + +Changing the '#ifndef __ASSEMBLY__' to '#if ((!defined __ASSEMBLY__) && +(defined __KERNEL__))' clears up the problem. My patch is below. + +dave + + +--- linux-2.6.5/include/asm-x86_64/unistd.h.old 2004-04-03 19:37:36.000000000 -0800 ++++ linux-2.6.5/include/asm-x86_64/unistd.h 2004-05-05 11:07:11.000000000 -0700 +@@ -713,7 +713,7 @@ + + #endif /* __KERNEL_SYSCALLS__ */ + +-#ifndef __ASSEMBLY__ ++#if ((!defined __ASSEMBLY__) && (defined __KERNEL__)) + + #include <linux/linkage.h> + #include <linux/compiler.h> +@@ -730,7 +730,7 @@ + struct sigaction __user *oact, + size_t sigsetsize); + +-#endif /* __ASSEMBLY__ */ ++#endif /* ((!defined __ASSEMBLY__) && (defined __KERNEL__) */ + + #endif /* __NO_STUBS */ + diff --git a/patches/linux/2.6.6/linux-2.6.8-noshared-kconfig.patch b/patches/linux/2.6.6/linux-2.6.8-noshared-kconfig.patch new file mode 100644 index 00000000..326cdcda --- /dev/null +++ b/patches/linux/2.6.6/linux-2.6.8-noshared-kconfig.patch @@ -0,0 +1,28 @@ +Lets you run 'make oldconfig' and 'make menuconfig' on systems +where shared libraries aren't easy. (There's no harm in using the +static version of libkconfig.) +Idea mentioned by Bertrand Marquis, but this patch is a bit simpler than his. + + +--- linux-2.6.8.1/scripts/kconfig/Makefile.old 2004-09-09 20:30:25.000000000 -0700 ++++ linux-2.6.8.1/scripts/kconfig/Makefile 2004-09-09 20:47:51.000000000 -0700 +@@ -68,8 +68,8 @@ + libkconfig-objs := zconf.tab.o + + host-progs := conf mconf qconf gconf +-conf-objs := conf.o libkconfig.so +-mconf-objs := mconf.o libkconfig.so ++conf-objs := conf.o $(libkconfig-objs) ++mconf-objs := mconf.o $(libkconfig-objs) + + ifeq ($(MAKECMDGOALS),xconfig) + qconf-target := 1 +@@ -88,7 +88,7 @@ + gconf-objs := gconf.o kconfig_load.o + endif + +-clean-files := libkconfig.so lkc_defs.h qconf.moc .tmp_qtcheck \ ++clean-files := $(libkconfig-objs) lkc_defs.h qconf.moc .tmp_qtcheck \ + .tmp_gtkcheck zconf.tab.c zconf.tab.h lex.zconf.c + + # generated files seem to need this to find local include files diff --git a/patches/linux/2.6.7/kaz-types.patch b/patches/linux/2.6.7/kaz-types.patch new file mode 100644 index 00000000..ec5de36a --- /dev/null +++ b/patches/linux/2.6.7/kaz-types.patch @@ -0,0 +1,60 @@ +The following fixes an error that occurs when building glibc-2.3.2 (but not glibc-2.2.5) for sh4: + +In file included from sys/ustat.h:30, + from ../sysdeps/unix/sysv/linux/ustat.c:21: +../sysdeps/generic/bits/ustat.h:26: error: redefinition of `struct ustat' +make[2]: *** [/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/build-glibc/misc/ustat.o] Error 1 +make[2]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2/misc' +make[1]: *** [misc/subdir_lib] Error 2 +make[1]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2' +make: *** [all] Error 2 + +----------- snip --------------- + +Date: Fri, 06 Jun 2003 08:00:00 +0900 +From: kaz Kojima <kkojima@rr.iij4u.or.jp> +Subject: [linux-sh:02770] Re: Compiling glibc-2.3.2 for sh4 fails with "include/asm/user.h:32: + error: redefinition of `struct user_fpu_struct'" +To: linux-sh@m17n.org +Message-Id: <200306052250.h55Moeb08707@r-rr.iij4u.or.jp> + +Hi, + +Dan Kegel <dank@kegel.com> wrote: +> When I try to build glibc-2.3.2 for sh4, it fails with the error +[snip] +> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:32: error: redefinition of `struct user_fpu_struct' +> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:39: error: redefinition of `struct user' +[snip] +> The error reminds me of the kind of thing fixed by +> http://www.kegel.com/crossgcc/crosstool-0.4/glibc-2.3.2-patches/sh-user.patch + +It seems that the definitions in asm/user.h and the above patch collide. +I'm not sure why you need this patch, but is it needed for the problem +about struct ustat that you pointed out in this list, isn't it? +I found why I don't hit ustat problem - my local kernel tree includes +the following patch, though I can't recall about it. + +Regards, + kaz +-- +diff -u linux-2.5.69-sf-orig/include/linux/types.h /usr/local/sh4-unknown-linux-gnu/include/linux/types.h +--- linux-2.5.69-sf-orig/include/linux/types.h Wed Mar 5 12:29:34 2003 ++++ sh4-unknown-linux-gnu/include/linux/types.h Sat Apr 19 10:05:52 2003 +@@ -141,6 +141,7 @@ + + #endif /* __KERNEL_STRICT_NAMES */ + ++#ifdef __KERNEL__ + /* + * Below are truly Linux-specific types that should never collide with + * any application/library that wants linux/types.h. +@@ -152,5 +153,6 @@ + char f_fname[6]; + char f_fpack[6]; + }; ++#endif + + #endif /* _LINUX_TYPES_H */ + + diff --git a/patches/linux/2.6.7/linux-2.6.7-build_on_case_insensitive_fs-1.patch b/patches/linux/2.6.7/linux-2.6.7-build_on_case_insensitive_fs-1.patch new file mode 100644 index 00000000..c9e0dd3c --- /dev/null +++ b/patches/linux/2.6.7/linux-2.6.7-build_on_case_insensitive_fs-1.patch @@ -0,0 +1,679 @@ +Submitted By: Martin Schaffner <schaffner@gmx.li> +Date: 2004-06-19 +Initial Package Version: 2.6.7 +Upstream Status: Not submitted +Origin: Martin Schaffner +Description: Enables build on case-insensitive file systems +URL: http://mirror.vtx.ch/lfs/patches/downloads/linux/linux-2.6.7-build_on_case_insensitive_fs-1.patch + +diff -ur linux-2.6.7/Makefile linux-2.6.7-mod/Makefile +--- linux-2.6.7/Makefile Fri Jun 18 22:51:03 2004 ++++ linux-2.6.7-mod/Makefile Sat Jun 19 12:43:10 2004 +@@ -549,7 +549,7 @@ + $(NM) $@ | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > System.map + endef + +-LDFLAGS_vmlinux += -T arch/$(ARCH)/kernel/vmlinux.lds.s ++LDFLAGS_vmlinux += -T arch/$(ARCH)/kernel/vmlinux.lds.asm + + # Generate section listing all symbols and add it into vmlinux + # It's a three stage process: +@@ -575,23 +575,23 @@ + .tmp_kallsyms%.S: .tmp_vmlinux% + $(call cmd,kallsyms) + +-.tmp_vmlinux1: $(vmlinux-objs) arch/$(ARCH)/kernel/vmlinux.lds.s FORCE ++.tmp_vmlinux1: $(vmlinux-objs) arch/$(ARCH)/kernel/vmlinux.lds.asm FORCE + +$(call if_changed_rule,vmlinux__) + +-.tmp_vmlinux2: $(vmlinux-objs) .tmp_kallsyms1.o arch/$(ARCH)/kernel/vmlinux.lds.s FORCE ++.tmp_vmlinux2: $(vmlinux-objs) .tmp_kallsyms1.o arch/$(ARCH)/kernel/vmlinux.lds.asm FORCE + $(call if_changed_rule,vmlinux__) + + endif + + # Finally the vmlinux rule + +-vmlinux: $(vmlinux-objs) $(kallsyms.o) arch/$(ARCH)/kernel/vmlinux.lds.s FORCE ++vmlinux: $(vmlinux-objs) $(kallsyms.o) arch/$(ARCH)/kernel/vmlinux.lds.asm FORCE + $(call if_changed_rule,vmlinux) + + # The actual objects are generated when descending, + # make sure no implicit rule kicks in + +-$(sort $(vmlinux-objs)) arch/$(ARCH)/kernel/vmlinux.lds.s: $(vmlinux-dirs) ; ++$(sort $(vmlinux-objs)) arch/$(ARCH)/kernel/vmlinux.lds.asm: $(vmlinux-dirs) ; + + # Handle descending into subdirectories listed in $(vmlinux-dirs) + +@@ -640,7 +640,7 @@ + # Single targets + # --------------------------------------------------------------------------- + +-%.s: %.c scripts FORCE ++%.asm: %.c scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ + %.i: %.c scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ +@@ -650,7 +650,7 @@ + $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(@D) + %.lst: %.c scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ +-%.s: %.S scripts FORCE ++%.asm: %.S scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ + %.o: %.S scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ +diff -ur linux-2.6.7/arch/alpha/Makefile linux-2.6.7-mod/arch/alpha/Makefile +--- linux-2.6.7/arch/alpha/Makefile Fri Jun 18 22:51:03 2004 ++++ linux-2.6.7-mod/arch/alpha/Makefile Sat Jun 19 12:46:32 2004 +@@ -114,10 +114,10 @@ + + prepare: include/asm-$(ARCH)/asm_offsets.h + +-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \ ++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \ + include/config/MARKER + +-include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s ++include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm + $(call filechk,gen-asm-offsets) + + archclean: +diff -ur linux-2.6.7/arch/alpha/kernel/Makefile linux-2.6.7-mod/arch/alpha/kernel/Makefile +--- linux-2.6.7/arch/alpha/kernel/Makefile Mon May 10 04:32:29 2004 ++++ linux-2.6.7-mod/arch/alpha/kernel/Makefile Sat Jun 19 12:46:48 2004 +@@ -2,7 +2,7 @@ + # Makefile for the linux kernel. + # + +-extra-y := head.o vmlinux.lds.s ++extra-y := head.o vmlinux.lds.asm + EXTRA_AFLAGS := $(CFLAGS) + EXTRA_CFLAGS := -Werror -Wno-sign-compare + +diff -ur linux-2.6.7/arch/arm/Makefile linux-2.6.7-mod/arch/arm/Makefile +--- linux-2.6.7/arch/arm/Makefile Fri Jun 18 22:51:04 2004 ++++ linux-2.6.7-mod/arch/arm/Makefile Sat Jun 19 12:47:07 2004 +@@ -175,10 +175,10 @@ + i:; $(Q)$(MAKE) $(build)=$(boot) install + zi:; $(Q)$(MAKE) $(build)=$(boot) zinstall + +-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \ ++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \ + include/asm-arm/.arch + +-include/asm-$(ARCH)/constants.h: arch/$(ARCH)/kernel/asm-offsets.s ++include/asm-$(ARCH)/constants.h: arch/$(ARCH)/kernel/asm-offsets.asm + $(call filechk,gen-asm-offsets) + + define archhelp +diff -ur linux-2.6.7/arch/arm/kernel/Makefile linux-2.6.7-mod/arch/arm/kernel/Makefile +--- linux-2.6.7/arch/arm/kernel/Makefile Mon May 10 04:33:19 2004 ++++ linux-2.6.7-mod/arch/arm/kernel/Makefile Sat Jun 19 12:47:25 2004 +@@ -27,7 +27,7 @@ + head-y := head.o + obj-$(CONFIG_DEBUG_LL) += debug.o + +-extra-y := $(head-y) init_task.o vmlinux.lds.s ++extra-y := $(head-y) init_task.o vmlinux.lds.asm + + # Spell out some dependencies that aren't automatically figured out + $(obj)/entry-armv.o: $(obj)/entry-header.S include/asm-arm/constants.h +diff -ur linux-2.6.7/arch/arm26/Makefile linux-2.6.7-mod/arch/arm26/Makefile +--- linux-2.6.7/arch/arm26/Makefile Mon May 10 04:32:28 2004 ++++ linux-2.6.7-mod/arch/arm26/Makefile Sat Jun 19 12:48:24 2004 +@@ -101,10 +101,10 @@ + fi; \ + ) + +-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \ ++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \ + include/config/MARKER + +-include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s ++include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm + $(call filechk,gen-asm-offsets) + + define archhelp +diff -ur linux-2.6.7/arch/arm26/kernel/Makefile linux-2.6.7-mod/arch/arm26/kernel/Makefile +--- linux-2.6.7/arch/arm26/kernel/Makefile Mon May 10 04:32:29 2004 ++++ linux-2.6.7-mod/arch/arm26/kernel/Makefile Sat Jun 19 12:48:30 2004 +@@ -14,5 +14,5 @@ + obj-$(CONFIG_FIQ) += fiq.o + obj-$(CONFIG_MODULES) += armksyms.o + +-extra-y := init_task.o vmlinux.lds.s ++extra-y := init_task.o vmlinux.lds.asm + +diff -ur linux-2.6.7/arch/cris/Makefile linux-2.6.7-mod/arch/cris/Makefile +--- linux-2.6.7/arch/cris/Makefile Fri Jun 18 22:51:07 2004 ++++ linux-2.6.7-mod/arch/cris/Makefile Sat Jun 19 12:48:47 2004 +@@ -107,8 +107,8 @@ + @ln -sf $(SARCH) include/asm-$(ARCH)/arch + @touch $@ + +-arch/$(ARCH)/$(SARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \ ++arch/$(ARCH)/$(SARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \ + include/config/MARKER + +-include/asm-$(ARCH)/$(SARCH)/offset.h: arch/$(ARCH)/$(SARCH)/kernel/asm-offsets.s ++include/asm-$(ARCH)/$(SARCH)/offset.h: arch/$(ARCH)/$(SARCH)/kernel/asm-offsets.asm + $(call filechk,gen-asm-offsets) +diff -ur linux-2.6.7/arch/cris/kernel/Makefile linux-2.6.7-mod/arch/cris/kernel/Makefile +--- linux-2.6.7/arch/cris/kernel/Makefile Fri Jun 18 22:51:09 2004 ++++ linux-2.6.7-mod/arch/cris/kernel/Makefile Sat Jun 19 12:48:53 2004 +@@ -3,7 +3,7 @@ + # Makefile for the linux kernel. + # + +-extra-y := vmlinux.lds.s ++extra-y := vmlinux.lds.asm + + obj-y := process.o traps.o irq.o ptrace.o setup.o \ + time.o sys_cris.o semaphore.o +diff -ur linux-2.6.7/arch/h8300/Makefile linux-2.6.7-mod/arch/h8300/Makefile +--- linux-2.6.7/arch/h8300/Makefile Fri Jun 18 22:51:09 2004 ++++ linux-2.6.7-mod/arch/h8300/Makefile Sat Jun 19 12:49:12 2004 +@@ -64,7 +64,7 @@ + + prepare: include/asm-$(ARCH)/asm-offsets.h + +-include/asm-$(ARCH)/asm-offsets.h: arch/$(ARCH)/kernel/asm-offsets.s \ ++include/asm-$(ARCH)/asm-offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm \ + include/asm include/linux/version.h + $(call filechk,gen-asm-offsets) + +diff -ur linux-2.6.7/arch/h8300/kernel/Makefile linux-2.6.7-mod/arch/h8300/kernel/Makefile +--- linux-2.6.7/arch/h8300/kernel/Makefile Fri Jun 18 22:51:09 2004 ++++ linux-2.6.7-mod/arch/h8300/kernel/Makefile Sat Jun 19 12:49:32 2004 +@@ -2,7 +2,7 @@ + # Makefile for the linux kernel. + # + +-extra-y := vmlinux.lds.s ++extra-y := vmlinux.lds.asm + + obj-y := process.o traps.o ptrace.o ints.o \ + sys_h8300.o time.o semaphore.o signal.o \ +diff -ur linux-2.6.7/arch/i386/Makefile linux-2.6.7-mod/arch/i386/Makefile +--- linux-2.6.7/arch/i386/Makefile Fri Jun 18 22:51:10 2004 ++++ linux-2.6.7-mod/arch/i386/Makefile Sat Jun 19 12:49:43 2004 +@@ -141,10 +141,10 @@ + prepare: include/asm-$(ARCH)/asm_offsets.h + CLEAN_FILES += include/asm-$(ARCH)/asm_offsets.h + +-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \ ++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \ + include/config/MARKER + +-include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s ++include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm + $(call filechk,gen-asm-offsets) + + archclean: +diff -ur linux-2.6.7/arch/i386/kernel/Makefile linux-2.6.7-mod/arch/i386/kernel/Makefile +--- linux-2.6.7/arch/i386/kernel/Makefile Mon May 10 04:32:02 2004 ++++ linux-2.6.7-mod/arch/i386/kernel/Makefile Sat Jun 19 12:49:54 2004 +@@ -2,7 +2,7 @@ + # Makefile for the linux kernel. + # + +-extra-y := head.o init_task.o vmlinux.lds.s ++extra-y := head.o init_task.o vmlinux.lds.asm + + obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o \ + ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_i386.o \ +diff -ur linux-2.6.7/arch/ia64/Makefile linux-2.6.7-mod/arch/ia64/Makefile +--- linux-2.6.7/arch/ia64/Makefile Mon May 10 04:31:59 2004 ++++ linux-2.6.7-mod/arch/ia64/Makefile Sat Jun 19 12:50:12 2004 +@@ -88,12 +88,12 @@ + + prepare: include/asm-ia64/offsets.h + +-arch/ia64/kernel/asm-offsets.s: include/asm include/linux/version.h include/config/MARKER ++arch/ia64/kernel/asm-offsets.asm: include/asm include/linux/version.h include/config/MARKER + +-include/asm-ia64/offsets.h: arch/ia64/kernel/asm-offsets.s ++include/asm-ia64/offsets.h: arch/ia64/kernel/asm-offsets.asm + $(call filechk,gen-asm-offsets) + +-arch/ia64/kernel/asm-offsets.s: include/asm-ia64/.offsets.h.stamp ++arch/ia64/kernel/asm-offsets.asm: include/asm-ia64/.offsets.h.stamp + + include/asm-ia64/.offsets.h.stamp: + mkdir -p include/asm-ia64 +diff -ur linux-2.6.7/arch/ia64/kernel/Makefile linux-2.6.7-mod/arch/ia64/kernel/Makefile +--- linux-2.6.7/arch/ia64/kernel/Makefile Fri Jun 18 22:51:13 2004 ++++ linux-2.6.7-mod/arch/ia64/kernel/Makefile Sat Jun 19 12:52:14 2004 +@@ -2,7 +2,7 @@ + # Makefile for the linux kernel. + # + +-extra-y := head.o init_task.o vmlinux.lds.s ++extra-y := head.o init_task.o vmlinux.lds.asm + + obj-y := acpi.o entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \ + irq_lsapic.o ivt.o machvec.o pal.o patch.o process.o perfmon.o ptrace.o sal.o \ +@@ -21,7 +21,7 @@ + # The gate DSO image is built using a special linker script. + targets += gate.so gate-syms.o + +-extra-y += gate.so gate-syms.o gate.lds.s gate.o ++extra-y += gate.so gate-syms.o gate.lds.asm gate.o + + # fp_emulate() expects f2-f5,f16-f31 to contain the user-level state. + CFLAGS_traps.o += -mfixed-range=f2-f5,f16-f31 +@@ -32,14 +32,14 @@ + cmd_gate = $(CC) -nostdlib $(GATECFLAGS_$(@F)) -Wl,-T,$(filter-out FORCE,$^) -o $@ + + GATECFLAGS_gate.so = -shared -s -Wl,-soname=linux-gate.so.1 +-$(obj)/gate.so: $(obj)/gate.lds.s $(obj)/gate.o FORCE ++$(obj)/gate.so: $(obj)/gate.lds.asm $(obj)/gate.o FORCE + $(call if_changed,gate) + + $(obj)/built-in.o: $(obj)/gate-syms.o + $(obj)/built-in.o: ld_flags += -R $(obj)/gate-syms.o + + GATECFLAGS_gate-syms.o = -r +-$(obj)/gate-syms.o: $(src)/gate.lds.s $(obj)/gate.o FORCE ++$(obj)/gate-syms.o: $(src)/gate.lds.asm $(obj)/gate.o FORCE + $(call if_changed,gate) + + # gate-data.o contains the gate DSO image as data in section .data.gate. +diff -ur linux-2.6.7/arch/m68k/Makefile linux-2.6.7-mod/arch/m68k/Makefile +--- linux-2.6.7/arch/m68k/Makefile Fri Jun 18 22:51:14 2004 ++++ linux-2.6.7-mod/arch/m68k/Makefile Sat Jun 19 12:52:30 2004 +@@ -114,10 +114,10 @@ + prepare: include/asm-$(ARCH)/offsets.h + CLEAN_FILES += include/asm-$(ARCH)/offsets.h + +-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \ ++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \ + include/config/MARKER + +-include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.s ++include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm + $(call filechk,gen-asm-offsets) + + archclean: +diff -ur linux-2.6.7/arch/m68k/kernel/Makefile linux-2.6.7-mod/arch/m68k/kernel/Makefile +--- linux-2.6.7/arch/m68k/kernel/Makefile Mon May 10 04:33:10 2004 ++++ linux-2.6.7-mod/arch/m68k/kernel/Makefile Sat Jun 19 12:52:35 2004 +@@ -7,7 +7,7 @@ + else + extra-y := sun3-head.o + endif +-extra-y += vmlinux.lds.s ++extra-y += vmlinux.lds.asm + + obj-y := entry.o process.o traps.o ints.o signal.o ptrace.o \ + sys_m68k.o time.o semaphore.o setup.o m68k_ksyms.o +diff -ur linux-2.6.7/arch/m68knommu/Makefile linux-2.6.7-mod/arch/m68knommu/Makefile +--- linux-2.6.7/arch/m68knommu/Makefile Mon May 10 04:32:54 2004 ++++ linux-2.6.7-mod/arch/m68knommu/Makefile Sat Jun 19 12:52:57 2004 +@@ -89,7 +89,7 @@ + head-y := arch/m68knommu/platform/$(platform-y)/$(board-y)/crt0_$(model-y).o + + CLEAN_FILES := include/asm-$(ARCH)/asm-offsets.h \ +- arch/$(ARCH)/kernel/asm-offsets.s ++ arch/$(ARCH)/kernel/asm-offsets.asm + + core-y += arch/m68knommu/kernel/ \ + arch/m68knommu/mm/ \ +@@ -102,7 +102,7 @@ + archclean: + $(call descend arch/$(ARCH)/boot, subdirclean) + +-include/asm-$(ARCH)/asm-offsets.h: arch/$(ARCH)/kernel/asm-offsets.s \ ++include/asm-$(ARCH)/asm-offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm \ + include/asm include/linux/version.h \ + include/config/MARKER + $(call filechk,gen-asm-offsets) +diff -ur linux-2.6.7/arch/m68knommu/kernel/Makefile linux-2.6.7-mod/arch/m68knommu/kernel/Makefile +--- linux-2.6.7/arch/m68knommu/kernel/Makefile Mon May 10 04:32:26 2004 ++++ linux-2.6.7-mod/arch/m68knommu/kernel/Makefile Sat Jun 19 12:53:20 2004 +@@ -2,7 +2,7 @@ + # Makefile for arch/m68knommu/kernel. + # + +-extra-y := vmlinux.lds.s ++extra-y := vmlinux.lds.asm + + obj-y += dma.o entry.o init_task.o m68k_ksyms.o process.o ptrace.o semaphore.o \ + setup.o signal.o syscalltable.o sys_m68k.o time.o traps.o +diff -ur linux-2.6.7/arch/mips/Makefile linux-2.6.7-mod/arch/mips/Makefile +--- linux-2.6.7/arch/mips/Makefile Fri Jun 18 22:51:19 2004 ++++ linux-2.6.7-mod/arch/mips/Makefile Sat Jun 19 12:53:35 2004 +@@ -752,12 +752,12 @@ + prepare: include/asm-$(ARCH)/offset.h \ + include/asm-$(ARCH)/reg.h + +-arch/$(ARCH)/kernel/offset.s: include/asm include/linux/version.h \ ++arch/$(ARCH)/kernel/offset.asm: include/asm include/linux/version.h \ + include/config/MARKER + +-include/asm-$(ARCH)/offset.h: arch/$(ARCH)/kernel/offset.s ++include/asm-$(ARCH)/offset.h: arch/$(ARCH)/kernel/offset.asm + $(call filechk,gen-asm-offset.h) +-include/asm-$(ARCH)/reg.h: arch/$(ARCH)/kernel/reg.s ++include/asm-$(ARCH)/reg.h: arch/$(ARCH)/kernel/reg.asm + $(call filechk,gen-asm-reg.h) + + CLEAN_FILES += include/asm-$(ARCH)/offset.h.tmp \ +diff -ur linux-2.6.7/arch/mips/kernel/Makefile linux-2.6.7-mod/arch/mips/kernel/Makefile +--- linux-2.6.7/arch/mips/kernel/Makefile Mon May 10 04:32:28 2004 ++++ linux-2.6.7-mod/arch/mips/kernel/Makefile Sat Jun 19 12:53:41 2004 +@@ -2,7 +2,7 @@ + # Makefile for the Linux/MIPS kernel. + # + +-extra-y := head.o init_task.o vmlinux.lds.s ++extra-y := head.o init_task.o vmlinux.lds.asm + + obj-y += cpu-probe.o branch.o entry.o genex.o irq.o process.o \ + ptrace.o reset.o semaphore.o setup.o signal.o syscall.o \ +diff -ur linux-2.6.7/arch/parisc/Makefile linux-2.6.7-mod/arch/parisc/Makefile +--- linux-2.6.7/arch/parisc/Makefile Fri Jun 18 22:51:21 2004 ++++ linux-2.6.7-mod/arch/parisc/Makefile Sat Jun 19 12:53:47 2004 +@@ -88,10 +88,10 @@ + + prepare: include/asm-parisc/offsets.h + +-arch/parisc/kernel/asm-offsets.s: include/asm include/linux/version.h \ ++arch/parisc/kernel/asm-offsets.asm: include/asm include/linux/version.h \ + include/config/MARKER + +-include/asm-parisc/offsets.h: arch/parisc/kernel/asm-offsets.s ++include/asm-parisc/offsets.h: arch/parisc/kernel/asm-offsets.asm + $(call filechk,gen-asm-offsets) + + CLEAN_FILES += lifimage include/asm-parisc/offsets.h +diff -ur linux-2.6.7/arch/parisc/kernel/Makefile linux-2.6.7-mod/arch/parisc/kernel/Makefile +--- linux-2.6.7/arch/parisc/kernel/Makefile Fri Jun 18 22:51:21 2004 ++++ linux-2.6.7-mod/arch/parisc/kernel/Makefile Sat Jun 19 12:53:53 2004 +@@ -4,7 +4,7 @@ + + head-y := head.o + head-$(CONFIG_PARISC64) := head64.o +-extra-y := init_task.o $(head-y) vmlinux.lds.s ++extra-y := init_task.o $(head-y) vmlinux.lds.asm + + AFLAGS_entry.o := -traditional + AFLAGS_pacache.o := -traditional +diff -ur linux-2.6.7/arch/ppc/Makefile linux-2.6.7-mod/arch/ppc/Makefile +--- linux-2.6.7/arch/ppc/Makefile Fri Jun 18 22:51:22 2004 ++++ linux-2.6.7-mod/arch/ppc/Makefile Sat Jun 19 12:54:09 2004 +@@ -78,10 +78,10 @@ + + prepare: include/asm-$(ARCH)/offsets.h checkbin + +-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \ ++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \ + include/config/MARKER + +-include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.s ++include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm + $(call filechk,gen-asm-offsets) + + ifdef CONFIG_6xx +@@ -104,4 +104,4 @@ + endif + + CLEAN_FILES += include/asm-$(ARCH)/offsets.h \ +- arch/$(ARCH)/kernel/asm-offsets.s ++ arch/$(ARCH)/kernel/asm-offsets.asm +diff -ur linux-2.6.7/arch/ppc/kernel/Makefile linux-2.6.7-mod/arch/ppc/kernel/Makefile +--- linux-2.6.7/arch/ppc/kernel/Makefile Fri Jun 18 22:51:24 2004 ++++ linux-2.6.7-mod/arch/ppc/kernel/Makefile Sat Jun 19 12:43:10 2004 +@@ -15,7 +15,7 @@ + extra-$(CONFIG_8xx) := head_8xx.o + extra-$(CONFIG_6xx) += idle_6xx.o + extra-$(CONFIG_POWER4) += idle_power4.o +-extra-y += vmlinux.lds.s ++extra-y += vmlinux.lds.asm + + obj-y := entry.o traps.o irq.o idle.o time.o misc.o \ + process.o signal.o ptrace.o align.o \ +diff -ur linux-2.6.7/arch/ppc64/Makefile linux-2.6.7-mod/arch/ppc64/Makefile +--- linux-2.6.7/arch/ppc64/Makefile Fri Jun 18 22:51:26 2004 ++++ linux-2.6.7-mod/arch/ppc64/Makefile Sat Jun 19 12:54:32 2004 +@@ -67,10 +67,10 @@ + + prepare: include/asm-ppc64/offsets.h + +-arch/ppc64/kernel/asm-offsets.s: include/asm include/linux/version.h \ ++arch/ppc64/kernel/asm-offsets.asm: include/asm include/linux/version.h \ + include/config/MARKER + +-include/asm-ppc64/offsets.h: arch/ppc64/kernel/asm-offsets.s ++include/asm-ppc64/offsets.h: arch/ppc64/kernel/asm-offsets.asm + $(call filechk,gen-asm-offsets) + + define archhelp +diff -ur linux-2.6.7/arch/ppc64/kernel/Makefile linux-2.6.7-mod/arch/ppc64/kernel/Makefile +--- linux-2.6.7/arch/ppc64/kernel/Makefile Mon May 10 04:33:20 2004 ++++ linux-2.6.7-mod/arch/ppc64/kernel/Makefile Sat Jun 19 12:54:39 2004 +@@ -3,7 +3,7 @@ + # + + EXTRA_CFLAGS += -mno-minimal-toc +-extra-y := head.o vmlinux.lds.s ++extra-y := head.o vmlinux.lds.asm + + obj-y := setup.o entry.o traps.o irq.o idle.o dma.o \ + time.o process.o signal.o syscalls.o misc.o ptrace.o \ +diff -ur linux-2.6.7/arch/s390/Makefile linux-2.6.7-mod/arch/s390/Makefile +--- linux-2.6.7/arch/s390/Makefile Mon May 10 04:32:02 2004 ++++ linux-2.6.7-mod/arch/s390/Makefile Sat Jun 19 12:54:46 2004 +@@ -68,10 +68,10 @@ + + prepare: include/asm-$(ARCH)/offsets.h + +-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \ ++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \ + include/config/MARKER + +-include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.s ++include/asm-$(ARCH)/offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm + $(call filechk,gen-asm-offsets) + + CLEAN_FILES += include/asm-$(ARCH)/offsets.h +diff -ur linux-2.6.7/arch/s390/kernel/Makefile linux-2.6.7-mod/arch/s390/kernel/Makefile +--- linux-2.6.7/arch/s390/kernel/Makefile Mon May 10 04:33:20 2004 ++++ linux-2.6.7-mod/arch/s390/kernel/Makefile Sat Jun 19 12:54:52 2004 +@@ -10,7 +10,7 @@ + + extra-$(CONFIG_ARCH_S390_31) += head.o + extra-$(CONFIG_ARCH_S390X) += head64.o +-extra-y += init_task.o vmlinux.lds.s ++extra-y += init_task.o vmlinux.lds.asm + + obj-$(CONFIG_MODULES) += s390_ksyms.o module.o + obj-$(CONFIG_SMP) += smp.o +diff -ur linux-2.6.7/arch/sh/kernel/Makefile linux-2.6.7-mod/arch/sh/kernel/Makefile +--- linux-2.6.7/arch/sh/kernel/Makefile Mon May 10 04:32:39 2004 ++++ linux-2.6.7-mod/arch/sh/kernel/Makefile Sat Jun 19 12:55:33 2004 +@@ -2,7 +2,7 @@ + # Makefile for the Linux/SuperH kernel. + # + +-extra-y := head.o init_task.o vmlinux.lds.s ++extra-y := head.o init_task.o vmlinux.lds.asm + + obj-y := process.o signal.o entry.o traps.o irq.o \ + ptrace.o setup.o time.o sys_sh.o semaphore.o \ +diff -ur linux-2.6.7/arch/sparc/Makefile linux-2.6.7-mod/arch/sparc/Makefile +--- linux-2.6.7/arch/sparc/Makefile Fri Jun 18 22:51:29 2004 ++++ linux-2.6.7-mod/arch/sparc/Makefile Sat Jun 19 12:55:48 2004 +@@ -61,14 +61,14 @@ + + prepare: include/asm-$(ARCH)/asm_offsets.h + +-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \ ++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \ + include/config/MARKER + +-include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s ++include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm + $(call filechk,gen-asm-offsets) + + CLEAN_FILES += include/asm-$(ARCH)/asm_offsets.h \ +- arch/$(ARCH)/kernel/asm-offsets.s \ ++ arch/$(ARCH)/kernel/asm-offsets.asm \ + arch/$(ARCH)/boot/System.map + + # Don't use tabs in echo arguments. +diff -ur linux-2.6.7/arch/sparc/kernel/Makefile linux-2.6.7-mod/arch/sparc/kernel/Makefile +--- linux-2.6.7/arch/sparc/kernel/Makefile Mon May 10 04:33:13 2004 ++++ linux-2.6.7-mod/arch/sparc/kernel/Makefile Sat Jun 19 12:55:52 2004 +@@ -2,7 +2,7 @@ + # Makefile for the linux kernel. + # + +-extra-y := head.o init_task.o vmlinux.lds.s ++extra-y := head.o init_task.o vmlinux.lds.asm + + EXTRA_AFLAGS := -ansi + +diff -ur linux-2.6.7/arch/sparc64/kernel/Makefile linux-2.6.7-mod/arch/sparc64/kernel/Makefile +--- linux-2.6.7/arch/sparc64/kernel/Makefile Mon May 10 04:32:02 2004 ++++ linux-2.6.7-mod/arch/sparc64/kernel/Makefile Sat Jun 19 12:56:24 2004 +@@ -5,7 +5,7 @@ + EXTRA_AFLAGS := -ansi + EXTRA_CFLAGS := -Werror + +-extra-y := head.o init_task.o vmlinux.lds.s ++extra-y := head.o init_task.o vmlinux.lds.asm + + obj-y := process.o setup.o cpu.o idprom.o \ + traps.o devices.o auxio.o \ +diff -ur linux-2.6.7/arch/um/Makefile linux-2.6.7-mod/arch/um/Makefile +--- linux-2.6.7/arch/um/Makefile Mon May 10 04:32:52 2004 ++++ linux-2.6.7-mod/arch/um/Makefile Sat Jun 19 12:57:07 2004 +@@ -77,7 +77,7 @@ + # CONFIG_MODE_SKAS + CONFIG_STATIC_LINK case. + + LINK_TT = -static +-LD_SCRIPT_TT := uml.lds.s ++LD_SCRIPT_TT := uml.lds.asm + + ifeq ($(CONFIG_STATIC_LINK),y) + LINK-y += $(LINK_TT) +@@ -103,11 +103,11 @@ + -DELF_FORMAT=\"$(ELF_FORMAT)\" $(CPP_MODE_TT) \ + -DKERNEL_STACK_SIZE=$(STACK_SIZE) + +-AFLAGS_$(LD_SCRIPT-y:.s=).o = $(AFLAGS_vmlinux.lds.o) -P -C -Uum ++AFLAGS_$(LD_SCRIPT-y:.asm=).o = $(AFLAGS_vmlinux.lds.o) -P -C -Uum + + LD_SCRIPT-y := $(ARCH_DIR)/$(LD_SCRIPT-y) + +-$(LD_SCRIPT-y) : $(LD_SCRIPT-y:.s=.S) scripts FORCE ++$(LD_SCRIPT-y) : $(LD_SCRIPT-y:.asm=.S) scripts FORCE + $(call if_changed_dep,as_s_S) + + linux: vmlinux $(LD_SCRIPT-y) +@@ -122,8 +122,8 @@ + # To get a definition of F_SETSIG + USER_CFLAGS += -D_GNU_SOURCE + +-CLEAN_FILES += linux x.i gmon.out $(ARCH_DIR)/uml.lds.s \ +- $(ARCH_DIR)/dyn_link.ld.s $(GEN_HEADERS) ++CLEAN_FILES += linux x.i gmon.out $(ARCH_DIR)/uml.lds.asm \ ++ $(ARCH_DIR)/dyn_link.ld.asm $(GEN_HEADERS) + + $(ARCH_DIR)/main.o: $(ARCH_DIR)/main.c + $(CC) $(USER_CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $< +diff -ur linux-2.6.7/arch/um/kernel/Makefile linux-2.6.7-mod/arch/um/kernel/Makefile +--- linux-2.6.7/arch/um/kernel/Makefile Mon May 10 04:32:53 2004 ++++ linux-2.6.7-mod/arch/um/kernel/Makefile Sat Jun 19 12:57:15 2004 +@@ -3,7 +3,7 @@ + # Licensed under the GPL + # + +-extra-y := vmlinux.lds.s ++extra-y := vmlinux.lds.asm + + obj-y = checksum.o config.o exec_kern.o exitcode.o frame_kern.o frame.o \ + helper.o init_task.o irq.o irq_user.o ksyms.o mem.o mem_user.o \ +diff -ur linux-2.6.7/arch/v850/Makefile linux-2.6.7-mod/arch/v850/Makefile +--- linux-2.6.7/arch/v850/Makefile Mon May 10 04:33:21 2004 ++++ linux-2.6.7-mod/arch/v850/Makefile Sat Jun 19 12:57:59 2004 +@@ -52,12 +52,12 @@ + prepare: include/asm-$(ARCH)/asm-consts.h + + # Generate constants from C code for use by asm files +-arch/$(ARCH)/kernel/asm-consts.s: include/asm include/linux/version.h \ ++arch/$(ARCH)/kernel/asm-consts.asm: include/asm include/linux/version.h \ + include/config/MARKER + +-include/asm-$(ARCH)/asm-consts.h: arch/$(ARCH)/kernel/asm-consts.s ++include/asm-$(ARCH)/asm-consts.h: arch/$(ARCH)/kernel/asm-consts.asm + $(call filechk,gen-asm-offsets) + + CLEAN_FILES += include/asm-$(ARCH)/asm-consts.h \ +- arch/$(ARCH)/kernel/asm-consts.s \ ++ arch/$(ARCH)/kernel/asm-consts.asm \ + root_fs_image.o +diff -ur linux-2.6.7/arch/v850/kernel/Makefile linux-2.6.7-mod/arch/v850/kernel/Makefile +--- linux-2.6.7/arch/v850/kernel/Makefile Mon May 10 04:33:21 2004 ++++ linux-2.6.7-mod/arch/v850/kernel/Makefile Sat Jun 19 12:58:04 2004 +@@ -9,7 +9,7 @@ + # for more details. + # + +-extra-y := head.o init_task.o vmlinux.lds.s ++extra-y := head.o init_task.o vmlinux.lds.asm + + obj-y += intv.o entry.o process.o syscalls.o time.o semaphore.o setup.o \ + signal.o irq.o mach.o ptrace.o bug.o +diff -ur linux-2.6.7/arch/x86_64/Makefile linux-2.6.7-mod/arch/x86_64/Makefile +--- linux-2.6.7/arch/x86_64/Makefile Mon May 10 04:33:19 2004 ++++ linux-2.6.7-mod/arch/x86_64/Makefile Sat Jun 19 12:58:10 2004 +@@ -93,10 +93,10 @@ + + prepare: include/asm-$(ARCH)/offset.h + +-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \ ++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \ + include/config/MARKER + +-include/asm-$(ARCH)/offset.h: arch/$(ARCH)/kernel/asm-offsets.s ++include/asm-$(ARCH)/offset.h: arch/$(ARCH)/kernel/asm-offsets.asm + $(call filechk,gen-asm-offsets) + + CLEAN_FILES += include/asm-$(ARCH)/offset.h +diff -ur linux-2.6.7/arch/x86_64/kernel/Makefile linux-2.6.7-mod/arch/x86_64/kernel/Makefile +--- linux-2.6.7/arch/x86_64/kernel/Makefile Fri Jun 18 22:51:32 2004 ++++ linux-2.6.7-mod/arch/x86_64/kernel/Makefile Sat Jun 19 12:58:17 2004 +@@ -2,7 +2,7 @@ + # Makefile for the linux kernel. + # + +-extra-y := head.o head64.o init_task.o vmlinux.lds.s ++extra-y := head.o head64.o init_task.o vmlinux.lds.asm + EXTRA_AFLAGS := -traditional + obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \ + ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_x86_64.o \ +diff -ur linux-2.6.7/scripts/Makefile.build linux-2.6.7-mod/scripts/Makefile.build +--- linux-2.6.7/scripts/Makefile.build Mon May 10 04:33:13 2004 ++++ linux-2.6.7-mod/scripts/Makefile.build Sat Jun 19 12:43:10 2004 +@@ -110,7 +110,7 @@ + quiet_cmd_cc_s_c = CC $(quiet_modtag) $@ + cmd_cc_s_c = $(CC) $(c_flags) -S -o $@ $< + +-%.s: %.c FORCE ++%.asm: %.c FORCE + $(call if_changed_dep,cc_s_c) + + quiet_cmd_cc_i_c = CPP $(quiet_modtag) $@ +@@ -197,7 +197,7 @@ + quiet_cmd_as_s_S = CPP $(quiet_modtag) $@ + cmd_as_s_S = $(CPP) $(a_flags) -o $@ $< + +-%.s: %.S FORCE ++%.asm: %.S FORCE + $(call if_changed_dep,as_s_S) + + quiet_cmd_as_o_S = AS $(quiet_modtag) $@ diff --git a/patches/linux/2.6.7/linux-2.6.8-noshared-kconfig.patch b/patches/linux/2.6.7/linux-2.6.8-noshared-kconfig.patch new file mode 100644 index 00000000..326cdcda --- /dev/null +++ b/patches/linux/2.6.7/linux-2.6.8-noshared-kconfig.patch @@ -0,0 +1,28 @@ +Lets you run 'make oldconfig' and 'make menuconfig' on systems +where shared libraries aren't easy. (There's no harm in using the +static version of libkconfig.) +Idea mentioned by Bertrand Marquis, but this patch is a bit simpler than his. + + +--- linux-2.6.8.1/scripts/kconfig/Makefile.old 2004-09-09 20:30:25.000000000 -0700 ++++ linux-2.6.8.1/scripts/kconfig/Makefile 2004-09-09 20:47:51.000000000 -0700 +@@ -68,8 +68,8 @@ + libkconfig-objs := zconf.tab.o + + host-progs := conf mconf qconf gconf +-conf-objs := conf.o libkconfig.so +-mconf-objs := mconf.o libkconfig.so ++conf-objs := conf.o $(libkconfig-objs) ++mconf-objs := mconf.o $(libkconfig-objs) + + ifeq ($(MAKECMDGOALS),xconfig) + qconf-target := 1 +@@ -88,7 +88,7 @@ + gconf-objs := gconf.o kconfig_load.o + endif + +-clean-files := libkconfig.so lkc_defs.h qconf.moc .tmp_qtcheck \ ++clean-files := $(libkconfig-objs) lkc_defs.h qconf.moc .tmp_qtcheck \ + .tmp_gtkcheck zconf.tab.c zconf.tab.h lex.zconf.c + + # generated files seem to need this to find local include files diff --git a/patches/linux/2.6.8/kaz-types.patch b/patches/linux/2.6.8/kaz-types.patch new file mode 100644 index 00000000..ec5de36a --- /dev/null +++ b/patches/linux/2.6.8/kaz-types.patch @@ -0,0 +1,60 @@ +The following fixes an error that occurs when building glibc-2.3.2 (but not glibc-2.2.5) for sh4: + +In file included from sys/ustat.h:30, + from ../sysdeps/unix/sysv/linux/ustat.c:21: +../sysdeps/generic/bits/ustat.h:26: error: redefinition of `struct ustat' +make[2]: *** [/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/build-glibc/misc/ustat.o] Error 1 +make[2]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2/misc' +make[1]: *** [misc/subdir_lib] Error 2 +make[1]: Leaving directory `/home3/dank/crosstool-0.7/build/sh4-unknown-linux-gnu/gcc-3.3-glibc-2.3.2/glibc-2.3.2' +make: *** [all] Error 2 + +----------- snip --------------- + +Date: Fri, 06 Jun 2003 08:00:00 +0900 +From: kaz Kojima <kkojima@rr.iij4u.or.jp> +Subject: [linux-sh:02770] Re: Compiling glibc-2.3.2 for sh4 fails with "include/asm/user.h:32: + error: redefinition of `struct user_fpu_struct'" +To: linux-sh@m17n.org +Message-Id: <200306052250.h55Moeb08707@r-rr.iij4u.or.jp> + +Hi, + +Dan Kegel <dank@kegel.com> wrote: +> When I try to build glibc-2.3.2 for sh4, it fails with the error +[snip] +> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:32: error: redefinition of `struct user_fpu_struct' +> /home3/dank/crosstool-0.3/result/sh4-linux/gcc-3.3-glibc-2.3.2/sh4-linux/include/asm/user.h:39: error: redefinition of `struct user' +[snip] +> The error reminds me of the kind of thing fixed by +> http://www.kegel.com/crossgcc/crosstool-0.4/glibc-2.3.2-patches/sh-user.patch + +It seems that the definitions in asm/user.h and the above patch collide. +I'm not sure why you need this patch, but is it needed for the problem +about struct ustat that you pointed out in this list, isn't it? +I found why I don't hit ustat problem - my local kernel tree includes +the following patch, though I can't recall about it. + +Regards, + kaz +-- +diff -u linux-2.5.69-sf-orig/include/linux/types.h /usr/local/sh4-unknown-linux-gnu/include/linux/types.h +--- linux-2.5.69-sf-orig/include/linux/types.h Wed Mar 5 12:29:34 2003 ++++ sh4-unknown-linux-gnu/include/linux/types.h Sat Apr 19 10:05:52 2003 +@@ -141,6 +141,7 @@ + + #endif /* __KERNEL_STRICT_NAMES */ + ++#ifdef __KERNEL__ + /* + * Below are truly Linux-specific types that should never collide with + * any application/library that wants linux/types.h. +@@ -152,5 +153,6 @@ + char f_fname[6]; + char f_fpack[6]; + }; ++#endif + + #endif /* _LINUX_TYPES_H */ + + diff --git a/patches/linux/2.6.8/linux-2.6.8-allow-gcc-4.0-asm-i386.patch b/patches/linux/2.6.8/linux-2.6.8-allow-gcc-4.0-asm-i386.patch new file mode 100644 index 00000000..71d4e23e --- /dev/null +++ b/patches/linux/2.6.8/linux-2.6.8-allow-gcc-4.0-asm-i386.patch @@ -0,0 +1,138 @@ +Fixes + +In file included from include/asm/thread_info.h:16, + from include/linux/thread_info.h:21, + from include/linux/spinlock.h:12, + from include/linux/capability.h:45, + from include/linux/sched.h:7, + from arch/i386/kernel/asm-offsets.c:7: +include/asm/processor.h:87: error: array type has incomplete element type +make[1]: *** [arch/i386/kernel/asm-offsets.asm] Error 1 + +--- linux-2.6.8/include/asm-i386/processor.h.old Tue Mar 15 00:14:42 2005 ++++ linux-2.6.8/include/asm-i386/processor.h Tue Mar 15 00:18:45 2005 +@@ -79,6 +79,58 @@ + #define X86_VENDOR_UNKNOWN 0xff + + /* ++ * Size of io_bitmap. ++ */ ++#define IO_BITMAP_BITS 65536 ++#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8) ++#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long)) ++#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap) ++#define INVALID_IO_BITMAP_OFFSET 0x8000 ++ ++struct tss_struct { ++ unsigned short back_link,__blh; ++ unsigned long esp0; ++ unsigned short ss0,__ss0h; ++ unsigned long esp1; ++ unsigned short ss1,__ss1h; /* ss1 is used to cache MSR_IA32_SYSENTER_CS */ ++ unsigned long esp2; ++ unsigned short ss2,__ss2h; ++ unsigned long __cr3; ++ unsigned long eip; ++ unsigned long eflags; ++ unsigned long eax,ecx,edx,ebx; ++ unsigned long esp; ++ unsigned long ebp; ++ unsigned long esi; ++ unsigned long edi; ++ unsigned short es, __esh; ++ unsigned short cs, __csh; ++ unsigned short ss, __ssh; ++ unsigned short ds, __dsh; ++ unsigned short fs, __fsh; ++ unsigned short gs, __gsh; ++ unsigned short ldt, __ldth; ++ unsigned short trace, io_bitmap_base; ++ /* ++ * The extra 1 is there because the CPU will access an ++ * additional byte beyond the end of the IO permission ++ * bitmap. The extra byte must be all 1 bits, and must ++ * be within the limit. ++ */ ++ unsigned long io_bitmap[IO_BITMAP_LONGS + 1]; ++ /* ++ * pads the TSS to be cacheline-aligned (size is 0x100) ++ */ ++ unsigned long __cacheline_filler[37]; ++ /* ++ * .. and then another 0x100 bytes for emergency kernel stack ++ */ ++ unsigned long stack[64]; ++} __attribute__((packed)); ++ ++#define ARCH_MIN_TASKALIGN 16 ++ ++/* + * capabilities of CPUs + */ + +@@ -296,15 +348,6 @@ + */ + #define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3)) + +-/* +- * Size of io_bitmap. +- */ +-#define IO_BITMAP_BITS 65536 +-#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8) +-#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long)) +-#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap) +-#define INVALID_IO_BITMAP_OFFSET 0x8000 +- + struct i387_fsave_struct { + long cwd; + long swd; +@@ -356,49 +399,6 @@ + typedef struct { + unsigned long seg; + } mm_segment_t; +- +-struct tss_struct { +- unsigned short back_link,__blh; +- unsigned long esp0; +- unsigned short ss0,__ss0h; +- unsigned long esp1; +- unsigned short ss1,__ss1h; /* ss1 is used to cache MSR_IA32_SYSENTER_CS */ +- unsigned long esp2; +- unsigned short ss2,__ss2h; +- unsigned long __cr3; +- unsigned long eip; +- unsigned long eflags; +- unsigned long eax,ecx,edx,ebx; +- unsigned long esp; +- unsigned long ebp; +- unsigned long esi; +- unsigned long edi; +- unsigned short es, __esh; +- unsigned short cs, __csh; +- unsigned short ss, __ssh; +- unsigned short ds, __dsh; +- unsigned short fs, __fsh; +- unsigned short gs, __gsh; +- unsigned short ldt, __ldth; +- unsigned short trace, io_bitmap_base; +- /* +- * The extra 1 is there because the CPU will access an +- * additional byte beyond the end of the IO permission +- * bitmap. The extra byte must be all 1 bits, and must +- * be within the limit. +- */ +- unsigned long io_bitmap[IO_BITMAP_LONGS + 1]; +- /* +- * pads the TSS to be cacheline-aligned (size is 0x100) +- */ +- unsigned long __cacheline_filler[37]; +- /* +- * .. and then another 0x100 bytes for emergency kernel stack +- */ +- unsigned long stack[64]; +-} __attribute__((packed)); +- +-#define ARCH_MIN_TASKALIGN 16 + + struct thread_struct { + /* cached TLS descriptors. */ diff --git a/patches/linux/2.6.8/linux-2.6.8-arm-nonofpu.patch b/patches/linux/2.6.8/linux-2.6.8-arm-nonofpu.patch new file mode 100644 index 00000000..f638a00e --- /dev/null +++ b/patches/linux/2.6.8/linux-2.6.8-arm-nonofpu.patch @@ -0,0 +1,50 @@ +http://www.spinics.net/lists/arm/msg08012.html + +To: Dimitry Andric <dimitry@xxxxxxxxxx> +Subject: Re: Kernel Compile Error: use of old and new-style options to set FPU type +From: Marc Britten <maillists@xxxxxxxxxxxxxxxxx> +Date: Wed, 16 Jun 2004 03:03:15 -0400 +Cc: linux-arm@xxxxxxxxxxxxxxxxxxxxxx +In-reply-to: <1525495613.20040615202902@andric.com> + +Dimitry Andric wrote: + +>>Assembler messages: +>>Error: use of old and new-style options to set FPU type +> Try removing -Wa,-mno-fpu from CFLAGS (and possibly AFLAGS, but I'm +> not sure, depends on what your compiler generates by default) in +> arch/arm/Makefile. + +Just to let people know, this was successful. + +Thanks, + +Marc Britten + +-------- + +Fixes error + +... +make -f scripts/Makefile.build obj=scripts/mod + /opt/crosstool/arm-unknown-linux-gnu/gcc-3.4.1-glibc-2.3.3/bin/arm-unknown-linux-gnu-gcc -Wp,-MD,scripts/mod/.empty.o.d -nostdinc -iwithprefix include -D__KERNEL__ -Iinclude -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mlittle-endian -mapcs-32 -malignment-traps -msoft-float -Wa,-mno-fpu -Uarm -Os -Wdeclaration-after-statement -DKBUILD_BASENAME=empty -DKBUILD_MODNAME=empty -c -o scripts/mod/empty.o scripts/mod/empty.c +Assembler messages: +Error: use of old and new-style options to set FPU type +make[2]: *** [scripts/mod/empty.o] Error 1 +make[1]: *** [scripts/mod] Error 2 +make: *** [scripts] Error 2 + + +--- linux-2.6.8/arch/arm/Makefile.old 2004-09-01 21:27:07.000000000 -0700 ++++ linux-2.6.8/arch/arm/Makefile 2004-09-01 21:27:31.000000000 -0700 +@@ -55,8 +55,8 @@ + tune-$(CONFIG_CPU_V6) :=-mtune=strongarm + + # Need -Uarm for gcc < 3.x +-CFLAGS +=-mapcs-32 $(arch-y) $(tune-y) $(call check_gcc,-malignment-traps,-mshort-load-bytes) -msoft-float -Wa,-mno-fpu -Uarm +-AFLAGS +=-mapcs-32 $(arch-y) $(tune-y) -msoft-float -Wa,-mno-fpu ++CFLAGS +=-mapcs-32 $(arch-y) $(tune-y) $(call check_gcc,-malignment-traps,-mshort-load-bytes) -msoft-float -Uarm ++AFLAGS +=-mapcs-32 $(arch-y) $(tune-y) -msoft-float + + CHECK := $(CHECK) -D__arm__=1 + diff --git a/patches/linux/2.6.8/linux-2.6.8-build_on_case_insensitive_fs.patch b/patches/linux/2.6.8/linux-2.6.8-build_on_case_insensitive_fs.patch new file mode 100644 index 00000000..6472c178 --- /dev/null +++ b/patches/linux/2.6.8/linux-2.6.8-build_on_case_insensitive_fs.patch @@ -0,0 +1,725 @@ +Submitted By: Martin Schaffner <schaffner@gmx.li> +Date: 2004-06-19 +Initial Package Version: 2.6.7 +Upstream Status: Not submitted +Origin: Martin Schaffner +Description: Enables build on case-insensitive file systems +URL: xxxhttp://mirror.vtx.ch/lfs/patches/downloads/linux/linux-2.6.7-build_on_case_insensitive_fs-1.patch +--- Rediffed against 2.6.8 by dank@kegel.com +--- plus a few missing hunks added to fix sparc32 build + +--- linux-2.6.8/Makefile.orig 2004-08-13 22:37:25.000000000 -0700 ++++ linux-2.6.8/Makefile 2004-09-01 21:39:39.000000000 -0700 +@@ -540,7 +540,7 @@ + + do_system_map = $(NM) $(1) | grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | sort > $(2) + +-LDFLAGS_vmlinux += -T arch/$(ARCH)/kernel/vmlinux.lds.s ++LDFLAGS_vmlinux += -T arch/$(ARCH)/kernel/vmlinux.lds.asm + + # Generate section listing all symbols and add it into vmlinux + # It's a three stage process: +@@ -584,13 +584,13 @@ + .tmp_kallsyms%.S: .tmp_vmlinux% + $(call cmd,kallsyms) + +-.tmp_vmlinux1: $(vmlinux-objs) arch/$(ARCH)/kernel/vmlinux.lds.s FORCE ++.tmp_vmlinux1: $(vmlinux-objs) arch/$(ARCH)/kernel/vmlinux.lds.asm FORCE + $(call if_changed_rule,vmlinux__) + +-.tmp_vmlinux2: $(vmlinux-objs) .tmp_kallsyms1.o arch/$(ARCH)/kernel/vmlinux.lds.s FORCE ++.tmp_vmlinux2: $(vmlinux-objs) .tmp_kallsyms1.o arch/$(ARCH)/kernel/vmlinux.lds.asm FORCE + $(call if_changed_rule,vmlinux__) + +-.tmp_vmlinux3: $(vmlinux-objs) .tmp_kallsyms2.o arch/$(ARCH)/kernel/vmlinux.lds.s FORCE ++.tmp_vmlinux3: $(vmlinux-objs) .tmp_kallsyms2.o arch/$(ARCH)/kernel/vmlinux.lds.asm FORCE + $(call if_changed_rule,vmlinux__) + + endif +@@ -603,13 +603,13 @@ + $(rule_verify_kallsyms) + endef + +-vmlinux: $(vmlinux-objs) $(kallsyms.o) arch/$(ARCH)/kernel/vmlinux.lds.s FORCE ++vmlinux: $(vmlinux-objs) $(kallsyms.o) arch/$(ARCH)/kernel/vmlinux.lds.asm FORCE + $(call if_changed_rule,vmlinux) + + # The actual objects are generated when descending, + # make sure no implicit rule kicks in + +-$(sort $(vmlinux-objs)) arch/$(ARCH)/kernel/vmlinux.lds.s: $(vmlinux-dirs) ; ++$(sort $(vmlinux-objs)) arch/$(ARCH)/kernel/vmlinux.lds.asm: $(vmlinux-dirs) ; + + # Handle descending into subdirectories listed in $(vmlinux-dirs) + # Preset locale variables to speed up the build process. Limit locale +@@ -672,7 +672,7 @@ + # Single targets + # --------------------------------------------------------------------------- + +-%.s: %.c scripts FORCE ++%.asm: %.c scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ + %.i: %.c scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ +@@ -682,7 +682,7 @@ + $(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1) $(build)=$(@D) + %.lst: %.c scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ +-%.s: %.S scripts FORCE ++%.asm: %.S scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ + %.o: %.S scripts FORCE + $(Q)$(MAKE) $(build)=$(@D) $@ +diff -ur linux-2.6.7/arch/alpha/Makefile linux-2.6.7-mod/arch/alpha/Makefile +--- linux-2.6.7/arch/alpha/Makefile Fri Jun 18 22:51:03 2004 ++++ linux-2.6.7-mod/arch/alpha/Makefile Sat Jun 19 12:46:32 2004 +@@ -114,10 +114,10 @@ + + prepare: include/asm-$(ARCH)/asm_offsets.h + +-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \ ++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \ + include/config/MARKER + +-include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s ++include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.asm + $(call filechk,gen-asm-offsets) + + archclean: +diff -ur linux-2.6.7/arch/alpha/kernel/Makefile linux-2.6.7-mod/arch/alpha/kernel/Makefile +--- linux-2.6.7/arch/alpha/kernel/Makefile Mon May 10 04:32:29 2004 ++++ linux-2.6.7-mod/arch/alpha/kernel/Makefile Sat Jun 19 12:46:48 2004 +@@ -2,7 +2,7 @@ + # Makefile for the linux kernel. + # + +-extra-y := head.o vmlinux.lds.s ++extra-y := head.o vmlinux.lds.asm + EXTRA_AFLAGS := $(CFLAGS) + EXTRA_CFLAGS := -Werror -Wno-sign-compare + +--- linux-2.6.8/arch/arm/Makefile.orig 2004-08-13 22:36:56.000000000 -0700 ++++ linux-2.6.8/arch/arm/Makefile 2004-09-01 21:40:21.000000000 -0700 +@@ -176,10 +176,10 @@ + bp:; $(Q)$(MAKE) $(build)=$(boot) $(boot)/bootpImage + i zi:; $(Q)$(MAKE) $(build)=$(boot) $@ + +-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \ ++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \ + include/asm-arm/.arch + +-include/asm-$(ARCH)/constants.h: arch/$(ARCH)/kernel/asm-offsets.s ++include/asm-$(ARCH)/constants.h: arch/$(ARCH)/kernel/asm-offsets.asm + $(call filechk,gen-asm-offsets) + + define archhelp +diff -ur linux-2.6.7/arch/arm/kernel/Makefile linux-2.6.7-mod/arch/arm/kernel/Makefile +--- linux-2.6.7/arch/arm/kernel/Makefile Mon May 10 04:33:19 2004 ++++ linux-2.6.7-mod/arch/arm/kernel/Makefile Sat Jun 19 12:47:25 2004 +@@ -27,7 +27,7 @@ + head-y := head.o + obj-$(CONFIG_DEBUG_LL) += debug.o + +-extra-y := $(head-y) init_task.o vmlinux.lds.s ++extra-y := $(head-y) init_task.o vmlinux.lds.asm + + # Spell out some dependencies that aren't automatically figured out + $(obj)/entry-armv.o: $(obj)/entry-header.S include/asm-arm/constants.h +diff -ur linux-2.6.7/arch/arm26/Makefile linux-2.6.7-mod/arch/arm26/Makefile +--- linux-2.6.7/arch/arm26/Makefile Mon May 10 04:32:28 2004 ++++ linux-2.6.7-mod/arch/arm26/Makefile Sat Jun 19 12:48:24 2004 +@@ -101,10 +101,10 @@ + fi; \ + ) + +-arch/$(ARCH)/kernel/asm-offsets.s: include/asm include/linux/version.h \ ++arch/$(ARCH)/kernel/asm-offsets.asm: include/asm include/linux/version.h \ + include/config/MARKER + +-include/asm-$(ARCH)/asm_offsets.h: arch/$(ARCH)/kernel/asm-offsets.s ++include/asm-$(A